@mortenbrudvik/waveui 0.15.0 → 0.16.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 (155) hide show
  1. package/README.md +274 -24
  2. package/dist/components/data-display/List.cjs +1 -1
  3. package/dist/components/data-display/List.cjs.map +1 -1
  4. package/dist/components/data-display/List.mjs +405 -219
  5. package/dist/components/data-display/List.mjs.map +1 -1
  6. package/dist/components/data-display/List.registry.cjs +1 -1
  7. package/dist/components/data-display/List.registry.cjs.map +1 -1
  8. package/dist/components/data-display/List.registry.mjs +12 -6
  9. package/dist/components/data-display/List.registry.mjs.map +1 -1
  10. package/dist/components/input/Combobox.cjs +1 -1
  11. package/dist/components/input/Combobox.cjs.map +1 -1
  12. package/dist/components/input/Combobox.mjs +163 -148
  13. package/dist/components/input/Combobox.mjs.map +1 -1
  14. package/dist/components/input/Dropdown.cjs +1 -1
  15. package/dist/components/input/Dropdown.cjs.map +1 -1
  16. package/dist/components/input/Dropdown.mjs +132 -117
  17. package/dist/components/input/Dropdown.mjs.map +1 -1
  18. package/dist/components/input/Listbox.cjs +1 -1
  19. package/dist/components/input/Listbox.cjs.map +1 -1
  20. package/dist/components/input/Listbox.mjs +90 -78
  21. package/dist/components/input/Listbox.mjs.map +1 -1
  22. package/dist/components/input/Option.cjs +1 -1
  23. package/dist/components/input/Option.cjs.map +1 -1
  24. package/dist/components/input/Option.data.cjs +2 -0
  25. package/dist/components/input/Option.data.cjs.map +1 -0
  26. package/dist/components/input/Option.data.mjs +114 -0
  27. package/dist/components/input/Option.data.mjs.map +1 -0
  28. package/dist/components/input/Option.mjs +21 -17
  29. package/dist/components/input/Option.mjs.map +1 -1
  30. package/dist/components/layout/FlatTree.cjs +2 -0
  31. package/dist/components/layout/FlatTree.cjs.map +1 -0
  32. package/dist/components/layout/FlatTree.context.cjs +2 -0
  33. package/dist/components/layout/FlatTree.context.cjs.map +1 -0
  34. package/dist/components/layout/FlatTree.context.mjs +20 -0
  35. package/dist/components/layout/FlatTree.context.mjs.map +1 -0
  36. package/dist/components/layout/FlatTree.item.cjs +2 -0
  37. package/dist/components/layout/FlatTree.item.cjs.map +1 -0
  38. package/dist/components/layout/FlatTree.item.mjs +90 -0
  39. package/dist/components/layout/FlatTree.item.mjs.map +1 -0
  40. package/dist/components/layout/FlatTree.mjs +276 -0
  41. package/dist/components/layout/FlatTree.mjs.map +1 -0
  42. package/dist/components/layout/Tree.core.cjs +1 -1
  43. package/dist/components/layout/Tree.core.cjs.map +1 -1
  44. package/dist/components/layout/Tree.core.mjs +166 -165
  45. package/dist/components/layout/Tree.core.mjs.map +1 -1
  46. package/dist/components/layout/Tree.selection.cjs +1 -1
  47. package/dist/components/layout/Tree.selection.cjs.map +1 -1
  48. package/dist/components/layout/Tree.selection.mjs +11 -57
  49. package/dist/components/layout/Tree.selection.mjs.map +1 -1
  50. package/dist/components/layout/useFlatTree.cjs +2 -0
  51. package/dist/components/layout/useFlatTree.cjs.map +1 -0
  52. package/dist/components/layout/useFlatTree.mjs +83 -0
  53. package/dist/components/layout/useFlatTree.mjs.map +1 -0
  54. package/dist/components/table/DataGrid.cjs +1 -1
  55. package/dist/components/table/DataGrid.cjs.map +1 -1
  56. package/dist/components/table/DataGrid.context.cjs +2 -0
  57. package/dist/components/table/DataGrid.context.cjs.map +1 -0
  58. package/dist/components/table/DataGrid.context.mjs +74 -0
  59. package/dist/components/table/DataGrid.context.mjs.map +1 -0
  60. package/dist/components/table/DataGrid.header.cjs +2 -0
  61. package/dist/components/table/DataGrid.header.cjs.map +1 -0
  62. package/dist/components/table/DataGrid.header.mjs +168 -0
  63. package/dist/components/table/DataGrid.header.mjs.map +1 -0
  64. package/dist/components/table/DataGrid.mjs +488 -591
  65. package/dist/components/table/DataGrid.mjs.map +1 -1
  66. package/dist/components/table/DataGrid.sizing.cjs +2 -0
  67. package/dist/components/table/DataGrid.sizing.cjs.map +1 -0
  68. package/dist/components/table/DataGrid.sizing.mjs +187 -0
  69. package/dist/components/table/DataGrid.sizing.mjs.map +1 -0
  70. package/dist/components/table/DataGrid.store.cjs +2 -0
  71. package/dist/components/table/DataGrid.store.cjs.map +1 -0
  72. package/dist/components/table/DataGrid.store.mjs +108 -0
  73. package/dist/components/table/DataGrid.store.mjs.map +1 -0
  74. package/dist/components/table/DataGrid.window.cjs +2 -0
  75. package/dist/components/table/DataGrid.window.cjs.map +1 -0
  76. package/dist/components/table/DataGrid.window.mjs +165 -0
  77. package/dist/components/table/DataGrid.window.mjs.map +1 -0
  78. package/dist/components/table/Table.cjs +1 -1
  79. package/dist/components/table/Table.cjs.map +1 -1
  80. package/dist/components/table/Table.mjs +74 -72
  81. package/dist/components/table/Table.mjs.map +1 -1
  82. package/dist/components/table/Table.resize.cjs +2 -0
  83. package/dist/components/table/Table.resize.cjs.map +1 -0
  84. package/dist/components/table/Table.resize.mjs +98 -0
  85. package/dist/components/table/Table.resize.mjs.map +1 -0
  86. package/dist/components/table/useGridNavigation.cjs +1 -1
  87. package/dist/components/table/useGridNavigation.cjs.map +1 -1
  88. package/dist/components/table/useGridNavigation.mjs +343 -140
  89. package/dist/components/table/useGridNavigation.mjs.map +1 -1
  90. package/dist/components/table/useTableColumnSizing.cjs +2 -0
  91. package/dist/components/table/useTableColumnSizing.cjs.map +1 -0
  92. package/dist/components/table/useTableColumnSizing.mjs +76 -0
  93. package/dist/components/table/useTableColumnSizing.mjs.map +1 -0
  94. package/dist/components/table/useTableFeatures.cjs +2 -0
  95. package/dist/components/table/useTableFeatures.cjs.map +1 -0
  96. package/dist/components/table/useTableFeatures.mjs +110 -0
  97. package/dist/components/table/useTableFeatures.mjs.map +1 -0
  98. package/dist/components/table/useTableSelection.cjs +2 -0
  99. package/dist/components/table/useTableSelection.cjs.map +1 -0
  100. package/dist/components/table/useTableSelection.mjs +39 -0
  101. package/dist/components/table/useTableSelection.mjs.map +1 -0
  102. package/dist/components/table/useTableSort.cjs +2 -0
  103. package/dist/components/table/useTableSort.cjs.map +1 -0
  104. package/dist/components/table/useTableSort.mjs +58 -0
  105. package/dist/components/table/useTableSort.mjs.map +1 -0
  106. package/dist/hooks/useActiveDescendant.cjs +1 -1
  107. package/dist/hooks/useActiveDescendant.cjs.map +1 -1
  108. package/dist/hooks/useActiveDescendant.mjs +33 -25
  109. package/dist/hooks/useActiveDescendant.mjs.map +1 -1
  110. package/dist/hooks/useListbox.cjs +1 -1
  111. package/dist/hooks/useListbox.cjs.map +1 -1
  112. package/dist/hooks/useListbox.mjs +140 -130
  113. package/dist/hooks/useListbox.mjs.map +1 -1
  114. package/dist/hooks/useRovingTabIndex.cjs +1 -1
  115. package/dist/hooks/useRovingTabIndex.cjs.map +1 -1
  116. package/dist/hooks/useRovingTabIndex.mjs +1 -1
  117. package/dist/hooks/useRovingTabIndex.mjs.map +1 -1
  118. package/dist/hooks/useSelection.cjs +2 -0
  119. package/dist/hooks/useSelection.cjs.map +1 -0
  120. package/dist/hooks/useSelection.mjs +57 -0
  121. package/dist/hooks/useSelection.mjs.map +1 -0
  122. package/dist/hooks/useVirtualWindow.cjs +2 -0
  123. package/dist/hooks/useVirtualWindow.cjs.map +1 -0
  124. package/dist/hooks/useVirtualWindow.mjs +102 -0
  125. package/dist/hooks/useVirtualWindow.mjs.map +1 -0
  126. package/dist/index.cjs +1 -1
  127. package/dist/index.d.cts +1542 -53
  128. package/dist/index.d.ts +1542 -53
  129. package/dist/index.mjs +147 -136
  130. package/dist/lib/classNames.cjs +1 -1
  131. package/dist/lib/classNames.cjs.map +1 -1
  132. package/dist/lib/classNames.mjs +68 -49
  133. package/dist/lib/classNames.mjs.map +1 -1
  134. package/dist/lib/columnSizing.cjs +2 -0
  135. package/dist/lib/columnSizing.cjs.map +1 -0
  136. package/dist/lib/columnSizing.mjs +27 -0
  137. package/dist/lib/columnSizing.mjs.map +1 -0
  138. package/dist/lib/flatTree.cjs +2 -0
  139. package/dist/lib/flatTree.cjs.map +1 -0
  140. package/dist/lib/flatTree.mjs +118 -0
  141. package/dist/lib/flatTree.mjs.map +1 -0
  142. package/dist/lib/selection.cjs +2 -0
  143. package/dist/lib/selection.cjs.map +1 -0
  144. package/dist/lib/selection.mjs +28 -0
  145. package/dist/lib/selection.mjs.map +1 -0
  146. package/dist/lib/treeCascade.cjs +2 -0
  147. package/dist/lib/treeCascade.cjs.map +1 -0
  148. package/dist/lib/treeCascade.mjs +52 -0
  149. package/dist/lib/treeCascade.mjs.map +1 -0
  150. package/dist/lib/virtual.cjs +2 -0
  151. package/dist/lib/virtual.cjs.map +1 -0
  152. package/dist/lib/virtual.mjs +54 -0
  153. package/dist/lib/virtual.mjs.map +1 -0
  154. package/dist/styles.css +1 -1
  155. package/package.json +1 -1
@@ -17,25 +17,26 @@ import { forcedColors as y } from "../../lib/styles.mjs";
17
17
  import { CheckIcon as ne, ChevronRightIcon as re, SubtractIcon as ie } from "../../lib/icons.mjs";
18
18
  import { isEditableTarget as ae, isOwnEvent as b } from "../../lib/events.mjs";
19
19
  import { useCollapsePresence as oe } from "../../hooks/useCollapsePresence.mjs";
20
- import { TreeCheckForcedContext as x, TreeContext as se, TreeItemContext as ce, TreeLabelContext as S, TreeParentContext as le, useTreeContext as ue } from "./Tree.context.mjs";
21
- import { collectItems as de, computeCheckStates as C, toggleCheck as fe } from "./Tree.selection.mjs";
22
- import * as w from "react";
23
- import { jsx as T, jsxs as E } from "react/jsx-runtime";
20
+ import { TreeCheckForcedContext as x, TreeContext as se, TreeItemContext as ce, TreeLabelContext as S, TreeParentContext as C, useTreeContext as le } from "./Tree.context.mjs";
21
+ import { computeCheckStates as ue, toggleCheck as de } from "../../lib/treeCascade.mjs";
22
+ import { collectItems as w } from "./Tree.selection.mjs";
23
+ import * as T from "react";
24
+ import { jsx as E, jsxs as D } from "react/jsx-runtime";
24
25
  //#region src/components/layout/Tree.core.tsx
25
- var pe = [], me = "Tree.Item was rendered inside the label of another Tree.Item, so it is not part of that item's child group: the parent cannot expand, its name includes the nested text, and a treeitem sits inside a label (axe aria-required-parent). A Tree.Item finds its nested items among its own children (written directly, in Fragments, or returned by a render function such as `children.map(renderNode)`), but not inside a component that renders Tree.Item itself. Build a data-driven tree with a render function instead of a recursive component.";
26
- function he(e) {
26
+ var fe = [], pe = "Tree.Item was rendered inside the label of another Tree.Item, so it is not part of that item's child group: the parent cannot expand, its name includes the nested text, and a treeitem sits inside a label (axe aria-required-parent). A Tree.Item finds its nested items among its own children (written directly, in Fragments, or returned by a render function such as `children.map(renderNode)`), but not inside a component that renders Tree.Item itself. Build a data-driven tree with a render function instead of a recursive component.";
27
+ function me(e) {
27
28
  i(`Tree:duplicate:${e}`, `Tree: several items share the value "${e}". Item values must be unique within a Tree; items with the same value share their expanded, selected and focus state.`);
28
29
  }
29
- var ge = "Tree: `selected` has no effect with selectionMode=\"multiple\"; use `checkedItems`, and `current` for the item the user is on.", _e = "Tree: `checkedItems` and `defaultCheckedItems` need selectionMode=\"multiple\"; without it the tree draws no checkboxes and ignores them.", ve = "Tree: selectionMode=\"single\" draws a radio on every item for `selected`; pass `selected` (null while nothing is selected) and update it from `onItemSelect`.";
30
- function D(e) {
30
+ var he = "Tree: `selected` has no effect with selectionMode=\"multiple\"; use `checkedItems`, and `current` for the item the user is on.", ge = "Tree: `checkedItems` and `defaultCheckedItems` need selectionMode=\"multiple\"; without it the tree draws no checkboxes and ignores them.", _e = "Tree: selectionMode=\"single\" draws a radio on every item for `selected`; pass `selected` (null while nothing is selected) and update it from `onItemSelect`.";
31
+ function O(e) {
31
32
  return e ? Array.from(e, (e) => e.current).filter((e) => e !== null).sort((e, t) => !e.element || !t.element || e.element === t.element ? 0 : e.element.compareDocumentPosition(t.element) & Node.DOCUMENT_POSITION_FOLLOWING ? -1 : 1).map((e) => e.node) : [];
32
33
  }
33
- var O = "[role=\"treeitem\"]", k = "button, [href], input, select, textarea, [role=\"button\"], [tabindex]", ye = "[&:focus-within:not(:has(>*>[role=group]_:focus))>[data-tree-row]_[data-tree-actions]]:visible", be = "[@media(hover:hover)]:not-forced-colors:[&:focus-within:not(:has(>*>[role=group]_:focus))>[data-tree-row]_[data-tree-aside]]:invisible", A = "invisible group-hover/row:visible focus-within:visible forced-colors:visible [@media(hover:none)]:visible has-[[aria-expanded=true]]:visible data-[focus-in-popup]:visible", xe = "not-forced-colors:group-hover/row:invisible [@media(hover:hover)]:not-forced-colors:group-focus-within/end:invisible [@media(hover:hover)]:not-forced-colors:group-has-[[aria-expanded=true]]/end:invisible [@media(hover:hover)]:not-forced-colors:group-has-[[data-focus-in-popup]]/end:invisible", Se = "[&>*]:[grid-area:1/1] forced-colors:flex [@media(hover:none)]:flex";
34
- function j(e) {
34
+ var k = "[role=\"treeitem\"]", A = "button, [href], input, select, textarea, [role=\"button\"], [tabindex]", ve = "[&:focus-within:not(:has(>*>[role=group]_:focus))>[data-tree-row]_[data-tree-actions]]:visible", ye = "[@media(hover:hover)]:not-forced-colors:[&:focus-within:not(:has(>*>[role=group]_:focus))>[data-tree-row]_[data-tree-aside]]:invisible", j = "invisible group-hover/row:visible focus-within:visible forced-colors:visible [@media(hover:none)]:visible has-[[aria-expanded=true]]:visible data-[focus-in-popup]:visible", be = "not-forced-colors:group-hover/row:invisible [@media(hover:hover)]:not-forced-colors:group-focus-within/end:invisible [@media(hover:hover)]:not-forced-colors:group-has-[[aria-expanded=true]]/end:invisible [@media(hover:hover)]:not-forced-colors:group-has-[[data-focus-in-popup]]/end:invisible", xe = "[&>*]:[grid-area:1/1] forced-colors:flex [@media(hover:none)]:flex";
35
+ function M(e) {
35
36
  let t = e.querySelector(":scope > [data-tree-row] [data-tree-actions]");
36
37
  if (!t) return !1;
37
38
  let n = /* @__PURE__ */ new Map();
38
- for (let e of Array.from(t.querySelectorAll(k))) {
39
+ for (let e of Array.from(t.querySelectorAll(A))) {
39
40
  if (g(e) || e.matches(":disabled")) continue;
40
41
  let r = e.closest("[hidden], [inert]");
41
42
  if (r && t.contains(r)) continue;
@@ -44,106 +45,106 @@ function j(e) {
44
45
  }
45
46
  return !1;
46
47
  }
47
- var M = ({ expandedItems: t, defaultExpandedItems: n, onExpandedItemsChange: a, onItemSelect: o, selected: s, current: u, selectionMode: p = "none", navigationMode: m = "tree", checkedItems: h, defaultCheckedItems: g, onCheckedItemsChange: _, motion: te, className: y, children: ne, onKeyDown: re, onKeyDownCapture: ie, onFocus: ae, onBlur: b, ref: oe, ...ce }) => {
48
- let [ue] = w.useState(() => n ?? pe), [de, C] = f(t, ue, (e) => a?.([...e])), E = w.useMemo(() => new Set(de), [de]), me = w.useCallback((e) => {
49
- C((t) => t.includes(e) ? t.filter((t) => t !== e) : [...t, e]);
50
- }, [C]), k = w.useCallback((e) => {
51
- C((t) => {
48
+ var N = ({ expandedItems: t, defaultExpandedItems: n, onExpandedItemsChange: a, onItemSelect: o, selected: s, current: u, selectionMode: p = "none", navigationMode: m = "tree", checkedItems: h, defaultCheckedItems: g, onCheckedItemsChange: _, motion: te, className: y, children: ne, onKeyDown: re, onKeyDownCapture: ie, onFocus: ae, onBlur: b, ref: oe, ...ce }) => {
49
+ let [le] = T.useState(() => n ?? fe), [ue, w] = f(t, le, (e) => a?.([...e])), D = T.useMemo(() => new Set(ue), [ue]), pe = T.useCallback((e) => {
50
+ w((t) => t.includes(e) ? t.filter((t) => t !== e) : [...t, e]);
51
+ }, [w]), A = T.useCallback((e) => {
52
+ w((t) => {
52
53
  let n = e.filter((e) => !t.includes(e));
53
54
  return n.length > 0 ? [...t, ...n] : t;
54
55
  });
55
- }, [C]), ye = d((e) => {
56
+ }, [w]), ve = d((e) => {
56
57
  o?.(e);
57
- }), [be] = w.useState(() => g ?? pe), A = w.useRef(void 0), [xe, Se] = f(h, be, (e) => _?.([...e], A.current)), j = w.useMemo(() => new Set(xe), [xe]), M = w.useRef(null), Ce = w.useCallback((e) => {
58
- M.current ??= /* @__PURE__ */ new Set();
59
- let t = M.current;
58
+ }), [ye] = T.useState(() => g ?? fe), j = T.useRef(void 0), [be, xe] = f(h, ye, (e) => _?.([...e], j.current)), M = T.useMemo(() => new Set(be), [be]), N = T.useRef(null), Se = T.useCallback((e) => {
59
+ N.current ??= /* @__PURE__ */ new Set();
60
+ let t = N.current;
60
61
  return t.add(e), () => {
61
62
  t.delete(e);
62
63
  };
63
- }, []), we = d((e, t) => {
64
- let n = D(M.current);
65
- Se((r) => {
66
- let i = fe(n, r, e);
67
- return A.current = {
64
+ }, []), Ce = d((e, t) => {
65
+ let n = O(N.current);
66
+ xe((r) => {
67
+ let i = de(n, r, e);
68
+ return j.current = {
68
69
  value: e,
69
70
  checked: i.includes(e),
70
71
  event: t
71
72
  }, i;
72
- }), A.current = void 0;
73
- }), P = p === "multiple" ? void 0 : p === "single" ? s ?? null : s;
74
- w.useEffect(() => {
75
- p === "multiple" && s !== void 0 && i("Tree:selected-with-multiple", ge);
76
- }, [p, s]), w.useEffect(() => {
77
- p === "single" && s === void 0 && i("Tree:single-without-selected", ve);
73
+ }), j.current = void 0;
74
+ }), F = p === "multiple" ? void 0 : p === "single" ? s ?? null : s;
75
+ T.useEffect(() => {
76
+ p === "multiple" && s !== void 0 && i("Tree:selected-with-multiple", he);
77
+ }, [p, s]), T.useEffect(() => {
78
+ p === "single" && s === void 0 && i("Tree:single-without-selected", _e);
78
79
  }, [p, s]);
79
- let F = h !== void 0 || g !== void 0;
80
- w.useEffect(() => {
81
- p !== "multiple" && F && i("Tree:checked-without-multiple", _e);
82
- }, [p, F]);
83
- let [I, L] = w.useState(null), R = w.useRef(null), z = w.useCallback((e) => {
80
+ let I = h !== void 0 || g !== void 0;
81
+ T.useEffect(() => {
82
+ p !== "multiple" && I && i("Tree:checked-without-multiple", ge);
83
+ }, [p, I]);
84
+ let [L, R] = T.useState(null), z = T.useRef(null), B = T.useCallback((e) => {
84
85
  if (!r) return () => {};
85
- R.current ??= /* @__PURE__ */ new Map();
86
- let t = R.current, n = (t.get(e) ?? 0) + 1;
87
- return t.set(e, n), n > 1 && he(e), () => {
86
+ z.current ??= /* @__PURE__ */ new Map();
87
+ let t = z.current, n = (t.get(e) ?? 0) + 1;
88
+ return t.set(e, n), n > 1 && me(e), () => {
88
89
  let n = (t.get(e) ?? 1) - 1;
89
90
  n > 0 ? t.set(e, n) : t.delete(e);
90
91
  };
91
- }, []), { containerProps: B, getTabIndex: V, focusValue: H } = v({
92
- activeValue: I ?? P ?? null,
93
- itemSelector: O,
92
+ }, []), { containerProps: V, getTabIndex: H, focusValue: U } = v({
93
+ activeValue: L ?? F ?? null,
94
+ itemSelector: k,
94
95
  orientation: "vertical",
95
96
  loop: !1,
96
97
  typeahead: !0
97
- }), U = w.useMemo(() => ({
98
- expanded: E,
99
- toggle: me,
100
- expand: k,
101
- activate: ye,
102
- selected: P,
98
+ }), we = T.useMemo(() => ({
99
+ expanded: D,
100
+ toggle: pe,
101
+ expand: A,
102
+ activate: ve,
103
+ selected: F,
103
104
  current: u,
104
- getTabIndex: V,
105
- focusValue: H,
106
- onItemFocus: L,
107
- focusedItem: I,
105
+ getTabIndex: H,
106
+ focusValue: U,
107
+ onItemFocus: R,
108
+ focusedItem: L,
108
109
  navigationMode: m,
109
- registerValue: z,
110
+ registerValue: B,
110
111
  selectionMode: p,
111
- checked: j,
112
- toggleChecked: we,
113
- registerTopLevel: Ce,
112
+ checked: M,
113
+ toggleChecked: Ce,
114
+ registerTopLevel: Se,
114
115
  motion: te
115
116
  }), [
116
- E,
117
- me,
118
- k,
119
- ye,
120
- P,
117
+ D,
118
+ pe,
119
+ A,
120
+ ve,
121
+ F,
121
122
  u,
122
- V,
123
123
  H,
124
- I,
124
+ U,
125
+ L,
125
126
  m,
126
- z,
127
+ B,
127
128
  p,
128
- j,
129
- we,
129
+ M,
130
130
  Ce,
131
+ Se,
131
132
  te
132
- ]), Te = ee(oe, B.ref), W = (e) => {
133
- e.key.length === 1 && N(e.currentTarget), B.onKeyDown(e);
133
+ ]), Te = ee(oe, V.ref), W = (e) => {
134
+ e.key.length === 1 && P(e.currentTarget), V.onKeyDown(e);
134
135
  }, Ee = (e) => {
135
- e.key === " " && N(e.currentTarget), B.onKeyDownCapture(e);
136
+ e.key === " " && P(e.currentTarget), V.onKeyDownCapture(e);
136
137
  }, De = (e) => {
137
138
  let t = e.relatedTarget;
138
- (!t || !e.currentTarget.contains(t)) && L(null);
139
+ (!t || !e.currentTarget.contains(t)) && R(null);
139
140
  };
140
- return /* @__PURE__ */ T(se.Provider, {
141
- value: U,
142
- children: /* @__PURE__ */ T(le.Provider, {
141
+ return /* @__PURE__ */ E(se.Provider, {
142
+ value: we,
143
+ children: /* @__PURE__ */ E(C.Provider, {
143
144
  value: null,
144
- children: /* @__PURE__ */ T(x.Provider, {
145
+ children: /* @__PURE__ */ E(x.Provider, {
145
146
  value: !1,
146
- children: /* @__PURE__ */ T("div", {
147
+ children: /* @__PURE__ */ E("div", {
147
148
  role: "tree",
148
149
  "data-selection-mode": p,
149
150
  "aria-multiselectable": p === "multiple" || void 0,
@@ -152,10 +153,10 @@ var M = ({ expandedItems: t, defaultExpandedItems: n, onExpandedItemsChange: a,
152
153
  "data-roving-container": "",
153
154
  onKeyDown: c(re, W),
154
155
  onKeyDownCapture: c(ie, Ee),
155
- onFocus: c(ae, B.onFocus, { checkDefaultPrevented: !1 }),
156
+ onFocus: c(ae, V.onFocus, { checkDefaultPrevented: !1 }),
156
157
  onBlur: c(b, De, { checkDefaultPrevented: !1 }),
157
158
  ref: Te,
158
- children: /* @__PURE__ */ T(S.Provider, {
159
+ children: /* @__PURE__ */ E(S.Provider, {
159
160
  value: !1,
160
161
  children: ne
161
162
  })
@@ -164,8 +165,8 @@ var M = ({ expandedItems: t, defaultExpandedItems: n, onExpandedItemsChange: a,
164
165
  })
165
166
  });
166
167
  };
167
- M.displayName = "Tree";
168
- function N(e) {
168
+ N.displayName = "Tree";
169
+ function P(e) {
169
170
  e.querySelectorAll("[role=\"treeitem\"]").forEach((e) => {
170
171
  let t = e.querySelector(":scope > [data-tree-row] > [data-tree-label]");
171
172
  if (!t) return;
@@ -173,23 +174,23 @@ function N(e) {
173
174
  e.getAttribute("data-roving-text") !== r && e.setAttribute("data-roving-text", r);
174
175
  });
175
176
  }
176
- function Ce(e) {
177
+ function Se(e) {
177
178
  let t = e.target;
178
179
  return !t?.closest?.("[data-tree-actions]") && t?.closest?.("[role=\"treeitem\"]") === e.currentTarget;
179
180
  }
180
- function we(e) {
181
+ function Ce(e) {
181
182
  let t = e.target;
182
183
  return t === e.currentTarget ? e.detail === 0 || !e.currentTarget.querySelector(":scope > [inert]") : !t?.closest?.("[data-tree-checkbox], [data-tree-actions]") && t?.closest?.("[data-tree-row]")?.parentElement === e.currentTarget;
183
184
  }
184
- var P = ({ labelledBy: t, tabStop: n, navigationMode: r, onReturn: i, children: a }) => {
185
+ var F = ({ labelledBy: t, tabStop: n, navigationMode: r, onReturn: i, children: a }) => {
185
186
  let o = r === "treegrid", { containerProps: { ref: s }, handleKeyDown: c, handleFocus: l } = v({
186
- itemSelector: k,
187
+ itemSelector: A,
187
188
  manageTabIndex: !0,
188
189
  orientation: "horizontal",
189
190
  loop: !o,
190
191
  tabStop: n
191
- }), [d, f] = w.useState(null);
192
- w.useEffect(() => {
192
+ }), [d, f] = T.useState(null);
193
+ T.useEffect(() => {
193
194
  if (d !== "leaving") return;
194
195
  let e = requestAnimationFrame(() => f(null));
195
196
  return () => cancelAnimationFrame(e);
@@ -208,7 +209,7 @@ var P = ({ labelledBy: t, tabStop: n, navigationMode: r, onReturn: i, children:
208
209
  dir: h(e.currentTarget)
209
210
  }) === "prev";
210
211
  };
211
- return /* @__PURE__ */ T("span", {
212
+ return /* @__PURE__ */ E("span", {
212
213
  role: "toolbar",
213
214
  "aria-labelledby": t,
214
215
  "aria-orientation": "horizontal",
@@ -222,71 +223,71 @@ var P = ({ labelledBy: t, tabStop: n, navigationMode: r, onReturn: i, children:
222
223
  },
223
224
  onFocus: p,
224
225
  onBlur: g,
225
- className: e(u.actions, "inline-flex items-center gap-1", A),
226
+ className: e(u.actions, "inline-flex items-center gap-1", j),
226
227
  children: a
227
228
  });
228
229
  };
229
- P.displayName = "TreeItemActions";
230
- var F = ({ value: r, icon: l, iconAfter: d, expandIcon: f, aside: g, actions: _, leaf: v = !1, className: ae, children: b, onClick: se, onKeyDown: fe, onFocus: pe, onBlur: he, ref: ge, ..._e }) => {
231
- let { "data-roving-text": ve, ...D } = _e, O = ue("Tree.Item"), k = w.useContext(le), A = w.useContext(S), N = O.expanded.has(r), I = p("tree-item-label"), L = p("tree-item-aside"), R = w.useContext(x), z = w.useRef(null), B = ee(ge, z), [V, H] = w.useState(null), U = w.useCallback((e) => (H(e), () => H((t) => t === e ? null : t)), []), Te = w.useMemo(() => ({ registerLayout: U }), [U]), W = V?.nameId ?? I, { registerValue: Ee, registerTopLevel: De } = O;
232
- w.useEffect(() => Ee(r), [Ee, r]), w.useEffect(() => {
233
- A && i("Tree.Item:inside-label", me);
234
- }, [A]);
230
+ F.displayName = "TreeItemActions";
231
+ var I = ({ value: r, icon: l, iconAfter: d, expandIcon: f, aside: g, actions: _, leaf: v = !1, className: ae, children: b, onClick: se, onKeyDown: de, onFocus: fe, onBlur: me, ref: he, ...ge }) => {
232
+ let { "data-roving-text": _e, ...O } = ge, k = le("Tree.Item"), A = T.useContext(C), j = T.useContext(S), P = k.expanded.has(r), L = p("tree-item-label"), R = p("tree-item-aside"), z = T.useContext(x), B = T.useRef(null), V = ee(he, B), [H, U] = T.useState(null), we = T.useCallback((e) => (U(e), () => U((t) => t === e ? null : t)), []), Te = T.useMemo(() => ({ registerLayout: we }), [we]), W = H?.nameId ?? L, { registerValue: Ee, registerTopLevel: De } = k;
233
+ T.useEffect(() => Ee(r), [Ee, r]), T.useEffect(() => {
234
+ j && i("Tree.Item:inside-label", pe);
235
+ }, [j]);
235
236
  let G = [], Oe = [], ke;
236
237
  t(b).forEach(({ key: e, node: t }) => {
237
- let r = /* @__PURE__ */ T(w.Fragment, { children: t }, e);
238
- n(t, F) ? (ke ??= t.props.value, G.push(r)) : n(t, M) ? G.push(r) : Oe.push(r);
238
+ let r = /* @__PURE__ */ E(T.Fragment, { children: t }, e);
239
+ n(t, I) ? (ke ??= t.props.value, G.push(r)) : n(t, N) ? G.push(r) : Oe.push(r);
239
240
  });
240
- let Ae = l && s(l) ? o(l, "span", e(u.icon, "inline-flex shrink-0"), { "aria-hidden": !0 }) : null, je = d && s(d) ? o(d, "span", e(u.iconAfter, "inline-flex shrink-0"), { "aria-hidden": !0 }) : null, K = s(g), q = s(_), J = G.length > 0 && !v, Me = w.useRef(null), { isMounted: Ne, wrapperRef: Pe, presenceProps: Fe, className: Ie } = oe(J && N, {
241
- motion: O.motion,
241
+ let Ae = l && s(l) ? o(l, "span", e(u.icon, "inline-flex shrink-0"), { "aria-hidden": !0 }) : null, je = d && s(d) ? o(d, "span", e(u.iconAfter, "inline-flex shrink-0"), { "aria-hidden": !0 }) : null, K = s(g), q = s(_), J = G.length > 0 && !v, Me = T.useRef(null), { isMounted: Ne, wrapperRef: Pe, presenceProps: Fe, className: Ie } = oe(J && P, {
242
+ motion: k.motion,
242
243
  partRef: Me,
243
- getTrigger: () => z.current
244
- }), Le = /* @__PURE__ */ T("span", {
244
+ getTrigger: () => B.current
245
+ }), Le = /* @__PURE__ */ E("span", {
245
246
  className: "w-3 shrink-0",
246
247
  "aria-hidden": "true"
247
248
  });
248
- J && f == null ? Le = /* @__PURE__ */ T(re, { className: e(u.expandIcon, "shrink-0 transition-transform motion-reduce:transition-none", N ? "rotate-90" : "wave-rtl:-scale-x-100") }) : J && s(f) && (Le = o(f, "span", e(u.expandIcon, "inline-flex shrink-0"), { "aria-hidden": !0 }));
249
- let Y = O.selectionMode === "multiple", X = w.useMemo(() => Y ? {
249
+ J && f == null ? Le = /* @__PURE__ */ E(re, { className: e(u.expandIcon, "shrink-0 transition-transform motion-reduce:transition-none", P ? "rotate-90" : "wave-rtl:-scale-x-100") }) : J && s(f) && (Le = o(f, "span", e(u.expandIcon, "inline-flex shrink-0"), { "aria-hidden": !0 }));
250
+ let Y = k.selectionMode === "multiple", X = T.useMemo(() => Y ? {
250
251
  value: r,
251
- children: v ? [] : de(b, {
252
- item: F,
253
- tree: M
252
+ children: v ? [] : w(b, {
253
+ item: I,
254
+ tree: N
254
255
  })
255
256
  } : null, [
256
257
  Y,
257
258
  r,
258
259
  v,
259
260
  b
260
- ]), Z = X ? C([X], O.checked, R).get(r) : void 0, Re = w.useRef(null);
261
- w.useLayoutEffect(() => {
261
+ ]), Z = X ? ue([X], k.checked, z).get(r) : void 0, Re = T.useRef(null);
262
+ T.useLayoutEffect(() => {
262
263
  Re.current = X ? {
263
264
  node: X,
264
- element: z.current
265
+ element: B.current
265
266
  } : null;
266
267
  });
267
- let ze = k === null && !A;
268
- w.useLayoutEffect(() => Y && ze ? De(Re) : void 0, [
268
+ let ze = A === null && !j;
269
+ T.useLayoutEffect(() => Y && ze ? De(Re) : void 0, [
269
270
  Y,
270
271
  ze,
271
272
  De
272
273
  ]);
273
- let Q = O.selected === void 0 ? void 0 : O.selected === r, Be = O.current !== void 0 && O.current !== null && O.current === r, Ve = () => {
274
- J && O.toggle(r), O.activate(r);
274
+ let Q = k.selected === void 0 ? void 0 : k.selected === r, Be = k.current !== void 0 && k.current !== null && k.current === r, Ve = () => {
275
+ J && k.toggle(r), k.activate(r);
275
276
  }, He = (e) => {
276
- we(e) && (se?.(e), e.defaultPrevented || Ve());
277
+ Ce(e) && (se?.(e), e.defaultPrevented || Ve());
277
278
  }, Ue = (e) => {
278
- if (!Ce(e) || (fe?.(e), e.defaultPrevented || e.altKey || e.ctrlKey || e.metaKey)) return;
279
+ if (!Se(e) || (de?.(e), e.defaultPrevented || e.altKey || e.ctrlKey || e.metaKey)) return;
279
280
  switch (e.key) {
280
281
  case "Enter":
281
282
  e.preventDefault(), Ve();
282
283
  return;
283
284
  case " ":
284
- e.preventDefault(), Z === void 0 ? Ve() : O.toggleChecked(r, e.nativeEvent);
285
+ e.preventDefault(), Z === void 0 ? Ve() : k.toggleChecked(r, e.nativeEvent);
285
286
  return;
286
287
  case "*": {
287
288
  e.preventDefault();
288
289
  let t = e.currentTarget.parentElement?.querySelectorAll(":scope > [role=\"treeitem\"][aria-expanded=\"false\"][data-roving-value]");
289
- O.expand(Array.from(t ?? [], (e) => e.getAttribute("data-roving-value") ?? "").filter(Boolean));
290
+ k.expand(Array.from(t ?? [], (e) => e.getAttribute("data-roving-value") ?? "").filter(Boolean));
290
291
  return;
291
292
  }
292
293
  }
@@ -295,87 +296,87 @@ var F = ({ value: r, icon: l, iconAfter: d, expandIcon: f, aside: g, actions: _,
295
296
  dir: h(e.currentTarget)
296
297
  });
297
298
  if (t === "next") {
298
- if (e.preventDefault(), J && !N) {
299
- O.toggle(r);
299
+ if (e.preventDefault(), J && !P) {
300
+ k.toggle(r);
300
301
  return;
301
302
  }
302
- if (O.navigationMode === "treegrid" && j(e.currentTarget)) return;
303
- J && ke !== void 0 && O.focusValue(ke);
304
- } else t === "prev" && (e.preventDefault(), J && N ? O.toggle(r) : k !== null && O.focusValue(k));
305
- }, $ = w.useRef(null), We = (e) => e.target.closest("[data-tree-actions]")?.closest("[role=\"treeitem\"]") === e.currentTarget, Ge = (e) => {
306
- (e.target === e.currentTarget || We(e)) && O.onItemFocus(r), We(e) && ($.current = e.target);
303
+ if (k.navigationMode === "treegrid" && M(e.currentTarget)) return;
304
+ J && ke !== void 0 && k.focusValue(ke);
305
+ } else t === "prev" && (e.preventDefault(), J && P ? k.toggle(r) : A !== null && k.focusValue(A));
306
+ }, $ = T.useRef(null), We = (e) => e.target.closest("[data-tree-actions]")?.closest("[role=\"treeitem\"]") === e.currentTarget, Ge = (e) => {
307
+ (e.target === e.currentTarget || We(e)) && k.onItemFocus(r), We(e) && ($.current = e.target);
307
308
  }, Ke = (e) => {
308
309
  We(e) && (e.relatedTarget !== null || e.target.isConnected) && ($.current = null);
309
310
  };
310
- w.useLayoutEffect(() => {
311
+ T.useLayoutEffect(() => {
311
312
  let e = $.current;
312
313
  if (!e) return;
313
- let t = z.current, n = t?.ownerDocument.activeElement;
314
+ let t = B.current, n = t?.ownerDocument.activeElement;
314
315
  n && n !== t.ownerDocument.body ? $.current = null : t && !e.isConnected && ($.current = null, t.focus({ preventScroll: !0 }));
315
316
  });
316
- let qe = Z === void 0 ? null : /* @__PURE__ */ T("span", {
317
+ let qe = Z === void 0 ? null : /* @__PURE__ */ E("span", {
317
318
  role: "checkbox",
318
319
  "aria-checked": Z === "mixed" ? "mixed" : Z === "checked",
319
320
  "aria-labelledby": W,
320
321
  tabIndex: -1,
321
322
  "data-tree-checkbox": "",
322
323
  onMouseDown: (e) => {
323
- e.preventDefault(), z.current?.focus({ preventScroll: !0 });
324
+ e.preventDefault(), B.current?.focus({ preventScroll: !0 });
324
325
  },
325
326
  onClick: (e) => {
326
- O.toggleChecked(r, e.nativeEvent);
327
+ k.toggleChecked(r, e.nativeEvent);
327
328
  },
328
329
  className: e(u.indicator, "relative inline-flex size-4 shrink-0 items-center justify-center rounded-xs border transition-colors motion-reduce:transition-none", "before:absolute before:-inset-1", Z === "unchecked" ? e("border-stroke-accessible bg-transparent", y.control) : "border-primary bg-primary text-primary-foreground forced-colors:border-[Highlight] forced-colors:bg-[Highlight]"),
329
- children: Z === "mixed" ? /* @__PURE__ */ T(ie, {
330
+ children: Z === "mixed" ? /* @__PURE__ */ E(ie, {
330
331
  size: 12,
331
332
  className: y.selectedLeaf
332
- }) : Z === "checked" ? /* @__PURE__ */ T(ne, {
333
+ }) : Z === "checked" ? /* @__PURE__ */ E(ne, {
333
334
  size: 12,
334
335
  className: y.selectedLeaf
335
336
  }) : null
336
- }), Je = O.selectionMode === "single" ? /* @__PURE__ */ T("span", {
337
+ }), Je = k.selectionMode === "single" ? /* @__PURE__ */ E("span", {
337
338
  "aria-hidden": "true",
338
339
  className: e(u.indicator, "inline-flex size-4 shrink-0 items-center justify-center rounded-full border transition-colors motion-reduce:transition-none", Q ? "border-2 border-primary forced-colors:border-[Highlight]" : e("border-stroke-accessible", y.control)),
339
- children: Q && /* @__PURE__ */ T("span", { className: e("block size-2 rounded-full bg-primary", y.selectedLeaf) })
340
- }) : null, Ye = qe ?? Je, Xe = R || Y && O.checked.has(r);
341
- return /* @__PURE__ */ E("div", {
340
+ children: Q && /* @__PURE__ */ E("span", { className: e("block size-2 rounded-full bg-primary", y.selectedLeaf) })
341
+ }) : null, Ye = qe ?? Je, Xe = z || Y && k.checked.has(r);
342
+ return /* @__PURE__ */ D("div", {
342
343
  role: "treeitem",
343
344
  "aria-selected": Q,
344
345
  "aria-current": Be ? !0 : void 0,
345
346
  "data-checked": Z === "checked" ? "" : void 0,
346
347
  "data-mixed": Z === "mixed" ? "" : void 0,
347
- className: e(u.root, "block outline-none", "[&:focus-visible>[data-tree-row]]:outline-2 [&:focus-visible>[data-tree-row]]:-outline-offset-2 [&:focus-visible>[data-tree-row]]:outline-ring", q && ye, q && K && be, ae),
348
- ...D,
349
- "aria-labelledby": D["aria-labelledby"] ?? (D["aria-label"] === void 0 ? W : void 0),
350
- "aria-describedby": te(D["aria-describedby"], K ? L : void 0, V?.descriptionId),
351
- "aria-expanded": J ? N : void 0,
348
+ className: e(u.root, "block outline-none", "[&:focus-visible>[data-tree-row]]:outline-2 [&:focus-visible>[data-tree-row]]:-outline-offset-2 [&:focus-visible>[data-tree-row]]:outline-ring", q && ve, q && K && ye, ae),
349
+ ...O,
350
+ "aria-labelledby": O["aria-labelledby"] ?? (O["aria-label"] === void 0 ? W : void 0),
351
+ "aria-describedby": te(O["aria-describedby"], K ? R : void 0, H?.descriptionId),
352
+ "aria-expanded": J ? P : void 0,
352
353
  "aria-checked": Z === void 0 ? void 0 : Z === "mixed" ? "mixed" : Z === "checked",
353
- tabIndex: O.getTabIndex(r),
354
+ tabIndex: k.getTabIndex(r),
354
355
  "data-roving-value": r,
355
356
  "data-selected": Q ? "" : void 0,
356
357
  "data-current": Be ? "" : void 0,
357
358
  onClick: He,
358
359
  onKeyDown: Ue,
359
- onFocus: (e) => c(pe, Ge, { checkDefaultPrevented: !1 })(e),
360
- onBlur: (e) => c(he, Ke, { checkDefaultPrevented: !1 })(e),
361
- ref: B,
362
- children: [/* @__PURE__ */ E("div", {
360
+ onFocus: (e) => c(fe, Ge, { checkDefaultPrevented: !1 })(e),
361
+ onBlur: (e) => c(me, Ke, { checkDefaultPrevented: !1 })(e),
362
+ ref: V,
363
+ children: [/* @__PURE__ */ D("div", {
363
364
  "data-tree-row": "",
364
365
  className: e(u.row, "flex cursor-pointer items-center gap-1.5 rounded px-2 py-1 hover:bg-subtle-hover", q && "group/row", Q && e("bg-subtle-selected font-semibold", y.selectedContainer)),
365
366
  children: [
366
367
  Le,
367
368
  Ye,
368
369
  Ae,
369
- /* @__PURE__ */ T("span", {
370
- id: I,
370
+ /* @__PURE__ */ E("span", {
371
+ id: L,
371
372
  "data-tree-label": "",
372
- "data-roving-text": ve,
373
+ "data-roving-text": _e,
373
374
  className: e(u.label, "truncate", (je || K || q) && "min-w-0"),
374
- children: /* @__PURE__ */ T(x.Provider, {
375
+ children: /* @__PURE__ */ E(x.Provider, {
375
376
  value: !1,
376
- children: /* @__PURE__ */ T(S.Provider, {
377
+ children: /* @__PURE__ */ E(S.Provider, {
377
378
  value: !0,
378
- children: /* @__PURE__ */ T(ce.Provider, {
379
+ children: /* @__PURE__ */ E(ce.Provider, {
379
380
  value: Te,
380
381
  children: Oe
381
382
  })
@@ -383,34 +384,34 @@ var F = ({ value: r, icon: l, iconAfter: d, expandIcon: f, aside: g, actions: _,
383
384
  })
384
385
  }),
385
386
  je,
386
- (K || q) && /* @__PURE__ */ E("span", {
387
+ (K || q) && /* @__PURE__ */ D("span", {
387
388
  "data-tree-end": "",
388
- className: e("group/end ms-auto inline-grid shrink-0 items-center gap-1", K && q && Se),
389
- children: [K && /* @__PURE__ */ T("span", {
390
- id: L,
389
+ className: e("group/end ms-auto inline-grid shrink-0 items-center gap-1", K && q && xe),
390
+ children: [K && /* @__PURE__ */ E("span", {
391
+ id: R,
391
392
  "data-tree-aside": "",
392
- className: e(u.aside, "inline-flex items-center text-caption-1 text-muted-foreground", q && xe),
393
+ className: e(u.aside, "inline-flex items-center text-caption-1 text-muted-foreground", q && be),
393
394
  children: a(g)
394
- }), q && /* @__PURE__ */ T(P, {
395
+ }), q && /* @__PURE__ */ E(F, {
395
396
  labelledBy: W,
396
- tabStop: O.navigationMode === "tree" && O.focusedItem === r ? "last-focused" : "none",
397
- navigationMode: O.navigationMode,
398
- onReturn: () => O.focusValue(r),
397
+ tabStop: k.navigationMode === "tree" && k.focusedItem === r ? "last-focused" : "none",
398
+ navigationMode: k.navigationMode,
399
+ onReturn: () => k.focusValue(r),
399
400
  children: a(_)
400
401
  })]
401
402
  })
402
403
  ]
403
- }), Ne && /* @__PURE__ */ T(le.Provider, {
404
+ }), Ne && /* @__PURE__ */ E(C.Provider, {
404
405
  value: r,
405
- children: /* @__PURE__ */ T(x.Provider, {
406
+ children: /* @__PURE__ */ E(x.Provider, {
406
407
  value: Xe,
407
- children: /* @__PURE__ */ T(S.Provider, {
408
+ children: /* @__PURE__ */ E(S.Provider, {
408
409
  value: !1,
409
- children: /* @__PURE__ */ T("div", {
410
+ children: /* @__PURE__ */ E("div", {
410
411
  ref: Pe,
411
412
  ...Fe,
412
413
  className: e(u.collapse, Ie),
413
- children: /* @__PURE__ */ T("div", {
414
+ children: /* @__PURE__ */ E("div", {
414
415
  ref: Me,
415
416
  role: "group",
416
417
  className: e(u.group, "ps-4"),
@@ -422,8 +423,8 @@ var F = ({ value: r, icon: l, iconAfter: d, expandIcon: f, aside: g, actions: _,
422
423
  })]
423
424
  });
424
425
  };
425
- F.displayName = "TreeItem";
426
+ I.displayName = "TreeItem";
426
427
  //#endregion
427
- export { F as TreeItem, M as TreeRoot };
428
+ export { I as TreeItem, N as TreeRoot };
428
429
 
429
430
  //# sourceMappingURL=Tree.core.mjs.map