UNPKG

@zag-js/tabs

Version:

Core logic for the tabs widget implemented as a state machine

50 lines (49 loc) 1.94 kB
// 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 };