haze-ui 1.30.0 → 1.32.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 (330) hide show
  1. package/README.md +67 -1
  2. package/dist/components/ActivityRail/ActivityRail.js +76 -0
  3. package/dist/components/ActivityRail/index.js +3 -0
  4. package/dist/components/BottomSheet/BottomSheet.js +12 -26
  5. package/dist/components/Button/Button.js +33 -15
  6. package/dist/components/Button/ButtonLink.js +12 -21
  7. package/dist/components/Button/styles.js +2 -2
  8. package/dist/components/Cascader/Cascader.js +11 -11
  9. package/dist/components/ColorPicker/ColorPicker.js +4 -4
  10. package/dist/components/Combobox/Combobox.js +128 -119
  11. package/dist/components/Command/Command.js +9 -9
  12. package/dist/components/ConfigProvider/ConfigContext.js +16 -0
  13. package/dist/components/ConfirmDialog/confirm.js +41 -0
  14. package/dist/components/ConfirmDialog/index.js +2 -1
  15. package/dist/components/ConversationList/ConversationList.js +16 -7
  16. package/dist/components/DataTable/DataTable.js +24 -24
  17. package/dist/components/DateTimePicker/DateTimePicker.js +25 -0
  18. package/dist/components/DateTimePicker/index.js +3 -0
  19. package/dist/components/Datepicker/Datepicker.js +8 -7
  20. package/dist/components/Datepicker/DatepickerCore.js +60 -59
  21. package/dist/components/Drawer/Drawer.js +45 -40
  22. package/dist/components/Fieldset/Fieldset.js +25 -0
  23. package/dist/components/Fieldset/index.js +2 -0
  24. package/dist/components/Highlight/Highlight.js +19 -0
  25. package/dist/components/Highlight/index.js +2 -0
  26. package/dist/components/Indicator/Indicator.js +37 -0
  27. package/dist/components/Indicator/index.js +2 -0
  28. package/dist/components/InlineCompletion/InlineCompletion.js +4 -4
  29. package/dist/components/Input/Input.js +9 -7
  30. package/dist/components/Input/InputCore.js +32 -13
  31. package/dist/components/List/List.js +14 -10
  32. package/dist/components/LoadingOverlay/LoadingOverlay.js +30 -0
  33. package/dist/components/LoadingOverlay/index.js +3 -0
  34. package/dist/components/LocaleProvider/ar-sa.js +11 -0
  35. package/dist/components/LocaleProvider/de-de.js +11 -0
  36. package/dist/components/LocaleProvider/es-es.js +11 -0
  37. package/dist/components/LocaleProvider/fr-fr.js +11 -0
  38. package/dist/components/LocaleProvider/it-it.js +11 -0
  39. package/dist/components/LocaleProvider/ja-jp.js +11 -0
  40. package/dist/components/LocaleProvider/ko-kr.js +11 -0
  41. package/dist/components/LocaleProvider/locale.js +11 -0
  42. package/dist/components/LocaleProvider/pt-br.js +11 -0
  43. package/dist/components/LocaleProvider/ru-ru.js +11 -0
  44. package/dist/components/LocaleProvider/zh-cn.js +11 -0
  45. package/dist/components/LogViewer/LogViewer.js +45 -38
  46. package/dist/components/Mark/Mark.js +20 -0
  47. package/dist/components/Mark/index.js +2 -0
  48. package/dist/components/Mentions/MentionsCore.js +3 -3
  49. package/dist/components/Menu/MenuItem.js +6 -4
  50. package/dist/components/NumberFormatter/NumberFormatter.js +16 -0
  51. package/dist/components/NumberFormatter/index.js +2 -0
  52. package/dist/components/OTPInput/OTPInputCore.js +7 -6
  53. package/dist/components/PasswordInput/PasswordInputCore.js +27 -26
  54. package/dist/components/Rating/RatingCore.js +18 -18
  55. package/dist/components/Resizable/Resizable.js +266 -36
  56. package/dist/components/Select/Select.js +28 -23
  57. package/dist/components/Select/SelectCore.js +26 -23
  58. package/dist/components/Select/SelectFloating.js +157 -153
  59. package/dist/components/Sparkline/Sparkline.js +45 -0
  60. package/dist/components/Sparkline/index.js +3 -0
  61. package/dist/components/Sparkline/sparkline-styles.js +18 -0
  62. package/dist/components/Spoiler/Spoiler.js +36 -0
  63. package/dist/components/Spoiler/index.js +3 -0
  64. package/dist/components/StatusBar/StatusBar.js +47 -0
  65. package/dist/components/StatusBar/index.js +3 -0
  66. package/dist/components/TabBar/TabBar.js +60 -0
  67. package/dist/components/TabBar/index.js +3 -0
  68. package/dist/components/Tabs/SortableTabList.js +116 -0
  69. package/dist/components/Tabs/Tab.js +83 -16
  70. package/dist/components/Tabs/TabList.js +94 -38
  71. package/dist/components/Tabs/edge-scroll.js +6 -0
  72. package/dist/components/Tabs/index.js +4 -3
  73. package/dist/components/Tabs/tab-metas.js +24 -0
  74. package/dist/components/TagGroup/SortableTagGroup.js +32 -20
  75. package/dist/components/TagGroup/TagGroup.js +23 -9
  76. package/dist/components/TagGroup/TagGroupItem.js +21 -15
  77. package/dist/components/TagInput/SortableTagInputCore.js +11 -11
  78. package/dist/components/TagInput/TagInputCore.js +10 -10
  79. package/dist/components/TimePicker/TimePickerPanel.js +3 -3
  80. package/dist/components/Toast/ToastContainer.js +5 -5
  81. package/dist/components/Toast/index.js +1 -1
  82. package/dist/components/Toast/{toast2.js → toast-channel.js} +1 -1
  83. package/dist/components/Toast/useToast.js +1 -1
  84. package/dist/components/Tree/SortableTree.js +39 -39
  85. package/dist/components/TreeSelect/TreeSelect.js +6 -6
  86. package/dist/components/VirtualList/VirtualList.js +133 -121
  87. package/dist/components/VisuallyHidden/VisuallyHidden.js +15 -0
  88. package/dist/components/VisuallyHidden/index.js +2 -0
  89. package/dist/components/Workbench/Workbench.js +144 -0
  90. package/dist/components/Workbench/index.js +3 -0
  91. package/dist/css/accordion.css +2 -0
  92. package/dist/css/activity-rail.css +4 -0
  93. package/dist/css/affix.css +2 -0
  94. package/dist/css/alert.css +2 -0
  95. package/dist/css/anchor.css +2 -0
  96. package/dist/css/app-shell.css +3 -1
  97. package/dist/css/approval-card.css +2 -0
  98. package/dist/css/aspect-ratio.css +2 -0
  99. package/dist/css/async-section.css +2 -0
  100. package/dist/css/avatar-group.css +2 -0
  101. package/dist/css/avatar.css +2 -0
  102. package/dist/css/back-to-top.css +2 -0
  103. package/dist/css/badge.css +2 -0
  104. package/dist/css/banner.css +2 -0
  105. package/dist/css/bottom-sheet.css +2 -0
  106. package/dist/css/breadcrumb.css +3 -1
  107. package/dist/css/button.css +3 -2
  108. package/dist/css/calendar.css +2 -0
  109. package/dist/css/card.css +2 -0
  110. package/dist/css/carousel.css +2 -0
  111. package/dist/css/cascader.css +2 -0
  112. package/dist/css/chart.css +2 -0
  113. package/dist/css/chat-container.css +2 -0
  114. package/dist/css/chat-input.css +2 -0
  115. package/dist/css/chat-message.css +2 -0
  116. package/dist/css/checkbox.css +3 -1
  117. package/dist/css/chip.css +2 -0
  118. package/dist/css/code-block.css +2 -0
  119. package/dist/css/collapsible.css +2 -0
  120. package/dist/css/color-picker.css +2 -0
  121. package/dist/css/combobox.css +2 -0
  122. package/dist/css/command.css +3 -1
  123. package/dist/css/confirm-dialog.css +2 -0
  124. package/dist/css/container.css +2 -0
  125. package/dist/css/context-menu.css +3 -1
  126. package/dist/css/conversation-list.css +2 -0
  127. package/dist/css/count-up.css +2 -0
  128. package/dist/css/data-table.css +2 -0
  129. package/dist/css/date-range-picker.css +3 -1
  130. package/dist/css/datepicker.css +2 -0
  131. package/dist/css/descriptions.css +2 -0
  132. package/dist/css/dialog.css +2 -0
  133. package/dist/css/diff-viewer.css +2 -0
  134. package/dist/css/disclosure.css +2 -0
  135. package/dist/css/divider.css +2 -0
  136. package/dist/css/drawer.css +3 -1
  137. package/dist/css/dropdown-menu.css +4 -2
  138. package/dist/css/ellipsis.css +2 -0
  139. package/dist/css/empty.css +2 -0
  140. package/dist/css/fieldset.css +4 -0
  141. package/dist/css/file-input.css +2 -0
  142. package/dist/css/file-preview.css +2 -0
  143. package/dist/css/flex.css +2 -0
  144. package/dist/css/float-button.css +2 -0
  145. package/dist/css/form.css +2 -0
  146. package/dist/css/grid.css +2 -0
  147. package/dist/css/hover-card.css +3 -1
  148. package/dist/css/icon.css +2 -0
  149. package/dist/css/image.css +2 -0
  150. package/dist/css/indicator.css +4 -0
  151. package/dist/css/inline-completion.css +2 -0
  152. package/dist/css/inline-edit.css +2 -0
  153. package/dist/css/input.css +3 -1
  154. package/dist/css/json-view.css +2 -0
  155. package/dist/css/kbd.css +2 -0
  156. package/dist/css/list.css +3 -1
  157. package/dist/css/loading-overlay.css +4 -0
  158. package/dist/css/log-viewer.css +2 -0
  159. package/dist/css/mark.css +4 -0
  160. package/dist/css/markdown-renderer.css +2 -0
  161. package/dist/css/masonry.css +2 -0
  162. package/dist/css/mentions.css +2 -0
  163. package/dist/css/menu.css +5 -3
  164. package/dist/css/model-picker.css +2 -0
  165. package/dist/css/navigation-bar.css +2 -0
  166. package/dist/css/number-input.css +2 -0
  167. package/dist/css/otp-input.css +2 -0
  168. package/dist/css/pagination.css +2 -0
  169. package/dist/css/password-input.css +3 -1
  170. package/dist/css/popover.css +3 -1
  171. package/dist/css/progress.css +2 -0
  172. package/dist/css/prompt-input.css +2 -0
  173. package/dist/css/qr-code.css +2 -0
  174. package/dist/css/radio.css +3 -1
  175. package/dist/css/rating.css +2 -0
  176. package/dist/css/resizable.css +3 -1
  177. package/dist/css/result.css +2 -0
  178. package/dist/css/scroll-area.css +2 -0
  179. package/dist/css/segmented.css +3 -1
  180. package/dist/css/select.css +2 -0
  181. package/dist/css/sidebar.css +3 -1
  182. package/dist/css/signature.css +2 -0
  183. package/dist/css/skeleton.css +2 -0
  184. package/dist/css/slider.css +3 -1
  185. package/dist/css/sources.css +2 -0
  186. package/dist/css/sparkline.css +4 -0
  187. package/dist/css/spinner.css +2 -0
  188. package/dist/css/spoiler.css +4 -0
  189. package/dist/css/stat.css +2 -0
  190. package/dist/css/status-bar.css +4 -0
  191. package/dist/css/step-timeline.css +2 -0
  192. package/dist/css/stepper.css +2 -0
  193. package/dist/css/streaming-text.css +2 -0
  194. package/dist/css/swipe-action.css +2 -0
  195. package/dist/css/switch.css +3 -1
  196. package/dist/css/tab-bar.css +4 -0
  197. package/dist/css/table.css +2 -0
  198. package/dist/css/tabs.css +5 -2
  199. package/dist/css/tag-group.css +2 -0
  200. package/dist/css/tag-input.css +2 -0
  201. package/dist/css/tag.css +3 -1
  202. package/dist/css/textarea.css +2 -0
  203. package/dist/css/thinking-indicator.css +2 -0
  204. package/dist/css/time-picker.css +2 -0
  205. package/dist/css/timeline.css +2 -0
  206. package/dist/css/toast.css +2 -0
  207. package/dist/css/toggle.css +2 -0
  208. package/dist/css/token-counter.css +2 -0
  209. package/dist/css/tokens.css +2 -0
  210. package/dist/css/tool-call-card.css +2 -0
  211. package/dist/css/toolbar.css +2 -0
  212. package/dist/css/tooltip.css +2 -0
  213. package/dist/css/tour.css +2 -0
  214. package/dist/css/transfer.css +2 -0
  215. package/dist/css/tree-select.css +2 -0
  216. package/dist/css/tree.css +3 -1
  217. package/dist/css/typography.css +2 -0
  218. package/dist/css/upload.css +2 -0
  219. package/dist/css/virtual-list.css +2 -0
  220. package/dist/css/visually-hidden.css +4 -0
  221. package/dist/css/watermark.css +2 -0
  222. package/dist/css/workbench.css +4 -0
  223. package/dist/css-manifest.json +202 -1
  224. package/dist/dates/adapter.js +9 -1
  225. package/dist/dates/buddhist.js +43 -0
  226. package/dist/dates/ethiopic.js +67 -0
  227. package/dist/dates/hebrew.js +95 -0
  228. package/dist/dates/japanese.js +41 -0
  229. package/dist/dates/persian.js +121 -0
  230. package/dist/dates/registry.js +14 -4
  231. package/dist/haze-ui.css +435 -29
  232. package/dist/headless/index.js +18 -17
  233. package/dist/hooks/useBusyPressable.js +10 -0
  234. package/dist/index.js +263 -241
  235. package/dist/mcp-docs.json +1073 -33
  236. package/dist/registry.json +256 -14
  237. package/dist/types/components/ActivityRail/ActivityRail.d.ts +30 -0
  238. package/dist/types/components/ActivityRail/index.d.ts +4 -0
  239. package/dist/types/components/Button/Button.d.ts +50 -5
  240. package/dist/types/components/Button/ButtonLink.d.ts +27 -15
  241. package/dist/types/components/Button/styles.d.ts +34 -0
  242. package/dist/types/components/Combobox/Combobox.d.ts +20 -2
  243. package/dist/types/components/Combobox/index.d.ts +1 -1
  244. package/dist/types/components/ConfigProvider/ConfigContext.d.ts +20 -0
  245. package/dist/types/components/ConfirmDialog/ConfirmDialog.d.ts +1 -1
  246. package/dist/types/components/ConfirmDialog/confirm.d.ts +33 -0
  247. package/dist/types/components/ConfirmDialog/index.d.ts +2 -0
  248. package/dist/types/components/ConversationList/ConversationList.d.ts +10 -1
  249. package/dist/types/components/DateTimePicker/DateTimePicker.d.ts +36 -0
  250. package/dist/types/components/DateTimePicker/index.d.ts +2 -0
  251. package/dist/types/components/Datepicker/Datepicker.d.ts +3 -3
  252. package/dist/types/components/Datepicker/DatepickerCore.d.ts +3 -3
  253. package/dist/types/components/Drawer/Drawer.d.ts +15 -2
  254. package/dist/types/components/Drawer/index.d.ts +1 -1
  255. package/dist/types/components/Fieldset/Fieldset.d.ts +16 -0
  256. package/dist/types/components/Fieldset/index.d.ts +2 -0
  257. package/dist/types/components/Highlight/Highlight.d.ts +27 -0
  258. package/dist/types/components/Highlight/index.d.ts +2 -0
  259. package/dist/types/components/Indicator/Indicator.d.ts +24 -0
  260. package/dist/types/components/Indicator/index.d.ts +2 -0
  261. package/dist/types/components/Input/Input.d.ts +8 -2
  262. package/dist/types/components/Input/InputCore.d.ts +11 -2
  263. package/dist/types/components/List/List.d.ts +10 -1
  264. package/dist/types/components/LoadingOverlay/LoadingOverlay.d.ts +25 -0
  265. package/dist/types/components/LoadingOverlay/index.d.ts +2 -0
  266. package/dist/types/components/LocaleProvider/locale.d.ts +11 -0
  267. package/dist/types/components/LogViewer/LogViewer.d.ts +10 -1
  268. package/dist/types/components/Mark/Mark.d.ts +12 -0
  269. package/dist/types/components/Mark/index.d.ts +2 -0
  270. package/dist/types/components/Menu/MenuItem.d.ts +15 -4
  271. package/dist/types/components/NumberFormatter/NumberFormatter.d.ts +23 -0
  272. package/dist/types/components/NumberFormatter/index.d.ts +2 -0
  273. package/dist/types/components/Resizable/Resizable.d.ts +24 -7
  274. package/dist/types/components/Resizable/index.d.ts +1 -1
  275. package/dist/types/components/Select/Select.d.ts +23 -2
  276. package/dist/types/components/Select/SelectCore.d.ts +4 -1
  277. package/dist/types/components/Select/SelectFloating.d.ts +6 -1
  278. package/dist/types/components/Select/index.d.ts +1 -1
  279. package/dist/types/components/Sparkline/Sparkline.d.ts +31 -0
  280. package/dist/types/components/Sparkline/index.d.ts +3 -0
  281. package/dist/types/components/Sparkline/sparkline-styles.d.ts +26 -0
  282. package/dist/types/components/Spoiler/Spoiler.d.ts +20 -0
  283. package/dist/types/components/Spoiler/index.d.ts +2 -0
  284. package/dist/types/components/StatusBar/StatusBar.d.ts +18 -0
  285. package/dist/types/components/StatusBar/index.d.ts +3 -0
  286. package/dist/types/components/TabBar/TabBar.d.ts +23 -0
  287. package/dist/types/components/TabBar/index.d.ts +4 -0
  288. package/dist/types/components/Tabs/SortableTabList.d.ts +46 -0
  289. package/dist/types/components/Tabs/Tab.d.ts +54 -3
  290. package/dist/types/components/Tabs/TabList.d.ts +26 -2
  291. package/dist/types/components/Tabs/edge-scroll.d.ts +17 -0
  292. package/dist/types/components/Tabs/index.d.ts +3 -1
  293. package/dist/types/components/Tabs/tab-metas.d.ts +20 -0
  294. package/dist/types/components/TagGroup/SortableTagGroup.d.ts +5 -1
  295. package/dist/types/components/TagGroup/TagGroup.d.ts +24 -2
  296. package/dist/types/components/TagGroup/index.d.ts +1 -1
  297. package/dist/types/components/Toast/index.d.ts +2 -2
  298. package/dist/types/components/Toast/useToast.d.ts +1 -1
  299. package/dist/types/components/VirtualList/VirtualList.d.ts +20 -1
  300. package/dist/types/components/VisuallyHidden/VisuallyHidden.d.ts +4 -0
  301. package/dist/types/components/VisuallyHidden/index.d.ts +2 -0
  302. package/dist/types/components/Workbench/Workbench.d.ts +50 -0
  303. package/dist/types/components/Workbench/index.d.ts +2 -0
  304. package/dist/types/dates/adapter.d.ts +33 -6
  305. package/dist/types/dates/buddhist.d.ts +14 -0
  306. package/dist/types/dates/ethiopic.d.ts +15 -0
  307. package/dist/types/dates/hebrew.d.ts +19 -0
  308. package/dist/types/dates/index.d.ts +5 -0
  309. package/dist/types/dates/japanese.d.ts +16 -0
  310. package/dist/types/dates/persian.d.ts +18 -0
  311. package/dist/types/dates/registry.d.ts +1 -1
  312. package/dist/types/headless/index.d.ts +9 -0
  313. package/dist/types/hooks/index.d.ts +13 -0
  314. package/dist/types/hooks/useBusyPressable.d.ts +33 -0
  315. package/dist/types/hooks/useElementSize.d.ts +38 -0
  316. package/dist/types/hooks/useIdle.d.ts +45 -0
  317. package/dist/types/hooks/useMutationObserver.d.ts +35 -0
  318. package/dist/types/hooks/useNetwork.d.ts +31 -0
  319. package/dist/types/hooks/useOrientation.d.ts +23 -0
  320. package/dist/types/hooks/useResizeObserver.d.ts +48 -0
  321. package/dist/types/index.d.ts +37 -9
  322. package/dist/types/utils/sortable.d.ts +8 -1
  323. package/dist/types/utils/use-end-reached.d.ts +56 -0
  324. package/dist/types/utils/viewport.d.ts +12 -0
  325. package/dist/utils/sortable-shared.js +3 -3
  326. package/dist/utils/sortable.js +15 -14
  327. package/dist/utils/use-end-reached.js +46 -0
  328. package/dist/utils/viewport.js +20 -0
  329. package/package.json +13 -5
  330. /package/dist/types/components/Toast/{toast.d.ts → toast-channel.d.ts} +0 -0
@@ -0,0 +1,48 @@
1
+ import type { RefCallback } from 'react';
2
+ type UseResizeObserverOptions = {
3
+ /**
4
+ * 触发时机盒子,同 ResizeObserver 的 box 选项('content-box' |
5
+ * 'border-box' | 'device-pixel-content-box')。默认 'content-box'。
6
+ */
7
+ box?: ResizeObserverBoxOptions;
8
+ /**
9
+ * 是否启用。默认 `true`;`false` 时快照冻结为最后一次观测值,
10
+ * 不建立观察器。
11
+ */
12
+ enabled?: boolean;
13
+ };
14
+ type UseResizeObserverResult = UseResizeObserverResultWithT;
15
+ /**
16
+ * 底层 ResizeObserver 订阅原语:返回 ref + 最新 entry。
17
+ *
18
+ * ```tsx
19
+ * const [ref, entry] = useResizeObserver<HTMLDivElement>();
20
+ * const width = entry?.contentRect.width ?? 0;
21
+ * return <div ref={ref} style={{minWidth: 200}} />;
22
+ * ```
23
+ *
24
+ * - ref 每次指向新元素时自动解挂旧观察;卸载/禁用时只断开观察,
25
+ * entry 保留最后一次值(冻结语义,与 useElementSize 的清零语义
26
+ * 相反——entry 是结构化快照,冻结便于消费方在禁用/卸载后仍读取
27
+ * 最后时刻的布局;size 是原始数据,清零更安全)。
28
+ * - ref 回调身份稳定(useCallback([box, enabled])):React 19 对每个
29
+ * 新 ref 函数会 null-detach + re-attach,不记忆化会导致每渲染
30
+ * disconnect + 重建观察器 + 重新 observe,而 ResizeObserver 每次
31
+ * observe 后回调的都是新 entry 实例——setEntry 恒触发重渲染,形成
32
+ * 无限重渲染循环(jsdom 无 RO,测试测不出,真实浏览器直接卡死)。
33
+ * - enabled 切换无需 effect:true→false 由 ref 身份变化触发的
34
+ * detach(null) 断开观察;false→true 由 re-attach(node) 重建观察。
35
+ * - SSR:不观察,entry 恒 `null`。
36
+ * - 引擎无 `ResizeObserver`(jsdom ≤23):不抛错,entry 恒 `null`、
37
+ * ref 是 no-op——消费端可以安全 mock/降级。
38
+ *
39
+ * @param options 见 {@link UseResizeObserverOptions}。
40
+ * @returns `[ref, entry]`:ref 挂上元素即开始观察;entry 为最后一次
41
+ * 通知的 ResizeObserverEntry,未观察/初次渲染为 `null`。
42
+ */
43
+ type UseResizeObserverResultWithT<T extends Element = Element> = [
44
+ ref: RefCallback<T>,
45
+ entry: ResizeObserverEntry | null
46
+ ];
47
+ export declare function useResizeObserver<T extends Element = Element>(options?: UseResizeObserverOptions): UseResizeObserverResultWithT<T>;
48
+ export type { UseResizeObserverOptions, UseResizeObserverResult, UseResizeObserverResultWithT, };
@@ -10,14 +10,14 @@ export { motion, motionPresets } from './tokens/motion';
10
10
  export type { MotionPreset } from './tokens/motion';
11
11
  export { TOKEN_REGISTRY, COMPONENT_TOKENS } from './tokens/registry';
12
12
  export type { TokenDef } from './tokens/registry';
13
- export { gregoryAdapter, islamicUmalquraAdapter, getAdapter, formatInTimeZone, getZonedParts } from './dates';
13
+ export { gregoryAdapter, islamicUmalquraAdapter, persianAdapter, hebrewAdapter, japaneseAdapter, buddhistAdapter, ethiopicAdapter, getAdapter, formatInTimeZone, getZonedParts, } from './dates';
14
14
  export type { HazeDateAdapter, CivilDateParts, HazeCalendarIdentifier, MonthNameStyle, ZonedParts, } from './dates';
15
15
  export { Button, ButtonLink, buttonVariants, buttonSizes } from './components/Button';
16
16
  export type { ButtonProps, ButtonLinkProps } from './components/Button';
17
17
  export { Input, InputCore } from './components/Input';
18
18
  export type { InputProps, InputCoreProps } from './components/Input';
19
19
  export { Select, Option, SelectCore, OptionGroup } from './components/Select';
20
- export type { SelectProps, OptionProps, SelectCoreProps, OptionGroupProps } from './components/Select';
20
+ export type { SelectProps, SelectClassNames, OptionProps, SelectCoreProps, OptionGroupProps } from './components/Select';
21
21
  export { Checkbox, CheckboxCore } from './components/Checkbox';
22
22
  export type { CheckboxProps, CheckboxCoreProps } from './components/Checkbox';
23
23
  export { Switch, SwitchCore } from './components/Switch';
@@ -40,8 +40,8 @@ export { Textarea, TextareaCore } from './components/Textarea';
40
40
  export type { TextareaProps, TextareaCoreProps } from './components/Textarea';
41
41
  export { Slider, SliderCore } from './components/Slider';
42
42
  export type { SliderProps, SliderCoreProps } from './components/Slider';
43
- export { Tabs, TabList, Tab, TabPanel } from './components/Tabs';
44
- export type { TabsProps, TabsClassNames, TabListProps, TabProps, TabPanelProps, } from './components/Tabs';
43
+ export { Tabs, TabList, Tab, TabPanel, SortableTabList } from './components/Tabs';
44
+ export type { TabsProps, TabsClassNames, TabListProps, TabProps, TabPanelProps, TabStatus, SortableTabListProps, } from './components/Tabs';
45
45
  export { Accordion, AccordionItem } from './components/Accordion';
46
46
  export type { AccordionProps, AccordionItemProps, } from './components/Accordion';
47
47
  export { Alert } from './components/Alert';
@@ -73,7 +73,7 @@ export type { ToastProps, ToastContainerProps, ToastOptions, ToastVariant, Toast
73
73
  export { List, ListItem } from './components/List';
74
74
  export type { ListProps, ListItemProps } from './components/List';
75
75
  export { Combobox, ComboboxOption, ComboboxGroup } from './components/Combobox';
76
- export type { ComboboxProps, ComboboxOptionProps, ComboboxGroupProps, ComboboxOptionData, ComboboxVirtualizedConfig } from './components/Combobox';
76
+ export type { ComboboxProps, ComboboxClassNames, ComboboxOptionProps, ComboboxGroupProps, ComboboxOptionData, ComboboxVirtualizedConfig } from './components/Combobox';
77
77
  export { Table, TableHead, TableBody, TableRow, TableCell, } from './components/Table';
78
78
  export type { TableProps, TableHeadProps, TableBodyProps, TableRowProps, TableCellProps, } from './components/Table';
79
79
  export { Carousel, CarouselSlide } from './components/Carousel';
@@ -99,7 +99,7 @@ export type { PaginationProps } from './components/Pagination';
99
99
  export { Grid, GridItem } from './components/Grid';
100
100
  export type { GridProps, GridItemProps } from './components/Grid';
101
101
  export { Drawer } from './components/Drawer';
102
- export type { DrawerProps, DrawerHandle } from './components/Drawer';
102
+ export type { DrawerProps, DrawerClassNames, DrawerHandle } from './components/Drawer';
103
103
  export { Stepper, Step } from './components/Stepper';
104
104
  export type { StepperProps, StepProps } from './components/Stepper';
105
105
  export { Command, CommandInput, CommandList, CommandItem, CommandGroup, CommandDialog } from './components/Command';
@@ -127,6 +127,8 @@ export { Ellipsis } from './components/Ellipsis';
127
127
  export type { EllipsisProps } from './components/Ellipsis';
128
128
  export { CountUp } from './components/CountUp';
129
129
  export type { CountUpProps } from './components/CountUp';
130
+ export { Sparkline, sparklineToneStrokes, sparklineToneFills } from './components/Sparkline';
131
+ export type { SparklineProps } from './components/Sparkline';
130
132
  export type { StatProps, StatGroupProps } from './components/Stat';
131
133
  export { Segmented, SegmentedCore } from './components/Segmented';
132
134
  export type { SegmentedProps, SegmentedCoreProps } from './components/Segmented';
@@ -164,8 +166,8 @@ export { Container } from './components/Container';
164
166
  export type { ContainerProps } from './components/Container';
165
167
  export { Banner } from './components/Banner';
166
168
  export type { BannerProps } from './components/Banner';
167
- export { ConfirmDialog } from './components/ConfirmDialog';
168
- export type { ConfirmDialogProps } from './components/ConfirmDialog';
169
+ export { ConfirmDialog, confirm } from './components/ConfirmDialog';
170
+ export type { ConfirmDialogProps, ConfirmOptions } from './components/ConfirmDialog';
169
171
  export { CodeBlock } from './components/CodeBlock';
170
172
  export type { CodeBlockProps, Highlighter } from './components/CodeBlock';
171
173
  export { AspectRatio } from './components/AspectRatio';
@@ -173,7 +175,7 @@ export type { AspectRatioProps } from './components/AspectRatio';
173
175
  export { VirtualList } from './components/VirtualList';
174
176
  export type { VirtualListProps, VirtualListHandle, VirtualListGroup, VirtualListAlign, VirtualListOrientation } from './components/VirtualList';
175
177
  export { TagGroup, TagGroupItem, SortableTagGroup } from './components/TagGroup';
176
- export type { TagGroupProps, TagGroupItemProps, SortableTagGroupProps } from './components/TagGroup';
178
+ export type { TagGroupProps, TagGroupClassNames, TagGroupItemProps, SortableTagGroupProps } from './components/TagGroup';
177
179
  export { BottomSheet } from './components/BottomSheet';
178
180
  export type { BottomSheetProps, BottomSheetHandle } from './components/BottomSheet';
179
181
  export { SwipeAction } from './components/SwipeAction';
@@ -202,6 +204,32 @@ export { Toolbar, ToolbarButton, ToolbarSeparator, ToolbarToggle } from './compo
202
204
  export type { ToolbarProps, ToolbarButtonProps, ToolbarSeparatorProps, ToolbarToggleProps } from './components/Toolbar';
203
205
  export { AppShell } from './components/AppShell';
204
206
  export type { AppShellProps } from './components/AppShell';
207
+ export { ActivityRail, ActivityRailItem } from './components/ActivityRail';
208
+ export type { ActivityRailProps, ActivityRailItemProps } from './components/ActivityRail';
209
+ export { StatusBar, StatusItem } from './components/StatusBar';
210
+ export type { StatusBarProps, StatusItemProps } from './components/StatusBar';
211
+ export { TabBar, TabBarItem } from './components/TabBar';
212
+ export type { TabBarProps, TabBarItemProps } from './components/TabBar';
213
+ export { Workbench } from './components/Workbench';
214
+ export type { WorkbenchProps } from './components/Workbench';
215
+ export { VisuallyHidden } from './components/VisuallyHidden';
216
+ export type { VisuallyHiddenProps } from './components/VisuallyHidden';
217
+ export { Mark } from './components/Mark';
218
+ export type { MarkProps } from './components/Mark';
219
+ export { Highlight } from './components/Highlight';
220
+ export type { HighlightProps } from './components/Highlight';
221
+ export { NumberFormatter } from './components/NumberFormatter';
222
+ export type { NumberFormatterProps } from './components/NumberFormatter';
223
+ export { Fieldset } from './components/Fieldset';
224
+ export type { FieldsetProps } from './components/Fieldset';
225
+ export { LoadingOverlay } from './components/LoadingOverlay';
226
+ export type { LoadingOverlayProps } from './components/LoadingOverlay';
227
+ export { Indicator } from './components/Indicator';
228
+ export type { IndicatorProps } from './components/Indicator';
229
+ export { Spoiler } from './components/Spoiler';
230
+ export type { SpoilerProps } from './components/Spoiler';
231
+ export { DateTimePicker } from './components/DateTimePicker';
232
+ export type { DateTimePickerProps } from './components/DateTimePicker';
205
233
  export { Cascader } from './components/Cascader';
206
234
  export type { CascaderProps, CascaderOption } from './components/Cascader';
207
235
  export { Sidebar, SidebarGroup, SidebarItem, SidebarFooter, SidebarToggle } from './components/Sidebar';
@@ -1,4 +1,5 @@
1
1
  import type { ReactNode } from 'react';
2
+ import type { DragStartEvent } from '@dnd-kit/core';
2
3
  import type { SortingStrategy } from '@dnd-kit/sortable';
3
4
  /**
4
5
  * Internal sortable wrapper components (the non-component primitives live
@@ -14,12 +15,18 @@ type SortableRegionProps = {
14
15
  /** Index move resolved from a completed drag; never called when the drop
15
16
  * lands back on the origin item. */
16
17
  onMove: (from: number, to: number) => void;
18
+ /** Drag lifecycle passthrough — SortableTabList uses the pair to
19
+ * run its edge auto-scroll loop while a tab is airborne. The start
20
+ * callback receives the dnd-kit event so consumers can tell pointer
21
+ * lifts from keyboard lifts (`event.activatorEvent`). */
22
+ onDragStart?: (event: DragStartEvent) => void;
23
+ onDragEnd?: () => void;
17
24
  children: ReactNode;
18
25
  };
19
26
  /** DndContext + SortableContext wiring with the shared sensors and
20
27
  * closest-center collision. Renders no DOM of its own, so it can wrap a
21
28
  * ul or a chip row without changing layout or semantics. */
22
- export declare function SortableRegion({ ids, strategy, onMove, children }: SortableRegionProps): import("react").JSX.Element;
29
+ export declare function SortableRegion({ ids, strategy, onMove, onDragStart, onDragEnd, children, }: SortableRegionProps): import("react").JSX.Element;
23
30
  type SortableItemProps = {
24
31
  id: string | number;
25
32
  className?: string;
@@ -0,0 +1,56 @@
1
+ import type { RefObject } from 'react';
2
+ type UseEndReachedOptions = {
3
+ /** Scrollport element whose end is watched. */
4
+ ref: RefObject<HTMLElement | null>;
5
+ /**
6
+ * Fired when the scroll offset comes within `threshold` px of the
7
+ * content's end along the scroll axis — the infinite-scroll "load the
8
+ * next page" trigger. Semantics: entering the zone fires once; staying
9
+ * inside it does not re-fire; scrolling back out re-arms, and content
10
+ * growth (`contentUnits` increasing) re-arms too, so a list that is
11
+ * still short after a page load chains straight into the next one.
12
+ * Content that does not fill the port on initial mount counts as being
13
+ * in the zone and fires once.
14
+ */
15
+ onEndReached?: () => void;
16
+ /** Distance in px from the content end that arms the trigger. */
17
+ threshold: number;
18
+ /**
19
+ * Count of content units (items, entries, children). Only growth
20
+ * matters: an increase re-arms the trigger and re-checks immediately.
21
+ */
22
+ contentUnits: number;
23
+ /** Scroll axis; `'y'` (default) or `'x'`. */
24
+ axis?: 'x' | 'y';
25
+ /**
26
+ * Mirror the end edge onto the scroll start (VirtualList `reverse`
27
+ * mode): content anchors to the end edge, so the logical end of the
28
+ * list sits at the physical start of the scroll range and the
29
+ * remaining distance is the offset itself. The mount check is skipped
30
+ * in this mode — the consumer anchors the start position first
31
+ * (VirtualList's stick-to-end glue) and then calls `check()`.
32
+ */
33
+ fromStart?: boolean;
34
+ /**
35
+ * Viewport-extent fallback for environments where clientHeight /
36
+ * clientWidth read 0 (no layout engine, e.g. jsdom): the consumer's
37
+ * declared port size.
38
+ */
39
+ extentFallback?: number;
40
+ /**
41
+ * Attach the hook's own passive scroll listener (default). VirtualList
42
+ * passes `false` and calls the returned `check()` from its existing
43
+ * scroll handler instead.
44
+ */
45
+ attach?: boolean;
46
+ };
47
+ /**
48
+ * End-reached pagination trigger for a scrollport. Shared by VirtualList
49
+ * (`onEndReached`) and the plain scroll containers that forward the same
50
+ * semantics (LogViewer / ConversationList `onLoadMore`); returns `check()`
51
+ * for consumers that drive it from their own scroll handler. Zero
52
+ * overhead when `onEndReached` is not provided: no listener, no
53
+ * per-scroll work.
54
+ */
55
+ export declare function useEndReached({ ref, onEndReached, threshold, contentUnits, axis, fromStart, extentFallback, attach, }: UseEndReachedOptions): () => void;
56
+ export {};
@@ -0,0 +1,12 @@
1
+ /**
2
+ * 虚拟键盘对视口的遮挡高度(px):以布局视口为参照度量
3
+ * (`innerHeight - visualViewport.height - offsetTop`,向下钳 0——桌面
4
+ * 窗口缩放时 innerHeight 与视口同步变化,inset 恒为 0)。
5
+ *
6
+ * - `window.visualViewport` 不存在(SSR/jsdom)时静默保持 0,调用方的
7
+ * `dvh` 基线继续生效;
8
+ * - `enabled` 为 false(如 sheet 收起)时不订阅,翻回 true 时重新
9
+ * measure 订阅;
10
+ * - 监听器 passive(measure 从不 preventDefault),卸载时成对清理。
11
+ */
12
+ export declare function useVisualViewportInset(enabled?: boolean): number;
@@ -1,10 +1,10 @@
1
1
  "use client";
2
- import { KeyboardSensor as e, PointerSensor as t, useSensor as n, useSensors as r } from "@dnd-kit/core";
3
- import { sortableKeyboardCoordinates as i } from "@dnd-kit/sortable";
2
+ import { sortableKeyboardCoordinates as e } from "@dnd-kit/sortable";
3
+ import { KeyboardSensor as t, PointerSensor as n, useSensor as r, useSensors as i } from "@dnd-kit/core";
4
4
  import { CSS as a } from "@dnd-kit/utilities";
5
5
  //#region src/lib/utils/sortable-shared.ts
6
6
  function o() {
7
- return r(n(t, { activationConstraint: { distance: 8 } }), n(e, { coordinateGetter: i }));
7
+ return i(r(n, { activationConstraint: { distance: 8 } }), r(t, { coordinateGetter: e }));
8
8
  }
9
9
  function s(e, t) {
10
10
  return {
@@ -5,30 +5,31 @@ import { SortableHandleContext as t } from "./sortable-handle.js";
5
5
  import { sortableItemStyle as n, useSortableSensors as r } from "./sortable-shared.js";
6
6
  /* empty css */
7
7
  import { jsx as i } from "react/jsx-runtime";
8
- import { DndContext as a, closestCenter as o } from "@dnd-kit/core";
9
- import { SortableContext as s, useSortable as c } from "@dnd-kit/sortable";
8
+ import { SortableContext as a, useSortable as o } from "@dnd-kit/sortable";
9
+ import { DndContext as s, closestCenter as c } from "@dnd-kit/core";
10
10
  //#region src/lib/utils/sortable.tsx
11
- function l({ ids: e, strategy: t, onMove: n, children: c }) {
12
- let l = r();
13
- return /* @__PURE__ */ i(a, {
14
- sensors: l,
15
- collisionDetection: o,
11
+ function l({ ids: e, strategy: t, onMove: n, onDragStart: o, onDragEnd: l, children: u }) {
12
+ let d = r();
13
+ return /* @__PURE__ */ i(s, {
14
+ sensors: d,
15
+ collisionDetection: c,
16
+ onDragStart: o,
16
17
  onDragEnd: ({ active: t, over: r }) => {
17
- r && t.id !== r.id && n(e.indexOf(t.id), e.indexOf(r.id));
18
+ l?.(), r && t.id !== r.id && n(e.indexOf(t.id), e.indexOf(r.id));
18
19
  },
19
- children: i(s, {
20
+ children: i(a, {
20
21
  items: e,
21
22
  strategy: t,
22
- children: c
23
+ children: u
23
24
  })
24
25
  });
25
26
  }
26
27
  var u = "haze-sortable__sortableNode", d = "haze-sortable__sortableNodeDragging";
27
- function f({ id: r, className: a, children: o }) {
28
- let { attributes: s, listeners: l, setNodeRef: f, transform: p, transition: m, isDragging: h } = c({ id: r });
28
+ function f({ id: r, className: a, children: s }) {
29
+ let { attributes: c, listeners: l, setNodeRef: f, transform: p, transition: m, isDragging: h } = o({ id: r });
29
30
  return /* @__PURE__ */ i(t.Provider, {
30
31
  value: {
31
- attributes: s,
32
+ attributes: c,
32
33
  listeners: l
33
34
  },
34
35
  children: i("span", {
@@ -40,7 +41,7 @@ function f({ id: r, className: a, children: o }) {
40
41
  h && d,
41
42
  a
42
43
  ]),
43
- children: o
44
+ children: s
44
45
  })
45
46
  });
46
47
  }
@@ -0,0 +1,46 @@
1
+ "use client";
2
+ import { getDirection as e } from "./direction.js";
3
+ import { useCallback as t, useEffect as n, useRef as r } from "react";
4
+ //#region src/lib/utils/use-end-reached.ts
5
+ function i({ ref: i, onEndReached: a, threshold: o, contentUnits: s, axis: c = "y", fromStart: l = !1, extentFallback: u, attach: d = !0 }) {
6
+ let f = r(a);
7
+ n(() => {
8
+ f.current = a;
9
+ });
10
+ let p = a !== void 0, m = r(!0), h = r(null), g = t(() => {
11
+ let t = f.current;
12
+ if (!t) return;
13
+ let n = i.current;
14
+ if (!n) return;
15
+ let r = c === "y" ? n.scrollTop : n.scrollLeft, a = c === "x" && e(n) === "rtl" ? -r : r, s = c === "y" ? n.scrollHeight : n.scrollWidth, d = (c === "y" ? n.clientHeight : n.clientWidth) || u || 0;
16
+ (l ? a : s - d - a) <= o ? m.current && (m.current = !1, t()) : m.current = !0;
17
+ }, [
18
+ i,
19
+ c,
20
+ l,
21
+ u,
22
+ o
23
+ ]), _ = r(!1);
24
+ return n(() => {
25
+ let e = h.current, t = _.current;
26
+ h.current = s, _.current = p, p && (t && e !== null && s <= e || (!l || e !== null && t) && (m.current = !0, g()));
27
+ }, [
28
+ s,
29
+ g,
30
+ p,
31
+ l
32
+ ]), n(() => {
33
+ if (!d || !p) return;
34
+ let e = i.current;
35
+ if (!e) return;
36
+ let t = () => g();
37
+ return e.addEventListener("scroll", t, { passive: !0 }), () => e.removeEventListener("scroll", t);
38
+ }, [
39
+ d,
40
+ p,
41
+ g,
42
+ i
43
+ ]), g;
44
+ }
45
+ //#endregion
46
+ export { i as useEndReached };
@@ -0,0 +1,20 @@
1
+ "use client";
2
+ import { useEffect as e, useState as t } from "react";
3
+ //#region src/lib/utils/viewport.ts
4
+ function n(n = !0) {
5
+ let [r, i] = t(0);
6
+ return e(() => {
7
+ if (!n) return;
8
+ let e = window.visualViewport;
9
+ if (!e) return;
10
+ let t = () => {
11
+ let t = Math.max(0, Math.round(window.innerHeight - e.height - e.offsetTop));
12
+ i((e) => e === t ? e : t);
13
+ };
14
+ return t(), e.addEventListener("resize", t, { passive: !0 }), e.addEventListener("scroll", t, { passive: !0 }), () => {
15
+ e.removeEventListener("resize", t), e.removeEventListener("scroll", t);
16
+ };
17
+ }, [n]), r;
18
+ }
19
+ //#endregion
20
+ export { n as useVisualViewportInset };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "haze-ui",
3
- "version": "1.30.0",
3
+ "version": "1.32.0",
4
4
  "type": "module",
5
5
  "description": "A React UI component library powered by react-use-control and Linaria",
6
6
  "main": "./dist/index.js",
@@ -121,6 +121,8 @@
121
121
  "@babel/preset-env": "^8.0.2",
122
122
  "@babel/preset-typescript": "^8.0.1",
123
123
  "@for-fun/event-emitter": "^1.1.0",
124
+ "@guidepup/guidepup": "^0.34.0",
125
+ "@guidepup/playwright": "^0.19.1",
124
126
  "@linaria/core": "^8.2.0",
125
127
  "@native-router/core": "^1.17.0",
126
128
  "@native-router/react": "^1.16.1",
@@ -173,7 +175,7 @@
173
175
  "name": "Button only (bundled from barrel)",
174
176
  "path": "dist/index.js",
175
177
  "import": "{Button}",
176
- "limit": "2 KB"
178
+ "limit": "5.75 KB"
177
179
  },
178
180
  {
179
181
  "name": "TagGroup+TagGroupItem only — dnd-free (bundled from barrel)",
@@ -197,16 +199,16 @@
197
199
  "name": "Dashboard profile: Button + Input + Select + Dialog + Toast + Pagination",
198
200
  "path": "dist/index.js",
199
201
  "import": "{Button, Input, Select, Dialog, Toast, Pagination}",
200
- "limit": "17.5 KB"
202
+ "limit": "18.5 KB"
201
203
  },
202
204
  {
203
205
  "name": "CSS aggregate (dist/haze-ui.css, brotli)",
204
206
  "path": "dist/haze-ui.css",
205
- "limit": "23.75 KB"
207
+ "limit": "26.25 KB"
206
208
  },
207
209
  {
208
210
  "path": "dist/haze-ui.css",
209
- "limit": "30.25 KB",
211
+ "limit": "35 KB",
210
212
  "gzip": true
211
213
  },
212
214
  {
@@ -227,6 +229,12 @@
227
229
  "limit": "0.3 KB",
228
230
  "gzip": true
229
231
  },
232
+ {
233
+ "name": "CSS family ratchet: sparkline",
234
+ "path": "dist/css/sparkline.css",
235
+ "limit": "0.3 KB",
236
+ "gzip": true
237
+ },
230
238
  {
231
239
  "name": "CSS family ratchet: result",
232
240
  "path": "dist/css/result.css",