overflow-toolbar 0.1.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.
Files changed (87) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +258 -0
  3. package/dist/components/MuiOverflow/MuiOverflow.d.ts +4 -0
  4. package/dist/components/MuiOverflow/MuiOverflow.d.ts.map +1 -0
  5. package/dist/components/MuiOverflow/MuiOverflow.js +7 -0
  6. package/dist/components/MuiOverflow/MuiOverflow.js.map +1 -0
  7. package/dist/components/MuiOverflow/MuiOverflowItem.d.ts +12 -0
  8. package/dist/components/MuiOverflow/MuiOverflowItem.d.ts.map +1 -0
  9. package/dist/components/MuiOverflow/MuiOverflowItem.js +12 -0
  10. package/dist/components/MuiOverflow/MuiOverflowItem.js.map +1 -0
  11. package/dist/components/MuiOverflow/MuiOverflowMenu.d.ts +11 -0
  12. package/dist/components/MuiOverflow/MuiOverflowMenu.d.ts.map +1 -0
  13. package/dist/components/MuiOverflow/MuiOverflowMenu.js +11 -0
  14. package/dist/components/MuiOverflow/MuiOverflowMenu.js.map +1 -0
  15. package/dist/components/MuiOverflow/index.d.ts +4 -0
  16. package/dist/components/MuiOverflow/index.d.ts.map +1 -0
  17. package/dist/components/NoFrameworkOverflow/NoFrameworkOverflow.d.ts +22 -0
  18. package/dist/components/NoFrameworkOverflow/NoFrameworkOverflow.d.ts.map +1 -0
  19. package/dist/components/NoFrameworkOverflow/NoFrameworkOverflow.js +79 -0
  20. package/dist/components/NoFrameworkOverflow/NoFrameworkOverflow.js.map +1 -0
  21. package/dist/components/NoFrameworkOverflow/index.d.ts +3 -0
  22. package/dist/components/NoFrameworkOverflow/index.d.ts.map +1 -0
  23. package/dist/components/NoFrameworkOverflow/noframework.css +110 -0
  24. package/dist/components/Overflow/Overflow.css +1 -0
  25. package/dist/components/Overflow/Overflow.d.ts +12 -0
  26. package/dist/components/Overflow/Overflow.d.ts.map +1 -0
  27. package/dist/components/Overflow/Overflow.js +34 -0
  28. package/dist/components/Overflow/Overflow.js.map +1 -0
  29. package/dist/components/Overflow/OverflowContext.d.ts +7 -0
  30. package/dist/components/Overflow/OverflowContext.d.ts.map +1 -0
  31. package/dist/components/Overflow/OverflowContext.js +13 -0
  32. package/dist/components/Overflow/OverflowContext.js.map +1 -0
  33. package/dist/components/Overflow/OverflowController.d.ts +50 -0
  34. package/dist/components/Overflow/OverflowController.d.ts.map +1 -0
  35. package/dist/components/Overflow/OverflowController.js +146 -0
  36. package/dist/components/Overflow/OverflowController.js.map +1 -0
  37. package/dist/components/Overflow/OverflowItem.d.ts +12 -0
  38. package/dist/components/Overflow/OverflowItem.d.ts.map +1 -0
  39. package/dist/components/Overflow/OverflowItem.js +17 -0
  40. package/dist/components/Overflow/OverflowItem.js.map +1 -0
  41. package/dist/components/Overflow/OverflowMenu.d.ts +18 -0
  42. package/dist/components/Overflow/OverflowMenu.d.ts.map +1 -0
  43. package/dist/components/Overflow/OverflowMenu.js +36 -0
  44. package/dist/components/Overflow/OverflowMenu.js.map +1 -0
  45. package/dist/components/Overflow/index.d.ts +10 -0
  46. package/dist/components/Overflow/index.d.ts.map +1 -0
  47. package/dist/components/Overflow/overflowSteps.d.ts +26 -0
  48. package/dist/components/Overflow/overflowSteps.d.ts.map +1 -0
  49. package/dist/components/Overflow/overflowSteps.js +32 -0
  50. package/dist/components/Overflow/overflowSteps.js.map +1 -0
  51. package/dist/components/Overflow/useResizer.d.ts +3 -0
  52. package/dist/components/Overflow/useResizer.d.ts.map +1 -0
  53. package/dist/components/Overflow/useResizer.js +18 -0
  54. package/dist/components/Overflow/useResizer.js.map +1 -0
  55. package/dist/components/RxOverflow/RxOverflow.d.ts +5 -0
  56. package/dist/components/RxOverflow/RxOverflow.d.ts.map +1 -0
  57. package/dist/components/RxOverflow/RxOverflow.js +11 -0
  58. package/dist/components/RxOverflow/RxOverflow.js.map +1 -0
  59. package/dist/components/RxOverflow/RxOverflowItem.d.ts +12 -0
  60. package/dist/components/RxOverflow/RxOverflowItem.d.ts.map +1 -0
  61. package/dist/components/RxOverflow/RxOverflowItem.js +10 -0
  62. package/dist/components/RxOverflow/RxOverflowItem.js.map +1 -0
  63. package/dist/components/RxOverflow/RxOverflowMenu.d.ts +11 -0
  64. package/dist/components/RxOverflow/RxOverflowMenu.d.ts.map +1 -0
  65. package/dist/components/RxOverflow/RxOverflowMenu.js +33 -0
  66. package/dist/components/RxOverflow/RxOverflowMenu.js.map +1 -0
  67. package/dist/components/RxOverflow/cn.d.ts +3 -0
  68. package/dist/components/RxOverflow/cn.d.ts.map +1 -0
  69. package/dist/components/RxOverflow/cn.js +9 -0
  70. package/dist/components/RxOverflow/cn.js.map +1 -0
  71. package/dist/components/RxOverflow/index.d.ts +5 -0
  72. package/dist/components/RxOverflow/index.d.ts.map +1 -0
  73. package/dist/components/RxOverflow/rx.css +1 -0
  74. package/dist/index.d.ts +5 -0
  75. package/dist/index.d.ts.map +1 -0
  76. package/dist/index.js +30 -0
  77. package/dist/index.js.map +1 -0
  78. package/dist/mui.js +9 -0
  79. package/dist/mui.js.map +1 -0
  80. package/dist/overflow.js +14 -0
  81. package/dist/overflow.js.map +1 -0
  82. package/dist/rx.js +11 -0
  83. package/dist/rx.js.map +1 -0
  84. package/dist/vanilla.js +5 -0
  85. package/dist/vanilla.js.map +1 -0
  86. package/dist/vite.svg +1 -0
  87. package/package.json +176 -0
@@ -0,0 +1,34 @@
1
+ import { jsx as w } from "react/jsx-runtime";
2
+ import { forwardRef as g, useState as j, useRef as z, useMemo as p, Children as i, isValidElement as m, Fragment as A, useCallback as V } from "react";
3
+ /* empty css */
4
+ import W from "./OverflowContext.js";
5
+ import { buildOrderedSteps as k, computeNextSteps as B, deriveHiddenMap as C } from "./overflowSteps.js";
6
+ import { useResizer as F } from "./useResizer.js";
7
+ const P = g(function({ children: t, className: S, style: R, compact: x, reverse: d }, M) {
8
+ const [f, y] = j([]), I = z(null), a = M ?? I, u = p(() => i.toArray(
9
+ i.count(t) === 1 && m(t) && t.type === A ? t.props.children : t
10
+ ), [t]), l = p(() => {
11
+ const e = [], s = /* @__PURE__ */ new Set(), n = /* @__PURE__ */ new Set();
12
+ i.forEach(u, (o) => {
13
+ if (!m(o)) return;
14
+ const v = o.type.overflowRole;
15
+ v === "menu" ? i.forEach(o.props.children, (r) => {
16
+ m(r) && r.props.menuid && (s.add(r.props.menuid), e.includes(r.props.menuid) || e.push(r.props.menuid));
17
+ }) : v === "item" && o.props.menuid && (e.includes(o.props.menuid) || e.push(o.props.menuid), o.props.minStateWidth !== void 0 && n.add(o.props.menuid));
18
+ });
19
+ const b = d ? [...e].reverse() : e;
20
+ return k(b, s, n);
21
+ }, [u, d]), O = V((e, s) => {
22
+ y((n) => B(n, e, s, l));
23
+ }, [l]);
24
+ F(a, O);
25
+ const c = p(() => C(f), [f]), E = p(
26
+ () => ({ hiddenMap: c }),
27
+ [c]
28
+ ), N = ["overflow", x && "overflow-compact", d && "overflow-reverse", S].filter(Boolean).join(" ");
29
+ return /* @__PURE__ */ w(W, { value: E, children: /* @__PURE__ */ w("ul", { ref: a, className: N, style: { ...R, "--hiddenCount": f.length }, children: u }) });
30
+ });
31
+ export {
32
+ P as default
33
+ };
34
+ //# sourceMappingURL=Overflow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Overflow.js","sources":["../../../src/components/Overflow/Overflow.tsx"],"sourcesContent":["import { Children, Fragment, forwardRef, isValidElement, type ReactNode, useCallback, useMemo, useRef, useState } from 'react';\nimport './Overflow.css';\nimport OverflowContext from './OverflowContext';\nimport { type AppliedStep, buildOrderedSteps, computeNextSteps, deriveHiddenMap } from './overflowSteps';\nimport { useResizer } from './useResizer';\n\nexport interface OverflowProps {\n children: ReactNode;\n className?: string;\n style?: React.CSSProperties;\n compact?: boolean;\n reverse?: boolean;\n}\n\nconst Overflow = forwardRef<HTMLUListElement, OverflowProps>(function Overflow({ children, className, style, compact, reverse }, ref) {\n const [appliedSteps, setAppliedSteps] = useState<AppliedStep[]>([]);\n const internalRef = useRef<HTMLUListElement | null>(null);\n const listRef = (ref ?? internalRef) as React.RefObject<HTMLUListElement | null>;\n\n // Unwrap a single top-level Fragment so items work in Storybook args, etc.\n const resolvedChildren = useMemo(() => Children.toArray(\n Children.count(children) === 1 && isValidElement<{ children: ReactNode }>(children) && children.type === Fragment\n ? children.props.children\n : children,\n ), [children]);\n\n // Build ordered steps by scanning resolved children using overflowRole markers\n const orderedSteps = useMemo(() => {\n const menuIds: string[] = [];\n const inMenuIds = new Set<string>();\n const minWidthMenuIds = new Set<string>();\n\n // Scan resolved children: collect menuids, detect which are in an OverflowMenu\n Children.forEach(resolvedChildren, (child) => {\n if (!isValidElement<{ menuid?: string; children?: ReactNode; minStateWidth?: string }>(child)) return;\n\n const role = (child.type as { overflowRole?: string }).overflowRole;\n\n if (role === 'menu') {\n // Scan OverflowMenu children for menuids that have menu representation\n Children.forEach(child.props.children, (menuChild) => {\n if (!isValidElement<{ menuid?: string }>(menuChild)) return;\n if (menuChild.props.menuid) {\n inMenuIds.add(menuChild.props.menuid);\n if (!menuIds.includes(menuChild.props.menuid)) {\n menuIds.push(menuChild.props.menuid);\n }\n }\n });\n } else if (role === 'item' && child.props.menuid) {\n if (!menuIds.includes(child.props.menuid)) {\n menuIds.push(child.props.menuid);\n }\n if (child.props.minStateWidth !== undefined) {\n minWidthMenuIds.add(child.props.menuid);\n }\n }\n });\n\n const orderedIds = reverse ? [...menuIds].reverse() : menuIds;\n return buildOrderedSteps(orderedIds, inMenuIds, minWidthMenuIds);\n }, [resolvedChildren, reverse]);\n\n const onResize = useCallback((scrollWidth: number, clientWidth: number) => {\n setAppliedSteps(prev => computeNextSteps(prev, scrollWidth, clientWidth, orderedSteps));\n }, [orderedSteps]);\n\n useResizer(listRef, onResize);\n\n const hiddenMap = useMemo(() => deriveHiddenMap(appliedSteps), [appliedSteps]);\n\n const ctxValue = useMemo(\n () => ({ hiddenMap }),\n [hiddenMap],\n );\n\n const classNames = ['overflow', compact && 'overflow-compact', reverse && 'overflow-reverse', className].filter(Boolean).join(' ');\n\n return (\n <OverflowContext value={ctxValue}>\n <ul ref={listRef} className={classNames} style={{ ...style, '--hiddenCount': appliedSteps.length } as React.CSSProperties}>\n {resolvedChildren}\n </ul>\n </OverflowContext>\n );\n});\n\nexport default Overflow;\n"],"names":["Overflow","forwardRef","children","className","style","compact","reverse","ref","appliedSteps","setAppliedSteps","useState","internalRef","useRef","listRef","resolvedChildren","useMemo","Children","isValidElement","Fragment","orderedSteps","menuIds","inMenuIds","minWidthMenuIds","child","role","menuChild","orderedIds","buildOrderedSteps","onResize","useCallback","scrollWidth","clientWidth","computeNextSteps","prev","useResizer","hiddenMap","deriveHiddenMap","ctxValue","classNames","OverflowContext","jsx"],"mappings":";;;;;;AAcA,MAAMA,IAAWC,EAA4C,SAAkB,EAAE,UAAAC,GAAU,WAAAC,GAAW,OAAAC,GAAO,SAAAC,GAAS,SAAAC,EAAA,GAAWC,GAAK;AACpI,QAAM,CAACC,GAAcC,CAAe,IAAIC,EAAwB,CAAA,CAAE,GAC5DC,IAAcC,EAAgC,IAAI,GAClDC,IAAWN,KAAOI,GAGlBG,IAAmBC,EAAQ,MAAMC,EAAS;AAAA,IAC9CA,EAAS,MAAMd,CAAQ,MAAM,KAAKe,EAAwCf,CAAQ,KAAKA,EAAS,SAASgB,IACrGhB,EAAS,MAAM,WACfA;AAAA,EAAA,GACH,CAACA,CAAQ,CAAC,GAGPiB,IAAeJ,EAAQ,MAAM;AACjC,UAAMK,IAAoB,CAAA,GACpBC,wBAAgB,IAAA,GAChBC,wBAAsB,IAAA;AAG5B,IAAAN,EAAS,QAAQF,GAAkB,CAACS,MAAU;AAC5C,UAAI,CAACN,EAAkFM,CAAK,EAAG;AAE/F,YAAMC,IAAQD,EAAM,KAAmC;AAEvD,MAAIC,MAAS,SAEXR,EAAS,QAAQO,EAAM,MAAM,UAAU,CAACE,MAAc;AACpD,QAAKR,EAAoCQ,CAAS,KAC9CA,EAAU,MAAM,WAClBJ,EAAU,IAAII,EAAU,MAAM,MAAM,GAC/BL,EAAQ,SAASK,EAAU,MAAM,MAAM,KAC1CL,EAAQ,KAAKK,EAAU,MAAM,MAAM;AAAA,MAGzC,CAAC,IACQD,MAAS,UAAUD,EAAM,MAAM,WACnCH,EAAQ,SAASG,EAAM,MAAM,MAAM,KACtCH,EAAQ,KAAKG,EAAM,MAAM,MAAM,GAE7BA,EAAM,MAAM,kBAAkB,UAChCD,EAAgB,IAAIC,EAAM,MAAM,MAAM;AAAA,IAG5C,CAAC;AAED,UAAMG,IAAapB,IAAU,CAAC,GAAGc,CAAO,EAAE,YAAYA;AACtD,WAAOO,EAAkBD,GAAYL,GAAWC,CAAe;AAAA,EACjE,GAAG,CAACR,GAAkBR,CAAO,CAAC,GAExBsB,IAAWC,EAAY,CAACC,GAAqBC,MAAwB;AACzE,IAAAtB,EAAgB,OAAQuB,EAAiBC,GAAMH,GAAaC,GAAaZ,CAAY,CAAC;AAAA,EACxF,GAAG,CAACA,CAAY,CAAC;AAEjB,EAAAe,EAAWrB,GAASe,CAAQ;AAE5B,QAAMO,IAAYpB,EAAQ,MAAMqB,EAAgB5B,CAAY,GAAG,CAACA,CAAY,CAAC,GAEvE6B,IAAWtB;AAAA,IACf,OAAO,EAAE,WAAAoB,EAAA;AAAA,IACT,CAACA,CAAS;AAAA,EAAA,GAGNG,IAAa,CAAC,YAAYjC,KAAW,oBAAoBC,KAAW,oBAAoBH,CAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAEjI,2BACGoC,GAAA,EAAgB,OAAOF,GACtB,UAAA,gBAAAG,EAAC,MAAA,EAAG,KAAK3B,GAAS,WAAWyB,GAAY,OAAO,EAAE,GAAGlC,GAAO,iBAAiBI,EAAa,OAAA,GACvF,aACH,GACF;AAEJ,CAAC;"}
@@ -0,0 +1,7 @@
1
+ interface OverflowContextValue {
2
+ hiddenMap: Map<string, 'min' | 'hidden'>;
3
+ }
4
+ declare const OverflowContext: import("react").Context<OverflowContextValue | null>;
5
+ export declare function useOverflow(): OverflowContextValue;
6
+ export default OverflowContext;
7
+ //# sourceMappingURL=OverflowContext.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OverflowContext.d.ts","sourceRoot":"","sources":["../../../src/components/Overflow/OverflowContext.ts"],"names":[],"mappings":"AAEA,UAAU,oBAAoB;IAC5B,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,KAAK,GAAG,QAAQ,CAAC,CAAC;CAC1C;AAED,QAAA,MAAM,eAAe,sDAAmD,CAAC;AAEzE,wBAAgB,WAAW,IAAI,oBAAoB,CAMlD;AAED,eAAe,eAAe,CAAC"}
@@ -0,0 +1,13 @@
1
+ import { createContext as t, useContext as o } from "react";
2
+ const n = t(null);
3
+ function u() {
4
+ const e = o(n);
5
+ if (!e)
6
+ throw new Error("useOverflow must be used within an <Overflow> component");
7
+ return e;
8
+ }
9
+ export {
10
+ n as default,
11
+ u as useOverflow
12
+ };
13
+ //# sourceMappingURL=OverflowContext.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OverflowContext.js","sources":["../../../src/components/Overflow/OverflowContext.ts"],"sourcesContent":["import { createContext, useContext } from 'react';\n\ninterface OverflowContextValue {\n hiddenMap: Map<string, 'min' | 'hidden'>;\n}\n\nconst OverflowContext = createContext<OverflowContextValue | null>(null);\n\nexport function useOverflow(): OverflowContextValue {\n const ctx = useContext(OverflowContext);\n if (!ctx) {\n throw new Error('useOverflow must be used within an <Overflow> component');\n }\n return ctx;\n}\n\nexport default OverflowContext;\n"],"names":["OverflowContext","createContext","useOverflow","ctx","useContext"],"mappings":";AAMA,MAAMA,IAAkBC,EAA2C,IAAI;AAEhE,SAASC,IAAoC;AAClD,QAAMC,IAAMC,EAAWJ,CAAe;AACtC,MAAI,CAACG;AACH,UAAM,IAAI,MAAM,yDAAyD;AAE3E,SAAOA;AACT;"}
@@ -0,0 +1,50 @@
1
+ export interface ScannedItem {
2
+ el: HTMLElement;
3
+ buttonEl: HTMLElement | null;
4
+ menuid: string | undefined;
5
+ minStateWidth: string | undefined;
6
+ }
7
+ export interface ScannedMenu {
8
+ el: HTMLElement;
9
+ triggerEl: HTMLElement;
10
+ menuItemEls: HTMLElement[];
11
+ inMenuIds: Set<string>;
12
+ hasMenuOnlyItems: boolean;
13
+ }
14
+ export interface ScanResult {
15
+ items: ScannedItem[];
16
+ menu: ScannedMenu | null;
17
+ /** true when the menu appears before items in DOM order */
18
+ menuFirst: boolean;
19
+ }
20
+ export interface OverflowHost {
21
+ getContainerEl(): HTMLElement;
22
+ scanChildren(): ScanResult;
23
+ isCompact(): boolean;
24
+ isReverse(): boolean;
25
+ }
26
+ export declare class OverflowController {
27
+ private host;
28
+ private orderedSteps;
29
+ private appliedSteps;
30
+ private ro;
31
+ private lastScan;
32
+ constructor(host: OverflowHost);
33
+ /** Start observing (call after DOM is ready). */
34
+ connect(): void;
35
+ /** Stop observing and clear all applied state. */
36
+ disconnect(): void;
37
+ /** Re-scan children + restart (call after external DOM changes). */
38
+ update(): void;
39
+ private scan;
40
+ private startObserver;
41
+ private onResize;
42
+ private applyState;
43
+ private applyMenuState;
44
+ private applyCompactCorners;
45
+ private setCorners;
46
+ private applyMinStyles;
47
+ private clearMinStyles;
48
+ private clearState;
49
+ }
50
+ //# sourceMappingURL=OverflowController.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OverflowController.d.ts","sourceRoot":"","sources":["../../../src/components/Overflow/OverflowController.ts"],"names":[],"mappings":"AAUA,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,WAAW,CAAC;IAChB,QAAQ,EAAE,WAAW,GAAG,IAAI,CAAC;IAC7B,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,aAAa,EAAE,MAAM,GAAG,SAAS,CAAC;CACnC;AAED,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,WAAW,CAAC;IAChB,SAAS,EAAE,WAAW,CAAC;IACvB,WAAW,EAAE,WAAW,EAAE,CAAC;IAC3B,SAAS,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACvB,gBAAgB,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,WAAW,EAAE,CAAC;IACrB,IAAI,EAAE,WAAW,GAAG,IAAI,CAAC;IACzB,2DAA2D;IAC3D,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,YAAY;IAC3B,cAAc,IAAI,WAAW,CAAC;IAC9B,YAAY,IAAI,UAAU,CAAC;IAC3B,SAAS,IAAI,OAAO,CAAC;IACrB,SAAS,IAAI,OAAO,CAAC;CACtB;AAyBD,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,IAAI,CAAe;IAC3B,OAAO,CAAC,YAAY,CAAc;IAClC,OAAO,CAAC,YAAY,CAAqB;IACzC,OAAO,CAAC,EAAE,CAA+B;IACzC,OAAO,CAAC,QAAQ,CAA2D;gBAE/D,IAAI,EAAE,YAAY;IAI9B,iDAAiD;IACjD,OAAO,IAAI,IAAI;IAKf,kDAAkD;IAClD,UAAU,IAAI,IAAI;IAMlB,oEAAoE;IACpE,MAAM,IAAI,IAAI;IAQd,OAAO,CAAC,IAAI;IAmBZ,OAAO,CAAC,aAAa;IASrB,OAAO,CAAC,QAAQ;IAehB,OAAO,CAAC,UAAU;IAmDlB,OAAO,CAAC,cAAc;IAkCtB,OAAO,CAAC,mBAAmB;IAmD3B,OAAO,CAAC,UAAU;IAWlB,OAAO,CAAC,cAAc;IAOtB,OAAO,CAAC,cAAc;IAOtB,OAAO,CAAC,UAAU;CA8BnB"}
@@ -0,0 +1,146 @@
1
+ import { buildOrderedSteps as u, computeNextSteps as f, deriveHiddenMap as S } from "./overflowSteps.js";
2
+ const m = {
3
+ "font-size": "0",
4
+ "min-width": "100%",
5
+ width: "100%",
6
+ "max-width": "100%",
7
+ "align-items": "center",
8
+ "justify-content": "center",
9
+ gap: "0"
10
+ }, y = Object.keys(m), c = [
11
+ "border-top-left-radius",
12
+ "border-bottom-left-radius",
13
+ "border-top-right-radius",
14
+ "border-bottom-right-radius"
15
+ ];
16
+ class g {
17
+ host;
18
+ orderedSteps = [];
19
+ appliedSteps = [];
20
+ ro = null;
21
+ lastScan = { items: [], menu: null, menuFirst: !1 };
22
+ constructor(t) {
23
+ this.host = t;
24
+ }
25
+ /** Start observing (call after DOM is ready). */
26
+ connect() {
27
+ this.scan(), this.startObserver();
28
+ }
29
+ /** Stop observing and clear all applied state. */
30
+ disconnect() {
31
+ this.ro?.disconnect(), this.ro = null, this.clearState();
32
+ }
33
+ /** Re-scan children + restart (call after external DOM changes). */
34
+ update() {
35
+ this.appliedSteps = [], this.scan(), this.startObserver();
36
+ }
37
+ /* ── Private ──────────────────────────────────────────── */
38
+ scan() {
39
+ this.lastScan = this.host.scanChildren();
40
+ const t = [], e = /* @__PURE__ */ new Set();
41
+ for (const o of this.lastScan.items)
42
+ o.menuid && (t.push(o.menuid), o.minStateWidth && e.add(o.menuid));
43
+ const s = this.lastScan.menu?.inMenuIds ?? /* @__PURE__ */ new Set(), i = this.host.isReverse() ? [...t].reverse() : t;
44
+ this.orderedSteps = u(i, s, e);
45
+ }
46
+ startObserver() {
47
+ this.ro?.disconnect();
48
+ const t = this.host.getContainerEl();
49
+ this.ro = new ResizeObserver(() => this.onResize()), this.ro.observe(t), this.onResize(), this.applyState();
50
+ }
51
+ onResize() {
52
+ const t = this.host.getContainerEl(), { scrollWidth: e, clientWidth: s } = t, n = f(
53
+ this.appliedSteps,
54
+ e,
55
+ s,
56
+ this.orderedSteps
57
+ );
58
+ n !== this.appliedSteps && (this.appliedSteps = n, this.applyState());
59
+ }
60
+ applyState() {
61
+ const t = S(this.appliedSteps);
62
+ this.host.getContainerEl().style.setProperty("--hiddenCount", String(this.appliedSteps.length));
63
+ const s = this.host.isCompact(), n = this.host.isReverse();
64
+ let i = !1;
65
+ const o = [];
66
+ for (const r of this.lastScan.items) {
67
+ const a = r.menuid ? t.get(r.menuid) ?? "visible" : "visible";
68
+ r.el.setAttribute("data-state", a), a === "visible" ? (r.el.style.removeProperty("display"), r.el.style.removeProperty("max-width"), r.el.style.removeProperty("overflow"), this.clearMinStyles(r.buttonEl), o.push(r)) : a === "min" ? (r.el.style.removeProperty("display"), r.el.style.setProperty("max-width", r.minStateWidth ?? "2.25rem"), r.el.style.setProperty("overflow", "hidden"), this.applyMinStyles(r.buttonEl), o.push(r)) : (r.el.style.setProperty("display", "none"), r.el.style.removeProperty("max-width"), r.el.style.removeProperty("overflow"), this.clearMinStyles(r.buttonEl), i = !0);
69
+ }
70
+ const { menu: l, menuFirst: p } = this.lastScan, d = this.applyMenuState(l, t, i);
71
+ this.applyCompactCorners(
72
+ o,
73
+ l,
74
+ p,
75
+ d,
76
+ s,
77
+ n
78
+ );
79
+ }
80
+ applyMenuState(t, e, s) {
81
+ if (!t) return !1;
82
+ const n = s || t.hasMenuOnlyItems;
83
+ t.el.style.setProperty("display", n ? "" : "none"), t.el.setAttribute("data-state", n ? "visible" : "hidden"), n ? this.applyMinStyles(t.triggerEl) : this.clearMinStyles(t.triggerEl);
84
+ for (const i of t.menuItemEls) {
85
+ const o = i.getAttribute("menuid") ?? i.dataset.menuid;
86
+ o ? e.get(o) === "hidden" ? i.style.removeProperty("display") : i.style.setProperty("display", "none") : i.style.removeProperty("display");
87
+ }
88
+ return n;
89
+ }
90
+ applyCompactCorners(t, e, s, n, i, o) {
91
+ for (let l = 0; l < t.length; l++) {
92
+ const p = t[l].buttonEl;
93
+ if (!p) continue;
94
+ const d = l === 0, r = l === t.length - 1, a = s ? !d || n : !d, h = s ? !r : !r || n;
95
+ this.setCorners(
96
+ p,
97
+ i && (o ? h : a),
98
+ i && (o ? a : h)
99
+ );
100
+ }
101
+ if (e?.triggerEl) {
102
+ const l = n && t.length > 0;
103
+ s ? this.setCorners(
104
+ e.triggerEl,
105
+ i && l && o,
106
+ i && l && !o
107
+ ) : this.setCorners(
108
+ e.triggerEl,
109
+ i && l && !o,
110
+ i && l && o
111
+ );
112
+ }
113
+ }
114
+ setCorners(t, e, s) {
115
+ t.style.borderTopLeftRadius = e ? "0" : "", t.style.borderBottomLeftRadius = e ? "0" : "", t.style.borderTopRightRadius = s ? "0" : "", t.style.borderBottomRightRadius = s ? "0" : "";
116
+ }
117
+ applyMinStyles(t) {
118
+ if (t)
119
+ for (const e of y)
120
+ t.style.setProperty(e, m[e]);
121
+ }
122
+ clearMinStyles(t) {
123
+ if (t)
124
+ for (const e of y)
125
+ t.style.removeProperty(e);
126
+ }
127
+ clearState() {
128
+ this.host.getContainerEl().style.removeProperty("--hiddenCount");
129
+ for (const s of this.lastScan.items)
130
+ if (s.el.removeAttribute("data-state"), s.el.style.removeProperty("display"), s.el.style.removeProperty("max-width"), s.el.style.removeProperty("overflow"), this.clearMinStyles(s.buttonEl), s.buttonEl)
131
+ for (const n of c)
132
+ s.buttonEl.style.removeProperty(n);
133
+ const e = this.lastScan.menu;
134
+ if (e) {
135
+ e.el.removeAttribute("data-state"), e.el.style.removeProperty("display"), this.clearMinStyles(e.triggerEl);
136
+ for (const s of c)
137
+ e.triggerEl.style.removeProperty(s);
138
+ for (const s of e.menuItemEls)
139
+ s.style.removeProperty("display");
140
+ }
141
+ }
142
+ }
143
+ export {
144
+ g as OverflowController
145
+ };
146
+ //# sourceMappingURL=OverflowController.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OverflowController.js","sources":["../../../src/components/Overflow/OverflowController.ts"],"sourcesContent":["import {\n type AppliedStep,\n type Step,\n buildOrderedSteps,\n computeNextSteps,\n deriveHiddenMap,\n} from './overflowSteps';\n\n/* ── Public types ───────────────────────────────────────── */\n\nexport interface ScannedItem {\n el: HTMLElement;\n buttonEl: HTMLElement | null;\n menuid: string | undefined;\n minStateWidth: string | undefined;\n}\n\nexport interface ScannedMenu {\n el: HTMLElement;\n triggerEl: HTMLElement;\n menuItemEls: HTMLElement[];\n inMenuIds: Set<string>;\n hasMenuOnlyItems: boolean;\n}\n\nexport interface ScanResult {\n items: ScannedItem[];\n menu: ScannedMenu | null;\n /** true when the menu appears before items in DOM order */\n menuFirst: boolean;\n}\n\nexport interface OverflowHost {\n getContainerEl(): HTMLElement;\n scanChildren(): ScanResult;\n isCompact(): boolean;\n isReverse(): boolean;\n}\n\n/* ── Shared style constants (kebab-case for setProperty) ── */\n\nconst MIN_STATE_STYLES: Record<string, string> = {\n 'font-size': '0',\n 'min-width': '100%',\n 'width': '100%',\n 'max-width': '100%',\n 'align-items': 'center',\n 'justify-content': 'center',\n 'gap': '0',\n};\n\nconst MIN_STATE_KEYS = Object.keys(MIN_STATE_STYLES);\n\nconst CORNER_PROPS = [\n 'border-top-left-radius',\n 'border-bottom-left-radius',\n 'border-top-right-radius',\n 'border-bottom-right-radius',\n] as const;\n\n/* ── Controller ─────────────────────────────────────────── */\n\nexport class OverflowController {\n private host: OverflowHost;\n private orderedSteps: Step[] = [];\n private appliedSteps: AppliedStep[] = [];\n private ro: ResizeObserver | null = null;\n private lastScan: ScanResult = { items: [], menu: null, menuFirst: false };\n\n constructor(host: OverflowHost) {\n this.host = host;\n }\n\n /** Start observing (call after DOM is ready). */\n connect(): void {\n this.scan();\n this.startObserver();\n }\n\n /** Stop observing and clear all applied state. */\n disconnect(): void {\n this.ro?.disconnect();\n this.ro = null;\n this.clearState();\n }\n\n /** Re-scan children + restart (call after external DOM changes). */\n update(): void {\n this.appliedSteps = [];\n this.scan();\n this.startObserver();\n }\n\n /* ── Private ──────────────────────────────────────────── */\n\n private scan(): void {\n this.lastScan = this.host.scanChildren();\n\n const menuIds: string[] = [];\n const minWidthMenuIds = new Set<string>();\n\n for (const item of this.lastScan.items) {\n if (item.menuid) {\n menuIds.push(item.menuid);\n if (item.minStateWidth) minWidthMenuIds.add(item.menuid);\n }\n }\n\n const inMenuIds = this.lastScan.menu?.inMenuIds ?? new Set<string>();\n const isReverse = this.host.isReverse();\n const ids = isReverse ? [...menuIds].reverse() : menuIds;\n this.orderedSteps = buildOrderedSteps(ids, inMenuIds, minWidthMenuIds);\n }\n\n private startObserver(): void {\n this.ro?.disconnect();\n const container = this.host.getContainerEl();\n this.ro = new ResizeObserver(() => this.onResize());\n this.ro.observe(container);\n this.onResize();\n this.applyState();\n }\n\n private onResize(): void {\n const container = this.host.getContainerEl();\n const { scrollWidth, clientWidth } = container;\n const next = computeNextSteps(\n this.appliedSteps,\n scrollWidth,\n clientWidth,\n this.orderedSteps,\n );\n if (next !== this.appliedSteps) {\n this.appliedSteps = next;\n this.applyState();\n }\n }\n\n private applyState(): void {\n const hiddenMap = deriveHiddenMap(this.appliedSteps);\n const container = this.host.getContainerEl();\n container.style.setProperty('--hiddenCount', String(this.appliedSteps.length));\n\n const isCompact = this.host.isCompact();\n const isReverse = this.host.isReverse();\n\n let anyFullyHidden = false;\n const visibleItems: ScannedItem[] = [];\n\n // Apply item states\n for (const item of this.lastScan.items) {\n const state = item.menuid\n ? (hiddenMap.get(item.menuid) ?? 'visible')\n : 'visible';\n\n item.el.setAttribute('data-state', state);\n\n if (state === 'visible') {\n item.el.style.removeProperty('display');\n item.el.style.removeProperty('max-width');\n item.el.style.removeProperty('overflow');\n this.clearMinStyles(item.buttonEl);\n visibleItems.push(item);\n } else if (state === 'min') {\n item.el.style.removeProperty('display');\n item.el.style.setProperty('max-width', item.minStateWidth ?? '2.25rem');\n item.el.style.setProperty('overflow', 'hidden');\n this.applyMinStyles(item.buttonEl);\n visibleItems.push(item);\n } else {\n // hidden\n item.el.style.setProperty('display', 'none');\n item.el.style.removeProperty('max-width');\n item.el.style.removeProperty('overflow');\n this.clearMinStyles(item.buttonEl);\n anyFullyHidden = true;\n }\n }\n\n // Menu\n const { menu, menuFirst } = this.lastScan;\n const menuVisible = this.applyMenuState(menu, hiddenMap, anyFullyHidden);\n\n // Compact corners\n this.applyCompactCorners(\n visibleItems, menu, menuFirst, menuVisible, isCompact, isReverse,\n );\n }\n\n private applyMenuState(\n menu: ScannedMenu | null,\n hiddenMap: Map<string, 'min' | 'hidden'>,\n anyFullyHidden: boolean,\n ): boolean {\n if (!menu) return false;\n\n const showOpener = anyFullyHidden || menu.hasMenuOnlyItems;\n menu.el.style.setProperty('display', showOpener ? '' : 'none');\n menu.el.setAttribute('data-state', showOpener ? 'visible' : 'hidden');\n\n // Opener trigger styles (icon-only display)\n if (showOpener) {\n this.applyMinStyles(menu.triggerEl);\n } else {\n this.clearMinStyles(menu.triggerEl);\n }\n\n // Show/hide individual menu items\n for (const mi of menu.menuItemEls) {\n const mid = mi.getAttribute('menuid') ?? mi.dataset.menuid;\n if (!mid) {\n // Menu-only item — always visible\n mi.style.removeProperty('display');\n } else if (hiddenMap.get(mid) === 'hidden') {\n mi.style.removeProperty('display');\n } else {\n mi.style.setProperty('display', 'none');\n }\n }\n\n return showOpener;\n }\n\n private applyCompactCorners(\n visibleItems: ScannedItem[],\n menu: ScannedMenu | null,\n menuFirst: boolean,\n menuVisible: boolean,\n isCompact: boolean,\n isReverse: boolean,\n ): void {\n for (let i = 0; i < visibleItems.length; i++) {\n const btn = visibleItems[i].buttonEl;\n if (!btn) continue;\n\n const isFirst = i === 0;\n const isLast = i === visibleItems.length - 1;\n\n // Determine adjacency based on menu position\n const hasPrev = menuFirst\n ? (!isFirst || menuVisible)\n : !isFirst;\n const hasNext = menuFirst\n ? !isLast\n : (!isLast || menuVisible);\n\n // Normal (row): prev = left, next = right\n // Reverse (row-reverse): prev = right, next = left\n this.setCorners(btn,\n isCompact && (isReverse ? hasNext : hasPrev),\n isCompact && (isReverse ? hasPrev : hasNext),\n );\n }\n\n // Menu trigger corners\n if (menu?.triggerEl) {\n const hasAdjacentItem = menuVisible && visibleItems.length > 0;\n\n if (menuFirst) {\n // Menu first in DOM → left in normal, right in reverse\n this.setCorners(menu.triggerEl,\n isCompact && hasAdjacentItem && isReverse,\n isCompact && hasAdjacentItem && !isReverse,\n );\n } else {\n // Menu last in DOM → right in normal, left in reverse\n this.setCorners(menu.triggerEl,\n isCompact && hasAdjacentItem && !isReverse,\n isCompact && hasAdjacentItem && isReverse,\n );\n }\n }\n }\n\n private setCorners(\n el: HTMLElement,\n squareLeft: boolean,\n squareRight: boolean,\n ): void {\n el.style.borderTopLeftRadius = squareLeft ? '0' : '';\n el.style.borderBottomLeftRadius = squareLeft ? '0' : '';\n el.style.borderTopRightRadius = squareRight ? '0' : '';\n el.style.borderBottomRightRadius = squareRight ? '0' : '';\n }\n\n private applyMinStyles(el: HTMLElement | null): void {\n if (!el) return;\n for (const key of MIN_STATE_KEYS) {\n el.style.setProperty(key, MIN_STATE_STYLES[key]);\n }\n }\n\n private clearMinStyles(el: HTMLElement | null): void {\n if (!el) return;\n for (const key of MIN_STATE_KEYS) {\n el.style.removeProperty(key);\n }\n }\n\n private clearState(): void {\n const container = this.host.getContainerEl();\n container.style.removeProperty('--hiddenCount');\n\n for (const item of this.lastScan.items) {\n item.el.removeAttribute('data-state');\n item.el.style.removeProperty('display');\n item.el.style.removeProperty('max-width');\n item.el.style.removeProperty('overflow');\n this.clearMinStyles(item.buttonEl);\n if (item.buttonEl) {\n for (const prop of CORNER_PROPS) {\n item.buttonEl.style.removeProperty(prop);\n }\n }\n }\n\n const menu = this.lastScan.menu;\n if (menu) {\n menu.el.removeAttribute('data-state');\n menu.el.style.removeProperty('display');\n this.clearMinStyles(menu.triggerEl);\n for (const prop of CORNER_PROPS) {\n menu.triggerEl.style.removeProperty(prop);\n }\n for (const mi of menu.menuItemEls) {\n mi.style.removeProperty('display');\n }\n }\n }\n}\n"],"names":["MIN_STATE_STYLES","MIN_STATE_KEYS","CORNER_PROPS","OverflowController","host","menuIds","minWidthMenuIds","item","inMenuIds","ids","buildOrderedSteps","container","scrollWidth","clientWidth","next","computeNextSteps","hiddenMap","deriveHiddenMap","isCompact","isReverse","anyFullyHidden","visibleItems","state","menu","menuFirst","menuVisible","showOpener","mi","mid","i","btn","isFirst","isLast","hasPrev","hasNext","hasAdjacentItem","el","squareLeft","squareRight","key","prop"],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { ReactNode } from 'react';
2
+ export interface OverflowItemProps {
3
+ children: ReactNode;
4
+ menuid?: string;
5
+ minStateWidth?: string;
6
+ }
7
+ declare function OverflowItem({ children, menuid, minStateWidth }: OverflowItemProps): import("react/jsx-runtime").JSX.Element;
8
+ declare const _default: typeof OverflowItem & {
9
+ overflowRole: "item";
10
+ };
11
+ export default _default;
12
+ //# sourceMappingURL=OverflowItem.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OverflowItem.d.ts","sourceRoot":"","sources":["../../../src/components/Overflow/OverflowItem.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAiB,SAAS,EAAE,MAAM,OAAO,CAAC;AAGtD,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,SAAS,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,iBAAS,YAAY,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,aAAa,EAAE,EAAE,iBAAiB,2CAsB3E;;;;AAED,wBAA8E"}
@@ -0,0 +1,17 @@
1
+ import { jsx as a } from "react/jsx-runtime";
2
+ import { useOverflow as d } from "./OverflowContext.js";
3
+ function v({ children: f, menuid: e, minStateWidth: o }) {
4
+ const { hiddenMap: i } = d();
5
+ let t, s;
6
+ if (e !== void 0) {
7
+ const l = i.get(e);
8
+ l === "hidden" ? t = { display: "none" } : l === "min" && o !== void 0 && (t = { minWidth: o, width: o, maxWidth: o, overflow: "hidden" }, s = "overflow-item-min");
9
+ }
10
+ const r = e !== void 0 ? i.get(e) ?? "visible" : void 0;
11
+ return /* @__PURE__ */ a("li", { style: t, className: s, "data-state": r, children: f });
12
+ }
13
+ const m = Object.assign(v, { overflowRole: "item" });
14
+ export {
15
+ m as default
16
+ };
17
+ //# sourceMappingURL=OverflowItem.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OverflowItem.js","sources":["../../../src/components/Overflow/OverflowItem.tsx"],"sourcesContent":["import type { CSSProperties, ReactNode } from 'react';\nimport { useOverflow } from './OverflowContext';\n\nexport interface OverflowItemProps {\n children: ReactNode;\n menuid?: string;\n minStateWidth?: string;\n}\n\nfunction OverflowItem({ children, menuid, minStateWidth }: OverflowItemProps) {\n const { hiddenMap } = useOverflow();\n\n let style: CSSProperties | undefined;\n let className: string | undefined;\n if (menuid !== undefined) {\n const state = hiddenMap.get(menuid);\n if (state === 'hidden') {\n style = { display: 'none' };\n } else if (state === 'min' && minStateWidth !== undefined) {\n style = { minWidth: minStateWidth, width: minStateWidth, maxWidth: minStateWidth, overflow: 'hidden' };\n className = 'overflow-item-min';\n }\n }\n\n const dataState = menuid !== undefined ? (hiddenMap.get(menuid) ?? 'visible') : undefined;\n\n return (\n <li style={style} className={className} data-state={dataState}>\n {children}\n </li>\n );\n}\n\nexport default Object.assign(OverflowItem, { overflowRole: 'item' as const });\n"],"names":["OverflowItem","children","menuid","minStateWidth","hiddenMap","useOverflow","style","className","state","dataState","OverflowItem$1"],"mappings":";;AASA,SAASA,EAAa,EAAE,UAAAC,GAAU,QAAAC,GAAQ,eAAAC,KAAoC;AAC5E,QAAM,EAAE,WAAAC,EAAA,IAAcC,EAAA;AAEtB,MAAIC,GACAC;AACJ,MAAIL,MAAW,QAAW;AACxB,UAAMM,IAAQJ,EAAU,IAAIF,CAAM;AAClC,IAAIM,MAAU,WACZF,IAAQ,EAAE,SAAS,OAAA,IACVE,MAAU,SAASL,MAAkB,WAC9CG,IAAQ,EAAE,UAAUH,GAAe,OAAOA,GAAe,UAAUA,GAAe,UAAU,SAAA,GAC5FI,IAAY;AAAA,EAEhB;AAEA,QAAME,IAAYP,MAAW,SAAaE,EAAU,IAAIF,CAAM,KAAK,YAAa;AAEhF,2BACG,MAAA,EAAG,OAAAI,GAAc,WAAAC,GAAsB,cAAYE,GACjD,UAAAR,GACH;AAEJ;AAEA,MAAAS,IAAe,OAAO,OAAOV,GAAc,EAAE,cAAc,QAAiB;"}
@@ -0,0 +1,18 @@
1
+ import { type ReactNode } from 'react';
2
+ export interface RenderMenuProps {
3
+ anchorEl: HTMLElement | null;
4
+ open: boolean;
5
+ onClose: () => void;
6
+ children: ReactNode;
7
+ }
8
+ interface OverflowMenuProps {
9
+ opener: ReactNode;
10
+ children: ReactNode;
11
+ renderMenu: (props: RenderMenuProps) => ReactNode;
12
+ }
13
+ declare function OverflowMenu({ opener, children, renderMenu }: OverflowMenuProps): import("react/jsx-runtime").JSX.Element;
14
+ declare const _default: typeof OverflowMenu & {
15
+ overflowRole: "menu";
16
+ };
17
+ export default _default;
18
+ //# sourceMappingURL=OverflowMenu.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OverflowMenu.d.ts","sourceRoot":"","sources":["../../../src/components/Overflow/OverflowMenu.tsx"],"names":[],"mappings":"AAAA,OAAO,EAA6D,KAAK,SAAS,EAA+B,MAAM,OAAO,CAAC;AAI/H,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,WAAW,GAAG,IAAI,CAAC;IAC7B,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,QAAQ,EAAE,SAAS,CAAC;CACrB;AAED,UAAU,iBAAiB;IACzB,MAAM,EAAE,SAAS,CAAC;IAClB,QAAQ,EAAE,SAAS,CAAC;IACpB,UAAU,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,SAAS,CAAC;CACnD;AAED,iBAAS,YAAY,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,iBAAiB,2CAqExE;;;;AAED,wBAA8E"}
@@ -0,0 +1,36 @@
1
+ import { jsxs as M, Fragment as j, jsx as x } from "react/jsx-runtime";
2
+ import { useState as H, useRef as b, useEffect as R, Children as $, isValidElement as l, cloneElement as m } from "react";
3
+ import { useOverflow as A } from "./OverflowContext.js";
4
+ function B({ opener: s, children: f, renderMenu: h }) {
5
+ const { hiddenMap: i } = A(), [c, t] = H(null), p = !!c, n = [...i.values()].some((e) => e === "hidden"), d = b(n);
6
+ R(() => {
7
+ d.current && !n && t(null), d.current = n;
8
+ }, [n]);
9
+ const v = (e) => {
10
+ t(e.currentTarget);
11
+ }, u = () => {
12
+ t(null);
13
+ }, r = [];
14
+ $.forEach(f, (e) => {
15
+ l(e) && r.push({ menuid: e.props.menuid, content: e.props.children });
16
+ });
17
+ const C = r.filter(({ menuid: e }) => e === void 0 ? !0 : i.get(e) === "hidden"), E = r.some(({ menuid: e }) => e === void 0), a = !n && !E, O = l(s) ? m(s, { onClick: v }) : s, g = C.map(({ menuid: e, content: o }, w) => {
18
+ const k = e ?? `menu-item-${w}`;
19
+ return l(o) ? m(o, {
20
+ key: k,
21
+ onClick: (...y) => {
22
+ const I = o.props.onClick;
23
+ I?.(...y), u();
24
+ }
25
+ }) : o;
26
+ });
27
+ return /* @__PURE__ */ M(j, { children: [
28
+ /* @__PURE__ */ x("li", { className: "overflow-opener", "data-state": a ? "hidden" : void 0, style: a ? { display: "none" } : void 0, children: O }),
29
+ h({ anchorEl: c, open: p, onClose: u, children: g })
30
+ ] });
31
+ }
32
+ const T = Object.assign(B, { overflowRole: "menu" });
33
+ export {
34
+ T as default
35
+ };
36
+ //# sourceMappingURL=OverflowMenu.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OverflowMenu.js","sources":["../../../src/components/Overflow/OverflowMenu.tsx"],"sourcesContent":["import { Children, cloneElement, isValidElement, type ReactElement, type ReactNode, useEffect, useRef, useState } from 'react';\nimport { useOverflow } from './OverflowContext';\nimport type { OverflowItemProps } from './OverflowItem';\n\nexport interface RenderMenuProps {\n anchorEl: HTMLElement | null;\n open: boolean;\n onClose: () => void;\n children: ReactNode;\n}\n\ninterface OverflowMenuProps {\n opener: ReactNode;\n children: ReactNode;\n renderMenu: (props: RenderMenuProps) => ReactNode;\n}\n\nfunction OverflowMenu({ opener, children, renderMenu }: OverflowMenuProps) {\n const { hiddenMap } = useOverflow();\n const [anchorEl, setAnchorEl] = useState<HTMLElement | null>(null);\n const open = Boolean(anchorEl);\n\n const hasHiddenItems = [...hiddenMap.values()].some(s => s === 'hidden');\n const prevHasHidden = useRef(hasHiddenItems);\n\n // Auto-close when no items are fully hidden\n useEffect(() => {\n if (prevHasHidden.current && !hasHiddenItems) {\n setAnchorEl(null);\n }\n prevHasHidden.current = hasHiddenItems;\n }, [hasHiddenItems]);\n\n const handleOpen = (event: React.MouseEvent<HTMLElement>) => {\n setAnchorEl(event.currentTarget);\n };\n\n const handleClose = () => {\n setAnchorEl(null);\n };\n\n // Collect menuid set from children to determine which are \"menu-only\"\n const menuItems: { menuid: string | undefined; content: ReactNode }[] = [];\n Children.forEach(children, (child) => {\n if (!isValidElement<OverflowItemProps>(child)) return;\n menuItems.push({ menuid: child.props.menuid, content: child.props.children });\n });\n\n // Determine visible menu items: show when fully hidden or menu-only\n const visibleItems = menuItems.filter(({ menuid }) => {\n if (menuid === undefined) return true; // no menuid = always shown in menu\n return hiddenMap.get(menuid) === 'hidden'; // shown when fully hidden in toolbar\n });\n\n const hasMenuOnlyItems = menuItems.some(({ menuid }) => menuid === undefined);\n const hidden = !hasHiddenItems && !hasMenuOnlyItems;\n\n // Clone opener to attach click handler\n const openerElement = isValidElement<Record<string, unknown>>(opener)\n ? cloneElement(opener as ReactElement<{ onClick?: (e: React.MouseEvent<HTMLElement>) => void }>, { onClick: handleOpen })\n : opener;\n\n const menuChildren = visibleItems.map(({ menuid, content }, i) => {\n // Wrap each menu item's content and attach close-on-click\n const key = menuid ?? `menu-item-${i}`;\n if (isValidElement<{ onClick?: () => void }>(content)) {\n return cloneElement(content as ReactElement<{ onClick?: () => void }>, {\n key,\n onClick: (...args: unknown[]) => {\n const original = (content as ReactElement<{ onClick?: (...a: unknown[]) => void }>).props.onClick;\n original?.(...args);\n handleClose();\n },\n });\n }\n return content;\n });\n\n return (\n <>\n <li className=\"overflow-opener\" data-state={hidden ? 'hidden' : undefined} style={hidden ? { display: 'none' } : undefined}>\n {openerElement}\n </li>\n {renderMenu({ anchorEl, open, onClose: handleClose, children: menuChildren })}\n </>\n );\n}\n\nexport default Object.assign(OverflowMenu, { overflowRole: 'menu' as const });\n"],"names":["OverflowMenu","opener","children","renderMenu","hiddenMap","useOverflow","anchorEl","setAnchorEl","useState","open","hasHiddenItems","s","prevHasHidden","useRef","useEffect","handleOpen","event","handleClose","menuItems","Children","child","isValidElement","visibleItems","menuid","hasMenuOnlyItems","hidden","openerElement","cloneElement","menuChildren","content","i","key","args","original","jsxs","Fragment","jsx","OverflowMenu$1"],"mappings":";;;AAiBA,SAASA,EAAa,EAAE,QAAAC,GAAQ,UAAAC,GAAU,YAAAC,KAAiC;AACzE,QAAM,EAAE,WAAAC,EAAA,IAAcC,EAAA,GAChB,CAACC,GAAUC,CAAW,IAAIC,EAA6B,IAAI,GAC3DC,IAAO,EAAQH,GAEfI,IAAiB,CAAC,GAAGN,EAAU,OAAA,CAAQ,EAAE,KAAK,CAAAO,MAAKA,MAAM,QAAQ,GACjEC,IAAgBC,EAAOH,CAAc;AAG3C,EAAAI,EAAU,MAAM;AACd,IAAIF,EAAc,WAAW,CAACF,KAC5BH,EAAY,IAAI,GAElBK,EAAc,UAAUF;AAAA,EAC1B,GAAG,CAACA,CAAc,CAAC;AAEnB,QAAMK,IAAa,CAACC,MAAyC;AAC3D,IAAAT,EAAYS,EAAM,aAAa;AAAA,EACjC,GAEMC,IAAc,MAAM;AACxB,IAAAV,EAAY,IAAI;AAAA,EAClB,GAGMW,IAAkE,CAAA;AACxE,EAAAC,EAAS,QAAQjB,GAAU,CAACkB,MAAU;AACpC,IAAKC,EAAkCD,CAAK,KAC5CF,EAAU,KAAK,EAAE,QAAQE,EAAM,MAAM,QAAQ,SAASA,EAAM,MAAM,SAAA,CAAU;AAAA,EAC9E,CAAC;AAGD,QAAME,IAAeJ,EAAU,OAAO,CAAC,EAAE,QAAAK,QACnCA,MAAW,SAAkB,KAC1BnB,EAAU,IAAImB,CAAM,MAAM,QAClC,GAEKC,IAAmBN,EAAU,KAAK,CAAC,EAAE,QAAAK,EAAA,MAAaA,MAAW,MAAS,GACtEE,IAAS,CAACf,KAAkB,CAACc,GAG7BE,IAAgBL,EAAwCpB,CAAM,IAChE0B,EAAa1B,GAAkF,EAAE,SAASc,EAAA,CAAY,IACtHd,GAEE2B,IAAeN,EAAa,IAAI,CAAC,EAAE,QAAAC,GAAQ,SAAAM,EAAA,GAAWC,MAAM;AAEhE,UAAMC,IAAMR,KAAU,aAAaO,CAAC;AACpC,WAAIT,EAAyCQ,CAAO,IAC3CF,EAAaE,GAAmD;AAAA,MACrE,KAAAE;AAAA,MACA,SAAS,IAAIC,MAAoB;AAC/B,cAAMC,IAAYJ,EAAkE,MAAM;AAC1F,QAAAI,IAAW,GAAGD,CAAI,GAClBf,EAAA;AAAA,MACF;AAAA,IAAA,CACD,IAEIY;AAAA,EACT,CAAC;AAED,SACE,gBAAAK,EAAAC,GAAA,EACE,UAAA;AAAA,IAAA,gBAAAC,EAAC,MAAA,EAAG,WAAU,mBAAkB,cAAYX,IAAS,WAAW,QAAW,OAAOA,IAAS,EAAE,SAAS,OAAA,IAAW,QAC9G,UAAAC,GACH;AAAA,IACCvB,EAAW,EAAE,UAAAG,GAAU,MAAAG,GAAM,SAASQ,GAAa,UAAUW,GAAc;AAAA,EAAA,GAC9E;AAEJ;AAEA,MAAAS,IAAe,OAAO,OAAOrC,GAAc,EAAE,cAAc,QAAiB;"}
@@ -0,0 +1,10 @@
1
+ export { default as Overflow } from './Overflow';
2
+ export type { OverflowProps } from './Overflow';
3
+ export { default as OverflowItem } from './OverflowItem';
4
+ export type { OverflowItemProps } from './OverflowItem';
5
+ export { default as OverflowMenu } from './OverflowMenu';
6
+ export type { RenderMenuProps } from './OverflowMenu';
7
+ export { default as OverflowContext, useOverflow } from './OverflowContext';
8
+ export { OverflowController } from './OverflowController';
9
+ export type { OverflowHost, ScanResult, ScannedItem, ScannedMenu, } from './OverflowController';
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/Overflow/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,YAAY,CAAC;AACjD,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACzD,YAAY,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACzD,YAAY,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAC5E,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,YAAY,EACV,YAAY,EACZ,UAAU,EACV,WAAW,EACX,WAAW,GACZ,MAAM,sBAAsB,CAAC"}
@@ -0,0 +1,26 @@
1
+ export interface Step {
2
+ menuid: string;
3
+ step: 'min' | 'hidden';
4
+ }
5
+ export interface AppliedStep extends Step {
6
+ width: number;
7
+ }
8
+ /**
9
+ * Build the ordered collapse sequence.
10
+ * All min steps come first (in menuid order), then all hidden steps (in menuid order).
11
+ * A menuid only gets a min step if it has a minStateWidth.
12
+ * A menuid only gets a hidden step if it's represented in the menu.
13
+ */
14
+ export declare function buildOrderedSteps(menuIds: string[], inMenuIds: Set<string>, minWidthMenuIds: Set<string>): Step[];
15
+ /**
16
+ * Compute the next appliedSteps state given a resize event.
17
+ * On overflow: push the next step from orderedSteps.
18
+ * On space available: pop the last step if the container is wider than when it was applied.
19
+ */
20
+ export declare function computeNextSteps(prev: AppliedStep[], scrollWidth: number, clientWidth: number, orderedSteps: Step[]): AppliedStep[];
21
+ /**
22
+ * Derive the hiddenMap from appliedSteps.
23
+ * Later steps for the same menuid overwrite earlier ones (e.g., min → hidden).
24
+ */
25
+ export declare function deriveHiddenMap(appliedSteps: AppliedStep[]): Map<string, 'min' | 'hidden'>;
26
+ //# sourceMappingURL=overflowSteps.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"overflowSteps.d.ts","sourceRoot":"","sources":["../../../src/components/Overflow/overflowSteps.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,IAAI;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,KAAK,GAAG,QAAQ,CAAC;CACxB;AAED,MAAM,WAAW,WAAY,SAAQ,IAAI;IACvC,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,MAAM,EAAE,EACjB,SAAS,EAAE,GAAG,CAAC,MAAM,CAAC,EACtB,eAAe,EAAE,GAAG,CAAC,MAAM,CAAC,GAC3B,IAAI,EAAE,CAaR;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,WAAW,EAAE,EACnB,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,IAAI,EAAE,GACnB,WAAW,EAAE,CAef;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,YAAY,EAAE,WAAW,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,KAAK,GAAG,QAAQ,CAAC,CAM1F"}
@@ -0,0 +1,32 @@
1
+ function i(t, o, e) {
2
+ const s = [];
3
+ for (const n of t)
4
+ e.has(n) && s.push({ menuid: n, step: "min" });
5
+ for (const n of t)
6
+ o.has(n) && s.push({ menuid: n, step: "hidden" });
7
+ return s;
8
+ }
9
+ function f(t, o, e, s) {
10
+ if (o > e) {
11
+ const n = s[t.length];
12
+ return n ? [...t, { ...n, width: e }] : t;
13
+ }
14
+ if (t.length > 0) {
15
+ const n = t[t.length - 1];
16
+ if (e > n.width)
17
+ return t.slice(0, -1);
18
+ }
19
+ return t;
20
+ }
21
+ function u(t) {
22
+ const o = /* @__PURE__ */ new Map();
23
+ for (const { menuid: e, step: s } of t)
24
+ o.set(e, s);
25
+ return o;
26
+ }
27
+ export {
28
+ i as buildOrderedSteps,
29
+ f as computeNextSteps,
30
+ u as deriveHiddenMap
31
+ };
32
+ //# sourceMappingURL=overflowSteps.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"overflowSteps.js","sources":["../../../src/components/Overflow/overflowSteps.ts"],"sourcesContent":["export interface Step {\n menuid: string;\n step: 'min' | 'hidden';\n}\n\nexport interface AppliedStep extends Step {\n width: number;\n}\n\n/**\n * Build the ordered collapse sequence.\n * All min steps come first (in menuid order), then all hidden steps (in menuid order).\n * A menuid only gets a min step if it has a minStateWidth.\n * A menuid only gets a hidden step if it's represented in the menu.\n */\nexport function buildOrderedSteps(\n menuIds: string[],\n inMenuIds: Set<string>,\n minWidthMenuIds: Set<string>,\n): Step[] {\n const steps: Step[] = [];\n for (const menuid of menuIds) {\n if (minWidthMenuIds.has(menuid)) {\n steps.push({ menuid, step: 'min' });\n }\n }\n for (const menuid of menuIds) {\n if (inMenuIds.has(menuid)) {\n steps.push({ menuid, step: 'hidden' });\n }\n }\n return steps;\n}\n\n/**\n * Compute the next appliedSteps state given a resize event.\n * On overflow: push the next step from orderedSteps.\n * On space available: pop the last step if the container is wider than when it was applied.\n */\nexport function computeNextSteps(\n prev: AppliedStep[],\n scrollWidth: number,\n clientWidth: number,\n orderedSteps: Step[],\n): AppliedStep[] {\n if (scrollWidth > clientWidth) {\n const nextStep = orderedSteps[prev.length];\n if (!nextStep) return prev;\n return [...prev, { ...nextStep, width: clientWidth }];\n }\n\n if (prev.length > 0) {\n const lastStep = prev[prev.length - 1];\n if (clientWidth > lastStep.width) {\n return prev.slice(0, -1);\n }\n }\n\n return prev;\n}\n\n/**\n * Derive the hiddenMap from appliedSteps.\n * Later steps for the same menuid overwrite earlier ones (e.g., min → hidden).\n */\nexport function deriveHiddenMap(appliedSteps: AppliedStep[]): Map<string, 'min' | 'hidden'> {\n const map = new Map<string, 'min' | 'hidden'>();\n for (const { menuid, step } of appliedSteps) {\n map.set(menuid, step);\n }\n return map;\n}\n"],"names":["buildOrderedSteps","menuIds","inMenuIds","minWidthMenuIds","steps","menuid","computeNextSteps","prev","scrollWidth","clientWidth","orderedSteps","nextStep","lastStep","deriveHiddenMap","appliedSteps","map","step"],"mappings":"AAeO,SAASA,EACdC,GACAC,GACAC,GACQ;AACR,QAAMC,IAAgB,CAAA;AACtB,aAAWC,KAAUJ;AACnB,IAAIE,EAAgB,IAAIE,CAAM,KAC5BD,EAAM,KAAK,EAAE,QAAAC,GAAQ,MAAM,OAAO;AAGtC,aAAWA,KAAUJ;AACnB,IAAIC,EAAU,IAAIG,CAAM,KACtBD,EAAM,KAAK,EAAE,QAAAC,GAAQ,MAAM,UAAU;AAGzC,SAAOD;AACT;AAOO,SAASE,EACdC,GACAC,GACAC,GACAC,GACe;AACf,MAAIF,IAAcC,GAAa;AAC7B,UAAME,IAAWD,EAAaH,EAAK,MAAM;AACzC,WAAKI,IACE,CAAC,GAAGJ,GAAM,EAAE,GAAGI,GAAU,OAAOF,GAAa,IAD9BF;AAAA,EAExB;AAEA,MAAIA,EAAK,SAAS,GAAG;AACnB,UAAMK,IAAWL,EAAKA,EAAK,SAAS,CAAC;AACrC,QAAIE,IAAcG,EAAS;AACzB,aAAOL,EAAK,MAAM,GAAG,EAAE;AAAA,EAE3B;AAEA,SAAOA;AACT;AAMO,SAASM,EAAgBC,GAA4D;AAC1F,QAAMC,wBAAU,IAAA;AAChB,aAAW,EAAE,QAAAV,GAAQ,MAAAW,EAAA,KAAUF;AAC7B,IAAAC,EAAI,IAAIV,GAAQW,CAAI;AAEtB,SAAOD;AACT;"}
@@ -0,0 +1,3 @@
1
+ import { type RefObject } from "react";
2
+ export declare function useResizer(ref: RefObject<HTMLElement | null>, onResize: (maxWidth: number, currentWidth: number) => void): void;
3
+ //# sourceMappingURL=useResizer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useResizer.d.ts","sourceRoot":"","sources":["../../../src/components/Overflow/useResizer.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAqB,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAE1D,wBAAgB,UAAU,CACxB,GAAG,EAAE,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC,EAClC,QAAQ,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,KAAK,IAAI,QAqB3D"}
@@ -0,0 +1,18 @@
1
+ import { useRef as o, useEffect as u } from "react";
2
+ function f(r, t) {
3
+ const c = o(t);
4
+ c.current = t, u(() => {
5
+ const e = r.current;
6
+ if (!e) return;
7
+ const n = () => {
8
+ c.current(e.scrollWidth, e.clientWidth);
9
+ }, s = new ResizeObserver(n);
10
+ return s.observe(e), n(), () => {
11
+ s.disconnect();
12
+ };
13
+ }, [r]);
14
+ }
15
+ export {
16
+ f as useResizer
17
+ };
18
+ //# sourceMappingURL=useResizer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useResizer.js","sources":["../../../src/components/Overflow/useResizer.tsx"],"sourcesContent":["import { useEffect, useRef, type RefObject } from \"react\";\n\nexport function useResizer(\n ref: RefObject<HTMLElement | null>,\n onResize: (maxWidth: number, currentWidth: number) => void\n) {\n const callbackRef = useRef(onResize);\n callbackRef.current = onResize;\n\n useEffect(() => {\n const element = ref.current;\n if (!element) return;\n\n const observe = () => {\n callbackRef.current(element.scrollWidth, element.clientWidth);\n };\n const observer = new ResizeObserver(observe);\n\n observer.observe(element);\n observe(); // Trigger initial measurement\n\n return () => {\n observer.disconnect();\n };\n }, [ref]);\n}"],"names":["useResizer","ref","onResize","callbackRef","useRef","useEffect","element","observe","observer"],"mappings":";AAEO,SAASA,EACdC,GACAC,GACA;AACA,QAAMC,IAAcC,EAAOF,CAAQ;AACnC,EAAAC,EAAY,UAAUD,GAEtBG,EAAU,MAAM;AACd,UAAMC,IAAUL,EAAI;AACpB,QAAI,CAACK,EAAS;AAEd,UAAMC,IAAU,MAAM;AACpB,MAAAJ,EAAY,QAAQG,EAAQ,aAAaA,EAAQ,WAAW;AAAA,IAC9D,GACME,IAAW,IAAI,eAAeD,CAAO;AAE3C,WAAAC,EAAS,QAAQF,CAAO,GACxBC,EAAA,GAEO,MAAM;AACX,MAAAC,EAAS,WAAA;AAAA,IACX;AAAA,EACF,GAAG,CAACP,CAAG,CAAC;AACV;"}
@@ -0,0 +1,5 @@
1
+ import { type OverflowProps } from '../Overflow';
2
+ import './rx.css';
3
+ declare const RxOverflow: import("react").ForwardRefExoticComponent<OverflowProps & import("react").RefAttributes<HTMLUListElement>>;
4
+ export default RxOverflow;
5
+ //# sourceMappingURL=RxOverflow.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RxOverflow.d.ts","sourceRoot":"","sources":["../../../src/components/RxOverflow/RxOverflow.tsx"],"names":[],"mappings":"AACA,OAAO,EAAY,KAAK,aAAa,EAAE,MAAM,aAAa,CAAC;AAC3D,OAAO,UAAU,CAAC;AAElB,QAAA,MAAM,UAAU,4GAEd,CAAC;AAEH,eAAe,UAAU,CAAC"}
@@ -0,0 +1,11 @@
1
+ import { jsx as f } from "react/jsx-runtime";
2
+ import { forwardRef as t } from "react";
3
+ import e from "../Overflow/Overflow.js";
4
+ /* empty css */
5
+ const w = t(function(r, o) {
6
+ return /* @__PURE__ */ f(e, { ref: o, ...r });
7
+ });
8
+ export {
9
+ w as default
10
+ };
11
+ //# sourceMappingURL=RxOverflow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RxOverflow.js","sources":["../../../src/components/RxOverflow/RxOverflow.tsx"],"sourcesContent":["import { forwardRef } from 'react';\nimport { Overflow, type OverflowProps } from '../Overflow';\nimport './rx.css';\n\nconst RxOverflow = forwardRef<HTMLUListElement, OverflowProps>(function RxOverflow(props, ref) {\n return <Overflow ref={ref} {...props} />;\n});\n\nexport default RxOverflow;\n"],"names":["RxOverflow","forwardRef","props","ref","jsx","Overflow"],"mappings":";;;;AAIA,MAAMA,IAAaC,EAA4C,SAAoBC,GAAOC,GAAK;AAC7F,SAAO,gBAAAC,EAACC,GAAA,EAAS,KAAAF,GAAW,GAAGD,EAAA,CAAO;AACxC,CAAC;"}
@@ -0,0 +1,12 @@
1
+ import type { ReactNode } from 'react';
2
+ interface RxOverflowItemProps {
3
+ children: ReactNode;
4
+ menuid?: string;
5
+ minStateWidth?: string;
6
+ }
7
+ declare function RxOverflowItem({ children, menuid, minStateWidth }: RxOverflowItemProps): import("react/jsx-runtime").JSX.Element;
8
+ declare const _default: typeof RxOverflowItem & {
9
+ overflowRole: "item";
10
+ };
11
+ export default _default;
12
+ //# sourceMappingURL=RxOverflowItem.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RxOverflowItem.d.ts","sourceRoot":"","sources":["../../../src/components/RxOverflow/RxOverflowItem.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAGvC,UAAU,mBAAmB;IAC3B,QAAQ,EAAE,SAAS,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,iBAAS,cAAc,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,aAAa,EAAE,EAAE,mBAAmB,2CAM/E;;;;AAED,wBAAgF"}
@@ -0,0 +1,10 @@
1
+ import { jsx as r } from "react/jsx-runtime";
2
+ import f from "../Overflow/OverflowItem.js";
3
+ function m({ children: e, menuid: o, minStateWidth: t }) {
4
+ return /* @__PURE__ */ r(f, { menuid: o, minStateWidth: t, children: e });
5
+ }
6
+ const n = Object.assign(m, { overflowRole: "item" });
7
+ export {
8
+ n as default
9
+ };
10
+ //# sourceMappingURL=RxOverflowItem.js.map