overflow-toolbar 0.1.8 → 0.2.1

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 (72) hide show
  1. package/README.md +45 -35
  2. package/dist/components/MuiOverflow/MuiOverflow.js +3 -2
  3. package/dist/components/MuiOverflow/MuiOverflow.js.map +1 -1
  4. package/dist/components/MuiOverflow/MuiOverflowItem.d.ts +6 -6
  5. package/dist/components/MuiOverflow/MuiOverflowItem.d.ts.map +1 -1
  6. package/dist/components/MuiOverflow/MuiOverflowItem.js +9 -8
  7. package/dist/components/MuiOverflow/MuiOverflowItem.js.map +1 -1
  8. package/dist/components/MuiOverflow/MuiOverflowMenu.d.ts +4 -4
  9. package/dist/components/MuiOverflow/MuiOverflowMenu.d.ts.map +1 -1
  10. package/dist/components/MuiOverflow/MuiOverflowMenu.js +8 -7
  11. package/dist/components/MuiOverflow/MuiOverflowMenu.js.map +1 -1
  12. package/dist/components/MuiOverflow/index.d.ts +1 -0
  13. package/dist/components/MuiOverflow/index.d.ts.map +1 -1
  14. package/dist/components/NoFrameworkOverflow/NoFrameworkOverflow.d.ts +3 -0
  15. package/dist/components/NoFrameworkOverflow/NoFrameworkOverflow.d.ts.map +1 -1
  16. package/dist/components/NoFrameworkOverflow/NoFrameworkOverflow.js +21 -17
  17. package/dist/components/NoFrameworkOverflow/NoFrameworkOverflow.js.map +1 -1
  18. package/dist/components/NoFrameworkOverflow/index.d.ts +2 -0
  19. package/dist/components/NoFrameworkOverflow/index.d.ts.map +1 -1
  20. package/dist/components/NoFrameworkOverflow/noframework.css +1 -110
  21. package/dist/components/Overflow/Overflow.css +1 -1
  22. package/dist/components/Overflow/Overflow.d.ts +8 -1
  23. package/dist/components/Overflow/Overflow.d.ts.map +1 -1
  24. package/dist/components/Overflow/Overflow.js +32 -32
  25. package/dist/components/Overflow/Overflow.js.map +1 -1
  26. package/dist/components/Overflow/OverflowController.d.ts +2 -1
  27. package/dist/components/Overflow/OverflowController.d.ts.map +1 -1
  28. package/dist/components/Overflow/OverflowController.js +44 -40
  29. package/dist/components/Overflow/OverflowController.js.map +1 -1
  30. package/dist/components/Overflow/OverflowItem.d.ts +10 -6
  31. package/dist/components/Overflow/OverflowItem.d.ts.map +1 -1
  32. package/dist/components/Overflow/OverflowItem.js +20 -11
  33. package/dist/components/Overflow/OverflowItem.js.map +1 -1
  34. package/dist/components/Overflow/OverflowMenu.d.ts +12 -4
  35. package/dist/components/Overflow/OverflowMenu.d.ts.map +1 -1
  36. package/dist/components/Overflow/OverflowMenu.js +37 -30
  37. package/dist/components/Overflow/OverflowMenu.js.map +1 -1
  38. package/dist/components/Overflow/index.d.ts +1 -0
  39. package/dist/components/Overflow/index.d.ts.map +1 -1
  40. package/dist/components/Overflow/overflowSteps.d.ts +10 -6
  41. package/dist/components/Overflow/overflowSteps.d.ts.map +1 -1
  42. package/dist/components/Overflow/overflowSteps.js +34 -23
  43. package/dist/components/Overflow/overflowSteps.js.map +1 -1
  44. package/dist/components/Overflow/useResizer.d.ts.map +1 -1
  45. package/dist/components/Overflow/useResizer.js +5 -3
  46. package/dist/components/Overflow/useResizer.js.map +1 -1
  47. package/dist/components/RxOverflow/RxOverflow.d.ts +0 -1
  48. package/dist/components/RxOverflow/RxOverflow.d.ts.map +1 -1
  49. package/dist/components/RxOverflow/RxOverflow.js +1 -1
  50. package/dist/components/RxOverflow/RxOverflow.js.map +1 -1
  51. package/dist/components/RxOverflow/RxOverflowItem.d.ts +6 -6
  52. package/dist/components/RxOverflow/RxOverflowItem.d.ts.map +1 -1
  53. package/dist/components/RxOverflow/RxOverflowItem.js +7 -6
  54. package/dist/components/RxOverflow/RxOverflowItem.js.map +1 -1
  55. package/dist/components/RxOverflow/RxOverflowMenu.d.ts +4 -4
  56. package/dist/components/RxOverflow/RxOverflowMenu.d.ts.map +1 -1
  57. package/dist/components/RxOverflow/RxOverflowMenu.js +19 -16
  58. package/dist/components/RxOverflow/RxOverflowMenu.js.map +1 -1
  59. package/dist/components/RxOverflow/index.d.ts +2 -0
  60. package/dist/components/RxOverflow/index.d.ts.map +1 -1
  61. package/dist/index.js +30 -27
  62. package/dist/index.js.map +1 -1
  63. package/dist/mui.js +7 -6
  64. package/dist/mui.js.map +1 -1
  65. package/dist/overflow.js +7 -6
  66. package/dist/overflow.js.map +1 -1
  67. package/dist/rx.js +10 -8
  68. package/dist/rx.js.map +1 -1
  69. package/dist/vanilla.js +4 -2
  70. package/dist/vanilla.js.map +1 -1
  71. package/package.json +2 -14
  72. package/styles.d.ts +0 -3
package/README.md CHANGED
@@ -7,14 +7,18 @@
7
7
 
8
8
  A responsive toolbar overflow component that automatically collapses items into a dropdown menu as the container shrinks. Items transition through three states: **visible** → **min** (icon-only) → **hidden** (moved to menu).
9
9
 
10
- <a href="https://wesjones.github.io/overflow/" target="_blank"><strong>Live Demo</strong></a>
10
+ <p align="center">
11
+ <a href="https://wesjones.github.io/overflow/">
12
+ <img src="./assets/live-demo.svg" alt="Live Demo" />
13
+ </a>
14
+ </p>
11
15
 
12
16
  ## Features
13
17
 
14
18
  - **Automatic overflow detection** — items collapse into a menu as the container narrows using ResizeObserver
15
19
  - **Three item states** — visible, min (icon-only), and hidden (in menu)
16
20
  - **Compact mode** — items collapse one at a time instead of all at once
17
- - **Reverse mode** — collapse from the left instead of the right
21
+ - **Reverse mode** — collapse from the right instead of the left
18
22
  - **Menu-only items** — items that always live in the dropdown (e.g. Help, About)
19
23
  - **Min state** — items shrink to icon-only before being fully hidden
20
24
  - **Three implementations** — React/Radix UI (shadcn-compatible), Material UI, and vanilla JavaScript
@@ -27,23 +31,33 @@ A responsive toolbar overflow component that automatically collapses items into
27
31
  npm install overflow-toolbar
28
32
  ```
29
33
 
34
+ or
35
+
36
+ ```bash
37
+ pnpm add overflow-toolbar
38
+ ```
39
+
40
+ or
41
+
42
+ ```bash
43
+ yarn add overflow-toolbar
44
+ ```
45
+
30
46
  ## Quick Start
31
47
 
32
48
  ### Radix UI / shadcn (React)
33
49
 
34
50
  ```tsx
35
51
  import { RxOverflow, RxOverflowItem, RxOverflowMenu } from 'overflow-toolbar/rx';
36
- import 'overflow-toolbar/rx/styles';
37
- import 'overflow-toolbar/styles';
38
52
 
39
53
  <RxOverflow style={{ gap: 8 }}>
40
54
  <RxOverflowMenu opener={<button>More</button>}>
41
- <RxOverflowItem menuid="format"><button>Format</button></RxOverflowItem>
42
- <RxOverflowItem menuid="filter"><button>Filters</button></RxOverflowItem>
55
+ <RxOverflowItem menuId="format"><button>Format</button></RxOverflowItem>
56
+ <RxOverflowItem menuId="filter"><button>Filters</button></RxOverflowItem>
43
57
  </RxOverflowMenu>
44
58
 
45
- <RxOverflowItem menuid="format"><button>Format</button></RxOverflowItem>
46
- <RxOverflowItem menuid="filter"><button>Filters</button></RxOverflowItem>
59
+ <RxOverflowItem menuId="format"><button>Format</button></RxOverflowItem>
60
+ <RxOverflowItem menuId="filter"><button>Filters</button></RxOverflowItem>
47
61
  </RxOverflow>
48
62
  ```
49
63
 
@@ -51,17 +65,16 @@ import 'overflow-toolbar/styles';
51
65
 
52
66
  ```tsx
53
67
  import { MuiOverflow, MuiOverflowItem, MuiOverflowMenu } from 'overflow-toolbar/mui';
54
- import 'overflow-toolbar/styles';
55
68
  import { Button, MenuItem } from '@mui/material';
56
69
 
57
70
  <MuiOverflow sx={{ gap: 1 }}>
58
71
  <MuiOverflowMenu opener={<Button>More</Button>}>
59
- <MuiOverflowItem menuid="format"><MenuItem>Format</MenuItem></MuiOverflowItem>
60
- <MuiOverflowItem menuid="filter"><MenuItem>Filters</MenuItem></MuiOverflowItem>
72
+ <MuiOverflowItem menuId="format"><MenuItem>Format</MenuItem></MuiOverflowItem>
73
+ <MuiOverflowItem menuId="filter"><MenuItem>Filters</MenuItem></MuiOverflowItem>
61
74
  </MuiOverflowMenu>
62
75
 
63
- <MuiOverflowItem menuid="format"><Button>Format</Button></MuiOverflowItem>
64
- <MuiOverflowItem menuid="filter"><Button>Filters</Button></MuiOverflowItem>
76
+ <MuiOverflowItem menuId="format"><Button>Format</Button></MuiOverflowItem>
77
+ <MuiOverflowItem menuId="filter"><Button>Filters</Button></MuiOverflowItem>
65
78
  </MuiOverflow>
66
79
  ```
67
80
 
@@ -69,8 +82,6 @@ import { Button, MenuItem } from '@mui/material';
69
82
 
70
83
  ```js
71
84
  import { OverflowToolbar } from 'overflow-toolbar/vanilla';
72
- import 'overflow-toolbar/vanilla/styles';
73
- import 'overflow-toolbar/styles';
74
85
 
75
86
  const ul = document.querySelector('#my-toolbar');
76
87
  const toolbar = new OverflowToolbar(ul);
@@ -84,14 +95,14 @@ const toolbar = new OverflowToolbar(ul);
84
95
  <li data-overflow-role="menu">
85
96
  <button data-menu-trigger>More</button>
86
97
  <div data-menu-panel>
87
- <button data-menuid="format">Format</button>
88
- <button data-menuid="filter">Filters</button>
98
+ <button data-menu-id="format">Format</button>
99
+ <button data-menu-id="filter">Filters</button>
89
100
  </div>
90
101
  </li>
91
- <li data-overflow-role="item" data-menuid="format">
102
+ <li data-overflow-role="item" data-menu-id="format">
92
103
  <button>Format</button>
93
104
  </li>
94
- <li data-overflow-role="item" data-menuid="filter">
105
+ <li data-overflow-role="item" data-menu-id="filter">
95
106
  <button>Filters</button>
96
107
  </li>
97
108
  </ul>
@@ -108,9 +119,8 @@ Import only what you need for optimal tree-shaking:
108
119
  | `overflow-toolbar/rx` | Radix UI / shadcn variant (`RxOverflow`, `RxOverflowItem`, `RxOverflowMenu`) |
109
120
  | `overflow-toolbar/mui` | Material UI variant (`MuiOverflow`, `MuiOverflowItem`, `MuiOverflowMenu`) |
110
121
  | `overflow-toolbar/vanilla` | Vanilla JS (`OverflowToolbar`) |
111
- | `overflow-toolbar/styles` | Core CSS (required by all variants) |
112
- | `overflow-toolbar/rx/styles` | Radix UI styles |
113
- | `overflow-toolbar/vanilla/styles` | Vanilla JS styles |
122
+
123
+ CSS is included automatically when you import any subpath — no separate style imports needed.
114
124
 
115
125
  ## API
116
126
 
@@ -122,19 +132,19 @@ The container component. Wraps toolbar items and the overflow menu.
122
132
  |---|---|---|---|
123
133
  | `children` | `ReactNode` | — | Overflow items and menu |
124
134
  | `compact` | `boolean` | `false` | Collapse items one at a time |
125
- | `reverse` | `boolean` | `false` | Collapse from the left |
135
+ | `reverse` | `boolean` | `false` | Collapse from the right |
126
136
  | `className` | `string` | — | CSS class name |
127
137
  | `style` | `CSSProperties` | — | Inline styles |
128
138
  | `sx` | `SxProps` | — | MUI system props (MUI only) |
129
139
 
130
140
  ### `OverflowItem` / `RxOverflowItem` / `MuiOverflowItem`
131
141
 
132
- Wraps each toolbar item. Place matching items in both the toolbar and the menu, linked by `menuid`.
142
+ Wraps each toolbar item. Place matching items in both the toolbar and the menu, linked by `menuId`.
133
143
 
134
144
  | Prop | Type | Default | Description |
135
145
  |---|---|---|---|
136
146
  | `children` | `ReactNode` | — | Item content |
137
- | `menuid` | `string` | — | Links toolbar item to its menu counterpart |
147
+ | `menuId` | `string` | — | Links toolbar item to its menu counterpart |
138
148
  | `minStateWidth` | `string` \| `number` | — | Width in min state (`string` for Rx, `number` for MUI spacing units) |
139
149
 
140
150
  ### `OverflowMenu` / `RxOverflowMenu` / `MuiOverflowMenu`
@@ -187,15 +197,15 @@ The overflow engine scans immediate children for internal role markers to measur
187
197
  {/* WRONG — wrapper breaks overflow behavior */}
188
198
  <RxOverflow>
189
199
  <div className="group">
190
- <RxOverflowItem menuid="a"><button>A</button></RxOverflowItem>
191
- <RxOverflowItem menuid="b"><button>B</button></RxOverflowItem>
200
+ <RxOverflowItem menuId="a"><button>A</button></RxOverflowItem>
201
+ <RxOverflowItem menuId="b"><button>B</button></RxOverflowItem>
192
202
  </div>
193
203
  </RxOverflow>
194
204
 
195
205
  {/* CORRECT — items are direct children */}
196
206
  <RxOverflow>
197
- <RxOverflowItem menuid="a"><button>A</button></RxOverflowItem>
198
- <RxOverflowItem menuid="b"><button>B</button></RxOverflowItem>
207
+ <RxOverflowItem menuId="a"><button>A</button></RxOverflowItem>
208
+ <RxOverflowItem menuId="b"><button>B</button></RxOverflowItem>
199
209
  </RxOverflow>
200
210
  ```
201
211
 
@@ -215,7 +225,7 @@ Items collapse one at a time with tight spacing. Adjacent buttons get squared-of
215
225
 
216
226
  ### Reverse Mode
217
227
 
218
- Items collapse from the left side first instead of the right:
228
+ Items collapse from the right side first instead of the left:
219
229
 
220
230
  ```tsx
221
231
  <RxOverflow reverse>
@@ -228,7 +238,7 @@ Items collapse from the left side first instead of the right:
228
238
  Items shrink to a fixed width (icon-only) before being fully hidden:
229
239
 
230
240
  ```tsx
231
- <RxOverflowItem menuid="format" minStateWidth="2.25rem">
241
+ <RxOverflowItem menuId="format" minStateWidth="2.25rem">
232
242
  <button><FormatIcon /> Format</button>
233
243
  </RxOverflowItem>
234
244
  ```
@@ -236,18 +246,18 @@ Items shrink to a fixed width (icon-only) before being fully hidden:
236
246
  For MUI, `minStateWidth` accepts a number (theme spacing units):
237
247
 
238
248
  ```tsx
239
- <MuiOverflowItem menuid="format" minStateWidth={5}>
249
+ <MuiOverflowItem menuId="format" minStateWidth={5}>
240
250
  <Button><FormatIcon /> Format</Button>
241
251
  </MuiOverflowItem>
242
252
  ```
243
253
 
244
254
  ### Menu-Only Items
245
255
 
246
- Items without a `menuid` always stay where they are — in the toolbar or in the menu:
256
+ Items without a `menuId` always stay where they are — in the toolbar or in the menu:
247
257
 
248
258
  ```tsx
249
259
  <RxOverflowMenu opener={<button>More</button>}>
250
- <RxOverflowItem menuid="format"><button>Format</button></RxOverflowItem>
260
+ <RxOverflowItem menuId="format"><button>Format</button></RxOverflowItem>
251
261
  {/* Always in the menu */}
252
262
  <RxOverflowItem><div role="separator" /></RxOverflowItem>
253
263
  <RxOverflowItem><button>Help</button></RxOverflowItem>
@@ -262,7 +272,7 @@ The vanilla implementation uses `data-` attributes for configuration:
262
272
  |---|---|---|
263
273
  | `data-overflow-role="item"` | `<li>` | Marks a toolbar item |
264
274
  | `data-overflow-role="menu"` | `<li>` | Marks the menu container |
265
- | `data-menuid` | `<li>`, menu item | Links toolbar and menu items |
275
+ | `data-menu-id` | `<li>`, menu item | Links toolbar and menu items |
266
276
  | `data-min-state-width` | `<li>` | Min-state width (CSS value) |
267
277
  | `data-menu-trigger` | `<button>` | The menu open/close button |
268
278
  | `data-menu-panel` | `<div>` | The menu panel (uses Popover API) |
@@ -1,7 +1,8 @@
1
+ import '../Overflow/Overflow.css';
1
2
  import { styled as o } from "@mui/material/styles";
2
3
  import r from "../Overflow/Overflow.js";
3
- const f = o(r)({});
4
+ const m = o(r)({});
4
5
  export {
5
- f as default
6
+ m as default
6
7
  };
7
8
  //# sourceMappingURL=MuiOverflow.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"MuiOverflow.js","sources":["../../../src/components/MuiOverflow/MuiOverflow.tsx"],"sourcesContent":["import { styled } from '@mui/material/styles';\nimport type { OverflowProps } from '../Overflow';\nimport { Overflow } from '../Overflow';\n\nconst MuiOverflow: React.ComponentType<OverflowProps> = styled(Overflow)({});\n\nexport default MuiOverflow;\n"],"names":["MuiOverflow","styled","Overflow"],"mappings":";;AAIA,MAAMA,IAAkDC,EAAOC,CAAQ,EAAE,CAAA,CAAE;"}
1
+ {"version":3,"file":"MuiOverflow.js","sources":["../../../src/components/MuiOverflow/MuiOverflow.tsx"],"sourcesContent":["import { styled } from '@mui/material/styles';\nimport type { OverflowProps } from '../Overflow';\nimport { Overflow } from '../Overflow';\n\nconst MuiOverflow: React.ComponentType<OverflowProps> = styled(Overflow)({});\n\nexport default MuiOverflow;\n"],"names":["MuiOverflow","styled","Overflow"],"mappings":";;;AAIA,MAAMA,IAAkDC,EAAOC,CAAQ,EAAE,CAAA,CAAE;"}
@@ -1,12 +1,12 @@
1
1
  import type { ReactNode } from 'react';
2
2
  interface MuiOverflowItemProps {
3
3
  children: ReactNode;
4
- menuid?: string;
4
+ menuId?: string;
5
5
  minStateWidth?: number;
6
6
  }
7
- declare function MuiOverflowItem({ children, menuid, minStateWidth }: MuiOverflowItemProps): import("react/jsx-runtime").JSX.Element;
8
- declare const _default: typeof MuiOverflowItem & {
9
- overflowRole: "item";
10
- };
11
- export default _default;
7
+ declare function MuiOverflowItem({ children, menuId, minStateWidth }: MuiOverflowItemProps): import("react/jsx-runtime").JSX.Element;
8
+ declare namespace MuiOverflowItem {
9
+ var overflowRole: "item";
10
+ }
11
+ export default MuiOverflowItem;
12
12
  //# sourceMappingURL=MuiOverflowItem.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"MuiOverflowItem.d.ts","sourceRoot":"","sources":["../../../src/components/MuiOverflow/MuiOverflowItem.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAGvC,UAAU,oBAAoB;IAC5B,QAAQ,EAAE,SAAS,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,iBAAS,eAAe,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,aAAa,EAAE,EAAE,oBAAoB,2CASjF;;;;AAED,wBAAiF"}
1
+ {"version":3,"file":"MuiOverflowItem.d.ts","sourceRoot":"","sources":["../../../src/components/MuiOverflow/MuiOverflowItem.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAGvC,UAAU,oBAAoB;IAC5B,QAAQ,EAAE,SAAS,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,iBAAS,eAAe,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,aAAa,EAAE,EAAE,oBAAoB,2CASjF;kBATQ,eAAe;;;AAYxB,eAAe,eAAe,CAAC"}
@@ -1,12 +1,13 @@
1
- import { jsx as m } from "react/jsx-runtime";
2
- import { useTheme as s } from "@mui/material/styles";
3
- import f from "../Overflow/OverflowItem.js";
4
- function n({ children: o, menuid: t, minStateWidth: e }) {
5
- const r = s(), i = e !== void 0 ? r.spacing(e) : void 0;
6
- return /* @__PURE__ */ m(f, { menuid: t, minStateWidth: i, children: o });
1
+ import '../Overflow/Overflow.css';
2
+ import { jsx as i } from "react/jsx-runtime";
3
+ import { useTheme as f } from "@mui/material/styles";
4
+ import s from "../Overflow/OverflowItem.js";
5
+ function n({ children: e, menuId: t, minStateWidth: o }) {
6
+ const r = f(), m = o !== void 0 ? r.spacing(o) : void 0;
7
+ return /* @__PURE__ */ i(s, { menuId: t, minStateWidth: m, children: e });
7
8
  }
8
- const v = Object.assign(n, { overflowRole: "item" });
9
+ n.overflowRole = "item";
9
10
  export {
10
- v as default
11
+ n as default
11
12
  };
12
13
  //# sourceMappingURL=MuiOverflowItem.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"MuiOverflowItem.js","sources":["../../../src/components/MuiOverflow/MuiOverflowItem.tsx"],"sourcesContent":["import { useTheme } from '@mui/material/styles';\nimport type { ReactNode } from 'react';\nimport { OverflowItem } from '../Overflow';\n\ninterface MuiOverflowItemProps {\n children: ReactNode;\n menuid?: string;\n minStateWidth?: number;\n}\n\nfunction MuiOverflowItem({ children, menuid, minStateWidth }: MuiOverflowItemProps) {\n const theme = useTheme();\n const cssWidth = minStateWidth !== undefined ? theme.spacing(minStateWidth) : undefined;\n\n return (\n <OverflowItem menuid={menuid} minStateWidth={cssWidth}>\n {children}\n </OverflowItem>\n );\n}\n\nexport default Object.assign(MuiOverflowItem, { overflowRole: 'item' as const });\n"],"names":["MuiOverflowItem","children","menuid","minStateWidth","theme","useTheme","cssWidth","jsx","OverflowItem","MuiOverflowItem_default"],"mappings":";;;AAUA,SAASA,EAAgB,EAAE,UAAAC,GAAU,QAAAC,GAAQ,eAAAC,KAAuC;AAClF,QAAMC,IAAQC,EAAA,GACRC,IAAWH,MAAkB,SAAYC,EAAM,QAAQD,CAAa,IAAI;AAE9E,SACE,gBAAAI,EAACC,GAAA,EAAa,QAAAN,GAAgB,eAAeI,GAC1C,UAAAL,GACH;AAEJ;AAEA,MAAAQ,IAAe,OAAO,OAAOT,GAAiB,EAAE,cAAc,QAAiB;"}
1
+ {"version":3,"file":"MuiOverflowItem.js","sources":["../../../src/components/MuiOverflow/MuiOverflowItem.tsx"],"sourcesContent":["import { useTheme } from '@mui/material/styles';\nimport type { ReactNode } from 'react';\nimport { OverflowItem } from '../Overflow';\n\ninterface MuiOverflowItemProps {\n children: ReactNode;\n menuId?: string;\n minStateWidth?: number;\n}\n\nfunction MuiOverflowItem({ children, menuId, minStateWidth }: MuiOverflowItemProps) {\n const theme = useTheme();\n const cssWidth = minStateWidth !== undefined ? theme.spacing(minStateWidth) : undefined;\n\n return (\n <OverflowItem menuId={menuId} minStateWidth={cssWidth}>\n {children}\n </OverflowItem>\n );\n}\n\nMuiOverflowItem.overflowRole = 'item' as const;\nexport default MuiOverflowItem;\n"],"names":["MuiOverflowItem","children","menuId","minStateWidth","theme","useTheme","cssWidth","jsx","OverflowItem"],"mappings":";;;;AAUA,SAASA,EAAgB,EAAE,UAAAC,GAAU,QAAAC,GAAQ,eAAAC,KAAuC;AAClF,QAAMC,IAAQC,EAAA,GACRC,IAAWH,MAAkB,SAAYC,EAAM,QAAQD,CAAa,IAAI;AAE9E,SACE,gBAAAI,EAACC,GAAA,EAAa,QAAAN,GAAgB,eAAeI,GAC1C,UAAAL,GACH;AAEJ;AAEAD,EAAgB,eAAe;"}
@@ -5,8 +5,8 @@ interface MuiOverflowMenuProps extends OverflowMenuControlProps {
5
5
  children: ReactNode;
6
6
  }
7
7
  declare function MuiOverflowMenu({ opener, children, open, onOpenChange }: MuiOverflowMenuProps): import("react/jsx-runtime").JSX.Element;
8
- declare const _default: typeof MuiOverflowMenu & {
9
- overflowRole: "menu";
10
- };
11
- export default _default;
8
+ declare namespace MuiOverflowMenu {
9
+ var overflowRole: "menu";
10
+ }
11
+ export default MuiOverflowMenu;
12
12
  //# sourceMappingURL=MuiOverflowMenu.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"MuiOverflowMenu.d.ts","sourceRoot":"","sources":["../../../src/components/MuiOverflow/MuiOverflowMenu.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,EAAgB,KAAK,wBAAwB,EAAwB,MAAM,aAAa,CAAC;AAEhG,UAAU,oBAAqB,SAAQ,wBAAwB;IAC7D,MAAM,EAAE,SAAS,CAAC;IAClB,QAAQ,EAAE,SAAS,CAAC;CACrB;AAED,iBAAS,eAAe,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE,oBAAoB,2CAYtF;;;;AAED,wBAAiF"}
1
+ {"version":3,"file":"MuiOverflowMenu.d.ts","sourceRoot":"","sources":["../../../src/components/MuiOverflow/MuiOverflowMenu.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,EAAgB,KAAK,wBAAwB,EAAwB,MAAM,aAAa,CAAC;AAEhG,UAAU,oBAAqB,SAAQ,wBAAwB;IAC7D,MAAM,EAAE,SAAS,CAAC;IAClB,QAAQ,EAAE,SAAS,CAAC;CACrB;AAED,iBAAS,eAAe,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE,oBAAoB,2CAYtF;kBAZQ,eAAe;;;AAexB,eAAe,eAAe,CAAC"}
@@ -1,11 +1,12 @@
1
- import { jsx as n } from "react/jsx-runtime";
2
- import M from "@mui/material/Menu";
3
- import c from "../Overflow/OverflowMenu.js";
4
- function m({ opener: r, children: o, open: u, onOpenChange: t }) {
5
- return /* @__PURE__ */ n(c, { opener: r, renderMenu: ({ anchorEl: f, open: i, onClose: e, children: l }) => /* @__PURE__ */ n(M, { anchorEl: f, open: i, onClose: e, onClick: e, children: l }), open: u, onOpenChange: t, children: o });
1
+ import '../Overflow/Overflow.css';
2
+ import { jsx as r } from "react/jsx-runtime";
3
+ import l from "@mui/material/Menu";
4
+ import p from "../Overflow/OverflowMenu.js";
5
+ function M({ opener: n, children: o, open: u, onOpenChange: i }) {
6
+ return /* @__PURE__ */ r(p, { opener: n, renderMenu: ({ anchorEl: t, open: f, onClose: e, children: m }) => /* @__PURE__ */ r(l, { anchorEl: t, open: f, onClose: e, onClick: e, children: m }), open: u, onOpenChange: i, children: o });
6
7
  }
7
- const v = Object.assign(m, { overflowRole: "menu" });
8
+ M.overflowRole = "menu";
8
9
  export {
9
- v as default
10
+ M as default
10
11
  };
11
12
  //# sourceMappingURL=MuiOverflowMenu.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"MuiOverflowMenu.js","sources":["../../../src/components/MuiOverflow/MuiOverflowMenu.tsx"],"sourcesContent":["import Menu from '@mui/material/Menu';\nimport type { ReactNode } from 'react';\nimport { OverflowMenu, type OverflowMenuControlProps, type RenderMenuProps } from '../Overflow';\n\ninterface MuiOverflowMenuProps extends OverflowMenuControlProps {\n opener: ReactNode;\n children: ReactNode;\n}\n\nfunction MuiOverflowMenu({ opener, children, open, onOpenChange }: MuiOverflowMenuProps) {\n const renderMenu = ({ anchorEl, open, onClose, children: menuChildren }: RenderMenuProps) => (\n <Menu anchorEl={anchorEl} open={open} onClose={onClose} onClick={onClose}>\n {menuChildren}\n </Menu>\n );\n\n return (\n <OverflowMenu opener={opener} renderMenu={renderMenu} open={open} onOpenChange={onOpenChange}>\n {children}\n </OverflowMenu>\n );\n}\n\nexport default Object.assign(MuiOverflowMenu, { overflowRole: 'menu' as const });\n"],"names":["MuiOverflowMenu","opener","children","open","onOpenChange","OverflowMenu","anchorEl","onClose","menuChildren","jsx","Menu","MuiOverflowMenu_default"],"mappings":";;;AASA,SAASA,EAAgB,EAAE,QAAAC,GAAQ,UAAAC,GAAU,MAAAC,GAAM,cAAAC,KAAsC;AAOvF,2BACGC,GAAA,EAAa,QAAAJ,GAAgB,YAPb,CAAC,EAAE,UAAAK,GAAU,MAAAH,GAAM,SAAAI,GAAS,UAAUC,QACvD,gBAAAC,EAACC,KAAK,UAAAJ,GAAoB,MAAMH,GAAM,SAAAI,GAAkB,SAASA,GAC9D,UAAAC,GACH,GAIsD,MAAAL,GAAY,cAAAC,GAC/D,UAAAF,GACH;AAEJ;AAEA,MAAAS,IAAe,OAAO,OAAOX,GAAiB,EAAE,cAAc,QAAiB;"}
1
+ {"version":3,"file":"MuiOverflowMenu.js","sources":["../../../src/components/MuiOverflow/MuiOverflowMenu.tsx"],"sourcesContent":["import Menu from '@mui/material/Menu';\nimport type { ReactNode } from 'react';\nimport { OverflowMenu, type OverflowMenuControlProps, type RenderMenuProps } from '../Overflow';\n\ninterface MuiOverflowMenuProps extends OverflowMenuControlProps {\n opener: ReactNode;\n children: ReactNode;\n}\n\nfunction MuiOverflowMenu({ opener, children, open, onOpenChange }: MuiOverflowMenuProps) {\n const renderMenu = ({ anchorEl, open, onClose, children: menuChildren }: RenderMenuProps) => (\n <Menu anchorEl={anchorEl} open={open} onClose={onClose} onClick={onClose}>\n {menuChildren}\n </Menu>\n );\n\n return (\n <OverflowMenu opener={opener} renderMenu={renderMenu} open={open} onOpenChange={onOpenChange}>\n {children}\n </OverflowMenu>\n );\n}\n\nMuiOverflowMenu.overflowRole = 'menu' as const;\nexport default MuiOverflowMenu;\n"],"names":["MuiOverflowMenu","opener","children","open","onOpenChange","OverflowMenu","anchorEl","onClose","menuChildren","jsx","Menu"],"mappings":";;;;AASA,SAASA,EAAgB,EAAE,QAAAC,GAAQ,UAAAC,GAAU,MAAAC,GAAM,cAAAC,KAAsC;AAOvF,2BACGC,GAAA,EAAa,QAAAJ,GAAgB,YAPb,CAAC,EAAE,UAAAK,GAAU,MAAAH,GAAM,SAAAI,GAAS,UAAUC,QACvD,gBAAAC,EAACC,KAAK,UAAAJ,GAAoB,MAAMH,GAAM,SAAAI,GAAkB,SAASA,GAC9D,UAAAC,GACH,GAIsD,MAAAL,GAAY,cAAAC,GAC/D,UAAAF,GACH;AAEJ;AAEAF,EAAgB,eAAe;"}
@@ -1,3 +1,4 @@
1
+ import '../Overflow/Overflow.css';
1
2
  export { default as MuiOverflow } from './MuiOverflow';
2
3
  export { default as MuiOverflowItem } from './MuiOverflowItem';
3
4
  export { default as MuiOverflowMenu } from './MuiOverflowMenu';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/MuiOverflow/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAC/D,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,mBAAmB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/MuiOverflow/index.ts"],"names":[],"mappings":"AAAA,OAAO,0BAA0B,CAAC;AAClC,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAC/D,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,mBAAmB,CAAC"}
@@ -2,11 +2,13 @@ import { type OverflowHost, type ScanResult } from '../Overflow/OverflowControll
2
2
  export interface OverflowToolbarOptions {
3
3
  compact?: boolean;
4
4
  reverse?: boolean;
5
+ snap?: boolean;
5
6
  }
6
7
  export declare class OverflowToolbar implements OverflowHost {
7
8
  private ul;
8
9
  private compact;
9
10
  private reverse;
11
+ private snap;
10
12
  private controller;
11
13
  constructor(ul: HTMLUListElement, opts?: OverflowToolbarOptions);
12
14
  /** Re-scan after external DOM changes and restart the observer. */
@@ -16,6 +18,7 @@ export declare class OverflowToolbar implements OverflowHost {
16
18
  getContainerEl(): HTMLElement;
17
19
  isCompact(): boolean;
18
20
  isReverse(): boolean;
21
+ isSnap(): boolean;
19
22
  scanChildren(): ScanResult;
20
23
  private setupPopover;
21
24
  }
@@ -1 +1 @@
1
- {"version":3,"file":"NoFrameworkOverflow.d.ts","sourceRoot":"","sources":["../../../src/components/NoFrameworkOverflow/NoFrameworkOverflow.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,YAAY,EACjB,KAAK,UAAU,EAGhB,MAAM,gCAAgC,CAAC;AAExC,MAAM,WAAW,sBAAsB;IACrC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,qBAAa,eAAgB,YAAW,YAAY;IAClD,OAAO,CAAC,EAAE,CAAmB;IAC7B,OAAO,CAAC,OAAO,CAAU;IACzB,OAAO,CAAC,OAAO,CAAU;IACzB,OAAO,CAAC,UAAU,CAAqB;gBAE3B,EAAE,EAAE,gBAAgB,EAAE,IAAI,GAAE,sBAA2B;IAanE,mEAAmE;IACnE,MAAM,IAAI,IAAI;IAId,uDAAuD;IACvD,OAAO,IAAI,IAAI;IAOf,cAAc,IAAI,WAAW;IAI7B,SAAS,IAAI,OAAO;IAIpB,SAAS,IAAI,OAAO;IAIpB,YAAY,IAAI,UAAU;IA8D1B,OAAO,CAAC,YAAY;CAcrB"}
1
+ {"version":3,"file":"NoFrameworkOverflow.d.ts","sourceRoot":"","sources":["../../../src/components/NoFrameworkOverflow/NoFrameworkOverflow.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,YAAY,EACjB,KAAK,UAAU,EAGhB,MAAM,gCAAgC,CAAC;AAExC,MAAM,WAAW,sBAAsB;IACrC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,qBAAa,eAAgB,YAAW,YAAY;IAClD,OAAO,CAAC,EAAE,CAAmB;IAC7B,OAAO,CAAC,OAAO,CAAU;IACzB,OAAO,CAAC,OAAO,CAAU;IACzB,OAAO,CAAC,IAAI,CAAU;IACtB,OAAO,CAAC,UAAU,CAAqB;gBAE3B,EAAE,EAAE,gBAAgB,EAAE,IAAI,GAAE,sBAA2B;IAenE,mEAAmE;IACnE,MAAM,IAAI,IAAI;IAId,uDAAuD;IACvD,OAAO,IAAI,IAAI;IAOf,cAAc,IAAI,WAAW;IAI7B,SAAS,IAAI,OAAO;IAIpB,SAAS,IAAI,OAAO;IAIpB,MAAM,IAAI,OAAO;IAIjB,YAAY,IAAI,UAAU;IA8D1B,OAAO,CAAC,YAAY;CAcrB"}
@@ -1,11 +1,12 @@
1
- import { OverflowController as v } from "../Overflow/OverflowController.js";
1
+ import { OverflowController as p } from "../Overflow/OverflowController.js";
2
2
  class y {
3
3
  ul;
4
4
  compact;
5
5
  reverse;
6
+ snap;
6
7
  controller;
7
- constructor(o, e = {}) {
8
- this.ul = o, this.compact = e.compact ?? !1, this.reverse = e.reverse ?? !1, this.ul.classList.add("overflow"), this.compact && this.ul.classList.add("overflow-compact"), this.reverse && this.ul.classList.add("overflow-reverse"), this.controller = new v(this), this.controller.connect();
8
+ constructor(s, e = {}) {
9
+ this.ul = s, this.compact = e.compact ?? !1, this.reverse = e.reverse ?? !1, this.snap = e.snap ?? !1, this.ul.classList.add("overflow"), this.compact && this.ul.classList.add("overflow-compact"), this.reverse && this.ul.classList.add("overflow-reverse"), this.snap && this.ul.classList.add("overflow-snap"), this.controller = new p(this), this.controller.connect();
9
10
  }
10
11
  /** Re-scan after external DOM changes and restart the observer. */
11
12
  update() {
@@ -13,7 +14,7 @@ class y {
13
14
  }
14
15
  /** Tear down ResizeObserver and clean up DOM state. */
15
16
  destroy() {
16
- this.controller.disconnect(), this.ul.classList.remove("overflow", "overflow-compact", "overflow-reverse");
17
+ this.controller.disconnect(), this.ul.classList.remove("overflow", "overflow-compact", "overflow-reverse", "overflow-snap");
17
18
  }
18
19
  /* ── OverflowHost ─────────────────────────────────────── */
19
20
  getContainerEl() {
@@ -25,27 +26,30 @@ class y {
25
26
  isReverse() {
26
27
  return this.reverse;
27
28
  }
29
+ isSnap() {
30
+ return this.snap;
31
+ }
28
32
  scanChildren() {
29
- const o = [];
30
- let e = null, r = -1, s = -1, l = 0;
33
+ const s = [];
34
+ let e = null, o = -1, r = -1, l = 0;
31
35
  for (const t of Array.from(this.ul.children)) {
32
36
  const n = t.dataset.overflowRole;
33
37
  if (n) {
34
- if (n === "item" && (s === -1 && (s = l), o.push({
38
+ if (n === "item" && (r === -1 && (r = l), s.push({
35
39
  el: t,
36
40
  buttonEl: t.querySelector("button"),
37
- menuid: t.dataset.menuid || void 0,
41
+ menuId: t.dataset.menuId || void 0,
38
42
  minStateWidth: t.dataset.minStateWidth || void 0
39
43
  })), n === "menu") {
40
- r = l;
44
+ o = l;
41
45
  const c = t.querySelector("[data-menu-trigger]"), i = t.querySelector("[data-menu-panel]");
42
46
  if (c && i) {
43
47
  t.classList.add("overflow-opener"), i.setAttribute("popover", ""), this.setupPopover(c, i);
44
48
  const a = Array.from(i.children), d = /* @__PURE__ */ new Set();
45
49
  let u = !1;
46
50
  for (const h of a) {
47
- const m = h.dataset.menuid;
48
- m ? d.add(m) : u = !0;
51
+ const f = h.dataset.menuId;
52
+ f ? d.add(f) : u = !0;
49
53
  }
50
54
  e = {
51
55
  el: t,
@@ -59,16 +63,16 @@ class y {
59
63
  l++;
60
64
  }
61
65
  }
62
- const f = r !== -1 && (s === -1 || r < s);
63
- return { items: o, menu: e, menuFirst: f };
66
+ const m = o !== -1 && (r === -1 || o < r);
67
+ return { items: s, menu: e, menuFirst: m };
64
68
  }
65
- setupPopover(o, e) {
66
- o.addEventListener("click", () => {
69
+ setupPopover(s, e) {
70
+ s.addEventListener("click", () => {
67
71
  if (e.matches(":popover-open"))
68
72
  e.hidePopover();
69
73
  else {
70
- const r = o.getBoundingClientRect();
71
- e.style.position = "fixed", e.style.top = `${r.bottom + 4}px`, e.style.left = `${r.left}px`, e.style.margin = "0", e.showPopover();
74
+ const o = s.getBoundingClientRect();
75
+ e.style.position = "fixed", e.style.top = `${o.bottom + 4}px`, e.style.left = `${o.left}px`, e.style.margin = "0", e.showPopover();
72
76
  }
73
77
  });
74
78
  }
@@ -1 +1 @@
1
- {"version":3,"file":"NoFrameworkOverflow.js","sources":["../../../src/components/NoFrameworkOverflow/NoFrameworkOverflow.ts"],"sourcesContent":["import {\n OverflowController,\n type OverflowHost,\n type ScanResult,\n type ScannedItem,\n type ScannedMenu,\n} from '../Overflow/OverflowController';\n\nexport interface OverflowToolbarOptions {\n compact?: boolean;\n reverse?: boolean;\n}\n\nexport class OverflowToolbar implements OverflowHost {\n private ul: HTMLUListElement;\n private compact: boolean;\n private reverse: boolean;\n private controller: OverflowController;\n\n constructor(ul: HTMLUListElement, opts: OverflowToolbarOptions = {}) {\n this.ul = ul;\n this.compact = opts.compact ?? false;\n this.reverse = opts.reverse ?? false;\n\n this.ul.classList.add('overflow');\n if (this.compact) this.ul.classList.add('overflow-compact');\n if (this.reverse) this.ul.classList.add('overflow-reverse');\n\n this.controller = new OverflowController(this);\n this.controller.connect();\n }\n\n /** Re-scan after external DOM changes and restart the observer. */\n update(): void {\n this.controller.update();\n }\n\n /** Tear down ResizeObserver and clean up DOM state. */\n destroy(): void {\n this.controller.disconnect();\n this.ul.classList.remove('overflow', 'overflow-compact', 'overflow-reverse');\n }\n\n /* ── OverflowHost ─────────────────────────────────────── */\n\n getContainerEl(): HTMLElement {\n return this.ul;\n }\n\n isCompact(): boolean {\n return this.compact;\n }\n\n isReverse(): boolean {\n return this.reverse;\n }\n\n scanChildren(): ScanResult {\n const items: ScannedItem[] = [];\n let menu: ScannedMenu | null = null;\n let menuIndex = -1;\n let firstItemIndex = -1;\n let index = 0;\n\n for (const child of Array.from(this.ul.children) as HTMLElement[]) {\n const role = child.dataset.overflowRole as 'item' | 'menu' | undefined;\n if (!role) continue;\n\n if (role === 'item') {\n if (firstItemIndex === -1) firstItemIndex = index;\n items.push({\n el: child,\n buttonEl: child.querySelector('button'),\n menuid: child.dataset.menuid || undefined,\n minStateWidth: child.dataset.minStateWidth || undefined,\n });\n }\n\n if (role === 'menu') {\n menuIndex = index;\n const trigger = child.querySelector<HTMLElement>('[data-menu-trigger]');\n const panel = child.querySelector<HTMLElement>('[data-menu-panel]');\n\n if (trigger && panel) {\n child.classList.add('overflow-opener');\n panel.setAttribute('popover', '');\n this.setupPopover(trigger, panel);\n\n const menuItemEls = Array.from(panel.children) as HTMLElement[];\n const inMenuIds = new Set<string>();\n let hasMenuOnlyItems = false;\n for (const mi of menuItemEls) {\n const mid = mi.dataset.menuid;\n if (mid) {\n inMenuIds.add(mid);\n } else {\n hasMenuOnlyItems = true;\n }\n }\n\n menu = {\n el: child,\n triggerEl: trigger,\n menuItemEls,\n inMenuIds,\n hasMenuOnlyItems,\n };\n }\n }\n\n index++;\n }\n\n const menuFirst =\n menuIndex !== -1 && (firstItemIndex === -1 || menuIndex < firstItemIndex);\n\n return { items, menu, menuFirst };\n }\n\n private setupPopover(trigger: HTMLElement, panel: HTMLElement): void {\n trigger.addEventListener('click', () => {\n if (panel.matches(':popover-open')) {\n panel.hidePopover();\n } else {\n const rect = trigger.getBoundingClientRect();\n panel.style.position = 'fixed';\n panel.style.top = `${rect.bottom + 4}px`;\n panel.style.left = `${rect.left}px`;\n panel.style.margin = '0';\n panel.showPopover();\n }\n });\n }\n}\n"],"names":["OverflowToolbar","ul","opts","OverflowController","items","menu","menuIndex","firstItemIndex","index","child","role","trigger","panel","menuItemEls","inMenuIds","hasMenuOnlyItems","mi","mid","menuFirst","rect"],"mappings":";AAaO,MAAMA,EAAwC;AAAA,EAC3C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAER,YAAYC,GAAsBC,IAA+B,IAAI;AACnE,SAAK,KAAKD,GACV,KAAK,UAAUC,EAAK,WAAW,IAC/B,KAAK,UAAUA,EAAK,WAAW,IAE/B,KAAK,GAAG,UAAU,IAAI,UAAU,GAC5B,KAAK,WAAS,KAAK,GAAG,UAAU,IAAI,kBAAkB,GACtD,KAAK,WAAS,KAAK,GAAG,UAAU,IAAI,kBAAkB,GAE1D,KAAK,aAAa,IAAIC,EAAmB,IAAI,GAC7C,KAAK,WAAW,QAAA;AAAA,EAClB;AAAA;AAAA,EAGA,SAAe;AACb,SAAK,WAAW,OAAA;AAAA,EAClB;AAAA;AAAA,EAGA,UAAgB;AACd,SAAK,WAAW,WAAA,GAChB,KAAK,GAAG,UAAU,OAAO,YAAY,oBAAoB,kBAAkB;AAAA,EAC7E;AAAA;AAAA,EAIA,iBAA8B;AAC5B,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,YAAqB;AACnB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,YAAqB;AACnB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,eAA2B;AACzB,UAAMC,IAAuB,CAAA;AAC7B,QAAIC,IAA2B,MAC3BC,IAAY,IACZC,IAAiB,IACjBC,IAAQ;AAEZ,eAAWC,KAAS,MAAM,KAAK,KAAK,GAAG,QAAQ,GAAoB;AACjE,YAAMC,IAAOD,EAAM,QAAQ;AAC3B,UAAKC,GAYL;AAAA,YAVIA,MAAS,WACPH,MAAmB,OAAIA,IAAiBC,IAC5CJ,EAAM,KAAK;AAAA,UACT,IAAIK;AAAA,UACJ,UAAUA,EAAM,cAAc,QAAQ;AAAA,UACtC,QAAQA,EAAM,QAAQ,UAAU;AAAA,UAChC,eAAeA,EAAM,QAAQ,iBAAiB;AAAA,QAAA,CAC/C,IAGCC,MAAS,QAAQ;AACnB,UAAAJ,IAAYE;AACZ,gBAAMG,IAAUF,EAAM,cAA2B,qBAAqB,GAChEG,IAAQH,EAAM,cAA2B,mBAAmB;AAElE,cAAIE,KAAWC,GAAO;AACpB,YAAAH,EAAM,UAAU,IAAI,iBAAiB,GACrCG,EAAM,aAAa,WAAW,EAAE,GAChC,KAAK,aAAaD,GAASC,CAAK;AAEhC,kBAAMC,IAAc,MAAM,KAAKD,EAAM,QAAQ,GACvCE,wBAAgB,IAAA;AACtB,gBAAIC,IAAmB;AACvB,uBAAWC,KAAMH,GAAa;AAC5B,oBAAMI,IAAMD,EAAG,QAAQ;AACvB,cAAIC,IACFH,EAAU,IAAIG,CAAG,IAEjBF,IAAmB;AAAA,YAEvB;AAEA,YAAAV,IAAO;AAAA,cACL,IAAII;AAAA,cACJ,WAAWE;AAAA,cACX,aAAAE;AAAA,cACA,WAAAC;AAAA,cACA,kBAAAC;AAAA,YAAA;AAAA,UAEJ;AAAA,QACF;AAEA,QAAAP;AAAA;AAAA,IACF;AAEA,UAAMU,IACJZ,MAAc,OAAOC,MAAmB,MAAMD,IAAYC;AAE5D,WAAO,EAAE,OAAAH,GAAO,MAAAC,GAAM,WAAAa,EAAA;AAAA,EACxB;AAAA,EAEQ,aAAaP,GAAsBC,GAA0B;AACnE,IAAAD,EAAQ,iBAAiB,SAAS,MAAM;AACtC,UAAIC,EAAM,QAAQ,eAAe;AAC/B,QAAAA,EAAM,YAAA;AAAA,WACD;AACL,cAAMO,IAAOR,EAAQ,sBAAA;AACrB,QAAAC,EAAM,MAAM,WAAW,SACvBA,EAAM,MAAM,MAAM,GAAGO,EAAK,SAAS,CAAC,MACpCP,EAAM,MAAM,OAAO,GAAGO,EAAK,IAAI,MAC/BP,EAAM,MAAM,SAAS,KACrBA,EAAM,YAAA;AAAA,MACR;AAAA,IACF,CAAC;AAAA,EACH;AACF;"}
1
+ {"version":3,"file":"NoFrameworkOverflow.js","sources":["../../../src/components/NoFrameworkOverflow/NoFrameworkOverflow.ts"],"sourcesContent":["import {\n OverflowController,\n type OverflowHost,\n type ScanResult,\n type ScannedItem,\n type ScannedMenu,\n} from '../Overflow/OverflowController';\n\nexport interface OverflowToolbarOptions {\n compact?: boolean;\n reverse?: boolean;\n snap?: boolean;\n}\n\nexport class OverflowToolbar implements OverflowHost {\n private ul: HTMLUListElement;\n private compact: boolean;\n private reverse: boolean;\n private snap: boolean;\n private controller: OverflowController;\n\n constructor(ul: HTMLUListElement, opts: OverflowToolbarOptions = {}) {\n this.ul = ul;\n this.compact = opts.compact ?? false;\n this.reverse = opts.reverse ?? false;\n this.snap = opts.snap ?? false;\n\n this.ul.classList.add('overflow');\n if (this.compact) this.ul.classList.add('overflow-compact');\n if (this.reverse) this.ul.classList.add('overflow-reverse');\n if (this.snap) this.ul.classList.add('overflow-snap');\n\n this.controller = new OverflowController(this);\n this.controller.connect();\n }\n\n /** Re-scan after external DOM changes and restart the observer. */\n update(): void {\n this.controller.update();\n }\n\n /** Tear down ResizeObserver and clean up DOM state. */\n destroy(): void {\n this.controller.disconnect();\n this.ul.classList.remove('overflow', 'overflow-compact', 'overflow-reverse', 'overflow-snap');\n }\n\n /* ── OverflowHost ─────────────────────────────────────── */\n\n getContainerEl(): HTMLElement {\n return this.ul;\n }\n\n isCompact(): boolean {\n return this.compact;\n }\n\n isReverse(): boolean {\n return this.reverse;\n }\n\n isSnap(): boolean {\n return this.snap;\n }\n\n scanChildren(): ScanResult {\n const items: ScannedItem[] = [];\n let menu: ScannedMenu | null = null;\n let menuIndex = -1;\n let firstItemIndex = -1;\n let index = 0;\n\n for (const child of Array.from(this.ul.children) as HTMLElement[]) {\n const role = child.dataset.overflowRole as 'item' | 'menu' | undefined;\n if (!role) continue;\n\n if (role === 'item') {\n if (firstItemIndex === -1) firstItemIndex = index;\n items.push({\n el: child,\n buttonEl: child.querySelector('button'),\n menuId: child.dataset.menuId || undefined,\n minStateWidth: child.dataset.minStateWidth || undefined,\n });\n }\n\n if (role === 'menu') {\n menuIndex = index;\n const trigger = child.querySelector<HTMLElement>('[data-menu-trigger]');\n const panel = child.querySelector<HTMLElement>('[data-menu-panel]');\n\n if (trigger && panel) {\n child.classList.add('overflow-opener');\n panel.setAttribute('popover', '');\n this.setupPopover(trigger, panel);\n\n const menuItemEls = Array.from(panel.children) as HTMLElement[];\n const inMenuIds = new Set<string>();\n let hasMenuOnlyItems = false;\n for (const mi of menuItemEls) {\n const mid = mi.dataset.menuId;\n if (mid) {\n inMenuIds.add(mid);\n } else {\n hasMenuOnlyItems = true;\n }\n }\n\n menu = {\n el: child,\n triggerEl: trigger,\n menuItemEls,\n inMenuIds,\n hasMenuOnlyItems,\n };\n }\n }\n\n index++;\n }\n\n const menuFirst =\n menuIndex !== -1 && (firstItemIndex === -1 || menuIndex < firstItemIndex);\n\n return { items, menu, menuFirst };\n }\n\n private setupPopover(trigger: HTMLElement, panel: HTMLElement): void {\n trigger.addEventListener('click', () => {\n if (panel.matches(':popover-open')) {\n panel.hidePopover();\n } else {\n const rect = trigger.getBoundingClientRect();\n panel.style.position = 'fixed';\n panel.style.top = `${rect.bottom + 4}px`;\n panel.style.left = `${rect.left}px`;\n panel.style.margin = '0';\n panel.showPopover();\n }\n });\n }\n}\n"],"names":["OverflowToolbar","ul","opts","OverflowController","items","menu","menuIndex","firstItemIndex","index","child","role","trigger","panel","menuItemEls","inMenuIds","hasMenuOnlyItems","mi","mid","menuFirst","rect"],"mappings":"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"}
@@ -1,3 +1,5 @@
1
+ import '../Overflow/Overflow.css';
2
+ import './noframework.css';
1
3
  export { OverflowToolbar } from './NoFrameworkOverflow';
2
4
  export type { OverflowToolbarOptions } from './NoFrameworkOverflow';
3
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/NoFrameworkOverflow/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,YAAY,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/NoFrameworkOverflow/index.ts"],"names":[],"mappings":"AAAA,OAAO,0BAA0B,CAAC;AAClC,OAAO,mBAAmB,CAAC;AAC3B,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,YAAY,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC"}
@@ -1,110 +1 @@
1
- /* ── NoFramework Overflow Styles ──────────────────────────── */
2
- /* Self-contained: includes both layout and theme. */
3
- /* Deep orange theme, distinct from Rx (purple) and MUI. */
4
-
5
- /* ── Toolbar button ──────────────────────────────────────── */
6
- .nf-btn {
7
- display: inline-flex;
8
- align-items: center;
9
- gap: 0.5rem;
10
- padding: 0.375rem 1rem;
11
- border: none;
12
- border-radius: 0.375rem;
13
- background: oklch(0.65 0.24 50);
14
- color: white;
15
- font-size: 0.9375rem;
16
- line-height: 1.75;
17
- font-weight: 500;
18
- white-space: nowrap;
19
- cursor: pointer;
20
- user-select: none;
21
- transition: background 0.15s;
22
- height: 2.5rem;
23
-
24
- &:hover {
25
- background: oklch(0.60 0.24 50);
26
- }
27
-
28
- &:active {
29
- background: oklch(0.55 0.24 50);
30
- }
31
-
32
- &:focus-visible {
33
- outline: 2px solid oklch(0.70 0.24 50 / 0.5);
34
- outline-offset: 2px;
35
- }
36
- }
37
-
38
- /* ── Popover panel ───────────────────────────────────────── */
39
- .nf-menu-panel {
40
- z-index: 50;
41
- min-width: 8rem;
42
- padding: 0.25rem;
43
- border-radius: 0.375rem;
44
- border: 1px solid oklch(0.90 0.01 50);
45
- background: white;
46
- box-shadow:
47
- 0 4px 6px -1px oklch(0 0 0 / 0.1),
48
- 0 2px 4px -2px oklch(0 0 0 / 0.1);
49
- }
50
-
51
- /* Popover API animation */
52
- @keyframes nf-popover-in {
53
- from { opacity: 0; transform: scale(0.95) translateY(-4px); }
54
- to { opacity: 1; transform: scale(1) translateY(0); }
55
- }
56
-
57
- @keyframes nf-popover-out {
58
- from { opacity: 1; transform: scale(1) translateY(0); }
59
- to { opacity: 0; transform: scale(0.95) translateY(-4px); }
60
- }
61
-
62
- .nf-menu-panel:popover-open {
63
- animation: nf-popover-in 0.15s ease-out;
64
- }
65
-
66
- /* ── Popover menu item ───────────────────────────────────── */
67
- .nf-menu-item {
68
- display: flex;
69
- width: 100%;
70
- align-items: center;
71
- gap: 0.5rem;
72
- padding: 0.375rem 0.5rem;
73
- border: none;
74
- border-radius: 0.25rem;
75
- background: transparent;
76
- color: oklch(0.30 0.02 50);
77
- font-size: 0.9375rem;
78
- line-height: 1.75;
79
- text-align: left;
80
- cursor: default;
81
- user-select: none;
82
- transition: background 0.1s, color 0.1s;
83
-
84
- &:hover {
85
- background: oklch(0.95 0.01 50);
86
- color: oklch(0.20 0.02 50);
87
- }
88
-
89
- &:active {
90
- background: oklch(0.92 0.02 50);
91
- }
92
-
93
- &:focus-visible {
94
- outline: none;
95
- background: oklch(0.95 0.01 50);
96
- color: oklch(0.20 0.02 50);
97
- }
98
- }
99
-
100
- /* ── Menu separator ──────────────────────────────────────── */
101
- .nf-separator {
102
- height: 1px;
103
- margin: 0.25rem 0;
104
- background: oklch(0.90 0.01 50);
105
- }
106
-
107
- .nf-btn svg {
108
- min-width: 24px;
109
- min-height: 24px;
110
- }
1
+ .nf-btn{display:inline-flex;align-items:center;gap:.5rem;padding:.375rem 1rem;border:none;border-radius:.375rem;background:#de6800;background:oklch(.65 .24 50);color:#fff;font-size:.9375rem;line-height:1.75;font-weight:500;white-space:nowrap;cursor:pointer;-webkit-user-select:none;user-select:none;transition:background .15s;height:2.5rem}.nf-btn:hover{background:#c85d00;background:oklch(.6 .24 50)}.nf-btn:active{background:#b25200;background:oklch(.55 .24 50)}.nf-btn:focus-visible{outline:2px solid oklch(.7 .24 50 / .5);outline-offset:2px}.nf-menu-panel{z-index:50;min-width:8rem;padding:.25rem;border-radius:.375rem;border:1px solid oklch(.9 .01 50);background:#fff;box-shadow:0 4px 6px -1px #0000001a,0 2px 4px -2px #0000001a}@keyframes nf-popover-in{0%{opacity:0;transform:scale(.95) translateY(-4px)}to{opacity:1;transform:scale(1) translateY(0)}}@keyframes nf-popover-out{0%{opacity:1;transform:scale(1) translateY(0)}to{opacity:0;transform:scale(.95) translateY(-4px)}}.nf-menu-panel:popover-open{animation:nf-popover-in .15s ease-out}.nf-menu-item{display:flex;width:100%;align-items:center;gap:.5rem;padding:.375rem .5rem;border:none;border-radius:.25rem;background:transparent;color:#362b25;font-size:.9375rem;line-height:1.75;text-align:left;cursor:default;-webkit-user-select:none;user-select:none;transition:background .1s,color .1s}.nf-menu-item:hover{background:#f4ede9;color:#1e130e}.nf-menu-item:active{background:#f0e1d9}.nf-menu-item:focus-visible{outline:none;background:#f4ede9;color:#1e130e}.nf-separator{height:1px;margin:.25rem 0;background:#e4dcd8}.nf-btn svg{min-width:24px;min-height:24px}