haze-ui 1.26.0 → 1.28.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 (479) hide show
  1. package/README.md +420 -36
  2. package/dist/components/Anchor/Anchor.js +78 -0
  3. package/dist/components/Anchor/index.js +3 -0
  4. package/dist/components/AppShell/AppShell.js +44 -0
  5. package/dist/components/AppShell/index.js +3 -0
  6. package/dist/components/AspectRatio/AspectRatio.js +0 -1
  7. package/dist/components/AspectRatio/index.js +0 -1
  8. package/dist/components/Badge/Badge.js +5 -17
  9. package/dist/components/Badge/badge-styles.js +15 -0
  10. package/dist/components/Badge/index.js +3 -3
  11. package/dist/components/BottomSheet/BottomSheet.js +133 -22
  12. package/dist/components/Button/index.js +4 -3
  13. package/dist/components/Calendar/Calendar.js +525 -78
  14. package/dist/components/Calendar/date.js +35 -2
  15. package/dist/components/Card/Card.js +0 -1
  16. package/dist/components/Card/index.js +0 -1
  17. package/dist/components/Carousel/Carousel.js +64 -41
  18. package/dist/components/Cascader/Cascader.js +222 -140
  19. package/dist/components/Chart/Chart.js +34 -0
  20. package/dist/components/Chart/chart-elements.js +164 -0
  21. package/dist/components/Chart/index.js +3 -0
  22. package/dist/components/ChatContainer/ChatContainer.js +36 -16
  23. package/dist/components/ChatInput/ChatInput.js +49 -29
  24. package/dist/components/ChatMessage/ChatMessage.js +76 -29
  25. package/dist/components/Checkbox/Checkbox.js +6 -5
  26. package/dist/components/Checkbox/CheckboxCore.js +6 -5
  27. package/dist/components/CodeBlock/CodeBlock.js +39 -10
  28. package/dist/components/CodeBlock/index.js +0 -1
  29. package/dist/components/Collapsible/Collapsible.js +23 -10
  30. package/dist/components/ColorPicker/ColorPicker.js +5 -4
  31. package/dist/components/ColorPicker/ColorPickerCore.js +5 -4
  32. package/dist/components/Combobox/Combobox.js +202 -75
  33. package/dist/components/Combobox/ComboboxGroup.js +23 -0
  34. package/dist/components/Combobox/ComboboxOption.js +7 -6
  35. package/dist/components/Combobox/index.js +4 -3
  36. package/dist/components/Command/Command.js +102 -59
  37. package/dist/components/Command/CommandDialog.js +48 -0
  38. package/dist/components/Command/command-filter.js +16 -0
  39. package/dist/components/Command/index.js +3 -2
  40. package/dist/components/ConfirmDialog/ConfirmDialog.js +3 -3
  41. package/dist/components/Container/Container.js +0 -1
  42. package/dist/components/Container/index.js +0 -1
  43. package/dist/components/ContextMenu/ContextMenuContent.js +4 -4
  44. package/dist/components/DataTable/CellEditor.js +38 -0
  45. package/dist/components/DataTable/DataTable.js +394 -143
  46. package/dist/components/DataTable/csv.js +29 -0
  47. package/dist/components/DataTable/features.js +25 -0
  48. package/dist/components/DataTable/index.js +3 -1
  49. package/dist/components/DataTable/summary.js +17 -0
  50. package/dist/components/DateRangePicker/DateRangePicker.js +31 -13
  51. package/dist/components/DateRangePicker/DateRangePickerCore.js +59 -27
  52. package/dist/components/DateRangePicker/presets.js +43 -0
  53. package/dist/components/Datepicker/Datepicker.js +17 -12
  54. package/dist/components/Datepicker/DatepickerCore.js +73 -39
  55. package/dist/components/Datepicker/datetime.js +23 -0
  56. package/dist/components/Descriptions/Descriptions.js +46 -0
  57. package/dist/components/Descriptions/index.js +3 -0
  58. package/dist/components/Dialog/Dialog.js +56 -32
  59. package/dist/components/DiffViewer/DiffViewer.js +31 -30
  60. package/dist/components/Divider/Divider.js +0 -1
  61. package/dist/components/Divider/index.js +0 -1
  62. package/dist/components/Drawer/Drawer.js +49 -29
  63. package/dist/components/DropdownMenu/DropdownMenu.js +38 -26
  64. package/dist/components/DropdownMenu/DropdownMenuSub.js +23 -0
  65. package/dist/components/DropdownMenu/DropdownMenuSubContent.js +24 -0
  66. package/dist/components/DropdownMenu/DropdownMenuSubTrigger.js +30 -0
  67. package/dist/components/DropdownMenu/index.js +4 -1
  68. package/dist/components/FilePreview/FilePreview.js +135 -0
  69. package/dist/components/FilePreview/file-preview-format.js +23 -0
  70. package/dist/components/FilePreview/index.js +3 -0
  71. package/dist/components/Flex/Flex.js +0 -1
  72. package/dist/components/Flex/index.js +0 -1
  73. package/dist/components/FloatButton/FloatButton.js +42 -0
  74. package/dist/components/FloatButton/FloatButtonGroup.js +58 -0
  75. package/dist/components/FloatButton/float-button-context.js +9 -0
  76. package/dist/components/FloatButton/float-button-glyphs.js +26 -0
  77. package/dist/components/FloatButton/float-button-styles.js +14 -0
  78. package/dist/components/FloatButton/index.js +4 -0
  79. package/dist/components/Fullscreen/Fullscreen.js +29 -0
  80. package/dist/components/Fullscreen/index.js +3 -0
  81. package/dist/components/Grid/Grid.js +0 -1
  82. package/dist/components/Grid/GridItem.js +0 -1
  83. package/dist/components/Grid/index.js +0 -1
  84. package/dist/components/Icon/Icon.js +0 -1
  85. package/dist/components/Icon/index.js +0 -1
  86. package/dist/components/Image/Image.js +37 -19
  87. package/dist/components/Image/ImagePreview.js +233 -0
  88. package/dist/components/InlineCompletion/InlineCompletion.js +81 -0
  89. package/dist/components/InlineCompletion/index.js +3 -0
  90. package/dist/components/Input/Input.js +6 -5
  91. package/dist/components/Input/InputCore.js +3 -2
  92. package/dist/components/JsonView/JsonView.js +209 -0
  93. package/dist/components/JsonView/index.js +3 -0
  94. package/dist/components/JsonView/json-view-utils.js +24 -0
  95. package/dist/components/Kbd/Kbd.js +0 -1
  96. package/dist/components/Kbd/index.js +0 -1
  97. package/dist/components/LocaleProvider/LocaleProvider.js +16 -13
  98. package/dist/components/LocaleProvider/index.js +5 -3
  99. package/dist/components/LocaleProvider/ja-jp.js +222 -0
  100. package/dist/components/LocaleProvider/locale.js +99 -5
  101. package/dist/components/LocaleProvider/strings.js +15 -0
  102. package/dist/components/LocaleProvider/useStrings.js +13 -11
  103. package/dist/components/LocaleProvider/zh-cn.js +99 -5
  104. package/dist/components/Masonry/Masonry.js +29 -0
  105. package/dist/components/Masonry/index.js +3 -0
  106. package/dist/components/Masonry/masonry-distribute.js +15 -0
  107. package/dist/components/Mentions/Mentions.js +6 -5
  108. package/dist/components/Mentions/MentionsCore.js +69 -68
  109. package/dist/components/Menu/Menu.js +5 -5
  110. package/dist/components/Menu/MenuSub.js +23 -0
  111. package/dist/components/Menu/MenuSubContent.js +24 -0
  112. package/dist/components/Menu/MenuSubTrigger.js +30 -0
  113. package/dist/components/Menu/index.js +4 -1
  114. package/dist/components/NumberInput/NumberInput.js +6 -5
  115. package/dist/components/NumberInput/NumberInputCore.js +9 -8
  116. package/dist/components/OTPInput/OTPInput.js +5 -4
  117. package/dist/components/OTPInput/OTPInputCore.js +34 -33
  118. package/dist/components/PasswordInput/PasswordInput.js +5 -4
  119. package/dist/components/PasswordInput/PasswordInputCore.js +8 -7
  120. package/dist/components/Popover/Popover.js +43 -31
  121. package/dist/components/PromptInput/PromptInput.js +213 -0
  122. package/dist/components/PromptInput/index.js +3 -0
  123. package/dist/components/Radio/Radio.js +7 -6
  124. package/dist/components/Radio/RadioGroup.js +5 -4
  125. package/dist/components/Radio/RadioGroupCore.js +23 -14
  126. package/dist/components/Rating/Rating.js +5 -4
  127. package/dist/components/Rating/RatingCore.js +62 -28
  128. package/dist/components/Resizable/index.js +1 -1
  129. package/dist/components/Segmented/Segmented.js +5 -4
  130. package/dist/components/Segmented/SegmentedCore.js +22 -18
  131. package/dist/components/Select/OptionGroup.js +12 -0
  132. package/dist/components/Select/Select.js +20 -9
  133. package/dist/components/Select/SelectCore.js +74 -13
  134. package/dist/components/Select/SelectFloating.js +256 -0
  135. package/dist/components/Select/index.js +5 -4
  136. package/dist/components/Select/select-options.js +57 -0
  137. package/dist/components/Sidebar/Sidebar.js +9 -9
  138. package/dist/components/Signature/Signature.js +165 -0
  139. package/dist/components/Signature/index.js +3 -0
  140. package/dist/components/Signature/signature-points.js +28 -0
  141. package/dist/components/Skeleton/Skeleton.js +0 -1
  142. package/dist/components/Skeleton/index.js +0 -1
  143. package/dist/components/Slider/Slider.js +16 -8
  144. package/dist/components/Slider/SliderCore.js +75 -12
  145. package/dist/components/Sources/Sources.js +109 -0
  146. package/dist/components/Sources/index.js +3 -0
  147. package/dist/components/Stat/Stat.js +0 -1
  148. package/dist/components/Stat/index.js +0 -1
  149. package/dist/components/Switch/Switch.js +6 -5
  150. package/dist/components/Switch/SwitchCore.js +3 -2
  151. package/dist/components/Tabs/Tab.js +7 -4
  152. package/dist/components/Tabs/TabList.js +38 -7
  153. package/dist/components/Tabs/TabPanel.js +4 -3
  154. package/dist/components/Tabs/Tabs.js +11 -6
  155. package/dist/components/TagGroup/SortableTagGroup.js +26 -0
  156. package/dist/components/TagGroup/TagGroup.js +4 -6
  157. package/dist/components/TagGroup/TagGroupItem.js +17 -11
  158. package/dist/components/TagGroup/index.js +2 -1
  159. package/dist/components/TagGroup/tag-group-styles.js +7 -0
  160. package/dist/components/TagInput/SortableTagInput.js +24 -0
  161. package/dist/components/TagInput/SortableTagInputCore.js +52 -0
  162. package/dist/components/TagInput/TagInput.js +5 -4
  163. package/dist/components/TagInput/TagInputCore.js +71 -57
  164. package/dist/components/TagInput/index.js +3 -1
  165. package/dist/components/TagInput/tag-input-styles.js +7 -0
  166. package/dist/components/Textarea/Textarea.js +6 -5
  167. package/dist/components/Textarea/TextareaCore.js +3 -2
  168. package/dist/components/TimePicker/TimePicker.js +6 -5
  169. package/dist/components/TimePicker/TimePickerCore.js +3 -2
  170. package/dist/components/Toast/Toast.js +44 -42
  171. package/dist/components/Toast/ToastContainer.js +67 -47
  172. package/dist/components/Toast/ToastContext.js +23 -4
  173. package/dist/components/Toast/toast2.js +63 -28
  174. package/dist/components/Toast/useToast.js +9 -7
  175. package/dist/components/Toggle/Toggle.js +20 -0
  176. package/dist/components/Toggle/ToggleCore.js +31 -0
  177. package/dist/components/Toggle/index.js +4 -0
  178. package/dist/components/Toolbar/Toolbar.js +33 -32
  179. package/dist/components/Toolbar/ToolbarToggle.js +31 -0
  180. package/dist/components/Toolbar/index.js +2 -1
  181. package/dist/components/Tooltip/Tooltip.js +1 -1
  182. package/dist/components/Tour/Tour.js +57 -53
  183. package/dist/components/Tree/Tree.js +265 -80
  184. package/dist/components/Tree/TreeItem.js +91 -55
  185. package/dist/components/Tree/utils.js +82 -10
  186. package/dist/components/Typography/Typography.js +0 -1
  187. package/dist/components/Typography/index.js +0 -1
  188. package/dist/components/Upload/Upload.js +24 -8
  189. package/dist/components/Upload/UploadCore.js +230 -37
  190. package/dist/components/Upload/UploadList.js +300 -0
  191. package/dist/components/Upload/xhr-upload.js +22 -0
  192. package/dist/components/VirtualList/VirtualList.js +84 -56
  193. package/dist/components/Watermark/Watermark.js +55 -0
  194. package/dist/components/Watermark/index.js +3 -0
  195. package/dist/css/anchor.css +2 -0
  196. package/dist/css/app-shell.css +2 -0
  197. package/dist/css/badge.css +1 -1
  198. package/dist/css/bottom-sheet.css +1 -1
  199. package/dist/css/button.css +1 -1
  200. package/dist/css/calendar.css +1 -1
  201. package/dist/css/cascader.css +1 -1
  202. package/dist/css/chart.css +2 -0
  203. package/dist/css/chat-container.css +1 -1
  204. package/dist/css/chat-message.css +1 -1
  205. package/dist/css/combobox.css +3 -2
  206. package/dist/css/command.css +2 -1
  207. package/dist/css/context-menu.css +1 -1
  208. package/dist/css/data-table.css +2 -1
  209. package/dist/css/date-range-picker.css +1 -1
  210. package/dist/css/datepicker.css +2 -2
  211. package/dist/css/descriptions.css +2 -0
  212. package/dist/css/dialog.css +1 -1
  213. package/dist/css/drawer.css +1 -1
  214. package/dist/css/dropdown-menu.css +4 -1
  215. package/dist/css/file-preview.css +2 -0
  216. package/dist/css/float-button.css +2 -0
  217. package/dist/css/image.css +2 -1
  218. package/dist/css/inline-completion.css +2 -0
  219. package/dist/css/json-view.css +2 -0
  220. package/dist/css/masonry.css +2 -0
  221. package/dist/css/menu.css +4 -1
  222. package/dist/css/popover.css +1 -1
  223. package/dist/css/prompt-input.css +2 -0
  224. package/dist/css/rating.css +1 -1
  225. package/dist/css/select.css +3 -1
  226. package/dist/css/signature.css +2 -0
  227. package/dist/css/slider.css +1 -1
  228. package/dist/css/sources.css +2 -0
  229. package/dist/css/tag-group.css +3 -1
  230. package/dist/css/tag-input.css +2 -1
  231. package/dist/css/toggle.css +2 -0
  232. package/dist/css/toolbar.css +1 -0
  233. package/dist/css/tooltip.css +1 -1
  234. package/dist/css/tree.css +2 -2
  235. package/dist/css/upload.css +2 -1
  236. package/dist/css/watermark.css +2 -0
  237. package/dist/css-manifest.json +75 -1
  238. package/dist/form/FormItem.js +55 -50
  239. package/dist/form/FormList.js +79 -0
  240. package/dist/form/index.js +5 -1
  241. package/dist/form/standard-schema.js +16 -0
  242. package/dist/haze-ui.css +61 -30
  243. package/dist/headless/index.js +19 -0
  244. package/dist/hooks/useClickOutside.js +24 -0
  245. package/dist/hooks/useDarkMode.js +27 -0
  246. package/dist/hooks/useFullscreen.js +42 -0
  247. package/dist/hooks/useHotkeys.js +77 -0
  248. package/dist/hooks/useInView.js +27 -0
  249. package/dist/hooks/useLocalStorage.js +8 -0
  250. package/dist/hooks/useMediaQuery.js +2 -1
  251. package/dist/hooks/usePrevious.js +11 -0
  252. package/dist/hooks/useSessionStorage.js +8 -0
  253. package/dist/hooks/useStorageState.js +80 -0
  254. package/dist/index.js +220 -171
  255. package/dist/registry.json +2435 -91
  256. package/dist/tokens/colors.js +0 -1
  257. package/dist/tokens/index.js +0 -1
  258. package/dist/tokens/motion.js +0 -1
  259. package/dist/tokens/oklch.js +0 -1
  260. package/dist/tokens/palette.js +0 -1
  261. package/dist/tokens/registry.js +17 -28
  262. package/dist/tokens/spacing.js +0 -1
  263. package/dist/tokens/typography.js +0 -1
  264. package/dist/types/components/Anchor/Anchor.d.ts +25 -0
  265. package/dist/types/components/Anchor/index.d.ts +2 -0
  266. package/dist/types/components/AppShell/AppShell.d.ts +17 -0
  267. package/dist/types/components/AppShell/index.d.ts +2 -0
  268. package/dist/types/components/Badge/badge-styles.d.ts +21 -0
  269. package/dist/types/components/Badge/index.d.ts +1 -0
  270. package/dist/types/components/BottomSheet/BottomSheet.d.ts +52 -3
  271. package/dist/types/components/BottomSheet/index.d.ts +1 -1
  272. package/dist/types/components/Button/Button.d.ts +7 -0
  273. package/dist/types/components/Button/ButtonLink.d.ts +3 -0
  274. package/dist/types/components/Button/index.d.ts +1 -0
  275. package/dist/types/components/Button/styles.d.ts +17 -0
  276. package/dist/types/components/Calendar/Calendar.d.ts +71 -7
  277. package/dist/types/components/Calendar/date.d.ts +52 -0
  278. package/dist/types/components/Calendar/index.d.ts +1 -1
  279. package/dist/types/components/Cascader/Cascader.d.ts +48 -3
  280. package/dist/types/components/Chart/Chart.d.ts +43 -0
  281. package/dist/types/components/Chart/chart-elements.d.ts +104 -0
  282. package/dist/types/components/Chart/index.d.ts +2 -0
  283. package/dist/types/components/ChatContainer/ChatContainer.d.ts +18 -3
  284. package/dist/types/components/ChatInput/ChatInput.d.ts +11 -1
  285. package/dist/types/components/ChatMessage/ChatMessage.d.ts +13 -1
  286. package/dist/types/components/Checkbox/Checkbox.d.ts +6 -2
  287. package/dist/types/components/Checkbox/CheckboxCore.d.ts +4 -2
  288. package/dist/types/components/CodeBlock/CodeBlock.d.ts +19 -2
  289. package/dist/types/components/CodeBlock/index.d.ts +1 -1
  290. package/dist/types/components/Collapsible/Collapsible.d.ts +24 -2
  291. package/dist/types/components/Collapsible/index.d.ts +1 -1
  292. package/dist/types/components/ColorPicker/ColorPicker.d.ts +7 -1
  293. package/dist/types/components/ColorPicker/ColorPickerCore.d.ts +7 -1
  294. package/dist/types/components/Combobox/Combobox.d.ts +111 -7
  295. package/dist/types/components/Combobox/ComboboxGroup.d.ts +22 -0
  296. package/dist/types/components/Combobox/ComboboxOption.d.ts +7 -2
  297. package/dist/types/components/Combobox/index.d.ts +3 -1
  298. package/dist/types/components/Command/Command.d.ts +70 -6
  299. package/dist/types/components/Command/CommandDialog.d.ts +36 -0
  300. package/dist/types/components/Command/command-filter.d.ts +34 -0
  301. package/dist/types/components/Command/index.d.ts +4 -2
  302. package/dist/types/components/DataTable/CellEditor.d.ts +24 -0
  303. package/dist/types/components/DataTable/DataTable.d.ts +184 -32
  304. package/dist/types/components/DataTable/csv.d.ts +36 -0
  305. package/dist/types/components/DataTable/features.d.ts +124 -0
  306. package/dist/types/components/DataTable/index.d.ts +4 -1
  307. package/dist/types/components/DataTable/summary.d.ts +19 -0
  308. package/dist/types/components/DateRangePicker/DateRangePicker.d.ts +28 -2
  309. package/dist/types/components/DateRangePicker/DateRangePickerCore.d.ts +26 -2
  310. package/dist/types/components/DateRangePicker/index.d.ts +2 -2
  311. package/dist/types/components/DateRangePicker/presets.d.ts +23 -0
  312. package/dist/types/components/Datepicker/Datepicker.d.ts +21 -1
  313. package/dist/types/components/Datepicker/DatepickerCore.d.ts +29 -2
  314. package/dist/types/components/Datepicker/datetime.d.ts +27 -0
  315. package/dist/types/components/Datepicker/index.d.ts +1 -1
  316. package/dist/types/components/Descriptions/Descriptions.d.ts +30 -0
  317. package/dist/types/components/Descriptions/index.d.ts +2 -0
  318. package/dist/types/components/Dialog/Dialog.d.ts +68 -3
  319. package/dist/types/components/Dialog/index.d.ts +1 -1
  320. package/dist/types/components/Drawer/Drawer.d.ts +33 -3
  321. package/dist/types/components/Drawer/index.d.ts +1 -1
  322. package/dist/types/components/DropdownMenu/DropdownMenu.d.ts +23 -3
  323. package/dist/types/components/DropdownMenu/DropdownMenuSub.d.ts +18 -0
  324. package/dist/types/components/DropdownMenu/DropdownMenuSubContent.d.ts +13 -0
  325. package/dist/types/components/DropdownMenu/DropdownMenuSubTrigger.d.ts +14 -0
  326. package/dist/types/components/DropdownMenu/index.d.ts +7 -1
  327. package/dist/types/components/FilePreview/FilePreview.d.ts +35 -0
  328. package/dist/types/components/FilePreview/file-preview-format.d.ts +20 -0
  329. package/dist/types/components/FilePreview/index.d.ts +2 -0
  330. package/dist/types/components/FloatButton/FloatButton.d.ts +43 -0
  331. package/dist/types/components/FloatButton/FloatButtonGroup.d.ts +33 -0
  332. package/dist/types/components/FloatButton/float-button-context.d.ts +11 -0
  333. package/dist/types/components/FloatButton/float-button-glyphs.d.ts +3 -0
  334. package/dist/types/components/FloatButton/float-button-styles.d.ts +58 -0
  335. package/dist/types/components/FloatButton/index.d.ts +4 -0
  336. package/dist/types/components/Fullscreen/Fullscreen.d.ts +34 -0
  337. package/dist/types/components/Fullscreen/index.d.ts +3 -0
  338. package/dist/types/components/Image/Image.d.ts +20 -5
  339. package/dist/types/components/Image/ImagePreview.d.ts +13 -0
  340. package/dist/types/components/Image/index.d.ts +1 -1
  341. package/dist/types/components/InlineCompletion/InlineCompletion.d.ts +29 -0
  342. package/dist/types/components/InlineCompletion/index.d.ts +2 -0
  343. package/dist/types/components/Input/Input.d.ts +5 -2
  344. package/dist/types/components/Input/InputCore.d.ts +4 -2
  345. package/dist/types/components/JsonView/JsonView.d.ts +26 -0
  346. package/dist/types/components/JsonView/index.d.ts +2 -0
  347. package/dist/types/components/JsonView/json-view-utils.d.ts +22 -0
  348. package/dist/types/components/LocaleProvider/LocaleContext.d.ts +9 -0
  349. package/dist/types/components/LocaleProvider/LocaleProvider.d.ts +12 -1
  350. package/dist/types/components/LocaleProvider/index.d.ts +3 -0
  351. package/dist/types/components/LocaleProvider/ja-jp.d.ts +13 -0
  352. package/dist/types/components/LocaleProvider/locale.d.ts +100 -0
  353. package/dist/types/components/LocaleProvider/strings.d.ts +28 -0
  354. package/dist/types/components/Masonry/Masonry.d.ts +34 -0
  355. package/dist/types/components/Masonry/index.d.ts +2 -0
  356. package/dist/types/components/Masonry/masonry-distribute.d.ts +16 -0
  357. package/dist/types/components/Mentions/Mentions.d.ts +5 -2
  358. package/dist/types/components/Mentions/MentionsCore.d.ts +4 -2
  359. package/dist/types/components/Menu/MenuSub.d.ts +18 -0
  360. package/dist/types/components/Menu/MenuSubContent.d.ts +12 -0
  361. package/dist/types/components/Menu/MenuSubTrigger.d.ts +14 -0
  362. package/dist/types/components/Menu/index.d.ts +6 -0
  363. package/dist/types/components/NumberInput/NumberInput.d.ts +5 -2
  364. package/dist/types/components/NumberInput/NumberInputCore.d.ts +4 -2
  365. package/dist/types/components/OTPInput/OTPInput.d.ts +5 -1
  366. package/dist/types/components/OTPInput/OTPInputCore.d.ts +4 -1
  367. package/dist/types/components/PasswordInput/PasswordInput.d.ts +5 -1
  368. package/dist/types/components/PasswordInput/PasswordInputCore.d.ts +4 -1
  369. package/dist/types/components/Popover/Popover.d.ts +41 -3
  370. package/dist/types/components/Popover/index.d.ts +1 -1
  371. package/dist/types/components/PromptInput/PromptInput.d.ts +46 -0
  372. package/dist/types/components/PromptInput/index.d.ts +2 -0
  373. package/dist/types/components/Radio/Radio.d.ts +5 -2
  374. package/dist/types/components/Radio/RadioGroup.d.ts +8 -2
  375. package/dist/types/components/Radio/RadioGroupCore.d.ts +7 -2
  376. package/dist/types/components/Rating/Rating.d.ts +8 -1
  377. package/dist/types/components/Rating/RatingCore.d.ts +7 -1
  378. package/dist/types/components/Resizable/index.d.ts +2 -0
  379. package/dist/types/components/Segmented/Segmented.d.ts +8 -1
  380. package/dist/types/components/Segmented/SegmentedCore.d.ts +7 -2
  381. package/dist/types/components/Select/OptionGroup.d.ts +16 -0
  382. package/dist/types/components/Select/Select.d.ts +78 -4
  383. package/dist/types/components/Select/SelectCore.d.ts +79 -6
  384. package/dist/types/components/Select/SelectFloating.d.ts +94 -0
  385. package/dist/types/components/Select/index.d.ts +2 -0
  386. package/dist/types/components/Select/select-options.d.ts +53 -0
  387. package/dist/types/components/Signature/Signature.d.ts +51 -0
  388. package/dist/types/components/Signature/index.d.ts +2 -0
  389. package/dist/types/components/Signature/signature-points.d.ts +31 -0
  390. package/dist/types/components/Slider/Slider.d.ts +29 -4
  391. package/dist/types/components/Slider/SliderCore.d.ts +35 -6
  392. package/dist/types/components/Sources/Sources.d.ts +37 -0
  393. package/dist/types/components/Sources/index.d.ts +2 -0
  394. package/dist/types/components/Switch/Switch.d.ts +5 -2
  395. package/dist/types/components/Switch/SwitchCore.d.ts +4 -2
  396. package/dist/types/components/Tabs/TabList.d.ts +7 -0
  397. package/dist/types/components/Tabs/Tabs.d.ts +8 -1
  398. package/dist/types/components/Tabs/TabsContext.d.ts +20 -0
  399. package/dist/types/components/Tabs/index.d.ts +1 -0
  400. package/dist/types/components/TagGroup/SortableTagGroup.d.ts +20 -0
  401. package/dist/types/components/TagGroup/TagGroup.d.ts +3 -0
  402. package/dist/types/components/TagGroup/index.d.ts +2 -0
  403. package/dist/types/components/TagGroup/tag-group-styles.d.ts +7 -0
  404. package/dist/types/components/TagInput/SortableTagInput.d.ts +34 -0
  405. package/dist/types/components/TagInput/SortableTagInputCore.d.ts +18 -0
  406. package/dist/types/components/TagInput/TagInput.d.ts +5 -1
  407. package/dist/types/components/TagInput/TagInputCore.d.ts +6 -2
  408. package/dist/types/components/TagInput/index.d.ts +4 -0
  409. package/dist/types/components/TagInput/tag-input-styles.d.ts +12 -0
  410. package/dist/types/components/Textarea/Textarea.d.ts +5 -2
  411. package/dist/types/components/Textarea/TextareaCore.d.ts +4 -2
  412. package/dist/types/components/TimePicker/TimePicker.d.ts +5 -2
  413. package/dist/types/components/TimePicker/TimePickerCore.d.ts +4 -2
  414. package/dist/types/components/Toast/Toast.d.ts +31 -2
  415. package/dist/types/components/Toast/ToastContainer.d.ts +11 -1
  416. package/dist/types/components/Toast/ToastContext.d.ts +44 -3
  417. package/dist/types/components/Toast/index.d.ts +1 -1
  418. package/dist/types/components/Toast/toast.d.ts +35 -4
  419. package/dist/types/components/Toast/useToast.d.ts +16 -4
  420. package/dist/types/components/Toggle/Toggle.d.ts +19 -0
  421. package/dist/types/components/Toggle/ToggleCore.d.ts +23 -0
  422. package/dist/types/components/Toggle/index.d.ts +4 -0
  423. package/dist/types/components/Toolbar/ToolbarToggle.d.ts +19 -0
  424. package/dist/types/components/Toolbar/index.d.ts +2 -0
  425. package/dist/types/components/Tour/Tour.d.ts +3 -3
  426. package/dist/types/components/Tree/Tree.d.ts +3 -3
  427. package/dist/types/components/Tree/TreeItem.d.ts +16 -1
  428. package/dist/types/components/Tree/types.d.ts +51 -0
  429. package/dist/types/components/Tree/utils.d.ts +73 -0
  430. package/dist/types/components/Upload/Upload.d.ts +47 -3
  431. package/dist/types/components/Upload/UploadCore.d.ts +95 -4
  432. package/dist/types/components/Upload/UploadList.d.ts +18 -0
  433. package/dist/types/components/Upload/index.d.ts +1 -0
  434. package/dist/types/components/Upload/types.d.ts +60 -0
  435. package/dist/types/components/Upload/xhr-upload.d.ts +20 -0
  436. package/dist/types/components/VirtualList/VirtualList.d.ts +16 -1
  437. package/dist/types/components/Watermark/Watermark.d.ts +32 -0
  438. package/dist/types/components/Watermark/index.d.ts +2 -0
  439. package/dist/types/form/FormItem.d.ts +33 -8
  440. package/dist/types/form/FormList.d.ts +113 -0
  441. package/dist/types/form/index.d.ts +26 -0
  442. package/dist/types/form/standard-schema.d.ts +30 -0
  443. package/dist/types/headless/index.d.ts +399 -0
  444. package/dist/types/hooks/index.d.ts +13 -0
  445. package/dist/types/hooks/useClickOutside.d.ts +46 -0
  446. package/dist/types/hooks/useDarkMode.d.ts +40 -0
  447. package/dist/types/hooks/useFullscreen.d.ts +33 -0
  448. package/dist/types/hooks/useHotkeys.d.ts +53 -0
  449. package/dist/types/hooks/useInView.d.ts +32 -0
  450. package/dist/types/hooks/useLocalStorage.d.ts +33 -0
  451. package/dist/types/hooks/useMediaQuery.d.ts +3 -0
  452. package/dist/types/hooks/usePrevious.d.ts +18 -0
  453. package/dist/types/hooks/useSessionStorage.d.ts +26 -0
  454. package/dist/types/hooks/useStorageState.d.ts +12 -0
  455. package/dist/types/index.d.ts +79 -37
  456. package/dist/types/utils/collision.d.ts +39 -1
  457. package/dist/types/utils/direction.d.ts +22 -0
  458. package/dist/types/utils/floating.d.ts +32 -4
  459. package/dist/types/utils/focus-scope.d.ts +2 -1
  460. package/dist/types/utils/focus.d.ts +2 -1
  461. package/dist/types/utils/menuKeyboard.d.ts +19 -4
  462. package/dist/types/utils/refs.d.ts +16 -0
  463. package/dist/types/utils/sortable-handle.d.ts +25 -0
  464. package/dist/types/utils/sortable-shared.d.ts +30 -0
  465. package/dist/types/utils/sortable.d.ts +36 -0
  466. package/dist/types/utils/submenu.d.ts +63 -0
  467. package/dist/types/utils/view-transition.d.ts +28 -0
  468. package/dist/utils/classnames.js +0 -1
  469. package/dist/utils/collision.js +37 -26
  470. package/dist/utils/direction.js +34 -0
  471. package/dist/utils/floating.js +163 -143
  472. package/dist/utils/menuKeyboard.js +59 -46
  473. package/dist/utils/refs.js +9 -0
  474. package/dist/utils/sortable-handle.js +12 -0
  475. package/dist/utils/sortable-shared.js +16 -0
  476. package/dist/utils/sortable.js +47 -0
  477. package/dist/utils/submenu.js +106 -0
  478. package/dist/utils/view-transition.js +26 -0
  479. package/package.json +169 -16
@@ -0,0 +1,399 @@
1
+ /**
2
+ * `haze-ui/headless` — the behavior layer the haze-ui components are built
3
+ * on, curated for authors assembling their own components: floating-panel
4
+ * positioning (native popover + anchor positioning with graceful fallback
5
+ * tiers), exit-animation presence, focus trapping, tab-order queries,
6
+ * pure collision geometry, menu/submenu keyboard machinery, RTL direction
7
+ * resolution, ref composition, View-Transition-wrapped state flips, and
8
+ * the document-level interaction hooks (click-outside, hotkeys, in-view,
9
+ * media queries) plus the storage-persisted state hooks. Same source,
10
+ * same version, same design tokens as the `haze-ui` component library —
11
+ * the general-purpose hooks and direction helpers are also exported from
12
+ * the main entry; this module gathers the whole behavior layer under one
13
+ * import.
14
+ *
15
+ * Stable public API: this module carries the same semver commitment as
16
+ * the `haze-ui` component library — breaking changes land only on a
17
+ * major version. The primitives still evolve alongside the library's
18
+ * own components, within that contract.
19
+ */
20
+ import { useClickOutside } from '../hooks/useClickOutside';
21
+ import { hotkey, useHotkeys } from '../hooks/useHotkeys';
22
+ import { useInView } from '../hooks/useInView';
23
+ import { useLocalStorage } from '../hooks/useLocalStorage';
24
+ import { useMediaQuery } from '../hooks/useMediaQuery';
25
+ import { usePrevious } from '../hooks/usePrevious';
26
+ import { useSessionStorage } from '../hooks/useSessionStorage';
27
+ import { computeFloatingPosition, resolvePadding } from '../utils/collision';
28
+ import { getDirection, localeDirection, useDirection } from '../utils/direction';
29
+ import { FloatingPanel, floatingPlacementClasses, placeFloatingPanel, supportsAnchorPositioning, supportsNativePopover, useFloating, useFloatingPosition } from '../utils/floating';
30
+ import { focusFirst, getTabbables, isTabbable, TABBABLE_SELECTOR } from '../utils/focus';
31
+ import { useFocusScope } from '../utils/focus-scope';
32
+ import { getEnabledMenuItems, useMenuKeyboard, useRovingTabindex } from '../utils/menuKeyboard';
33
+ import { Presence, whenExitSettles } from '../utils/presence';
34
+ import { mergeRefs } from '../utils/refs';
35
+ import { SUBMENU_CLOSE_GRACE_MS, SUBMENU_OPEN_DELAY_MS, SubmenuProvider, useSubmenu, useSubmenuContext } from '../utils/submenu';
36
+ import { useViewTransitionFlip } from '../utils/view-transition';
37
+ /**
38
+ * Detects the native Popover API (`popover` attribute, top layer,
39
+ * light-dismiss). The floating primitives use this to choose their
40
+ * rendering tier.
41
+ */
42
+ export { supportsNativePopover };
43
+ /**
44
+ * Detects CSS anchor positioning on top of the native Popover API. The
45
+ * floating primitives use this to choose between the declarative anchored
46
+ * tier and JS-assisted positioning.
47
+ */
48
+ export { supportsAnchorPositioning };
49
+ /**
50
+ * The floating-pair behavior hook: pass the open state pair plus trigger
51
+ * and panel refs, receive a `FloatingBehavior` record describing the
52
+ * engine tier and everything to spread on the trigger and panel. This is
53
+ * the same engine Popover, DropdownMenu, Combobox, Datepicker and Tooltip
54
+ * run on.
55
+ */
56
+ export { useFloating };
57
+ /**
58
+ * Options accepted by {@link useFloating}: the open state pair, trigger
59
+ * and panel refs, plus optional animation and collision knobs.
60
+ */
61
+ export type UseFloatingOptions = Parameters<typeof useFloating>[0];
62
+ /**
63
+ * Behavior record returned by {@link useFloating}: tier flags, lifecycle
64
+ * phases (`shown`/`dataState`/`exited`), and the props/class entries to
65
+ * spread on the trigger and panel elements.
66
+ */
67
+ export type { FloatingBehavior } from '../utils/floating';
68
+ /**
69
+ * Panel placement relative to the trigger (`'bottom' | 'bottom-span' |
70
+ * 'bottom-center' | 'bottom-end' | 'top' | 'left' | 'right'`, or
71
+ * `'point'` to position the panel yourself, e.g. at pointer coordinates).
72
+ * Logical, not physical: under `dir="rtl"` the horizontal placements and
73
+ * the start/end alignments mirror automatically.
74
+ */
75
+ export type { FloatingPlacement } from '../utils/floating';
76
+ /**
77
+ * x-class entries placing a panel element relative to its trigger, per
78
+ * engine tier — for consumers composing their own panel instead of using
79
+ * {@link FloatingPanel}.
80
+ */
81
+ export { floatingPlacementClasses };
82
+ /**
83
+ * Imperatively place a fixed panel from the trigger's rect (the
84
+ * JS-positioned tier). Re-run on scroll/resize — or use
85
+ * {@link useFloatingPosition}, which wires that up.
86
+ */
87
+ export { placeFloatingPanel };
88
+ /**
89
+ * Hook that keeps a floating panel positioned on the JS-assisted tiers:
90
+ * tier-2 fixed placement and the tier-1 cross-axis nudge, re-run on
91
+ * scroll and resize.
92
+ */
93
+ export { useFloatingPosition };
94
+ /**
95
+ * The panel half of a floating pair: applies the popover attribute, the
96
+ * anchor custom property and the tier/placement classes, mirrors the
97
+ * animated lifecycle as `data-state`, and runs the JS-assisted position
98
+ * effect. Your visual skin goes in `visualClass`; everything else passes
99
+ * through to the underlying div.
100
+ */
101
+ export { FloatingPanel };
102
+ /**
103
+ * Props accepted by {@link FloatingPanel} — behavior record, optional
104
+ * placement/collision overrides, `visualClass` skin, plus native div
105
+ * attributes.
106
+ */
107
+ export type FloatingPanelProps = Parameters<typeof FloatingPanel>[0];
108
+ /**
109
+ * Keeps a single child mounted while its exit animation runs: the child
110
+ * receives `data-state="open" | "closed"` (render your enter/exit
111
+ * transitions on it) and unmounts only after the exit settles. This is
112
+ * the engine behind haze-ui's animated panels, modals and collapsibles.
113
+ */
114
+ export { Presence };
115
+ /**
116
+ * Props accepted by {@link Presence}: `present`, a single-element
117
+ * `children`, and an optional `onExited` callback.
118
+ */
119
+ export type { PresenceProps } from '../utils/presence';
120
+ /**
121
+ * Wait for an element's exit animation/transition to finish. Resolves
122
+ * immediately when no positive duration is declared, `null` for an
123
+ * element outside the document; repeated calls share the in-flight
124
+ * settle. The imperative companion to {@link Presence}.
125
+ */
126
+ export { whenExitSettles };
127
+ /**
128
+ * Focus-domain hook for overlays: attach the returned ref callback to a
129
+ * container and flip `enabled` to get initial focus, focus restoration
130
+ * and optional Tab trapping — a simplified Radix-style FocusScope with
131
+ * no CSS dependency.
132
+ */
133
+ export { useFocusScope };
134
+ /**
135
+ * Options accepted by {@link useFocusScope}: `enabled`, `trapped`,
136
+ * `autoFocus`, `returnFocus`, and the mount/unmount auto-focus event
137
+ * callbacks (preventable via `event.preventDefault()`).
138
+ */
139
+ export type { FocusScopeOptions } from '../utils/focus-scope';
140
+ /**
141
+ * Tab-order candidate selector (structural filter only; runtime state —
142
+ * disabled, hidden, visibility — is filtered by {@link isTabbable}).
143
+ */
144
+ export { TABBABLE_SELECTOR };
145
+ /**
146
+ * Whether an element is in the Tab order: matches
147
+ * {@link TABBABLE_SELECTOR} and is not disabled, hidden or invisible.
148
+ */
149
+ export { isTabbable };
150
+ /**
151
+ * All tabbable elements inside a container, in DOM order (the container
152
+ * itself excluded).
153
+ */
154
+ export { getTabbables };
155
+ /**
156
+ * Focus the first tabbable element in a container, or the container
157
+ * itself when none exists. Returns whether focus actually transferred —
158
+ * guarding against `focus()` silently no-op-ing on disabled or detached
159
+ * elements.
160
+ */
161
+ export { focusFirst };
162
+ /**
163
+ * Pure floating-panel collision math over literal rects — no DOM, no
164
+ * React: baseline coordinates, then flip on the primary axis, shift on
165
+ * the cross axis, primary-axis clamp. The deterministic core of the
166
+ * JS-positioned tiers.
167
+ */
168
+ export { computeFloatingPosition };
169
+ /**
170
+ * Arguments accepted by {@link computeFloatingPosition}: trigger rect,
171
+ * panel and viewport sizes, placement, per-direction gap, and the
172
+ * resolved strategy record.
173
+ */
174
+ export type ComputeFloatingPositionOptions = Parameters<typeof computeFloatingPosition>[0];
175
+ /**
176
+ * Position resolved by {@link computeFloatingPosition}: panel `top`/
177
+ * `left` and the (possibly flipped) placement side.
178
+ */
179
+ export type FloatingPosition = ReturnType<typeof computeFloatingPosition>;
180
+ /**
181
+ * Normalize a {@link CollisionPadding} into a full per-side record — the
182
+ * padding shape {@link computeFloatingPosition}'s strategy expects.
183
+ */
184
+ export { resolvePadding };
185
+ /**
186
+ * Viewport edge a collision measurement applies to.
187
+ */
188
+ export type { CollisionSide } from '../utils/collision';
189
+ /**
190
+ * Viewport inset for collision checks: a number applies to all four
191
+ * sides, an object per side.
192
+ */
193
+ export type { CollisionPadding } from '../utils/collision';
194
+ /**
195
+ * Collision knobs: `flip` to the opposite side and `shift` along the
196
+ * cross axis when the panel overflows the padded viewport (both default
197
+ * on), plus `collisionPadding`. Consumers may pass any subset.
198
+ */
199
+ export type { CollisionStrategy } from '../utils/collision';
200
+ /**
201
+ * Enabled menu items inside a container, in DOM order. `role="menu"`
202
+ * containers scope each item to its nearest menu ancestor, so a nested
203
+ * submenu's items belong to their own level — the same query the
204
+ * haze-ui menu families' traversal, typeahead and roving tabindex run
205
+ * on. The item selector is customizable for non-menu containers
206
+ * (listboxes, command palettes).
207
+ */
208
+ export { getEnabledMenuItems };
209
+ /**
210
+ * Keyboard behavior for a roving-tabindex item container (WAI-ARIA menu
211
+ * button pattern): the orientation's main-axis arrows move focus
212
+ * wrapping and skipping disabled items (mirrored under `dir="rtl"` for
213
+ * horizontal layouts), Home/End jump to the ends, Escape and Tab close,
214
+ * printable characters run typeahead. Returns the `onKeyDown` handler
215
+ * to spread on the container — the engine DropdownMenu, ContextMenu and
216
+ * Command run on.
217
+ */
218
+ export { useMenuKeyboard };
219
+ /**
220
+ * Options accepted by {@link useMenuKeyboard}: the container ref, the
221
+ * close callback, an optional custom item selector, the submenu-level
222
+ * `onCloseToStart` callback and the layout `orientation`.
223
+ */
224
+ export type UseMenuKeyboardOptions = Parameters<typeof useMenuKeyboard>[0];
225
+ /**
226
+ * Roving tabindex for a menu/listbox container: exactly one item is a
227
+ * tab stop at any time — kept on activation, moved with focus, and
228
+ * re-synced by a MutationObserver when the item set changes (e.g. a
229
+ * filtered list). While `active` is false the effect is inert.
230
+ */
231
+ export { useRovingTabindex };
232
+ /**
233
+ * Options accepted by {@link useRovingTabindex}: the container ref, the
234
+ * `active` flag and an optional custom item selector.
235
+ */
236
+ export type UseRovingTabindexOptions = Parameters<typeof useRovingTabindex>[0];
237
+ /**
238
+ * The nested-submenu mechanism behind `MenuSub*` / `DropdownMenuSub*`:
239
+ * owns the open state (controllable through the `open` option), drives
240
+ * the floating pair, wires hover intent (rest-delayed open, graceful
241
+ * close) and the level-scoped keyboard contract — the inline-end arrow
242
+ * opens focusing the first item, Escape and the inline-start arrow
243
+ * close only this level, Tab closes the whole stack. Returns the
244
+ * behavior record the family components skin.
245
+ */
246
+ export { useSubmenu };
247
+ /**
248
+ * Options accepted by {@link useSubmenu}: the `open` state (controlled
249
+ * control or uncontrolled initial value) and `onOpenChange`, fired on
250
+ * every open transition whatever drove it.
251
+ */
252
+ export type UseSubmenuOptions = Parameters<typeof useSubmenu>[0];
253
+ /**
254
+ * Behavior record returned by {@link useSubmenu}: the open state, the
255
+ * trigger/content refs, the panel id, the floating behavior, and the
256
+ * handlers to spread on the trigger (`onPointerEnter`, `onKeyDown`)
257
+ * and the panel (`onKeyDown`).
258
+ */
259
+ export type { SubmenuBehavior } from '../utils/submenu';
260
+ /**
261
+ * Context provider carrying a {@link SubmenuBehavior} from a Sub
262
+ * container to its trigger/content parts — for authors composing their
263
+ * own submenu skins. Nesting works naturally: each Sub re-provides for
264
+ * its own parts.
265
+ */
266
+ export { SubmenuProvider };
267
+ /**
268
+ * Read the nearest {@link SubmenuBehavior} provided by an enclosing
269
+ * {@link SubmenuProvider}. Throws outside one.
270
+ */
271
+ export { useSubmenuContext };
272
+ /**
273
+ * Pointer rest time before a submenu opens on hover (intent, not
274
+ * rest), in milliseconds.
275
+ */
276
+ export { SUBMENU_OPEN_DELAY_MS };
277
+ /**
278
+ * Grace before a hover-opened submenu closes after the pointer settled
279
+ * outside it, in milliseconds.
280
+ */
281
+ export { SUBMENU_CLOSE_GRACE_MS };
282
+ /**
283
+ * Writing direction of a subtree: `'ltr'` or `'rtl'`.
284
+ */
285
+ export type { Direction } from '../utils/direction';
286
+ /**
287
+ * Direction implied by a BCP 47 tag — RTL primary language subtags
288
+ * (`ar`, `fa`, `he`, `ur`, …) resolve to `'rtl'`, everything else to
289
+ * `'ltr'`; `undefined` when no tag is given.
290
+ */
291
+ export { localeDirection };
292
+ /**
293
+ * Rendered direction of an element: the nearest ancestor carrying a
294
+ * `dir` attribute, `'ltr'` when none does. The layout truth that
295
+ * arrow-key mirroring and JS placement math must follow — read it at
296
+ * event/measure time, never from React state.
297
+ */
298
+ export { getDirection };
299
+ /**
300
+ * Declared direction for the current tree: the LocaleProvider chain's
301
+ * explicit `direction` prop or locale-derived direction, falling back
302
+ * to the document's rendered direction when no provider is mounted.
303
+ * Prefer {@link getDirection} on the concrete element whenever the
304
+ * value must match the painted layout.
305
+ */
306
+ export { useDirection };
307
+ /**
308
+ * Compose several refs (object and/or callback) into one callback ref —
309
+ * the pattern for merging a behavior record's `triggerRef`/`panelRef`
310
+ * with your own element handle on the same node.
311
+ */
312
+ export { mergeRefs };
313
+ /**
314
+ * Wrap a boolean open-state flip in a View Transition — the same outlet
315
+ * the Dialog/Drawer/BottomSheet `viewTransition` prop runs on. Every
316
+ * write executes inside `document.startViewTransition(() =>
317
+ * flushSync(...))`; the full guard chain (disabled,
318
+ * `prefers-reduced-motion: reduce`, unsupported engine) degrades to a
319
+ * direct write. Pass the flag and the `useControl` setter, and use the
320
+ * returned writer wherever the state flips.
321
+ */
322
+ export { useViewTransitionFlip };
323
+ /**
324
+ * Call back on `pointerdown` outside an element: attach the returned
325
+ * stable callback ref to the target, optionally ignore refs (e.g. the
326
+ * trigger), and toggle `enabled` with the panel's open state so a
327
+ * closed overlay costs no listener. Shadow-DOM retargeted clicks are
328
+ * attributed correctly via `event.composedPath()`.
329
+ */
330
+ export { useClickOutside };
331
+ /**
332
+ * Options accepted by {@link useClickOutside}: `enabled` (default
333
+ * `true`) and the `ignore` ref list — elements whose hits do not count
334
+ * as outside.
335
+ */
336
+ export type { UseClickOutsideOptions } from '../hooks/useClickOutside';
337
+ /**
338
+ * Declarative keyboard shortcuts: a map of spec strings (`'mod+k'`,
339
+ * `'ctrl+shift+p'`, `'?'`, named keys) to handlers, listened on the
340
+ * window (or a ref target). `mod` normalizes per platform (⌘ on macOS,
341
+ * Ctrl elsewhere), editable focus suppresses fires unless
342
+ * `allowInInput`, and the map may be an inline literal — a latest-ref
343
+ * keeps the listener mounted once.
344
+ */
345
+ export { useHotkeys };
346
+ /**
347
+ * Combine several hotkey specs into one comma-joined alias binding so
348
+ * a single handler catches any of them:
349
+ * `useHotkeys({ [hotkey('mod+k', 'mod+j')]: cycle })`.
350
+ */
351
+ export { hotkey };
352
+ /**
353
+ * Handler signature {@link useHotkeys} calls with the raw KeyboardEvent
354
+ * (already `preventDefault`-ed and stopped when it fires).
355
+ */
356
+ export type { HotkeyHandler } from '../hooks/useHotkeys';
357
+ /**
358
+ * Options accepted by {@link useHotkeys}: `enabled`, `target` (element
359
+ * ref or `window`), `eventName` and `allowInInput`.
360
+ */
361
+ export type { UseHotkeysOptions } from '../hooks/useHotkeys';
362
+ /**
363
+ * Observe whether an element is in the viewport: attach the returned
364
+ * callback ref and read the `inView` flag. `once: true` freezes after
365
+ * the first intersection (lazy-load style); engines without
366
+ * IntersectionObserver (SSR, jsdom) stay `false` without throwing.
367
+ */
368
+ export { useInView };
369
+ /**
370
+ * Options accepted by {@link useInView}: the IntersectionObserver init
371
+ * members plus the `once` freeze flag.
372
+ */
373
+ export type { UseInViewOptions } from '../hooks/useInView';
374
+ /**
375
+ * Subscribe to a CSS media query and return whether it currently
376
+ * matches; the query can change per render. SSR and hydration snapshots
377
+ * are `false` (no `window` access), and engines without `matchMedia`
378
+ * get a stable `false` instead of a throw.
379
+ */
380
+ export { useMediaQuery };
381
+ /**
382
+ * The value from the previous render; `undefined` on the first.
383
+ * Compared by identity per render — no deep equality.
384
+ */
385
+ export { usePrevious };
386
+ /**
387
+ * localStorage-persisted controllable state: initial-value resolution
388
+ * is persisted value > uncontrolled prop > `initial`, uncontrolled
389
+ * writes persist as JSON, cross-tab updates arrive via `storage`
390
+ * events, and a controlled `control` stays the single source of truth
391
+ * (no write-back). Unavailable storage (private mode) degrades
392
+ * silently to in-memory state.
393
+ */
394
+ export { useLocalStorage };
395
+ /**
396
+ * sessionStorage-persisted controllable state — exactly the semantics
397
+ * of {@link useLocalStorage}, scoped to the tab session.
398
+ */
399
+ export { useSessionStorage };
@@ -1,7 +1,20 @@
1
1
  export { useClipboard } from './useClipboard';
2
2
  export type { UseClipboardResult } from './useClipboard';
3
+ export { useClickOutside } from './useClickOutside';
4
+ export type { UseClickOutsideOptions } from './useClickOutside';
5
+ export { useDarkMode } from './useDarkMode';
6
+ export type { ColorMode, UseDarkModeOptions, UseDarkModeResult } from './useDarkMode';
3
7
  export { useDebouncedCallback } from './useDebouncedCallback';
4
8
  export { useDebouncedValue } from './useDebouncedValue';
9
+ export { useFullscreen } from './useFullscreen';
10
+ export type { FullscreenTarget, UseFullscreenHandle } from './useFullscreen';
11
+ export { useHotkeys, hotkey } from './useHotkeys';
12
+ export type { HotkeyHandler, UseHotkeysOptions } from './useHotkeys';
13
+ export { useInView } from './useInView';
14
+ export type { UseInViewOptions } from './useInView';
15
+ export { useLocalStorage } from './useLocalStorage';
5
16
  export { useMediaQuery } from './useMediaQuery';
6
17
  export { usePrefersReducedMotion } from './usePrefersReducedMotion';
18
+ export { usePrevious } from './usePrevious';
19
+ export { useSessionStorage } from './useSessionStorage';
7
20
  export { useTitle } from './useTitle';
@@ -0,0 +1,46 @@
1
+ import type { RefCallback, RefObject } from 'react';
2
+ type UseClickOutsideOptions = {
3
+ /**
4
+ * 是否启用监听。默认 `true`;`false` 时不绑定任何事件(浮层关闭态
5
+ * 常用,省一次全局监听)。
6
+ */
7
+ enabled?: boolean;
8
+ /**
9
+ * 命中「外部」也要忽略的元素列表(如浮层的 trigger——点 trigger 走
10
+ * 它自己的开合逻辑,不应同时触发 onOutside)。传 RefObject,元素
11
+ * 可晚于监听建立。
12
+ */
13
+ ignore?: (RefObject<Element | null>)[];
14
+ };
15
+ /**
16
+ * 元素外部指针按下回调(document 级 `pointerdown` 监听封装)。
17
+ *
18
+ * ```tsx
19
+ * function Panel() {
20
+ * const [open, setOpen] = useState(false);
21
+ * const triggerRef = useRef<HTMLButtonElement>(null);
22
+ * const panelRef = useClickOutside<HTMLDivElement>(
23
+ * () => setOpen(false),
24
+ * {enabled: open, ignore: [triggerRef]}
25
+ * );
26
+ * return <>
27
+ * <button ref={triggerRef} onClick={() => setOpen(!open)}>…</button>
28
+ * {open && <div ref={panelRef}>…</div>}
29
+ * </>;
30
+ * }
31
+ * ```
32
+ *
33
+ * - 返回稳定回调 ref:挂到目标元素上即可,挂载/卸载自动建立/断开监听。
34
+ * - 用 `event.composedPath()` 判定内外:shadow DOM 的 retarget 点击能
35
+ * 正确归属到宿主元素。
36
+ * - 注意 React portal 不是 shadow DOM:portal 到别处的 DOM 点击按
37
+ * 真实 DOM 树判定为「外部」。portal 面板场景请把返回的 ref 挂到
38
+ * portal 容器上,或把 portal 根加进 `ignore`。
39
+ * - `enabled: false` 时不监听(关闭中的浮层零开销)。
40
+ *
41
+ * @param onOutside 目标元素与 ignore 元素之外发生 pointerdown 时调用。
42
+ * @param options 见 {@link UseClickOutsideOptions}。
43
+ * @returns 挂到目标元素上的回调 ref。
44
+ */
45
+ export declare function useClickOutside<T extends Element>(onOutside: (event: PointerEvent) => void, options?: UseClickOutsideOptions): RefCallback<T>;
46
+ export type { UseClickOutsideOptions };
@@ -0,0 +1,40 @@
1
+ import type { Dispatch, RefObject, SetStateAction } from 'react';
2
+ /**
3
+ * useDarkMode:零成本暗色切换。
4
+ *
5
+ * - 状态源是 `useLocalStorage`(`useControl` 内核):`mode` 持久化到
6
+ * localStorage(默认 key `haze-ui-color-mode`),跨标签页经 storage
7
+ * 事件同步;`isDark` 由 `mode` 派生——`'system'` 时跟随
8
+ * `prefers-color-scheme`(复用 useMediaQuery 的无 matchMedia 守卫)。
9
+ * - 副作用是在目标元素(默认 `document.documentElement`)上切换
10
+ * `lightTheme` / `darkTheme` 两个 token 类——始终恰好挂其一,其余
11
+ * className 不受影响。卸载不摘类:主题是页面级事实,摘类只会闪白。
12
+ * - SSR:渲染期不碰 `document`;effect 不执行,无 DOM 也可安全渲染。
13
+ * storage / matchMedia 缺失时静默降级为纯内存状态(内核既有行为)。
14
+ *
15
+ * ```tsx
16
+ * const [isDark, setIsDark, mode, setMode] = useDarkMode();
17
+ * setIsDark(true); // 等价 setMode('dark'),写入 localStorage
18
+ * setMode('system'); // 重新跟随系统偏好
19
+ * ```
20
+ */
21
+ type ColorMode = 'light' | 'dark' | 'system';
22
+ type UseDarkModeOptions = {
23
+ /** localStorage 持久化键,默认 `'haze-ui-color-mode'`。 */
24
+ storageKey?: string;
25
+ /**
26
+ * 挂主题类的目标元素,接受元素本身或 ref(ref 在 effect 期读取,
27
+ * 同组件渲染的元素此时已挂载)。默认 `document.documentElement`。
28
+ */
29
+ target?: RefObject<HTMLElement | null> | HTMLElement;
30
+ /** 无持久化值时的兜底模式,默认 `'system'`。 */
31
+ defaultMode?: ColorMode;
32
+ };
33
+ type UseDarkModeResult = [
34
+ isDark: boolean,
35
+ setIsDark: Dispatch<SetStateAction<boolean>>,
36
+ mode: ColorMode,
37
+ setMode: Dispatch<SetStateAction<ColorMode>>
38
+ ];
39
+ export declare function useDarkMode(options?: UseDarkModeOptions): UseDarkModeResult;
40
+ export type { ColorMode, UseDarkModeOptions, UseDarkModeResult };
@@ -0,0 +1,33 @@
1
+ import type { RefObject } from 'react';
2
+ /** A fullscreen target: the element itself or a ref holding it. */
3
+ export type FullscreenTarget = HTMLElement | RefObject<HTMLElement | null>;
4
+ export type UseFullscreenHandle = {
5
+ /** Whether the target element is currently fullscreen. */
6
+ readonly isFullscreen: boolean;
7
+ /** Request fullscreen for the target; a no-op when the API is missing. */
8
+ enter: () => void;
9
+ /** Exit fullscreen when the target is the fullscreen element. */
10
+ exit: () => void;
11
+ /** Enter or exit based on what the document currently shows. */
12
+ toggle: () => void;
13
+ };
14
+ /**
15
+ * Track and drive the Fullscreen API for `target` (an element or a ref;
16
+ * defaults to `document.documentElement`).
17
+ *
18
+ * ```tsx
19
+ * const boxRef = useRef<HTMLDivElement>(null);
20
+ * const [isFullscreen, toggle] = useFullscreen(boxRef);
21
+ * <button onClick={toggle}>{isFullscreen ? 'Exit' : 'Enter'} fullscreen</button>
22
+ * ```
23
+ *
24
+ * State mirrors `fullscreenchange`: entering/exiting through any path
25
+ * (toggle, another component, the browser's Esc) updates `isFullscreen` —
26
+ * only when the fullscreen element is *this* target. Engines without the
27
+ * Fullscreen API (jsdom, iOS Safari) degrade to a permanent `false` and
28
+ * no-op commands instead of throwing.
29
+ *
30
+ * @returns `[isFullscreen, toggle, handle]` — the third element bundles the
31
+ * same commands with `isFullscreen` for stable-effect consumers.
32
+ */
33
+ export declare function useFullscreen(target?: FullscreenTarget): [boolean, () => void, UseFullscreenHandle];
@@ -0,0 +1,53 @@
1
+ import type { RefObject } from 'react';
2
+ /** 快捷键命中时收到原始 KeyboardEvent。 */
3
+ export type HotkeyHandler = (event: KeyboardEvent) => void;
4
+ type UseHotkeysOptions = {
5
+ /** `false` 时不挂载任何监听(默认 `true`)。 */
6
+ enabled?: boolean;
7
+ /** 监听目标:元素 ref 或 `window`(默认 `window`,随冒泡捕获全局按键)。 */
8
+ target?: RefObject<HTMLElement | null> | Window;
9
+ /** 监听的键盘事件类型(默认 `'keydown'`)。 */
10
+ eventName?: 'keydown' | 'keyup';
11
+ /** 焦点在 input/textarea/select/contenteditable 内时是否仍触发(默认 `false`)。 */
12
+ allowInInput?: boolean;
13
+ };
14
+ /**
15
+ * 组合多个快捷键规格为一条别名绑定(逗号连接),任一命中即触发同一
16
+ * handler——对象字面量的键只能是字符串,数组规格经由本函数进入。
17
+ *
18
+ * ```tsx
19
+ * useHotkeys({ [hotkey('mod+k', 'mod+j')]: cyclePalette });
20
+ * ```
21
+ *
22
+ * @param specs 至少一个规格,如 `'mod+k'`、`'ctrl+shift+p'`。
23
+ */
24
+ export declare function hotkey(...specs: [string, ...string[]]): string;
25
+ /**
26
+ * 声明式键盘快捷键。映射的键为规格字符串,值为处理器;命中时默认
27
+ * `preventDefault + stopPropagation`,处理器收到原始事件可追加处理。
28
+ *
29
+ * ```tsx
30
+ * useHotkeys({
31
+ * 'mod+k': openCommandPalette, // macOS ⌘K / 其它 Ctrl+K
32
+ * 'ctrl+shift+p': openCommandPalette,
33
+ * '?': showHelp, // 符号键天然携带 shift,无需声明
34
+ * ArrowUp: selectPrev, // 命名键精确匹配
35
+ * [hotkey('mod+k', 'mod+j')]: cycle, // 多规格别名:任一命中
36
+ * }, { allowInInput: false });
37
+ * ```
38
+ *
39
+ * - 规格语法:`[修饰键+]*键`;修饰键别名 mod/ctrl/control/meta/cmd/⌘/
40
+ * shift/alt/option/⌥;`mod` 按平台归一(macOS ⌘,否则 ctrl,
41
+ * `navigator.platform` 判定,SSR 安全)。
42
+ * - 默认焦点在 input/textarea/select/contenteditable 时忽略全部快捷键,
43
+ * `allowInInput: true` 打开。
44
+ * - 一个事件只触发第一个命中的绑定;`hotkeys` 映射每次渲染变化不重挂
45
+ * 监听(latest-ref),`enabled/target/eventName/allowInInput` 变化才
46
+ * 重新绑定。
47
+ * - `enabled: false` 等价于不挂载监听。
48
+ *
49
+ * @param hotkeys 规格(或逗号连接的规格列表)到处理器的映射。
50
+ * @param options 监听行为配置。
51
+ */
52
+ export declare function useHotkeys(hotkeys: Record<string, HotkeyHandler>, options?: UseHotkeysOptions): void;
53
+ export type { UseHotkeysOptions };
@@ -0,0 +1,32 @@
1
+ import type { RefCallback } from 'react';
2
+ type UseInViewOptions = IntersectionObserverInit & {
3
+ /**
4
+ * 命中一次后冻结为 `true` 并断开观察——适用于「进入视口才加载/上报」
5
+ * 这类一次性场景。默认 `false`(持续跟随进出视口切换)。
6
+ */
7
+ once?: boolean;
8
+ };
9
+ /**
10
+ * 观察元素是否进入视口(IntersectionObserver 的 ref 回调封装)。
11
+ *
12
+ * ```tsx
13
+ * function LazyImage() {
14
+ * const [ref, inView] = useInView<HTMLImageElement>({ once: true });
15
+ * // 进入视口前不发起请求;once 命中后冻结,不再重复观察
16
+ * return <img ref={ref} src={inView ? '/real.png' : undefined} alt='' />;
17
+ * }
18
+ * ```
19
+ *
20
+ * - 返回 `[refCallback, inView]`:把回调 ref 挂到目标元素上即可,元素
21
+ * 挂载/卸载自动建立/断开观察;`options` 变化(root/rootMargin/threshold)
22
+ * 会重建 observer。
23
+ * - `once: true`:首次 `isIntersecting` 置 `true` 后 disconnect 并冻结,
24
+ * 后续进出视口不再翻转。
25
+ * - 引擎无 IntersectionObserver(SSR、jsdom):恒返回 `false`、不抛错、
26
+ * 不建立观察。
27
+ *
28
+ * @param options IntersectionObserver 初始化项 + `once`。
29
+ * @returns `[refCallback, inView]`。
30
+ */
31
+ export declare function useInView<T extends Element>(options?: UseInViewOptions): [RefCallback<T>, boolean];
32
+ export type { UseInViewOptions };
@@ -0,0 +1,33 @@
1
+ import type { Dispatch, SetStateAction } from 'react';
2
+ import type { ControlOrValue } from 'react-use-control';
3
+ /**
4
+ * localStorage 持久化的可控状态(`useControl` 作内核,storage 是持久化
5
+ * 副作用而非替代状态源)。
6
+ *
7
+ * ```tsx
8
+ * // 非受控:初值 'light',已持久化值优先;setValue 即写回 localStorage
9
+ * const [theme, setTheme] = useLocalStorage<string>('theme', undefined, 'light');
10
+ * setTheme('dark'); // localStorage.theme === '"dark"'
11
+ *
12
+ * // 受控:control 所有者持有状态,storage 只作初值来源、不回写
13
+ * const [theme, setTheme, themeControl] = useControl(undefined, 'light');
14
+ * <ThemeSwitcher theme={themeControl} onThemeChange={setTheme} />
15
+ * ```
16
+ *
17
+ * - 初值解析顺序(惰性,仅首次挂载求值):已持久化值 > 非受控裸值 >
18
+ * `initial`。损坏的 JSON 回落初始值,并在下一次变更时自愈回合法 JSON。
19
+ * - 非受控:任何变更(含首挂载)即 `JSON.stringify` 写入;跨标签页通过
20
+ * `storage` 事件同步(同 key 多实例同标签页不要求同步——storage 事件
21
+ * 不触发同页文档)。
22
+ * - 受控:不持久化、不订阅 storage 事件——`control` 的所有者是真值来源,
23
+ * 避免双写冲突。
24
+ * - SSR:服务端渲染不访问 `window`,恒返回 `initial`;客户端水合后如与
25
+ * 本地持久化值不同,会以一次重渲收敛(storage 类状态的固有特性)。
26
+ * - 隐私模式 / storage 不可用:读写静默降级为纯内存状态。
27
+ *
28
+ * @param key storage 键。
29
+ * @param control `Control<T>` 受控,或裸 `T` 作非受控初值。
30
+ * @param initial 兜底初始值(支持惰性函数形式)。
31
+ * @returns `[value, setValue]`,语义与 `useState` 一致。
32
+ */
33
+ export declare function useLocalStorage<T>(key: string, control?: ControlOrValue<T>, initial?: T | (() => T)): [T, Dispatch<SetStateAction<T>>];
@@ -10,6 +10,9 @@
10
10
  * - SSR:服务端渲染与 hydration 首帧恒返回 `false`(不访问
11
11
  * `window`、不建立订阅);水合后与真实结果不一致时以一次额外
12
12
  * 渲染收敛,无 hydration mismatch。
13
+ * - 引擎无 `matchMedia`(jsdom 等测试环境):快照恒 `false`、不建立
14
+ * 订阅——消费方(如 usePrefersReducedMotion → View Transitions)
15
+ * 在这类环境下拿到「未匹配」的稳定值而不是 throw。
13
16
  *
14
17
  * @param query CSS 媒体查询字符串,如 `'(min-width: 768px)'`。
15
18
  * @returns 当前是否匹配(SSR 阶段恒为 `false`)。