@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,266 @@
1
+ "use client";
2
+ import { getGlobalRegistry as e } from "../lib/globalRegistry.mjs";
3
+ import { focusElement as t, getFirstTabbable as n, getTabbableElements as r, isFocusable as i } from "../lib/focus.mjs";
4
+ import { compareLayers as a, getLayer as o, getLayerTreeElements as s, getOpenLayers as c, isDescendantLayer as l } from "../lib/layers.mjs";
5
+ import { useInsertionEffect as u, useLayoutEffect as d, useRef as f } from "react";
6
+ //#region src/hooks/useFocusTrap.ts
7
+ function p() {
8
+ return e("traps", () => ({
9
+ traps: [],
10
+ seq: 0,
11
+ listeners: null
12
+ }));
13
+ }
14
+ function m(e, t) {
15
+ let n = e.layerId, r = t.layerId;
16
+ if (n !== void 0 && r !== void 0 && n !== r) {
17
+ if (l(n, r)) return 1;
18
+ if (l(r, n)) return -1;
19
+ let e = o(n), t = o(r);
20
+ if (e && t) return a(e, t);
21
+ }
22
+ return e.seq - t.seq;
23
+ }
24
+ function h(e) {
25
+ let t = null;
26
+ for (let n of e.traps) (!t || m(n, t) > 0) && (t = n);
27
+ return t;
28
+ }
29
+ var g = 4, _ = 2;
30
+ function v(e) {
31
+ let t = e.container.ownerDocument, n = Array.from(t.querySelectorAll(e.allowOutsideSelector));
32
+ return n.filter((t) => !e.container.contains(t) && !t.contains(e.container) && !n.some((e) => e !== t && e.contains(t)));
33
+ }
34
+ function y(e, t) {
35
+ let n = r(e.container).map((e) => ({
36
+ el: e,
37
+ segment: 0
38
+ }));
39
+ return t.forEach((e, t) => {
40
+ for (let i of r(e)) n.push({
41
+ el: i,
42
+ segment: t + 1
43
+ });
44
+ }), n;
45
+ }
46
+ function b(e, t) {
47
+ return (e.compareDocumentPosition(t) & g) !== 0;
48
+ }
49
+ function x(e, t) {
50
+ return (e.compareDocumentPosition(t) & _) !== 0 && !t.contains(e);
51
+ }
52
+ function S(e, t, n, r) {
53
+ if (!r) {
54
+ let r = e.find((e) => e.segment === n && b(t, e.el));
55
+ return r ? r.el : (e.find((e) => e.segment > n) ?? e[0]).el;
56
+ }
57
+ for (let r = e.length - 1; r >= 0; r--) {
58
+ let i = e[r];
59
+ if (i.segment === n && x(t, i.el)) return i.el;
60
+ }
61
+ for (let t = e.length - 1; t >= 0; t--) if (e[t].segment < n) return e[t].el;
62
+ return e[e.length - 1].el;
63
+ }
64
+ function C(e, t) {
65
+ return e !== void 0 && s(e, { includeOwnElements: !1 }).some((e) => e.contains(t));
66
+ }
67
+ function w(e, t) {
68
+ if (e.container.contains(t)) return !0;
69
+ let n = t.nodeType === 1 ? t : t.parentElement;
70
+ return n && n.closest(e.allowOutsideSelector) ? !0 : C(e.layerId, t);
71
+ }
72
+ function T(e, t) {
73
+ let n = e.layerId;
74
+ if (n === void 0) return null;
75
+ let r = null;
76
+ for (let i of c()) {
77
+ if (i.id === n || !l(i.id, n)) continue;
78
+ let o = i.getAnchor(), s = i.getElements().find((n) => !!n && n.contains(t) && !e.container.contains(n) && !(o && n.contains(o)));
79
+ s && (!r || a(i, r.layer) > 0) && (r = {
80
+ layer: i,
81
+ region: s
82
+ });
83
+ }
84
+ return r;
85
+ }
86
+ function E(e, t) {
87
+ if (e.layerId === void 0) return null;
88
+ let n = s(e.layerId, { includeOwnElements: !1 }).filter((e) => e.contains(t));
89
+ return n.find((e) => !n.some((t) => t !== e && t.contains(e))) ?? null;
90
+ }
91
+ function D(e) {
92
+ for (let n of e) if (n && t(n)) return;
93
+ }
94
+ function O(e, t, n) {
95
+ let i = r(e), a = i.indexOf(t);
96
+ return a === -1 ? n ? !i.some((e) => x(t, e)) : !i.some((e) => b(t, e)) : n ? a === 0 : a === i.length - 1;
97
+ }
98
+ function k(e, t, n) {
99
+ let r = y(e, t);
100
+ D([n ? r[r.length - 1]?.el : r[0]?.el, e.container]);
101
+ }
102
+ function A(e, t, n, r) {
103
+ let i = E(e, n);
104
+ return i ? !O(i, n, t.shiftKey) || (t.preventDefault(), k(e, r, t.shiftKey), !0) : !1;
105
+ }
106
+ function j(e, n, a, o) {
107
+ let s = a, c = n.shiftKey;
108
+ for (let l = 0; l < 10; l++) {
109
+ let l = T(e, s);
110
+ if (!l) return !1;
111
+ let { layer: u, region: d } = l;
112
+ if (s === a && !O(d, s, c)) return !0;
113
+ let f = u.getAnchor();
114
+ if (n.preventDefault(), !f || !f.isConnected) return k(e, o, c), !0;
115
+ if (c && i(f)) return t(f), !0;
116
+ if (e.container.contains(f)) {
117
+ let n = y(e, o);
118
+ return n.length === 0 ? (t(e.container), !0) : (D([n.some((e) => e.el === f) ? N(n, f, c) : S(n, f, 0, c), e.container]), !0);
119
+ }
120
+ let p = T(e, f);
121
+ if (!p) {
122
+ let n = E(e, f);
123
+ if (!n) return D([f, e.container]), !0;
124
+ let i = M(r(n), f, c);
125
+ return i ? t(i) : k(e, o, c), !0;
126
+ }
127
+ let m = M(r(p.region), f, c);
128
+ if (m) return t(m), !0;
129
+ s = f;
130
+ }
131
+ return !0;
132
+ }
133
+ function M(e, t, n) {
134
+ return n ? [...e].reverse().find((e) => x(t, e)) : e.find((e) => b(t, e) && !t.contains(e));
135
+ }
136
+ function N(e, t, n) {
137
+ let r = e.findIndex((e) => e.el === t);
138
+ return e[((n ? r - 1 : r + 1) + e.length) % e.length].el;
139
+ }
140
+ function P(e, n) {
141
+ let { container: r } = e;
142
+ if (!r.isConnected) return;
143
+ let i = r.ownerDocument, a = i.activeElement, o = n.shiftKey, s = v(e), c = !!a && r.contains(a), l = a && !c ? s.findIndex((e) => e.contains(a)) : -1;
144
+ if (a && !c && l === -1 && a !== i.body && C(e.layerId, a) && (j(e, n, a, s) || A(e, n, a, s))) return;
145
+ let u = y(e, s);
146
+ if (u.length === 0) {
147
+ n.preventDefault(), t(r);
148
+ return;
149
+ }
150
+ let d = a ? u.findIndex((e) => e.el === a) : -1;
151
+ if (d !== -1) {
152
+ let e = o ? d - 1 : d + 1;
153
+ if (e < 0 || e >= u.length) {
154
+ n.preventDefault(), t(u[o ? u.length - 1 : 0].el);
155
+ return;
156
+ }
157
+ let r = u[e];
158
+ r.segment !== u[d].segment && (n.preventDefault(), t(r.el));
159
+ return;
160
+ }
161
+ if (n.preventDefault(), a && (c || l !== -1)) {
162
+ let e = c ? 0 : l + 1;
163
+ t(S(u, a, e, o));
164
+ return;
165
+ }
166
+ t(u[o ? u.length - 1 : 0].el);
167
+ }
168
+ function F(e) {
169
+ if (e.key !== "Tab" || e.defaultPrevented || e.altKey || e.ctrlKey || e.metaKey || e.isComposing) return;
170
+ let t = h(p());
171
+ t && P(t, e);
172
+ }
173
+ function I(e) {
174
+ let t = h(p());
175
+ if (!t) return;
176
+ let n = e.target;
177
+ if (!n || typeof n.nodeType != "number") return;
178
+ let r = n;
179
+ if (r.nodeType !== 1) return;
180
+ let i = r;
181
+ if (w(t, i)) {
182
+ t.lastFocused = i;
183
+ return;
184
+ }
185
+ L || queueMicrotask(() => z(i));
186
+ }
187
+ var L = !1;
188
+ function R(e) {
189
+ let t = e.activeElement;
190
+ return !t || t === e.body || t === e.documentElement;
191
+ }
192
+ function z(e) {
193
+ let t = e.ownerDocument, r = t.activeElement !== e;
194
+ if (r && !R(t)) return;
195
+ let a = h(p());
196
+ if (!a || !a.container.isConnected) return;
197
+ if (!r && w(a, e)) {
198
+ a.lastFocused = e;
199
+ return;
200
+ }
201
+ let o = a.lastFocused, s = !!o && o.isConnected && w(a, o) && i(o);
202
+ L = !0;
203
+ try {
204
+ D([
205
+ s ? o : null,
206
+ n(a.container),
207
+ a.container
208
+ ]);
209
+ } finally {
210
+ L = !1;
211
+ }
212
+ }
213
+ function B(e) {
214
+ if (e.listeners || typeof document > "u") return;
215
+ let t = document;
216
+ t.addEventListener("keydown", F), t.addEventListener("focusin", I, !0), e.listeners = { remove() {
217
+ t.removeEventListener("keydown", F), t.removeEventListener("focusin", I, !0);
218
+ } };
219
+ }
220
+ function V(e) {
221
+ let t = p();
222
+ return t.traps.push(e), B(t), () => {
223
+ let n = t.traps.indexOf(e);
224
+ n !== -1 && t.traps.splice(n, 1), t.traps.length === 0 && (t.listeners?.remove(), t.listeners = null);
225
+ };
226
+ }
227
+ function H(e, t) {
228
+ let r = n(e);
229
+ return t === "container" ? [e] : t === void 0 || t === "first" ? [r, e] : [
230
+ typeof t == "function" ? t() : t.current,
231
+ r,
232
+ e
233
+ ];
234
+ }
235
+ function U(e, t) {
236
+ let { enabled: n } = t, r = f(t);
237
+ u(() => {
238
+ r.current = t;
239
+ }), d(() => {
240
+ if (!n || !e) return;
241
+ let t = r, i = p();
242
+ i.seq += 1;
243
+ let a = {
244
+ container: e,
245
+ seq: i.seq,
246
+ get layerId() {
247
+ return t.current.layerId;
248
+ },
249
+ get allowOutsideSelector() {
250
+ return t.current.allowOutsideSelector ?? "[data-wave-focus-trap-allow]";
251
+ },
252
+ lastFocused: null
253
+ }, o = V(a), s = e.ownerDocument.activeElement;
254
+ if (s && (e.contains(s) || !s.closest(a.allowOutsideSelector) && C(t.current.layerId, s))) a.lastFocused = s;
255
+ else {
256
+ D(H(e, t.current.initialFocus));
257
+ let n = e.ownerDocument.activeElement;
258
+ n && e.contains(n) && (a.lastFocused = n);
259
+ }
260
+ return o;
261
+ }, [n, e]);
262
+ }
263
+ //#endregion
264
+ export { U as useFocusTrap };
265
+
266
+ //# sourceMappingURL=useFocusTrap.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useFocusTrap.mjs","names":["getState","getGlobalRegistry","compareTraps","idA","a","idB","b","isDescendantLayer","layerA","getLayer","layerB","compareLayers","getActiveTrap","active","trap","state","FOLLOWING","PRECEDING","getAllowRegions","doc","all","region","other","getCycle","entries","getTabbableElements","regions","el","index","follows","reference","precedes","findFromPosition","backward","sameSegment","cycle","entry","segment","from","i","isInsideDescendantLayers","layerId","getLayerTreeElements","node","isInsideTrap","findDescendantLayer","found","layer","getOpenLayers","anchor","findPortalWrapper","containing","focusFirstPossible","candidate","candidates","focusElement","isAtRegionEdge","tabbables","focusCycleEdge","handlePortalWrapperTab","wrapper","event","handleDescendantLayerTab","depth","isFocusable","neighbour","outer","next","findNextTo","handleTab","container","inContainer","regionIndex","nextIndex","handleKeyDown","handleFocusIn","target","reclaiming","reclaimFocus","isFocusLost","lost","last","lastIsValid","getFirstTabbable","ensureListeners","pushTrap","resolveInitialFocus","first","initialFocus","useFocusTrap","options","latestRef","useRef","useInsertionEffect","useLayoutEffect","enabled","latest","release","now"],"sources":["../../src/hooks/useFocusTrap.ts"],"sourcesContent":["import { useInsertionEffect, useLayoutEffect, useRef } from 'react';\nimport type * as React from 'react';\nimport { getGlobalRegistry } from '../lib/globalRegistry';\nimport { focusElement, getFirstTabbable, getTabbableElements, isFocusable } from '../lib/focus';\nimport {\n ALLOW_OUTSIDE_SELECTOR,\n compareLayers,\n getLayer,\n getLayerTreeElements,\n getOpenLayers,\n isDescendantLayer,\n type LayerRecord,\n} from '../lib/layers';\n\n/** Options of {@link useFocusTrap}. */\nexport interface UseFocusTrapOptions {\n /** Whether the trap is active. */\n enabled: boolean;\n /**\n * The surface's dismiss layer; focus inside its descendant layers (portaled popovers opened from\n * inside) is allowed. The layer's own `refs` outside the container (its trigger) are not.\n */\n layerId?: string;\n /**\n * What to focus when the trap starts, unless focus is already inside (an `autoFocus` element\n * wins). @default 'first' (the first tabbable element, else the container)\n */\n initialFocus?:\n React.RefObject<HTMLElement | null> | 'first' | 'container' | (() => HTMLElement | null);\n /** Regions outside the container whose tabbables join the Tab cycle. @default ALLOW_OUTSIDE_SELECTOR */\n allowOutsideSelector?: string;\n}\n\ninterface TrapEntry {\n container: HTMLElement;\n seq: number;\n readonly layerId: string | undefined;\n readonly allowOutsideSelector: string;\n lastFocused: HTMLElement | null;\n}\n\ninterface TrapState {\n traps: TrapEntry[];\n seq: number;\n listeners: { remove(): void } | null;\n}\n\nfunction getState(): TrapState {\n return getGlobalRegistry<TrapState>('traps', () => ({ traps: [], seq: 0, listeners: null }));\n}\n\n// ---------------------------------------------------------------------------\n// Trap stack\n// ---------------------------------------------------------------------------\n\n/** `> 0` when trap `a` is above trap `b`: layer parentage/stacking first, then activation order. */\nfunction compareTraps(a: TrapEntry, b: TrapEntry): number {\n const idA = a.layerId;\n const idB = b.layerId;\n if (idA !== undefined && idB !== undefined && idA !== idB) {\n if (isDescendantLayer(idA, idB)) return 1;\n if (isDescendantLayer(idB, idA)) return -1;\n const layerA = getLayer(idA);\n const layerB = getLayer(idB);\n if (layerA && layerB) return compareLayers(layerA, layerB);\n }\n return a.seq - b.seq;\n}\n\nfunction getActiveTrap(state: TrapState): TrapEntry | null {\n let active: TrapEntry | null = null;\n for (const trap of state.traps) {\n if (!active || compareTraps(trap, active) > 0) active = trap;\n }\n return active;\n}\n\n// ---------------------------------------------------------------------------\n// Tab cycle\n// ---------------------------------------------------------------------------\n\ninterface CycleEntry {\n el: HTMLElement;\n /** 0 = the container, 1… = allow-listed regions in document order. */\n segment: number;\n}\n\nconst FOLLOWING = 4; // Node.DOCUMENT_POSITION_FOLLOWING\nconst PRECEDING = 2; // Node.DOCUMENT_POSITION_PRECEDING\n\n/** Top-level allow-listed regions outside the container. */\nfunction getAllowRegions(trap: TrapEntry): HTMLElement[] {\n const doc = trap.container.ownerDocument;\n const all = Array.from(doc.querySelectorAll<HTMLElement>(trap.allowOutsideSelector));\n return all.filter(\n (region) =>\n !trap.container.contains(region) &&\n !region.contains(trap.container) &&\n !all.some((other) => other !== region && other.contains(region)),\n );\n}\n\nfunction getCycle(trap: TrapEntry, regions: HTMLElement[]): CycleEntry[] {\n const entries: CycleEntry[] = getTabbableElements(trap.container).map((el) => ({\n el,\n segment: 0,\n }));\n regions.forEach((region, index) => {\n for (const el of getTabbableElements(region)) entries.push({ el, segment: index + 1 });\n });\n return entries;\n}\n\nfunction follows(reference: Node, el: Node): boolean {\n return (reference.compareDocumentPosition(el) & FOLLOWING) !== 0;\n}\n\nfunction precedes(reference: Node, el: Node): boolean {\n // An ancestor also \"precedes\"; it is not a place Tab goes back to.\n return (reference.compareDocumentPosition(el) & PRECEDING) !== 0 && !el.contains(reference);\n}\n\n/** The cycle entry Tab (or Shift+Tab) reaches from `from`, an element not in the cycle. */\nfunction findFromPosition(\n cycle: CycleEntry[],\n from: Element,\n segment: number,\n backward: boolean,\n): HTMLElement {\n if (!backward) {\n const sameSegment = cycle.find((entry) => entry.segment === segment && follows(from, entry.el));\n if (sameSegment) return sameSegment.el;\n const later = cycle.find((entry) => entry.segment > segment);\n return (later ?? cycle[0]).el;\n }\n for (let i = cycle.length - 1; i >= 0; i--) {\n const entry = cycle[i];\n if (entry.segment === segment && precedes(from, entry.el)) return entry.el;\n }\n for (let i = cycle.length - 1; i >= 0; i--) {\n if (cycle[i].segment < segment) return cycle[i].el;\n }\n return cycle[cycle.length - 1].el;\n}\n\n/**\n * Whether `node` is inside a **descendant** of the layer `layerId`: the portal wrappers registered\n * with it (overlays rendered inside the trapped surface) and the trees of its descendant layers.\n * The layer's own `getElements()` are left out — they usually include its trigger, which lives\n * outside the container (a DatePicker toggle) and must not count as inside the trap.\n */\nfunction isInsideDescendantLayers(layerId: string | undefined, node: Node): boolean {\n if (layerId === undefined) return false;\n return getLayerTreeElements(layerId, { includeOwnElements: false }).some((el) =>\n el.contains(node),\n );\n}\n\nfunction isInsideTrap(trap: TrapEntry, node: Node): boolean {\n if (trap.container.contains(node)) return true;\n const el = node.nodeType === 1 ? (node as Element) : node.parentElement;\n if (el && el.closest(trap.allowOutsideSelector)) return true;\n return isInsideDescendantLayers(trap.layerId, node);\n}\n\n/**\n * The open descendant layer of the trap's layer that `node` is in (the topmost when several\n * contain it), with the element of that layer containing `node` (its portaled surface). A layer's\n * trigger is not its surface: an element that is, or contains, the layer's anchor (an info\n * button, a tooltip's wrapper) belongs to the region around it — the container, the surface of\n * an enclosing descendant layer or a plain portal.\n */\nfunction findDescendantLayer(\n trap: TrapEntry,\n node: Node,\n): { layer: LayerRecord; region: HTMLElement } | null {\n const layerId = trap.layerId;\n if (layerId === undefined) return null;\n let found: { layer: LayerRecord; region: HTMLElement } | null = null;\n for (const layer of getOpenLayers()) {\n if (layer.id === layerId || !isDescendantLayer(layer.id, layerId)) continue;\n const anchor = layer.getAnchor();\n const region = layer\n .getElements()\n .find(\n (el): el is HTMLElement =>\n !!el &&\n el.contains(node) &&\n !trap.container.contains(el) &&\n !(anchor && el.contains(anchor)),\n );\n if (region && (!found || compareLayers(layer, found.layer) > 0)) found = { layer, region };\n }\n return found;\n}\n\n/**\n * The outermost element of the trap's layer tree (its own layer's elements left out) that contains\n * `node`. Asked once no descendant layer's surface contains `node`, this is the wrapper of a plain\n * `<Portal>` rendered inside the trapped surface (or inside one of its descendant layers).\n */\nfunction findPortalWrapper(trap: TrapEntry, node: Node): HTMLElement | null {\n if (trap.layerId === undefined) return null;\n const containing = getLayerTreeElements(trap.layerId, { includeOwnElements: false }).filter(\n (el) => el.contains(node),\n );\n return (\n containing.find((el) => !containing.some((other) => other !== el && other.contains(el))) ?? null\n );\n}\n\nfunction focusFirstPossible(candidates: Array<HTMLElement | null | undefined>): void {\n for (const candidate of candidates) {\n if (candidate && focusElement(candidate)) return;\n }\n}\n\n/** Whether Tab (Shift+Tab) from `from` leaves `region`: no tabbable of it follows (precedes). */\nfunction isAtRegionEdge(region: HTMLElement, from: HTMLElement, backward: boolean): boolean {\n const tabbables = getTabbableElements(region);\n const index = tabbables.indexOf(from);\n if (index === -1) {\n return backward\n ? !tabbables.some((el) => precedes(from, el))\n : !tabbables.some((el) => follows(from, el));\n }\n return backward ? index === 0 : index === tabbables.length - 1;\n}\n\n/** Leaving a region without an anchor: the first (Shift+Tab: last) element of the Tab cycle. */\nfunction focusCycleEdge(trap: TrapEntry, regions: HTMLElement[], backward: boolean): void {\n const cycle = getCycle(trap, regions);\n focusFirstPossible([backward ? cycle[cycle.length - 1]?.el : cycle[0]?.el, trap.container]);\n}\n\n/**\n * Tab inside a plain portal wrapper of the trap's layer tree (see {@link findPortalWrapper}):\n * native inside it; it has no anchor, so leaving it continues at the edge of the Tab cycle.\n * Returns `true` when it handled the event.\n */\nfunction handlePortalWrapperTab(\n trap: TrapEntry,\n event: KeyboardEvent,\n active: HTMLElement,\n regions: HTMLElement[],\n): boolean {\n const wrapper = findPortalWrapper(trap, active);\n if (!wrapper) return false;\n if (!isAtRegionEdge(wrapper, active, event.shiftKey)) return true; // native Tab inside it\n event.preventDefault();\n focusCycleEdge(trap, regions, event.shiftKey);\n return true;\n}\n\n/**\n * Tab inside a descendant layer: native inside it; leaving it forward goes to the tabbable after\n * the layer's anchor, backward to the anchor itself. Returns `true` when it handled the event.\n */\nfunction handleDescendantLayerTab(\n trap: TrapEntry,\n event: KeyboardEvent,\n active: HTMLElement,\n regions: HTMLElement[],\n): boolean {\n let from: HTMLElement = active;\n const backward = event.shiftKey;\n // Nested descendant layers: leave each one whose edge is reached, up to the container.\n for (let depth = 0; depth < 10; depth++) {\n const found = findDescendantLayer(trap, from);\n if (!found) return false;\n const { layer, region } = found;\n // Native Tab inside the layer.\n if (from === active && !isAtRegionEdge(region, from, backward)) return true;\n\n const anchor = layer.getAnchor();\n event.preventDefault();\n if (!anchor || !anchor.isConnected) {\n focusCycleEdge(trap, regions, backward);\n return true;\n }\n if (backward && isFocusable(anchor)) {\n focusElement(anchor);\n return true;\n }\n if (trap.container.contains(anchor)) {\n const cycle = getCycle(trap, regions);\n if (cycle.length === 0) {\n focusElement(trap.container);\n return true;\n }\n const target = cycle.some((entry) => entry.el === anchor)\n ? neighbour(cycle, anchor, backward)\n : findFromPosition(cycle, anchor, 0, backward);\n focusFirstPossible([target, trap.container]);\n return true;\n }\n // The anchor lives in another descendant layer: continue from there.\n const outer = findDescendantLayer(trap, anchor);\n if (!outer) {\n // Or in a plain portal of the trap's tree: the element next to it there, else the edge of\n // the Tab cycle (as when Tab leaves that portal).\n const wrapper = findPortalWrapper(trap, anchor);\n if (!wrapper) {\n focusFirstPossible([anchor, trap.container]);\n return true;\n }\n const next = findNextTo(getTabbableElements(wrapper), anchor, backward);\n if (next) focusElement(next);\n else focusCycleEdge(trap, regions, backward);\n return true;\n }\n const next = findNextTo(getTabbableElements(outer.region), anchor, backward);\n if (next) {\n focusElement(next);\n return true;\n }\n from = anchor;\n }\n return true;\n}\n\n/** The tabbable after `anchor` (backward: before it) in `tabbables`, never one inside it. */\nfunction findNextTo(\n tabbables: HTMLElement[],\n anchor: HTMLElement,\n backward: boolean,\n): HTMLElement | undefined {\n return backward\n ? [...tabbables].reverse().find((el) => precedes(anchor, el))\n : tabbables.find((el) => follows(anchor, el) && !anchor.contains(el));\n}\n\nfunction neighbour(cycle: CycleEntry[], el: HTMLElement, backward: boolean): HTMLElement {\n const index = cycle.findIndex((entry) => entry.el === el);\n const next = backward ? index - 1 : index + 1;\n return cycle[(next + cycle.length) % cycle.length].el;\n}\n\nfunction handleTab(trap: TrapEntry, event: KeyboardEvent): void {\n const { container } = trap;\n if (!container.isConnected) return;\n const doc = container.ownerDocument;\n const active = doc.activeElement as HTMLElement | null;\n const backward = event.shiftKey;\n const regions = getAllowRegions(trap);\n\n const inContainer = !!active && container.contains(active);\n const regionIndex =\n active && !inContainer ? regions.findIndex((region) => region.contains(active)) : -1;\n\n if (active && !inContainer && regionIndex === -1 && active !== doc.body) {\n if (isInsideDescendantLayers(trap.layerId, active)) {\n if (handleDescendantLayerTab(trap, event, active, regions)) return;\n if (handlePortalWrapperTab(trap, event, active, regions)) return;\n }\n }\n\n const cycle = getCycle(trap, regions);\n if (cycle.length === 0) {\n event.preventDefault();\n focusElement(container);\n return;\n }\n\n const index = active ? cycle.findIndex((entry) => entry.el === active) : -1;\n if (index !== -1) {\n const nextIndex = backward ? index - 1 : index + 1;\n if (nextIndex < 0 || nextIndex >= cycle.length) {\n event.preventDefault();\n focusElement(cycle[backward ? cycle.length - 1 : 0].el);\n return;\n }\n // Inside one segment the browser's own Tab order is used; crossing segments is explicit.\n const next = cycle[nextIndex];\n if (next.segment !== cycle[index].segment) {\n event.preventDefault();\n focusElement(next.el);\n }\n return;\n }\n\n event.preventDefault();\n if (active && (inContainer || regionIndex !== -1)) {\n const segment = inContainer ? 0 : regionIndex + 1;\n focusElement(findFromPosition(cycle, active, segment, backward));\n return;\n }\n focusElement(cycle[backward ? cycle.length - 1 : 0].el);\n}\n\n// ---------------------------------------------------------------------------\n// Document listeners\n// ---------------------------------------------------------------------------\n\nfunction handleKeyDown(event: KeyboardEvent): void {\n if (event.key !== 'Tab' || event.defaultPrevented) return;\n if (event.altKey || event.ctrlKey || event.metaKey || event.isComposing) return;\n const trap = getActiveTrap(getState());\n if (trap) handleTab(trap, event);\n}\n\nfunction handleFocusIn(event: FocusEvent): void {\n const trap = getActiveTrap(getState());\n if (!trap) return;\n const target = event.target as { nodeType?: unknown } | null;\n if (!target || typeof target.nodeType !== 'number') return;\n const node = target as Node;\n if (node.nodeType !== 1) return;\n const el = node as HTMLElement;\n if (isInsideTrap(trap, el)) {\n trap.lastFocused = el;\n return;\n }\n // Pulled out again by the focus being returned (another focus trap on the page): leave it there\n // rather than fight forever.\n if (reclaiming) return;\n // Not in this dispatch: React applies `autoFocus` in the layout phase of the commit that mounts\n // a surface, before the surface's portal wrapper and dismiss layer register and before its own\n // trap starts (a nested dialog, a confirm dialog over a drawer, a popover opened from a dialog).\n // Once that commit has run, the element is inside the trap that is active then.\n queueMicrotask(() => reclaimFocus(el));\n}\n\n/** Whether {@link reclaimFocus} is moving focus (its `focusin` events are dispatched meanwhile). */\nlet reclaiming = false;\n\n/** Whether focus is on no element: `<body>`, the document element or nothing. */\nfunction isFocusLost(doc: Document): boolean {\n const active = doc.activeElement;\n return !active || active === doc.body || active === doc.documentElement;\n}\n\n/**\n * Returns focus that landed on `el`, outside the trap, to the last focused element inside — also\n * when `el` lost it again before this ran (removed or blurred: focus is on `<body>` then, and no\n * later `focusin` would bring it back). Focus that moved on to another element is left to that\n * element's own check.\n */\nfunction reclaimFocus(el: HTMLElement): void {\n const doc = el.ownerDocument;\n const lost = doc.activeElement !== el;\n if (lost && !isFocusLost(doc)) return; // focus has moved on since\n const trap = getActiveTrap(getState());\n if (!trap || !trap.container.isConnected) return;\n if (!lost && isInsideTrap(trap, el)) {\n trap.lastFocused = el;\n return;\n }\n const last = trap.lastFocused;\n const lastIsValid = !!last && last.isConnected && isInsideTrap(trap, last) && isFocusable(last);\n reclaiming = true;\n try {\n focusFirstPossible([\n lastIsValid ? last : null,\n getFirstTabbable(trap.container),\n trap.container,\n ]);\n } finally {\n reclaiming = false;\n }\n}\n\nfunction ensureListeners(state: TrapState): void {\n if (state.listeners || typeof document === 'undefined') return;\n const doc = document;\n doc.addEventListener('keydown', handleKeyDown);\n doc.addEventListener('focusin', handleFocusIn, true);\n state.listeners = {\n remove() {\n doc.removeEventListener('keydown', handleKeyDown);\n doc.removeEventListener('focusin', handleFocusIn, true);\n },\n };\n}\n\nfunction pushTrap(entry: TrapEntry): () => void {\n const state = getState();\n state.traps.push(entry);\n ensureListeners(state);\n return () => {\n const index = state.traps.indexOf(entry);\n if (index !== -1) state.traps.splice(index, 1);\n if (state.traps.length === 0) {\n state.listeners?.remove();\n state.listeners = null;\n }\n };\n}\n\nfunction resolveInitialFocus(\n container: HTMLElement,\n initialFocus: UseFocusTrapOptions['initialFocus'],\n): Array<HTMLElement | null> {\n const first = getFirstTabbable(container);\n if (initialFocus === 'container') return [container];\n if (initialFocus === undefined || initialFocus === 'first') return [first, container];\n const chosen = typeof initialFocus === 'function' ? initialFocus() : initialFocus.current;\n return [chosen, first, container];\n}\n\n/**\n * Keeps keyboard focus inside `container` while `enabled` (modal dialogs, drawers, the DatePicker\n * calendar). Element-based: pass the surface held in state via a callback ref, so the trap starts\n * when the element appears.\n *\n * - **Initial focus** runs synchronously in the commit in which the container appears (no\n * `requestAnimationFrame`), and does nothing when focus is already inside (an `autoFocus`\n * element wins).\n * - **Tab / Shift+Tab** are handled by a document bubble-phase `keydown` listener that ignores\n * events whose default is already prevented, so a React handler inside (a menu closing on Tab, a\n * grid) can take the key first. Focus wraps at the edges, and from the container itself or a\n * non-tabbable element it continues in document order. Tabbable elements are computed on every\n * keydown (content may change; radio-group stops depend on focus), never cached.\n * - Tabbables inside `[data-wave-focus-trap-allow]` regions (the Toaster viewport) join the cycle.\n * - **Descendant layers** (a popover or menu opened from inside, identified through `layerId`):\n * Tab moves natively inside them; leaving one moves focus to the element after its anchor\n * (Shift+Tab: the anchor itself). Inside a plain `<Portal>` rendered in the surface (no layer,\n * no anchor) Tab is native too; leaving it wraps to the first (Shift+Tab: last) element. A\n * layer's trigger (its anchor, or an element around it such as a tooltip's wrapper) belongs to\n * the region it sits in, so Tab from an open info button or a button showing its tooltip moves\n * on as from any other element of that portal or popover.\n * - Focus that lands outside (not in the container, an allowed region or a descendant layer)\n * returns to the last focused element inside, also when that outside element loses it again\n * (removed or blurred, leaving focus on `<body>`). That is decided in a microtask, once the\n * current commit has run: an `autoFocus` element of a surface opened above the trap (a nested or\n * stacked dialog, a popover opened from the surface) gets focus before that surface's layer and\n * trap exist, and keeps it. The layer's own `refs` (its trigger, outside the container) are\n * outside: opening from the focused trigger still moves focus in, and focus moving back onto\n * the trigger is returned. Focus pulled out again while it is being returned (another focus\n * trap on the page) is left there.\n * - Traps form a stack (shared through the global registry): only the topmost acts.\n */\nexport function useFocusTrap(container: HTMLElement | null, options: UseFocusTrapOptions): void {\n const { enabled } = options;\n const latestRef = useRef(options);\n\n useInsertionEffect(() => {\n latestRef.current = options;\n });\n\n useLayoutEffect(() => {\n if (!enabled || !container) return;\n const latest = latestRef;\n const state = getState();\n state.seq += 1;\n const entry: TrapEntry = {\n container,\n seq: state.seq,\n get layerId() {\n return latest.current.layerId;\n },\n get allowOutsideSelector() {\n return latest.current.allowOutsideSelector ?? ALLOW_OUTSIDE_SELECTOR;\n },\n lastFocused: null,\n };\n const release = pushTrap(entry);\n\n // Initial focus is skipped only when focus is already inside the container or one of its\n // descendant layers (never for the layer's own trigger or an allow-listed toast).\n const active = container.ownerDocument.activeElement as HTMLElement | null;\n const focusInside =\n !!active &&\n (container.contains(active) ||\n (!active.closest(entry.allowOutsideSelector) &&\n isInsideDescendantLayers(latest.current.layerId, active)));\n if (focusInside) {\n entry.lastFocused = active;\n } else {\n focusFirstPossible(resolveInitialFocus(container, latest.current.initialFocus));\n const now = container.ownerDocument.activeElement as HTMLElement | null;\n if (now && container.contains(now)) entry.lastFocused = now;\n }\n return release;\n }, [enabled, container]);\n}\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ "use client";const e=require("./useEventCallback.cjs");let t=require("react");function n(e,t){let n=t??e.getAttribute(`form`)??void 0;if(n!==void 0){let t=e.getRootNode(),r=(`getElementById`in t&&typeof t.getElementById==`function`?t:e.ownerDocument).getElementById(n);return r instanceof HTMLFormElement?r:null}return e.closest(`form`)}function r(r,i,a){let o=e.useEventCallback(i);(0,t.useEffect)(()=>{let e=r.current?.getRootNode()??(typeof document<`u`?document:null);if(!e)return;let t=e=>{if(e.defaultPrevented)return;let t=r.current;t&&e.target===n(t,a)&&o()};return e.addEventListener(`reset`,t),()=>e.removeEventListener(`reset`,t)},[r,a,o])}exports.useFormReset=r;
2
+ //# sourceMappingURL=useFormReset.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useFormReset.cjs","names":["useEventCallback","require_useEventCallback","react","findForm","id","formId","control","root","el","useFormReset","handleReset","onReset","controlRef","listener","event","current","form"],"sources":["../../src/hooks/useFormReset.ts"],"sourcesContent":["import { useEffect } from 'react';\nimport type * as React from 'react';\nimport { useEventCallback } from './useEventCallback';\n\n/**\n * The form a control belongs to: the form whose id is `formId` (the component's `form` prop), else\n * the control element's own `form` attribute, else the closest ancestor `<form>`. A `form` id that\n * matches no form means \"no form\" (like the native `form` attribute), not the ancestor form.\n */\nfunction findForm(control: HTMLElement, formId: string | undefined): HTMLFormElement | null {\n const id = formId ?? control.getAttribute('form') ?? undefined;\n if (id !== undefined) {\n const root = control.getRootNode();\n const scope: Pick<Document, 'getElementById'> =\n 'getElementById' in root && typeof root.getElementById === 'function'\n ? (root as Document | ShadowRoot)\n : control.ownerDocument;\n const el = scope.getElementById(id);\n return el instanceof HTMLFormElement ? el : null;\n }\n return control.closest('form');\n}\n\n/**\n * Resets a value control with its form (C-FORMS, spec §2.5). When the form the control belongs to\n * fires `reset` and no handler cancelled it, `onReset` is called — restore the control's default\n * value there. The form is found **from the control element** (its `form` id, else the closest\n * `<form>`), so uncontrolled controls reset even without a `name`/`HiddenInput`.\n *\n * The listener sits on the control's root node (document or shadow root) and runs in the bubble\n * phase, after the form's own and React's `onReset` handlers, so a reset they cancel is ignored.\n * `onReset` runs synchronously in the `reset` event; the latest callback is always used.\n *\n * @param controlRef The focusable control element (or the component root inside the form).\n * @param onReset Restores the default value.\n * @param form The component's `form` prop (id of a form elsewhere in the document).\n *\n * @example\n * useFormReset(buttonRef, () => setValue(defaultValue ?? ''), form);\n */\nexport function useFormReset(\n controlRef: React.RefObject<HTMLElement | null>,\n onReset: () => void,\n form?: string,\n): void {\n const handleReset = useEventCallback(onReset);\n\n useEffect(() => {\n const control = controlRef.current;\n const root: Node | null =\n control?.getRootNode() ?? (typeof document !== 'undefined' ? document : null);\n if (!root) return;\n const listener = (event: Event) => {\n if (event.defaultPrevented) return;\n const current = controlRef.current;\n if (!current || event.target !== findForm(current, form)) return;\n handleReset();\n };\n root.addEventListener('reset', listener);\n return () => root.removeEventListener('reset', listener);\n }, [controlRef, form, handleReset]);\n}\n"],"mappings":"8EASA,SAASG,EAAS,EAAsB,EAAoD,CAC1F,IAAMC,EAAKC,GAAUC,EAAQ,aAAa,MAAM,GAAK,IAAA,GACrD,GAAIF,IAAO,IAAA,GAAW,CACpB,IAAMG,EAAOD,EAAQ,YAAY,EAK3BE,GAHJ,mBAAoBD,GAAQ,OAAOA,EAAK,gBAAmB,WACtDA,EACDD,EAAQ,cAAA,CACG,eAAeF,CAAE,EAClC,OAAOI,aAAc,gBAAkBA,EAAK,IAC9C,CACA,OAAOF,EAAQ,QAAQ,MAAM,CAC/B,CAmBA,SAAgBG,EACd,EACA,EACA,EACM,CACN,IAAMC,EAAcV,EAAAA,iBAAiBW,CAAO,GAE5C,EAAAT,EAAA,UAAA,KAAgB,CAEd,IAAMK,EADUK,EAAW,SAEhB,YAAY,IAAM,OAAO,SAAa,IAAc,SAAW,MAC1E,GAAI,CAACL,EAAM,OACX,IAAMM,EAAY,GAAiB,CACjC,GAAIC,EAAM,iBAAkB,OAC5B,IAAMC,EAAUH,EAAW,QACtBG,GAAWD,EAAM,SAAWX,EAASY,EAASC,CAAI,GACvDN,EAAY,CACd,EAEA,OADAH,EAAK,iBAAiB,QAASM,CAAQ,MAC1BN,EAAK,oBAAoB,QAASM,CAAQ,CACzD,EAAG,CAACD,EAAYI,EAAMN,CAAW,CAAC,CACpC"}
@@ -0,0 +1,33 @@
1
+ "use client";
2
+ import { useEventCallback as e } from "./useEventCallback.mjs";
3
+ import { useEffect as t } from "react";
4
+ //#region src/hooks/useFormReset.ts
5
+ function n(e, t) {
6
+ let n = t ?? e.getAttribute("form") ?? void 0;
7
+ if (n !== void 0) {
8
+ let t = e.getRootNode(), r = ("getElementById" in t && typeof t.getElementById == "function" ? t : e.ownerDocument).getElementById(n);
9
+ return r instanceof HTMLFormElement ? r : null;
10
+ }
11
+ return e.closest("form");
12
+ }
13
+ function r(r, i, a) {
14
+ let o = e(i);
15
+ t(() => {
16
+ let e = r.current?.getRootNode() ?? (typeof document < "u" ? document : null);
17
+ if (!e) return;
18
+ let t = (e) => {
19
+ if (e.defaultPrevented) return;
20
+ let t = r.current;
21
+ t && e.target === n(t, a) && o();
22
+ };
23
+ return e.addEventListener("reset", t), () => e.removeEventListener("reset", t);
24
+ }, [
25
+ r,
26
+ a,
27
+ o
28
+ ]);
29
+ }
30
+ //#endregion
31
+ export { r as useFormReset };
32
+
33
+ //# sourceMappingURL=useFormReset.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useFormReset.mjs","names":["findForm","id","formId","control","root","el","useFormReset","handleReset","useEventCallback","onReset","controlRef","listener","event","current","form"],"sources":["../../src/hooks/useFormReset.ts"],"sourcesContent":["import { useEffect } from 'react';\nimport type * as React from 'react';\nimport { useEventCallback } from './useEventCallback';\n\n/**\n * The form a control belongs to: the form whose id is `formId` (the component's `form` prop), else\n * the control element's own `form` attribute, else the closest ancestor `<form>`. A `form` id that\n * matches no form means \"no form\" (like the native `form` attribute), not the ancestor form.\n */\nfunction findForm(control: HTMLElement, formId: string | undefined): HTMLFormElement | null {\n const id = formId ?? control.getAttribute('form') ?? undefined;\n if (id !== undefined) {\n const root = control.getRootNode();\n const scope: Pick<Document, 'getElementById'> =\n 'getElementById' in root && typeof root.getElementById === 'function'\n ? (root as Document | ShadowRoot)\n : control.ownerDocument;\n const el = scope.getElementById(id);\n return el instanceof HTMLFormElement ? el : null;\n }\n return control.closest('form');\n}\n\n/**\n * Resets a value control with its form (C-FORMS, spec §2.5). When the form the control belongs to\n * fires `reset` and no handler cancelled it, `onReset` is called — restore the control's default\n * value there. The form is found **from the control element** (its `form` id, else the closest\n * `<form>`), so uncontrolled controls reset even without a `name`/`HiddenInput`.\n *\n * The listener sits on the control's root node (document or shadow root) and runs in the bubble\n * phase, after the form's own and React's `onReset` handlers, so a reset they cancel is ignored.\n * `onReset` runs synchronously in the `reset` event; the latest callback is always used.\n *\n * @param controlRef The focusable control element (or the component root inside the form).\n * @param onReset Restores the default value.\n * @param form The component's `form` prop (id of a form elsewhere in the document).\n *\n * @example\n * useFormReset(buttonRef, () => setValue(defaultValue ?? ''), form);\n */\nexport function useFormReset(\n controlRef: React.RefObject<HTMLElement | null>,\n onReset: () => void,\n form?: string,\n): void {\n const handleReset = useEventCallback(onReset);\n\n useEffect(() => {\n const control = controlRef.current;\n const root: Node | null =\n control?.getRootNode() ?? (typeof document !== 'undefined' ? document : null);\n if (!root) return;\n const listener = (event: Event) => {\n if (event.defaultPrevented) return;\n const current = controlRef.current;\n if (!current || event.target !== findForm(current, form)) return;\n handleReset();\n };\n root.addEventListener('reset', listener);\n return () => root.removeEventListener('reset', listener);\n }, [controlRef, form, handleReset]);\n}\n"],"mappings":";;;;AASA,SAASA,EAAS,GAAsB,GAAoD;CAC1F,IAAMC,IAAKC,KAAUC,EAAQ,aAAa,MAAM,KAAK,KAAA;CACrD,IAAIF,MAAO,KAAA,GAAW;EACpB,IAAMG,IAAOD,EAAQ,YAAY,GAK3BE,KAHJ,oBAAoBD,KAAQ,OAAOA,EAAK,kBAAmB,aACtDA,IACDD,EAAQ,cAAA,CACG,eAAeF,CAAE;EAClC,OAAOI,aAAc,kBAAkBA,IAAK;CAC9C;CACA,OAAOF,EAAQ,QAAQ,MAAM;AAC/B;AAmBA,SAAgBG,EACd,GACA,GACA,GACM;CACN,IAAMC,IAAcC,EAAiBC,CAAO;CAE5C,QAAgB;EAEd,IAAML,IADUM,EAAW,SAEhB,YAAY,MAAM,OAAO,WAAa,MAAc,WAAW;EAC1E,IAAI,CAACN,GAAM;EACX,IAAMO,KAAY,MAAiB;GACjC,IAAIC,EAAM,kBAAkB;GAC5B,IAAMC,IAAUH,EAAW;GAC3B,AAAKG,KAAWD,EAAM,WAAWZ,EAASa,GAASC,CAAI,KACvDP,EAAY;EACd;EAEA,OADAH,EAAK,iBAAiB,SAASO,CAAQ,SAC1BP,EAAK,oBAAoB,SAASO,CAAQ;CACzD,GAAG;EAACD;EAAYI;EAAMP;CAAW,CAAC;AACpC"}
@@ -0,0 +1,2 @@
1
+ "use client";const e=require("../lib/events.cjs");let t=require("react");var n=1;function r(e){return e!==`touch`&&e!==`pen`}function i({apex:e,a:t,b:n},r,i){let a=(t.x-e.x)*(n.y-e.y)-(t.y-e.y)*(n.x-e.x);if(a===0)return!1;let o=Math.sign(a);return[[e,t],[t,n],[n,e]].every(([e,t])=>{let n=Math.hypot(t.x-e.x,t.y-e.y);return n===0||((t.x-e.x)*(i-e.y)-(t.y-e.y)*(r-e.x))/n*o>=-1})}function a(e,t){if(t.left>=e.right-n)return[{x:t.left,y:t.top},{x:t.left,y:t.bottom}];if(t.right<=e.left+n)return[{x:t.right,y:t.top},{x:t.right,y:t.bottom}];let r=t.top>=e.bottom-n?t.top:t.bottom;return[{x:t.left,y:r},{x:t.right,y:r}]}var o=new WeakMap;function s(){let e=new Set,t={isHeld(t,n){for(let r of e)if(i(r,t,n))return!0;return!1}};return o.set(t,e),t}var c=class{options;open;onTrigger=!1;onSurface=!1;openTimer;closeTimer;lastPoint=null;held=!1;suppressed=!1;closing=!1;zone=null;zoneDocument=null;constructor(e){this.options=e,this.open=e.open}setOptions(e){this.options=e}setOpen(e){e!==this.open&&(this.open=e,e?this.clearOpen():(this.clearClose(),this.endZone(),!this.closing&&this.onTrigger&&(this.suppressed=!0)),this.closing=!1)}triggerEnter=t=>{r(t.pointerType)&&!e.isDisabledTrigger(t)&&(this.onTrigger=!0,this.lastPoint={x:t.clientX,y:t.clientY},this.endZone(),this.clearClose(),this.options.enabled&&!this.options.open&&!this.suppressed&&this.startOpen(t.nativeEvent))};triggerMove=t=>{r(t.pointerType)&&!e.isDisabledTrigger(t)&&(this.lastPoint={x:t.clientX,y:t.clientY},this.held&&this.openTimer===void 0&&(this.held=!1,this.options.enabled&&!this.options.open&&!this.suppressed&&this.startOpen(t.nativeEvent)))};triggerLeave=e=>{r(e.pointerType)&&(this.onTrigger=!1,this.held=!1,this.suppressed=!1,this.clearOpen(),this.options.enabled&&this.options.open&&(this.startZone(e.clientX,e.clientY),this.onSurface||this.startCloseIfAllowed(e.nativeEvent)))};surfaceEnter=e=>{r(e.pointerType)&&(this.onSurface=!0,this.clearClose(),this.endZone())};surfaceLeave=e=>{r(e.pointerType)&&(this.onSurface=!1,this.options.enabled&&this.options.open&&!this.onTrigger&&this.startCloseIfAllowed(e.nativeEvent))};surfaceFocusOut=e=>{let t=e.currentTarget,n=e.relatedTarget;n&&t.contains(n)||this.options.enabled&&this.options.open&&!this.onTrigger&&!this.onSurface&&this.restartClose(e)};startClose=e=>{this.options.enabled&&this.options.open&&!this.onTrigger&&!this.onSurface&&this.restartClose(e)};cancel=()=>{this.clearOpen(),this.clearClose(),this.endZone(),this.held=!1};startOpen(e){this.clearOpen(),this.openTimer=setTimeout(()=>{this.openTimer=void 0;let{enabled:t,open:n,group:r,onOpen:i}=this.options;if(!t||n||this.suppressed||!this.onTrigger)return;let a=this.lastPoint;if(r&&a&&r.isHeld(a.x,a.y)){this.held=!0;return}i(e)},this.options.openDelay)}startCloseIfAllowed(e){this.options.canClose()&&this.restartClose(e)}restartClose(e){this.clearClose(),this.closeTimer=setTimeout(()=>{this.closeTimer=void 0;let{enabled:t,open:n,canClose:r,onClose:i}=this.options;t&&n&&!this.onTrigger&&!this.onSurface&&r()&&(this.closing=!0,this.endZone(),i(e))},this.options.closeDelay)}clearOpen(){this.openTimer!==void 0&&clearTimeout(this.openTimer),this.openTimer=void 0}clearClose(){this.closeTimer!==void 0&&clearTimeout(this.closeTimer),this.closeTimer=void 0}startZone(e,t){this.endZone();let{trigger:n,surface:r,group:i}=this.options;if(!n||!r)return;let s=r.getBoundingClientRect();if(s.width<=0||s.height<=0)return;let[c,l]=a(n.getBoundingClientRect(),s);this.zone={apex:{x:e,y:t},a:c,b:l},i&&o.get(i)?.add(this.zone),this.zoneDocument=n.ownerDocument,this.zoneDocument.addEventListener(`pointermove`,this.documentMove)}endZone(){let{zone:e}=this;if(!e)return;this.zone=null;let{group:t}=this.options;t&&o.get(t)?.delete(e),this.zoneDocument?.removeEventListener(`pointermove`,this.documentMove),this.zoneDocument=null}documentMove=e=>{if(r(e.pointerType)&&this.zone){if(!this.options.open){this.endZone();return}i(this.zone,e.clientX,e.clientY)?this.restartClose(e):this.endZone()}};dispose(){this.cancel()}};function l(e){let[n]=(0,t.useState)(()=>new c(e));(0,t.useInsertionEffect)(()=>{n.setOptions(e)});let{open:r,enabled:i,surface:a}=e;return(0,t.useLayoutEffect)(()=>{n.setOpen(r)},[n,r]),(0,t.useLayoutEffect)(()=>{i||n.cancel()},[n,i]),(0,t.useEffect)(()=>{if(a)return a.addEventListener(`focusout`,n.surfaceFocusOut),()=>a.removeEventListener(`focusout`,n.surfaceFocusOut)},[n,a]),(0,t.useEffect)(()=>()=>n.dispose(),[n]),(0,t.useMemo)(()=>({triggerHandlers:{onPointerEnter:n.triggerEnter,onPointerMove:n.triggerMove,onPointerLeave:n.triggerLeave},surfaceHandlers:{onPointerEnter:n.surfaceEnter,onPointerLeave:n.surfaceLeave},cancel:n.cancel,startClose:n.startClose}),[n])}exports.createHoverIntentGroup=s,exports.useHoverIntent=l;
2
+ //# sourceMappingURL=useHoverIntent.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useHoverIntent.cjs","names":["isDisabledTrigger","useState","useMemo","require_events","react","TOLERANCE","isMouse","pointerType","zoneContains","orientation","a","apex","b","sign","u","v","length","y","x","facingEdge","surface","trigger","groupZones","createHoverIntentGroup","zones","group","zone","HoverController","options","open","event","next","enabled","point","onOpen","canClose","onClose","surfaceRect","useHoverIntent","controller"],"sources":["../../src/hooks/useHoverIntent.ts"],"sourcesContent":["import { useEffect, useInsertionEffect, useLayoutEffect, useMemo, useState } from 'react';\nimport type * as React from 'react';\nimport { isDisabledTrigger } from '../lib/events';\n\n/** Options of {@link useHoverIntent}. */\nexport interface UseHoverIntentOptions {\n /** Whether hover opens and closes the surface. */\n enabled: boolean;\n /** Whether the surface is open (for any reason). */\n open: boolean;\n /** Milliseconds from the pointer entering the trigger to `onOpen`. */\n openDelay: number;\n /** Milliseconds from \"the pointer is on neither the trigger nor the surface\" to `onClose`. */\n closeDelay: number;\n /** The trigger and the surface elements, held in state (C-POPUPS). */\n trigger: HTMLElement | null;\n surface: HTMLElement | null;\n /** Hover asks to open. */\n onOpen: (event: PointerEvent) => void;\n /** Hover asks to close. */\n onClose: (event: Event) => void;\n /**\n * Whether the hover close applies now; read when a close would start and again when it fires.\n * The component returns `false` for a pinned surface (opened or re-activated by click, keys or a\n * context gesture) and while focus is inside the surface's layer tree. Focus on the trigger does\n * not count.\n */\n canClose: () => boolean;\n /** Coordinates the safe zones of sibling triggers (the submenu triggers of one menu list). */\n group?: HoverIntentGroup;\n}\n\n/** Shared by the sibling triggers of one list; create one per list with `createHoverIntentGroup()`. */\nexport interface HoverIntentGroup {\n /** Whether a sibling's active safe zone contains this viewport point. */\n isHeld(x: number, y: number): boolean;\n}\n\n/** Returned by {@link useHoverIntent}; compose the handlers with the consumer's (C-COMPOSE). */\nexport interface HoverIntent {\n triggerHandlers: {\n onPointerEnter: React.PointerEventHandler<HTMLElement>;\n onPointerMove: React.PointerEventHandler<HTMLElement>;\n onPointerLeave: React.PointerEventHandler<HTMLElement>;\n };\n surfaceHandlers: {\n onPointerEnter: React.PointerEventHandler<HTMLElement>;\n onPointerLeave: React.PointerEventHandler<HTMLElement>;\n };\n /** Clears pending timers: call it on click, keyboard and context opens, and on close. */\n cancel: () => void;\n /**\n * Starts the close timer now when the pointer is on neither the trigger nor the surface, for a\n * surface that has just become unpinned (a submenu that lost focus to hover focus). Does nothing\n * while the pointer is on either.\n */\n startClose: (event: Event) => void;\n}\n\ninterface Point {\n x: number;\n y: number;\n}\n\n/** A safe zone: the triangle from the point where the pointer left the trigger to the surface. */\ninterface SafeZone {\n apex: Point;\n a: Point;\n b: Point;\n}\n\n/** Pixels a point may lie outside a triangle, or an edge be off, and still count. */\nconst TOLERANCE = 1;\n\n/** Only a mouse hovers; an event without a pointer type (no PointerEvent support) is a mouse. */\nfunction isMouse(pointerType: string | undefined): boolean {\n return pointerType !== 'touch' && pointerType !== 'pen';\n}\n\n/** Whether the triangle `zone` contains the point, within {@link TOLERANCE}. */\nfunction zoneContains({ apex, a, b }: SafeZone, x: number, y: number): boolean {\n const orientation = (a.x - apex.x) * (b.y - apex.y) - (a.y - apex.y) * (b.x - apex.x);\n if (orientation === 0) return false;\n const sign = Math.sign(orientation);\n const edges: Array<[Point, Point]> = [\n [apex, a],\n [a, b],\n [b, apex],\n ];\n return edges.every(([u, v]) => {\n const length = Math.hypot(v.x - u.x, v.y - u.y);\n if (length === 0) return true;\n const distance = ((v.x - u.x) * (y - u.y) - (v.y - u.y) * (x - u.x)) / length;\n return distance * sign >= -TOLERANCE;\n });\n}\n\n/**\n * The edge of `surface` that faces `trigger`: its left edge when it starts at or after the\n * trigger's right edge, else its right edge when it ends at or before the trigger's left edge,\n * else its top edge when it starts below the trigger, else its bottom edge.\n */\nfunction facingEdge(trigger: DOMRect, surface: DOMRect): [Point, Point] {\n if (surface.left >= trigger.right - TOLERANCE) {\n return [\n { x: surface.left, y: surface.top },\n { x: surface.left, y: surface.bottom },\n ];\n }\n if (surface.right <= trigger.left + TOLERANCE) {\n return [\n { x: surface.right, y: surface.top },\n { x: surface.right, y: surface.bottom },\n ];\n }\n const y = surface.top >= trigger.bottom - TOLERANCE ? surface.top : surface.bottom;\n return [\n { x: surface.left, y },\n { x: surface.right, y },\n ];\n}\n\n/** The active safe zones of each group. */\nconst groupZones = new WeakMap<HoverIntentGroup, Set<SafeZone>>();\n\n/** Creates the group of the sibling triggers of one list (a menu list's submenu triggers). */\nexport function createHoverIntentGroup(): HoverIntentGroup {\n const zones = new Set<SafeZone>();\n const group: HoverIntentGroup = {\n isHeld(x, y) {\n for (const zone of zones) if (zoneContains(zone, x, y)) return true;\n return false;\n },\n };\n groupZones.set(group, zones);\n return group;\n}\n\ntype Timer = ReturnType<typeof setTimeout>;\n\n/**\n * The pointer state and timers of one trigger and its surface. Its fields are written only by its\n * handlers, timers and the hook's effects, never during render.\n */\nclass HoverController {\n private options: UseHoverIntentOptions;\n private open: boolean;\n private onTrigger = false;\n private onSurface = false;\n private openTimer: Timer | undefined;\n private closeTimer: Timer | undefined;\n /** The pointer's last point over the trigger (for the group's hold check). */\n private lastPoint: Point | null = null;\n /** An opening was held by a sibling's safe zone: the next move over the trigger retries. */\n private held = false;\n /** Hover opening is off until the pointer leaves the trigger (dismissed stays dismissed). */\n private suppressed = false;\n /** The hook's own `onClose` asked for the close that is coming. */\n private closing = false;\n private zone: SafeZone | null = null;\n private zoneDocument: Document | null = null;\n\n constructor(options: UseHoverIntentOptions) {\n this.options = options;\n this.open = options.open;\n }\n\n setOptions(options: UseHoverIntentOptions): void {\n this.options = options;\n }\n\n /**\n * Follows the open state. A close the hook did not cause, while the pointer is on the trigger,\n * suppresses hover opening until the pointer leaves it.\n */\n setOpen(open: boolean): void {\n if (open === this.open) return;\n this.open = open;\n if (open) {\n this.clearOpen();\n } else {\n this.clearClose();\n this.endZone();\n if (!this.closing && this.onTrigger) this.suppressed = true;\n }\n this.closing = false;\n }\n\n triggerEnter = (event: React.PointerEvent<HTMLElement>): void => {\n if (!isMouse(event.pointerType) || isDisabledTrigger(event)) return;\n this.onTrigger = true;\n this.lastPoint = { x: event.clientX, y: event.clientY };\n this.endZone();\n this.clearClose();\n if (this.options.enabled && !this.options.open && !this.suppressed) {\n this.startOpen(event.nativeEvent);\n }\n };\n\n triggerMove = (event: React.PointerEvent<HTMLElement>): void => {\n if (!isMouse(event.pointerType) || isDisabledTrigger(event)) return;\n this.lastPoint = { x: event.clientX, y: event.clientY };\n // Only an opening a sibling's safe zone held is retried by a move.\n if (!this.held || this.openTimer !== undefined) return;\n this.held = false;\n if (this.options.enabled && !this.options.open && !this.suppressed) {\n this.startOpen(event.nativeEvent);\n }\n };\n\n triggerLeave = (event: React.PointerEvent<HTMLElement>): void => {\n if (!isMouse(event.pointerType)) return;\n this.onTrigger = false;\n this.held = false;\n this.suppressed = false;\n this.clearOpen();\n if (!this.options.enabled || !this.options.open) return;\n this.startZone(event.clientX, event.clientY);\n if (!this.onSurface) this.startCloseIfAllowed(event.nativeEvent);\n };\n\n surfaceEnter = (event: React.PointerEvent<HTMLElement>): void => {\n if (!isMouse(event.pointerType)) return;\n this.onSurface = true;\n this.clearClose();\n this.endZone();\n };\n\n surfaceLeave = (event: React.PointerEvent<HTMLElement>): void => {\n if (!isMouse(event.pointerType)) return;\n this.onSurface = false;\n if (!this.options.enabled || !this.options.open || this.onTrigger) return;\n this.startCloseIfAllowed(event.nativeEvent);\n };\n\n /** Focus left the surface's DOM: with the pointer on neither, the close timer starts. */\n surfaceFocusOut = (event: FocusEvent): void => {\n const surface = event.currentTarget as Node;\n const next = event.relatedTarget as Node | null;\n if (next && surface.contains(next)) return;\n if (!this.options.enabled || !this.options.open || this.onTrigger || this.onSurface) return;\n this.restartClose(event);\n };\n\n startClose = (event: Event): void => {\n if (!this.options.enabled || !this.options.open || this.onTrigger || this.onSurface) return;\n this.restartClose(event);\n };\n\n cancel = (): void => {\n this.clearOpen();\n this.clearClose();\n this.endZone();\n this.held = false;\n };\n\n private startOpen(event: PointerEvent): void {\n this.clearOpen();\n this.openTimer = setTimeout(() => {\n this.openTimer = undefined;\n const { enabled, open, group, onOpen } = this.options;\n if (!enabled || open || this.suppressed || !this.onTrigger) return;\n const point = this.lastPoint;\n if (group && point && group.isHeld(point.x, point.y)) {\n this.held = true;\n return;\n }\n onOpen(event);\n }, this.options.openDelay);\n }\n\n private startCloseIfAllowed(event: Event): void {\n if (this.options.canClose()) this.restartClose(event);\n }\n\n private restartClose(event: Event): void {\n this.clearClose();\n this.closeTimer = setTimeout(() => {\n this.closeTimer = undefined;\n const { enabled, open, canClose, onClose } = this.options;\n if (!enabled || !open || this.onTrigger || this.onSurface || !canClose()) return;\n this.closing = true;\n this.endZone();\n onClose(event);\n }, this.options.closeDelay);\n }\n\n private clearOpen(): void {\n if (this.openTimer !== undefined) clearTimeout(this.openTimer);\n this.openTimer = undefined;\n }\n\n private clearClose(): void {\n if (this.closeTimer !== undefined) clearTimeout(this.closeTimer);\n this.closeTimer = undefined;\n }\n\n /** The safe zone from the leave point to the surface's facing edge (a surface with a size). */\n private startZone(x: number, y: number): void {\n this.endZone();\n const { trigger, surface, group } = this.options;\n if (!trigger || !surface) return;\n const surfaceRect = surface.getBoundingClientRect();\n if (surfaceRect.width <= 0 || surfaceRect.height <= 0) return;\n const [a, b] = facingEdge(trigger.getBoundingClientRect(), surfaceRect);\n this.zone = { apex: { x, y }, a, b };\n if (group) groupZones.get(group)?.add(this.zone);\n this.zoneDocument = trigger.ownerDocument;\n this.zoneDocument.addEventListener('pointermove', this.documentMove);\n }\n\n private endZone(): void {\n const { zone } = this;\n if (!zone) return;\n this.zone = null;\n const { group } = this.options;\n if (group) groupZones.get(group)?.delete(zone);\n this.zoneDocument?.removeEventListener('pointermove', this.documentMove);\n this.zoneDocument = null;\n }\n\n /** A mouse move while the zone is active: inside, the close restarts; outside, the zone ends. */\n private documentMove = (event: PointerEvent): void => {\n if (!isMouse(event.pointerType) || !this.zone) return;\n if (!this.options.open) {\n this.endZone();\n return;\n }\n if (zoneContains(this.zone, event.clientX, event.clientY)) this.restartClose(event);\n else this.endZone();\n };\n\n dispose(): void {\n this.cancel();\n }\n}\n\n/**\n * Opens and closes a surface on mouse hover, with a triangular safe zone towards it (Menu,\n * Popover). Internal until the positioning, dismiss and hover pieces become public (ROADMAP\n * P7-01). Compose `triggerHandlers` onto the trigger and `surfaceHandlers` onto the surface, after\n * the consumer's handlers; destructure the result.\n *\n * 1. **Mouse only.** Touch and pen pointer events are ignored; an event without a pointer type is\n * a mouse. Events from an `aria-disabled=\"true\"` element at or inside the trigger open nothing.\n * 2. **Open.** The pointer entering the trigger of a closed surface starts the `openDelay` timer;\n * leaving the trigger first cancels it. When a sibling's safe zone (the `group`) holds the\n * pointer's last point as it fires, it does not open, and the next `pointermove` over the\n * trigger starts it again (moves restart nothing otherwise).\n * 3. **Close.** When the pointer leaves the trigger or the surface, is over neither and\n * `canClose()` is `true`, the `closeDelay` timer starts; at expiry `canClose()` is read again.\n * The pointer entering the trigger or the surface cancels it (React enter and leave follow the\n * component tree, so a portal rendered inside the surface counts as inside). Focus leaving the\n * surface while the pointer is over neither, and `startClose()`, start the same timer.\n * 4. **Safe zone.** When the pointer leaves the trigger of an open surface that has a size, the\n * triangle from the leave point to the surface's facing edge is active: every mouse move inside\n * it restarts the close timer, so the surface stays open while the pointer moves towards it and\n * closes `closeDelay` after it stops; a move outside ends the zone and leaves the timer alone;\n * entering the surface or the trigger ends it too. The group reports it to the siblings.\n * 5. `cancel()`, closing and unmounting clear the timers and the zone; the document listener\n * exists only while a zone is active.\n * 6. **Dismissed stays dismissed.** When the surface closes without the hook's own `onClose`\n * (Escape, an outside press, item activation, a controlled close) while the pointer is on the\n * trigger, hover opening is off until the pointer leaves the trigger.\n */\nexport function useHoverIntent(options: UseHoverIntentOptions): HoverIntent {\n const [controller] = useState(() => new HoverController(options));\n\n // The latest options, before any layout effect or event handler reads them.\n useInsertionEffect(() => {\n controller.setOptions(options);\n });\n\n const { open, enabled, surface } = options;\n useLayoutEffect(() => {\n controller.setOpen(open);\n }, [controller, open]);\n\n useLayoutEffect(() => {\n if (!enabled) controller.cancel();\n }, [controller, enabled]);\n\n useEffect(() => {\n if (!surface) return undefined;\n surface.addEventListener('focusout', controller.surfaceFocusOut);\n return () => surface.removeEventListener('focusout', controller.surfaceFocusOut);\n }, [controller, surface]);\n\n useEffect(() => () => controller.dispose(), [controller]);\n\n return useMemo<HoverIntent>(\n () => ({\n triggerHandlers: {\n onPointerEnter: controller.triggerEnter,\n onPointerMove: controller.triggerMove,\n onPointerLeave: controller.triggerLeave,\n },\n surfaceHandlers: {\n onPointerEnter: controller.surfaceEnter,\n onPointerLeave: controller.surfaceLeave,\n },\n cancel: controller.cancel,\n startClose: controller.startClose,\n }),\n [controller],\n );\n}\n"],"mappings":"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"}