@alfadocs/ui-kit-debug 1.112.1 → 1.112.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/_chunks/{ai-prompt-input-CG9BEggs.js → ai-prompt-input-JIPbrTF3.js} +2 -2
- package/dist/_chunks/{ai-prompt-input-CG9BEggs.js.map → ai-prompt-input-JIPbrTF3.js.map} +1 -1
- package/dist/_chunks/{anamnesis-summary-rows-BrTx7diS.js → anamnesis-summary-rows-DfDulR_c.js} +3 -3
- package/dist/_chunks/{anamnesis-summary-rows-BrTx7diS.js.map → anamnesis-summary-rows-DfDulR_c.js.map} +1 -1
- package/dist/_chunks/{audio-recorder-BlDozxdU.js → audio-recorder-CsnM_WDy.js} +2 -2
- package/dist/_chunks/{audio-recorder-BlDozxdU.js.map → audio-recorder-CsnM_WDy.js.map} +1 -1
- package/dist/_chunks/{balance-badge-cell-wJ6cTD_h.js → balance-badge-cell-BAZynD--.js} +4 -4
- package/dist/_chunks/{balance-badge-cell-wJ6cTD_h.js.map → balance-badge-cell-BAZynD--.js.map} +1 -1
- package/dist/_chunks/{bishop-score-BhMomGcX.js → bishop-score-CnIft4eV.js} +2 -2
- package/dist/_chunks/{bishop-score-BhMomGcX.js.map → bishop-score-CnIft4eV.js.map} +1 -1
- package/dist/_chunks/{calendar-appointment-editor-dialog-Oc3Df8O3.js → calendar-appointment-editor-dialog-FvdoKZ54.js} +5 -5
- package/dist/_chunks/{calendar-appointment-editor-dialog-Oc3Df8O3.js.map → calendar-appointment-editor-dialog-FvdoKZ54.js.map} +1 -1
- package/dist/_chunks/{data-table-zXBxFYpJ.js → data-table-C9idMvs0.js} +2 -2
- package/dist/_chunks/{data-table-zXBxFYpJ.js.map → data-table-C9idMvs0.js.map} +1 -1
- package/dist/_chunks/{document-preview-BalyZqnn.js → document-preview-5xs64jME.js} +2 -2
- package/dist/_chunks/{document-preview-BalyZqnn.js.map → document-preview-5xs64jME.js.map} +1 -1
- package/dist/_chunks/{file-manager-CVxBE4yy.js → file-manager-LG7B_UHB.js} +2 -2
- package/dist/_chunks/{file-manager-CVxBE4yy.js.map → file-manager-LG7B_UHB.js.map} +1 -1
- package/dist/_chunks/{gestational-age-calculator-AnaH00nk.js → gestational-age-calculator-Dv3IePb-.js} +2 -2
- package/dist/_chunks/{gestational-age-calculator-AnaH00nk.js.map → gestational-age-calculator-Dv3IePb-.js.map} +1 -1
- package/dist/_chunks/{heatmap-D4qqpCEj.js → heatmap-BiwC7Gdx.js} +2 -2
- package/dist/_chunks/{heatmap-D4qqpCEj.js.map → heatmap-BiwC7Gdx.js.map} +1 -1
- package/dist/_chunks/{kit-extensions-VaJ-u44J.js → kit-extensions-BOsUgWnE.js} +3 -3
- package/dist/_chunks/{kit-extensions-VaJ-u44J.js.map → kit-extensions-BOsUgWnE.js.map} +1 -1
- package/dist/_chunks/{link-cell-renderer-C8vfCOEp.js → link-cell-renderer-_Fv3WEmb.js} +2 -2
- package/dist/_chunks/{link-cell-renderer-C8vfCOEp.js.map → link-cell-renderer-_Fv3WEmb.js.map} +1 -1
- package/dist/_chunks/{muscle-scheme-1BZd1-RE.js → muscle-scheme-BkmDUTmk.js} +2 -2
- package/dist/_chunks/{muscle-scheme-1BZd1-RE.js.map → muscle-scheme-BkmDUTmk.js.map} +1 -1
- package/dist/_chunks/{optical-prescription-BGVeDVSP.js → optical-prescription-CvbN8yD2.js} +2 -2
- package/dist/_chunks/{optical-prescription-BGVeDVSP.js.map → optical-prescription-CvbN8yD2.js.map} +1 -1
- package/dist/_chunks/{patient-details-wMgTFtpp.js → patient-details-BwkDIm4D.js} +2 -2
- package/dist/_chunks/{patient-details-wMgTFtpp.js.map → patient-details-BwkDIm4D.js.map} +1 -1
- package/dist/_chunks/{patient-field-row-Bhm2Ig1P.js → patient-field-row-CBba7w9V.js} +2 -2
- package/dist/_chunks/{patient-field-row-Bhm2Ig1P.js.map → patient-field-row-CBba7w9V.js.map} +1 -1
- package/dist/_chunks/{patient-summary-card-DMdPPG3n.js → patient-summary-card-DtYTo9w_.js} +2 -2
- package/dist/_chunks/{patient-summary-card-DMdPPG3n.js.map → patient-summary-card-DtYTo9w_.js.map} +1 -1
- package/dist/_chunks/{pregnancy-dating-D6dLkMpl.js → pregnancy-dating-Cs8xpZA8.js} +2 -2
- package/dist/_chunks/{pregnancy-dating-D6dLkMpl.js.map → pregnancy-dating-Cs8xpZA8.js.map} +1 -1
- package/dist/_chunks/{registration-form-CEJRUS9G.js → registration-form-DEyUFysm.js} +2 -2
- package/dist/_chunks/{registration-form-CEJRUS9G.js.map → registration-form-DEyUFysm.js.map} +1 -1
- package/dist/_chunks/{reserved.agent-C-C9cvO5.js → reserved.agent-W_Zgj564.js} +2 -2
- package/dist/_chunks/{reserved.agent-C-C9cvO5.js.map → reserved.agent-W_Zgj564.js.map} +1 -1
- package/dist/_chunks/{select-BBDRYxJl.js → select-uESzXTX6.js} +42 -39
- package/dist/_chunks/select-uESzXTX6.js.map +1 -0
- package/dist/_chunks/{signature-request-DJwdPji_.js → signature-request-BnTihryS.js} +2 -2
- package/dist/_chunks/{signature-request-DJwdPji_.js.map → signature-request-BnTihryS.js.map} +1 -1
- package/dist/_chunks/{tabs-DYHgRVSJ.js → tabs-CXYjr_8O.js} +2 -2
- package/dist/_chunks/{tabs-DYHgRVSJ.js.map → tabs-CXYjr_8O.js.map} +1 -1
- package/dist/_chunks/{task-editor-jqRf2JP6.js → task-editor-gqWF1jI6.js} +2 -2
- package/dist/_chunks/{task-editor-jqRf2JP6.js.map → task-editor-gqWF1jI6.js.map} +1 -1
- package/dist/_chunks/{tasks-panel-CFo5uIHx.js → tasks-panel-OuIaydK5.js} +2 -2
- package/dist/_chunks/{tasks-panel-CFo5uIHx.js.map → tasks-panel-OuIaydK5.js.map} +1 -1
- package/dist/_chunks/{unit-converter-C95sa5y8.js → unit-converter-D77vmlzN.js} +2 -2
- package/dist/_chunks/{unit-converter-C95sa5y8.js.map → unit-converter-D77vmlzN.js.map} +1 -1
- package/dist/_chunks/{use-appointment-details-read-VI26Z-pc.js → use-appointment-details-read-DYyCYI9f.js} +2 -2
- package/dist/_chunks/{use-appointment-details-read-VI26Z-pc.js.map → use-appointment-details-read-DYyCYI9f.js.map} +1 -1
- package/dist/_chunks/{voice-control-panel-B0TUZAiP.js → voice-control-panel-BGiX4sqB.js} +2 -2
- package/dist/_chunks/{voice-control-panel-B0TUZAiP.js.map → voice-control-panel-BGiX4sqB.js.map} +1 -1
- package/dist/agent-catalog.json +1 -1
- package/dist/components/ai-prompt-input/index.js +1 -1
- package/dist/components/appointment-details-panel/index.js +1 -1
- package/dist/components/audio-recorder/index.js +1 -1
- package/dist/components/bishop-score/index.js +1 -1
- package/dist/components/booking/index.js +1 -1
- package/dist/components/data-table/index.js +2 -2
- package/dist/components/document-preview/index.js +1 -1
- package/dist/components/file-manager/index.js +1 -1
- package/dist/components/gestational-age-calculator/index.js +1 -1
- package/dist/components/heatmap/index.js +1 -1
- package/dist/components/muscle-scheme/index.js +1 -1
- package/dist/components/optical-prescription/index.js +1 -1
- package/dist/components/patient-details/index.js +1 -1
- package/dist/components/patient-summary-card/index.js +1 -1
- package/dist/components/patient-table/index.js +1 -1
- package/dist/components/pregnancy-dating/index.js +1 -1
- package/dist/components/rich-text-editor/index.js +1 -1
- package/dist/components/select/index.js +1 -1
- package/dist/components/select/select.d.ts.map +1 -1
- package/dist/components/skeleton-scheme/index.js +1 -1
- package/dist/components/tabs/index.js +1 -1
- package/dist/components/task-editor/index.js +1 -1
- package/dist/components/tasks-panel/index.js +1 -1
- package/dist/components/unit-converter/index.js +1 -1
- package/dist/components/voice-control-panel/index.js +1 -1
- package/dist/core.css +1 -1
- package/dist/index.js +28 -28
- package/dist/patterns/anamnesis/index.js +1 -1
- package/dist/patterns/calendar/index.js +1 -1
- package/dist/patterns/registration-form/index.js +1 -1
- package/dist/patterns/signature-request/index.js +1 -1
- package/dist/tokens.css +1 -1
- package/package.json +1 -1
- package/dist/_chunks/select-BBDRYxJl.js.map +0 -1
|
@@ -4,7 +4,7 @@ import * as S from "@radix-ui/react-tabs";
|
|
|
4
4
|
import { a as A, c as G } from "./index-D2ZczOXr.js";
|
|
5
5
|
import { useTranslation as te } from "react-i18next";
|
|
6
6
|
import { c as se } from "./compose-refs-C0k0tdqF.js";
|
|
7
|
-
import { S as ae } from "./select-
|
|
7
|
+
import { S as ae } from "./select-uESzXTX6.js";
|
|
8
8
|
import { D as V } from "./dropdown-menu-CqxBthww.js";
|
|
9
9
|
import { u as re } from "./registry-DvAUVLHh.js";
|
|
10
10
|
import { X as oe } from "./x-B5YnXwCz.js";
|
|
@@ -410,4 +410,4 @@ export {
|
|
|
410
410
|
Q as c,
|
|
411
411
|
de as t
|
|
412
412
|
};
|
|
413
|
-
//# sourceMappingURL=tabs-
|
|
413
|
+
//# sourceMappingURL=tabs-CXYjr_8O.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tabs-DYHgRVSJ.js","sources":["../../src/components/tabs/tabs.agent.ts","../../src/components/tabs/tabs.tsx"],"sourcesContent":["import type { AgentAdapter } from '../../agent/types';\nimport type { TabsHandle } from './tabs';\n\nexport const tabsAgent: AgentAdapter<TabsHandle> = {\n id: 'tabs',\n capabilities: ['select_single'],\n state: {\n activeTab: {\n type: 'string | null',\n descriptionKey: 'ui.agent.tabs.state.activeTab',\n description: 'Value of the currently-active tab.',\n read: (handle) => handle.getActiveTab(),\n },\n },\n actions: {\n select_tab: {\n safety: 'read',\n argsType: '{ value: string }',\n argsSchema: {\n type: 'object',\n properties: { value: { type: 'string' } },\n required: ['value'],\n },\n idempotent: true,\n descriptionKey: 'ui.agent.tabs.actions.selectTab',\n description: 'Activate the tab with the given value.',\n invoke: (handle, args: { value: string }) => {\n handle.selectTab(args.value);\n },\n },\n },\n domHooks: {\n root: { attr: 'data-component', value: 'tabs' },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description: 'Sourced from the id prop on Tabs.Root.',\n },\n item: {\n attr: 'data-tab-id',\n description: 'Each Tab.Trigger emits its value as data-tab-id.',\n },\n },\n};\n","import {\n Children,\n createContext,\n forwardRef,\n isValidElement,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n type ComponentPropsWithoutRef,\n type MutableRefObject,\n type ReactElement,\n type ReactNode,\n} from 'react';\nimport * as TabsPrimitive from '@radix-ui/react-tabs';\nimport { cva, cx, type VariantProps } from 'class-variance-authority';\nimport { X, ChevronDown } from 'lucide-react';\nimport { useTranslation } from 'react-i18next';\nimport { useDirection } from '../_shared/use-direction';\nimport { composeRefs } from '../_shared/compose-refs';\nimport { Select, type SelectOption } from '../select/select';\nimport { DropdownMenu } from '../dropdown-menu/dropdown-menu';\nimport { useAgentRegistration } from '../../agent';\nimport { tabsAgent } from './tabs.agent';\n\n// ---------------------------------------------------------------------------\n// CVA recipes\n// ---------------------------------------------------------------------------\n\nexport const tabsListVariants = cva('ds:relative ds:flex', {\n variants: {\n variant: {\n // Shadcn-style segmented control: light container, white active card\n default:\n 'ds:flex-1 ds:min-w-0 ds:items-center ds:bg-muted/10 ds:rounded-[var(--radius-md)] ds:p-1',\n // Classic underline tabs: bottom border with colored active indicator\n underlined:\n 'ds:flex-1 ds:min-w-0 ds:items-end ds:[border-block-end:1px_solid_var(--border)]',\n // Segmented control: warm secondary container, content-width\n pills:\n 'ds:items-center ds:bg-secondary ds:rounded-[var(--radius-md)] ds:p-1',\n },\n orientation: {\n horizontal: 'ds:flex-row ds:overflow-hidden',\n vertical: 'ds:flex-col',\n },\n },\n defaultVariants: {\n variant: 'default',\n orientation: 'horizontal',\n },\n});\n\nexport const tabsTriggerVariants = cva(\n [\n 'ds:relative ds:inline-flex ds:items-center ds:justify-center ds:whitespace-nowrap ds:border-0',\n 'ds:gap-2 ds:font-medium ds:transition-colors',\n 'ds:duration-[var(--animation-duration)] ds:motion-reduce:transition-none',\n 'ds:cursor-pointer ds:select-none',\n 'ds:disabled:pointer-events-none ds:disabled:opacity-50',\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid',\n 'ds:focus-visible:outline-ring ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n ].join(' '),\n {\n variants: {\n variant: {\n default: [\n 'ds:rounded-[var(--radius-sm)] ds:bg-transparent ds:text-muted-foreground',\n 'ds:hover:bg-muted/10 ds:hover:text-foreground',\n 'ds:data-[state=active]:bg-background ds:data-[state=active]:text-foreground',\n 'ds:data-[state=active]:shadow-sm',\n ].join(' '),\n underlined: [\n 'ds:bg-transparent ds:text-muted-foreground',\n 'ds:[border-block-end:2px_solid_transparent]',\n 'ds:hover:bg-muted/10 ds:hover:text-foreground',\n 'ds:data-[state=active]:[border-block-end-color:var(--primary)]',\n 'ds:data-[state=active]:text-foreground ds:data-[state=active]:[margin-block-end:-1px]',\n ].join(' '),\n pills: [\n 'ds:rounded-[var(--radius-full)] ds:bg-transparent ds:text-muted-foreground',\n 'ds:hover:bg-muted/20 ds:hover:text-foreground',\n 'ds:data-[state=active]:bg-primary ds:data-[state=active]:text-primary-foreground',\n ].join(' '),\n },\n size: {\n sm: 'ds:h-8 ds:px-[var(--spacing-sm)] ds:text-[length:var(--font-size-sm)]',\n md: 'ds:h-10 ds:px-[var(--spacing-md)] ds:text-[length:var(--font-size-base)]',\n lg: 'ds:h-12 ds:px-[var(--spacing-lg)] ds:text-[length:var(--font-size-lg)]',\n },\n orientation: {\n horizontal: '',\n vertical: 'ds:w-full ds:justify-start',\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'md',\n orientation: 'horizontal',\n },\n },\n);\n\n// ---------------------------------------------------------------------------\n// Context\n// ---------------------------------------------------------------------------\n\ntype TabsOverflow = 'dropdown' | 'select';\n\ninterface TabsContextValue {\n variant: 'default' | 'underlined' | 'pills';\n size: 'sm' | 'md' | 'lg';\n orientation: 'horizontal' | 'vertical';\n overflow: TabsOverflow;\n value: string;\n setValue: (value: string) => void;\n}\n\nconst TabsContext = createContext<TabsContextValue>({\n variant: 'default',\n size: 'md',\n orientation: 'horizontal',\n overflow: 'dropdown',\n value: '',\n setValue: () => {},\n});\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n// Curated agent-readiness handle — see tabs.agent.ts.\nexport interface TabsHandle {\n getActiveTab: () => string | null;\n selectTab: (value: string) => void;\n}\n\nexport interface TabsRootProps extends Omit<\n ComponentPropsWithoutRef<typeof TabsPrimitive.Root>,\n 'orientation'\n> {\n variant?: 'default' | 'underlined' | 'pills';\n size?: 'sm' | 'md' | 'lg';\n orientation?: 'horizontal' | 'vertical';\n /**\n * Strategy for tabs that don't fit horizontally.\n *\n * - `'dropdown'` (default) — overflowing tabs collapse into a \"More\"\n * `DropdownMenu` rendered next to the visible tab list. Most tabs\n * stay visible inline; the few that don't fit hide behind the menu.\n * Best when there are 5–7 tabs at moderately narrow viewports.\n * - `'select'` — at narrow container widths (under the `@md` breakpoint)\n * the entire tab strip collapses into a single `Select` whose value\n * is the active tab. Best when there are many tabs and the panel is\n * genuinely cramped (mobile, side-panel host). Above `@md`, the\n * inline tab list reappears unchanged.\n *\n * Limitation: the Select mirror builds option labels from each\n * `Tabs.Trigger`'s `children`. Plain string / number children are\n * used verbatim; richer children (icon + text, fragments) fall back\n * to the trigger's `value` so the option remains selectable. Prefer\n * plain-text trigger children when using `overflow=\"select\"`, or use\n * the trigger's `icon` prop for the icon and keep `children` a\n * plain string.\n *\n * @default 'dropdown'\n */\n overflow?: TabsOverflow;\n}\n\nexport interface TabsListProps extends ComponentPropsWithoutRef<\n typeof TabsPrimitive.List\n> {\n 'aria-label'?: string;\n}\n\nexport interface TabsTriggerProps\n extends\n ComponentPropsWithoutRef<typeof TabsPrimitive.Trigger>,\n VariantProps<typeof tabsTriggerVariants> {\n icon?: ReactNode;\n badge?: ReactNode;\n dismissible?: boolean;\n onDismiss?: () => void;\n}\n\nexport type TabsContentProps = ComponentPropsWithoutRef<\n typeof TabsPrimitive.Content\n>;\n\n// ---------------------------------------------------------------------------\n// TabsRoot\n// ---------------------------------------------------------------------------\n\nconst TabsRoot = forwardRef<HTMLDivElement, TabsRootProps>(\n (\n {\n variant = 'default',\n size = 'md',\n orientation = 'horizontal',\n overflow = 'dropdown',\n className,\n children,\n value: valueProp,\n defaultValue,\n onValueChange,\n id,\n ...props\n },\n ref,\n ) => {\n const rootRef = useRef<HTMLDivElement>(null);\n const composedRef = composeRefs(ref, rootRef);\n const dir = useDirection(rootRef);\n\n // Track the active tab so the `overflow=\"select\"` mirror can read it\n // without forcing consumers into controlled mode. If `value` is passed\n // we honour it; otherwise we manage internal state seeded from\n // `defaultValue` and notify consumers via `onValueChange`. Net effect\n // is identical to Radix's own controlled / uncontrolled split — we\n // just shadow the value into context so the Select can mirror it.\n const isControlled = valueProp !== undefined;\n const [internalValue, setInternalValue] = useState<string>(\n defaultValue ?? '',\n );\n const value = isControlled ? (valueProp ?? '') : internalValue;\n const setValue = useCallback(\n (next: string) => {\n if (!isControlled) setInternalValue(next);\n onValueChange?.(next);\n },\n [isControlled, onValueChange],\n );\n\n const ctxValue = useMemo(\n () => ({ variant, size, orientation, overflow, value, setValue }),\n [variant, size, orientation, overflow, value, setValue],\n );\n\n // Agent handle — ref mirrors value for fresh reads.\n const valueRef = useRef<string>(value);\n useEffect(() => {\n valueRef.current = value;\n }, [value]);\n\n const agentHandle = useMemo<TabsHandle>(\n () => ({\n getActiveTab: () => valueRef.current || null,\n selectTab: (next) => setValue(next),\n }),\n [setValue],\n );\n useAgentRegistration(tabsAgent, agentHandle, id);\n\n return (\n <TabsContext.Provider value={ctxValue}>\n <TabsPrimitive.Root\n ref={composedRef}\n orientation={orientation}\n dir={dir}\n // We always run Radix in controlled mode against our shadow state\n // (seeded from `defaultValue`) so the `overflow=\"select\"` mirror\n // can read the active value via context without DOM observation.\n value={value}\n onValueChange={setValue}\n id={id}\n data-component=\"tabs\"\n data-component-id={id}\n className={cx(\n 'ds:flex',\n orientation === 'vertical'\n ? 'ds:flex-row ds:gap-[var(--spacing-md)]'\n : 'ds:flex-col',\n className,\n )}\n {...props}\n >\n {children}\n </TabsPrimitive.Root>\n </TabsContext.Provider>\n );\n },\n);\nTabsRoot.displayName = 'Tabs';\n\n// ---------------------------------------------------------------------------\n// TabsList — with overflow detection\n// ---------------------------------------------------------------------------\n\nconst TabsList = forwardRef<HTMLDivElement, TabsListProps>(\n ({ className, children, 'aria-label': ariaLabel, ...props }, ref) => {\n const { variant, size, orientation, overflow, value, setValue } =\n useContext(TabsContext);\n const { t } = useTranslation('ui');\n\n const listRef = useRef<HTMLDivElement>(null);\n // The row that holds the list AND the \"More\" trigger: its width is the\n // room the tabs would have if the trigger were not there.\n const rowRef = useRef<HTMLDivElement>(null);\n const [overflowTabs, setOverflowTabs] = useState<OverflowTab[]>([]);\n const isHorizontal = orientation === 'horizontal';\n // The `select` overflow strategy renders a Select mirror at narrow\n // container widths and skips the DropdownMenu overflow detector\n // (it's the wrong UX for that case — a select-and-a-dropdown would\n // double up). The dropdown detector only runs when `overflow` is\n // `dropdown` and the strip is horizontal.\n const isDropdownOverflow = overflow === 'dropdown' && isHorizontal;\n\n useEffect(() => {\n if (!isDropdownOverflow) {\n setOverflowTabs([]);\n return;\n }\n const el = listRef.current;\n const row = rowRef.current;\n if (!el || !row) return;\n const tabs = Array.from(\n el.querySelectorAll<HTMLButtonElement>('[role=\"tab\"]'),\n );\n\n const detectOverflow = () => {\n // \"Do the tabs fit?\" is asked of the whole row, not of the list: once\n // \"More\" shows it takes room from the list, so asking the list would\n // keep \"More\" up for good after one narrow reading (a popover opening,\n // a late web font), even when every tab has room again.\n if (el.scrollWidth <= row.clientWidth + 1) {\n setOverflowTabs((prev) => (prev.length === 0 ? prev : []));\n return;\n }\n // Layout offsets, not client rects: they ignore an ancestor's\n // open/close transform. Both edges count, so a tab scrolled out at\n // the start (and every overflowing tab in RTL) is listed too.\n const hidden: OverflowTab[] = [];\n for (const tab of tabs) {\n const start = tab.offsetLeft - el.scrollLeft;\n const end = start + tab.offsetWidth;\n if (start < -1 || end > el.clientWidth + 1) {\n const value = tab.dataset['value'] ?? '';\n hidden.push({\n value,\n label: tab.textContent?.trim() || value,\n disabled: tab.disabled,\n });\n }\n }\n setOverflowTabs((prev) =>\n sameOverflowTabs(prev, hidden) ? prev : hidden,\n );\n };\n\n // The row catches container changes, each tab catches its own (a label\n // re-rendered or re-flowed when a web font lands), and scrolling moves\n // which tabs are clipped.\n const ro = new ResizeObserver(detectOverflow);\n ro.observe(row);\n ro.observe(el);\n tabs.forEach((tab) => ro.observe(tab));\n el.addEventListener('scroll', detectOverflow, { passive: true });\n detectOverflow();\n return () => {\n ro.disconnect();\n el.removeEventListener('scroll', detectOverflow);\n };\n }, [isDropdownOverflow, children]);\n\n // Picking a hidden tab selects it and scrolls it into the strip. Scoped\n // to this list, so a same-valued tab in another Tabs is never touched.\n const selectOverflowTab = useCallback(\n (next: string) => {\n const tab = listRef.current?.querySelector<HTMLButtonElement>(\n `[role=\"tab\"][data-value=\"${CSS.escape(next)}\"]`,\n );\n if (tab?.disabled) return;\n setValue(next);\n // Radix selects on mousedown, so a click only runs the caller's own\n // onClick on the trigger, as picking the tab itself would.\n tab?.click();\n tab?.scrollIntoView({ block: 'nearest', inline: 'nearest' });\n },\n [setValue],\n );\n\n const combinedRef = (node: HTMLDivElement | null) => {\n (listRef as MutableRefObject<HTMLDivElement | null>).current = node;\n if (typeof ref === 'function') ref(node);\n else if (ref)\n (ref as MutableRefObject<HTMLDivElement | null>).current = node;\n };\n\n // For `overflow=\"select\"` we mirror the Trigger children as Select\n // options. Triggers may carry icon + text; for the Select label we\n // prefer the trigger's plain-text children — anything else falls\n // back to the trigger's `value` so the option is at least selectable.\n const selectOptions = useMemo<SelectOption<string>[]>(() => {\n if (overflow !== 'select') return [];\n return Children.toArray(children)\n .filter((child): child is ReactElement<TabsTriggerProps> =>\n isValidElement(child),\n )\n .filter(\n (child) =>\n typeof child.props.value === 'string' &&\n child.props.value.length > 0,\n )\n .map((child) => {\n const triggerValue = child.props.value as string;\n const labelChild = child.props.children;\n const label =\n typeof labelChild === 'string'\n ? labelChild\n : typeof labelChild === 'number'\n ? String(labelChild)\n : triggerValue;\n return { value: triggerValue, label };\n });\n }, [children, overflow]);\n\n if (overflow === 'select' && isHorizontal) {\n // Container queries gate the swap: above `@md` (Tailwind v4 default\n // 28rem container width) the inline tab strip renders; below it,\n // the Select takes over. The Tabs.List markup stays mounted in\n // both modes so Radix's roving-tabindex / ARIA wiring is preserved\n // even when the strip is visually hidden — keyboard users who land\n // on the panel via skip-link still get to the active tab.\n return (\n <div className=\"ds:@container/tabs ds:relative ds:w-full\">\n {/* Select mirror — visible at narrow container widths only.\n Threshold is px, not the `@md` rem alias: container-query `rem`\n follows the host's root font-size and misfires off a 16px root. */}\n <div className=\"ds:block ds:@[448px]/tabs:hidden\">\n <Select\n options={selectOptions}\n value={value}\n onValueChange={(next) => {\n if (typeof next === 'string' && next.length > 0) setValue(next);\n }}\n size={size}\n aria-label={ariaLabel ?? t('tabs.selectLabel')}\n />\n </div>\n {/* Inline tab strip — visible at wider container widths. */}\n <div className=\"ds:hidden ds:@[448px]/tabs:flex ds:relative ds:items-center\">\n <TabsPrimitive.List\n ref={combinedRef}\n aria-label={ariaLabel}\n className={tabsListVariants({ variant, orientation, className })}\n {...props}\n >\n {children}\n </TabsPrimitive.List>\n </div>\n </div>\n );\n }\n\n return (\n <div ref={rowRef} className=\"ds:relative ds:flex ds:items-center\">\n <TabsPrimitive.List\n ref={combinedRef}\n aria-label={ariaLabel}\n className={tabsListVariants({ variant, orientation, className })}\n {...props}\n >\n {children}\n </TabsPrimitive.List>\n\n {isDropdownOverflow && overflowTabs.length > 0 && (\n <OverflowMenu\n tabs={overflowTabs}\n label={t('tabs.moreTabs')}\n size={size}\n onSelectTab={selectOverflowTab}\n />\n )}\n </div>\n );\n },\n);\nTabsList.displayName = 'TabsList';\n\n// ---------------------------------------------------------------------------\n// OverflowMenu (internal)\n// ---------------------------------------------------------------------------\n\ninterface OverflowTab {\n value: string;\n label: string;\n disabled: boolean;\n}\n\nfunction sameOverflowTabs(a: OverflowTab[], b: OverflowTab[]): boolean {\n return (\n a.length === b.length &&\n a.every(\n (tab, index) =>\n tab.value === b[index].value &&\n tab.label === b[index].label &&\n tab.disabled === b[index].disabled,\n )\n );\n}\n\ninterface OverflowMenuProps {\n tabs: OverflowTab[];\n label: string;\n size: 'sm' | 'md' | 'lg';\n onSelectTab: (value: string) => void;\n}\n\n// Built on the kit DropdownMenu, so it inherits the kit's height cap: a long\n// list of hidden tabs scrolls inside the menu instead of running off-screen.\nfunction OverflowMenu({ tabs, label, size, onSelectTab }: OverflowMenuProps) {\n const { variant } = useContext(TabsContext);\n\n return (\n <DropdownMenu.Root>\n <DropdownMenu.Trigger\n className={cx(\n tabsTriggerVariants({ variant, size, orientation: 'horizontal' }),\n 'ds:shrink-0 ds:ms-1',\n )}\n aria-label={label}\n >\n {label}\n <ChevronDown aria-hidden=\"true\" className=\"ds:size-4\" />\n </DropdownMenu.Trigger>\n <DropdownMenu.Content align=\"end\">\n {tabs.map(({ value, label: tabLabel, disabled }) => (\n <DropdownMenu.Item\n key={value}\n disabled={disabled}\n onSelect={() => onSelectTab(value)}\n >\n {tabLabel}\n </DropdownMenu.Item>\n ))}\n </DropdownMenu.Content>\n </DropdownMenu.Root>\n );\n}\n\n// ---------------------------------------------------------------------------\n// TabsTrigger\n// ---------------------------------------------------------------------------\n\nconst TabsTrigger = forwardRef<HTMLButtonElement, TabsTriggerProps>(\n (\n {\n variant: variantProp,\n size: sizeProp,\n orientation: orientationProp,\n icon,\n badge,\n dismissible = false,\n onDismiss,\n className,\n children,\n value,\n onKeyDown,\n ...props\n },\n ref,\n ) => {\n const ctx = useContext(TabsContext);\n const variant = variantProp ?? ctx.variant;\n const size = sizeProp ?? ctx.size;\n const orientation = orientationProp ?? ctx.orientation;\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLButtonElement>) => {\n // APG dismissible-tab pattern: Delete/Backspace while trigger is focused closes the tab.\n // The visual X is pointer-only (aria-hidden) to avoid nested-interactive HTML violation.\n if (dismissible && (e.key === 'Delete' || e.key === 'Backspace')) {\n e.preventDefault();\n onDismiss?.();\n }\n onKeyDown?.(e);\n };\n\n return (\n <TabsPrimitive.Trigger\n ref={ref}\n value={value}\n data-value={value}\n data-tab-id={value}\n className={tabsTriggerVariants({\n variant,\n size,\n orientation,\n className,\n })}\n onKeyDown={handleKeyDown}\n {...props}\n >\n {icon && (\n <span aria-hidden=\"true\" className=\"ds:shrink-0 ds:size-4\">\n {icon}\n </span>\n )}\n {children}\n {badge && <span className=\"ds:shrink-0\">{badge}</span>}\n {dismissible && (\n // Visual-only dismiss indicator — pointer dismiss fires here; keyboard dismiss fires via Delete/Backspace on the trigger above.\n // No role/tabIndex to avoid nested-interactive (interactive content inside <button> is invalid HTML).\n <span\n aria-hidden=\"true\"\n className={cx(\n 'ds:inline-flex ds:items-center ds:justify-center ds:shrink-0',\n 'ds:size-6 ds:rounded-[var(--radius-sm)]',\n 'ds:hover:bg-muted-foreground/20',\n )}\n onPointerDown={(e) => {\n e.stopPropagation();\n e.preventDefault();\n onDismiss?.();\n }}\n >\n <X className=\"ds:size-3.5\" />\n </span>\n )}\n </TabsPrimitive.Trigger>\n );\n },\n);\nTabsTrigger.displayName = 'TabsTrigger';\n\n// ---------------------------------------------------------------------------\n// TabsContent\n// ---------------------------------------------------------------------------\n\nconst TabsContent = forwardRef<HTMLDivElement, TabsContentProps>(\n ({ className, children, ...props }, ref) => (\n <TabsPrimitive.Content\n ref={ref}\n className={cx(\n 'ds:mt-[var(--spacing-sm)] ds:outline-none',\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid',\n 'ds:focus-visible:outline-ring ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n className,\n )}\n {...props}\n >\n {children}\n </TabsPrimitive.Content>\n ),\n);\nTabsContent.displayName = 'TabsContent';\n\n// ---------------------------------------------------------------------------\n// Compound export\n// ---------------------------------------------------------------------------\n\nexport const Tabs = Object.assign(TabsRoot, {\n Root: TabsRoot,\n List: TabsList,\n Trigger: TabsTrigger,\n Content: TabsContent,\n});\n\nexport { TabsList, TabsTrigger, TabsContent };\n"],"names":["tabsAgent","handle","args","tabsListVariants","cva","tabsTriggerVariants","TabsContext","createContext","TabsRoot","forwardRef","variant","size","orientation","overflow","className","children","valueProp","defaultValue","onValueChange","id","props","ref","rootRef","useRef","composedRef","composeRefs","dir","useDirection","isControlled","internalValue","setInternalValue","useState","value","setValue","useCallback","next","ctxValue","useMemo","valueRef","useEffect","agentHandle","useAgentRegistration","jsx","TabsPrimitive","cx","TabsList","ariaLabel","useContext","t","useTranslation","listRef","rowRef","overflowTabs","setOverflowTabs","isHorizontal","isDropdownOverflow","el","row","tabs","detectOverflow","prev","hidden","tab","start","end","_a","sameOverflowTabs","ro","selectOverflowTab","combinedRef","node","selectOptions","Children","child","isValidElement","triggerValue","labelChild","label","jsxs","Select","OverflowMenu","a","b","index","onSelectTab","DropdownMenu","ChevronDown","tabLabel","disabled","TabsTrigger","variantProp","sizeProp","orientationProp","icon","badge","dismissible","onDismiss","onKeyDown","ctx","handleKeyDown","e","X","TabsContent","Tabs"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"tabs-CXYjr_8O.js","sources":["../../src/components/tabs/tabs.agent.ts","../../src/components/tabs/tabs.tsx"],"sourcesContent":["import type { AgentAdapter } from '../../agent/types';\nimport type { TabsHandle } from './tabs';\n\nexport const tabsAgent: AgentAdapter<TabsHandle> = {\n id: 'tabs',\n capabilities: ['select_single'],\n state: {\n activeTab: {\n type: 'string | null',\n descriptionKey: 'ui.agent.tabs.state.activeTab',\n description: 'Value of the currently-active tab.',\n read: (handle) => handle.getActiveTab(),\n },\n },\n actions: {\n select_tab: {\n safety: 'read',\n argsType: '{ value: string }',\n argsSchema: {\n type: 'object',\n properties: { value: { type: 'string' } },\n required: ['value'],\n },\n idempotent: true,\n descriptionKey: 'ui.agent.tabs.actions.selectTab',\n description: 'Activate the tab with the given value.',\n invoke: (handle, args: { value: string }) => {\n handle.selectTab(args.value);\n },\n },\n },\n domHooks: {\n root: { attr: 'data-component', value: 'tabs' },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description: 'Sourced from the id prop on Tabs.Root.',\n },\n item: {\n attr: 'data-tab-id',\n description: 'Each Tab.Trigger emits its value as data-tab-id.',\n },\n },\n};\n","import {\n Children,\n createContext,\n forwardRef,\n isValidElement,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n type ComponentPropsWithoutRef,\n type MutableRefObject,\n type ReactElement,\n type ReactNode,\n} from 'react';\nimport * as TabsPrimitive from '@radix-ui/react-tabs';\nimport { cva, cx, type VariantProps } from 'class-variance-authority';\nimport { X, ChevronDown } from 'lucide-react';\nimport { useTranslation } from 'react-i18next';\nimport { useDirection } from '../_shared/use-direction';\nimport { composeRefs } from '../_shared/compose-refs';\nimport { Select, type SelectOption } from '../select/select';\nimport { DropdownMenu } from '../dropdown-menu/dropdown-menu';\nimport { useAgentRegistration } from '../../agent';\nimport { tabsAgent } from './tabs.agent';\n\n// ---------------------------------------------------------------------------\n// CVA recipes\n// ---------------------------------------------------------------------------\n\nexport const tabsListVariants = cva('ds:relative ds:flex', {\n variants: {\n variant: {\n // Shadcn-style segmented control: light container, white active card\n default:\n 'ds:flex-1 ds:min-w-0 ds:items-center ds:bg-muted/10 ds:rounded-[var(--radius-md)] ds:p-1',\n // Classic underline tabs: bottom border with colored active indicator\n underlined:\n 'ds:flex-1 ds:min-w-0 ds:items-end ds:[border-block-end:1px_solid_var(--border)]',\n // Segmented control: warm secondary container, content-width\n pills:\n 'ds:items-center ds:bg-secondary ds:rounded-[var(--radius-md)] ds:p-1',\n },\n orientation: {\n horizontal: 'ds:flex-row ds:overflow-hidden',\n vertical: 'ds:flex-col',\n },\n },\n defaultVariants: {\n variant: 'default',\n orientation: 'horizontal',\n },\n});\n\nexport const tabsTriggerVariants = cva(\n [\n 'ds:relative ds:inline-flex ds:items-center ds:justify-center ds:whitespace-nowrap ds:border-0',\n 'ds:gap-2 ds:font-medium ds:transition-colors',\n 'ds:duration-[var(--animation-duration)] ds:motion-reduce:transition-none',\n 'ds:cursor-pointer ds:select-none',\n 'ds:disabled:pointer-events-none ds:disabled:opacity-50',\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid',\n 'ds:focus-visible:outline-ring ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n ].join(' '),\n {\n variants: {\n variant: {\n default: [\n 'ds:rounded-[var(--radius-sm)] ds:bg-transparent ds:text-muted-foreground',\n 'ds:hover:bg-muted/10 ds:hover:text-foreground',\n 'ds:data-[state=active]:bg-background ds:data-[state=active]:text-foreground',\n 'ds:data-[state=active]:shadow-sm',\n ].join(' '),\n underlined: [\n 'ds:bg-transparent ds:text-muted-foreground',\n 'ds:[border-block-end:2px_solid_transparent]',\n 'ds:hover:bg-muted/10 ds:hover:text-foreground',\n 'ds:data-[state=active]:[border-block-end-color:var(--primary)]',\n 'ds:data-[state=active]:text-foreground ds:data-[state=active]:[margin-block-end:-1px]',\n ].join(' '),\n pills: [\n 'ds:rounded-[var(--radius-full)] ds:bg-transparent ds:text-muted-foreground',\n 'ds:hover:bg-muted/20 ds:hover:text-foreground',\n 'ds:data-[state=active]:bg-primary ds:data-[state=active]:text-primary-foreground',\n ].join(' '),\n },\n size: {\n sm: 'ds:h-8 ds:px-[var(--spacing-sm)] ds:text-[length:var(--font-size-sm)]',\n md: 'ds:h-10 ds:px-[var(--spacing-md)] ds:text-[length:var(--font-size-base)]',\n lg: 'ds:h-12 ds:px-[var(--spacing-lg)] ds:text-[length:var(--font-size-lg)]',\n },\n orientation: {\n horizontal: '',\n vertical: 'ds:w-full ds:justify-start',\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'md',\n orientation: 'horizontal',\n },\n },\n);\n\n// ---------------------------------------------------------------------------\n// Context\n// ---------------------------------------------------------------------------\n\ntype TabsOverflow = 'dropdown' | 'select';\n\ninterface TabsContextValue {\n variant: 'default' | 'underlined' | 'pills';\n size: 'sm' | 'md' | 'lg';\n orientation: 'horizontal' | 'vertical';\n overflow: TabsOverflow;\n value: string;\n setValue: (value: string) => void;\n}\n\nconst TabsContext = createContext<TabsContextValue>({\n variant: 'default',\n size: 'md',\n orientation: 'horizontal',\n overflow: 'dropdown',\n value: '',\n setValue: () => {},\n});\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n// Curated agent-readiness handle — see tabs.agent.ts.\nexport interface TabsHandle {\n getActiveTab: () => string | null;\n selectTab: (value: string) => void;\n}\n\nexport interface TabsRootProps extends Omit<\n ComponentPropsWithoutRef<typeof TabsPrimitive.Root>,\n 'orientation'\n> {\n variant?: 'default' | 'underlined' | 'pills';\n size?: 'sm' | 'md' | 'lg';\n orientation?: 'horizontal' | 'vertical';\n /**\n * Strategy for tabs that don't fit horizontally.\n *\n * - `'dropdown'` (default) — overflowing tabs collapse into a \"More\"\n * `DropdownMenu` rendered next to the visible tab list. Most tabs\n * stay visible inline; the few that don't fit hide behind the menu.\n * Best when there are 5–7 tabs at moderately narrow viewports.\n * - `'select'` — at narrow container widths (under the `@md` breakpoint)\n * the entire tab strip collapses into a single `Select` whose value\n * is the active tab. Best when there are many tabs and the panel is\n * genuinely cramped (mobile, side-panel host). Above `@md`, the\n * inline tab list reappears unchanged.\n *\n * Limitation: the Select mirror builds option labels from each\n * `Tabs.Trigger`'s `children`. Plain string / number children are\n * used verbatim; richer children (icon + text, fragments) fall back\n * to the trigger's `value` so the option remains selectable. Prefer\n * plain-text trigger children when using `overflow=\"select\"`, or use\n * the trigger's `icon` prop for the icon and keep `children` a\n * plain string.\n *\n * @default 'dropdown'\n */\n overflow?: TabsOverflow;\n}\n\nexport interface TabsListProps extends ComponentPropsWithoutRef<\n typeof TabsPrimitive.List\n> {\n 'aria-label'?: string;\n}\n\nexport interface TabsTriggerProps\n extends\n ComponentPropsWithoutRef<typeof TabsPrimitive.Trigger>,\n VariantProps<typeof tabsTriggerVariants> {\n icon?: ReactNode;\n badge?: ReactNode;\n dismissible?: boolean;\n onDismiss?: () => void;\n}\n\nexport type TabsContentProps = ComponentPropsWithoutRef<\n typeof TabsPrimitive.Content\n>;\n\n// ---------------------------------------------------------------------------\n// TabsRoot\n// ---------------------------------------------------------------------------\n\nconst TabsRoot = forwardRef<HTMLDivElement, TabsRootProps>(\n (\n {\n variant = 'default',\n size = 'md',\n orientation = 'horizontal',\n overflow = 'dropdown',\n className,\n children,\n value: valueProp,\n defaultValue,\n onValueChange,\n id,\n ...props\n },\n ref,\n ) => {\n const rootRef = useRef<HTMLDivElement>(null);\n const composedRef = composeRefs(ref, rootRef);\n const dir = useDirection(rootRef);\n\n // Track the active tab so the `overflow=\"select\"` mirror can read it\n // without forcing consumers into controlled mode. If `value` is passed\n // we honour it; otherwise we manage internal state seeded from\n // `defaultValue` and notify consumers via `onValueChange`. Net effect\n // is identical to Radix's own controlled / uncontrolled split — we\n // just shadow the value into context so the Select can mirror it.\n const isControlled = valueProp !== undefined;\n const [internalValue, setInternalValue] = useState<string>(\n defaultValue ?? '',\n );\n const value = isControlled ? (valueProp ?? '') : internalValue;\n const setValue = useCallback(\n (next: string) => {\n if (!isControlled) setInternalValue(next);\n onValueChange?.(next);\n },\n [isControlled, onValueChange],\n );\n\n const ctxValue = useMemo(\n () => ({ variant, size, orientation, overflow, value, setValue }),\n [variant, size, orientation, overflow, value, setValue],\n );\n\n // Agent handle — ref mirrors value for fresh reads.\n const valueRef = useRef<string>(value);\n useEffect(() => {\n valueRef.current = value;\n }, [value]);\n\n const agentHandle = useMemo<TabsHandle>(\n () => ({\n getActiveTab: () => valueRef.current || null,\n selectTab: (next) => setValue(next),\n }),\n [setValue],\n );\n useAgentRegistration(tabsAgent, agentHandle, id);\n\n return (\n <TabsContext.Provider value={ctxValue}>\n <TabsPrimitive.Root\n ref={composedRef}\n orientation={orientation}\n dir={dir}\n // We always run Radix in controlled mode against our shadow state\n // (seeded from `defaultValue`) so the `overflow=\"select\"` mirror\n // can read the active value via context without DOM observation.\n value={value}\n onValueChange={setValue}\n id={id}\n data-component=\"tabs\"\n data-component-id={id}\n className={cx(\n 'ds:flex',\n orientation === 'vertical'\n ? 'ds:flex-row ds:gap-[var(--spacing-md)]'\n : 'ds:flex-col',\n className,\n )}\n {...props}\n >\n {children}\n </TabsPrimitive.Root>\n </TabsContext.Provider>\n );\n },\n);\nTabsRoot.displayName = 'Tabs';\n\n// ---------------------------------------------------------------------------\n// TabsList — with overflow detection\n// ---------------------------------------------------------------------------\n\nconst TabsList = forwardRef<HTMLDivElement, TabsListProps>(\n ({ className, children, 'aria-label': ariaLabel, ...props }, ref) => {\n const { variant, size, orientation, overflow, value, setValue } =\n useContext(TabsContext);\n const { t } = useTranslation('ui');\n\n const listRef = useRef<HTMLDivElement>(null);\n // The row that holds the list AND the \"More\" trigger: its width is the\n // room the tabs would have if the trigger were not there.\n const rowRef = useRef<HTMLDivElement>(null);\n const [overflowTabs, setOverflowTabs] = useState<OverflowTab[]>([]);\n const isHorizontal = orientation === 'horizontal';\n // The `select` overflow strategy renders a Select mirror at narrow\n // container widths and skips the DropdownMenu overflow detector\n // (it's the wrong UX for that case — a select-and-a-dropdown would\n // double up). The dropdown detector only runs when `overflow` is\n // `dropdown` and the strip is horizontal.\n const isDropdownOverflow = overflow === 'dropdown' && isHorizontal;\n\n useEffect(() => {\n if (!isDropdownOverflow) {\n setOverflowTabs([]);\n return;\n }\n const el = listRef.current;\n const row = rowRef.current;\n if (!el || !row) return;\n const tabs = Array.from(\n el.querySelectorAll<HTMLButtonElement>('[role=\"tab\"]'),\n );\n\n const detectOverflow = () => {\n // \"Do the tabs fit?\" is asked of the whole row, not of the list: once\n // \"More\" shows it takes room from the list, so asking the list would\n // keep \"More\" up for good after one narrow reading (a popover opening,\n // a late web font), even when every tab has room again.\n if (el.scrollWidth <= row.clientWidth + 1) {\n setOverflowTabs((prev) => (prev.length === 0 ? prev : []));\n return;\n }\n // Layout offsets, not client rects: they ignore an ancestor's\n // open/close transform. Both edges count, so a tab scrolled out at\n // the start (and every overflowing tab in RTL) is listed too.\n const hidden: OverflowTab[] = [];\n for (const tab of tabs) {\n const start = tab.offsetLeft - el.scrollLeft;\n const end = start + tab.offsetWidth;\n if (start < -1 || end > el.clientWidth + 1) {\n const value = tab.dataset['value'] ?? '';\n hidden.push({\n value,\n label: tab.textContent?.trim() || value,\n disabled: tab.disabled,\n });\n }\n }\n setOverflowTabs((prev) =>\n sameOverflowTabs(prev, hidden) ? prev : hidden,\n );\n };\n\n // The row catches container changes, each tab catches its own (a label\n // re-rendered or re-flowed when a web font lands), and scrolling moves\n // which tabs are clipped.\n const ro = new ResizeObserver(detectOverflow);\n ro.observe(row);\n ro.observe(el);\n tabs.forEach((tab) => ro.observe(tab));\n el.addEventListener('scroll', detectOverflow, { passive: true });\n detectOverflow();\n return () => {\n ro.disconnect();\n el.removeEventListener('scroll', detectOverflow);\n };\n }, [isDropdownOverflow, children]);\n\n // Picking a hidden tab selects it and scrolls it into the strip. Scoped\n // to this list, so a same-valued tab in another Tabs is never touched.\n const selectOverflowTab = useCallback(\n (next: string) => {\n const tab = listRef.current?.querySelector<HTMLButtonElement>(\n `[role=\"tab\"][data-value=\"${CSS.escape(next)}\"]`,\n );\n if (tab?.disabled) return;\n setValue(next);\n // Radix selects on mousedown, so a click only runs the caller's own\n // onClick on the trigger, as picking the tab itself would.\n tab?.click();\n tab?.scrollIntoView({ block: 'nearest', inline: 'nearest' });\n },\n [setValue],\n );\n\n const combinedRef = (node: HTMLDivElement | null) => {\n (listRef as MutableRefObject<HTMLDivElement | null>).current = node;\n if (typeof ref === 'function') ref(node);\n else if (ref)\n (ref as MutableRefObject<HTMLDivElement | null>).current = node;\n };\n\n // For `overflow=\"select\"` we mirror the Trigger children as Select\n // options. Triggers may carry icon + text; for the Select label we\n // prefer the trigger's plain-text children — anything else falls\n // back to the trigger's `value` so the option is at least selectable.\n const selectOptions = useMemo<SelectOption<string>[]>(() => {\n if (overflow !== 'select') return [];\n return Children.toArray(children)\n .filter((child): child is ReactElement<TabsTriggerProps> =>\n isValidElement(child),\n )\n .filter(\n (child) =>\n typeof child.props.value === 'string' &&\n child.props.value.length > 0,\n )\n .map((child) => {\n const triggerValue = child.props.value as string;\n const labelChild = child.props.children;\n const label =\n typeof labelChild === 'string'\n ? labelChild\n : typeof labelChild === 'number'\n ? String(labelChild)\n : triggerValue;\n return { value: triggerValue, label };\n });\n }, [children, overflow]);\n\n if (overflow === 'select' && isHorizontal) {\n // Container queries gate the swap: above `@md` (Tailwind v4 default\n // 28rem container width) the inline tab strip renders; below it,\n // the Select takes over. The Tabs.List markup stays mounted in\n // both modes so Radix's roving-tabindex / ARIA wiring is preserved\n // even when the strip is visually hidden — keyboard users who land\n // on the panel via skip-link still get to the active tab.\n return (\n <div className=\"ds:@container/tabs ds:relative ds:w-full\">\n {/* Select mirror — visible at narrow container widths only.\n Threshold is px, not the `@md` rem alias: container-query `rem`\n follows the host's root font-size and misfires off a 16px root. */}\n <div className=\"ds:block ds:@[448px]/tabs:hidden\">\n <Select\n options={selectOptions}\n value={value}\n onValueChange={(next) => {\n if (typeof next === 'string' && next.length > 0) setValue(next);\n }}\n size={size}\n aria-label={ariaLabel ?? t('tabs.selectLabel')}\n />\n </div>\n {/* Inline tab strip — visible at wider container widths. */}\n <div className=\"ds:hidden ds:@[448px]/tabs:flex ds:relative ds:items-center\">\n <TabsPrimitive.List\n ref={combinedRef}\n aria-label={ariaLabel}\n className={tabsListVariants({ variant, orientation, className })}\n {...props}\n >\n {children}\n </TabsPrimitive.List>\n </div>\n </div>\n );\n }\n\n return (\n <div ref={rowRef} className=\"ds:relative ds:flex ds:items-center\">\n <TabsPrimitive.List\n ref={combinedRef}\n aria-label={ariaLabel}\n className={tabsListVariants({ variant, orientation, className })}\n {...props}\n >\n {children}\n </TabsPrimitive.List>\n\n {isDropdownOverflow && overflowTabs.length > 0 && (\n <OverflowMenu\n tabs={overflowTabs}\n label={t('tabs.moreTabs')}\n size={size}\n onSelectTab={selectOverflowTab}\n />\n )}\n </div>\n );\n },\n);\nTabsList.displayName = 'TabsList';\n\n// ---------------------------------------------------------------------------\n// OverflowMenu (internal)\n// ---------------------------------------------------------------------------\n\ninterface OverflowTab {\n value: string;\n label: string;\n disabled: boolean;\n}\n\nfunction sameOverflowTabs(a: OverflowTab[], b: OverflowTab[]): boolean {\n return (\n a.length === b.length &&\n a.every(\n (tab, index) =>\n tab.value === b[index].value &&\n tab.label === b[index].label &&\n tab.disabled === b[index].disabled,\n )\n );\n}\n\ninterface OverflowMenuProps {\n tabs: OverflowTab[];\n label: string;\n size: 'sm' | 'md' | 'lg';\n onSelectTab: (value: string) => void;\n}\n\n// Built on the kit DropdownMenu, so it inherits the kit's height cap: a long\n// list of hidden tabs scrolls inside the menu instead of running off-screen.\nfunction OverflowMenu({ tabs, label, size, onSelectTab }: OverflowMenuProps) {\n const { variant } = useContext(TabsContext);\n\n return (\n <DropdownMenu.Root>\n <DropdownMenu.Trigger\n className={cx(\n tabsTriggerVariants({ variant, size, orientation: 'horizontal' }),\n 'ds:shrink-0 ds:ms-1',\n )}\n aria-label={label}\n >\n {label}\n <ChevronDown aria-hidden=\"true\" className=\"ds:size-4\" />\n </DropdownMenu.Trigger>\n <DropdownMenu.Content align=\"end\">\n {tabs.map(({ value, label: tabLabel, disabled }) => (\n <DropdownMenu.Item\n key={value}\n disabled={disabled}\n onSelect={() => onSelectTab(value)}\n >\n {tabLabel}\n </DropdownMenu.Item>\n ))}\n </DropdownMenu.Content>\n </DropdownMenu.Root>\n );\n}\n\n// ---------------------------------------------------------------------------\n// TabsTrigger\n// ---------------------------------------------------------------------------\n\nconst TabsTrigger = forwardRef<HTMLButtonElement, TabsTriggerProps>(\n (\n {\n variant: variantProp,\n size: sizeProp,\n orientation: orientationProp,\n icon,\n badge,\n dismissible = false,\n onDismiss,\n className,\n children,\n value,\n onKeyDown,\n ...props\n },\n ref,\n ) => {\n const ctx = useContext(TabsContext);\n const variant = variantProp ?? ctx.variant;\n const size = sizeProp ?? ctx.size;\n const orientation = orientationProp ?? ctx.orientation;\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLButtonElement>) => {\n // APG dismissible-tab pattern: Delete/Backspace while trigger is focused closes the tab.\n // The visual X is pointer-only (aria-hidden) to avoid nested-interactive HTML violation.\n if (dismissible && (e.key === 'Delete' || e.key === 'Backspace')) {\n e.preventDefault();\n onDismiss?.();\n }\n onKeyDown?.(e);\n };\n\n return (\n <TabsPrimitive.Trigger\n ref={ref}\n value={value}\n data-value={value}\n data-tab-id={value}\n className={tabsTriggerVariants({\n variant,\n size,\n orientation,\n className,\n })}\n onKeyDown={handleKeyDown}\n {...props}\n >\n {icon && (\n <span aria-hidden=\"true\" className=\"ds:shrink-0 ds:size-4\">\n {icon}\n </span>\n )}\n {children}\n {badge && <span className=\"ds:shrink-0\">{badge}</span>}\n {dismissible && (\n // Visual-only dismiss indicator — pointer dismiss fires here; keyboard dismiss fires via Delete/Backspace on the trigger above.\n // No role/tabIndex to avoid nested-interactive (interactive content inside <button> is invalid HTML).\n <span\n aria-hidden=\"true\"\n className={cx(\n 'ds:inline-flex ds:items-center ds:justify-center ds:shrink-0',\n 'ds:size-6 ds:rounded-[var(--radius-sm)]',\n 'ds:hover:bg-muted-foreground/20',\n )}\n onPointerDown={(e) => {\n e.stopPropagation();\n e.preventDefault();\n onDismiss?.();\n }}\n >\n <X className=\"ds:size-3.5\" />\n </span>\n )}\n </TabsPrimitive.Trigger>\n );\n },\n);\nTabsTrigger.displayName = 'TabsTrigger';\n\n// ---------------------------------------------------------------------------\n// TabsContent\n// ---------------------------------------------------------------------------\n\nconst TabsContent = forwardRef<HTMLDivElement, TabsContentProps>(\n ({ className, children, ...props }, ref) => (\n <TabsPrimitive.Content\n ref={ref}\n className={cx(\n 'ds:mt-[var(--spacing-sm)] ds:outline-none',\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid',\n 'ds:focus-visible:outline-ring ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n className,\n )}\n {...props}\n >\n {children}\n </TabsPrimitive.Content>\n ),\n);\nTabsContent.displayName = 'TabsContent';\n\n// ---------------------------------------------------------------------------\n// Compound export\n// ---------------------------------------------------------------------------\n\nexport const Tabs = Object.assign(TabsRoot, {\n Root: TabsRoot,\n List: TabsList,\n Trigger: TabsTrigger,\n Content: TabsContent,\n});\n\nexport { TabsList, TabsTrigger, TabsContent };\n"],"names":["tabsAgent","handle","args","tabsListVariants","cva","tabsTriggerVariants","TabsContext","createContext","TabsRoot","forwardRef","variant","size","orientation","overflow","className","children","valueProp","defaultValue","onValueChange","id","props","ref","rootRef","useRef","composedRef","composeRefs","dir","useDirection","isControlled","internalValue","setInternalValue","useState","value","setValue","useCallback","next","ctxValue","useMemo","valueRef","useEffect","agentHandle","useAgentRegistration","jsx","TabsPrimitive","cx","TabsList","ariaLabel","useContext","t","useTranslation","listRef","rowRef","overflowTabs","setOverflowTabs","isHorizontal","isDropdownOverflow","el","row","tabs","detectOverflow","prev","hidden","tab","start","end","_a","sameOverflowTabs","ro","selectOverflowTab","combinedRef","node","selectOptions","Children","child","isValidElement","triggerValue","labelChild","label","jsxs","Select","OverflowMenu","a","b","index","onSelectTab","DropdownMenu","ChevronDown","tabLabel","disabled","TabsTrigger","variantProp","sizeProp","orientationProp","icon","badge","dismissible","onDismiss","onKeyDown","ctx","handleKeyDown","e","X","TabsContent","Tabs"],"mappings":"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"}
|
|
@@ -15,7 +15,7 @@ import { P as Ot } from "./panel-subview-DCyvn-49.js";
|
|
|
15
15
|
import { R as Pe } from "./radio-BZQs6_36.js";
|
|
16
16
|
import { R as jt } from "./radio-group-ChIKyeSJ.js";
|
|
17
17
|
import { S as Mt } from "./scroll-area-CY5SLYNw.js";
|
|
18
|
-
import { S as Ke } from "./select-
|
|
18
|
+
import { S as Ke } from "./select-uESzXTX6.js";
|
|
19
19
|
import { S as He } from "./skeleton-tTWJpvAq.js";
|
|
20
20
|
import { S as $t } from "./switch-DO6uC4HJ.js";
|
|
21
21
|
import { T as zt } from "./text-area-COMVJ1yE.js";
|
|
@@ -1239,4 +1239,4 @@ export {
|
|
|
1239
1239
|
vn as T,
|
|
1240
1240
|
ln as t
|
|
1241
1241
|
};
|
|
1242
|
-
//# sourceMappingURL=task-editor-
|
|
1242
|
+
//# sourceMappingURL=task-editor-gqWF1jI6.js.map
|