@mortenbrudvik/waveui 0.4.0 → 0.7.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 (574) hide show
  1. package/README.md +1221 -173
  2. package/dist/_virtual/_rolldown/runtime.cjs +1 -0
  3. package/dist/components/button/Button.cjs +2 -0
  4. package/dist/components/button/Button.cjs.map +1 -0
  5. package/dist/components/button/Button.mjs +50 -0
  6. package/dist/components/button/Button.mjs.map +1 -0
  7. package/dist/components/button/Button.semantics.cjs +2 -0
  8. package/dist/components/button/Button.semantics.cjs.map +1 -0
  9. package/dist/components/button/Button.semantics.mjs +61 -0
  10. package/dist/components/button/Button.semantics.mjs.map +1 -0
  11. package/dist/components/button/Button.slots.cjs +2 -0
  12. package/dist/components/button/Button.slots.cjs.map +1 -0
  13. package/dist/components/button/Button.slots.mjs +47 -0
  14. package/dist/components/button/Button.slots.mjs.map +1 -0
  15. package/dist/components/button/CompoundButton.cjs +2 -0
  16. package/dist/components/button/CompoundButton.cjs.map +1 -0
  17. package/dist/components/button/CompoundButton.mjs +53 -0
  18. package/dist/components/button/CompoundButton.mjs.map +1 -0
  19. package/dist/components/button/Link.cjs +2 -0
  20. package/dist/components/button/Link.cjs.map +1 -0
  21. package/dist/components/button/Link.mjs +37 -0
  22. package/dist/components/button/Link.mjs.map +1 -0
  23. package/dist/components/button/MenuButton.cjs +2 -0
  24. package/dist/components/button/MenuButton.cjs.map +1 -0
  25. package/dist/components/button/MenuButton.mjs +45 -0
  26. package/dist/components/button/MenuButton.mjs.map +1 -0
  27. package/dist/components/button/SplitButton.cjs +2 -0
  28. package/dist/components/button/SplitButton.cjs.map +1 -0
  29. package/dist/components/button/SplitButton.mjs +66 -0
  30. package/dist/components/button/SplitButton.mjs.map +1 -0
  31. package/dist/components/button/ToggleButton.cjs +2 -0
  32. package/dist/components/button/ToggleButton.cjs.map +1 -0
  33. package/dist/components/button/ToggleButton.mjs +65 -0
  34. package/dist/components/button/ToggleButton.mjs.map +1 -0
  35. package/dist/components/button/Toolbar.cjs +2 -0
  36. package/dist/components/button/Toolbar.cjs.map +1 -0
  37. package/dist/components/button/Toolbar.context.cjs +2 -0
  38. package/dist/components/button/Toolbar.context.cjs.map +1 -0
  39. package/dist/components/button/Toolbar.context.mjs +31 -0
  40. package/dist/components/button/Toolbar.context.mjs.map +1 -0
  41. package/dist/components/button/Toolbar.mjs +63 -0
  42. package/dist/components/button/Toolbar.mjs.map +1 -0
  43. package/dist/components/button/Toolbar.parts.cjs +2 -0
  44. package/dist/components/button/Toolbar.parts.cjs.map +1 -0
  45. package/dist/components/button/Toolbar.parts.mjs +131 -0
  46. package/dist/components/button/Toolbar.parts.mjs.map +1 -0
  47. package/dist/components/button/buttonStyles.cjs +2 -0
  48. package/dist/components/button/buttonStyles.cjs.map +1 -0
  49. package/dist/components/button/buttonStyles.mjs +39 -0
  50. package/dist/components/button/buttonStyles.mjs.map +1 -0
  51. package/dist/components/data-display/Avatar.cjs +2 -0
  52. package/dist/components/data-display/Avatar.cjs.map +1 -0
  53. package/dist/components/data-display/Avatar.mjs +157 -0
  54. package/dist/components/data-display/Avatar.mjs.map +1 -0
  55. package/dist/components/data-display/AvatarGroup.cjs +2 -0
  56. package/dist/components/data-display/AvatarGroup.cjs.map +1 -0
  57. package/dist/components/data-display/AvatarGroup.mjs +134 -0
  58. package/dist/components/data-display/AvatarGroup.mjs.map +1 -0
  59. package/dist/components/data-display/Badge.cjs +2 -0
  60. package/dist/components/data-display/Badge.cjs.map +1 -0
  61. package/dist/components/data-display/Badge.colors.cjs +2 -0
  62. package/dist/components/data-display/Badge.colors.cjs.map +1 -0
  63. package/dist/components/data-display/Badge.colors.mjs +58 -0
  64. package/dist/components/data-display/Badge.colors.mjs.map +1 -0
  65. package/dist/components/data-display/Badge.mjs +32 -0
  66. package/dist/components/data-display/Badge.mjs.map +1 -0
  67. package/dist/components/data-display/CounterBadge.cjs +2 -0
  68. package/dist/components/data-display/CounterBadge.cjs.map +1 -0
  69. package/dist/components/data-display/CounterBadge.mjs +28 -0
  70. package/dist/components/data-display/CounterBadge.mjs.map +1 -0
  71. package/dist/components/data-display/Divider.cjs +2 -0
  72. package/dist/components/data-display/Divider.cjs.map +1 -0
  73. package/dist/components/data-display/Divider.mjs +52 -0
  74. package/dist/components/data-display/Divider.mjs.map +1 -0
  75. package/dist/components/data-display/Image.cjs +2 -0
  76. package/dist/components/data-display/Image.cjs.map +1 -0
  77. package/dist/components/data-display/Image.mjs +32 -0
  78. package/dist/components/data-display/Image.mjs.map +1 -0
  79. package/dist/components/data-display/InfoLabel.cjs +2 -0
  80. package/dist/components/data-display/InfoLabel.cjs.map +1 -0
  81. package/dist/components/data-display/InfoLabel.mjs +104 -0
  82. package/dist/components/data-display/InfoLabel.mjs.map +1 -0
  83. package/dist/components/data-display/List.cjs +2 -0
  84. package/dist/components/data-display/List.cjs.map +1 -0
  85. package/dist/components/data-display/List.mjs +381 -0
  86. package/dist/components/data-display/List.mjs.map +1 -0
  87. package/dist/components/data-display/List.registry.cjs +2 -0
  88. package/dist/components/data-display/List.registry.cjs.map +1 -0
  89. package/dist/components/data-display/List.registry.mjs +101 -0
  90. package/dist/components/data-display/List.registry.mjs.map +1 -0
  91. package/dist/components/data-display/Persona.cjs +2 -0
  92. package/dist/components/data-display/Persona.cjs.map +1 -0
  93. package/dist/components/data-display/Persona.mjs +48 -0
  94. package/dist/components/data-display/Persona.mjs.map +1 -0
  95. package/dist/components/data-display/PresenceBadge.cjs +2 -0
  96. package/dist/components/data-display/PresenceBadge.cjs.map +1 -0
  97. package/dist/components/data-display/PresenceBadge.mjs +71 -0
  98. package/dist/components/data-display/PresenceBadge.mjs.map +1 -0
  99. package/dist/components/data-display/Tag.cjs +2 -0
  100. package/dist/components/data-display/Tag.cjs.map +1 -0
  101. package/dist/components/data-display/Tag.mjs +147 -0
  102. package/dist/components/data-display/Tag.mjs.map +1 -0
  103. package/dist/components/feedback/MessageBar.cjs +2 -0
  104. package/dist/components/feedback/MessageBar.cjs.map +1 -0
  105. package/dist/components/feedback/MessageBar.mjs +144 -0
  106. package/dist/components/feedback/MessageBar.mjs.map +1 -0
  107. package/dist/components/feedback/MessageBar.status.cjs +2 -0
  108. package/dist/components/feedback/MessageBar.status.cjs.map +1 -0
  109. package/dist/components/feedback/MessageBar.status.mjs +45 -0
  110. package/dist/components/feedback/MessageBar.status.mjs.map +1 -0
  111. package/dist/components/feedback/ProgressBar.cjs +2 -0
  112. package/dist/components/feedback/ProgressBar.cjs.map +1 -0
  113. package/dist/components/feedback/ProgressBar.mjs +72 -0
  114. package/dist/components/feedback/ProgressBar.mjs.map +1 -0
  115. package/dist/components/feedback/Skeleton.cjs +2 -0
  116. package/dist/components/feedback/Skeleton.cjs.map +1 -0
  117. package/dist/components/feedback/Skeleton.mjs +47 -0
  118. package/dist/components/feedback/Skeleton.mjs.map +1 -0
  119. package/dist/components/feedback/Spinner.cjs +2 -0
  120. package/dist/components/feedback/Spinner.cjs.map +1 -0
  121. package/dist/components/feedback/Spinner.mjs +60 -0
  122. package/dist/components/feedback/Spinner.mjs.map +1 -0
  123. package/dist/components/feedback/Toast.cjs +2 -0
  124. package/dist/components/feedback/Toast.cjs.map +1 -0
  125. package/dist/components/feedback/Toast.mjs +347 -0
  126. package/dist/components/feedback/Toast.mjs.map +1 -0
  127. package/dist/components/input/Checkbox.cjs +2 -0
  128. package/dist/components/input/Checkbox.cjs.map +1 -0
  129. package/dist/components/input/Checkbox.mjs +96 -0
  130. package/dist/components/input/Checkbox.mjs.map +1 -0
  131. package/dist/components/input/ColorPicker.cjs +6 -0
  132. package/dist/components/input/ColorPicker.cjs.map +1 -0
  133. package/dist/components/input/ColorPicker.mjs +236 -0
  134. package/dist/components/input/ColorPicker.mjs.map +1 -0
  135. package/dist/components/input/Combobox.cjs +2 -0
  136. package/dist/components/input/Combobox.cjs.map +1 -0
  137. package/dist/components/input/Combobox.expand.cjs +2 -0
  138. package/dist/components/input/Combobox.expand.cjs.map +1 -0
  139. package/dist/components/input/Combobox.expand.mjs +38 -0
  140. package/dist/components/input/Combobox.expand.mjs.map +1 -0
  141. package/dist/components/input/Combobox.mjs +187 -0
  142. package/dist/components/input/Combobox.mjs.map +1 -0
  143. package/dist/components/input/DatePicker.cjs +2 -0
  144. package/dist/components/input/DatePicker.cjs.map +1 -0
  145. package/dist/components/input/DatePicker.mjs +340 -0
  146. package/dist/components/input/DatePicker.mjs.map +1 -0
  147. package/dist/components/input/Dropdown.cjs +2 -0
  148. package/dist/components/input/Dropdown.cjs.map +1 -0
  149. package/dist/components/input/Dropdown.mjs +128 -0
  150. package/dist/components/input/Dropdown.mjs.map +1 -0
  151. package/dist/components/input/Field.cjs +2 -0
  152. package/dist/components/input/Field.cjs.map +1 -0
  153. package/dist/components/input/Field.mjs +200 -0
  154. package/dist/components/input/Field.mjs.map +1 -0
  155. package/dist/components/input/Input.cjs +2 -0
  156. package/dist/components/input/Input.cjs.map +1 -0
  157. package/dist/components/input/Input.mjs +81 -0
  158. package/dist/components/input/Input.mjs.map +1 -0
  159. package/dist/components/input/Label.cjs +2 -0
  160. package/dist/components/input/Label.cjs.map +1 -0
  161. package/dist/components/input/Label.mjs +28 -0
  162. package/dist/components/input/Label.mjs.map +1 -0
  163. package/dist/components/input/Option.cjs +2 -0
  164. package/dist/components/input/Option.cjs.map +1 -0
  165. package/dist/components/input/Option.mjs +169 -0
  166. package/dist/components/input/Option.mjs.map +1 -0
  167. package/dist/components/input/RadioGroup.cjs +2 -0
  168. package/dist/components/input/RadioGroup.cjs.map +1 -0
  169. package/dist/components/input/RadioGroup.mjs +139 -0
  170. package/dist/components/input/RadioGroup.mjs.map +1 -0
  171. package/dist/components/input/Rating.cjs +2 -0
  172. package/dist/components/input/Rating.cjs.map +1 -0
  173. package/dist/components/input/Rating.mjs +196 -0
  174. package/dist/components/input/Rating.mjs.map +1 -0
  175. package/dist/components/input/SearchBox.cjs +2 -0
  176. package/dist/components/input/SearchBox.cjs.map +1 -0
  177. package/dist/components/input/SearchBox.mjs +205 -0
  178. package/dist/components/input/SearchBox.mjs.map +1 -0
  179. package/dist/components/input/Select.cjs +2 -0
  180. package/dist/components/input/Select.cjs.map +1 -0
  181. package/dist/components/input/Select.mjs +33 -0
  182. package/dist/components/input/Select.mjs.map +1 -0
  183. package/dist/components/input/Slider.cjs +2 -0
  184. package/dist/components/input/Slider.cjs.map +1 -0
  185. package/dist/components/input/Slider.mjs +79 -0
  186. package/dist/components/input/Slider.mjs.map +1 -0
  187. package/dist/components/input/SpinButton.cjs +2 -0
  188. package/dist/components/input/SpinButton.cjs.map +1 -0
  189. package/dist/components/input/SpinButton.mjs +157 -0
  190. package/dist/components/input/SpinButton.mjs.map +1 -0
  191. package/dist/components/input/SwatchPicker.cjs +2 -0
  192. package/dist/components/input/SwatchPicker.cjs.map +1 -0
  193. package/dist/components/input/SwatchPicker.mjs +113 -0
  194. package/dist/components/input/SwatchPicker.mjs.map +1 -0
  195. package/dist/components/input/Switch.cjs +2 -0
  196. package/dist/components/input/Switch.cjs.map +1 -0
  197. package/dist/components/input/Switch.mjs +92 -0
  198. package/dist/components/input/Switch.mjs.map +1 -0
  199. package/dist/components/input/TagPicker.cjs +2 -0
  200. package/dist/components/input/TagPicker.cjs.map +1 -0
  201. package/dist/components/input/TagPicker.mjs +249 -0
  202. package/dist/components/input/TagPicker.mjs.map +1 -0
  203. package/dist/components/input/Textarea.cjs +2 -0
  204. package/dist/components/input/Textarea.cjs.map +1 -0
  205. package/dist/components/input/Textarea.mjs +32 -0
  206. package/dist/components/input/Textarea.mjs.map +1 -0
  207. package/dist/components/input/TimePicker.cjs +2 -0
  208. package/dist/components/input/TimePicker.cjs.map +1 -0
  209. package/dist/components/input/TimePicker.mjs +292 -0
  210. package/dist/components/input/TimePicker.mjs.map +1 -0
  211. package/dist/components/input/colorUtils.cjs +2 -0
  212. package/dist/components/input/colorUtils.cjs.map +1 -0
  213. package/dist/components/input/colorUtils.mjs +96 -0
  214. package/dist/components/input/colorUtils.mjs.map +1 -0
  215. package/dist/components/input/dateUtils.cjs +2 -0
  216. package/dist/components/input/dateUtils.cjs.map +1 -0
  217. package/dist/components/input/dateUtils.mjs +250 -0
  218. package/dist/components/input/dateUtils.mjs.map +1 -0
  219. package/dist/components/input/pickerStyles.cjs +2 -0
  220. package/dist/components/input/pickerStyles.cjs.map +1 -0
  221. package/dist/components/input/pickerStyles.mjs +10 -0
  222. package/dist/components/input/pickerStyles.mjs.map +1 -0
  223. package/dist/components/internal/HiddenInput.cjs +2 -0
  224. package/dist/components/internal/HiddenInput.cjs.map +1 -0
  225. package/dist/components/internal/HiddenInput.mjs +88 -0
  226. package/dist/components/internal/HiddenInput.mjs.map +1 -0
  227. package/dist/components/layout/Accordion.cjs +2 -0
  228. package/dist/components/layout/Accordion.cjs.map +1 -0
  229. package/dist/components/layout/Accordion.mjs +236 -0
  230. package/dist/components/layout/Accordion.mjs.map +1 -0
  231. package/dist/components/layout/Card.cjs +2 -0
  232. package/dist/components/layout/Card.cjs.map +1 -0
  233. package/dist/components/layout/Card.mjs +121 -0
  234. package/dist/components/layout/Card.mjs.map +1 -0
  235. package/dist/components/layout/Carousel.cjs +2 -0
  236. package/dist/components/layout/Carousel.cjs.map +1 -0
  237. package/dist/components/layout/Carousel.mjs +205 -0
  238. package/dist/components/layout/Carousel.mjs.map +1 -0
  239. package/dist/components/layout/Flex.cjs +2 -0
  240. package/dist/components/layout/Flex.cjs.map +1 -0
  241. package/dist/components/layout/Flex.mjs +54 -0
  242. package/dist/components/layout/Flex.mjs.map +1 -0
  243. package/dist/components/layout/Grid.cjs +2 -0
  244. package/dist/components/layout/Grid.cjs.map +1 -0
  245. package/dist/components/layout/Grid.mjs +62 -0
  246. package/dist/components/layout/Grid.mjs.map +1 -0
  247. package/dist/components/layout/Overflow.cjs +2 -0
  248. package/dist/components/layout/Overflow.cjs.map +1 -0
  249. package/dist/components/layout/Overflow.mjs +269 -0
  250. package/dist/components/layout/Overflow.mjs.map +1 -0
  251. package/dist/components/layout/Stack.cjs +2 -0
  252. package/dist/components/layout/Stack.cjs.map +1 -0
  253. package/dist/components/layout/Stack.mjs +39 -0
  254. package/dist/components/layout/Stack.mjs.map +1 -0
  255. package/dist/components/layout/TabList.cjs +2 -0
  256. package/dist/components/layout/TabList.cjs.map +1 -0
  257. package/dist/components/layout/TabList.mjs +238 -0
  258. package/dist/components/layout/TabList.mjs.map +1 -0
  259. package/dist/components/layout/Tree.cjs +2 -0
  260. package/dist/components/layout/Tree.cjs.map +1 -0
  261. package/dist/components/layout/Tree.mjs +220 -0
  262. package/dist/components/layout/Tree.mjs.map +1 -0
  263. package/dist/components/layout/disclosureIds.cjs +2 -0
  264. package/dist/components/layout/disclosureIds.cjs.map +1 -0
  265. package/dist/components/layout/disclosureIds.mjs +12 -0
  266. package/dist/components/layout/disclosureIds.mjs.map +1 -0
  267. package/dist/components/motion/Presence.cjs +2 -0
  268. package/dist/components/motion/Presence.cjs.map +1 -0
  269. package/dist/components/motion/Presence.mjs +35 -0
  270. package/dist/components/motion/Presence.mjs.map +1 -0
  271. package/dist/components/navigation/Breadcrumb.cjs +2 -0
  272. package/dist/components/navigation/Breadcrumb.cjs.map +1 -0
  273. package/dist/components/navigation/Breadcrumb.mjs +144 -0
  274. package/dist/components/navigation/Breadcrumb.mjs.map +1 -0
  275. package/dist/components/navigation/Menu.cjs +2 -0
  276. package/dist/components/navigation/Menu.cjs.map +1 -0
  277. package/dist/components/navigation/Menu.context.cjs +2 -0
  278. package/dist/components/navigation/Menu.context.cjs.map +1 -0
  279. package/dist/components/navigation/Menu.context.mjs +82 -0
  280. package/dist/components/navigation/Menu.context.mjs.map +1 -0
  281. package/dist/components/navigation/Menu.group.cjs +2 -0
  282. package/dist/components/navigation/Menu.group.cjs.map +1 -0
  283. package/dist/components/navigation/Menu.group.mjs +58 -0
  284. package/dist/components/navigation/Menu.group.mjs.map +1 -0
  285. package/dist/components/navigation/Menu.items.cjs +2 -0
  286. package/dist/components/navigation/Menu.items.cjs.map +1 -0
  287. package/dist/components/navigation/Menu.items.mjs +127 -0
  288. package/dist/components/navigation/Menu.items.mjs.map +1 -0
  289. package/dist/components/navigation/Menu.link.cjs +2 -0
  290. package/dist/components/navigation/Menu.link.cjs.map +1 -0
  291. package/dist/components/navigation/Menu.link.mjs +41 -0
  292. package/dist/components/navigation/Menu.link.mjs.map +1 -0
  293. package/dist/components/navigation/Menu.mjs +27 -0
  294. package/dist/components/navigation/Menu.mjs.map +1 -0
  295. package/dist/components/navigation/Menu.popover.cjs +2 -0
  296. package/dist/components/navigation/Menu.popover.cjs.map +1 -0
  297. package/dist/components/navigation/Menu.popover.mjs +231 -0
  298. package/dist/components/navigation/Menu.popover.mjs.map +1 -0
  299. package/dist/components/navigation/Menu.root.cjs +2 -0
  300. package/dist/components/navigation/Menu.root.cjs.map +1 -0
  301. package/dist/components/navigation/Menu.root.mjs +308 -0
  302. package/dist/components/navigation/Menu.root.mjs.map +1 -0
  303. package/dist/components/navigation/Menu.selectable.cjs +2 -0
  304. package/dist/components/navigation/Menu.selectable.cjs.map +1 -0
  305. package/dist/components/navigation/Menu.selectable.mjs +89 -0
  306. package/dist/components/navigation/Menu.selectable.mjs.map +1 -0
  307. package/dist/components/navigation/Menu.shared.cjs +2 -0
  308. package/dist/components/navigation/Menu.shared.cjs.map +1 -0
  309. package/dist/components/navigation/Menu.shared.mjs +23 -0
  310. package/dist/components/navigation/Menu.shared.mjs.map +1 -0
  311. package/dist/components/navigation/Menu.splitGroup.cjs +2 -0
  312. package/dist/components/navigation/Menu.splitGroup.cjs.map +1 -0
  313. package/dist/components/navigation/Menu.splitGroup.mjs +51 -0
  314. package/dist/components/navigation/Menu.splitGroup.mjs.map +1 -0
  315. package/dist/components/navigation/Menu.trigger.cjs +2 -0
  316. package/dist/components/navigation/Menu.trigger.cjs.map +1 -0
  317. package/dist/components/navigation/Menu.trigger.mjs +79 -0
  318. package/dist/components/navigation/Menu.trigger.mjs.map +1 -0
  319. package/dist/components/navigation/Nav.cjs +2 -0
  320. package/dist/components/navigation/Nav.cjs.map +1 -0
  321. package/dist/components/navigation/Nav.mjs +276 -0
  322. package/dist/components/navigation/Nav.mjs.map +1 -0
  323. package/dist/components/navigation/Pagination.cjs +2 -0
  324. package/dist/components/navigation/Pagination.cjs.map +1 -0
  325. package/dist/components/navigation/Pagination.mjs +110 -0
  326. package/dist/components/navigation/Pagination.mjs.map +1 -0
  327. package/dist/components/navigation/Stepper.cjs +2 -0
  328. package/dist/components/navigation/Stepper.cjs.map +1 -0
  329. package/dist/components/navigation/Stepper.mjs +204 -0
  330. package/dist/components/navigation/Stepper.mjs.map +1 -0
  331. package/dist/components/overlays/Dialog.cjs +2 -0
  332. package/dist/components/overlays/Dialog.cjs.map +1 -0
  333. package/dist/components/overlays/Dialog.mjs +180 -0
  334. package/dist/components/overlays/Dialog.mjs.map +1 -0
  335. package/dist/components/overlays/Dialog.shared.cjs +2 -0
  336. package/dist/components/overlays/Dialog.shared.cjs.map +1 -0
  337. package/dist/components/overlays/Dialog.shared.mjs +227 -0
  338. package/dist/components/overlays/Dialog.shared.mjs.map +1 -0
  339. package/dist/components/overlays/Drawer.cjs +2 -0
  340. package/dist/components/overlays/Drawer.cjs.map +1 -0
  341. package/dist/components/overlays/Drawer.mjs +192 -0
  342. package/dist/components/overlays/Drawer.mjs.map +1 -0
  343. package/dist/components/overlays/Popover.cjs +2 -0
  344. package/dist/components/overlays/Popover.cjs.map +1 -0
  345. package/dist/components/overlays/Popover.mjs +365 -0
  346. package/dist/components/overlays/Popover.mjs.map +1 -0
  347. package/dist/components/overlays/Popover.shared.cjs +2 -0
  348. package/dist/components/overlays/Popover.shared.cjs.map +1 -0
  349. package/dist/components/overlays/Popover.shared.mjs +182 -0
  350. package/dist/components/overlays/Popover.shared.mjs.map +1 -0
  351. package/dist/components/overlays/TeachingPopover.cjs +2 -0
  352. package/dist/components/overlays/TeachingPopover.cjs.map +1 -0
  353. package/dist/components/overlays/TeachingPopover.mjs +181 -0
  354. package/dist/components/overlays/TeachingPopover.mjs.map +1 -0
  355. package/dist/components/overlays/Tooltip.cjs +2 -0
  356. package/dist/components/overlays/Tooltip.cjs.map +1 -0
  357. package/dist/components/overlays/Tooltip.mjs +160 -0
  358. package/dist/components/overlays/Tooltip.mjs.map +1 -0
  359. package/dist/components/portal/Portal.cjs +2 -0
  360. package/dist/components/portal/Portal.cjs.map +1 -0
  361. package/dist/components/portal/Portal.mjs +45 -0
  362. package/dist/components/portal/Portal.mjs.map +1 -0
  363. package/dist/components/provider/WaveProvider.cjs +2 -0
  364. package/dist/components/provider/WaveProvider.cjs.map +1 -0
  365. package/dist/components/provider/WaveProvider.mjs +51 -0
  366. package/dist/components/provider/WaveProvider.mjs.map +1 -0
  367. package/dist/components/table/DataGrid.cjs +2 -0
  368. package/dist/components/table/DataGrid.cjs.map +1 -0
  369. package/dist/components/table/DataGrid.mjs +489 -0
  370. package/dist/components/table/DataGrid.mjs.map +1 -0
  371. package/dist/components/table/Table.cjs +2 -0
  372. package/dist/components/table/Table.cjs.map +1 -0
  373. package/dist/components/table/Table.mjs +99 -0
  374. package/dist/components/table/Table.mjs.map +1 -0
  375. package/dist/components/table/useGridNavigation.cjs +2 -0
  376. package/dist/components/table/useGridNavigation.cjs.map +1 -0
  377. package/dist/components/table/useGridNavigation.mjs +336 -0
  378. package/dist/components/table/useGridNavigation.mjs.map +1 -0
  379. package/dist/components/typography/Text.cjs +2 -0
  380. package/dist/components/typography/Text.cjs.map +1 -0
  381. package/dist/components/typography/Text.mjs +38 -0
  382. package/dist/components/typography/Text.mjs.map +1 -0
  383. package/dist/hooks/useAnnounce.cjs +2 -0
  384. package/dist/hooks/useAnnounce.cjs.map +1 -0
  385. package/dist/hooks/useAnnounce.mjs +88 -0
  386. package/dist/hooks/useAnnounce.mjs.map +1 -0
  387. package/dist/hooks/useCheckedValues.cjs +2 -0
  388. package/dist/hooks/useCheckedValues.cjs.map +1 -0
  389. package/dist/hooks/useCheckedValues.mjs +102 -0
  390. package/dist/hooks/useCheckedValues.mjs.map +1 -0
  391. package/dist/hooks/useContextMenuAnchor.cjs +2 -0
  392. package/dist/hooks/useContextMenuAnchor.cjs.map +1 -0
  393. package/dist/hooks/useContextMenuAnchor.mjs +132 -0
  394. package/dist/hooks/useContextMenuAnchor.mjs.map +1 -0
  395. package/dist/hooks/useControllable.cjs +2 -0
  396. package/dist/hooks/useControllable.cjs.map +1 -0
  397. package/dist/hooks/useControllable.mjs +37 -0
  398. package/dist/hooks/useControllable.mjs.map +1 -0
  399. package/dist/hooks/useDirection.cjs +2 -0
  400. package/dist/hooks/useDirection.cjs.map +1 -0
  401. package/dist/hooks/useDirection.mjs +57 -0
  402. package/dist/hooks/useDirection.mjs.map +1 -0
  403. package/dist/hooks/useDismiss.cjs +2 -0
  404. package/dist/hooks/useDismiss.cjs.map +1 -0
  405. package/dist/hooks/useDismiss.mjs +57 -0
  406. package/dist/hooks/useDismiss.mjs.map +1 -0
  407. package/dist/hooks/useEventCallback.cjs +2 -0
  408. package/dist/hooks/useEventCallback.cjs.map +1 -0
  409. package/dist/hooks/useEventCallback.mjs +16 -0
  410. package/dist/hooks/useEventCallback.mjs.map +1 -0
  411. package/dist/hooks/useFieldControl.cjs +2 -0
  412. package/dist/hooks/useFieldControl.cjs.map +1 -0
  413. package/dist/hooks/useFieldControl.mjs +62 -0
  414. package/dist/hooks/useFieldControl.mjs.map +1 -0
  415. package/dist/hooks/useFocusTrap.cjs +2 -0
  416. package/dist/hooks/useFocusTrap.cjs.map +1 -0
  417. package/dist/hooks/useFocusTrap.mjs +266 -0
  418. package/dist/hooks/useFocusTrap.mjs.map +1 -0
  419. package/dist/hooks/useFormReset.cjs +2 -0
  420. package/dist/hooks/useFormReset.cjs.map +1 -0
  421. package/dist/hooks/useFormReset.mjs +33 -0
  422. package/dist/hooks/useFormReset.mjs.map +1 -0
  423. package/dist/hooks/useHoverIntent.cjs +2 -0
  424. package/dist/hooks/useHoverIntent.cjs.map +1 -0
  425. package/dist/hooks/useHoverIntent.mjs +201 -0
  426. package/dist/hooks/useHoverIntent.mjs.map +1 -0
  427. package/dist/hooks/useId.cjs +2 -0
  428. package/dist/hooks/useId.cjs.map +1 -0
  429. package/dist/hooks/useId.mjs +11 -0
  430. package/dist/hooks/useId.mjs.map +1 -0
  431. package/dist/hooks/useIsClient.cjs +2 -0
  432. package/dist/hooks/useIsClient.cjs.map +1 -0
  433. package/dist/hooks/useIsClient.mjs +19 -0
  434. package/dist/hooks/useIsClient.mjs.map +1 -0
  435. package/dist/hooks/useListbox.cjs +2 -0
  436. package/dist/hooks/useListbox.cjs.map +1 -0
  437. package/dist/hooks/useListbox.mjs +492 -0
  438. package/dist/hooks/useListbox.mjs.map +1 -0
  439. package/dist/hooks/useMergedRefs.cjs +2 -0
  440. package/dist/hooks/useMergedRefs.cjs.map +1 -0
  441. package/dist/hooks/useMergedRefs.mjs +57 -0
  442. package/dist/hooks/useMergedRefs.mjs.map +1 -0
  443. package/dist/hooks/useModalIsolation.cjs +2 -0
  444. package/dist/hooks/useModalIsolation.cjs.map +1 -0
  445. package/dist/hooks/useModalIsolation.mjs +87 -0
  446. package/dist/hooks/useModalIsolation.mjs.map +1 -0
  447. package/dist/hooks/useModalLayer.cjs +2 -0
  448. package/dist/hooks/useModalLayer.cjs.map +1 -0
  449. package/dist/hooks/useModalLayer.mjs +30 -0
  450. package/dist/hooks/useModalLayer.mjs.map +1 -0
  451. package/dist/hooks/usePopupPosition.cjs +2 -0
  452. package/dist/hooks/usePopupPosition.cjs.map +1 -0
  453. package/dist/hooks/usePopupPosition.mjs +117 -0
  454. package/dist/hooks/usePopupPosition.mjs.map +1 -0
  455. package/dist/hooks/usePrefersReducedMotion.cjs +2 -0
  456. package/dist/hooks/usePrefersReducedMotion.cjs.map +1 -0
  457. package/dist/hooks/usePrefersReducedMotion.mjs +24 -0
  458. package/dist/hooks/usePrefersReducedMotion.mjs.map +1 -0
  459. package/dist/hooks/usePresence.cjs +2 -0
  460. package/dist/hooks/usePresence.cjs.map +1 -0
  461. package/dist/hooks/usePresence.mjs +136 -0
  462. package/dist/hooks/usePresence.mjs.map +1 -0
  463. package/dist/hooks/usePreserveFocus.cjs +2 -0
  464. package/dist/hooks/usePreserveFocus.cjs.map +1 -0
  465. package/dist/hooks/usePreserveFocus.mjs +50 -0
  466. package/dist/hooks/usePreserveFocus.mjs.map +1 -0
  467. package/dist/hooks/useRestoreFocus.cjs +2 -0
  468. package/dist/hooks/useRestoreFocus.cjs.map +1 -0
  469. package/dist/hooks/useRestoreFocus.mjs +271 -0
  470. package/dist/hooks/useRestoreFocus.mjs.map +1 -0
  471. package/dist/hooks/useRovingTabIndex.cjs +2 -0
  472. package/dist/hooks/useRovingTabIndex.cjs.map +1 -0
  473. package/dist/hooks/useRovingTabIndex.mjs +389 -0
  474. package/dist/hooks/useRovingTabIndex.mjs.map +1 -0
  475. package/dist/hooks/useScrollLock.cjs +2 -0
  476. package/dist/hooks/useScrollLock.cjs.map +1 -0
  477. package/dist/hooks/useScrollLock.mjs +71 -0
  478. package/dist/hooks/useScrollLock.mjs.map +1 -0
  479. package/dist/hooks/useTriggerElement.cjs +2 -0
  480. package/dist/hooks/useTriggerElement.cjs.map +1 -0
  481. package/dist/hooks/useTriggerElement.mjs +126 -0
  482. package/dist/hooks/useTriggerElement.mjs.map +1 -0
  483. package/dist/hooks/useTypeahead.cjs +2 -0
  484. package/dist/hooks/useTypeahead.cjs.map +1 -0
  485. package/dist/hooks/useTypeahead.mjs +38 -0
  486. package/dist/hooks/useTypeahead.mjs.map +1 -0
  487. package/dist/index.cjs +1 -1
  488. package/dist/index.d.cts +9099 -0
  489. package/dist/index.d.ts +7688 -1027
  490. package/dist/index.mjs +91 -5695
  491. package/dist/lib/aria.cjs +2 -0
  492. package/dist/lib/aria.cjs.map +1 -0
  493. package/dist/lib/aria.mjs +29 -0
  494. package/dist/lib/aria.mjs.map +1 -0
  495. package/dist/lib/children.cjs +2 -0
  496. package/dist/lib/children.cjs.map +1 -0
  497. package/dist/lib/children.mjs +37 -0
  498. package/dist/lib/children.mjs.map +1 -0
  499. package/dist/lib/cn.cjs +2 -0
  500. package/dist/lib/cn.cjs.map +1 -0
  501. package/dist/lib/cn.mjs +64 -0
  502. package/dist/lib/cn.mjs.map +1 -0
  503. package/dist/lib/composeEventHandlers.cjs +2 -0
  504. package/dist/lib/composeEventHandlers.cjs.map +1 -0
  505. package/dist/lib/composeEventHandlers.mjs +11 -0
  506. package/dist/lib/composeEventHandlers.mjs.map +1 -0
  507. package/dist/lib/dev.cjs +2 -0
  508. package/dist/lib/dev.cjs.map +1 -0
  509. package/dist/lib/dev.mjs +42 -0
  510. package/dist/lib/dev.mjs.map +1 -0
  511. package/dist/lib/direction.cjs +2 -0
  512. package/dist/lib/direction.cjs.map +1 -0
  513. package/dist/lib/direction.mjs +35 -0
  514. package/dist/lib/direction.mjs.map +1 -0
  515. package/dist/lib/events.cjs +2 -0
  516. package/dist/lib/events.cjs.map +1 -0
  517. package/dist/lib/events.mjs +31 -0
  518. package/dist/lib/events.mjs.map +1 -0
  519. package/dist/lib/focus.cjs +2 -0
  520. package/dist/lib/focus.cjs.map +1 -0
  521. package/dist/lib/focus.mjs +119 -0
  522. package/dist/lib/focus.mjs.map +1 -0
  523. package/dist/lib/globalRegistry.cjs +2 -0
  524. package/dist/lib/globalRegistry.cjs.map +1 -0
  525. package/dist/lib/globalRegistry.mjs +13 -0
  526. package/dist/lib/globalRegistry.mjs.map +1 -0
  527. package/dist/lib/icons.cjs +2 -0
  528. package/dist/lib/icons.cjs.map +1 -0
  529. package/dist/lib/icons.mjs +254 -0
  530. package/dist/lib/icons.mjs.map +1 -0
  531. package/dist/lib/labelInName.cjs +2 -0
  532. package/dist/lib/labelInName.cjs.map +1 -0
  533. package/dist/lib/labelInName.mjs +54 -0
  534. package/dist/lib/labelInName.mjs.map +1 -0
  535. package/dist/lib/layers.cjs +2 -0
  536. package/dist/lib/layers.cjs.map +1 -0
  537. package/dist/lib/layers.mjs +224 -0
  538. package/dist/lib/layers.mjs.map +1 -0
  539. package/dist/lib/mergeProps.cjs +2 -0
  540. package/dist/lib/mergeProps.cjs.map +1 -0
  541. package/dist/lib/mergeProps.mjs +21 -0
  542. package/dist/lib/mergeProps.mjs.map +1 -0
  543. package/dist/lib/mergeRefs.cjs +2 -0
  544. package/dist/lib/mergeRefs.cjs.map +1 -0
  545. package/dist/lib/mergeRefs.mjs +29 -0
  546. package/dist/lib/mergeRefs.mjs.map +1 -0
  547. package/dist/lib/renderTrigger.cjs +2 -0
  548. package/dist/lib/renderTrigger.cjs.map +1 -0
  549. package/dist/lib/renderTrigger.mjs +29 -0
  550. package/dist/lib/renderTrigger.mjs.map +1 -0
  551. package/dist/lib/slot.cjs +2 -0
  552. package/dist/lib/slot.cjs.map +1 -0
  553. package/dist/lib/slot.mjs +122 -0
  554. package/dist/lib/slot.mjs.map +1 -0
  555. package/dist/lib/styles.cjs +2 -0
  556. package/dist/lib/styles.cjs.map +1 -0
  557. package/dist/lib/styles.mjs +16 -0
  558. package/dist/lib/styles.mjs.map +1 -0
  559. package/dist/lib/theme.cjs +2 -0
  560. package/dist/lib/theme.cjs.map +1 -0
  561. package/dist/lib/theme.mjs +16 -0
  562. package/dist/lib/theme.mjs.map +1 -0
  563. package/dist/preflight.css +2 -0
  564. package/dist/styles.css +2 -0
  565. package/package.json +149 -100
  566. package/src/styles/animations.css +7 -39
  567. package/src/styles/base.css +103 -0
  568. package/src/styles/globals.css +10 -22
  569. package/src/styles/legacy-tokens.css +184 -0
  570. package/src/styles/preflight.css +7 -0
  571. package/src/styles/styles.css +32 -0
  572. package/src/styles/tailwind.css +17 -0
  573. package/src/styles/tokens.css +561 -221
  574. package/src/styles/variants.css +29 -0
@@ -0,0 +1,381 @@
1
+ "use client";
2
+ import { cn as e } from "../../lib/cn.mjs";
3
+ import { flattenChildren as t, isElementOfType as n } from "../../lib/children.mjs";
4
+ import { reportMissingContext as r, warnDeprecated as i, warnOnce as a } from "../../lib/dev.mjs";
5
+ import { materialiseSlotContent as o, slotRendersContent as s } from "../../lib/slot.mjs";
6
+ import { composeEventHandlers as c } from "../../lib/composeEventHandlers.mjs";
7
+ import { useEventCallback as l } from "../../hooks/useEventCallback.mjs";
8
+ import { useControllable as u } from "../../hooks/useControllable.mjs";
9
+ import { useId as d } from "../../hooks/useId.mjs";
10
+ import { getArrowIntent as f, getDirection as p } from "../../lib/direction.mjs";
11
+ import { FOCUSABLE_SELECTOR as m, isFocusable as h } from "../../lib/focus.mjs";
12
+ import { useRovingTabIndex as g } from "../../hooks/useRovingTabIndex.mjs";
13
+ import { useMergedRefs as _ } from "../../hooks/useMergedRefs.mjs";
14
+ import { forcedColors as v } from "../../lib/styles.mjs";
15
+ import { ListRegistry as y } from "./List.registry.mjs";
16
+ import * as b from "react";
17
+ import { jsx as x, jsxs as S } from "react/jsx-runtime";
18
+ //#region src/components/data-display/List.tsx
19
+ var C = b.createContext(null);
20
+ C.displayName = "ListContext";
21
+ var w = null;
22
+ function T() {
23
+ return w ??= {
24
+ mode: "list",
25
+ selectedValues: /* @__PURE__ */ new Set(),
26
+ toggleItem: () => {},
27
+ getTabIndex: () => -1,
28
+ registry: new y()
29
+ }, w;
30
+ }
31
+ function E(e) {
32
+ return b.useContext(C) || (r(e, "a List"), T());
33
+ }
34
+ var D = [];
35
+ function O(e) {
36
+ a(`List:duplicate:${e}`, `List: several items share the value "${e}". Item values must be unique within a List; items with the same value are selected (and tab stops) together.`);
37
+ }
38
+ function k(e) {
39
+ return t(e).some(({ node: e }) => n(e, H) && s(e.props.action));
40
+ }
41
+ var A = [
42
+ m,
43
+ "[data-list-action]",
44
+ "label",
45
+ "[role=\"button\"]",
46
+ "[role=\"link\"]",
47
+ "[role=\"checkbox\"]",
48
+ "[role=\"switch\"]",
49
+ "[role=\"radio\"]",
50
+ "[role=\"menuitem\"]",
51
+ "[role=\"textbox\"]",
52
+ "[role=\"combobox\"]",
53
+ "[role=\"slider\"]",
54
+ "[role=\"spinbutton\"]"
55
+ ].join(", ");
56
+ function j(e) {
57
+ let t = e.currentTarget, n = e.target;
58
+ if (!n || typeof n.nodeType != "number" || !t.contains(n)) return !0;
59
+ let r = n.nodeType === Node.ELEMENT_NODE ? n : n.parentElement ?? null;
60
+ for (; r && r !== t; r = r.parentElement) if (r.matches(A)) return !0;
61
+ return !1;
62
+ }
63
+ function M(e) {
64
+ return e.ctrlKey || e.altKey || e.metaKey ? !1 : e.key === "Enter" || e.key === " ";
65
+ }
66
+ var N = /* @__PURE__ */ new Set([
67
+ "textbox",
68
+ "searchbox",
69
+ "combobox",
70
+ "spinbutton",
71
+ "slider"
72
+ ]), P = /* @__PURE__ */ new Set([
73
+ "button",
74
+ "checkbox",
75
+ "color",
76
+ "file",
77
+ "hidden",
78
+ "image",
79
+ "radio",
80
+ "reset",
81
+ "submit"
82
+ ]);
83
+ function F(e) {
84
+ let t = e.getAttribute("role");
85
+ if (t !== null && N.has(t)) return !0;
86
+ let n = e.localName;
87
+ return n === "textarea" || n === "select" ? !0 : n === "input" ? !P.has(e.type) : e.matches("[contenteditable]:not([contenteditable=\"false\"])");
88
+ }
89
+ function I(e) {
90
+ return Array.from(e.querySelectorAll(m)).filter((e) => h(e));
91
+ }
92
+ function L(e) {
93
+ if (!e.parentElement) return -1;
94
+ let t = 0;
95
+ for (let n = e.previousElementSibling; n; n = n.previousElementSibling) t++;
96
+ return t;
97
+ }
98
+ function R(e, t) {
99
+ let n = null, r = null, i = null, a = 0;
100
+ for (let o = e.firstElementChild; o; o = o.nextElementSibling, a++) {
101
+ if (t.value !== void 0 && o.getAttribute("data-roving-value") === t.value) {
102
+ n = o;
103
+ break;
104
+ }
105
+ a === t.index && (r = o), i = o;
106
+ }
107
+ let o = n ?? r ?? (t.index >= 0 ? i : null);
108
+ return o ? o.hasAttribute("tabindex") ? o : I(o)[0] ?? null : null;
109
+ }
110
+ function z(e) {
111
+ for (let t = e.firstElementChild; t; t = t.nextElementSibling) if (t.hasAttribute("data-list-action")) return t;
112
+ return null;
113
+ }
114
+ function B(e) {
115
+ let t = [];
116
+ for (let n of I(e)) {
117
+ let r = F(n) ? e : n;
118
+ t.includes(r) || t.push(r);
119
+ }
120
+ return t;
121
+ }
122
+ var V = (t) => {
123
+ let { selectable: n = !1, selectionMode: r, selectedItems: o, defaultSelectedItems: s, onSelectionChange: l, selectedItem: d, defaultSelectedItem: f, onSelectedItemChange: p, className: m, children: h, ref: v, onKeyDown: S, onKeyDownCapture: w, onFocus: T, ...E } = t;
124
+ r === "multi" && i("List", "selectionMode=\"multi\"", "selectionMode=\"multiple\"");
125
+ let A = r === "multiple" || r === "multi", j = b.useMemo(() => !A && d !== void 0 ? d === null ? D : [d] : o, [
126
+ A,
127
+ d,
128
+ o
129
+ ]), M = b.useMemo(() => !A && f != null ? [f] : s ?? D, [
130
+ A,
131
+ f,
132
+ s
133
+ ]), [N, P] = u(j, M, (e) => {
134
+ let t = [...e];
135
+ l?.(t), A || p?.(t[0] ?? null);
136
+ }), [F] = b.useState(() => new y());
137
+ b.useLayoutEffect(() => {
138
+ F.setActive(n);
139
+ }, [F, n]);
140
+ let I = b.useSyncExternalStore(F.subscribe, F.getSnapshot, F.getServerSnapshot), L = b.useMemo(() => I ? N.filter((e) => I.valueSet.has(e)) : N, [I, N]), z = b.useMemo(() => new Set(L), [L]), B = n && (I ? I.hasActions : k(h)), V = n ? B ? "grid" : "listbox" : "list", H = I ? I.values.find((e) => z.has(e)) ?? null : L[0] ?? null, { containerProps: U, getTabIndex: W } = g({
141
+ activeValue: H,
142
+ orientation: "vertical",
143
+ typeahead: (I?.count ?? 0) > 7,
144
+ tabStop: "active",
145
+ itemSelector: ":scope > [data-roving-value]"
146
+ }), { ref: G, onKeyDown: K, onKeyDownCapture: q, onFocus: J } = U, Y = b.useRef(null), X = _(v, n ? G : null, Y);
147
+ b.useLayoutEffect(() => {
148
+ let e = F.takeFocusLoss(), t = Y.current;
149
+ if (!e || !t) return;
150
+ let n = t.ownerDocument, r = n.activeElement;
151
+ r && r !== n.body && r.isConnected || R(t, e)?.focus();
152
+ }, [V, F]), b.useLayoutEffect(() => {
153
+ F.syncOrder(Y.current);
154
+ });
155
+ let Z = b.useCallback((e) => {
156
+ P((t) => {
157
+ let n = F.prune(t), r = n.includes(e);
158
+ return A ? r ? n.filter((t) => t !== e) : [...n, e] : r ? [] : [e];
159
+ });
160
+ }, [
161
+ A,
162
+ F,
163
+ P
164
+ ]), Q = I?.duplicates ?? D;
165
+ b.useEffect(() => {
166
+ for (let e of Q) O(e);
167
+ }, [Q]);
168
+ let $ = L.length;
169
+ b.useEffect(() => {
170
+ n && !A && $ > 1 && a("List:single-several-selected", `List: a single-selection list (selectionMode "single") received ${$} selected items. Pass one value with \`selectedItem\`, or use selectionMode="multiple".`);
171
+ }, [
172
+ n,
173
+ A,
174
+ $
175
+ ]);
176
+ let ee = b.useMemo(() => ({
177
+ mode: V,
178
+ selectedValues: z,
179
+ toggleItem: Z,
180
+ getTabIndex: W,
181
+ registry: F
182
+ }), [
183
+ V,
184
+ z,
185
+ Z,
186
+ W,
187
+ F
188
+ ]), te = V === "grid" ? "div" : "ul", ne = V === "grid" ? "grid" : V === "listbox" ? "listbox" : "list";
189
+ return /* @__PURE__ */ x(C.Provider, {
190
+ value: ee,
191
+ children: /* @__PURE__ */ x(te, {
192
+ role: ne,
193
+ "aria-multiselectable": n && A ? !0 : void 0,
194
+ className: e("m-0 list-none p-0", m),
195
+ ...E,
196
+ ref: X,
197
+ "data-roving-container": n ? "" : void 0,
198
+ onKeyDown: n ? c(S, K) : S,
199
+ onKeyDownCapture: n ? c(w, q) : w,
200
+ onFocus: n ? c(T, J, { checkDefaultPrevented: !1 }) : T,
201
+ children: h
202
+ })
203
+ });
204
+ };
205
+ V.displayName = "List";
206
+ var H = ({ value: t, action: n, className: r, children: i, onClick: a, onKeyDown: u, ref: m, ...h }) => {
207
+ let { mode: g, selectedValues: y, toggleItem: C, getTabIndex: w, registry: T } = E("ListItem"), D = d("list-item"), O = t || void 0, k = O ?? D, A = s(n), [N] = b.useState(() => ({})), P = b.useRef(null), R = _(m, P);
208
+ b.useLayoutEffect(() => {
209
+ T.set(N, {
210
+ value: O,
211
+ hasAction: A,
212
+ element: P
213
+ });
214
+ }, [
215
+ T,
216
+ N,
217
+ O,
218
+ A
219
+ ]), b.useLayoutEffect(() => () => T.delete(N), [T, N]);
220
+ let V = l((e) => {
221
+ let t = e.parentElement;
222
+ T.recordFocusLoss({
223
+ value: O,
224
+ index: t ? L(t) : -1
225
+ });
226
+ });
227
+ b.useLayoutEffect(() => {
228
+ let e = P.current;
229
+ return () => {
230
+ if (!e) return;
231
+ let t = e.ownerDocument.activeElement;
232
+ t && e.contains(t) && T.recordFocusLoss({
233
+ value: O,
234
+ index: L(e)
235
+ });
236
+ };
237
+ }, [T, O]);
238
+ let H = O !== void 0 && y.has(O), U = g !== "list", W = () => {
239
+ O !== void 0 && C(O);
240
+ }, G = (e) => {
241
+ j(e) || W();
242
+ }, q = (e) => {
243
+ j(e) || M(e) && (e.preventDefault(), W());
244
+ }, J = (e) => {
245
+ let t = e.currentTarget, n = e.target, r = z(t);
246
+ if (!r || !r.contains(n)) {
247
+ if (n !== t) return;
248
+ if (M(e)) {
249
+ e.preventDefault(), W();
250
+ return;
251
+ }
252
+ let i = f(e.key, {
253
+ orientation: "horizontal",
254
+ dir: p(t)
255
+ }) === "next" && r ? B(r)[0] : void 0;
256
+ i && (e.preventDefault(), i.focus());
257
+ return;
258
+ }
259
+ if (n !== r && F(n)) {
260
+ e.key === "Escape" && (e.preventDefault(), r.focus());
261
+ return;
262
+ }
263
+ if (n === r && (e.key === "Enter" || e.key === "F2")) {
264
+ let t = I(r).find((e) => F(e));
265
+ t && (e.preventDefault(), t.focus());
266
+ return;
267
+ }
268
+ let i = f(e.key, {
269
+ orientation: "horizontal",
270
+ dir: p(t)
271
+ });
272
+ if (!i) return;
273
+ e.preventDefault();
274
+ let a = B(r), o = a.indexOf(n);
275
+ i === "next" ? a[o + 1]?.focus() : o > 0 ? a[o - 1].focus() : t.focus();
276
+ }, Y = g === "grid" ? "div" : "li", X = g === "grid" ? "div" : "span", Z = g === "grid" ? "row" : g === "listbox" ? "option" : "listitem", Q = U ? {
277
+ "aria-selected": H,
278
+ tabIndex: w(k),
279
+ "data-roving-value": k,
280
+ "data-selected": H ? "" : void 0,
281
+ onClick: c(a, G),
282
+ onKeyDown: c(u, g === "grid" ? J : q)
283
+ } : {
284
+ onClick: a,
285
+ onKeyDown: u
286
+ };
287
+ return /* @__PURE__ */ S(Y, {
288
+ role: Z,
289
+ className: e("flex items-center border-b border-border px-4 py-2 text-body-1", U && ["relative cursor-pointer", "focus-visible:outline-2 focus-visible:-outline-offset-2 focus-visible:outline-ring"], U && (H ? ["bg-subtle-selected before:absolute before:inset-y-2 before:start-0 before:w-0.5 before:rounded-full before:bg-primary", v.selectedContainer] : "hover:bg-subtle-hover"), r),
290
+ ...h,
291
+ ref: R,
292
+ ...Q,
293
+ children: [/* @__PURE__ */ x(X, {
294
+ role: g === "grid" ? "gridcell" : void 0,
295
+ className: "min-w-0 flex-1",
296
+ children: i
297
+ }), A && /* @__PURE__ */ x(K, {
298
+ grid: g === "grid",
299
+ onRemovedWithFocus: V,
300
+ children: o(n)
301
+ })]
302
+ });
303
+ };
304
+ H.displayName = "ListItem";
305
+ var U = ["[data-roving-container]", ...[
306
+ "toolbar",
307
+ "radiogroup",
308
+ "listbox",
309
+ "grid",
310
+ "treegrid",
311
+ "tablist",
312
+ "menu",
313
+ "menubar",
314
+ "tree"
315
+ ].map((e) => `[role="${e}"]`)].join(", "), W = [
316
+ "tabindex",
317
+ "href",
318
+ "contenteditable",
319
+ "controls"
320
+ ];
321
+ function G(e) {
322
+ let t = /* @__PURE__ */ new Map(), n = /* @__PURE__ */ new WeakSet(), r = () => {
323
+ for (let n of t.keys()) e.contains(n) || t.delete(n);
324
+ for (let r of e.querySelectorAll(m)) {
325
+ let i = r.getAttribute("tabindex");
326
+ if (i === "-1" || n.has(r)) continue;
327
+ let a = r.closest(U);
328
+ a && e.contains(a) || (t.set(r, i), r.setAttribute("tabindex", "-1"));
329
+ }
330
+ };
331
+ if (r(), typeof MutationObserver > "u") return () => {};
332
+ let i = new MutationObserver((e) => {
333
+ let a = /* @__PURE__ */ new Set();
334
+ for (let n of e) {
335
+ let e = n.target;
336
+ n.attributeName === "tabindex" && t.has(e) && a.add(e);
337
+ }
338
+ for (let e of a) {
339
+ let r = e.getAttribute("tabindex");
340
+ r !== "-1" && r === t.get(e) ? (t.delete(e), n.add(e)) : t.set(e, r);
341
+ }
342
+ r(), i.takeRecords();
343
+ });
344
+ return i.observe(e, {
345
+ subtree: !0,
346
+ childList: !0,
347
+ attributes: !0,
348
+ attributeFilter: W
349
+ }), () => {
350
+ i.disconnect();
351
+ for (let [e, n] of t) n === null ? e.removeAttribute("tabindex") : e.setAttribute("tabindex", n);
352
+ t.clear();
353
+ };
354
+ }
355
+ function K({ grid: t, onRemovedWithFocus: n, children: r }) {
356
+ let i = b.useRef(null);
357
+ return b.useLayoutEffect(() => {
358
+ let e = i.current;
359
+ return () => {
360
+ if (!e) return;
361
+ let t = e.ownerDocument.activeElement;
362
+ t && e.contains(t) && n(e);
363
+ };
364
+ }, [n, t]), b.useLayoutEffect(() => {
365
+ let e = i.current;
366
+ return t && e ? G(e) : void 0;
367
+ }, [t]), /* @__PURE__ */ x(t ? "div" : "span", {
368
+ ref: i,
369
+ role: t ? "gridcell" : void 0,
370
+ tabIndex: t ? -1 : void 0,
371
+ "data-list-action": "",
372
+ className: e("ms-2 shrink-0", t && "focus-visible:outline-2 focus-visible:-outline-offset-2 focus-visible:outline-ring"),
373
+ children: r
374
+ });
375
+ }
376
+ K.displayName = "ListActionCell";
377
+ var q = /* @__PURE__ */ Object.assign(V, { Item: H });
378
+ //#endregion
379
+ export { q as List, H as ListItem };
380
+
381
+ //# sourceMappingURL=List.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"List.mjs","names":["useId","useId$1","React","ListContext","inertContext","getInertContext","ListRegistry","useListContext","reportMissingContext","componentName","EMPTY","warnDuplicateValue","value","childrenHaveAction","flattenChildren","children","isElementOfType","node","ListItem","slotRendersContent","INTERACTIVE_SELECTOR","FOCUSABLE_SELECTOR","isForeignEvent","item","event","target","isActivationKey","TEXT_ENTRY_ROLES","NON_TEXT_INPUT_TYPES","isTextEntry","role","el","tag","getFocusables","cell","isFocusable","getItemIndex","index","getFocusRestoreTarget","byValue","atIndex","last","root","loss","getActionCell","child","getActionStops","stops","stop","ListRoot","rest","props","selectionMode","warnDeprecated","multiple","controlledSelection","selectedItem","selectedItems","defaultSelection","defaultSelectedItem","defaultSelectedItems","selected","setSelected","useControllable","selection","next","onSelectionChange","onSelectedItemChange","registry","selectable","registered","effective","selectedValues","hasActions","mode","tabStopValue","useRovingTabIndex","rovingRef","rovingKeyDown","rovingKeyDownCapture","rovingFocus","containerProps","rootElementRef","rootRef","useMergedRefs","ref","doc","active","toggleItem","current","previous","isSelected","duplicates","selectedCount","warnOnce","contextValue","getTabIndex","Root","cn","className","composeEventHandlers","onKeyDown","onKeyDownCapture","onFocus","autoValue","selectableValue","rovingValue","hasAction","action","token","itemRef","itemRefs","recordActionFocusLoss","useEventCallback","activate","handleClick","handleOptionKeyDown","handleRowKeyDown","rowElement","first","getArrowIntent","getDirection","entry","intent","Element","ContentCell","interactiveProps","onClick","forcedColors","ListActionCell","materialiseSlotContent","COMPOSITE_SELECTOR","STAMP_OBSERVED_ATTRIBUTES","stampActionCell","stamped","yielded","stamp","tabIndex","composite","observer","changed","record","records","original","cellRef","onRemovedWithFocus","grid","List"],"sources":["../../../src/components/data-display/List.tsx"],"sourcesContent":["import * as React from 'react';\nimport { cn } from '../../lib/cn';\nimport { flattenChildren, isElementOfType } from '../../lib/children';\nimport { composeEventHandlers } from '../../lib/composeEventHandlers';\nimport { reportMissingContext, warnDeprecated, warnOnce } from '../../lib/dev';\nimport { getArrowIntent, getDirection } from '../../lib/direction';\nimport { FOCUSABLE_SELECTOR, isFocusable } from '../../lib/focus';\nimport { materialiseSlotContent, slotRendersContent } from '../../lib/slot';\nimport { focusRingInset, forcedColors } from '../../lib/styles';\nimport type { SelectionMode } from '../../lib/types';\nimport { useControllable } from '../../hooks/useControllable';\nimport { useEventCallback } from '../../hooks/useEventCallback';\nimport { useId } from '../../hooks/useId';\nimport { useMergedRefs } from '../../hooks/useMergedRefs';\nimport { useRovingTabIndex } from '../../hooks/useRovingTabIndex';\nimport { ListRegistry, type ListFocusLoss } from './List.registry';\n\n/** Selection modes of {@link List}: the shared `SelectionMode` plus the deprecated `'multi'`. */\nexport type ListSelectionMode = SelectionMode | 'multi';\n\n/**\n * Properties for the List component.\n *\n * The type parameter `M` is the `selectionMode` literal. It makes the single-selection props\n * (`selectedItem`, `defaultSelectedItem`, `onSelectedItemChange`) type errors when\n * `selectionMode=\"multiple\"` is passed; `ListProps` without a type argument accepts every mode\n * (the 0.4 shape, extendable by interfaces).\n */\nexport interface ListProps<\n M extends ListSelectionMode = ListSelectionMode,\n> extends React.HTMLAttributes<HTMLUListElement> {\n /** Whether list items can be selected.\n * @default false\n */\n selectable?: boolean;\n /**\n * Selection behavior when `selectable` is true. `'multi'` is a deprecated alias of `'multiple'`.\n * @default 'single'\n */\n selectionMode?: M;\n /**\n * Controlled array of selected item values (both modes). In single mode prefer `selectedItem`;\n * a single-selection list that receives several values warns in development.\n */\n selectedItems?: readonly string[];\n /** Default selected items for uncontrolled usage.\n * @default []\n */\n defaultSelectedItems?: readonly string[];\n /** Called with the next array of selected values when the selection changes (both modes). */\n onSelectionChange?: (selected: string[]) => void;\n /** Single mode: the controlled selected value (`null`: nothing selected). */\n selectedItem?: M extends 'single' ? string | null : never;\n /** Single mode: the initially selected value for uncontrolled usage. */\n defaultSelectedItem?: M extends 'single' ? string | null : never;\n /** Single mode: called with the newly selected value, or `null` when it was deselected. */\n onSelectedItemChange?: M extends 'single' ? (item: string | null) => void : never;\n /**\n * Ref to the root element: a `<ul>`, or a `<div role=\"grid\">` for a selectable list whose items\n * have actions.\n */\n ref?: React.Ref<HTMLUListElement | HTMLDivElement>;\n}\n\n/** Properties for the ListItem component. */\nexport interface ListItemProps extends React.HTMLAttributes<HTMLLIElement> {\n /**\n * Unique value identifying this item for selection tracking. An item without a value cannot be\n * selected (its `onClick` still runs). Items of a selectable list that share a value are\n * selected together (a development warning names the value).\n */\n value?: string;\n /**\n * Action element rendered at the end of the list item (e.g. a Delete button). Clicks and keys\n * that start inside it, or inside a popup it opens, never toggle the item's selection. An\n * action that renders nothing (`[]`, `null`, `false`, `''`, `<></>`) is no action. In a\n * selectable list, items with actions switch the list to grid semantics: the actions are reached\n * with the arrow keys, and their focusable elements (also ones added later) get\n * `tabindex=\"-1\"`, except inside a nested composite widget such as a Toolbar, which keeps its own\n * Tab stop. When the first action appears or the last one disappears, the items remount (see\n * {@link List}).\n */\n action?: React.ReactNode;\n /** Ref to the item element: an `<li>`, or a `<div role=\"row\">` in grid mode. */\n ref?: React.Ref<HTMLLIElement | HTMLDivElement>;\n}\n\n/* ------------------------------------------------------------------ */\n/* Context */\n/* ------------------------------------------------------------------ */\n\n/** `list`: plain list; `listbox`: selectable; `grid`: selectable with item actions. */\ntype ListMode = 'list' | 'listbox' | 'grid';\n\ninterface ListContextValue {\n mode: ListMode;\n selectedValues: ReadonlySet<string>;\n toggleItem: (value: string) => void;\n getTabIndex: (value: string) => 0 | -1;\n registry: ListRegistry;\n}\n\nconst ListContext = React.createContext<ListContextValue | null>(null);\nListContext.displayName = 'ListContext';\n\nlet inertContext: ListContextValue | null = null;\n\nfunction getInertContext(): ListContextValue {\n inertContext ??= {\n mode: 'list',\n selectedValues: new Set<string>(),\n toggleItem: () => {},\n getTabIndex: () => -1,\n registry: new ListRegistry(),\n };\n return inertContext;\n}\n\nfunction useListContext(componentName: string): ListContextValue {\n const context = React.useContext(ListContext);\n if (context) return context;\n reportMissingContext(componentName, 'a List');\n return getInertContext();\n}\n\n/* ------------------------------------------------------------------ */\n/* Helpers */\n/* ------------------------------------------------------------------ */\n\nconst EMPTY: readonly string[] = [];\n\n/** Items that share a value are selected together and share their roving value. */\nfunction warnDuplicateValue(value: string): void {\n warnOnce(\n `List:duplicate:${value}`,\n `List: several items share the value \"${value}\". Item values must be unique within a ` +\n 'List; items with the same value are selected (and tab stops) together.',\n );\n}\n\n/**\n * Static look-ahead for the server and the first render: a direct `List.Item` (Fragments\n * flattened, also an item written in a Server Component) whose action renders content.\n */\nfunction childrenHaveAction(children: React.ReactNode): boolean {\n return flattenChildren(children).some(\n ({ node }) =>\n isElementOfType<ListItemProps>(node, ListItem) && slotRendersContent(node.props.action),\n );\n}\n\n/** Elements whose events belong to themselves, not to the item that contains them. */\nconst INTERACTIVE_SELECTOR = [\n FOCUSABLE_SELECTOR,\n '[data-list-action]',\n 'label',\n '[role=\"button\"]',\n '[role=\"link\"]',\n '[role=\"checkbox\"]',\n '[role=\"switch\"]',\n '[role=\"radio\"]',\n '[role=\"menuitem\"]',\n '[role=\"textbox\"]',\n '[role=\"combobox\"]',\n '[role=\"slider\"]',\n '[role=\"spinbutton\"]',\n].join(', ');\n\n/**\n * Whether an item must leave `event` alone (no selection toggle): it started inside the action\n * container or a nested interactive element, or outside the item's DOM. React bubbles the events\n * of a popup portaled from an action (a Popover, Menu or Dialog) through the item's handlers\n * although their target lives elsewhere in the document; those never toggle the item (as in\n * Card).\n */\nfunction isForeignEvent(event: React.SyntheticEvent<HTMLElement>): boolean {\n const item = event.currentTarget;\n const target = event.target as Partial<Node> | null;\n if (!target || typeof target.nodeType !== 'number' || !item.contains(target as Node)) {\n return true;\n }\n let node: Element | null =\n target.nodeType === Node.ELEMENT_NODE ? (target as Element) : (target.parentElement ?? null);\n for (; node && node !== item; node = node.parentElement) {\n if (node.matches(INTERACTIVE_SELECTOR)) return true;\n }\n return false;\n}\n\n/**\n * Enter or Space without Ctrl, Alt or Meta: the keys that toggle an item. With a modifier (Ctrl+Alt\n * with Space included) the key is a shortcut, left to the page.\n */\nfunction isActivationKey(event: React.KeyboardEvent): boolean {\n if (event.ctrlKey || event.altKey || event.metaKey) return false;\n return event.key === 'Enter' || event.key === ' ';\n}\n\nconst TEXT_ENTRY_ROLES: ReadonlySet<string> = new Set([\n 'textbox',\n 'searchbox',\n 'combobox',\n 'spinbutton',\n 'slider',\n]);\n\nconst NON_TEXT_INPUT_TYPES: ReadonlySet<string> = new Set([\n 'button',\n 'checkbox',\n 'color',\n 'file',\n 'hidden',\n 'image',\n 'radio',\n 'reset',\n 'submit',\n]);\n\n/** Text-entry widgets keep the arrow keys (caret movement) and are entered with Enter/F2. */\nfunction isTextEntry(el: Element): boolean {\n const role = el.getAttribute('role');\n if (role !== null && TEXT_ENTRY_ROLES.has(role)) return true;\n const tag = el.localName;\n if (tag === 'textarea' || tag === 'select') return true;\n if (tag === 'input') return !NON_TEXT_INPUT_TYPES.has((el as HTMLInputElement).type);\n return el.matches('[contenteditable]:not([contenteditable=\"false\"])');\n}\n\nfunction getFocusables(cell: HTMLElement): HTMLElement[] {\n return Array.from(cell.querySelectorAll<HTMLElement>(FOCUSABLE_SELECTOR)).filter((el) =>\n isFocusable(el),\n );\n}\n\n/*\n * The helpers below walk element children with `firstElementChild`/`nextElementSibling`, never\n * through a `children` collection: jsdom before 30.1 does not cache indexed `HTMLCollection`\n * access, so `Array.from(root.children)` or an indexed loop over a large list is O(n²) in the test\n * suites of consumers on those versions (table-core#22).\n */\n\n/** Position of an item element among its list's items (the root's element children). */\nfunction getItemIndex(item: HTMLElement): number {\n if (!item.parentElement) return -1;\n let index = 0;\n for (let el = item.previousElementSibling; el; el = el.previousElementSibling) index++;\n return index;\n}\n\n/**\n * Where focus goes after the items remounted: the item with the same explicit value, else the item\n * now at the same position (the next one when the focused item itself was removed), else the last.\n * An item that cannot take focus itself (a plain list item) passes it to its first focusable\n * descendant.\n */\nfunction getFocusRestoreTarget(root: HTMLElement, loss: ListFocusLoss): HTMLElement | null {\n let byValue: Element | null = null;\n let atIndex: Element | null = null;\n let last: Element | null = null;\n let index = 0;\n for (let el = root.firstElementChild; el; el = el.nextElementSibling, index++) {\n if (loss.value !== undefined && el.getAttribute('data-roving-value') === loss.value) {\n byValue = el;\n break;\n }\n if (index === loss.index) atIndex = el;\n last = el;\n }\n const item = (byValue ?? atIndex ?? (loss.index >= 0 ? last : null)) as HTMLElement | null;\n if (!item) return null;\n return item.hasAttribute('tabindex') ? item : (getFocusables(item)[0] ?? null);\n}\n\n/** The action cell of an item element (its direct `[data-list-action]` child), read at event time. */\nfunction getActionCell(item: HTMLElement): HTMLElement | null {\n for (let child = item.firstElementChild; child; child = child.nextElementSibling) {\n if (child.hasAttribute('data-list-action')) return child as HTMLElement;\n }\n return null;\n}\n\n/**\n * The arrow-key stops inside an action cell, in DOM order. A text-entry widget is represented by\n * the cell itself (the cell takes focus; Enter/F2 enter the widget, Escape returns to the cell).\n */\nfunction getActionStops(cell: HTMLElement): HTMLElement[] {\n const stops: HTMLElement[] = [];\n for (const el of getFocusables(cell)) {\n const stop = isTextEntry(el) ? cell : el;\n if (!stops.includes(stop)) stops.push(stop);\n }\n return stops;\n}\n\n/* ------------------------------------------------------------------ */\n/* List */\n/* ------------------------------------------------------------------ */\n\n// The List root, documented on the exported `List` const.\nconst ListRoot = <M extends ListSelectionMode = 'single'>(props: ListProps<M>): React.ReactNode => {\n const {\n selectable = false,\n selectionMode,\n selectedItems,\n defaultSelectedItems,\n onSelectionChange,\n selectedItem,\n defaultSelectedItem,\n onSelectedItemChange,\n className,\n children,\n ref,\n onKeyDown,\n onKeyDownCapture,\n onFocus,\n ...rest\n } = props as ListProps;\n\n if (selectionMode === 'multi') {\n warnDeprecated('List', 'selectionMode=\"multi\"', 'selectionMode=\"multiple\"');\n }\n const multiple = selectionMode === 'multiple' || selectionMode === 'multi';\n\n const controlledSelection = React.useMemo<readonly string[] | undefined>(() => {\n if (!multiple && selectedItem !== undefined) {\n return selectedItem === null ? EMPTY : [selectedItem];\n }\n return selectedItems;\n }, [multiple, selectedItem, selectedItems]);\n const defaultSelection = React.useMemo<readonly string[]>(() => {\n if (!multiple && defaultSelectedItem !== undefined && defaultSelectedItem !== null) {\n return [defaultSelectedItem];\n }\n return defaultSelectedItems ?? EMPTY;\n }, [multiple, defaultSelectedItem, defaultSelectedItems]);\n\n const [selected, setSelected] = useControllable<readonly string[]>(\n controlledSelection,\n defaultSelection,\n (next) => {\n // The callbacks receive their own mutable copy (the props accept readonly arrays).\n const selection = [...next];\n onSelectionChange?.(selection);\n if (!multiple) onSelectedItemChange?.(selection[0] ?? null);\n },\n );\n\n const [registry] = React.useState(() => new ListRegistry());\n React.useLayoutEffect(() => {\n registry.setActive(selectable);\n }, [registry, selectable]);\n const registered = React.useSyncExternalStore(\n registry.subscribe,\n registry.getSnapshot,\n registry.getServerSnapshot,\n );\n\n // Effective selection: selected ∩ registered item values, derived during render (table-core#22).\n const effective = React.useMemo(\n () => (registered ? selected.filter((value) => registered.valueSet.has(value)) : selected),\n [registered, selected],\n );\n const selectedValues = React.useMemo<ReadonlySet<string>>(() => new Set(effective), [effective]);\n\n const hasActions =\n selectable && (registered ? registered.hasActions : childrenHaveAction(children));\n const mode: ListMode = !selectable ? 'list' : hasActions ? 'grid' : 'listbox';\n\n // The first selected item in DOM order (the registry keeps its values in DOM order).\n const tabStopValue = registered\n ? (registered.values.find((value) => selectedValues.has(value)) ?? null)\n : (effective[0] ?? null);\n\n const { containerProps, getTabIndex } = useRovingTabIndex({\n activeValue: tabStopValue,\n orientation: 'vertical',\n typeahead: (registered?.count ?? 0) > 7,\n tabStop: 'active',\n // The items are the root's children. A composite in an item action (a Toolbar, a radio group)\n // is part of its row, not an item: arrows and typeahead never move into it.\n itemSelector: ':scope > [data-roving-value]',\n });\n const {\n ref: rovingRef,\n onKeyDown: rovingKeyDown,\n onKeyDownCapture: rovingKeyDownCapture,\n onFocus: rovingFocus,\n } = containerProps;\n const rootElementRef = React.useRef<HTMLUListElement | HTMLDivElement | null>(null);\n const rootRef = useMergedRefs<HTMLUListElement | HTMLDivElement>(\n ref,\n selectable ? rovingRef : null,\n rootElementRef,\n );\n\n // Switching between list and grid semantics changes the root and item elements (`ul`/`li` ↔\n // `div`), so React remounts the items and the focused one is removed. Items record, while they\n // are still in the document, that they held focus (see ListItem); after the new items mounted,\n // focus moves to the same item (C-DISABLED: focus is never dropped to <body>).\n React.useLayoutEffect(() => {\n const loss = registry.takeFocusLoss();\n const root = rootElementRef.current;\n if (!loss || !root) return;\n const doc = root.ownerDocument;\n const active = doc.activeElement;\n // Focus placed elsewhere in this commit (an autoFocus, a restore-focus hook) wins.\n if (active && active !== doc.body && active.isConnected) return;\n getFocusRestoreTarget(root, loss)?.focus();\n }, [mode, registry]);\n\n // After every commit (the items' layout effects ran first): keep the registered values in DOM\n // order, so `tabStopValue` is the first selected item in the DOM even after items were inserted\n // between others or reordered by key (table-core#22). O(n); re-renders only when the order changed.\n React.useLayoutEffect(() => {\n registry.syncOrder(rootElementRef.current);\n });\n\n const toggleItem = React.useCallback(\n (value: string) => {\n setSelected((previous) => {\n // From the effective selection, so values of removed items are never reported again.\n const current = registry.prune(previous);\n const isSelected = current.includes(value);\n if (multiple) {\n return isSelected ? current.filter((item) => item !== value) : [...current, value];\n }\n return isSelected ? [] : [value];\n });\n },\n [multiple, registry, setSelected],\n );\n\n // Registered values of a selectable list that more than one item holds (development warning).\n const duplicates = registered?.duplicates ?? EMPTY;\n React.useEffect(() => {\n for (const value of duplicates) warnDuplicateValue(value);\n }, [duplicates]);\n\n const selectedCount = effective.length;\n React.useEffect(() => {\n if (selectable && !multiple && selectedCount > 1) {\n warnOnce(\n 'List:single-several-selected',\n `List: a single-selection list (selectionMode \"single\") received ${selectedCount} selected items. Pass one value with \\`selectedItem\\`, or use selectionMode=\"multiple\".`,\n );\n }\n }, [selectable, multiple, selectedCount]);\n\n const contextValue = React.useMemo<ListContextValue>(\n () => ({ mode, selectedValues, toggleItem, getTabIndex, registry }),\n [mode, selectedValues, toggleItem, getTabIndex, registry],\n );\n\n const Root = (mode === 'grid' ? 'div' : 'ul') as React.ElementType;\n const role = mode === 'grid' ? 'grid' : mode === 'listbox' ? 'listbox' : 'list';\n\n return (\n <ListContext.Provider value={contextValue}>\n <Root\n role={role}\n aria-multiselectable={selectable && multiple ? true : undefined}\n className={cn('m-0 list-none p-0', className)}\n {...rest}\n ref={rootRef}\n data-roving-container={selectable ? '' : undefined}\n onKeyDown={selectable ? composeEventHandlers(onKeyDown, rovingKeyDown) : onKeyDown}\n onKeyDownCapture={\n selectable\n ? composeEventHandlers(onKeyDownCapture, rovingKeyDownCapture)\n : onKeyDownCapture\n }\n onFocus={\n selectable\n ? composeEventHandlers(onFocus, rovingFocus, { checkDefaultPrevented: false })\n : onFocus\n }\n >\n {children}\n </Root>\n </ListContext.Provider>\n );\n};\nListRoot.displayName = 'List';\n\n/* ------------------------------------------------------------------ */\n/* ListItem */\n/* ------------------------------------------------------------------ */\n\n/**\n * An item of a {@link List} (also available as `List.Item`). Renders an `<li>` (`listitem`, or\n * `option` in a selectable list), or a `<div role=\"row\">` in a selectable list with actions. In a\n * selectable list, Enter and Space toggle the selection without calling `onClick`, which receives\n * pointer clicks.\n *\n * Exported under the flat name `ListItem` so React Server Components can import it; `List.Item`\n * (dotted access) needs a client module.\n */\nexport const ListItem = ({\n value,\n action,\n className,\n children,\n onClick,\n onKeyDown,\n ref,\n ...rest\n}: ListItemProps) => {\n const { mode, selectedValues, toggleItem, getTabIndex, registry } = useListContext('ListItem');\n const autoValue = useId('list-item');\n const selectableValue = value ? value : undefined;\n const rovingValue = selectableValue ?? autoValue;\n // An action that renders nothing (`[]`, `null`, booleans, `''`) is no action.\n const hasAction = slotRendersContent(action);\n const [token] = React.useState(() => ({}));\n const itemRef = React.useRef<HTMLLIElement | HTMLDivElement | null>(null);\n const itemRefs = useMergedRefs<HTMLLIElement | HTMLDivElement>(ref, itemRef);\n\n // The record is updated in place when the value or the action changes and removed only on\n // unmount, so the item keeps its place in the registry (table-core#22).\n React.useLayoutEffect(() => {\n registry.set(token, { value: selectableValue, hasAction, element: itemRef });\n }, [registry, token, selectableValue, hasAction]);\n React.useLayoutEffect(() => () => registry.delete(token), [registry, token]);\n\n // Focus inside the action when it disappears: if that switches the list from grid to listbox, the\n // List moves focus to this item in the next commit (see ListActionCell and ListRoot).\n const recordActionFocusLoss = useEventCallback((cell: HTMLElement) => {\n const item = cell.parentElement;\n registry.recordFocusLoss({ value: selectableValue, index: item ? getItemIndex(item) : -1 });\n });\n\n // Unmount: a layout-effect cleanup runs while the element is still in the document, so it can\n // tell whether it held focus. The List moves focus to the same item when its items remount\n // (list ↔ grid semantics); see ListRoot.\n React.useLayoutEffect(() => {\n const node = itemRef.current;\n return () => {\n if (!node) return;\n const active = node.ownerDocument.activeElement;\n if (active && node.contains(active)) {\n registry.recordFocusLoss({ value: selectableValue, index: getItemIndex(node) });\n }\n };\n }, [registry, selectableValue]);\n\n const isSelected = selectableValue !== undefined && selectedValues.has(selectableValue);\n const selectable = mode !== 'list';\n\n const activate = () => {\n if (selectableValue !== undefined) toggleItem(selectableValue);\n };\n\n const handleClick = (event: React.MouseEvent<HTMLElement>) => {\n if (isForeignEvent(event)) return;\n activate();\n };\n\n const handleOptionKeyDown = (event: React.KeyboardEvent<HTMLElement>) => {\n if (isForeignEvent(event)) return;\n if (isActivationKey(event)) {\n event.preventDefault();\n activate();\n }\n };\n\n const handleRowKeyDown = (event: React.KeyboardEvent<HTMLElement>) => {\n const rowElement = event.currentTarget;\n const target = event.target as HTMLElement;\n const cell = getActionCell(rowElement);\n\n if (!cell || !cell.contains(target)) {\n if (target !== rowElement) return;\n if (isActivationKey(event)) {\n event.preventDefault();\n activate();\n return;\n }\n const intent = getArrowIntent(event.key, {\n orientation: 'horizontal',\n dir: getDirection(rowElement),\n });\n const first = intent === 'next' && cell ? getActionStops(cell)[0] : undefined;\n if (first) {\n event.preventDefault();\n first.focus();\n }\n return;\n }\n\n // Inside the action cell.\n if (target !== cell && isTextEntry(target)) {\n // The widget keeps its keys (caret movement, typing); Escape returns to the cell.\n if (event.key === 'Escape') {\n event.preventDefault();\n cell.focus();\n }\n return;\n }\n if (target === cell && (event.key === 'Enter' || event.key === 'F2')) {\n const entry = getFocusables(cell).find((el) => isTextEntry(el));\n if (entry) {\n event.preventDefault();\n entry.focus();\n }\n return;\n }\n const intent = getArrowIntent(event.key, {\n orientation: 'horizontal',\n dir: getDirection(rowElement),\n });\n if (!intent) return;\n event.preventDefault();\n const stops = getActionStops(cell);\n const index = stops.indexOf(target);\n if (intent === 'next') {\n stops[index + 1]?.focus();\n } else if (index > 0) {\n stops[index - 1].focus();\n } else {\n rowElement.focus();\n }\n };\n\n const Element = (mode === 'grid' ? 'div' : 'li') as React.ElementType;\n const ContentCell = (mode === 'grid' ? 'div' : 'span') as React.ElementType;\n const role = mode === 'grid' ? 'row' : mode === 'listbox' ? 'option' : 'listitem';\n\n const interactiveProps: Record<string, unknown> = selectable\n ? {\n 'aria-selected': isSelected,\n tabIndex: getTabIndex(rovingValue),\n 'data-roving-value': rovingValue,\n 'data-selected': isSelected ? '' : undefined,\n onClick: composeEventHandlers(onClick, handleClick),\n onKeyDown: composeEventHandlers(\n onKeyDown,\n mode === 'grid' ? handleRowKeyDown : handleOptionKeyDown,\n ),\n }\n : { onClick, onKeyDown };\n\n return (\n <Element\n role={role}\n className={cn(\n 'flex items-center border-b border-border px-4 py-2 text-body-1',\n selectable && ['relative cursor-pointer', focusRingInset],\n selectable &&\n (isSelected\n ? [\n 'bg-subtle-selected before:absolute before:inset-y-2 before:start-0 before:w-0.5 before:rounded-full before:bg-primary',\n forcedColors.selectedContainer,\n ]\n : 'hover:bg-subtle-hover'),\n className,\n )}\n {...rest}\n ref={itemRefs}\n {...interactiveProps}\n >\n <ContentCell role={mode === 'grid' ? 'gridcell' : undefined} className=\"min-w-0 flex-1\">\n {children}\n </ContentCell>\n {hasAction && (\n <ListActionCell grid={mode === 'grid'} onRemovedWithFocus={recordActionFocusLoss}>\n {/* A generator was read once by the check above: render its items. */}\n {materialiseSlotContent(action)}\n </ListActionCell>\n )}\n </Element>\n );\n};\nListItem.displayName = 'ListItem';\n\n/**\n * Nested composite widgets (a Toolbar, a RadioGroup, …) manage their own tab indexes, so the action\n * cell never writes `tabindex` on or inside one (the same rule as the DataGrid's cell widgets).\n */\nconst COMPOSITE_SELECTOR = [\n '[data-roving-container]',\n ...[\n 'toolbar',\n 'radiogroup',\n 'listbox',\n 'grid',\n 'treegrid',\n 'tablist',\n 'menu',\n 'menubar',\n 'tree',\n ].map((role) => `[role=\"${role}\"]`),\n].join(', ');\n\n/** Attributes that can put an element of an action cell (back) into the Tab order. */\nconst STAMP_OBSERVED_ATTRIBUTES = ['tabindex', 'href', 'contenteditable', 'controls'];\n\n/**\n * Grid mode: takes the focusable elements of an action cell out of the Tab order (the row is the\n * only Tab stop; the actions are reached with the arrow keys) and keeps them out while the cell is\n * mounted. Returns the cleanup that disconnects the observer and restores the original values.\n *\n * It runs once per cell, not on every render of every item (an inline `action` has a new identity\n * on every parent render): a `MutationObserver` re-stamps when elements are added to the cell or an\n * element's `tabindex` is changed by someone else, including by an action component's own state.\n * Every candidate of `FOCUSABLE_SELECTOR` is stamped, disabled or hidden ones too, so an element\n * that is enabled or shown later is already out of the Tab order and no computed style is read.\n * Removed elements are dropped from the record on each pass. Nested composites are skipped (see\n * `COMPOSITE_SELECTOR`), and an element whose replaced `tabindex` something else re-applies (a\n * script that manages it) is left alone from then on, so the two never overwrite each other in an\n * endless loop of observer callbacks.\n */\nfunction stampActionCell(cell: HTMLElement): () => void {\n /** Stamped elements with the `tabindex` they had before (`null`: none). */\n const stamped = new Map<HTMLElement, string | null>();\n /** Elements whose `tabindex` something else keeps re-applying: they are left to it. */\n const yielded = new WeakSet<HTMLElement>();\n const stamp = () => {\n for (const el of stamped.keys()) {\n if (!cell.contains(el)) stamped.delete(el);\n }\n for (const el of cell.querySelectorAll<HTMLElement>(FOCUSABLE_SELECTOR)) {\n const tabIndex = el.getAttribute('tabindex');\n if (tabIndex === '-1' || yielded.has(el)) continue;\n const composite = el.closest(COMPOSITE_SELECTOR);\n if (composite && cell.contains(composite)) continue;\n stamped.set(el, tabIndex);\n el.setAttribute('tabindex', '-1');\n }\n };\n stamp();\n if (typeof MutationObserver === 'undefined') return () => {};\n\n const observer = new MutationObserver((records) => {\n // The records of this cell's own writes are taken below, so these values were set by someone\n // else: a changed prop (the new value to restore), or a script that manages the element's\n // tabindex and re-applied the value this cell replaced. Yielding to the latter keeps the two\n // from overwriting each other forever.\n const changed = new Set<HTMLElement>();\n for (const record of records) {\n const target = record.target as HTMLElement;\n if (record.attributeName === 'tabindex' && stamped.has(target)) changed.add(target);\n }\n for (const el of changed) {\n const value = el.getAttribute('tabindex');\n if (value !== '-1' && value === stamped.get(el)) {\n stamped.delete(el);\n yielded.add(el);\n } else {\n stamped.set(el, value);\n }\n }\n stamp();\n observer.takeRecords();\n });\n observer.observe(cell, {\n subtree: true,\n childList: true,\n attributes: true,\n attributeFilter: STAMP_OBSERVED_ATTRIBUTES,\n });\n return () => {\n observer.disconnect();\n for (const [el, original] of stamped) {\n if (original === null) el.removeAttribute('tabindex');\n else el.setAttribute('tabindex', original);\n }\n stamped.clear();\n };\n}\n\ninterface ListActionCellProps {\n /** Grid mode: a focusable `gridcell` div whose widgets leave the Tab order; otherwise a `span`. */\n grid: boolean;\n /** Called when the cell is removed while focus is inside it (the cell is still in the document). */\n onRemovedWithFocus: (cell: HTMLElement) => void;\n children: React.ReactNode;\n}\n\n/**\n * The action cell of a {@link ListItem} (internal). React runs the layout-effect cleanups of a\n * removed subtree before it removes the subtree's DOM, but a component's own cleanups only after\n * its removed children are gone. So this cleanup, unlike one in ListItem, still sees focus inside\n * the cell when the action disappears (data-display#2).\n *\n * `grid` never changes for a mounted cell: switching between list and grid semantics changes the\n * List's root element, which remounts the items and their cells.\n */\nfunction ListActionCell({ grid, onRemovedWithFocus, children }: ListActionCellProps) {\n const cellRef = React.useRef<HTMLElement | null>(null);\n\n React.useLayoutEffect(() => {\n const cell = cellRef.current;\n return () => {\n if (!cell) return;\n const active = cell.ownerDocument.activeElement;\n if (active && cell.contains(active)) onRemovedWithFocus(cell);\n };\n }, [onRemovedWithFocus, grid]);\n\n React.useLayoutEffect(() => {\n const cell = cellRef.current;\n return grid && cell ? stampActionCell(cell) : undefined;\n }, [grid]);\n\n const Cell = (grid ? 'div' : 'span') as React.ElementType;\n return (\n <Cell\n ref={cellRef}\n role={grid ? 'gridcell' : undefined}\n tabIndex={grid ? -1 : undefined}\n data-list-action=\"\"\n className={cn('ms-2 shrink-0', grid && focusRingInset)}\n >\n {children}\n </Cell>\n );\n}\nListActionCell.displayName = 'ListActionCell';\n\n/**\n * A vertical list of items, optionally selectable.\n *\n * - **Plain** (`selectable` false): `role=\"list\"` with `listitem`s; item actions stay in the\n * normal Tab order.\n * - **Selectable** (APG Listbox): `role=\"listbox\"` with `option`s and one Tab stop (the first\n * selected option, else the first option). ArrowUp/Down move focus (wrapping), Home/End jump to\n * the ends, typeahead is on for more than 7 items, Enter/Space and clicks toggle selection (a\n * Space typed within 500 ms of a typeahead character continues the search instead; with Ctrl,\n * Alt or Meta, Enter and Space are left to the page).\n * - **Selectable with item actions** (APG Grid): `role=\"grid\"` with `row`s (carrying\n * `aria-selected`) and `gridcell`s for the content and the action. One Tab stop; Up/Down move\n * between rows, Right/Left (mirrored in RTL) move into and out of the actions. A cell that holds\n * a text-entry widget takes focus itself: Enter/F2 enter the widget, Escape returns to the cell.\n * Clicks and keys that start inside an action, or inside a popup it opens (a Popover, a Menu),\n * never toggle selection.\n * - **Switching semantics remounts the items.** Listbox/list and grid use different elements\n * (`ul`/`li` and `div`), so when a selectable list gains its first item action, loses its last\n * one, or `selectable` changes while items have actions, React remounts the items and their\n * content: state inside them (an inline rename input's draft, an uncontrolled checkbox) is reset.\n * Focus that is on an item or inside it when the list switches moves to the same item (by\n * `value`, else by position; the next item when the focused one was removed), so the switch\n * never drops it to `<body>`. This includes focus inside the last action when that action\n * removes itself (an inline rename input that unmounts on Enter). An action that removes itself\n * while focused without causing a switch drops focus, like any removed element. When the list\n * may switch, keep such state in the parent (or keep an action on at least one item).\n * - Selection: `selectionMode` `'single'` (default) or `'multiple'`; controlled with\n * `selectedItems` (or `selectedItem` in single mode) or uncontrolled with the `default*` props.\n * Values of items that are no longer rendered are dropped from the reported selection.\n * - Sub-component: `List.Item` (also exported as `ListItem` for React Server Components).\n *\n * @example\n * <List selectable selectionMode=\"multiple\" aria-label=\"Fruits\" onSelectionChange={setFruits}>\n * <List.Item value=\"apple\">Apple</List.Item>\n * <List.Item value=\"banana\">Banana</List.Item>\n * </List>\n */\nexport const List = /* @__PURE__ */ Object.assign(ListRoot, {\n Item: ListItem,\n});\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ "use client";var e=[],t=class{records;data=null;constructor(e){this.records=e}get values(){return this.read().values}get valueSet(){return this.read().valueSet}get duplicates(){return this.read().duplicates}get count(){return this.read().count}get hasActions(){return this.read().hasActions}build(){let t=[],n=new Set,r=new Set,i=!1;for(let e of this.records.values())e.hasAction&&(i=!0),e.value!==void 0&&(n.has(e.value)?r.add(e.value):(n.add(e.value),t.push(e.value)));return{values:t,valueSet:n,duplicates:r.size>0?Array.from(r):e,count:this.records.size,hasActions:i}}read(){return this.data??=this.build(),this.data}},n=class{records=new Map;listeners=new Set;active=!1;snapshot=null;focusLoss=null;subscribe=e=>(this.listeners.add(e),()=>{this.listeners.delete(e)});getSnapshot=()=>this.snapshot;getServerSnapshot=()=>null;set(e,t){let n=this.records.get(e);this.records.set(e,t),!(n&&n.value===t.value&&n.hasAction===t.hasAction)&&this.publish()}delete(e){this.records.delete(e)&&this.publish()}syncOrder(e){if(!this.active||!e||this.records.size<2)return;let t=new Map;for(let n of this.records){let r=n[1].element.current;if(!r||r.parentElement!==e)return;t.set(r,n)}let n=[],r=this.records.keys(),i=!1;for(let a=e.firstElementChild;a;a=a.nextElementSibling){let e=t.get(a);e&&(n.push(e),!i&&r.next().value!==e[0]&&(i=!0))}if(i&&n.length===this.records.size){this.records.clear();for(let[e,t]of n)this.records.set(e,t);this.publish()}}setActive(e){e!==this.active&&(this.active=e,e?this.publish():this.snapshot!==null&&(this.snapshot=null,this.notify()))}prune(e){let t=this.snapshot;return t?e.filter(e=>t.valueSet.has(e)):[...e]}recordFocusLoss(e){this.focusLoss=e,queueMicrotask(()=>{this.focusLoss===e&&(this.focusLoss=null)})}takeFocusLoss(){let e=this.focusLoss;return this.focusLoss=null,e}publish(){this.active&&(this.snapshot=new t(this.records),this.notify())}notify(){for(let e of this.listeners)e()}};exports.ListRegistry=n,exports.ListRegistrySnapshot=t;
2
+ //# sourceMappingURL=List.registry.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"List.registry.cjs","names":["NO_VALUES","ListRegistrySnapshot","records","values","valueSet","duplicateSet","hasActions","record","ListRegistry","listener","previous","token","root","byElement","entry","element","ordered","current","moved","child","active","snapshot","value","loss"],"sources":["../../../src/components/data-display/List.registry.ts"],"sourcesContent":["/**\n * The item registry of the List component (internal module: not re-exported by the barrels).\n *\n * Items register their value in a layout effect; the List reads the registered set during render\n * (C-HOOKS: an external store instead of setState in an effect).\n */\n\nconst NO_VALUES: readonly string[] = [];\n\n/** What one mounted item registered. */\nexport interface ListItemRecord {\n /** The item's explicit `value` (`undefined`: the item cannot be selected). */\n value: string | undefined;\n /** Whether the item has an action (a selectable list with actions renders a grid). */\n hasAction: boolean;\n /** The item element's ref, read after a commit to keep the records in DOM order. */\n element: { readonly current: Element | null };\n}\n\n/** The data collected from the records, see {@link ListRegistrySnapshot}. */\nexport interface ListRegistryData {\n values: readonly string[];\n valueSet: ReadonlySet<string>;\n /** Values that more than one item holds, each listed once. */\n duplicates: readonly string[];\n count: number;\n hasActions: boolean;\n}\n\n/**\n * What the items of a List registered, published through `useSyncExternalStore`.\n *\n * Creating a snapshot is O(1): the data is collected from the records the first time it is read\n * (the List's next render), so a commit that mounts or unmounts n items costs O(n) in total\n * instead of one full rebuild per item (table-core#22). A newer snapshot replaces this one on every\n * change, and React always renders with the newest, so the lazily read records are the current\n * ones.\n */\nexport class ListRegistrySnapshot {\n private data: ListRegistryData | null = null;\n\n constructor(private readonly records: ReadonlyMap<object, ListItemRecord>) {}\n\n /** Item values in DOM order (see {@link ListRegistry.syncOrder}), without duplicates. */\n get values(): readonly string[] {\n return this.read().values;\n }\n\n get valueSet(): ReadonlySet<string> {\n return this.read().valueSet;\n }\n\n /** Values that more than one mounted item holds (each listed once). */\n get duplicates(): readonly string[] {\n return this.read().duplicates;\n }\n\n /** Number of mounted items (with or without a value). */\n get count(): number {\n return this.read().count;\n }\n\n /** Whether any item has an action. */\n get hasActions(): boolean {\n return this.read().hasActions;\n }\n\n /** Collects the data from the records: O(n), once per snapshot. Public for the cost test only. */\n build(): ListRegistryData {\n const values: string[] = [];\n const valueSet = new Set<string>();\n const duplicateSet = new Set<string>();\n let hasActions = false;\n for (const record of this.records.values()) {\n if (record.hasAction) hasActions = true;\n if (record.value === undefined) continue;\n if (valueSet.has(record.value)) {\n duplicateSet.add(record.value);\n } else {\n valueSet.add(record.value);\n values.push(record.value);\n }\n }\n const duplicates = duplicateSet.size > 0 ? Array.from(duplicateSet) : NO_VALUES;\n return { values, valueSet, duplicates, count: this.records.size, hasActions };\n }\n\n private read(): ListRegistryData {\n this.data ??= this.build();\n return this.data;\n }\n}\n\n/** The item that held focus when it was removed, recorded for the List's focus restore. */\nexport interface ListFocusLoss {\n /** The item's explicit `value`, if it has one. */\n value: string | undefined;\n /** Its position among the list's items. */\n index: number;\n}\n\n/**\n * The registry behind a List's snapshot.\n *\n * Only a selectable List publishes (`setActive(true)` in its layout effect): a plain list never\n * reads the registry, so its items' registrations cost O(1) and cause no renders. The snapshot is\n * `null` while inactive and until the List's first commit, so the server and the first client\n * render treat every selected value as present.\n */\nexport class ListRegistry {\n private readonly records = new Map<object, ListItemRecord>();\n private readonly listeners = new Set<() => void>();\n private active = false;\n private snapshot: ListRegistrySnapshot | null = null;\n private focusLoss: ListFocusLoss | null = null;\n\n subscribe = (listener: () => void): (() => void) => {\n this.listeners.add(listener);\n return () => {\n this.listeners.delete(listener);\n };\n };\n\n getSnapshot = (): ListRegistrySnapshot | null => this.snapshot;\n\n getServerSnapshot = (): ListRegistrySnapshot | null => null;\n\n /**\n * Adds an item's record, or updates it in place: a `Map.set` on an existing token keeps its\n * position, so an item whose value or action changes does not move to the end. Publishes only\n * when the value or the action changed.\n */\n set(token: object, record: ListItemRecord): void {\n const previous = this.records.get(token);\n this.records.set(token, record);\n if (previous && previous.value === record.value && previous.hasAction === record.hasAction) {\n return;\n }\n this.publish();\n }\n\n /** Removes an item's record (on unmount only). */\n delete(token: object): void {\n if (this.records.delete(token)) this.publish();\n }\n\n /**\n * Puts the records in DOM order, so `values` (and with it the List's Tab stop, the first selected\n * item) follows the DOM. Items that mount between others register last, and keyed moves do not\n * register again, so the List calls this after each of its commits. O(n); publishes only when\n * the order changed. The records keep their registration order while an item is not a direct\n * child of `root` (an element wrapped around an item) or has no element.\n *\n * The children are walked with `nextElementSibling`, never through the `root.children`\n * collection: jsdom before 30.1 does not cache indexed `HTMLCollection` access, so an indexed\n * loop (or `Array.from`) is O(n²) there and made every commit of a large list in a consumer's\n * test suite cost seconds.\n */\n syncOrder(root: Element | null): void {\n if (!this.active || !root || this.records.size < 2) return;\n const byElement = new Map<Element, [object, ListItemRecord]>();\n for (const entry of this.records) {\n const element = entry[1].element.current;\n if (!element || element.parentElement !== root) return;\n byElement.set(element, entry);\n }\n const ordered: [object, ListItemRecord][] = [];\n const current = this.records.keys();\n let moved = false;\n for (let child = root.firstElementChild; child; child = child.nextElementSibling) {\n const entry = byElement.get(child);\n if (!entry) continue;\n ordered.push(entry);\n if (!moved && current.next().value !== entry[0]) moved = true;\n }\n if (!moved || ordered.length !== this.records.size) return;\n this.records.clear();\n for (const [token, record] of ordered) this.records.set(token, record);\n this.publish();\n }\n\n /** Called by the List after each commit that changes `selectable` (and on mount). */\n setActive(active: boolean): void {\n if (active === this.active) return;\n this.active = active;\n if (active) {\n this.publish();\n } else if (this.snapshot !== null) {\n this.snapshot = null;\n this.notify();\n }\n }\n\n /** `values` without the ones no mounted item has (read at event time). */\n prune(values: readonly string[]): string[] {\n const snapshot = this.snapshot;\n return snapshot ? values.filter((value) => snapshot.valueSet.has(value)) : [...values];\n }\n\n /**\n * Records that a removed item (or action) held focus. Only the current commit can use it: the\n * record is dropped in a microtask, so a later commit never moves focus because of an old removal.\n */\n recordFocusLoss(loss: ListFocusLoss): void {\n this.focusLoss = loss;\n queueMicrotask(() => {\n if (this.focusLoss === loss) this.focusLoss = null;\n });\n }\n\n takeFocusLoss(): ListFocusLoss | null {\n const loss = this.focusLoss;\n this.focusLoss = null;\n return loss;\n }\n\n private publish(): void {\n if (!this.active) return;\n this.snapshot = new ListRegistrySnapshot(this.records);\n this.notify();\n }\n\n private notify(): void {\n for (const listener of this.listeners) listener();\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1,101 @@
1
+ "use client";
2
+ //#region src/components/data-display/List.registry.ts
3
+ var e = [], t = class {
4
+ records;
5
+ data = null;
6
+ constructor(e) {
7
+ this.records = e;
8
+ }
9
+ get values() {
10
+ return this.read().values;
11
+ }
12
+ get valueSet() {
13
+ return this.read().valueSet;
14
+ }
15
+ get duplicates() {
16
+ return this.read().duplicates;
17
+ }
18
+ get count() {
19
+ return this.read().count;
20
+ }
21
+ get hasActions() {
22
+ return this.read().hasActions;
23
+ }
24
+ build() {
25
+ let t = [], n = /* @__PURE__ */ new Set(), r = /* @__PURE__ */ new Set(), i = !1;
26
+ for (let e of this.records.values()) e.hasAction && (i = !0), e.value !== void 0 && (n.has(e.value) ? r.add(e.value) : (n.add(e.value), t.push(e.value)));
27
+ return {
28
+ values: t,
29
+ valueSet: n,
30
+ duplicates: r.size > 0 ? Array.from(r) : e,
31
+ count: this.records.size,
32
+ hasActions: i
33
+ };
34
+ }
35
+ read() {
36
+ return this.data ??= this.build(), this.data;
37
+ }
38
+ }, n = class {
39
+ records = /* @__PURE__ */ new Map();
40
+ listeners = /* @__PURE__ */ new Set();
41
+ active = !1;
42
+ snapshot = null;
43
+ focusLoss = null;
44
+ subscribe = (e) => (this.listeners.add(e), () => {
45
+ this.listeners.delete(e);
46
+ });
47
+ getSnapshot = () => this.snapshot;
48
+ getServerSnapshot = () => null;
49
+ set(e, t) {
50
+ let n = this.records.get(e);
51
+ this.records.set(e, t), !(n && n.value === t.value && n.hasAction === t.hasAction) && this.publish();
52
+ }
53
+ delete(e) {
54
+ this.records.delete(e) && this.publish();
55
+ }
56
+ syncOrder(e) {
57
+ if (!this.active || !e || this.records.size < 2) return;
58
+ let t = /* @__PURE__ */ new Map();
59
+ for (let n of this.records) {
60
+ let r = n[1].element.current;
61
+ if (!r || r.parentElement !== e) return;
62
+ t.set(r, n);
63
+ }
64
+ let n = [], r = this.records.keys(), i = !1;
65
+ for (let a = e.firstElementChild; a; a = a.nextElementSibling) {
66
+ let e = t.get(a);
67
+ e && (n.push(e), !i && r.next().value !== e[0] && (i = !0));
68
+ }
69
+ if (i && n.length === this.records.size) {
70
+ this.records.clear();
71
+ for (let [e, t] of n) this.records.set(e, t);
72
+ this.publish();
73
+ }
74
+ }
75
+ setActive(e) {
76
+ e !== this.active && (this.active = e, e ? this.publish() : this.snapshot !== null && (this.snapshot = null, this.notify()));
77
+ }
78
+ prune(e) {
79
+ let t = this.snapshot;
80
+ return t ? e.filter((e) => t.valueSet.has(e)) : [...e];
81
+ }
82
+ recordFocusLoss(e) {
83
+ this.focusLoss = e, queueMicrotask(() => {
84
+ this.focusLoss === e && (this.focusLoss = null);
85
+ });
86
+ }
87
+ takeFocusLoss() {
88
+ let e = this.focusLoss;
89
+ return this.focusLoss = null, e;
90
+ }
91
+ publish() {
92
+ this.active && (this.snapshot = new t(this.records), this.notify());
93
+ }
94
+ notify() {
95
+ for (let e of this.listeners) e();
96
+ }
97
+ };
98
+ //#endregion
99
+ export { n as ListRegistry, t as ListRegistrySnapshot };
100
+
101
+ //# sourceMappingURL=List.registry.mjs.map