@zag-js/tabs
Version:
Core logic for the tabs widget implemented as a state machine
50 lines (49 loc) • 1.94 kB
JavaScript
// src/tabs.dom.ts
import { itemById, nextById, prevById, queryAll } from "@zag-js/dom-query";
import { first, last } from "@zag-js/utils";
var getRootId = (ctx) => ctx.ids?.root ?? `tabs:${ctx.id}`;
var getListId = (ctx) => ctx.ids?.list ?? `tabs:${ctx.id}:list`;
var getContentId = (ctx, value) => ctx.ids?.content?.(value) ?? `tabs:${ctx.id}:content-${value}`;
var getTriggerId = (ctx, value) => ctx.ids?.trigger?.(value) ?? `tabs:${ctx.id}:trigger-${value}`;
var getIndicatorId = (ctx) => ctx.ids?.indicator ?? `tabs:${ctx.id}:indicator`;
var getListEl = (ctx) => ctx.getById(getListId(ctx));
var getContentEl = (ctx, value) => ctx.getById(getContentId(ctx, value));
var getTriggerEl = (ctx, value) => value != null ? ctx.getById(getTriggerId(ctx, value)) : null;
var getIndicatorEl = (ctx) => ctx.getById(getIndicatorId(ctx));
var getElements = (ctx) => {
const ownerId = CSS.escape(getListId(ctx));
const selector = `[role=tab][data-ownedby='${ownerId}']:not([disabled])`;
return queryAll(getListEl(ctx), selector);
};
var getFirstTriggerEl = (ctx) => first(getElements(ctx));
var getLastTriggerEl = (ctx) => last(getElements(ctx));
var getNextTriggerEl = (ctx, opts) => nextById(getElements(ctx), getTriggerId(ctx, opts.value), opts.loopFocus);
var getPrevTriggerEl = (ctx, opts) => prevById(getElements(ctx), getTriggerId(ctx, opts.value), opts.loopFocus);
var getOffsetRect = (el) => ({
x: el?.offsetLeft ?? 0,
y: el?.offsetTop ?? 0,
width: el?.offsetWidth ?? 0,
height: el?.offsetHeight ?? 0
});
var getRectByValue = (ctx, value) => {
const tab = itemById(getElements(ctx), getTriggerId(ctx, value));
return getOffsetRect(tab);
};
export {
getContentEl,
getContentId,
getElements,
getFirstTriggerEl,
getIndicatorEl,
getIndicatorId,
getLastTriggerEl,
getListEl,
getListId,
getNextTriggerEl,
getOffsetRect,
getPrevTriggerEl,
getRectByValue,
getRootId,
getTriggerEl,
getTriggerId
};