@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":"useOverflowSelectionState.js","sources":["../src/tabs/internal/overflow/useOverflowSelectionState.ts"],"sourcesContent":["import {\n type Dispatch,\n type MutableRefObject,\n type SetStateAction,\n type SyntheticEvent,\n useCallback,\n useEffect,\n useRef,\n} from \"react\";\nimport { useIsomorphicLayoutEffect, usePrevious } from \"../../../utils\";\n\ninterface PendingOverflowSelection {\n event: SyntheticEvent | null;\n value: string;\n}\n\ninterface UseOverflowSelectionStateArgs {\n commitSelection: (event: SyntheticEvent | null, value: string) => void;\n menuOpen: boolean;\n selected?: string;\n setMenuOpen: Dispatch<SetStateAction<boolean>>;\n}\n\ninterface UseOverflowSelectionStateResult {\n selectionFromOverflowValueRef: MutableRefObject<string | null>;\n setSelected: (\n event: SyntheticEvent | null,\n value: string,\n source?: \"main\" | \"overflow\",\n ) => void;\n}\n\nexport function useOverflowSelectionState({\n commitSelection,\n menuOpen,\n selected,\n setMenuOpen,\n}: UseOverflowSelectionStateArgs): UseOverflowSelectionStateResult {\n const previousSelected = usePrevious(selected, [selected]);\n const selectionFromOverflowValueRef = useRef<string | null>(null);\n const pendingOverflowSelectionRef = useRef<PendingOverflowSelection | null>(\n null,\n );\n\n const setSelected = useCallback(\n (\n event: SyntheticEvent | null,\n value: string,\n source: \"main\" | \"overflow\" = \"main\",\n ) => {\n const selectedFromOverflow = source === \"overflow\";\n selectionFromOverflowValueRef.current = selectedFromOverflow\n ? value\n : null;\n\n if (selectedFromOverflow) {\n event?.persist();\n pendingOverflowSelectionRef.current = { event, value };\n setMenuOpen(false);\n return;\n }\n\n pendingOverflowSelectionRef.current = null;\n setMenuOpen(false);\n commitSelection(event, value);\n },\n [commitSelection, setMenuOpen],\n );\n\n useIsomorphicLayoutEffect(() => {\n if (menuOpen) {\n return;\n }\n\n const pendingSelection = pendingOverflowSelectionRef.current;\n if (!pendingSelection) {\n return;\n }\n\n pendingOverflowSelectionRef.current = null;\n commitSelection(pendingSelection.event, pendingSelection.value);\n }, [commitSelection, menuOpen]);\n\n useEffect(() => {\n const selectedFromOverflow = selectionFromOverflowValueRef.current;\n if (selectedFromOverflow == null || pendingOverflowSelectionRef.current) {\n return;\n }\n\n if (selected === selectedFromOverflow && selected !== previousSelected) {\n return;\n }\n\n selectionFromOverflowValueRef.current = null;\n }, [previousSelected, selected]);\n\n return {\n selectionFromOverflowValueRef,\n setSelected,\n };\n}\n"],"names":[],"mappings":";;;;;;;;;;AAgCO,SAAS,yBAAA,CAA0B;AAAA,EACxC,eAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA,EAAmE;AACjE,EAAA,MAAM,gBAAA,GAAmB,WAAA,CAAY,QAAA,EAAU,CAAC,QAAQ,CAAC,CAAA;AACzD,EAAA,MAAM,6BAAA,GAAgC,OAAsB,IAAI,CAAA;AAChE,EAAA,MAAM,2BAAA,GAA8B,MAAA;AAAA,IAClC;AAAA,GACF;AAEA,EAAA,MAAM,WAAA,GAAc,WAAA;AAAA,IAClB,CACE,KAAA,EACA,KAAA,EACA,MAAA,GAA8B,MAAA,KAC3B;AACH,MAAA,MAAM,uBAAuB,MAAA,KAAW,UAAA;AACxC,MAAA,6BAAA,CAA8B,OAAA,GAAU,uBACpC,KAAA,GACA,IAAA;AAEJ,MAAA,IAAI,oBAAA,EAAsB;AACxB,QAAA,KAAA,IAAA,IAAA,GAAA,MAAA,GAAA,KAAA,CAAO,OAAA,EAAA;AACP,QAAA,2BAAA,CAA4B,OAAA,GAAU,EAAE,KAAA,EAAO,KAAA,EAAM;AACrD,QAAA,WAAA,CAAY,KAAK,CAAA;AACjB,QAAA;AAAA,MACF;AAEA,MAAA,2BAAA,CAA4B,OAAA,GAAU,IAAA;AACtC,MAAA,WAAA,CAAY,KAAK,CAAA;AACjB,MAAA,eAAA,CAAgB,OAAO,KAAK,CAAA;AAAA,IAC9B,CAAA;AAAA,IACA,CAAC,iBAAiB,WAAW;AAAA,GAC/B;AAEA,EAAA,yBAAA,CAA0B,MAAM;AAC9B,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,mBAAmB,2BAAA,CAA4B,OAAA;AACrD,IAAA,IAAI,CAAC,gBAAA,EAAkB;AACrB,MAAA;AAAA,IACF;AAEA,IAAA,2BAAA,CAA4B,OAAA,GAAU,IAAA;AACtC,IAAA,eAAA,CAAgB,gBAAA,CAAiB,KAAA,EAAO,gBAAA,CAAiB,KAAK,CAAA;AAAA,EAChE,CAAA,EAAG,CAAC,eAAA,EAAiB,QAAQ,CAAC,CAAA;AAE9B,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,MAAM,uBAAuB,6BAAA,CAA8B,OAAA;AAC3D,IAAA,IAAI,oBAAA,IAAwB,IAAA,IAAQ,2BAAA,CAA4B,OAAA,EAAS;AACvE,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,QAAA,KAAa,oBAAA,IAAwB,QAAA,KAAa,gBAAA,EAAkB;AACtE,MAAA;AAAA,IACF;AAEA,IAAA,6BAAA,CAA8B,OAAA,GAAU,IAAA;AAAA,EAC1C,CAAA,EAAG,CAAC,gBAAA,EAAkB,QAAQ,CAAC,CAAA;AAE/B,EAAA,OAAO;AAAA,IACL,6BAAA;AAAA,IACA;AAAA,GACF;AACF;;;;"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { useEffect } from 'react';
|
|
2
|
+
import { getIntrinsicMeasuredWidth } from './widthMeasurement.js';
|
|
3
|
+
|
|
4
|
+
const MIN_TRUSTED_RENDERED_TAB_WIDTH = 0.5;
|
|
5
|
+
function isSecondaryMeasurementContext(element) {
|
|
6
|
+
return element.closest(".saltTabOverflowList-list") || element.closest(".saltTabList-measureContainer");
|
|
7
|
+
}
|
|
8
|
+
function useRenderedTabWidth({
|
|
9
|
+
hostElement,
|
|
10
|
+
renderMode,
|
|
11
|
+
tabRootRef,
|
|
12
|
+
targetWindow,
|
|
13
|
+
updateRenderedTab,
|
|
14
|
+
value
|
|
15
|
+
}) {
|
|
16
|
+
useEffect(() => {
|
|
17
|
+
if (!hostElement) {
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
const element = tabRootRef.current;
|
|
21
|
+
const resizeObserverCtor = targetWindow == null ? void 0 : targetWindow.ResizeObserver;
|
|
22
|
+
const mutationObserverCtor = targetWindow == null ? void 0 : targetWindow.MutationObserver;
|
|
23
|
+
if (!element || !resizeObserverCtor) {
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
const updateWidth = (allowSecondaryMeasurementContext = false) => {
|
|
27
|
+
if (!element.isConnected) {
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
if (!allowSecondaryMeasurementContext && isSecondaryMeasurementContext(element)) {
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
const width = getIntrinsicMeasuredWidth(element);
|
|
34
|
+
if (width <= MIN_TRUSTED_RENDERED_TAB_WIDTH) {
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
updateRenderedTab(value, {
|
|
38
|
+
width
|
|
39
|
+
});
|
|
40
|
+
};
|
|
41
|
+
let animationFrameId = null;
|
|
42
|
+
const scheduleWidthUpdate = (allowSecondaryMeasurementContext = false) => {
|
|
43
|
+
if (!(targetWindow == null ? void 0 : targetWindow.requestAnimationFrame)) {
|
|
44
|
+
updateWidth(allowSecondaryMeasurementContext);
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
if (animationFrameId != null) {
|
|
48
|
+
targetWindow.cancelAnimationFrame(animationFrameId);
|
|
49
|
+
}
|
|
50
|
+
animationFrameId = targetWindow.requestAnimationFrame(() => {
|
|
51
|
+
animationFrameId = null;
|
|
52
|
+
updateWidth(allowSecondaryMeasurementContext);
|
|
53
|
+
});
|
|
54
|
+
};
|
|
55
|
+
if (renderMode === "portal") {
|
|
56
|
+
scheduleWidthUpdate(true);
|
|
57
|
+
} else {
|
|
58
|
+
updateWidth(true);
|
|
59
|
+
}
|
|
60
|
+
const resizeObserver = new resizeObserverCtor(() => {
|
|
61
|
+
updateWidth();
|
|
62
|
+
});
|
|
63
|
+
resizeObserver.observe(element);
|
|
64
|
+
const mutationObserver = mutationObserverCtor ? new mutationObserverCtor(() => {
|
|
65
|
+
scheduleWidthUpdate();
|
|
66
|
+
}) : null;
|
|
67
|
+
mutationObserver == null ? void 0 : mutationObserver.observe(element, {
|
|
68
|
+
childList: true,
|
|
69
|
+
characterData: true,
|
|
70
|
+
subtree: true
|
|
71
|
+
});
|
|
72
|
+
return () => {
|
|
73
|
+
if (animationFrameId != null && targetWindow) {
|
|
74
|
+
targetWindow.cancelAnimationFrame(animationFrameId);
|
|
75
|
+
}
|
|
76
|
+
mutationObserver == null ? void 0 : mutationObserver.disconnect();
|
|
77
|
+
resizeObserver.disconnect();
|
|
78
|
+
};
|
|
79
|
+
}, [
|
|
80
|
+
hostElement,
|
|
81
|
+
renderMode,
|
|
82
|
+
tabRootRef,
|
|
83
|
+
targetWindow,
|
|
84
|
+
updateRenderedTab,
|
|
85
|
+
value
|
|
86
|
+
]);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
export { useRenderedTabWidth };
|
|
90
|
+
//# sourceMappingURL=useRenderedTabWidth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useRenderedTabWidth.js","sources":["../src/tabs/internal/overflow/useRenderedTabWidth.ts"],"sourcesContent":["import { type RefObject, useEffect } from \"react\";\nimport type { TabsContextValue, TabsRenderMode } from \"../contexts/TabsContext\";\nimport { getIntrinsicMeasuredWidth } from \"./widthMeasurement\";\n\nconst MIN_TRUSTED_RENDERED_TAB_WIDTH = 0.5;\n\ninterface UseRenderedTabWidthProps {\n hostElement: HTMLDivElement | null;\n renderMode: TabsRenderMode;\n tabRootRef: RefObject<HTMLDivElement>;\n targetWindow: Window | null | undefined;\n updateRenderedTab: TabsContextValue[\"updateRenderedTab\"];\n value: string;\n}\n\nfunction isSecondaryMeasurementContext(element: HTMLElement) {\n return (\n element.closest(\".saltTabOverflowList-list\") ||\n element.closest(\".saltTabList-measureContainer\")\n );\n}\n\nexport function useRenderedTabWidth({\n hostElement,\n renderMode,\n tabRootRef,\n targetWindow,\n updateRenderedTab,\n value,\n}: UseRenderedTabWidthProps) {\n useEffect(() => {\n if (!hostElement) {\n return;\n }\n\n const element = tabRootRef.current;\n const resizeObserverCtor = (\n targetWindow as\n | (Window & { ResizeObserver?: typeof ResizeObserver })\n | undefined\n )?.ResizeObserver;\n const mutationObserverCtor = (\n targetWindow as\n | (Window & { MutationObserver?: typeof MutationObserver })\n | undefined\n )?.MutationObserver;\n if (!element || !resizeObserverCtor) {\n return;\n }\n\n const updateWidth = (allowSecondaryMeasurementContext = false) => {\n if (!element.isConnected) {\n return;\n }\n\n // Preserve the strip width while a tab is rendered in the overflow menu.\n // Overflow items stretch to the menu width, and hidden measurement tabs\n // can collapse to a different intrinsic size. Neither width is suitable\n // for deciding whether the tab fits back in the main strip once the tab\n // is already established. A one-time seeded width is still useful for\n // newly mounted tabs before they have ever appeared in the main strip.\n if (\n !allowSecondaryMeasurementContext &&\n isSecondaryMeasurementContext(element)\n ) {\n return;\n }\n\n const width = getIntrinsicMeasuredWidth(element);\n if (width <= MIN_TRUSTED_RENDERED_TAB_WIDTH) {\n return;\n }\n\n updateRenderedTab(value, {\n width,\n });\n };\n\n let animationFrameId: number | null = null;\n const scheduleWidthUpdate = (allowSecondaryMeasurementContext = false) => {\n if (!targetWindow?.requestAnimationFrame) {\n updateWidth(allowSecondaryMeasurementContext);\n return;\n }\n\n if (animationFrameId != null) {\n targetWindow.cancelAnimationFrame(animationFrameId);\n }\n\n animationFrameId = targetWindow.requestAnimationFrame(() => {\n animationFrameId = null;\n updateWidth(allowSecondaryMeasurementContext);\n });\n };\n\n if (renderMode === \"portal\") {\n scheduleWidthUpdate(true);\n } else {\n updateWidth(true);\n }\n\n const resizeObserver = new resizeObserverCtor(() => {\n updateWidth();\n });\n\n resizeObserver.observe(element);\n const mutationObserver = mutationObserverCtor\n ? new mutationObserverCtor(() => {\n scheduleWidthUpdate();\n })\n : null;\n\n mutationObserver?.observe(element, {\n childList: true,\n characterData: true,\n subtree: true,\n });\n\n return () => {\n if (animationFrameId != null && targetWindow) {\n targetWindow.cancelAnimationFrame(animationFrameId);\n }\n mutationObserver?.disconnect();\n resizeObserver.disconnect();\n };\n }, [\n hostElement,\n renderMode,\n tabRootRef,\n targetWindow,\n updateRenderedTab,\n value,\n ]);\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
const WIDTH_EPSILON = 0.5;
|
|
2
|
+
function getMeasuredWidth(element) {
|
|
3
|
+
if (!element) {
|
|
4
|
+
return 0;
|
|
5
|
+
}
|
|
6
|
+
const width = element.getBoundingClientRect().width;
|
|
7
|
+
return width || element.clientWidth || 0;
|
|
8
|
+
}
|
|
9
|
+
function getIntrinsicMeasuredWidth(element) {
|
|
10
|
+
if (!element) {
|
|
11
|
+
return 0;
|
|
12
|
+
}
|
|
13
|
+
const borderWidth = element.offsetWidth - element.clientWidth;
|
|
14
|
+
return Math.max(getMeasuredWidth(element), element.scrollWidth + borderWidth);
|
|
15
|
+
}
|
|
16
|
+
function getGapValue(styles) {
|
|
17
|
+
return Number.parseFloat(styles.columnGap || styles.gap || "0") || 0;
|
|
18
|
+
}
|
|
19
|
+
function seedWidthMap(elements) {
|
|
20
|
+
const widths = /* @__PURE__ */ new Map();
|
|
21
|
+
for (const element of elements) {
|
|
22
|
+
widths.set(element, getMeasuredWidth(element));
|
|
23
|
+
}
|
|
24
|
+
return widths;
|
|
25
|
+
}
|
|
26
|
+
function updateWidthMap(widths, element, nextWidth, epsilon = WIDTH_EPSILON) {
|
|
27
|
+
const previousWidth = widths.get(element);
|
|
28
|
+
widths.set(element, nextWidth);
|
|
29
|
+
if (previousWidth === void 0) {
|
|
30
|
+
return false;
|
|
31
|
+
}
|
|
32
|
+
return Math.abs(previousWidth - nextWidth) > epsilon;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export { getGapValue, getIntrinsicMeasuredWidth, getMeasuredWidth, seedWidthMap, updateWidthMap };
|
|
36
|
+
//# sourceMappingURL=widthMeasurement.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"widthMeasurement.js","sources":["../src/tabs/internal/overflow/widthMeasurement.ts"],"sourcesContent":["const WIDTH_EPSILON = 0.5;\n\nexport function getMeasuredWidth(element: HTMLElement | null | undefined) {\n if (!element) {\n return 0;\n }\n\n const width = element.getBoundingClientRect().width;\n return width || element.clientWidth || 0;\n}\n\nexport function getIntrinsicMeasuredWidth(\n element: HTMLElement | null | undefined,\n) {\n if (!element) {\n return 0;\n }\n\n const borderWidth = element.offsetWidth - element.clientWidth;\n return Math.max(getMeasuredWidth(element), element.scrollWidth + borderWidth);\n}\n\nexport function getGapValue(styles: CSSStyleDeclaration) {\n return Number.parseFloat(styles.columnGap || styles.gap || \"0\") || 0;\n}\n\nexport function seedWidthMap(elements: HTMLElement[]) {\n const widths = new Map<HTMLElement, number>();\n for (const element of elements) {\n widths.set(element, getMeasuredWidth(element));\n }\n return widths;\n}\n\nexport function updateWidthMap(\n widths: Map<HTMLElement, number>,\n element: HTMLElement,\n nextWidth: number,\n epsilon = WIDTH_EPSILON,\n) {\n const previousWidth = widths.get(element);\n widths.set(element, nextWidth);\n\n if (previousWidth === undefined) {\n return false;\n }\n\n return Math.abs(previousWidth - nextWidth) > epsilon;\n}\n"],"names":[],"mappings":"AAAA,MAAM,aAAA,GAAgB,GAAA;AAEf,SAAS,iBAAiB,OAAA,EAAyC;AACxE,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,OAAO,CAAA;AAAA,EACT;AAEA,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,qBAAA,EAAsB,CAAE,KAAA;AAC9C,EAAA,OAAO,KAAA,IAAS,QAAQ,WAAA,IAAe,CAAA;AACzC;AAEO,SAAS,0BACd,OAAA,EACA;AACA,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,OAAO,CAAA;AAAA,EACT;AAEA,EAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,WAAA,GAAc,OAAA,CAAQ,WAAA;AAClD,EAAA,OAAO,KAAK,GAAA,CAAI,gBAAA,CAAiB,OAAO,CAAA,EAAG,OAAA,CAAQ,cAAc,WAAW,CAAA;AAC9E;AAEO,SAAS,YAAY,MAAA,EAA6B;AACvD,EAAA,OAAO,OAAO,UAAA,CAAW,MAAA,CAAO,aAAa,MAAA,CAAO,GAAA,IAAO,GAAG,CAAA,IAAK,CAAA;AACrE;AAEO,SAAS,aAAa,QAAA,EAAyB;AACpD,EAAA,MAAM,MAAA,uBAAa,GAAA,EAAyB;AAC5C,EAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,IAAA,MAAA,CAAO,GAAA,CAAI,OAAA,EAAS,gBAAA,CAAiB,OAAO,CAAC,CAAA;AAAA,EAC/C;AACA,EAAA,OAAO,MAAA;AACT;AAEO,SAAS,cAAA,CACd,MAAA,EACA,OAAA,EACA,SAAA,EACA,UAAU,aAAA,EACV;AACA,EAAA,MAAM,aAAA,GAAgB,MAAA,CAAO,GAAA,CAAI,OAAO,CAAA;AACxC,EAAA,MAAA,CAAO,GAAA,CAAI,SAAS,SAAS,CAAA;AAE7B,EAAA,IAAI,kBAAkB,MAAA,EAAW;AAC/B,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,OAAO,IAAA,CAAK,GAAA,CAAI,aAAA,GAAgB,SAAS,CAAA,GAAI,OAAA;AAC/C;;;;"}
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
import { useRef, useState, useCallback, useEffect } from 'react';
|
|
2
|
+
|
|
3
|
+
function sortBasedOnDOMPosition(items) {
|
|
4
|
+
const indexedItems = items.map((item, index) => [index, item]);
|
|
5
|
+
let orderChanged = false;
|
|
6
|
+
indexedItems.sort(([itemAIndex, itemA], [itemBIndex, itemB]) => {
|
|
7
|
+
if (itemA.order != null && itemA.order >= 0 && itemB.order != null && itemB.order >= 0 && itemA.order !== itemB.order) {
|
|
8
|
+
if (itemA.order < itemB.order && itemAIndex > itemBIndex || itemA.order > itemB.order && itemAIndex < itemBIndex) {
|
|
9
|
+
orderChanged = true;
|
|
10
|
+
}
|
|
11
|
+
return itemA.order - itemB.order;
|
|
12
|
+
}
|
|
13
|
+
const itemAElement = itemA.element;
|
|
14
|
+
const itemBElement = itemB.element;
|
|
15
|
+
if (itemAElement === itemBElement) return 0;
|
|
16
|
+
if (!itemAElement || !itemBElement) return 0;
|
|
17
|
+
const pos = itemAElement.compareDocumentPosition(itemBElement);
|
|
18
|
+
if (pos & Node.DOCUMENT_POSITION_DISCONNECTED) return 0;
|
|
19
|
+
if (pos & Node.DOCUMENT_POSITION_FOLLOWING) {
|
|
20
|
+
if (itemAIndex > itemBIndex) {
|
|
21
|
+
orderChanged = true;
|
|
22
|
+
}
|
|
23
|
+
return -1;
|
|
24
|
+
}
|
|
25
|
+
if (itemAIndex < itemBIndex) {
|
|
26
|
+
orderChanged = true;
|
|
27
|
+
}
|
|
28
|
+
return 1;
|
|
29
|
+
});
|
|
30
|
+
if (orderChanged) {
|
|
31
|
+
return indexedItems.map(([_, item]) => item);
|
|
32
|
+
}
|
|
33
|
+
return items;
|
|
34
|
+
}
|
|
35
|
+
function useCollection({ wrap, targetWindow }) {
|
|
36
|
+
const itemsRef = useRef([]);
|
|
37
|
+
const itemMap = useRef(/* @__PURE__ */ new Map());
|
|
38
|
+
const removedItems = useRef(/* @__PURE__ */ new Map());
|
|
39
|
+
const [removalVersion, setRemovalVersion] = useState(0);
|
|
40
|
+
const getOrderedItems = useCallback(() => {
|
|
41
|
+
return sortBasedOnDOMPosition(Array.from(itemMap.current.values()));
|
|
42
|
+
}, []);
|
|
43
|
+
const getNavigableItems = useCallback(() => {
|
|
44
|
+
return getOrderedItems().filter((item) => {
|
|
45
|
+
if (item.location === "hidden") {
|
|
46
|
+
return false;
|
|
47
|
+
}
|
|
48
|
+
return !!item.element;
|
|
49
|
+
});
|
|
50
|
+
}, [getOrderedItems]);
|
|
51
|
+
const sortItems = useCallback(() => {
|
|
52
|
+
itemsRef.current = getOrderedItems();
|
|
53
|
+
}, [getOrderedItems]);
|
|
54
|
+
const getRemovedItems = useCallback(() => {
|
|
55
|
+
const items = new Map(removedItems.current);
|
|
56
|
+
removedItems.current.clear();
|
|
57
|
+
return items;
|
|
58
|
+
}, []);
|
|
59
|
+
const rafId = useRef(null);
|
|
60
|
+
const scheduleSort = useCallback(() => {
|
|
61
|
+
if (!(targetWindow == null ? void 0 : targetWindow.requestAnimationFrame)) {
|
|
62
|
+
sortItems();
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
if (rafId.current != null) {
|
|
66
|
+
targetWindow.cancelAnimationFrame(rafId.current);
|
|
67
|
+
}
|
|
68
|
+
rafId.current = targetWindow.requestAnimationFrame(() => {
|
|
69
|
+
rafId.current = null;
|
|
70
|
+
sortItems();
|
|
71
|
+
});
|
|
72
|
+
}, [sortItems, targetWindow]);
|
|
73
|
+
const registerItem = useCallback(
|
|
74
|
+
(item) => {
|
|
75
|
+
itemMap.current.set(item.id, item);
|
|
76
|
+
removedItems.current.delete(item.id);
|
|
77
|
+
scheduleSort();
|
|
78
|
+
return () => {
|
|
79
|
+
const currentItems = getOrderedItems();
|
|
80
|
+
const currentItem = itemMap.current.get(item.id) ?? item;
|
|
81
|
+
const staleIndex = currentItems.findIndex(({ id }) => id === item.id);
|
|
82
|
+
removedItems.current.set(item.id, {
|
|
83
|
+
...currentItem,
|
|
84
|
+
staleIndex
|
|
85
|
+
});
|
|
86
|
+
itemsRef.current = currentItems.filter(({ id }) => id !== item.id);
|
|
87
|
+
itemMap.current.delete(item.id);
|
|
88
|
+
setRemovalVersion((currentVersion) => currentVersion + 1);
|
|
89
|
+
};
|
|
90
|
+
},
|
|
91
|
+
[getOrderedItems, scheduleSort]
|
|
92
|
+
);
|
|
93
|
+
const updateItem = useCallback(
|
|
94
|
+
(id, updates) => {
|
|
95
|
+
const currentItem = itemMap.current.get(id);
|
|
96
|
+
if (!currentItem) {
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
let changed = false;
|
|
100
|
+
const nextItem = { ...currentItem };
|
|
101
|
+
for (const [key, nextValue] of Object.entries(updates)) {
|
|
102
|
+
const typedKey = key;
|
|
103
|
+
if (nextItem[typedKey] !== nextValue) {
|
|
104
|
+
changed = true;
|
|
105
|
+
nextItem[typedKey] = nextValue;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
if (!changed) {
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
itemMap.current.set(id, nextItem);
|
|
112
|
+
itemsRef.current = itemsRef.current.map((item) => {
|
|
113
|
+
if (item.id !== id) {
|
|
114
|
+
return item;
|
|
115
|
+
}
|
|
116
|
+
return nextItem;
|
|
117
|
+
});
|
|
118
|
+
scheduleSort();
|
|
119
|
+
},
|
|
120
|
+
[scheduleSort]
|
|
121
|
+
);
|
|
122
|
+
useEffect(() => {
|
|
123
|
+
return () => {
|
|
124
|
+
if (rafId.current != null && targetWindow) {
|
|
125
|
+
targetWindow.cancelAnimationFrame(rafId.current);
|
|
126
|
+
}
|
|
127
|
+
};
|
|
128
|
+
}, [targetWindow]);
|
|
129
|
+
return {
|
|
130
|
+
registerItem,
|
|
131
|
+
item: useCallback((id) => {
|
|
132
|
+
if (!id) return null;
|
|
133
|
+
let item = itemMap.current.get(id);
|
|
134
|
+
if (!item) {
|
|
135
|
+
item = itemsRef.current.find((item2) => item2.id === id);
|
|
136
|
+
if (item) {
|
|
137
|
+
itemMap.current.set(item.id, item);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
return item ?? null;
|
|
141
|
+
}, []),
|
|
142
|
+
getNext: useCallback(
|
|
143
|
+
(current) => {
|
|
144
|
+
const items = getNavigableItems();
|
|
145
|
+
if (items.length === 0) return null;
|
|
146
|
+
const index = items.findIndex(({ id }) => id === current);
|
|
147
|
+
if (index === -1) {
|
|
148
|
+
return items[0] ;
|
|
149
|
+
}
|
|
150
|
+
const newIndex = (index + 1) % items.length ;
|
|
151
|
+
return items[newIndex] ?? null;
|
|
152
|
+
},
|
|
153
|
+
[getNavigableItems, wrap]
|
|
154
|
+
),
|
|
155
|
+
getPrevious: useCallback(
|
|
156
|
+
(current) => {
|
|
157
|
+
const items = getNavigableItems();
|
|
158
|
+
if (items.length === 0) return null;
|
|
159
|
+
const index = items.findIndex(({ id }) => id === current);
|
|
160
|
+
if (index === -1) {
|
|
161
|
+
return items[items.length - 1] ;
|
|
162
|
+
}
|
|
163
|
+
const newIndex = (index - 1 + items.length) % items.length ;
|
|
164
|
+
return items[newIndex] ?? null;
|
|
165
|
+
},
|
|
166
|
+
[getNavigableItems, wrap]
|
|
167
|
+
),
|
|
168
|
+
getFirst: useCallback(() => {
|
|
169
|
+
return getNavigableItems()[0] ?? null;
|
|
170
|
+
}, [getNavigableItems]),
|
|
171
|
+
getLast: useCallback(() => {
|
|
172
|
+
const items = getNavigableItems();
|
|
173
|
+
return items[items.length - 1] ?? null;
|
|
174
|
+
}, [getNavigableItems]),
|
|
175
|
+
getIndex: useCallback(
|
|
176
|
+
(current) => {
|
|
177
|
+
return getNavigableItems().findIndex(({ id }) => id === current);
|
|
178
|
+
},
|
|
179
|
+
[getNavigableItems]
|
|
180
|
+
),
|
|
181
|
+
itemAt: useCallback(
|
|
182
|
+
(index) => {
|
|
183
|
+
return getNavigableItems()[index] ?? null;
|
|
184
|
+
},
|
|
185
|
+
[getNavigableItems]
|
|
186
|
+
),
|
|
187
|
+
updateItem,
|
|
188
|
+
getRemovedItems,
|
|
189
|
+
removalVersion,
|
|
190
|
+
sortItems
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
export { useCollection };
|
|
195
|
+
//# sourceMappingURL=useCollection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useCollection.js","sources":["../src/tabs/internal/registry/useCollection.ts"],"sourcesContent":["import { useCallback, useEffect, useRef, useState } from \"react\";\n\nexport interface Item {\n id: string;\n element?: HTMLElement | null;\n value: string;\n location?: \"hidden\" | \"main\" | \"overflow\";\n order?: number;\n stale?: boolean;\n}\n\ninterface StaleItem extends Item {\n staleIndex?: number;\n}\n\nfunction sortBasedOnDOMPosition(items: Item[]): Item[] {\n const indexedItems = items.map((item, index) => [index, item] as const);\n let orderChanged = false;\n indexedItems.sort(([itemAIndex, itemA], [itemBIndex, itemB]) => {\n if (\n itemA.order != null &&\n itemA.order >= 0 &&\n itemB.order != null &&\n itemB.order >= 0 &&\n itemA.order !== itemB.order\n ) {\n if (\n (itemA.order < itemB.order && itemAIndex > itemBIndex) ||\n (itemA.order > itemB.order && itemAIndex < itemBIndex)\n ) {\n orderChanged = true;\n }\n return itemA.order - itemB.order;\n }\n\n const itemAElement = itemA.element;\n const itemBElement = itemB.element;\n if (itemAElement === itemBElement) return 0;\n if (!itemAElement || !itemBElement) return 0;\n\n const pos = itemAElement.compareDocumentPosition(itemBElement);\n if (pos & Node.DOCUMENT_POSITION_DISCONNECTED) return 0;\n\n if (pos & Node.DOCUMENT_POSITION_FOLLOWING) {\n if (itemAIndex > itemBIndex) {\n orderChanged = true;\n }\n return -1;\n }\n\n if (itemAIndex < itemBIndex) {\n orderChanged = true;\n }\n return 1;\n });\n\n if (orderChanged) {\n return indexedItems.map(([_, item]) => item);\n }\n return items;\n}\n\ninterface UseCollectionProps {\n targetWindow: Window | null | undefined;\n wrap: boolean;\n}\n\nexport function useCollection({ wrap, targetWindow }: UseCollectionProps) {\n const itemsRef = useRef<Item[]>([]);\n const itemMap = useRef<Map<string, Item>>(new Map());\n const removedItems = useRef<Map<string, StaleItem>>(new Map());\n const [removalVersion, setRemovalVersion] = useState(0);\n\n const getOrderedItems = useCallback(() => {\n return sortBasedOnDOMPosition(Array.from(itemMap.current.values()));\n }, []);\n\n const getNavigableItems = useCallback(() => {\n return getOrderedItems().filter((item) => {\n if (item.location === \"hidden\") {\n return false;\n }\n\n return !!item.element;\n });\n }, [getOrderedItems]);\n\n const sortItems = useCallback(() => {\n itemsRef.current = getOrderedItems();\n }, [getOrderedItems]);\n\n const getRemovedItems = useCallback(() => {\n const items = new Map(removedItems.current);\n removedItems.current.clear();\n\n return items;\n }, []);\n\n const rafId = useRef<number | null>(null);\n\n const scheduleSort = useCallback(() => {\n if (!targetWindow?.requestAnimationFrame) {\n sortItems();\n return;\n }\n\n if (rafId.current != null) {\n targetWindow.cancelAnimationFrame(rafId.current);\n }\n\n rafId.current = targetWindow.requestAnimationFrame(() => {\n rafId.current = null;\n sortItems();\n });\n }, [sortItems, targetWindow]);\n\n const registerItem = useCallback(\n (item: Item) => {\n itemMap.current.set(item.id, item);\n removedItems.current.delete(item.id);\n scheduleSort();\n\n return () => {\n const currentItems = getOrderedItems();\n const currentItem = itemMap.current.get(item.id) ?? item;\n const staleIndex = currentItems.findIndex(({ id }) => id === item.id);\n\n removedItems.current.set(item.id, {\n ...currentItem,\n staleIndex,\n });\n\n itemsRef.current = currentItems.filter(({ id }) => id !== item.id);\n itemMap.current.delete(item.id);\n setRemovalVersion((currentVersion) => currentVersion + 1);\n };\n },\n [getOrderedItems, scheduleSort],\n );\n\n const updateItem = useCallback(\n (id: string, updates: Partial<Omit<Item, \"id\" | \"value\">>) => {\n const currentItem = itemMap.current.get(id);\n if (!currentItem) {\n return;\n }\n\n let changed = false;\n const nextItem = { ...currentItem };\n\n for (const [key, nextValue] of Object.entries(updates)) {\n const typedKey = key as keyof Omit<Item, \"id\" | \"value\">;\n if (nextItem[typedKey] !== nextValue) {\n changed = true;\n nextItem[typedKey] = nextValue as never;\n }\n }\n\n if (!changed) {\n return;\n }\n\n itemMap.current.set(id, nextItem);\n itemsRef.current = itemsRef.current.map((item) => {\n if (item.id !== id) {\n return item;\n }\n\n return nextItem;\n });\n scheduleSort();\n },\n [scheduleSort],\n );\n\n useEffect(() => {\n return () => {\n if (rafId.current != null && targetWindow) {\n targetWindow.cancelAnimationFrame(rafId.current);\n }\n };\n }, [targetWindow]);\n\n return {\n registerItem,\n item: useCallback((id?: string | null): Item | null => {\n if (!id) return null;\n let item = itemMap.current.get(id);\n if (!item) {\n item = itemsRef.current.find((item) => item.id === id);\n if (item) {\n itemMap.current.set(item.id, item);\n }\n }\n return item ?? null;\n }, []),\n getNext: useCallback(\n (current: string): Item | null => {\n const items = getNavigableItems();\n if (items.length === 0) return null;\n\n const index = items.findIndex(({ id }) => id === current);\n\n if (index === -1) {\n return wrap ? items[0] : null;\n }\n\n const newIndex = wrap\n ? (index + 1) % items.length\n : Math.min(index + 1, items.length - 1);\n\n return items[newIndex] ?? null;\n },\n [getNavigableItems, wrap],\n ),\n getPrevious: useCallback(\n (current: string): Item | null => {\n const items = getNavigableItems();\n if (items.length === 0) return null;\n\n const index = items.findIndex(({ id }) => id === current);\n\n if (index === -1) {\n return wrap ? items[items.length - 1] : null;\n }\n\n const newIndex = wrap\n ? (index - 1 + items.length) % items.length\n : Math.max(index - 1, 0);\n\n return items[newIndex] ?? null;\n },\n [getNavigableItems, wrap],\n ),\n getFirst: useCallback((): Item | null => {\n return getNavigableItems()[0] ?? null;\n }, [getNavigableItems]),\n getLast: useCallback((): Item | null => {\n const items = getNavigableItems();\n return items[items.length - 1] ?? null;\n }, [getNavigableItems]),\n getIndex: useCallback(\n (current: string): number => {\n return getNavigableItems().findIndex(({ id }) => id === current);\n },\n [getNavigableItems],\n ),\n itemAt: useCallback(\n (index: number): Item | null => {\n return getNavigableItems()[index] ?? null;\n },\n [getNavigableItems],\n ),\n updateItem,\n getRemovedItems,\n removalVersion,\n sortItems,\n };\n}\n"],"names":["item"],"mappings":"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"}
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
import { useState, useCallback, useMemo } from 'react';
|
|
2
|
+
import 'clsx';
|
|
3
|
+
import 'react/jsx-runtime';
|
|
4
|
+
import { useIsomorphicLayoutEffect } from '../../../utils/useIsomorphicLayoutEffect.js';
|
|
5
|
+
import '../../../utils/useFloatingUI/useFloatingUI.js';
|
|
6
|
+
import '../../../utils/useId.js';
|
|
7
|
+
import '../../../salt-provider/SaltProvider.js';
|
|
8
|
+
import '../../../viewport/ViewportProvider.js';
|
|
9
|
+
import { getMeasuredWidth } from '../overflow/widthMeasurement.js';
|
|
10
|
+
|
|
11
|
+
function sortRenderedTabs(tabs) {
|
|
12
|
+
return [...tabs].sort((tabA, tabB) => {
|
|
13
|
+
if (tabA.marker === tabB.marker) {
|
|
14
|
+
return 0;
|
|
15
|
+
}
|
|
16
|
+
if (!tabA.marker || !tabB.marker) {
|
|
17
|
+
return 0;
|
|
18
|
+
}
|
|
19
|
+
const position = tabA.marker.compareDocumentPosition(tabB.marker);
|
|
20
|
+
if (position & Node.DOCUMENT_POSITION_FOLLOWING) {
|
|
21
|
+
return -1;
|
|
22
|
+
}
|
|
23
|
+
if (position & Node.DOCUMENT_POSITION_PRECEDING) {
|
|
24
|
+
return 1;
|
|
25
|
+
}
|
|
26
|
+
return 0;
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
function useRenderedTabsRegistry() {
|
|
30
|
+
const [renderedTabMap, setRenderedTabMap] = useState(
|
|
31
|
+
() => /* @__PURE__ */ new Map()
|
|
32
|
+
);
|
|
33
|
+
const [renderMode, setRenderMode] = useState("inline");
|
|
34
|
+
const [bootstrapTabs, setBootstrapTabs] = useState(() => /* @__PURE__ */ new Set());
|
|
35
|
+
const [readyBootstrapTabs, setReadyBootstrapTabs] = useState(
|
|
36
|
+
() => /* @__PURE__ */ new Set()
|
|
37
|
+
);
|
|
38
|
+
const [bootstrapOverflowReady, setBootstrapOverflowReadyState] = useState(false);
|
|
39
|
+
const registerBootstrapTab = useCallback((tabValue) => {
|
|
40
|
+
setBootstrapTabs((currentTabs) => {
|
|
41
|
+
if (currentTabs.has(tabValue)) {
|
|
42
|
+
return currentTabs;
|
|
43
|
+
}
|
|
44
|
+
const nextTabs = new Set(currentTabs);
|
|
45
|
+
nextTabs.add(tabValue);
|
|
46
|
+
return nextTabs;
|
|
47
|
+
});
|
|
48
|
+
return () => {
|
|
49
|
+
setBootstrapTabs((currentTabs) => {
|
|
50
|
+
if (!currentTabs.has(tabValue)) {
|
|
51
|
+
return currentTabs;
|
|
52
|
+
}
|
|
53
|
+
const nextTabs = new Set(currentTabs);
|
|
54
|
+
nextTabs.delete(tabValue);
|
|
55
|
+
return nextTabs;
|
|
56
|
+
});
|
|
57
|
+
setReadyBootstrapTabs((currentTabs) => {
|
|
58
|
+
if (!currentTabs.has(tabValue)) {
|
|
59
|
+
return currentTabs;
|
|
60
|
+
}
|
|
61
|
+
const nextTabs = new Set(currentTabs);
|
|
62
|
+
nextTabs.delete(tabValue);
|
|
63
|
+
return nextTabs;
|
|
64
|
+
});
|
|
65
|
+
};
|
|
66
|
+
}, []);
|
|
67
|
+
const setBootstrapTabReady = useCallback(
|
|
68
|
+
(tabValue, ready) => {
|
|
69
|
+
setReadyBootstrapTabs((currentTabs) => {
|
|
70
|
+
const hasTab = currentTabs.has(tabValue);
|
|
71
|
+
if (ready === hasTab) {
|
|
72
|
+
return currentTabs;
|
|
73
|
+
}
|
|
74
|
+
const nextTabs = new Set(currentTabs);
|
|
75
|
+
if (ready) {
|
|
76
|
+
nextTabs.add(tabValue);
|
|
77
|
+
} else {
|
|
78
|
+
nextTabs.delete(tabValue);
|
|
79
|
+
}
|
|
80
|
+
return nextTabs;
|
|
81
|
+
});
|
|
82
|
+
},
|
|
83
|
+
[]
|
|
84
|
+
);
|
|
85
|
+
const setBootstrapOverflowReady = useCallback((ready) => {
|
|
86
|
+
setBootstrapOverflowReadyState((currentReady) => {
|
|
87
|
+
if (currentReady === ready) {
|
|
88
|
+
return currentReady;
|
|
89
|
+
}
|
|
90
|
+
return ready;
|
|
91
|
+
});
|
|
92
|
+
}, []);
|
|
93
|
+
useIsomorphicLayoutEffect(() => {
|
|
94
|
+
if (renderMode === "portal" || bootstrapTabs.size < 1) {
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
if (!bootstrapOverflowReady) {
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
for (const tabValue of bootstrapTabs) {
|
|
101
|
+
if (!readyBootstrapTabs.has(tabValue)) {
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
const renderedTab = renderedTabMap.get(tabValue);
|
|
105
|
+
if (!renderedTab || getMeasuredWidth(renderedTab.root) <= 0) {
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
setRenderMode("portal");
|
|
110
|
+
}, [
|
|
111
|
+
bootstrapOverflowReady,
|
|
112
|
+
bootstrapTabs,
|
|
113
|
+
readyBootstrapTabs,
|
|
114
|
+
renderMode,
|
|
115
|
+
renderedTabMap
|
|
116
|
+
]);
|
|
117
|
+
const registerRenderedTab = useCallback((tab) => {
|
|
118
|
+
setRenderedTabMap((map) => {
|
|
119
|
+
const existing = map.get(tab.value);
|
|
120
|
+
if (process.env.NODE_ENV !== "production" && existing && existing.id !== tab.id) {
|
|
121
|
+
console.warn(
|
|
122
|
+
`Tabs received duplicate tab value "${tab.value}". Tab values must be unique within a Tabs instance.`
|
|
123
|
+
);
|
|
124
|
+
}
|
|
125
|
+
if (existing === tab) {
|
|
126
|
+
return map;
|
|
127
|
+
}
|
|
128
|
+
const next = new Map(map);
|
|
129
|
+
next.set(tab.value, tab);
|
|
130
|
+
return next;
|
|
131
|
+
});
|
|
132
|
+
return () => {
|
|
133
|
+
setRenderedTabMap((map) => {
|
|
134
|
+
const existing = map.get(tab.value);
|
|
135
|
+
if (!existing || existing.id !== tab.id) {
|
|
136
|
+
return map;
|
|
137
|
+
}
|
|
138
|
+
const next = new Map(map);
|
|
139
|
+
next.delete(tab.value);
|
|
140
|
+
return next;
|
|
141
|
+
});
|
|
142
|
+
};
|
|
143
|
+
}, []);
|
|
144
|
+
const updateRenderedTab = useCallback(
|
|
145
|
+
(value, updates) => {
|
|
146
|
+
setRenderedTabMap((map) => {
|
|
147
|
+
const existing = map.get(value);
|
|
148
|
+
if (!existing) {
|
|
149
|
+
return map;
|
|
150
|
+
}
|
|
151
|
+
let changed = false;
|
|
152
|
+
const nextRecord = { ...existing };
|
|
153
|
+
for (const [key, nextValue] of Object.entries(updates)) {
|
|
154
|
+
const typedKey = key;
|
|
155
|
+
if (nextRecord[typedKey] !== nextValue) {
|
|
156
|
+
changed = true;
|
|
157
|
+
nextRecord[typedKey] = nextValue;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
if (!changed) {
|
|
161
|
+
return map;
|
|
162
|
+
}
|
|
163
|
+
const next = new Map(map);
|
|
164
|
+
next.set(value, nextRecord);
|
|
165
|
+
return next;
|
|
166
|
+
});
|
|
167
|
+
},
|
|
168
|
+
[]
|
|
169
|
+
);
|
|
170
|
+
const getRenderedTab = useCallback(
|
|
171
|
+
(value) => {
|
|
172
|
+
return renderedTabMap.get(value);
|
|
173
|
+
},
|
|
174
|
+
[renderedTabMap]
|
|
175
|
+
);
|
|
176
|
+
const renderedTabs = useMemo(() => {
|
|
177
|
+
return sortRenderedTabs(Array.from(renderedTabMap.values()));
|
|
178
|
+
}, [renderedTabMap]);
|
|
179
|
+
const renderedTabOrderMap = useMemo(() => {
|
|
180
|
+
return new Map(
|
|
181
|
+
renderedTabs.map((tab, index) => [tab.value, index])
|
|
182
|
+
);
|
|
183
|
+
}, [renderedTabs]);
|
|
184
|
+
const getRenderedTabOrder = useCallback(
|
|
185
|
+
(value) => {
|
|
186
|
+
return renderedTabOrderMap.get(value) ?? -1;
|
|
187
|
+
},
|
|
188
|
+
[renderedTabOrderMap]
|
|
189
|
+
);
|
|
190
|
+
return {
|
|
191
|
+
renderMode,
|
|
192
|
+
registerBootstrapTab,
|
|
193
|
+
setBootstrapTabReady,
|
|
194
|
+
setBootstrapOverflowReady,
|
|
195
|
+
registerRenderedTab,
|
|
196
|
+
updateRenderedTab,
|
|
197
|
+
getRenderedTab,
|
|
198
|
+
getRenderedTabOrder,
|
|
199
|
+
renderedTabs
|
|
200
|
+
};
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
export { useRenderedTabsRegistry };
|
|
204
|
+
//# sourceMappingURL=useRenderedTabsRegistry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useRenderedTabsRegistry.js","sources":["../src/tabs/internal/registry/useRenderedTabsRegistry.ts"],"sourcesContent":["import { useCallback, useMemo, useState } from \"react\";\nimport { useIsomorphicLayoutEffect } from \"../../../utils\";\nimport type { RenderedTab, TabsRenderMode } from \"../contexts/TabsContext\";\nimport { getMeasuredWidth } from \"../overflow/widthMeasurement\";\n\nfunction sortRenderedTabs(tabs: RenderedTab[]) {\n return [...tabs].sort((tabA, tabB) => {\n if (tabA.marker === tabB.marker) {\n return 0;\n }\n if (!tabA.marker || !tabB.marker) {\n return 0;\n }\n\n const position = tabA.marker.compareDocumentPosition(tabB.marker);\n if (position & Node.DOCUMENT_POSITION_FOLLOWING) {\n return -1;\n }\n if (position & Node.DOCUMENT_POSITION_PRECEDING) {\n return 1;\n }\n return 0;\n });\n}\n\nexport function useRenderedTabsRegistry() {\n const [renderedTabMap, setRenderedTabMap] = useState(\n () => new Map<string, RenderedTab>(),\n );\n const [renderMode, setRenderMode] = useState<TabsRenderMode>(\"inline\");\n const [bootstrapTabs, setBootstrapTabs] = useState(() => new Set<string>());\n const [readyBootstrapTabs, setReadyBootstrapTabs] = useState(\n () => new Set<string>(),\n );\n const [bootstrapOverflowReady, setBootstrapOverflowReadyState] =\n useState(false);\n\n const registerBootstrapTab = useCallback((tabValue: string) => {\n setBootstrapTabs((currentTabs) => {\n if (currentTabs.has(tabValue)) {\n return currentTabs;\n }\n\n const nextTabs = new Set(currentTabs);\n nextTabs.add(tabValue);\n return nextTabs;\n });\n\n return () => {\n setBootstrapTabs((currentTabs) => {\n if (!currentTabs.has(tabValue)) {\n return currentTabs;\n }\n\n const nextTabs = new Set(currentTabs);\n nextTabs.delete(tabValue);\n return nextTabs;\n });\n setReadyBootstrapTabs((currentTabs) => {\n if (!currentTabs.has(tabValue)) {\n return currentTabs;\n }\n\n const nextTabs = new Set(currentTabs);\n nextTabs.delete(tabValue);\n return nextTabs;\n });\n };\n }, []);\n\n const setBootstrapTabReady = useCallback(\n (tabValue: string, ready: boolean) => {\n setReadyBootstrapTabs((currentTabs) => {\n const hasTab = currentTabs.has(tabValue);\n if (ready === hasTab) {\n return currentTabs;\n }\n\n const nextTabs = new Set(currentTabs);\n if (ready) {\n nextTabs.add(tabValue);\n } else {\n nextTabs.delete(tabValue);\n }\n return nextTabs;\n });\n },\n [],\n );\n\n const setBootstrapOverflowReady = useCallback((ready: boolean) => {\n setBootstrapOverflowReadyState((currentReady) => {\n if (currentReady === ready) {\n return currentReady;\n }\n\n return ready;\n });\n }, []);\n\n useIsomorphicLayoutEffect(() => {\n if (renderMode === \"portal\" || bootstrapTabs.size < 1) {\n return;\n }\n\n if (!bootstrapOverflowReady) {\n return;\n }\n\n for (const tabValue of bootstrapTabs) {\n if (!readyBootstrapTabs.has(tabValue)) {\n return;\n }\n\n const renderedTab = renderedTabMap.get(tabValue);\n if (!renderedTab || getMeasuredWidth(renderedTab.root) <= 0) {\n return;\n }\n }\n\n setRenderMode(\"portal\");\n }, [\n bootstrapOverflowReady,\n bootstrapTabs,\n readyBootstrapTabs,\n renderMode,\n renderedTabMap,\n ]);\n\n const registerRenderedTab = useCallback((tab: RenderedTab) => {\n setRenderedTabMap((map) => {\n const existing = map.get(tab.value);\n if (\n process.env.NODE_ENV !== \"production\" &&\n existing &&\n existing.id !== tab.id\n ) {\n console.warn(\n `Tabs received duplicate tab value \"${tab.value}\". Tab values must be unique within a Tabs instance.`,\n );\n }\n\n if (existing === tab) {\n return map;\n }\n\n const next = new Map(map);\n next.set(tab.value, tab);\n return next;\n });\n\n return () => {\n setRenderedTabMap((map) => {\n const existing = map.get(tab.value);\n if (!existing || existing.id !== tab.id) {\n return map;\n }\n\n const next = new Map(map);\n next.delete(tab.value);\n return next;\n });\n };\n }, []);\n\n const updateRenderedTab = useCallback(\n (value: string, updates: Partial<Omit<RenderedTab, \"value\">>) => {\n setRenderedTabMap((map) => {\n const existing = map.get(value);\n if (!existing) {\n return map;\n }\n\n let changed = false;\n const nextRecord = { ...existing };\n for (const [key, nextValue] of Object.entries(updates)) {\n const typedKey = key as keyof Omit<RenderedTab, \"value\">;\n if (nextRecord[typedKey] !== nextValue) {\n changed = true;\n nextRecord[typedKey] = nextValue as never;\n }\n }\n\n if (!changed) {\n return map;\n }\n\n const next = new Map(map);\n next.set(value, nextRecord);\n return next;\n });\n },\n [],\n );\n\n const getRenderedTab = useCallback(\n (value: string) => {\n return renderedTabMap.get(value);\n },\n [renderedTabMap],\n );\n\n const renderedTabs = useMemo(() => {\n return sortRenderedTabs(Array.from(renderedTabMap.values()));\n }, [renderedTabMap]);\n\n const renderedTabOrderMap = useMemo(() => {\n return new Map(\n renderedTabs.map((tab, index) => [tab.value, index] as const),\n );\n }, [renderedTabs]);\n\n const getRenderedTabOrder = useCallback(\n (value: string) => {\n return renderedTabOrderMap.get(value) ?? -1;\n },\n [renderedTabOrderMap],\n );\n\n return {\n renderMode,\n registerBootstrapTab,\n setBootstrapTabReady,\n setBootstrapOverflowReady,\n registerRenderedTab,\n updateRenderedTab,\n getRenderedTab,\n getRenderedTabOrder,\n renderedTabs,\n };\n}\n"],"names":[],"mappings":";;;;;;;;;;AAKA,SAAS,iBAAiB,IAAA,EAAqB;AAC7C,EAAA,OAAO,CAAC,GAAG,IAAI,EAAE,IAAA,CAAK,CAAC,MAAM,IAAA,KAAS;AACpC,IAAA,IAAI,IAAA,CAAK,MAAA,KAAW,IAAA,CAAK,MAAA,EAAQ;AAC/B,MAAA,OAAO,CAAA;AAAA,IACT;AACA,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,IAAU,CAAC,KAAK,MAAA,EAAQ;AAChC,MAAA,OAAO,CAAA;AAAA,IACT;AAEA,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,MAAA,CAAO,uBAAA,CAAwB,KAAK,MAAM,CAAA;AAChE,IAAA,IAAI,QAAA,GAAW,KAAK,2BAAA,EAA6B;AAC/C,MAAA,OAAO,EAAA;AAAA,IACT;AACA,IAAA,IAAI,QAAA,GAAW,KAAK,2BAAA,EAA6B;AAC/C,MAAA,OAAO,CAAA;AAAA,IACT;AACA,IAAA,OAAO,CAAA;AAAA,EACT,CAAC,CAAA;AACH;AAEO,SAAS,uBAAA,GAA0B;AACxC,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAI,QAAA;AAAA,IAC1C,0BAAU,GAAA;AAAyB,GACrC;AACA,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAI,SAAyB,QAAQ,CAAA;AACrE,EAAA,MAAM,CAAC,eAAe,gBAAgB,CAAA,GAAI,SAAS,sBAAM,IAAI,KAAa,CAAA;AAC1E,EAAA,MAAM,CAAC,kBAAA,EAAoB,qBAAqB,CAAA,GAAI,QAAA;AAAA,IAClD,0BAAU,GAAA;AAAY,GACxB;AACA,EAAA,MAAM,CAAC,sBAAA,EAAwB,8BAA8B,CAAA,GAC3D,SAAS,KAAK,CAAA;AAEhB,EAAA,MAAM,oBAAA,GAAuB,WAAA,CAAY,CAAC,QAAA,KAAqB;AAC7D,IAAA,gBAAA,CAAiB,CAAC,WAAA,KAAgB;AAChC,MAAA,IAAI,WAAA,CAAY,GAAA,CAAI,QAAQ,CAAA,EAAG;AAC7B,QAAA,OAAO,WAAA;AAAA,MACT;AAEA,MAAA,MAAM,QAAA,GAAW,IAAI,GAAA,CAAI,WAAW,CAAA;AACpC,MAAA,QAAA,CAAS,IAAI,QAAQ,CAAA;AACrB,MAAA,OAAO,QAAA;AAAA,IACT,CAAC,CAAA;AAED,IAAA,OAAO,MAAM;AACX,MAAA,gBAAA,CAAiB,CAAC,WAAA,KAAgB;AAChC,QAAA,IAAI,CAAC,WAAA,CAAY,GAAA,CAAI,QAAQ,CAAA,EAAG;AAC9B,UAAA,OAAO,WAAA;AAAA,QACT;AAEA,QAAA,MAAM,QAAA,GAAW,IAAI,GAAA,CAAI,WAAW,CAAA;AACpC,QAAA,QAAA,CAAS,OAAO,QAAQ,CAAA;AACxB,QAAA,OAAO,QAAA;AAAA,MACT,CAAC,CAAA;AACD,MAAA,qBAAA,CAAsB,CAAC,WAAA,KAAgB;AACrC,QAAA,IAAI,CAAC,WAAA,CAAY,GAAA,CAAI,QAAQ,CAAA,EAAG;AAC9B,UAAA,OAAO,WAAA;AAAA,QACT;AAEA,QAAA,MAAM,QAAA,GAAW,IAAI,GAAA,CAAI,WAAW,CAAA;AACpC,QAAA,QAAA,CAAS,OAAO,QAAQ,CAAA;AACxB,QAAA,OAAO,QAAA;AAAA,MACT,CAAC,CAAA;AAAA,IACH,CAAA;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,oBAAA,GAAuB,WAAA;AAAA,IAC3B,CAAC,UAAkB,KAAA,KAAmB;AACpC,MAAA,qBAAA,CAAsB,CAAC,WAAA,KAAgB;AACrC,QAAA,MAAM,MAAA,GAAS,WAAA,CAAY,GAAA,CAAI,QAAQ,CAAA;AACvC,QAAA,IAAI,UAAU,MAAA,EAAQ;AACpB,UAAA,OAAO,WAAA;AAAA,QACT;AAEA,QAAA,MAAM,QAAA,GAAW,IAAI,GAAA,CAAI,WAAW,CAAA;AACpC,QAAA,IAAI,KAAA,EAAO;AACT,UAAA,QAAA,CAAS,IAAI,QAAQ,CAAA;AAAA,QACvB,CAAA,MAAO;AACL,UAAA,QAAA,CAAS,OAAO,QAAQ,CAAA;AAAA,QAC1B;AACA,QAAA,OAAO,QAAA;AAAA,MACT,CAAC,CAAA;AAAA,IACH,CAAA;AAAA,IACA;AAAC,GACH;AAEA,EAAA,MAAM,yBAAA,GAA4B,WAAA,CAAY,CAAC,KAAA,KAAmB;AAChE,IAAA,8BAAA,CAA+B,CAAC,YAAA,KAAiB;AAC/C,MAAA,IAAI,iBAAiB,KAAA,EAAO;AAC1B,QAAA,OAAO,YAAA;AAAA,MACT;AAEA,MAAA,OAAO,KAAA;AAAA,IACT,CAAC,CAAA;AAAA,EACH,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,yBAAA,CAA0B,MAAM;AAC9B,IAAA,IAAI,UAAA,KAAe,QAAA,IAAY,aAAA,CAAc,IAAA,GAAO,CAAA,EAAG;AACrD,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,CAAC,sBAAA,EAAwB;AAC3B,MAAA;AAAA,IACF;AAEA,IAAA,KAAA,MAAW,YAAY,aAAA,EAAe;AACpC,MAAA,IAAI,CAAC,kBAAA,CAAmB,GAAA,CAAI,QAAQ,CAAA,EAAG;AACrC,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,WAAA,GAAc,cAAA,CAAe,GAAA,CAAI,QAAQ,CAAA;AAC/C,MAAA,IAAI,CAAC,WAAA,IAAe,gBAAA,CAAiB,WAAA,CAAY,IAAI,KAAK,CAAA,EAAG;AAC3D,QAAA;AAAA,MACF;AAAA,IACF;AAEA,IAAA,aAAA,CAAc,QAAQ,CAAA;AAAA,EACxB,CAAA,EAAG;AAAA,IACD,sBAAA;AAAA,IACA,aAAA;AAAA,IACA,kBAAA;AAAA,IACA,UAAA;AAAA,IACA;AAAA,GACD,CAAA;AAED,EAAA,MAAM,mBAAA,GAAsB,WAAA,CAAY,CAAC,GAAA,KAAqB;AAC5D,IAAA,iBAAA,CAAkB,CAAC,GAAA,KAAQ;AACzB,MAAA,MAAM,QAAA,GAAW,GAAA,CAAI,GAAA,CAAI,GAAA,CAAI,KAAK,CAAA;AAClC,MAAA,IACE,OAAA,CAAQ,IAAI,QAAA,KAAa,YAAA,IACzB,YACA,QAAA,CAAS,EAAA,KAAO,IAAI,EAAA,EACpB;AACA,QAAA,OAAA,CAAQ,IAAA;AAAA,UACN,CAAA,mCAAA,EAAsC,IAAI,KAAK,CAAA,oDAAA;AAAA,SACjD;AAAA,MACF;AAEA,MAAA,IAAI,aAAa,GAAA,EAAK;AACpB,QAAA,OAAO,GAAA;AAAA,MACT;AAEA,MAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,GAAG,CAAA;AACxB,MAAA,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,KAAA,EAAO,GAAG,CAAA;AACvB,MAAA,OAAO,IAAA;AAAA,IACT,CAAC,CAAA;AAED,IAAA,OAAO,MAAM;AACX,MAAA,iBAAA,CAAkB,CAAC,GAAA,KAAQ;AACzB,QAAA,MAAM,QAAA,GAAW,GAAA,CAAI,GAAA,CAAI,GAAA,CAAI,KAAK,CAAA;AAClC,QAAA,IAAI,CAAC,QAAA,IAAY,QAAA,CAAS,EAAA,KAAO,IAAI,EAAA,EAAI;AACvC,UAAA,OAAO,GAAA;AAAA,QACT;AAEA,QAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,GAAG,CAAA;AACxB,QAAA,IAAA,CAAK,MAAA,CAAO,IAAI,KAAK,CAAA;AACrB,QAAA,OAAO,IAAA;AAAA,MACT,CAAC,CAAA;AAAA,IACH,CAAA;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,iBAAA,GAAoB,WAAA;AAAA,IACxB,CAAC,OAAe,OAAA,KAAiD;AAC/D,MAAA,iBAAA,CAAkB,CAAC,GAAA,KAAQ;AACzB,QAAA,MAAM,QAAA,GAAW,GAAA,CAAI,GAAA,CAAI,KAAK,CAAA;AAC9B,QAAA,IAAI,CAAC,QAAA,EAAU;AACb,UAAA,OAAO,GAAA;AAAA,QACT;AAEA,QAAA,IAAI,OAAA,GAAU,KAAA;AACd,QAAA,MAAM,UAAA,GAAa,EAAE,GAAG,QAAA,EAAS;AACjC,QAAA,KAAA,MAAW,CAAC,GAAA,EAAK,SAAS,KAAK,MAAA,CAAO,OAAA,CAAQ,OAAO,CAAA,EAAG;AACtD,UAAA,MAAM,QAAA,GAAW,GAAA;AACjB,UAAA,IAAI,UAAA,CAAW,QAAQ,CAAA,KAAM,SAAA,EAAW;AACtC,YAAA,OAAA,GAAU,IAAA;AACV,YAAA,UAAA,CAAW,QAAQ,CAAA,GAAI,SAAA;AAAA,UACzB;AAAA,QACF;AAEA,QAAA,IAAI,CAAC,OAAA,EAAS;AACZ,UAAA,OAAO,GAAA;AAAA,QACT;AAEA,QAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,GAAG,CAAA;AACxB,QAAA,IAAA,CAAK,GAAA,CAAI,OAAO,UAAU,CAAA;AAC1B,QAAA,OAAO,IAAA;AAAA,MACT,CAAC,CAAA;AAAA,IACH,CAAA;AAAA,IACA;AAAC,GACH;AAEA,EAAA,MAAM,cAAA,GAAiB,WAAA;AAAA,IACrB,CAAC,KAAA,KAAkB;AACjB,MAAA,OAAO,cAAA,CAAe,IAAI,KAAK,CAAA;AAAA,IACjC,CAAA;AAAA,IACA,CAAC,cAAc;AAAA,GACjB;AAEA,EAAA,MAAM,YAAA,GAAe,QAAQ,MAAM;AACjC,IAAA,OAAO,iBAAiB,KAAA,CAAM,IAAA,CAAK,cAAA,CAAe,MAAA,EAAQ,CAAC,CAAA;AAAA,EAC7D,CAAA,EAAG,CAAC,cAAc,CAAC,CAAA;AAEnB,EAAA,MAAM,mBAAA,GAAsB,QAAQ,MAAM;AACxC,IAAA,OAAO,IAAI,GAAA;AAAA,MACT,YAAA,CAAa,IAAI,CAAC,GAAA,EAAK,UAAU,CAAC,GAAA,CAAI,KAAA,EAAO,KAAK,CAAU;AAAA,KAC9D;AAAA,EACF,CAAA,EAAG,CAAC,YAAY,CAAC,CAAA;AAEjB,EAAA,MAAM,mBAAA,GAAsB,WAAA;AAAA,IAC1B,CAAC,KAAA,KAAkB;AACjB,MAAA,OAAO,mBAAA,CAAoB,GAAA,CAAI,KAAK,CAAA,IAAK,EAAA;AAAA,IAC3C,CAAA;AAAA,IACA,CAAC,mBAAmB;AAAA,GACtB;AAEA,EAAA,OAAO;AAAA,IACL,UAAA;AAAA,IACA,oBAAA;AAAA,IACA,oBAAA;AAAA,IACA,yBAAA;AAAA,IACA,mBAAA;AAAA,IACA,iBAAA;AAAA,IACA,cAAA;AAAA,IACA,mBAAA;AAAA,IACA;AAAA,GACF;AACF;;;;"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
function isHTMLElement(node) {
|
|
2
|
+
if (!node || typeof node !== "object") {
|
|
3
|
+
return false;
|
|
4
|
+
}
|
|
5
|
+
const ownerDocument = node.ownerDocument;
|
|
6
|
+
const defaultView = ownerDocument == null ? void 0 : ownerDocument.defaultView;
|
|
7
|
+
return !!defaultView && node instanceof defaultView.HTMLElement;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export { isHTMLElement };
|
|
11
|
+
//# sourceMappingURL=domUtils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"domUtils.js","sources":["../src/tabs/internal/utils/domUtils.ts"],"sourcesContent":["export function isHTMLElement(node: unknown): node is HTMLElement {\n if (!node || typeof node !== \"object\") {\n return false;\n }\n\n const ownerDocument = (node as { ownerDocument?: Document | null })\n .ownerDocument;\n const defaultView = ownerDocument?.defaultView;\n\n return !!defaultView && node instanceof defaultView.HTMLElement;\n}\n"],"names":[],"mappings":"AAAO,SAAS,cAAc,IAAA,EAAoC;AAChE,EAAA,IAAI,CAAC,IAAA,IAAQ,OAAO,IAAA,KAAS,QAAA,EAAU;AACrC,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,MAAM,gBAAiB,IAAA,CACpB,aAAA;AACH,EAAA,MAAM,cAAc,aAAA,IAAA,IAAA,GAAA,MAAA,GAAA,aAAA,CAAe,WAAA;AAEnC,EAAA,OAAO,CAAC,CAAC,WAAA,IAAe,IAAA,YAAgB,WAAA,CAAY,WAAA;AACtD;;;;"}
|
package/dist-types/index.d.ts
CHANGED
|
@@ -42,6 +42,7 @@ export * from "./parent-child-layout";
|
|
|
42
42
|
export * from "./pill";
|
|
43
43
|
export * from "./progress";
|
|
44
44
|
export * from "./radio-button";
|
|
45
|
+
export * from "./rating";
|
|
45
46
|
/**
|
|
46
47
|
* Defines the components that support useClassNameInjection via module augmentation of @salt-ds/styles ComponentPropsMap
|
|
47
48
|
*/
|
|
@@ -60,6 +61,7 @@ export * from "./status-indicator";
|
|
|
60
61
|
export * from "./stepper";
|
|
61
62
|
export * from "./switch";
|
|
62
63
|
export * from "./table";
|
|
64
|
+
export * from "./tabs";
|
|
63
65
|
export * from "./tag";
|
|
64
66
|
export * from "./text";
|
|
65
67
|
export * from "./theme";
|