@mortenbrudvik/waveui 0.10.0 → 0.12.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 (258) hide show
  1. package/README.md +454 -74
  2. package/dist/components/button/Link.cjs +1 -1
  3. package/dist/components/button/Link.cjs.map +1 -1
  4. package/dist/components/button/Link.mjs +4 -4
  5. package/dist/components/button/Toolbar.cjs +1 -1
  6. package/dist/components/button/Toolbar.cjs.map +1 -1
  7. package/dist/components/button/Toolbar.mjs +25 -30
  8. package/dist/components/button/Toolbar.mjs.map +1 -1
  9. package/dist/components/button/Toolbar.navigation.cjs +2 -0
  10. package/dist/components/button/Toolbar.navigation.cjs.map +1 -0
  11. package/dist/components/button/Toolbar.navigation.mjs +17 -0
  12. package/dist/components/button/Toolbar.navigation.mjs.map +1 -0
  13. package/dist/components/data-display/Avatar.cjs +1 -1
  14. package/dist/components/data-display/Avatar.cjs.map +1 -1
  15. package/dist/components/data-display/Avatar.context.cjs +2 -0
  16. package/dist/components/data-display/Avatar.context.cjs.map +1 -0
  17. package/dist/components/data-display/Avatar.context.mjs +9 -0
  18. package/dist/components/data-display/Avatar.context.mjs.map +1 -0
  19. package/dist/components/data-display/Avatar.mjs +66 -61
  20. package/dist/components/data-display/Avatar.mjs.map +1 -1
  21. package/dist/components/data-display/AvatarGroup.cjs +1 -1
  22. package/dist/components/data-display/AvatarGroup.cjs.map +1 -1
  23. package/dist/components/data-display/AvatarGroup.mjs +10 -10
  24. package/dist/components/data-display/InfoButton.cjs +1 -1
  25. package/dist/components/data-display/InfoButton.cjs.map +1 -1
  26. package/dist/components/data-display/InfoButton.mjs +12 -12
  27. package/dist/components/data-display/InteractionTag.cjs +2 -0
  28. package/dist/components/data-display/InteractionTag.cjs.map +1 -0
  29. package/dist/components/data-display/InteractionTag.mjs +234 -0
  30. package/dist/components/data-display/InteractionTag.mjs.map +1 -0
  31. package/dist/components/data-display/Tag.cjs +1 -1
  32. package/dist/components/data-display/Tag.cjs.map +1 -1
  33. package/dist/components/data-display/Tag.mjs +222 -90
  34. package/dist/components/data-display/Tag.mjs.map +1 -1
  35. package/dist/components/data-display/TagGroup.cjs +2 -0
  36. package/dist/components/data-display/TagGroup.cjs.map +1 -0
  37. package/dist/components/data-display/TagGroup.context.cjs +2 -0
  38. package/dist/components/data-display/TagGroup.context.cjs.map +1 -0
  39. package/dist/components/data-display/TagGroup.context.mjs +113 -0
  40. package/dist/components/data-display/TagGroup.context.mjs.map +1 -0
  41. package/dist/components/data-display/TagGroup.mjs +149 -0
  42. package/dist/components/data-display/TagGroup.mjs.map +1 -0
  43. package/dist/components/data-display/tagStyles.cjs +2 -0
  44. package/dist/components/data-display/tagStyles.cjs.map +1 -0
  45. package/dist/components/data-display/tagStyles.mjs +108 -0
  46. package/dist/components/data-display/tagStyles.mjs.map +1 -0
  47. package/dist/components/feedback/Toaster.cjs +1 -1
  48. package/dist/components/feedback/Toaster.cjs.map +1 -1
  49. package/dist/components/feedback/Toaster.mjs +287 -255
  50. package/dist/components/feedback/Toaster.mjs.map +1 -1
  51. package/dist/components/input/Combobox.cjs +1 -1
  52. package/dist/components/input/Combobox.cjs.map +1 -1
  53. package/dist/components/input/Combobox.expand.cjs +1 -1
  54. package/dist/components/input/Combobox.expand.cjs.map +1 -1
  55. package/dist/components/input/Combobox.expand.mjs +7 -7
  56. package/dist/components/input/Combobox.expand.mjs.map +1 -1
  57. package/dist/components/input/Combobox.mjs +176 -175
  58. package/dist/components/input/Combobox.mjs.map +1 -1
  59. package/dist/components/input/DatePicker.cjs +1 -1
  60. package/dist/components/input/DatePicker.cjs.map +1 -1
  61. package/dist/components/input/DatePicker.mjs +188 -187
  62. package/dist/components/input/DatePicker.mjs.map +1 -1
  63. package/dist/components/input/Dropdown.cjs +1 -1
  64. package/dist/components/input/Dropdown.cjs.map +1 -1
  65. package/dist/components/input/Dropdown.mjs +41 -40
  66. package/dist/components/input/Dropdown.mjs.map +1 -1
  67. package/dist/components/input/Option.cjs +1 -1
  68. package/dist/components/input/Option.cjs.map +1 -1
  69. package/dist/components/input/Option.mjs +101 -94
  70. package/dist/components/input/Option.mjs.map +1 -1
  71. package/dist/components/input/SwatchPicker.cjs.map +1 -1
  72. package/dist/components/input/SwatchPicker.context.cjs.map +1 -1
  73. package/dist/components/input/SwatchPicker.context.mjs.map +1 -1
  74. package/dist/components/input/SwatchPicker.mjs.map +1 -1
  75. package/dist/components/input/TagPicker.cjs +1 -1
  76. package/dist/components/input/TagPicker.cjs.map +1 -1
  77. package/dist/components/input/TagPicker.context.cjs +2 -0
  78. package/dist/components/input/TagPicker.context.cjs.map +1 -0
  79. package/dist/components/input/TagPicker.context.mjs +20 -0
  80. package/dist/components/input/TagPicker.context.mjs.map +1 -0
  81. package/dist/components/input/TagPicker.create.cjs +2 -0
  82. package/dist/components/input/TagPicker.create.cjs.map +1 -0
  83. package/dist/components/input/TagPicker.create.mjs +24 -0
  84. package/dist/components/input/TagPicker.create.mjs.map +1 -0
  85. package/dist/components/input/TagPicker.mjs +13 -279
  86. package/dist/components/input/TagPicker.mjs.map +1 -1
  87. package/dist/components/input/TagPicker.option.cjs +2 -0
  88. package/dist/components/input/TagPicker.option.cjs.map +1 -0
  89. package/dist/components/input/TagPicker.option.mjs +45 -0
  90. package/dist/components/input/TagPicker.option.mjs.map +1 -0
  91. package/dist/components/input/TagPicker.overflow.cjs +2 -0
  92. package/dist/components/input/TagPicker.overflow.cjs.map +1 -0
  93. package/dist/components/input/TagPicker.overflow.mjs +153 -0
  94. package/dist/components/input/TagPicker.overflow.mjs.map +1 -0
  95. package/dist/components/input/TagPicker.parts.cjs +2 -0
  96. package/dist/components/input/TagPicker.parts.cjs.map +1 -0
  97. package/dist/components/input/TagPicker.parts.mjs +425 -0
  98. package/dist/components/input/TagPicker.parts.mjs.map +1 -0
  99. package/dist/components/input/TagPicker.root.cjs +2 -0
  100. package/dist/components/input/TagPicker.root.cjs.map +1 -0
  101. package/dist/components/input/TagPicker.root.mjs +417 -0
  102. package/dist/components/input/TagPicker.root.mjs.map +1 -0
  103. package/dist/components/input/TimePicker.cjs +1 -1
  104. package/dist/components/input/TimePicker.cjs.map +1 -1
  105. package/dist/components/input/TimePicker.mjs +156 -154
  106. package/dist/components/input/TimePicker.mjs.map +1 -1
  107. package/dist/components/layout/Accordion.cjs.map +1 -1
  108. package/dist/components/layout/Accordion.mjs.map +1 -1
  109. package/dist/components/navigation/Hamburger.cjs +2 -0
  110. package/dist/components/navigation/Hamburger.cjs.map +1 -0
  111. package/dist/components/navigation/Hamburger.mjs +54 -0
  112. package/dist/components/navigation/Hamburger.mjs.map +1 -0
  113. package/dist/components/navigation/Menu.popover.cjs +1 -1
  114. package/dist/components/navigation/Menu.popover.cjs.map +1 -1
  115. package/dist/components/navigation/Menu.popover.mjs +137 -127
  116. package/dist/components/navigation/Menu.popover.mjs.map +1 -1
  117. package/dist/components/navigation/Menu.root.cjs +1 -1
  118. package/dist/components/navigation/Menu.root.cjs.map +1 -1
  119. package/dist/components/navigation/Menu.root.mjs +4 -4
  120. package/dist/components/navigation/Nav.cjs +1 -1
  121. package/dist/components/navigation/Nav.cjs.map +1 -1
  122. package/dist/components/navigation/Nav.context.cjs +2 -0
  123. package/dist/components/navigation/Nav.context.cjs.map +1 -0
  124. package/dist/components/navigation/Nav.context.mjs +137 -0
  125. package/dist/components/navigation/Nav.context.mjs.map +1 -0
  126. package/dist/components/navigation/Nav.mjs +151 -258
  127. package/dist/components/navigation/Nav.mjs.map +1 -1
  128. package/dist/components/navigation/Nav.parts.cjs +2 -0
  129. package/dist/components/navigation/Nav.parts.cjs.map +1 -0
  130. package/dist/components/navigation/Nav.parts.mjs +77 -0
  131. package/dist/components/navigation/Nav.parts.mjs.map +1 -0
  132. package/dist/components/navigation/Nav.root.cjs +2 -0
  133. package/dist/components/navigation/Nav.root.cjs.map +1 -0
  134. package/dist/components/navigation/Nav.root.mjs +78 -0
  135. package/dist/components/navigation/Nav.root.mjs.map +1 -0
  136. package/dist/components/navigation/NavDrawer.cjs +2 -0
  137. package/dist/components/navigation/NavDrawer.cjs.map +1 -0
  138. package/dist/components/navigation/NavDrawer.context.cjs +2 -0
  139. package/dist/components/navigation/NavDrawer.context.cjs.map +1 -0
  140. package/dist/components/navigation/NavDrawer.context.mjs +11 -0
  141. package/dist/components/navigation/NavDrawer.context.mjs.map +1 -0
  142. package/dist/components/navigation/NavDrawer.mjs +179 -0
  143. package/dist/components/navigation/NavDrawer.mjs.map +1 -0
  144. package/dist/components/overlays/Dialog.cjs +1 -1
  145. package/dist/components/overlays/Dialog.cjs.map +1 -1
  146. package/dist/components/overlays/Dialog.mjs +188 -123
  147. package/dist/components/overlays/Dialog.mjs.map +1 -1
  148. package/dist/components/overlays/Dialog.shared.cjs +1 -1
  149. package/dist/components/overlays/Dialog.shared.cjs.map +1 -1
  150. package/dist/components/overlays/Dialog.shared.mjs +157 -81
  151. package/dist/components/overlays/Dialog.shared.mjs.map +1 -1
  152. package/dist/components/overlays/Dialog.slots.cjs +2 -0
  153. package/dist/components/overlays/Dialog.slots.cjs.map +1 -0
  154. package/dist/components/overlays/Dialog.slots.mjs +129 -0
  155. package/dist/components/overlays/Dialog.slots.mjs.map +1 -0
  156. package/dist/components/overlays/Drawer.cjs +1 -1
  157. package/dist/components/overlays/Drawer.cjs.map +1 -1
  158. package/dist/components/overlays/Drawer.context.cjs +2 -0
  159. package/dist/components/overlays/Drawer.context.cjs.map +1 -0
  160. package/dist/components/overlays/Drawer.context.mjs +29 -0
  161. package/dist/components/overlays/Drawer.context.mjs.map +1 -0
  162. package/dist/components/overlays/Drawer.mjs +12 -187
  163. package/dist/components/overlays/Drawer.mjs.map +1 -1
  164. package/dist/components/overlays/Drawer.panel.cjs +2 -0
  165. package/dist/components/overlays/Drawer.panel.cjs.map +1 -0
  166. package/dist/components/overlays/Drawer.panel.mjs +159 -0
  167. package/dist/components/overlays/Drawer.panel.mjs.map +1 -0
  168. package/dist/components/overlays/Drawer.parts.cjs +2 -0
  169. package/dist/components/overlays/Drawer.parts.cjs.map +1 -0
  170. package/dist/components/overlays/Drawer.parts.mjs +152 -0
  171. package/dist/components/overlays/Drawer.parts.mjs.map +1 -0
  172. package/dist/components/overlays/Drawer.root.cjs +2 -0
  173. package/dist/components/overlays/Drawer.root.cjs.map +1 -0
  174. package/dist/components/overlays/Drawer.root.mjs +207 -0
  175. package/dist/components/overlays/Drawer.root.mjs.map +1 -0
  176. package/dist/components/overlays/Drawer.scroll.cjs +2 -0
  177. package/dist/components/overlays/Drawer.scroll.cjs.map +1 -0
  178. package/dist/components/overlays/Drawer.scroll.mjs +42 -0
  179. package/dist/components/overlays/Drawer.scroll.mjs.map +1 -0
  180. package/dist/components/overlays/Popover.cjs +1 -1
  181. package/dist/components/overlays/Popover.cjs.map +1 -1
  182. package/dist/components/overlays/Popover.mjs +173 -162
  183. package/dist/components/overlays/Popover.mjs.map +1 -1
  184. package/dist/components/overlays/TeachingPopover.cjs +1 -1
  185. package/dist/components/overlays/TeachingPopover.cjs.map +1 -1
  186. package/dist/components/overlays/TeachingPopover.mjs +96 -91
  187. package/dist/components/overlays/TeachingPopover.mjs.map +1 -1
  188. package/dist/components/overlays/Tooltip.cjs +1 -1
  189. package/dist/components/overlays/Tooltip.cjs.map +1 -1
  190. package/dist/components/overlays/Tooltip.mjs +47 -47
  191. package/dist/components/overlays/Tooltip.mjs.map +1 -1
  192. package/dist/components/portal/Portal.cjs +1 -1
  193. package/dist/components/portal/Portal.cjs.map +1 -1
  194. package/dist/components/portal/Portal.mjs +5 -5
  195. package/dist/components/table/DataGrid.cjs +1 -1
  196. package/dist/components/table/DataGrid.cjs.map +1 -1
  197. package/dist/components/table/DataGrid.mjs +1 -1
  198. package/dist/hooks/useDismiss.cjs.map +1 -1
  199. package/dist/hooks/useDismiss.mjs.map +1 -1
  200. package/dist/hooks/useFocusTrap.cjs +1 -1
  201. package/dist/hooks/useFocusTrap.cjs.map +1 -1
  202. package/dist/hooks/useFocusTrap.mjs +115 -98
  203. package/dist/hooks/useFocusTrap.mjs.map +1 -1
  204. package/dist/hooks/useFocusVisible.cjs +2 -0
  205. package/dist/hooks/useFocusVisible.cjs.map +1 -0
  206. package/dist/hooks/useFocusVisible.mjs +49 -0
  207. package/dist/hooks/useFocusVisible.mjs.map +1 -0
  208. package/dist/hooks/useFocusableGroup.cjs +2 -0
  209. package/dist/hooks/useFocusableGroup.cjs.map +1 -0
  210. package/dist/hooks/useFocusableGroup.mjs +70 -0
  211. package/dist/hooks/useFocusableGroup.mjs.map +1 -0
  212. package/dist/hooks/useModalLayer.cjs +1 -1
  213. package/dist/hooks/useModalLayer.cjs.map +1 -1
  214. package/dist/hooks/useModalLayer.mjs +34 -21
  215. package/dist/hooks/useModalLayer.mjs.map +1 -1
  216. package/dist/hooks/useModalOpen.cjs +2 -0
  217. package/dist/hooks/useModalOpen.cjs.map +1 -0
  218. package/dist/hooks/useModalOpen.mjs +14 -0
  219. package/dist/hooks/useModalOpen.mjs.map +1 -0
  220. package/dist/hooks/usePopupPosition.cjs +1 -1
  221. package/dist/hooks/usePopupPosition.cjs.map +1 -1
  222. package/dist/hooks/usePopupPosition.mjs +82 -53
  223. package/dist/hooks/usePopupPosition.mjs.map +1 -1
  224. package/dist/hooks/useResolvedTarget.cjs +2 -0
  225. package/dist/hooks/useResolvedTarget.cjs.map +1 -0
  226. package/dist/hooks/useResolvedTarget.mjs +37 -0
  227. package/dist/hooks/useResolvedTarget.mjs.map +1 -0
  228. package/dist/hooks/useRestoreFocus.cjs +1 -1
  229. package/dist/hooks/useRestoreFocus.cjs.map +1 -1
  230. package/dist/hooks/useRestoreFocus.mjs +91 -78
  231. package/dist/hooks/useRestoreFocus.mjs.map +1 -1
  232. package/dist/hooks/useRovingGrid.cjs +1 -1
  233. package/dist/hooks/useRovingGrid.cjs.map +1 -1
  234. package/dist/hooks/useRovingGrid.mjs +8 -57
  235. package/dist/hooks/useRovingGrid.mjs.map +1 -1
  236. package/dist/hooks/useRovingTabIndex.cjs +1 -1
  237. package/dist/hooks/useRovingTabIndex.cjs.map +1 -1
  238. package/dist/hooks/useRovingTabIndex.mjs +180 -121
  239. package/dist/hooks/useRovingTabIndex.mjs.map +1 -1
  240. package/dist/index.cjs +1 -1
  241. package/dist/index.d.cts +3070 -269
  242. package/dist/index.d.ts +3070 -269
  243. package/dist/index.mjs +127 -107
  244. package/dist/lib/classNames.cjs +1 -1
  245. package/dist/lib/classNames.cjs.map +1 -1
  246. package/dist/lib/classNames.mjs +137 -77
  247. package/dist/lib/classNames.mjs.map +1 -1
  248. package/dist/lib/icons.cjs +1 -1
  249. package/dist/lib/icons.cjs.map +1 -1
  250. package/dist/lib/icons.mjs +13 -6
  251. package/dist/lib/icons.mjs.map +1 -1
  252. package/dist/lib/layers.cjs +1 -1
  253. package/dist/lib/layers.cjs.map +1 -1
  254. package/dist/lib/layers.mjs +120 -111
  255. package/dist/lib/layers.mjs.map +1 -1
  256. package/dist/styles.css +1 -1
  257. package/package.json +1 -1
  258. package/src/styles/tokens.css +25 -0
@@ -7,7 +7,37 @@ import { getFirstTabbable as o, isHiddenInput as s } from "../lib/focus.mjs";
7
7
  import { isAltGraphCharacter as c, useTypeahead as l } from "./useTypeahead.mjs";
8
8
  import * as u from "react";
9
9
  //#region src/hooks/useRovingTabIndex.ts
10
- var d = "[data-roving-value]", f = /* @__PURE__ */ new Set([
10
+ function d(e, t, n) {
11
+ let r = t.querySelectorAll("[role=\"row\"]");
12
+ if (r.length > 0) return Array.from(r).map((t) => e.filter((e) => t.contains(e.element)));
13
+ if (n !== void 0 && n > 0) {
14
+ let t = [];
15
+ for (let r = 0; r < e.length; r += n) t.push(e.slice(r, r + n));
16
+ return t;
17
+ }
18
+ return null;
19
+ }
20
+ function f(e, t, n) {
21
+ let r = e.key === "ArrowUp" || e.key === "ArrowDown", i = e.key === "Home" || e.key === "End";
22
+ if (!n || !r && !i) return;
23
+ let a = t.findIndex((e) => e.includes(n));
24
+ if (a < 0) return;
25
+ if (i) {
26
+ let r = (e.ctrlKey ? t.flat() : t[a]).filter((e) => !e.disabled), i = e.key === "Home" ? r[0] : r[r.length - 1];
27
+ return i && i !== n ? [i] : "stay";
28
+ }
29
+ let o = t[a].indexOf(n), s = e.key === "ArrowDown" ? 1 : -1;
30
+ for (let e = a + s; e >= 0 && e < t.length; e += s) {
31
+ let n, r = Infinity;
32
+ if (t[e].forEach((e, t) => {
33
+ if (e.disabled) return;
34
+ let i = Math.abs(t - o);
35
+ i < r && (n = e, r = i);
36
+ }), n) return [n];
37
+ }
38
+ return "stay";
39
+ }
40
+ var p = "[data-roving-value]", m = /* @__PURE__ */ new Set([
11
41
  "radiogroup",
12
42
  "listbox",
13
43
  "grid",
@@ -17,12 +47,12 @@ var d = "[data-roving-value]", f = /* @__PURE__ */ new Set([
17
47
  "menubar",
18
48
  "tree",
19
49
  "spinbutton"
20
- ]), p = /* @__PURE__ */ new Set([
50
+ ]), h = /* @__PURE__ */ new Set([
21
51
  "slider",
22
52
  "spinbutton",
23
53
  "textbox",
24
54
  "searchbox"
25
- ]), m = /* @__PURE__ */ new Set([
55
+ ]), g = /* @__PURE__ */ new Set([
26
56
  "button",
27
57
  "checkbox",
28
58
  "color",
@@ -32,7 +62,7 @@ var d = "[data-roving-value]", f = /* @__PURE__ */ new Set([
32
62
  "radio",
33
63
  "reset",
34
64
  "submit"
35
- ]), h = [
65
+ ]), _ = [
36
66
  "disabled",
37
67
  "aria-disabled",
38
68
  "data-disabled-focusable",
@@ -47,32 +77,47 @@ var d = "[data-roving-value]", f = /* @__PURE__ */ new Set([
47
77
  "type",
48
78
  "contenteditable"
49
79
  ];
50
- function g(e, t) {
80
+ function v(e, t) {
51
81
  if (e.hasAttribute("data-roving-container")) return !0;
52
82
  if (!t || e.hasAttribute("data-roving-transparent")) return !1;
53
83
  let n = e.getAttribute("role");
54
- return n !== null && f.has(n);
84
+ return n !== null && m.has(n);
55
85
  }
56
- function _(e, t, n) {
57
- for (let r = e; r && r !== t; r = r.parentElement) if (g(r, n)) return !0;
86
+ function y(e, t, n) {
87
+ for (let r = e; r && r !== t; r = r.parentElement) if (v(r, n)) return !0;
58
88
  return !1;
59
89
  }
60
- function v(e) {
90
+ var b = "[tabindex], [data-roving-value]";
91
+ function x(e, t) {
92
+ try {
93
+ return e.matches(t);
94
+ } catch {
95
+ return !1;
96
+ }
97
+ }
98
+ function S(e) {
99
+ let t = /* @__PURE__ */ new Map();
100
+ for (let n of e) n.type === "attributes" && n.attributeName === "tabindex" && t.set(n.target, n);
101
+ let n = /* @__PURE__ */ new Set();
102
+ for (let [e, r] of t) r.oldValue === e.getAttribute("tabindex") && n.add(e);
103
+ return n;
104
+ }
105
+ function C(e) {
61
106
  return e.tabIndex >= 0 && !e.hasAttribute("disabled");
62
107
  }
63
- function y(e) {
108
+ function w(e) {
64
109
  let { element: t } = e;
65
- if (!e.nested || v(t)) return t;
110
+ if (!e.nested || C(t)) return t;
66
111
  let n = t.querySelector("[tabindex=\"0\"]");
67
112
  if (n) return n;
68
113
  let r = o(t);
69
114
  return r instanceof HTMLElement ? r : null;
70
115
  }
71
- function b(e) {
116
+ function T(e) {
72
117
  let t = e.getAttribute("data-roving-disabled");
73
- return t !== null && t !== "false" || x(e) ? !0 : !e.hasAttribute("data-disabled-focusable") && e.getAttribute("aria-disabled") === "true";
118
+ return t !== null && t !== "false" || E(e) ? !0 : !e.hasAttribute("data-disabled-focusable") && e.getAttribute("aria-disabled") === "true";
74
119
  }
75
- function x(e) {
120
+ function E(e) {
76
121
  if (e.disabled === !0) return !0;
77
122
  try {
78
123
  return e.matches(":disabled");
@@ -80,20 +125,20 @@ function x(e) {
80
125
  return !1;
81
126
  }
82
127
  }
83
- function S(e) {
128
+ function D(e) {
84
129
  if (!e || e.nodeType !== 1) return !1;
85
130
  let t = e, n = t.getAttribute("role");
86
- if (n !== null && p.has(n)) return !0;
131
+ if (n !== null && h.has(n)) return !0;
87
132
  let r = t.localName;
88
133
  if (r === "textarea" || r === "select") return !0;
89
- if (r === "input") return !m.has(t.type);
134
+ if (r === "input") return !g.has(t.type);
90
135
  let i = t.closest("[contenteditable]");
91
136
  return i !== null && i.getAttribute("contenteditable") !== "false";
92
137
  }
93
- function C(e) {
94
- return !e.nested && !S(e.element);
138
+ function O(e) {
139
+ return !e.nested && !D(e.element);
95
140
  }
96
- function w(e, t, n) {
141
+ function k(e, t, n) {
97
142
  let r = e.ownerDocument.defaultView;
98
143
  if (!r) return !1;
99
144
  for (let i = e; i && i !== t; i = i.parentElement) {
@@ -118,14 +163,14 @@ function te(e) {
118
163
  return !1;
119
164
  }
120
165
  }
121
- function T(e) {
122
- return [e.value, e.disabled ? 0 : C(e) ? 1 : 2];
166
+ function A(e) {
167
+ return [e.value, e.disabled ? 0 : O(e) ? 1 : 2];
123
168
  }
124
- function E(e, t, n, r) {
169
+ function j(e, t, n, r) {
125
170
  let i = e.some(([, e]) => e === 1) ? 1 : 2, a = e.filter(([, e]) => e === i).map(([e]) => e);
126
171
  return n === "last-focused" && r !== null && a.includes(r) ? r : t !== null && t !== "" && a.includes(t) ? t : a[0] ?? null;
127
172
  }
128
- function D(e, t) {
173
+ function M(e, t) {
129
174
  if (!t) return e;
130
175
  let n = new Map(e.map((e) => [e.value, e])), r = [];
131
176
  for (let e of t) {
@@ -134,11 +179,11 @@ function D(e, t) {
134
179
  }
135
180
  return r;
136
181
  }
137
- var O = class {
182
+ var N = class {
138
183
  container = null;
139
184
  lastFocused = null;
140
185
  options = {
141
- itemSelector: d,
186
+ itemSelector: p,
142
187
  manageTabIndex: !1,
143
188
  items: void 0,
144
189
  activeValue: null,
@@ -155,20 +200,22 @@ var O = class {
155
200
  subscribe = (e) => (this.notify = e, this.observe(), () => {
156
201
  this.notify = null, this.disconnect();
157
202
  });
158
- getSnapshot = () => this.container ? (this.dirty && (this.dirty = !1, this.snapshot = JSON.stringify(this.resolveOwn().map(T))), this.snapshot) : "";
203
+ getSnapshot = () => this.container ? (this.dirty && (this.dirty = !1, this.snapshot = JSON.stringify(this.resolveOwn().map(A))), this.snapshot) : "";
159
204
  getServerSnapshot = () => "";
160
205
  setContainer(e) {
161
- e !== this.container && (this.disconnect(), this.container = e, this.dirty = !0, this.notify && (this.observe(), this.notify()));
206
+ if (e === this.container) return;
207
+ let t = this.takeRecords();
208
+ this.disconnect(), this.container && this.options.manageTabIndex && this.release(this.container, "all", t), this.container = e, this.dirty = !0, this.notify && (this.observe(), this.notify());
162
209
  }
163
210
  recordFocus(e) {
164
- C(e) && (this.lastFocused = e.value);
211
+ O(e) && (this.lastFocused = e.value);
165
212
  }
166
213
  setOptions(e) {
167
214
  let t = this.options;
168
- this.options = e, (t.itemSelector !== e.itemSelector || t.manageTabIndex !== e.manageTabIndex || t.roleComposites !== e.roleComposites) && (this.dirty = !0, this.notify?.());
215
+ this.options = e, t.manageTabIndex && !e.manageTabIndex && this.container && this.release(this.container, "all", this.takeRecords()), (t.itemSelector !== e.itemSelector || t.manageTabIndex !== e.manageTabIndex || t.roleComposites !== e.roleComposites) && (this.dirty = !0, this.notify?.());
169
216
  }
170
217
  resolve(e = this.container) {
171
- return D(this.resolveOwn(e), this.options.items);
218
+ return M(this.resolveOwn(e), this.options.items);
172
219
  }
173
220
  resolveOwn(e = this.container) {
174
221
  if (!e) return [];
@@ -181,7 +228,7 @@ var O = class {
181
228
  let a = [], o = /* @__PURE__ */ new Set(), c = /* @__PURE__ */ new Map();
182
229
  for (let t of i) {
183
230
  let i = null, l = !1;
184
- for (let n = t; n && n !== e; n = n.parentElement) g(n, r) && (i = n), (n.hidden || n.hasAttribute("inert")) && (l = !0);
231
+ for (let n = t; n && n !== e; n = n.parentElement) v(n, r) && (i = n), (n.hidden || n.hasAttribute("inert")) && (l = !0);
185
232
  if (l) continue;
186
233
  let u = i ?? t;
187
234
  if (o.has(u)) continue;
@@ -192,39 +239,45 @@ var O = class {
192
239
  value: this.valueOf(u, d),
193
240
  element: u,
194
241
  nested: d,
195
- disabled: b(u)
242
+ disabled: T(u)
196
243
  };
197
- d && !f.disabled && !y(f) && (f.disabled = !0), n && !f.disabled && w(u, e, c) && (f.disabled = !0), a.push(f);
244
+ d && !f.disabled && !w(f) && (f.disabled = !0), n && !f.disabled && k(u, e, c) && (f.disabled = !0), a.push(f);
198
245
  }
199
246
  return a;
200
247
  }
201
248
  stamp() {
202
249
  if (!this.options.manageTabIndex || !this.container) return;
203
- this.release(this.container);
204
- let e = this.resolve(), t = this.options.tabStop === "none" ? null : E(e.map(T), this.options.activeValue, this.options.tabStop, this.lastFocused);
250
+ this.release(this.container, "stale");
251
+ let e = this.resolve(), t = this.options.tabStop === "none" ? null : j(e.map(A), this.options.activeValue, this.options.tabStop, this.lastFocused);
205
252
  for (let n of e) {
206
253
  if (n.nested) continue;
207
- let { element: e } = n, r = this.stamped.get(e);
208
- r || (r = {
209
- tabIndex: e.getAttribute("tabindex"),
210
- addedValue: !e.hasAttribute("data-roving-value")
211
- }, this.stamped.set(e, r));
212
- let i = n.value === t ? "0" : "-1";
213
- e.getAttribute("tabindex") !== i && e.setAttribute("tabindex", i), e.hasAttribute("data-roving-value") || e.setAttribute("data-roving-value", n.value);
254
+ let { element: e } = n, r = n.value === t ? "0" : "-1", i = e.getAttribute("tabindex"), a = this.stamped.get(e);
255
+ a ? (i !== a.stamped && (a.tabIndex = i), a.stamped = r) : (a = {
256
+ tabIndex: i,
257
+ stamped: r,
258
+ addedValue: null
259
+ }, this.stamped.set(e, a)), i !== r && e.setAttribute("tabindex", r), e.hasAttribute("data-roving-value") || (e.setAttribute("data-roving-value", n.value), a.addedValue = n.value);
214
260
  }
215
261
  }
216
- release(e) {
217
- let t;
218
- try {
219
- t = Array.from(e.querySelectorAll(this.options.itemSelector));
220
- } catch {
221
- return;
262
+ release(e, t, n = []) {
263
+ let r = S(n), { itemSelector: i, roleComposites: a } = this.options;
264
+ for (let n of Array.from(e.querySelectorAll(b))) {
265
+ let o = this.stamped.get(n);
266
+ if (!o || t === "stale" && x(n, i) && !y(n, e, a)) continue;
267
+ this.stamped.delete(n);
268
+ let s = n.getAttribute("tabindex");
269
+ !(s !== o.stamped || r.has(n)) && s !== o.tabIndex && (o.tabIndex === null ? n.removeAttribute("tabindex") : n.setAttribute("tabindex", o.tabIndex)), o.addedValue !== null && n.getAttribute("data-roving-value") === o.addedValue && n.removeAttribute("data-roving-value");
222
270
  }
223
- for (let n of t) {
224
- let t = this.stamped.get(n);
225
- t && _(n, e, this.options.roleComposites) && (this.stamped.delete(n), t.tabIndex === null ? n.removeAttribute("tabindex") : n.setAttribute("tabindex", t.tabIndex), t.addedValue && n.removeAttribute("data-roving-value"));
271
+ }
272
+ adopt(e) {
273
+ for (let t of S(e)) {
274
+ let e = this.stamped.get(t);
275
+ e && (e.tabIndex = t.getAttribute("tabindex"));
226
276
  }
227
277
  }
278
+ takeRecords() {
279
+ return this.observer?.takeRecords() ?? [];
280
+ }
228
281
  valueOf(e, t) {
229
282
  let n = t ? null : e.getAttribute("data-roving-value");
230
283
  if (n !== null) return n;
@@ -232,20 +285,21 @@ var O = class {
232
285
  return r === void 0 && (this.autoCounter += 1, r = `auto-${this.autoCounter}`, this.autoValues.set(e, r)), r;
233
286
  }
234
287
  observe() {
235
- this.container && !this.observer && typeof MutationObserver < "u" && (this.observer = new MutationObserver(() => {
236
- this.stamp(), this.dirty = !0, this.notify?.();
288
+ this.container && !this.observer && typeof MutationObserver < "u" && (this.observer = new MutationObserver((e) => {
289
+ this.adopt(e), this.stamp(), this.dirty = !0, this.notify?.();
237
290
  }), this.observer.observe(this.container, {
238
291
  subtree: !0,
239
292
  childList: !0,
240
293
  attributes: !0,
241
- attributeFilter: h
294
+ attributeOldValue: !0,
295
+ attributeFilter: _
242
296
  }), this.dirty = !0);
243
297
  }
244
298
  disconnect() {
245
299
  this.observer?.disconnect(), this.observer = null;
246
300
  }
247
301
  };
248
- function k(e) {
302
+ function P(e) {
249
303
  if (e === "") return null;
250
304
  try {
251
305
  return JSON.parse(e);
@@ -253,13 +307,13 @@ function k(e) {
253
307
  return null;
254
308
  }
255
309
  }
256
- function A(e) {
310
+ function F(e) {
257
311
  return e.getAttribute("data-roving-text") ?? e.textContent ?? "";
258
312
  }
259
- function j(e, t) {
313
+ function I(e, t) {
260
314
  return !t || typeof t.nodeType != "number" ? !1 : t === e || e.contains(t);
261
315
  }
262
- function M(e, t, n) {
316
+ function L(e, t, n) {
263
317
  if (e.length === 0 || !t || typeof t.nodeType != "number") return null;
264
318
  let r = new Map(e.map((e) => [e.element, e]));
265
319
  for (let e = t; e && e !== n; e = e.parentNode) {
@@ -268,97 +322,102 @@ function M(e, t, n) {
268
322
  }
269
323
  return null;
270
324
  }
271
- function N(e, t, n) {
272
- return e ? t === y(e) : t === n;
325
+ function R(e, t, n) {
326
+ return e ? t === w(e) : t === n;
273
327
  }
274
- function P(o, s) {
275
- let f = s === void 0 ? void 0 : o, { activeValue: p = null, items: m, orientation: h = "horizontal", loop: g = !0, dir: _, itemSelector: v = d, typeahead: b = !1, homeEndKeys: x = !0, tabStop: w = "active", manageTabIndex: T = !1, onFocusMove: D } = s ?? o, [P] = u.useState(() => new O()), F = u.useSyncExternalStore(P.subscribe, P.getSnapshot, P.getServerSnapshot), [I, L] = u.useState(null), [R, z] = u.useState(null), B = f === void 0 && m === void 0;
328
+ function z(o, s) {
329
+ let m = s === void 0 ? void 0 : o, { activeValue: h = null, items: g, orientation: _ = "horizontal", columns: v, loop: y = !0, dir: b, itemSelector: x = p, typeahead: S = !1, homeEndKeys: C = !0, tabStop: T = "active", manageTabIndex: E = !1, onFocusMove: k } = s ?? o, [A] = u.useState(() => new N()), M = u.useSyncExternalStore(A.subscribe, A.getSnapshot, A.getServerSnapshot), [z, B] = u.useState(null), [V, ne] = u.useState(null), re = m === void 0 && g === void 0;
276
330
  u.useLayoutEffect(() => {
277
- P.setOptions({
278
- itemSelector: v,
279
- manageTabIndex: T,
280
- items: m,
281
- activeValue: p,
282
- tabStop: w,
283
- roleComposites: B
284
- }), f && P.setContainer(f.current), P.stamp();
331
+ A.setOptions({
332
+ itemSelector: x,
333
+ manageTabIndex: E,
334
+ items: g,
335
+ activeValue: h,
336
+ tabStop: T,
337
+ roleComposites: re
338
+ }), m && A.setContainer(m.current), A.stamp();
285
339
  }), u.useEffect(() => {
286
- e && !te(v) && t(`useRovingTabIndex:itemSelector:${v}`, `useRovingTabIndex: itemSelector "${v}" is not a valid CSS selector in this browser; no item is navigable or tabbable.`);
287
- }, [v]);
288
- let V = u.useMemo(() => k(F), [F]), H = u.useMemo(() => {
289
- if (!m) return V;
290
- if (V) {
291
- let e = new Map(V), t = m.flatMap((t) => {
340
+ e && !te(x) && t(`useRovingTabIndex:itemSelector:${x}`, `useRovingTabIndex: itemSelector "${x}" is not a valid CSS selector in this browser; no item is navigable or tabbable.`);
341
+ }, [x]), u.useEffect(() => {
342
+ if (!e || _ !== "grid" || v) return;
343
+ let n = A.container;
344
+ n && n.querySelector("[role=\"row\"]") === null && t("useRovingTabIndex:grid-rows", "useRovingTabIndex: orientation \"grid\" needs role=\"row\" elements around the items or a `columns` count; without either it acts as \"both\".");
345
+ });
346
+ let H = u.useMemo(() => P(M), [M]), U = u.useMemo(() => {
347
+ if (!g) return H;
348
+ if (H) {
349
+ let e = new Map(H), t = g.flatMap((t) => {
292
350
  let n = e.get(t);
293
351
  return n === void 0 ? [] : [[t, n]];
294
352
  });
295
353
  if (t.length > 0) return t;
296
354
  }
297
- return m.map((e) => [e, 1]);
298
- }, [m, V]), U = w === "none" ? null : H ? E(H, p, w, R) : p || null, W = u.useCallback((e) => e === U ? 0 : -1, [U]), G = u.useCallback((e) => {
299
- P.setContainer(e), f && n(f, e);
300
- }, [P, f]), K = u.useRef([]), q = u.useRef([]), { onTypeahead: ne, isSearching: re } = l({
355
+ return g.map((e) => [e, 1]);
356
+ }, [g, H]), W = T === "none" ? null : U ? j(U, h, T, V) : h || null, ie = u.useCallback((e) => e === W ? 0 : -1, [W]), G = u.useCallback((e) => {
357
+ A.setContainer(e), m && n(m, e);
358
+ }, [A, m]), K = u.useRef([]), q = u.useRef([]), { onTypeahead: ae, isSearching: oe } = l({
301
359
  getItems: () => K.current,
302
360
  onMatch: (e, t) => {
303
361
  q.current = t;
304
362
  }
305
363
  }), J = (e) => {
306
364
  if (!e || e.disabled) return !1;
307
- let t = y(e);
308
- return !t || (t.focus(), !ee(t)) ? !1 : (P.recordFocus(e), !0);
365
+ let t = w(e);
366
+ return !t || (t.focus(), !ee(t)) ? !1 : (A.recordFocus(e), !0);
309
367
  }, Y = (e) => {
310
368
  for (let t of e) if (J(t)) return;
311
369
  }, X = r((e, t) => {
312
- let n = e.metaKey || (e.altKey || e.ctrlKey) && !c(e);
313
- if (e.defaultPrevented || n || S(e.target)) return;
314
- let r = P.container ?? e.currentTarget;
315
- if (!j(r, e.target)) return;
316
- let o = P.resolve(r), s = o.filter((e) => !e.disabled);
317
- if (s.length === 0) return;
318
- let l = M(o, e.target, r), u = !1, d = [], f = t ? null : i(e.key, {
319
- orientation: h,
320
- dir: _ ?? a(e.currentTarget)
370
+ let n = _ === "grid" && e.ctrlKey && !e.altKey && (e.key === "Home" || e.key === "End"), r = e.metaKey || (e.altKey || e.ctrlKey) && !c(e) && !n;
371
+ if (e.defaultPrevented || r || D(e.target)) return;
372
+ let o = A.container ?? e.currentTarget;
373
+ if (!I(o, e.target)) return;
374
+ let s = A.resolve(o), l = s.filter((e) => !e.disabled);
375
+ if (l.length === 0) return;
376
+ let u = L(s, e.target, o), p = !1, m = [], h = _ === "grid" && !t ? d(s, o, v) : null, g = h ? f(e, h, u) : void 0, x = t || g ? null : i(e.key, {
377
+ orientation: _ === "grid" ? h ? "horizontal" : "both" : _,
378
+ dir: b ?? a(e.currentTarget)
321
379
  });
322
- if (f) {
323
- if (u = !0, !l) d = f === "next" ? s : [...s].reverse();
380
+ if (g) p = !0, m = g === "stay" ? [] : g;
381
+ else if (x) {
382
+ if (p = !0, !u) m = x === "next" ? l : [...l].reverse();
324
383
  else {
325
- let e = f === "next" ? 1 : -1, t = o.length, n = o.indexOf(l);
384
+ let e = x === "next" ? 1 : -1, t = s.length, n = s.indexOf(u);
326
385
  for (let r = 1; r < t; r++) {
327
386
  if (n += e, n < 0 || n >= t) {
328
- if (!g) break;
387
+ if (!y) break;
329
388
  n = (n + t) % t;
330
389
  }
331
- o[n].disabled || d.push(o[n]);
390
+ s[n].disabled || m.push(s[n]);
332
391
  }
333
392
  }
334
- } else !t && x && (e.key === "Home" || e.key === "End") ? (u = !0, d = e.key === "Home" ? s : [...s].reverse()) : b && N(l, e.target, r) && (K.current = o.map((e) => ({
393
+ } else !t && C && (e.key === "Home" || e.key === "End") ? (p = !0, m = e.key === "Home" ? l : [...l].reverse()) : S && R(u, e.target, o) && (K.current = s.map((e) => ({
335
394
  value: e.value,
336
- text: A(e.element),
395
+ text: F(e.element),
337
396
  disabled: e.disabled
338
- })), q.current = [], ne(e, l?.value ?? null) && (u = !0, d = q.current.flatMap((e) => s.filter((t) => t.value === e))));
339
- if (u) {
397
+ })), q.current = [], ae(e, u?.value ?? null) && (p = !0, m = q.current.flatMap((e) => l.filter((t) => t.value === e))));
398
+ if (p) {
340
399
  e.preventDefault();
341
- for (let t of d) {
342
- if (t === l) return;
400
+ for (let t of m) {
401
+ if (t === u) return;
343
402
  if (J(t)) {
344
- D?.(t.value, e);
403
+ k?.(t.value, e);
345
404
  return;
346
405
  }
347
406
  }
348
407
  }
349
408
  }), Z = r((e) => X(e, !1)), Q = r((e) => {
350
- b && e.key === " " && re() && X(e, !0);
409
+ S && e.key === " " && oe() && X(e, !0);
351
410
  }), $ = r((e) => {
352
- let t = P.container ?? e.currentTarget;
353
- if (!j(t, e.target)) return;
354
- let n = M(P.resolve(t), e.target, t);
355
- n && (P.recordFocus(n), L(n.value), C(n) && z(n.value), P.stamp());
356
- }), ie = r((e) => {
357
- J(P.resolve().find((t) => t.value === e));
358
- }), ae = r(() => {
359
- Y(P.resolve().filter((e) => !e.disabled));
360
- }), oe = r(() => {
361
- Y(P.resolve().filter((e) => !e.disabled).reverse());
411
+ let t = A.container ?? e.currentTarget;
412
+ if (!I(t, e.target)) return;
413
+ let n = L(A.resolve(t), e.target, t);
414
+ n && (A.recordFocus(n), B(n.value), O(n) && ne(n.value), A.stamp());
415
+ }), se = r((e) => {
416
+ J(A.resolve().find((t) => t.value === e));
417
+ }), ce = r(() => {
418
+ Y(A.resolve().filter((e) => !e.disabled));
419
+ }), le = r(() => {
420
+ Y(A.resolve().filter((e) => !e.disabled).reverse());
362
421
  });
363
422
  return {
364
423
  containerProps: u.useMemo(() => ({
@@ -376,14 +435,14 @@ function P(o, s) {
376
435
  handleKeyDown: Z,
377
436
  handleKeyDownCapture: Q,
378
437
  handleFocus: $,
379
- getTabIndex: W,
380
- focusedValue: I,
381
- focusValue: ie,
382
- focusFirst: ae,
383
- focusLast: oe
438
+ getTabIndex: ie,
439
+ focusedValue: z,
440
+ focusValue: se,
441
+ focusFirst: ce,
442
+ focusLast: le
384
443
  };
385
444
  }
386
445
  //#endregion
387
- export { w as isHiddenByCss, P as useRovingTabIndex };
446
+ export { k as isHiddenByCss, z as useRovingTabIndex };
388
447
 
389
448
  //# sourceMappingURL=useRovingTabIndex.mjs.map