@salt-ds/core 1.60.0 → 1.61.0
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/CHANGELOG.md +38 -0
- package/css/salt-core.css +366 -1
- package/dist-cjs/index.js +16 -0
- package/dist-cjs/index.js.map +1 -1
- package/dist-cjs/navigation-item/NavigationItem.js +2 -0
- package/dist-cjs/navigation-item/NavigationItem.js.map +1 -1
- package/dist-cjs/rating/Rating.css.js +6 -0
- package/dist-cjs/rating/Rating.css.js.map +1 -0
- package/dist-cjs/rating/Rating.js +140 -0
- package/dist-cjs/rating/Rating.js.map +1 -0
- package/dist-cjs/rating/RatingItem.css.js +6 -0
- package/dist-cjs/rating/RatingItem.css.js.map +1 -0
- package/dist-cjs/rating/RatingItem.js +75 -0
- package/dist-cjs/rating/RatingItem.js.map +1 -0
- package/dist-cjs/semantic-icon-provider/SemanticIconProvider.js +22 -20
- package/dist-cjs/semantic-icon-provider/SemanticIconProvider.js.map +1 -1
- package/dist-cjs/tabs/Tab.css.js +6 -0
- package/dist-cjs/tabs/Tab.css.js.map +1 -0
- package/dist-cjs/tabs/Tab.js +211 -0
- package/dist-cjs/tabs/Tab.js.map +1 -0
- package/dist-cjs/tabs/TabAction.js +63 -0
- package/dist-cjs/tabs/TabAction.js.map +1 -0
- package/dist-cjs/tabs/TabBar.css.js +6 -0
- package/dist-cjs/tabs/TabBar.css.js.map +1 -0
- package/dist-cjs/tabs/TabBar.js +45 -0
- package/dist-cjs/tabs/TabBar.js.map +1 -0
- package/dist-cjs/tabs/TabList.css.js +6 -0
- package/dist-cjs/tabs/TabList.css.js.map +1 -0
- package/dist-cjs/tabs/TabList.js +281 -0
- package/dist-cjs/tabs/TabList.js.map +1 -0
- package/dist-cjs/tabs/TabPanel.css.js +6 -0
- package/dist-cjs/tabs/TabPanel.css.js.map +1 -0
- package/dist-cjs/tabs/TabPanel.js +98 -0
- package/dist-cjs/tabs/TabPanel.js.map +1 -0
- package/dist-cjs/tabs/TabTrigger.css.js +6 -0
- package/dist-cjs/tabs/TabTrigger.css.js.map +1 -0
- package/dist-cjs/tabs/TabTrigger.js +188 -0
- package/dist-cjs/tabs/TabTrigger.js.map +1 -0
- package/dist-cjs/tabs/Tabs.css.js +6 -0
- package/dist-cjs/tabs/Tabs.css.js.map +1 -0
- package/dist-cjs/tabs/Tabs.js +200 -0
- package/dist-cjs/tabs/Tabs.js.map +1 -0
- package/dist-cjs/tabs/internal/contexts/TabContext.js +26 -0
- package/dist-cjs/tabs/internal/contexts/TabContext.js.map +1 -0
- package/dist-cjs/tabs/internal/contexts/TabListLayoutContext.js +19 -0
- package/dist-cjs/tabs/internal/contexts/TabListLayoutContext.js.map +1 -0
- package/dist-cjs/tabs/internal/contexts/TabSlotRegistryContext.js +22 -0
- package/dist-cjs/tabs/internal/contexts/TabSlotRegistryContext.js.map +1 -0
- package/dist-cjs/tabs/internal/contexts/TabsContext.js +50 -0
- package/dist-cjs/tabs/internal/contexts/TabsContext.js.map +1 -0
- package/dist-cjs/tabs/internal/hooks/useFocusWithRetry.js +64 -0
- package/dist-cjs/tabs/internal/hooks/useFocusWithRetry.js.map +1 -0
- package/dist-cjs/tabs/internal/hooks/useTabListRecovery.js +76 -0
- package/dist-cjs/tabs/internal/hooks/useTabListRecovery.js.map +1 -0
- package/dist-cjs/tabs/internal/hooks/useTabRemovalHandler.js +165 -0
- package/dist-cjs/tabs/internal/hooks/useTabRemovalHandler.js.map +1 -0
- package/dist-cjs/tabs/internal/hooks/useTabSelectionFocus.js +87 -0
- package/dist-cjs/tabs/internal/hooks/useTabSelectionFocus.js.map +1 -0
- package/dist-cjs/tabs/internal/overflow/TabOverflowList.css.js +6 -0
- package/dist-cjs/tabs/internal/overflow/TabOverflowList.css.js.map +1 -0
- package/dist-cjs/tabs/internal/overflow/TabOverflowList.js +245 -0
- package/dist-cjs/tabs/internal/overflow/TabOverflowList.js.map +1 -0
- package/dist-cjs/tabs/internal/overflow/TabSlot.js +30 -0
- package/dist-cjs/tabs/internal/overflow/TabSlot.js.map +1 -0
- package/dist-cjs/tabs/internal/overflow/overflowMath.js +86 -0
- package/dist-cjs/tabs/internal/overflow/overflowMath.js.map +1 -0
- package/dist-cjs/tabs/internal/overflow/useOverflow.js +273 -0
- package/dist-cjs/tabs/internal/overflow/useOverflow.js.map +1 -0
- package/dist-cjs/tabs/internal/overflow/useOverflowLayoutState.js +99 -0
- package/dist-cjs/tabs/internal/overflow/useOverflowLayoutState.js.map +1 -0
- package/dist-cjs/tabs/internal/overflow/useOverflowSelectionState.js +68 -0
- package/dist-cjs/tabs/internal/overflow/useOverflowSelectionState.js.map +1 -0
- package/dist-cjs/tabs/internal/overflow/useRenderedTabWidth.js +92 -0
- package/dist-cjs/tabs/internal/overflow/useRenderedTabWidth.js.map +1 -0
- package/dist-cjs/tabs/internal/overflow/widthMeasurement.js +42 -0
- package/dist-cjs/tabs/internal/overflow/widthMeasurement.js.map +1 -0
- package/dist-cjs/tabs/internal/registry/useCollection.js +197 -0
- package/dist-cjs/tabs/internal/registry/useCollection.js.map +1 -0
- package/dist-cjs/tabs/internal/registry/useRenderedTabsRegistry.js +206 -0
- package/dist-cjs/tabs/internal/registry/useRenderedTabsRegistry.js.map +1 -0
- package/dist-cjs/tabs/internal/utils/domUtils.js +13 -0
- package/dist-cjs/tabs/internal/utils/domUtils.js.map +1 -0
- package/dist-es/index.js +8 -0
- package/dist-es/index.js.map +1 -1
- package/dist-es/navigation-item/NavigationItem.js +2 -0
- package/dist-es/navigation-item/NavigationItem.js.map +1 -1
- package/dist-es/rating/Rating.css.js +4 -0
- package/dist-es/rating/Rating.css.js.map +1 -0
- package/dist-es/rating/Rating.js +138 -0
- package/dist-es/rating/Rating.js.map +1 -0
- package/dist-es/rating/RatingItem.css.js +4 -0
- package/dist-es/rating/RatingItem.css.js.map +1 -0
- package/dist-es/rating/RatingItem.js +73 -0
- package/dist-es/rating/RatingItem.js.map +1 -0
- package/dist-es/semantic-icon-provider/SemanticIconProvider.js +23 -21
- package/dist-es/semantic-icon-provider/SemanticIconProvider.js.map +1 -1
- package/dist-es/tabs/Tab.css.js +4 -0
- package/dist-es/tabs/Tab.css.js.map +1 -0
- package/dist-es/tabs/Tab.js +209 -0
- package/dist-es/tabs/Tab.js.map +1 -0
- package/dist-es/tabs/TabAction.js +61 -0
- package/dist-es/tabs/TabAction.js.map +1 -0
- package/dist-es/tabs/TabBar.css.js +4 -0
- package/dist-es/tabs/TabBar.css.js.map +1 -0
- package/dist-es/tabs/TabBar.js +43 -0
- package/dist-es/tabs/TabBar.js.map +1 -0
- package/dist-es/tabs/TabList.css.js +4 -0
- package/dist-es/tabs/TabList.css.js.map +1 -0
- package/dist-es/tabs/TabList.js +279 -0
- package/dist-es/tabs/TabList.js.map +1 -0
- package/dist-es/tabs/TabPanel.css.js +4 -0
- package/dist-es/tabs/TabPanel.css.js.map +1 -0
- package/dist-es/tabs/TabPanel.js +96 -0
- package/dist-es/tabs/TabPanel.js.map +1 -0
- package/dist-es/tabs/TabTrigger.css.js +4 -0
- package/dist-es/tabs/TabTrigger.css.js.map +1 -0
- package/dist-es/tabs/TabTrigger.js +186 -0
- package/dist-es/tabs/TabTrigger.js.map +1 -0
- package/dist-es/tabs/Tabs.css.js +4 -0
- package/dist-es/tabs/Tabs.css.js.map +1 -0
- package/dist-es/tabs/Tabs.js +198 -0
- package/dist-es/tabs/Tabs.js.map +1 -0
- package/dist-es/tabs/internal/contexts/TabContext.js +23 -0
- package/dist-es/tabs/internal/contexts/TabContext.js.map +1 -0
- package/dist-es/tabs/internal/contexts/TabListLayoutContext.js +16 -0
- package/dist-es/tabs/internal/contexts/TabListLayoutContext.js.map +1 -0
- package/dist-es/tabs/internal/contexts/TabSlotRegistryContext.js +19 -0
- package/dist-es/tabs/internal/contexts/TabSlotRegistryContext.js.map +1 -0
- package/dist-es/tabs/internal/contexts/TabsContext.js +47 -0
- package/dist-es/tabs/internal/contexts/TabsContext.js.map +1 -0
- package/dist-es/tabs/internal/hooks/useFocusWithRetry.js +62 -0
- package/dist-es/tabs/internal/hooks/useFocusWithRetry.js.map +1 -0
- package/dist-es/tabs/internal/hooks/useTabListRecovery.js +74 -0
- package/dist-es/tabs/internal/hooks/useTabListRecovery.js.map +1 -0
- package/dist-es/tabs/internal/hooks/useTabRemovalHandler.js +163 -0
- package/dist-es/tabs/internal/hooks/useTabRemovalHandler.js.map +1 -0
- package/dist-es/tabs/internal/hooks/useTabSelectionFocus.js +85 -0
- package/dist-es/tabs/internal/hooks/useTabSelectionFocus.js.map +1 -0
- package/dist-es/tabs/internal/overflow/TabOverflowList.css.js +4 -0
- package/dist-es/tabs/internal/overflow/TabOverflowList.css.js.map +1 -0
- package/dist-es/tabs/internal/overflow/TabOverflowList.js +243 -0
- package/dist-es/tabs/internal/overflow/TabOverflowList.js.map +1 -0
- package/dist-es/tabs/internal/overflow/TabSlot.js +28 -0
- package/dist-es/tabs/internal/overflow/TabSlot.js.map +1 -0
- package/dist-es/tabs/internal/overflow/overflowMath.js +82 -0
- package/dist-es/tabs/internal/overflow/overflowMath.js.map +1 -0
- package/dist-es/tabs/internal/overflow/useOverflow.js +271 -0
- package/dist-es/tabs/internal/overflow/useOverflow.js.map +1 -0
- package/dist-es/tabs/internal/overflow/useOverflowLayoutState.js +97 -0
- package/dist-es/tabs/internal/overflow/useOverflowLayoutState.js.map +1 -0
- package/dist-es/tabs/internal/overflow/useOverflowSelectionState.js +66 -0
- package/dist-es/tabs/internal/overflow/useOverflowSelectionState.js.map +1 -0
- package/dist-es/tabs/internal/overflow/useRenderedTabWidth.js +90 -0
- package/dist-es/tabs/internal/overflow/useRenderedTabWidth.js.map +1 -0
- package/dist-es/tabs/internal/overflow/widthMeasurement.js +36 -0
- package/dist-es/tabs/internal/overflow/widthMeasurement.js.map +1 -0
- package/dist-es/tabs/internal/registry/useCollection.js +195 -0
- package/dist-es/tabs/internal/registry/useCollection.js.map +1 -0
- package/dist-es/tabs/internal/registry/useRenderedTabsRegistry.js +204 -0
- package/dist-es/tabs/internal/registry/useRenderedTabsRegistry.js.map +1 -0
- package/dist-es/tabs/internal/utils/domUtils.js +11 -0
- package/dist-es/tabs/internal/utils/domUtils.js.map +1 -0
- package/dist-types/index.d.ts +2 -0
- package/dist-types/rating/Rating.d.ts +48 -0
- package/dist-types/rating/RatingItem.d.ts +47 -0
- package/dist-types/rating/index.d.ts +1 -0
- package/dist-types/semantic-icon-provider/SemanticIconProvider.d.ts +21 -19
- package/dist-types/tabs/Tab.d.ts +12 -0
- package/dist-types/tabs/TabAction.d.ts +4 -0
- package/dist-types/tabs/TabBar.d.ts +12 -0
- package/dist-types/tabs/TabList.d.ts +12 -0
- package/dist-types/tabs/TabPanel.d.ts +9 -0
- package/dist-types/tabs/TabTrigger.d.ts +4 -0
- package/dist-types/tabs/Tabs.d.ts +20 -0
- package/dist-types/tabs/index.d.ts +7 -0
- package/dist-types/tabs/internal/contexts/TabContext.d.ts +12 -0
- package/dist-types/tabs/internal/contexts/TabListLayoutContext.d.ts +9 -0
- package/dist-types/tabs/internal/contexts/TabSlotRegistryContext.d.ts +5 -0
- package/dist-types/tabs/internal/contexts/TabsContext.d.ts +43 -0
- package/dist-types/tabs/internal/hooks/useFocusWithRetry.d.ts +9 -0
- package/dist-types/tabs/internal/hooks/useTabListRecovery.d.ts +12 -0
- package/dist-types/tabs/internal/hooks/useTabRemovalHandler.d.ts +32 -0
- package/dist-types/tabs/internal/hooks/useTabSelectionFocus.d.ts +15 -0
- package/dist-types/tabs/internal/overflow/TabOverflowList.d.ts +10 -0
- package/dist-types/tabs/internal/overflow/TabSlot.d.ts +6 -0
- package/dist-types/tabs/internal/overflow/overflowMath.d.ts +18 -0
- package/dist-types/tabs/internal/overflow/useOverflow.d.ts +11 -0
- package/dist-types/tabs/internal/overflow/useOverflowLayoutState.d.ts +13 -0
- package/dist-types/tabs/internal/overflow/useOverflowSelectionState.d.ts +13 -0
- package/dist-types/tabs/internal/overflow/useRenderedTabWidth.d.ts +12 -0
- package/dist-types/tabs/internal/overflow/widthMeasurement.d.ts +5 -0
- package/dist-types/tabs/internal/registry/useCollection.d.ts +30 -0
- package/dist-types/tabs/internal/registry/useRenderedTabsRegistry.d.ts +12 -0
- package/dist-types/tabs/internal/utils/domUtils.d.ts +1 -0
- package/package.json +3 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TabTrigger.js","sources":["../src/tabs/TabTrigger.tsx"],"sourcesContent":["import { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { clsx } from \"clsx\";\nimport {\n type ComponentPropsWithoutRef,\n type FocusEvent,\n forwardRef,\n type KeyboardEvent,\n type MouseEvent,\n useRef,\n} from \"react\";\nimport { makePrefixer, useForkRef, useIsomorphicLayoutEffect } from \"../utils\";\nimport { useTab } from \"./internal/contexts/TabContext\";\nimport { useTabListLayout } from \"./internal/contexts/TabListLayoutContext\";\nimport { useTabs } from \"./internal/contexts/TabsContext\";\nimport tabTriggerCss from \"./TabTrigger.css\";\n\nexport interface TabTriggerProps\n extends Omit<ComponentPropsWithoutRef<\"button\">, \"id\"> {}\n\nconst withBaseName = makePrefixer(\"saltTabTrigger\");\n\nfunction getAriaDescription(count: number) {\n if (count < 1) {\n return undefined;\n }\n\n if (count === 1) {\n return \"1 action available\";\n }\n\n return `${count} actions available`;\n}\n\nconst ariaActionSupported =\n typeof HTMLElement !== \"undefined\" && \"ariaActions\" in HTMLElement.prototype;\n\nexport const TabTrigger = forwardRef<HTMLButtonElement, TabTriggerProps>(\n function TabTrigger(props, ref) {\n const { children, className, onClick, onKeyDown, onFocus, ...rest } = props;\n\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-tab-trigger\",\n css: tabTriggerCss,\n window: targetWindow,\n });\n\n const {\n setSelected,\n registerTab,\n updateTab,\n updateRenderedTab,\n getRenderedTabOrder,\n getPanelId,\n getTabId,\n selected: selectedValue,\n activeTab,\n menuOpen,\n setMenuOpen,\n } = useTabs();\n const { selected, value, focused, disabled, tabId, actions } = useTab();\n const tabListLayout = useTabListLayout();\n\n const tabRef = useRef<HTMLButtonElement>(null);\n\n const location = tabListLayout?.getLocation(value) ?? \"main\";\n const selectionSource = location === \"overflow\" ? \"overflow\" : \"main\";\n const hidden = location === \"hidden\";\n const overflowOpen = location === \"overflow\" && menuOpen;\n const renderOrder = getRenderedTabOrder(value);\n const order = renderOrder >= 0 ? renderOrder : undefined;\n const initialLocationRef = useRef(location);\n const initialOrderRef = useRef(order);\n\n const id = tabId;\n\n useIsomorphicLayoutEffect(() => {\n if (id && tabRef.current) {\n const item = {\n id,\n value,\n element: tabRef.current,\n location: initialLocationRef.current,\n order: initialOrderRef.current,\n };\n\n return registerTab(item);\n }\n }, [id, registerTab, value]);\n\n useIsomorphicLayoutEffect(() => {\n if (!id) {\n return;\n }\n\n updateTab(id, {\n element: tabRef.current,\n location,\n order,\n });\n }, [id, location, order, updateTab]);\n\n useIsomorphicLayoutEffect(() => {\n updateRenderedTab(value, {\n trigger: tabRef.current,\n });\n }, [updateRenderedTab, value]);\n\n useIsomorphicLayoutEffect(() => {\n if (!overflowOpen || tabListLayout?.overflowActiveValue !== value) {\n return;\n }\n\n tabRef.current?.focus({ preventScroll: true });\n }, [overflowOpen, tabListLayout?.overflowActiveValue, value]);\n\n const handleClick = (event: MouseEvent<HTMLButtonElement>) => {\n onClick?.(event);\n\n setSelected(event, value, selectionSource);\n };\n\n const handleKeyDown = (event: KeyboardEvent<HTMLButtonElement>) => {\n onKeyDown?.(event);\n\n if (location === \"overflow\" && event.key === \"Tab\" && event.shiftKey) {\n event.preventDefault();\n setMenuOpen(false);\n\n const doc = event.currentTarget.ownerDocument;\n const overflowTrigger = doc.querySelector<HTMLElement>(\n \"[data-overflowbutton]\",\n );\n const scheduleFocus = targetWindow?.requestAnimationFrame;\n\n if (scheduleFocus) {\n scheduleFocus(() => overflowTrigger?.focus({ preventScroll: true }));\n } else {\n queueMicrotask(() => overflowTrigger?.focus({ preventScroll: true }));\n }\n\n return;\n }\n\n if (\n location === \"overflow\" &&\n tabListLayout &&\n (event.key === \"ArrowDown\" ||\n event.key === \"ArrowUp\" ||\n event.key === \"Home\" ||\n event.key === \"End\")\n ) {\n const moved = tabListLayout.moveOverflowFocus(event.key, value);\n if (moved) {\n event.preventDefault();\n return;\n }\n }\n\n if (disabled) {\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n }\n return;\n }\n\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n setSelected(event, value, selectionSource);\n }\n };\n\n const handleFocus = (event: FocusEvent<HTMLButtonElement>) => {\n onFocus?.(event);\n\n if (id) {\n activeTab.current = { value, id };\n }\n\n if (location === \"overflow\") {\n tabListLayout?.setOverflowActiveValue(value);\n }\n\n // Ensures the associated tab is in view.\n event.currentTarget.parentElement?.scrollIntoView({\n block: \"nearest\",\n inline: \"nearest\",\n });\n };\n\n const handleRef = useForkRef<HTMLButtonElement>(tabRef, ref);\n const panelId = getPanelId(value);\n\n // Applying aria-actions this way avoids React warnings about unknown props\n const ariaActionsProps = ariaActionSupported\n ? {\n \"aria-actions\": clsx(actions) || undefined,\n }\n : {};\n\n const active =\n location === \"overflow\" && tabListLayout?.overflowActiveValue === value;\n const hasSelectedTab =\n selectedValue !== undefined && getTabId(selectedValue) != null;\n const fallbackTabStop =\n !hasSelectedTab && location === \"main\" && order === 0;\n const isTabStop =\n !hidden && (focused || selected || active || fallbackTabStop);\n const shouldHandleKeyDown = location === \"overflow\" || !disabled;\n\n return (\n <button\n aria-selected={selected}\n aria-disabled={disabled}\n aria-controls={panelId}\n {...ariaActionsProps}\n aria-description={getAriaDescription(actions.length)}\n tabIndex={isTabStop ? 0 : -1}\n role=\"tab\"\n type=\"button\"\n onClick={!disabled ? handleClick : undefined}\n onKeyDown={shouldHandleKeyDown ? handleKeyDown : undefined}\n onFocus={handleFocus}\n className={clsx(withBaseName(), className)}\n id={id}\n ref={handleRef}\n data-value={value}\n {...rest}\n >\n {children}\n </button>\n );\n },\n);\n"],"names":["makePrefixer","forwardRef","TabTrigger","useWindow","useComponentCssInjection","tabTriggerCss","useTabs","useTab","useTabListLayout","useRef","useIsomorphicLayoutEffect","useForkRef","clsx","jsx"],"mappings":";;;;;;;;;;;;;;;;;;;AAoBA,MAAM,YAAA,GAAeA,0BAAa,gBAAgB,CAAA;AAElD,SAAS,mBAAmB,KAAA,EAAe;AACzC,EAAA,IAAI,QAAQ,CAAA,EAAG;AACb,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,IAAI,UAAU,CAAA,EAAG;AACf,IAAA,OAAO,oBAAA;AAAA,EACT;AAEA,EAAA,OAAO,GAAG,KAAK,CAAA,kBAAA,CAAA;AACjB;AAEA,MAAM,mBAAA,GACJ,OAAO,WAAA,KAAgB,WAAA,IAAe,iBAAiB,WAAA,CAAY,SAAA;AAE9D,MAAM,UAAA,GAAaC,gBAAA;AAAA,EACxB,SAASC,WAAAA,CAAW,KAAA,EAAO,GAAA,EAAK;AAC9B,IAAA,MAAM,EAAE,UAAU,SAAA,EAAW,OAAA,EAAS,WAAW,OAAA,EAAS,GAAG,MAAK,GAAI,KAAA;AAEtE,IAAA,MAAM,eAAeC,gBAAA,EAAU;AAC/B,IAAAC,+BAAA,CAAyB;AAAA,MACvB,MAAA,EAAQ,kBAAA;AAAA,MACR,GAAA,EAAKC,YAAA;AAAA,MACL,MAAA,EAAQ;AAAA,KACT,CAAA;AAED,IAAA,MAAM;AAAA,MACJ,WAAA;AAAA,MACA,WAAA;AAAA,MACA,SAAA;AAAA,MACA,iBAAA;AAAA,MACA,mBAAA;AAAA,MACA,UAAA;AAAA,MACA,QAAA;AAAA,MACA,QAAA,EAAU,aAAA;AAAA,MACV,SAAA;AAAA,MACA,QAAA;AAAA,MACA;AAAA,QACEC,mBAAA,EAAQ;AACZ,IAAA,MAAM,EAAE,UAAU,KAAA,EAAO,OAAA,EAAS,UAAU,KAAA,EAAO,OAAA,KAAYC,iBAAA,EAAO;AACtE,IAAA,MAAM,gBAAgBC,qCAAA,EAAiB;AAEvC,IAAA,MAAM,MAAA,GAASC,aAA0B,IAAI,CAAA;AAE7C,IAAA,MAAM,QAAA,GAAA,CAAW,aAAA,IAAA,IAAA,GAAA,MAAA,GAAA,aAAA,CAAe,WAAA,CAAY,KAAA,CAAA,KAAU,MAAA;AACtD,IAAA,MAAM,eAAA,GAAkB,QAAA,KAAa,UAAA,GAAa,UAAA,GAAa,MAAA;AAC/D,IAAA,MAAM,SAAS,QAAA,KAAa,QAAA;AAC5B,IAAA,MAAM,YAAA,GAAe,aAAa,UAAA,IAAc,QAAA;AAChD,IAAA,MAAM,WAAA,GAAc,oBAAoB,KAAK,CAAA;AAC7C,IAAA,MAAM,KAAA,GAAQ,WAAA,IAAe,CAAA,GAAI,WAAA,GAAc,MAAA;AAC/C,IAAA,MAAM,kBAAA,GAAqBA,aAAO,QAAQ,CAAA;AAC1C,IAAA,MAAM,eAAA,GAAkBA,aAAO,KAAK,CAAA;AAEpC,IAAA,MAAM,EAAA,GAAK,KAAA;AAEX,IAAAC,mDAAA,CAA0B,MAAM;AAC9B,MAAA,IAAI,EAAA,IAAM,OAAO,OAAA,EAAS;AACxB,QAAA,MAAM,IAAA,GAAO;AAAA,UACX,EAAA;AAAA,UACA,KAAA;AAAA,UACA,SAAS,MAAA,CAAO,OAAA;AAAA,UAChB,UAAU,kBAAA,CAAmB,OAAA;AAAA,UAC7B,OAAO,eAAA,CAAgB;AAAA,SACzB;AAEA,QAAA,OAAO,YAAY,IAAI,CAAA;AAAA,MACzB;AAAA,IACF,CAAA,EAAG,CAAC,EAAA,EAAI,WAAA,EAAa,KAAK,CAAC,CAAA;AAE3B,IAAAA,mDAAA,CAA0B,MAAM;AAC9B,MAAA,IAAI,CAAC,EAAA,EAAI;AACP,QAAA;AAAA,MACF;AAEA,MAAA,SAAA,CAAU,EAAA,EAAI;AAAA,QACZ,SAAS,MAAA,CAAO,OAAA;AAAA,QAChB,QAAA;AAAA,QACA;AAAA,OACD,CAAA;AAAA,IACH,GAAG,CAAC,EAAA,EAAI,QAAA,EAAU,KAAA,EAAO,SAAS,CAAC,CAAA;AAEnC,IAAAA,mDAAA,CAA0B,MAAM;AAC9B,MAAA,iBAAA,CAAkB,KAAA,EAAO;AAAA,QACvB,SAAS,MAAA,CAAO;AAAA,OACjB,CAAA;AAAA,IACH,CAAA,EAAG,CAAC,iBAAA,EAAmB,KAAK,CAAC,CAAA;AAE7B,IAAAA,mDAAA,CAA0B,MAAM;AA7GpC,MAAA,IAAA,EAAA;AA8GM,MAAA,IAAI,CAAC,YAAA,IAAA,CAAgB,aAAA,IAAA,IAAA,GAAA,MAAA,GAAA,aAAA,CAAe,mBAAA,MAAwB,KAAA,EAAO;AACjE,QAAA;AAAA,MACF;AAEA,MAAA,CAAA,EAAA,GAAA,MAAA,CAAO,OAAA,KAAP,IAAA,GAAA,MAAA,GAAA,EAAA,CAAgB,KAAA,CAAM,EAAE,eAAe,IAAA,EAAK,CAAA;AAAA,IAC9C,GAAG,CAAC,YAAA,EAAc,aAAA,IAAA,IAAA,GAAA,MAAA,GAAA,aAAA,CAAe,mBAAA,EAAqB,KAAK,CAAC,CAAA;AAE5D,IAAA,MAAM,WAAA,GAAc,CAAC,KAAA,KAAyC;AAC5D,MAAA,OAAA,IAAA,IAAA,GAAA,MAAA,GAAA,OAAA,CAAU,KAAA,CAAA;AAEV,MAAA,WAAA,CAAY,KAAA,EAAO,OAAO,eAAe,CAAA;AAAA,IAC3C,CAAA;AAEA,IAAA,MAAM,aAAA,GAAgB,CAAC,KAAA,KAA4C;AACjE,MAAA,SAAA,IAAA,IAAA,GAAA,MAAA,GAAA,SAAA,CAAY,KAAA,CAAA;AAEZ,MAAA,IAAI,aAAa,UAAA,IAAc,KAAA,CAAM,GAAA,KAAQ,KAAA,IAAS,MAAM,QAAA,EAAU;AACpE,QAAA,KAAA,CAAM,cAAA,EAAe;AACrB,QAAA,WAAA,CAAY,KAAK,CAAA;AAEjB,QAAA,MAAM,GAAA,GAAM,MAAM,aAAA,CAAc,aAAA;AAChC,QAAA,MAAM,kBAAkB,GAAA,CAAI,aAAA;AAAA,UAC1B;AAAA,SACF;AACA,QAAA,MAAM,gBAAgB,YAAA,IAAA,IAAA,GAAA,MAAA,GAAA,YAAA,CAAc,qBAAA;AAEpC,QAAA,IAAI,aAAA,EAAe;AACjB,UAAA,aAAA,CAAc,MAAM,eAAA,IAAA,IAAA,GAAA,MAAA,GAAA,eAAA,CAAiB,KAAA,CAAM,EAAE,aAAA,EAAe,MAAK,CAAE,CAAA;AAAA,QACrE,CAAA,MAAO;AACL,UAAA,cAAA,CAAe,MAAM,eAAA,IAAA,IAAA,GAAA,MAAA,GAAA,eAAA,CAAiB,KAAA,CAAM,EAAE,aAAA,EAAe,MAAK,CAAE,CAAA;AAAA,QACtE;AAEA,QAAA;AAAA,MACF;AAEA,MAAA,IACE,QAAA,KAAa,UAAA,IACb,aAAA,KACC,KAAA,CAAM,QAAQ,WAAA,IACb,KAAA,CAAM,GAAA,KAAQ,SAAA,IACd,KAAA,CAAM,GAAA,KAAQ,MAAA,IACd,KAAA,CAAM,QAAQ,KAAA,CAAA,EAChB;AACA,QAAA,MAAM,KAAA,GAAQ,aAAA,CAAc,iBAAA,CAAkB,KAAA,CAAM,KAAK,KAAK,CAAA;AAC9D,QAAA,IAAI,KAAA,EAAO;AACT,UAAA,KAAA,CAAM,cAAA,EAAe;AACrB,UAAA;AAAA,QACF;AAAA,MACF;AAEA,MAAA,IAAI,QAAA,EAAU;AACZ,QAAA,IAAI,KAAA,CAAM,GAAA,KAAQ,OAAA,IAAW,KAAA,CAAM,QAAQ,GAAA,EAAK;AAC9C,UAAA,KAAA,CAAM,cAAA,EAAe;AAAA,QACvB;AACA,QAAA;AAAA,MACF;AAEA,MAAA,IAAI,KAAA,CAAM,GAAA,KAAQ,OAAA,IAAW,KAAA,CAAM,QAAQ,GAAA,EAAK;AAC9C,QAAA,KAAA,CAAM,cAAA,EAAe;AACrB,QAAA,WAAA,CAAY,KAAA,EAAO,OAAO,eAAe,CAAA;AAAA,MAC3C;AAAA,IACF,CAAA;AAEA,IAAA,MAAM,WAAA,GAAc,CAAC,KAAA,KAAyC;AA7KlE,MAAA,IAAA,EAAA;AA8KM,MAAA,OAAA,IAAA,IAAA,GAAA,MAAA,GAAA,OAAA,CAAU,KAAA,CAAA;AAEV,MAAA,IAAI,EAAA,EAAI;AACN,QAAA,SAAA,CAAU,OAAA,GAAU,EAAE,KAAA,EAAO,EAAA,EAAG;AAAA,MAClC;AAEA,MAAA,IAAI,aAAa,UAAA,EAAY;AAC3B,QAAA,aAAA,IAAA,IAAA,GAAA,MAAA,GAAA,aAAA,CAAe,sBAAA,CAAuB,KAAA,CAAA;AAAA,MACxC;AAGA,MAAA,CAAA,EAAA,GAAA,KAAA,CAAM,aAAA,CAAc,aAAA,KAApB,IAAA,GAAA,MAAA,GAAA,EAAA,CAAmC,cAAA,CAAe;AAAA,QAChD,KAAA,EAAO,SAAA;AAAA,QACP,MAAA,EAAQ;AAAA,OACV,CAAA;AAAA,IACF,CAAA;AAEA,IAAA,MAAM,SAAA,GAAYC,qBAAA,CAA8B,MAAA,EAAQ,GAAG,CAAA;AAC3D,IAAA,MAAM,OAAA,GAAU,WAAW,KAAK,CAAA;AAGhC,IAAA,MAAM,mBAAmB,mBAAA,GACrB;AAAA,MACE,cAAA,EAAgBC,SAAA,CAAK,OAAO,CAAA,IAAK;AAAA,QAEnC,EAAC;AAEL,IAAA,MAAM,MAAA,GACJ,QAAA,KAAa,UAAA,IAAA,CAAc,aAAA,IAAA,IAAA,GAAA,MAAA,GAAA,aAAA,CAAe,mBAAA,MAAwB,KAAA;AACpE,IAAA,MAAM,cAAA,GACJ,aAAA,KAAkB,MAAA,IAAa,QAAA,CAAS,aAAa,CAAA,IAAK,IAAA;AAC5D,IAAA,MAAM,eAAA,GACJ,CAAC,cAAA,IAAkB,QAAA,KAAa,UAAU,KAAA,KAAU,CAAA;AACtD,IAAA,MAAM,SAAA,GACJ,CAAC,MAAA,KAAW,OAAA,IAAW,YAAY,MAAA,IAAU,eAAA,CAAA;AAC/C,IAAA,MAAM,mBAAA,GAAsB,QAAA,KAAa,UAAA,IAAc,CAAC,QAAA;AAExD,IAAA,uBACEC,cAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,eAAA,EAAe,QAAA;AAAA,QACf,eAAA,EAAe,QAAA;AAAA,QACf,eAAA,EAAe,OAAA;AAAA,QACd,GAAG,gBAAA;AAAA,QACJ,kBAAA,EAAkB,kBAAA,CAAmB,OAAA,CAAQ,MAAM,CAAA;AAAA,QACnD,QAAA,EAAU,YAAY,CAAA,GAAI,EAAA;AAAA,QAC1B,IAAA,EAAK,KAAA;AAAA,QACL,IAAA,EAAK,QAAA;AAAA,QACL,OAAA,EAAS,CAAC,QAAA,GAAW,WAAA,GAAc,MAAA;AAAA,QACnC,SAAA,EAAW,sBAAsB,aAAA,GAAgB,MAAA;AAAA,QACjD,OAAA,EAAS,WAAA;AAAA,QACT,SAAA,EAAWD,SAAA,CAAK,YAAA,EAAa,EAAG,SAAS,CAAA;AAAA,QACzC,EAAA;AAAA,QACA,GAAA,EAAK,SAAA;AAAA,QACL,YAAA,EAAY,KAAA;AAAA,QACX,GAAG,IAAA;AAAA,QAEH;AAAA;AAAA,KACH;AAAA,EAEJ;AACF;;;;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Tabs.css.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;"}
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
+
var styles = require('@salt-ds/styles');
|
|
5
|
+
var window = require('@salt-ds/window');
|
|
6
|
+
var clsx = require('clsx');
|
|
7
|
+
var React = require('react');
|
|
8
|
+
var makePrefixer = require('../utils/makePrefixer.js');
|
|
9
|
+
var useControlled = require('../utils/useControlled.js');
|
|
10
|
+
require('../utils/useFloatingUI/useFloatingUI.js');
|
|
11
|
+
require('../utils/useId.js');
|
|
12
|
+
require('../salt-provider/SaltProvider.js');
|
|
13
|
+
require('../viewport/ViewportProvider.js');
|
|
14
|
+
var TabsContext = require('./internal/contexts/TabsContext.js');
|
|
15
|
+
var useOverflowSelectionState = require('./internal/overflow/useOverflowSelectionState.js');
|
|
16
|
+
var useCollection = require('./internal/registry/useCollection.js');
|
|
17
|
+
var useRenderedTabsRegistry = require('./internal/registry/useRenderedTabsRegistry.js');
|
|
18
|
+
var Tabs$1 = require('./Tabs.css.js');
|
|
19
|
+
|
|
20
|
+
const withBaseName = makePrefixer.makePrefixer("saltTabs");
|
|
21
|
+
function setValueIdMapEntry(map, value, id) {
|
|
22
|
+
if (map.get(value) === id) {
|
|
23
|
+
return map;
|
|
24
|
+
}
|
|
25
|
+
const next = new Map(map);
|
|
26
|
+
next.set(value, id);
|
|
27
|
+
return next;
|
|
28
|
+
}
|
|
29
|
+
function removeValueIdMapEntry(map, value, id) {
|
|
30
|
+
if (map.get(value) !== id) {
|
|
31
|
+
return map;
|
|
32
|
+
}
|
|
33
|
+
const next = new Map(map);
|
|
34
|
+
next.delete(value);
|
|
35
|
+
return next;
|
|
36
|
+
}
|
|
37
|
+
const Tabs = React.forwardRef(
|
|
38
|
+
function Tabs2(props, ref) {
|
|
39
|
+
const { className, children, value, defaultValue, onChange, ...rest } = props;
|
|
40
|
+
const targetWindow = window.useWindow();
|
|
41
|
+
styles.useComponentCssInjection({
|
|
42
|
+
testId: "salt-tabs",
|
|
43
|
+
css: Tabs$1,
|
|
44
|
+
window: targetWindow
|
|
45
|
+
});
|
|
46
|
+
const [valueToTabIdMap, setValueToIdMap] = React.useState(
|
|
47
|
+
() => /* @__PURE__ */ new Map()
|
|
48
|
+
);
|
|
49
|
+
const [valueToPanelIdMap, setValueToPanelIdMap] = React.useState(
|
|
50
|
+
() => /* @__PURE__ */ new Map()
|
|
51
|
+
);
|
|
52
|
+
const {
|
|
53
|
+
renderMode,
|
|
54
|
+
registerBootstrapTab,
|
|
55
|
+
setBootstrapTabReady,
|
|
56
|
+
setBootstrapOverflowReady,
|
|
57
|
+
registerRenderedTab,
|
|
58
|
+
updateRenderedTab,
|
|
59
|
+
getRenderedTab,
|
|
60
|
+
getRenderedTabOrder,
|
|
61
|
+
renderedTabs
|
|
62
|
+
} = useRenderedTabsRegistry.useRenderedTabsRegistry();
|
|
63
|
+
const {
|
|
64
|
+
registerItem,
|
|
65
|
+
updateItem,
|
|
66
|
+
item,
|
|
67
|
+
getNext,
|
|
68
|
+
getPrevious,
|
|
69
|
+
getFirst,
|
|
70
|
+
getLast,
|
|
71
|
+
itemAt,
|
|
72
|
+
getIndex,
|
|
73
|
+
sortItems,
|
|
74
|
+
removalVersion,
|
|
75
|
+
getRemovedItems
|
|
76
|
+
} = useCollection.useCollection({ targetWindow, wrap: true });
|
|
77
|
+
const activeTab = React.useRef();
|
|
78
|
+
const [menuOpen, setMenuOpen] = React.useState(false);
|
|
79
|
+
const [selected, setSelectedState] = useControlled.useControlled({
|
|
80
|
+
controlled: value,
|
|
81
|
+
default: defaultValue,
|
|
82
|
+
name: "Tabs",
|
|
83
|
+
state: "selected"
|
|
84
|
+
});
|
|
85
|
+
const commitSelection = React.useCallback(
|
|
86
|
+
(event, newValue) => {
|
|
87
|
+
setSelectedState(newValue);
|
|
88
|
+
if (selected !== newValue) {
|
|
89
|
+
onChange == null ? void 0 : onChange(event, newValue);
|
|
90
|
+
}
|
|
91
|
+
},
|
|
92
|
+
[onChange, selected]
|
|
93
|
+
);
|
|
94
|
+
const { selectionFromOverflowValueRef, setSelected } = useOverflowSelectionState.useOverflowSelectionState({
|
|
95
|
+
commitSelection,
|
|
96
|
+
menuOpen,
|
|
97
|
+
selected,
|
|
98
|
+
setMenuOpen
|
|
99
|
+
});
|
|
100
|
+
const registerTab = React.useCallback(
|
|
101
|
+
(tab) => {
|
|
102
|
+
const cleanup = registerItem(tab);
|
|
103
|
+
setValueToIdMap((map) => setValueIdMapEntry(map, tab.value, tab.id));
|
|
104
|
+
return () => {
|
|
105
|
+
cleanup();
|
|
106
|
+
setValueToIdMap(
|
|
107
|
+
(map) => removeValueIdMapEntry(map, tab.value, tab.id)
|
|
108
|
+
);
|
|
109
|
+
};
|
|
110
|
+
},
|
|
111
|
+
[registerItem]
|
|
112
|
+
);
|
|
113
|
+
const registerPanel = React.useCallback((id, value2) => {
|
|
114
|
+
setValueToPanelIdMap((map) => setValueIdMapEntry(map, value2, id));
|
|
115
|
+
return () => {
|
|
116
|
+
setValueToPanelIdMap((map) => removeValueIdMapEntry(map, value2, id));
|
|
117
|
+
};
|
|
118
|
+
}, []);
|
|
119
|
+
const getPanelId = React.useCallback(
|
|
120
|
+
(value2) => {
|
|
121
|
+
return valueToPanelIdMap.get(value2);
|
|
122
|
+
},
|
|
123
|
+
[valueToPanelIdMap]
|
|
124
|
+
);
|
|
125
|
+
const getTabId = React.useCallback(
|
|
126
|
+
(value2) => {
|
|
127
|
+
return valueToTabIdMap.get(value2);
|
|
128
|
+
},
|
|
129
|
+
[valueToTabIdMap]
|
|
130
|
+
);
|
|
131
|
+
const context = React.useMemo(
|
|
132
|
+
() => ({
|
|
133
|
+
renderMode,
|
|
134
|
+
registerBootstrapTab,
|
|
135
|
+
setBootstrapTabReady,
|
|
136
|
+
setBootstrapOverflowReady,
|
|
137
|
+
registerTab,
|
|
138
|
+
updateTab: updateItem,
|
|
139
|
+
registerRenderedTab,
|
|
140
|
+
updateRenderedTab,
|
|
141
|
+
getRenderedTab,
|
|
142
|
+
getRenderedTabOrder,
|
|
143
|
+
renderedTabs,
|
|
144
|
+
registerPanel,
|
|
145
|
+
getPanelId,
|
|
146
|
+
getTabId,
|
|
147
|
+
selected,
|
|
148
|
+
setSelected,
|
|
149
|
+
item,
|
|
150
|
+
getNext,
|
|
151
|
+
getPrevious,
|
|
152
|
+
getFirst,
|
|
153
|
+
getLast,
|
|
154
|
+
activeTab,
|
|
155
|
+
selectionFromOverflowValueRef,
|
|
156
|
+
menuOpen,
|
|
157
|
+
setMenuOpen,
|
|
158
|
+
itemAt,
|
|
159
|
+
getIndex,
|
|
160
|
+
sortItems,
|
|
161
|
+
removalVersion,
|
|
162
|
+
getRemovedItems
|
|
163
|
+
}),
|
|
164
|
+
[
|
|
165
|
+
renderMode,
|
|
166
|
+
registerBootstrapTab,
|
|
167
|
+
setBootstrapTabReady,
|
|
168
|
+
setBootstrapOverflowReady,
|
|
169
|
+
registerPanel,
|
|
170
|
+
registerTab,
|
|
171
|
+
updateItem,
|
|
172
|
+
registerRenderedTab,
|
|
173
|
+
updateRenderedTab,
|
|
174
|
+
getRenderedTab,
|
|
175
|
+
getRenderedTabOrder,
|
|
176
|
+
renderedTabs,
|
|
177
|
+
getPanelId,
|
|
178
|
+
getTabId,
|
|
179
|
+
selected,
|
|
180
|
+
setSelected,
|
|
181
|
+
item,
|
|
182
|
+
getNext,
|
|
183
|
+
getPrevious,
|
|
184
|
+
getFirst,
|
|
185
|
+
getLast,
|
|
186
|
+
menuOpen,
|
|
187
|
+
itemAt,
|
|
188
|
+
getIndex,
|
|
189
|
+
sortItems,
|
|
190
|
+
removalVersion,
|
|
191
|
+
getRemovedItems,
|
|
192
|
+
selectionFromOverflowValueRef
|
|
193
|
+
]
|
|
194
|
+
);
|
|
195
|
+
return /* @__PURE__ */ jsxRuntime.jsx(TabsContext.TabsContext.Provider, { value: context, children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: clsx.clsx(withBaseName(), className), ref, ...rest, children }) });
|
|
196
|
+
}
|
|
197
|
+
);
|
|
198
|
+
|
|
199
|
+
exports.Tabs = Tabs;
|
|
200
|
+
//# sourceMappingURL=Tabs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Tabs.js","sources":["../src/tabs/Tabs.tsx"],"sourcesContent":["import { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { clsx } from \"clsx\";\nimport {\n type ComponentPropsWithoutRef,\n forwardRef,\n type ReactNode,\n type SyntheticEvent,\n useCallback,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { makePrefixer, useControlled } from \"../utils\";\nimport { type Item, TabsContext } from \"./internal/contexts/TabsContext\";\nimport { useOverflowSelectionState } from \"./internal/overflow/useOverflowSelectionState\";\nimport { useCollection } from \"./internal/registry/useCollection\";\nimport { useRenderedTabsRegistry } from \"./internal/registry/useRenderedTabsRegistry\";\nimport tabsCss from \"./Tabs.css\";\n\nexport interface TabsProps\n extends Omit<ComponentPropsWithoutRef<\"div\">, \"onChange\"> {\n children?: ReactNode;\n /**\n * The default value. Use when the component is not controlled.\n */\n defaultValue?: string;\n /**\n * The value. Use when the component is controlled.\n */\n value?: string;\n /**\n * Callback fired when the selection changes.\n * The event will be null when selection is moved automatically, such as when\n * the currently selected tab is removed and the next available tab is\n * selected.\n */\n onChange?: (event: SyntheticEvent | null, value: string) => void;\n}\n\nconst withBaseName = makePrefixer(\"saltTabs\");\n\nfunction setValueIdMapEntry(\n map: Map<string, string>,\n value: string,\n id: string,\n) {\n if (map.get(value) === id) {\n return map;\n }\n\n const next = new Map(map);\n next.set(value, id);\n return next;\n}\n\nfunction removeValueIdMapEntry(\n map: Map<string, string>,\n value: string,\n id: string,\n) {\n if (map.get(value) !== id) {\n return map;\n }\n\n const next = new Map(map);\n next.delete(value);\n return next;\n}\n\nexport const Tabs = forwardRef<HTMLDivElement, TabsProps>(\n function Tabs(props, ref) {\n const { className, children, value, defaultValue, onChange, ...rest } =\n props;\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-tabs\",\n css: tabsCss,\n window: targetWindow,\n });\n\n const [valueToTabIdMap, setValueToIdMap] = useState(\n () => new Map<string, string>(),\n );\n const [valueToPanelIdMap, setValueToPanelIdMap] = useState(\n () => new Map<string, string>(),\n );\n const {\n renderMode,\n registerBootstrapTab,\n setBootstrapTabReady,\n setBootstrapOverflowReady,\n registerRenderedTab,\n updateRenderedTab,\n getRenderedTab,\n getRenderedTabOrder,\n renderedTabs,\n } = useRenderedTabsRegistry();\n\n const {\n registerItem,\n updateItem,\n item,\n getNext,\n getPrevious,\n getFirst,\n getLast,\n itemAt,\n getIndex,\n sortItems,\n removalVersion,\n getRemovedItems,\n } = useCollection({ targetWindow, wrap: true });\n\n const activeTab = useRef<Pick<Item, \"id\" | \"value\">>();\n\n const [menuOpen, setMenuOpen] = useState(false);\n\n const [selected, setSelectedState] = useControlled({\n controlled: value,\n default: defaultValue,\n name: \"Tabs\",\n state: \"selected\",\n });\n\n const commitSelection = useCallback(\n (event: SyntheticEvent | null, newValue: string) => {\n setSelectedState(newValue);\n if (selected !== newValue) {\n onChange?.(event, newValue);\n }\n },\n [onChange, selected],\n );\n const { selectionFromOverflowValueRef, setSelected } =\n useOverflowSelectionState({\n commitSelection,\n menuOpen,\n selected,\n setMenuOpen,\n });\n\n const registerTab = useCallback(\n (tab: Item) => {\n const cleanup = registerItem(tab);\n setValueToIdMap((map) => setValueIdMapEntry(map, tab.value, tab.id));\n\n return () => {\n cleanup();\n setValueToIdMap((map) =>\n removeValueIdMapEntry(map, tab.value, tab.id),\n );\n };\n },\n [registerItem],\n );\n\n const registerPanel = useCallback((id: string, value: string) => {\n setValueToPanelIdMap((map) => setValueIdMapEntry(map, value, id));\n return () => {\n setValueToPanelIdMap((map) => removeValueIdMapEntry(map, value, id));\n };\n }, []);\n\n const getPanelId = useCallback(\n (value: string) => {\n return valueToPanelIdMap.get(value);\n },\n [valueToPanelIdMap],\n );\n\n const getTabId = useCallback(\n (value: string) => {\n return valueToTabIdMap.get(value);\n },\n [valueToTabIdMap],\n );\n\n const context = useMemo(\n () => ({\n renderMode,\n registerBootstrapTab,\n setBootstrapTabReady,\n setBootstrapOverflowReady,\n registerTab,\n updateTab: updateItem,\n registerRenderedTab,\n updateRenderedTab,\n getRenderedTab,\n getRenderedTabOrder,\n renderedTabs,\n registerPanel,\n getPanelId,\n getTabId,\n selected,\n setSelected,\n item,\n getNext,\n getPrevious,\n getFirst,\n getLast,\n activeTab,\n selectionFromOverflowValueRef,\n menuOpen,\n setMenuOpen,\n itemAt,\n getIndex,\n sortItems,\n removalVersion,\n getRemovedItems,\n }),\n [\n renderMode,\n registerBootstrapTab,\n setBootstrapTabReady,\n setBootstrapOverflowReady,\n registerPanel,\n registerTab,\n updateItem,\n registerRenderedTab,\n updateRenderedTab,\n getRenderedTab,\n getRenderedTabOrder,\n renderedTabs,\n getPanelId,\n getTabId,\n selected,\n setSelected,\n item,\n getNext,\n getPrevious,\n getFirst,\n getLast,\n menuOpen,\n itemAt,\n getIndex,\n sortItems,\n removalVersion,\n getRemovedItems,\n selectionFromOverflowValueRef,\n ],\n );\n\n return (\n <TabsContext.Provider value={context}>\n <div className={clsx(withBaseName(), className)} ref={ref} {...rest}>\n {children}\n </div>\n </TabsContext.Provider>\n );\n },\n);\n"],"names":["makePrefixer","forwardRef","Tabs","useWindow","useComponentCssInjection","tabsCss","useState","useRenderedTabsRegistry","useCollection","useRef","useControlled","useCallback","useOverflowSelectionState","value","useMemo","TabsContext","clsx"],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var React = require('react');
|
|
4
|
+
var createContext = require('../../../utils/createContext.js');
|
|
5
|
+
require('clsx');
|
|
6
|
+
require('react/jsx-runtime');
|
|
7
|
+
require('../../../utils/useFloatingUI/useFloatingUI.js');
|
|
8
|
+
require('../../../utils/useId.js');
|
|
9
|
+
require('../../../salt-provider/SaltProvider.js');
|
|
10
|
+
require('../../../viewport/ViewportProvider.js');
|
|
11
|
+
|
|
12
|
+
const TabContext = createContext.createContext("TabContext", {
|
|
13
|
+
focused: false,
|
|
14
|
+
selected: false,
|
|
15
|
+
disabled: false,
|
|
16
|
+
value: "",
|
|
17
|
+
actions: [],
|
|
18
|
+
registerAction: () => () => void 0
|
|
19
|
+
});
|
|
20
|
+
function useTab() {
|
|
21
|
+
return React.useContext(TabContext);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
exports.TabContext = TabContext;
|
|
25
|
+
exports.useTab = useTab;
|
|
26
|
+
//# sourceMappingURL=TabContext.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TabContext.js","sources":["../src/tabs/internal/contexts/TabContext.tsx"],"sourcesContent":["import { useContext } from \"react\";\nimport { createContext } from \"../../../utils\";\n\ninterface TabContextValue {\n tabId?: string;\n focused: boolean;\n selected: boolean;\n value: string;\n disabled: boolean;\n actions: string[];\n registerAction: (id: string) => () => void;\n}\n\nexport const TabContext = createContext<TabContextValue>(\"TabContext\", {\n focused: false,\n selected: false,\n disabled: false,\n value: \"\",\n actions: [],\n registerAction: () => () => undefined,\n});\n\nexport function useTab() {\n return useContext(TabContext);\n}\n"],"names":["createContext","useContext"],"mappings":";;;;;;;;;;;AAaO,MAAM,UAAA,GAAaA,4BAA+B,YAAA,EAAc;AAAA,EACrE,OAAA,EAAS,KAAA;AAAA,EACT,QAAA,EAAU,KAAA;AAAA,EACV,QAAA,EAAU,KAAA;AAAA,EACV,KAAA,EAAO,EAAA;AAAA,EACP,SAAS,EAAC;AAAA,EACV,cAAA,EAAgB,MAAM,MAAM;AAC9B,CAAC;AAEM,SAAS,MAAA,GAAS;AACvB,EAAA,OAAOC,iBAAW,UAAU,CAAA;AAC9B;;;;;"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var React = require('react');
|
|
4
|
+
var createContext = require('../../../utils/createContext.js');
|
|
5
|
+
require('clsx');
|
|
6
|
+
require('react/jsx-runtime');
|
|
7
|
+
require('../../../utils/useFloatingUI/useFloatingUI.js');
|
|
8
|
+
require('../../../utils/useId.js');
|
|
9
|
+
require('../../../salt-provider/SaltProvider.js');
|
|
10
|
+
require('../../../viewport/ViewportProvider.js');
|
|
11
|
+
|
|
12
|
+
const TabListLayoutContext = createContext.createContext("TabListLayoutContext", null);
|
|
13
|
+
function useTabListLayout() {
|
|
14
|
+
return React.useContext(TabListLayoutContext);
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
exports.TabListLayoutContext = TabListLayoutContext;
|
|
18
|
+
exports.useTabListLayout = useTabListLayout;
|
|
19
|
+
//# sourceMappingURL=TabListLayoutContext.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TabListLayoutContext.js","sources":["../src/tabs/internal/contexts/TabListLayoutContext.tsx"],"sourcesContent":["import { useContext } from \"react\";\nimport { createContext } from \"../../../utils\";\n\nexport type TabSlotLocation = \"hidden\" | \"main\" | \"overflow\";\n\nexport interface TabListLayoutContextValue {\n getLocation: (value: string) => TabSlotLocation;\n overflowActiveValue: string | null;\n setOverflowActiveValue: (value: string | null) => void;\n moveOverflowFocus: (\n key: \"ArrowDown\" | \"ArrowUp\" | \"Home\" | \"End\",\n value: string,\n ) => boolean;\n}\n\nexport const TabListLayoutContext =\n createContext<TabListLayoutContextValue | null>(\"TabListLayoutContext\", null);\n\nexport function useTabListLayout() {\n return useContext(TabListLayoutContext);\n}\n"],"names":["createContext","useContext"],"mappings":";;;;;;;;;;;AAeO,MAAM,oBAAA,GACXA,2BAAA,CAAgD,sBAAA,EAAwB,IAAI;AAEvE,SAAS,gBAAA,GAAmB;AACjC,EAAA,OAAOC,iBAAW,oBAAoB,CAAA;AACxC;;;;;"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var React = require('react');
|
|
4
|
+
var createContext = require('../../../utils/createContext.js');
|
|
5
|
+
require('clsx');
|
|
6
|
+
require('react/jsx-runtime');
|
|
7
|
+
require('../../../utils/useFloatingUI/useFloatingUI.js');
|
|
8
|
+
require('../../../utils/useId.js');
|
|
9
|
+
require('../../../salt-provider/SaltProvider.js');
|
|
10
|
+
require('../../../viewport/ViewportProvider.js');
|
|
11
|
+
|
|
12
|
+
const TabSlotRegistryContext = createContext.createContext(
|
|
13
|
+
"TabSlotRegistryContext",
|
|
14
|
+
null
|
|
15
|
+
);
|
|
16
|
+
function useTabSlotRegistry() {
|
|
17
|
+
return React.useContext(TabSlotRegistryContext);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
exports.TabSlotRegistryContext = TabSlotRegistryContext;
|
|
21
|
+
exports.useTabSlotRegistry = useTabSlotRegistry;
|
|
22
|
+
//# sourceMappingURL=TabSlotRegistryContext.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TabSlotRegistryContext.js","sources":["../src/tabs/internal/contexts/TabSlotRegistryContext.tsx"],"sourcesContent":["import { useContext } from \"react\";\nimport { createContext } from \"../../../utils\";\n\nexport interface TabSlotRegistryContextValue {\n registerSlot: (slotId: string, element: HTMLDivElement | null) => void;\n}\n\nexport const TabSlotRegistryContext =\n createContext<TabSlotRegistryContextValue | null>(\n \"TabSlotRegistryContext\",\n null,\n );\n\nexport function useTabSlotRegistry() {\n return useContext(TabSlotRegistryContext);\n}\n"],"names":["createContext","useContext"],"mappings":";;;;;;;;;;;AAOO,MAAM,sBAAA,GACXA,2BAAA;AAAA,EACE,wBAAA;AAAA,EACA;AACF;AAEK,SAAS,kBAAA,GAAqB;AACnC,EAAA,OAAOC,iBAAW,sBAAsB,CAAA;AAC1C;;;;;"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var React = require('react');
|
|
4
|
+
var createContext = require('../../../utils/createContext.js');
|
|
5
|
+
require('clsx');
|
|
6
|
+
require('react/jsx-runtime');
|
|
7
|
+
require('../../../utils/useFloatingUI/useFloatingUI.js');
|
|
8
|
+
require('../../../utils/useId.js');
|
|
9
|
+
require('../../../salt-provider/SaltProvider.js');
|
|
10
|
+
require('../../../viewport/ViewportProvider.js');
|
|
11
|
+
|
|
12
|
+
const TabsContext = createContext.createContext("TabsContext", {
|
|
13
|
+
getFirst: () => null,
|
|
14
|
+
getLast: () => null,
|
|
15
|
+
getNext: () => null,
|
|
16
|
+
getPrevious: () => null,
|
|
17
|
+
item: () => null,
|
|
18
|
+
getIndex: () => -1,
|
|
19
|
+
itemAt: () => null,
|
|
20
|
+
sortItems: () => void 0,
|
|
21
|
+
renderMode: "inline",
|
|
22
|
+
registerBootstrapTab: () => () => void 0,
|
|
23
|
+
setBootstrapTabReady: () => void 0,
|
|
24
|
+
setBootstrapOverflowReady: () => void 0,
|
|
25
|
+
selected: void 0,
|
|
26
|
+
registerTab: () => () => void 0,
|
|
27
|
+
updateTab: () => void 0,
|
|
28
|
+
registerRenderedTab: () => () => void 0,
|
|
29
|
+
updateRenderedTab: () => void 0,
|
|
30
|
+
getRenderedTab: () => void 0,
|
|
31
|
+
getRenderedTabOrder: () => -1,
|
|
32
|
+
renderedTabs: [],
|
|
33
|
+
registerPanel: () => () => void 0,
|
|
34
|
+
getPanelId: () => void 0,
|
|
35
|
+
getTabId: () => void 0,
|
|
36
|
+
setSelected: () => void 0,
|
|
37
|
+
activeTab: { current: void 0 },
|
|
38
|
+
selectionFromOverflowValueRef: { current: null },
|
|
39
|
+
menuOpen: false,
|
|
40
|
+
setMenuOpen: () => void 0,
|
|
41
|
+
removalVersion: 0,
|
|
42
|
+
getRemovedItems: () => /* @__PURE__ */ new Map()
|
|
43
|
+
});
|
|
44
|
+
function useTabs() {
|
|
45
|
+
return React.useContext(TabsContext);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
exports.TabsContext = TabsContext;
|
|
49
|
+
exports.useTabs = useTabs;
|
|
50
|
+
//# sourceMappingURL=TabsContext.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TabsContext.js","sources":["../src/tabs/internal/contexts/TabsContext.tsx"],"sourcesContent":["import {\n type Dispatch,\n type MutableRefObject,\n type SetStateAction,\n type SyntheticEvent,\n useContext,\n} from \"react\";\nimport { createContext } from \"../../../utils\";\nimport type { useCollection } from \"../registry/useCollection\";\n\nexport interface Item {\n id: string;\n value: string;\n element: HTMLElement | null;\n location?: \"hidden\" | \"main\" | \"overflow\";\n order?: number;\n}\n\nexport interface RenderedTab {\n host: HTMLDivElement;\n id: string;\n marker: HTMLElement | null;\n root: HTMLElement | null;\n trigger: HTMLButtonElement | null;\n value: string;\n width: number;\n}\n\nexport type TabsRenderMode = \"inline\" | \"portal\";\n\nexport interface TabsContextValue\n extends Omit<\n ReturnType<typeof useCollection>,\n \"registerItem\" | \"updateItem\"\n > {\n renderMode: TabsRenderMode;\n registerBootstrapTab: (value: string) => () => void;\n setBootstrapTabReady: (value: string, ready: boolean) => void;\n setBootstrapOverflowReady: (ready: boolean) => void;\n registerTab: (item: Item) => () => void;\n updateTab: (id: string, updates: Partial<Omit<Item, \"id\" | \"value\">>) => void;\n registerRenderedTab: (tab: RenderedTab) => () => void;\n updateRenderedTab: (\n value: string,\n updates: Partial<Omit<RenderedTab, \"value\">>,\n ) => void;\n getRenderedTab: (value: string) => RenderedTab | undefined;\n getRenderedTabOrder: (value: string) => number;\n renderedTabs: RenderedTab[];\n registerPanel: (id: string, value: string) => () => void;\n getPanelId: (value: string) => string | undefined;\n getTabId: (value: string) => string | undefined;\n selected?: string;\n setSelected: (\n event: SyntheticEvent | null,\n value: string,\n source?: \"main\" | \"overflow\",\n ) => void;\n activeTab: MutableRefObject<Pick<Item, \"id\" | \"value\"> | undefined>;\n selectionFromOverflowValueRef: MutableRefObject<string | null>;\n menuOpen: boolean;\n setMenuOpen: Dispatch<SetStateAction<boolean>>;\n}\n\nexport const TabsContext = createContext<TabsContextValue>(\"TabsContext\", {\n getFirst: () => null,\n getLast: () => null,\n getNext: () => null,\n getPrevious: () => null,\n item: () => null,\n getIndex: () => -1,\n itemAt: () => null,\n sortItems: () => undefined,\n renderMode: \"inline\",\n registerBootstrapTab: () => () => undefined,\n setBootstrapTabReady: () => undefined,\n setBootstrapOverflowReady: () => undefined,\n selected: undefined,\n registerTab: () => () => undefined,\n updateTab: () => undefined,\n registerRenderedTab: () => () => undefined,\n updateRenderedTab: () => undefined,\n getRenderedTab: () => undefined,\n getRenderedTabOrder: () => -1,\n renderedTabs: [],\n registerPanel: () => () => undefined,\n getPanelId: () => undefined,\n getTabId: () => undefined,\n setSelected: () => undefined,\n activeTab: { current: undefined },\n selectionFromOverflowValueRef: { current: null },\n menuOpen: false,\n setMenuOpen: () => undefined,\n removalVersion: 0,\n getRemovedItems: () => new Map(),\n});\n\nexport function useTabs() {\n return useContext(TabsContext);\n}\n"],"names":["createContext","useContext"],"mappings":";;;;;;;;;;;AAgEO,MAAM,WAAA,GAAcA,4BAAgC,aAAA,EAAe;AAAA,EACxE,UAAU,MAAM,IAAA;AAAA,EAChB,SAAS,MAAM,IAAA;AAAA,EACf,SAAS,MAAM,IAAA;AAAA,EACf,aAAa,MAAM,IAAA;AAAA,EACnB,MAAM,MAAM,IAAA;AAAA,EACZ,UAAU,MAAM,EAAA;AAAA,EAChB,QAAQ,MAAM,IAAA;AAAA,EACd,WAAW,MAAM,MAAA;AAAA,EACjB,UAAA,EAAY,QAAA;AAAA,EACZ,oBAAA,EAAsB,MAAM,MAAM,MAAA;AAAA,EAClC,sBAAsB,MAAM,MAAA;AAAA,EAC5B,2BAA2B,MAAM,MAAA;AAAA,EACjC,QAAA,EAAU,MAAA;AAAA,EACV,WAAA,EAAa,MAAM,MAAM,MAAA;AAAA,EACzB,WAAW,MAAM,MAAA;AAAA,EACjB,mBAAA,EAAqB,MAAM,MAAM,MAAA;AAAA,EACjC,mBAAmB,MAAM,MAAA;AAAA,EACzB,gBAAgB,MAAM,MAAA;AAAA,EACtB,qBAAqB,MAAM,EAAA;AAAA,EAC3B,cAAc,EAAC;AAAA,EACf,aAAA,EAAe,MAAM,MAAM,MAAA;AAAA,EAC3B,YAAY,MAAM,MAAA;AAAA,EAClB,UAAU,MAAM,MAAA;AAAA,EAChB,aAAa,MAAM,MAAA;AAAA,EACnB,SAAA,EAAW,EAAE,OAAA,EAAS,MAAA,EAAU;AAAA,EAChC,6BAAA,EAA+B,EAAE,OAAA,EAAS,IAAA,EAAK;AAAA,EAC/C,QAAA,EAAU,KAAA;AAAA,EACV,aAAa,MAAM,MAAA;AAAA,EACnB,cAAA,EAAgB,CAAA;AAAA,EAChB,eAAA,EAAiB,sBAAM,IAAI,GAAA;AAC7B,CAAC;AAEM,SAAS,OAAA,GAAU;AACxB,EAAA,OAAOC,iBAAW,WAAW,CAAA;AAC/B;;;;;"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var React = require('react');
|
|
4
|
+
|
|
5
|
+
function useFocusWithRetry({
|
|
6
|
+
maxAttempts = 120,
|
|
7
|
+
targetWindow
|
|
8
|
+
}) {
|
|
9
|
+
const focusRafRef = React.useRef(null);
|
|
10
|
+
const cancelScheduledFocus = React.useCallback(() => {
|
|
11
|
+
if (focusRafRef.current != null && targetWindow) {
|
|
12
|
+
targetWindow.cancelAnimationFrame(focusRafRef.current);
|
|
13
|
+
focusRafRef.current = null;
|
|
14
|
+
}
|
|
15
|
+
}, [targetWindow]);
|
|
16
|
+
const focusElementWithRetry = React.useCallback(
|
|
17
|
+
(getElement) => {
|
|
18
|
+
var _a;
|
|
19
|
+
const doc = targetWindow == null ? void 0 : targetWindow.document;
|
|
20
|
+
if (!doc) {
|
|
21
|
+
(_a = getElement()) == null ? void 0 : _a.focus({ preventScroll: true });
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
cancelScheduledFocus();
|
|
25
|
+
let attempts = 0;
|
|
26
|
+
const focusElement = () => {
|
|
27
|
+
const element = getElement();
|
|
28
|
+
if (!(element == null ? void 0 : element.isConnected)) {
|
|
29
|
+
if (attempts >= maxAttempts || !(targetWindow == null ? void 0 : targetWindow.requestAnimationFrame)) {
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
attempts += 1;
|
|
33
|
+
focusRafRef.current = targetWindow.requestAnimationFrame(focusElement);
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
element.focus({ preventScroll: true });
|
|
37
|
+
if (doc.activeElement === element || attempts >= maxAttempts) {
|
|
38
|
+
focusRafRef.current = null;
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
attempts += 1;
|
|
42
|
+
if (targetWindow == null ? void 0 : targetWindow.requestAnimationFrame) {
|
|
43
|
+
focusRafRef.current = targetWindow.requestAnimationFrame(focusElement);
|
|
44
|
+
} else {
|
|
45
|
+
queueMicrotask(focusElement);
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
focusElement();
|
|
49
|
+
},
|
|
50
|
+
[cancelScheduledFocus, maxAttempts, targetWindow]
|
|
51
|
+
);
|
|
52
|
+
React.useEffect(() => {
|
|
53
|
+
return () => {
|
|
54
|
+
cancelScheduledFocus();
|
|
55
|
+
};
|
|
56
|
+
}, [cancelScheduledFocus]);
|
|
57
|
+
return {
|
|
58
|
+
cancelScheduledFocus,
|
|
59
|
+
focusElementWithRetry
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
exports.useFocusWithRetry = useFocusWithRetry;
|
|
64
|
+
//# sourceMappingURL=useFocusWithRetry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useFocusWithRetry.js","sources":["../src/tabs/internal/hooks/useFocusWithRetry.ts"],"sourcesContent":["import { useCallback, useEffect, useRef } from \"react\";\n\ninterface UseFocusWithRetryArgs {\n maxAttempts?: number;\n targetWindow: Window | null | undefined;\n}\n\nexport function useFocusWithRetry({\n maxAttempts = 120,\n targetWindow,\n}: UseFocusWithRetryArgs) {\n const focusRafRef = useRef<number | null>(null);\n\n const cancelScheduledFocus = useCallback(() => {\n if (focusRafRef.current != null && targetWindow) {\n targetWindow.cancelAnimationFrame(focusRafRef.current);\n focusRafRef.current = null;\n }\n }, [targetWindow]);\n\n const focusElementWithRetry = useCallback(\n (getElement: () => HTMLElement | null | undefined) => {\n const doc = targetWindow?.document;\n if (!doc) {\n getElement()?.focus({ preventScroll: true });\n return;\n }\n\n cancelScheduledFocus();\n\n let attempts = 0;\n\n const focusElement = () => {\n const element = getElement();\n if (!element?.isConnected) {\n if (attempts >= maxAttempts || !targetWindow?.requestAnimationFrame) {\n return;\n }\n\n attempts += 1;\n focusRafRef.current =\n targetWindow.requestAnimationFrame(focusElement);\n return;\n }\n\n element.focus({ preventScroll: true });\n\n if (doc.activeElement === element || attempts >= maxAttempts) {\n focusRafRef.current = null;\n return;\n }\n\n attempts += 1;\n if (targetWindow?.requestAnimationFrame) {\n focusRafRef.current =\n targetWindow.requestAnimationFrame(focusElement);\n } else {\n queueMicrotask(focusElement);\n }\n };\n\n focusElement();\n },\n [cancelScheduledFocus, maxAttempts, targetWindow],\n );\n\n useEffect(() => {\n return () => {\n cancelScheduledFocus();\n };\n }, [cancelScheduledFocus]);\n\n return {\n cancelScheduledFocus,\n focusElementWithRetry,\n };\n}\n"],"names":["useRef","useCallback","useEffect"],"mappings":";;;;AAOO,SAAS,iBAAA,CAAkB;AAAA,EAChC,WAAA,GAAc,GAAA;AAAA,EACd;AACF,CAAA,EAA0B;AACxB,EAAA,MAAM,WAAA,GAAcA,aAAsB,IAAI,CAAA;AAE9C,EAAA,MAAM,oBAAA,GAAuBC,kBAAY,MAAM;AAC7C,IAAA,IAAI,WAAA,CAAY,OAAA,IAAW,IAAA,IAAQ,YAAA,EAAc;AAC/C,MAAA,YAAA,CAAa,oBAAA,CAAqB,YAAY,OAAO,CAAA;AACrD,MAAA,WAAA,CAAY,OAAA,GAAU,IAAA;AAAA,IACxB;AAAA,EACF,CAAA,EAAG,CAAC,YAAY,CAAC,CAAA;AAEjB,EAAA,MAAM,qBAAA,GAAwBA,iBAAA;AAAA,IAC5B,CAAC,UAAA,KAAqD;AArB1D,MAAA,IAAA,EAAA;AAsBM,MAAA,MAAM,MAAM,YAAA,IAAA,IAAA,GAAA,MAAA,GAAA,YAAA,CAAc,QAAA;AAC1B,MAAA,IAAI,CAAC,GAAA,EAAK;AACR,QAAA,CAAA,EAAA,GAAA,UAAA,EAAW,KAAX,IAAA,GAAA,MAAA,GAAA,EAAA,CAAc,KAAA,CAAM,EAAE,eAAe,IAAA,EAAK,CAAA;AAC1C,QAAA;AAAA,MACF;AAEA,MAAA,oBAAA,EAAqB;AAErB,MAAA,IAAI,QAAA,GAAW,CAAA;AAEf,MAAA,MAAM,eAAe,MAAM;AACzB,QAAA,MAAM,UAAU,UAAA,EAAW;AAC3B,QAAA,IAAI,EAAC,mCAAS,WAAA,CAAA,EAAa;AACzB,UAAA,IAAI,QAAA,IAAY,WAAA,IAAe,EAAC,YAAA,IAAA,IAAA,GAAA,MAAA,GAAA,YAAA,CAAc,qBAAA,CAAA,EAAuB;AACnE,YAAA;AAAA,UACF;AAEA,UAAA,QAAA,IAAY,CAAA;AACZ,UAAA,WAAA,CAAY,OAAA,GACV,YAAA,CAAa,qBAAA,CAAsB,YAAY,CAAA;AACjD,UAAA;AAAA,QACF;AAEA,QAAA,OAAA,CAAQ,KAAA,CAAM,EAAE,aAAA,EAAe,IAAA,EAAM,CAAA;AAErC,QAAA,IAAI,GAAA,CAAI,aAAA,KAAkB,OAAA,IAAW,QAAA,IAAY,WAAA,EAAa;AAC5D,UAAA,WAAA,CAAY,OAAA,GAAU,IAAA;AACtB,UAAA;AAAA,QACF;AAEA,QAAA,QAAA,IAAY,CAAA;AACZ,QAAA,IAAI,6CAAc,qBAAA,EAAuB;AACvC,UAAA,WAAA,CAAY,OAAA,GACV,YAAA,CAAa,qBAAA,CAAsB,YAAY,CAAA;AAAA,QACnD,CAAA,MAAO;AACL,UAAA,cAAA,CAAe,YAAY,CAAA;AAAA,QAC7B;AAAA,MACF,CAAA;AAEA,MAAA,YAAA,EAAa;AAAA,IACf,CAAA;AAAA,IACA,CAAC,oBAAA,EAAsB,WAAA,EAAa,YAAY;AAAA,GAClD;AAEA,EAAAC,eAAA,CAAU,MAAM;AACd,IAAA,OAAO,MAAM;AACX,MAAA,oBAAA,EAAqB;AAAA,IACvB,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,oBAAoB,CAAC,CAAA;AAEzB,EAAA,OAAO;AAAA,IACL,oBAAA;AAAA,IACA;AAAA,GACF;AACF;;;;"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var React = require('react');
|
|
4
|
+
var domUtils = require('../utils/domUtils.js');
|
|
5
|
+
|
|
6
|
+
function useTabListRecovery({
|
|
7
|
+
removalVersion,
|
|
8
|
+
targetWindow,
|
|
9
|
+
tabstripRef,
|
|
10
|
+
overflowListRef,
|
|
11
|
+
handleTabRemoval,
|
|
12
|
+
pendingRemovalRecoveryRef,
|
|
13
|
+
pendingRemovalRecoveryRetriesRef
|
|
14
|
+
}) {
|
|
15
|
+
React.useEffect(() => {
|
|
16
|
+
if (removalVersion < 1) {
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
pendingRemovalRecoveryRef.current = true;
|
|
20
|
+
pendingRemovalRecoveryRetriesRef.current = 0;
|
|
21
|
+
const raf = targetWindow == null ? void 0 : targetWindow.requestAnimationFrame(() => {
|
|
22
|
+
handleTabRemoval();
|
|
23
|
+
});
|
|
24
|
+
return () => {
|
|
25
|
+
if (raf != null) {
|
|
26
|
+
targetWindow == null ? void 0 : targetWindow.cancelAnimationFrame(raf);
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
}, [
|
|
30
|
+
handleTabRemoval,
|
|
31
|
+
pendingRemovalRecoveryRef,
|
|
32
|
+
pendingRemovalRecoveryRetriesRef,
|
|
33
|
+
removalVersion,
|
|
34
|
+
targetWindow
|
|
35
|
+
]);
|
|
36
|
+
React.useEffect(() => {
|
|
37
|
+
const isInTabList = (node) => {
|
|
38
|
+
var _a, _b;
|
|
39
|
+
if (!node) {
|
|
40
|
+
return false;
|
|
41
|
+
}
|
|
42
|
+
return (((_a = tabstripRef.current) == null ? void 0 : _a.contains(node)) ?? false) || (((_b = overflowListRef.current) == null ? void 0 : _b.contains(node)) ?? false);
|
|
43
|
+
};
|
|
44
|
+
const handleFocusOut = (event) => {
|
|
45
|
+
if (!pendingRemovalRecoveryRef.current) {
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
const wasInTabList = domUtils.isHTMLElement(event.target) && isInTabList(event.target);
|
|
49
|
+
const stillInTabList = domUtils.isHTMLElement(event.relatedTarget) && isInTabList(event.relatedTarget);
|
|
50
|
+
if (wasInTabList && !stillInTabList) {
|
|
51
|
+
if (targetWindow == null ? void 0 : targetWindow.requestAnimationFrame) {
|
|
52
|
+
targetWindow.requestAnimationFrame(() => handleTabRemoval());
|
|
53
|
+
} else {
|
|
54
|
+
queueMicrotask(() => handleTabRemoval());
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
};
|
|
58
|
+
targetWindow == null ? void 0 : targetWindow.document.addEventListener("focusout", handleFocusOut, true);
|
|
59
|
+
return () => {
|
|
60
|
+
targetWindow == null ? void 0 : targetWindow.document.removeEventListener(
|
|
61
|
+
"focusout",
|
|
62
|
+
handleFocusOut,
|
|
63
|
+
true
|
|
64
|
+
);
|
|
65
|
+
};
|
|
66
|
+
}, [
|
|
67
|
+
handleTabRemoval,
|
|
68
|
+
overflowListRef,
|
|
69
|
+
pendingRemovalRecoveryRef,
|
|
70
|
+
tabstripRef,
|
|
71
|
+
targetWindow
|
|
72
|
+
]);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
exports.useTabListRecovery = useTabListRecovery;
|
|
76
|
+
//# sourceMappingURL=useTabListRecovery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useTabListRecovery.js","sources":["../src/tabs/internal/hooks/useTabListRecovery.ts"],"sourcesContent":["import { type MutableRefObject, type RefObject, useEffect } from \"react\";\nimport { isHTMLElement } from \"../utils/domUtils\";\n\ninterface UseTabListRecoveryArgs {\n removalVersion: number;\n targetWindow: Window | null | undefined;\n tabstripRef: RefObject<HTMLDivElement | null>;\n overflowListRef: RefObject<HTMLDivElement | null>;\n handleTabRemoval: () => void;\n pendingRemovalRecoveryRef: MutableRefObject<boolean>;\n pendingRemovalRecoveryRetriesRef: MutableRefObject<number>;\n}\n\nexport function useTabListRecovery({\n removalVersion,\n targetWindow,\n tabstripRef,\n overflowListRef,\n handleTabRemoval,\n pendingRemovalRecoveryRef,\n pendingRemovalRecoveryRetriesRef,\n}: UseTabListRecoveryArgs) {\n useEffect(() => {\n if (removalVersion < 1) {\n return;\n }\n\n pendingRemovalRecoveryRef.current = true;\n pendingRemovalRecoveryRetriesRef.current = 0;\n\n const raf = targetWindow?.requestAnimationFrame(() => {\n handleTabRemoval();\n });\n\n return () => {\n if (raf != null) {\n targetWindow?.cancelAnimationFrame(raf);\n }\n };\n }, [\n handleTabRemoval,\n pendingRemovalRecoveryRef,\n pendingRemovalRecoveryRetriesRef,\n removalVersion,\n targetWindow,\n ]);\n\n useEffect(() => {\n const isInTabList = (node: HTMLElement | null) => {\n if (!node) {\n return false;\n }\n\n return (\n (tabstripRef.current?.contains(node) ?? false) ||\n (overflowListRef.current?.contains(node) ?? false)\n );\n };\n\n const handleFocusOut = (event: FocusEvent) => {\n if (!pendingRemovalRecoveryRef.current) {\n return;\n }\n\n const wasInTabList =\n isHTMLElement(event.target) && isInTabList(event.target);\n const stillInTabList =\n isHTMLElement(event.relatedTarget) && isInTabList(event.relatedTarget);\n\n if (wasInTabList && !stillInTabList) {\n if (targetWindow?.requestAnimationFrame) {\n targetWindow.requestAnimationFrame(() => handleTabRemoval());\n } else {\n queueMicrotask(() => handleTabRemoval());\n }\n }\n };\n\n targetWindow?.document.addEventListener(\"focusout\", handleFocusOut, true);\n\n return () => {\n targetWindow?.document.removeEventListener(\n \"focusout\",\n handleFocusOut,\n true,\n );\n };\n }, [\n handleTabRemoval,\n overflowListRef,\n pendingRemovalRecoveryRef,\n tabstripRef,\n targetWindow,\n ]);\n}\n"],"names":["useEffect","isHTMLElement"],"mappings":";;;;;AAaO,SAAS,kBAAA,CAAmB;AAAA,EACjC,cAAA;AAAA,EACA,YAAA;AAAA,EACA,WAAA;AAAA,EACA,eAAA;AAAA,EACA,gBAAA;AAAA,EACA,yBAAA;AAAA,EACA;AACF,CAAA,EAA2B;AACzB,EAAAA,eAAA,CAAU,MAAM;AACd,IAAA,IAAI,iBAAiB,CAAA,EAAG;AACtB,MAAA;AAAA,IACF;AAEA,IAAA,yBAAA,CAA0B,OAAA,GAAU,IAAA;AACpC,IAAA,gCAAA,CAAiC,OAAA,GAAU,CAAA;AAE3C,IAAA,MAAM,GAAA,GAAM,YAAA,IAAA,IAAA,GAAA,MAAA,GAAA,YAAA,CAAc,qBAAA,CAAsB,MAAM;AACpD,MAAA,gBAAA,EAAiB;AAAA,IACnB,CAAA,CAAA;AAEA,IAAA,OAAO,MAAM;AACX,MAAA,IAAI,OAAO,IAAA,EAAM;AACf,QAAA,YAAA,IAAA,IAAA,GAAA,MAAA,GAAA,YAAA,CAAc,oBAAA,CAAqB,GAAA,CAAA;AAAA,MACrC;AAAA,IACF,CAAA;AAAA,EACF,CAAA,EAAG;AAAA,IACD,gBAAA;AAAA,IACA,yBAAA;AAAA,IACA,gCAAA;AAAA,IACA,cAAA;AAAA,IACA;AAAA,GACD,CAAA;AAED,EAAAA,eAAA,CAAU,MAAM;AACd,IAAA,MAAM,WAAA,GAAc,CAAC,IAAA,KAA6B;AAhDtD,MAAA,IAAA,EAAA,EAAA,EAAA;AAiDM,MAAA,IAAI,CAAC,IAAA,EAAM;AACT,QAAA,OAAO,KAAA;AAAA,MACT;AAEA,MAAA,OAAA,CAAA,CAAA,CACG,EAAA,GAAA,WAAA,CAAY,OAAA,KAAZ,IAAA,GAAA,MAAA,GAAA,EAAA,CAAqB,QAAA,CAAS,IAAA,CAAA,KAAS,aACvC,EAAA,GAAA,eAAA,CAAgB,OAAA,KAAhB,IAAA,GAAA,MAAA,GAAA,EAAA,CAAyB,QAAA,CAAS,IAAA,CAAA,KAAS,KAAA,CAAA;AAAA,IAEhD,CAAA;AAEA,IAAA,MAAM,cAAA,GAAiB,CAAC,KAAA,KAAsB;AAC5C,MAAA,IAAI,CAAC,0BAA0B,OAAA,EAAS;AACtC,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,eACJC,sBAAA,CAAc,KAAA,CAAM,MAAM,CAAA,IAAK,WAAA,CAAY,MAAM,MAAM,CAAA;AACzD,MAAA,MAAM,iBACJA,sBAAA,CAAc,KAAA,CAAM,aAAa,CAAA,IAAK,WAAA,CAAY,MAAM,aAAa,CAAA;AAEvE,MAAA,IAAI,YAAA,IAAgB,CAAC,cAAA,EAAgB;AACnC,QAAA,IAAI,6CAAc,qBAAA,EAAuB;AACvC,UAAA,YAAA,CAAa,qBAAA,CAAsB,MAAM,gBAAA,EAAkB,CAAA;AAAA,QAC7D,CAAA,MAAO;AACL,UAAA,cAAA,CAAe,MAAM,kBAAkB,CAAA;AAAA,QACzC;AAAA,MACF;AAAA,IACF,CAAA;AAEA,IAAA,YAAA,IAAA,IAAA,GAAA,MAAA,GAAA,YAAA,CAAc,QAAA,CAAS,gBAAA,CAAiB,UAAA,EAAY,cAAA,EAAgB,IAAA,CAAA;AAEpE,IAAA,OAAO,MAAM;AACX,MAAA,YAAA,IAAA,IAAA,GAAA,MAAA,GAAA,YAAA,CAAc,QAAA,CAAS,mBAAA;AAAA,QACrB,UAAA;AAAA,QACA,cAAA;AAAA,QACA;AAAA,OAAA;AAAA,IAEJ,CAAA;AAAA,EACF,CAAA,EAAG;AAAA,IACD,gBAAA;AAAA,IACA,eAAA;AAAA,IACA,yBAAA;AAAA,IACA,WAAA;AAAA,IACA;AAAA,GACD,CAAA;AACH;;;;"}
|