@wzrhine/react 0.0.0-stage → 0.2.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 (289) hide show
  1. package/CHANGELOG.md +99 -0
  2. package/LICENSE +21 -0
  3. package/README.md +37 -3
  4. package/dist/advanced.css +398 -0
  5. package/dist/archive.css +704 -0
  6. package/dist/command.css +671 -0
  7. package/dist/components/Accordion.d.ts +82 -0
  8. package/dist/components/Accordion.d.ts.map +1 -0
  9. package/dist/components/Accordion.js +19 -0
  10. package/dist/components/Accordion.js.map +1 -0
  11. package/dist/components/Alert.d.ts +63 -0
  12. package/dist/components/Alert.d.ts.map +1 -0
  13. package/dist/components/Alert.js +29 -0
  14. package/dist/components/Alert.js.map +1 -0
  15. package/dist/components/AlertDialog.d.ts +49 -0
  16. package/dist/components/AlertDialog.d.ts.map +1 -0
  17. package/dist/components/AlertDialog.js +122 -0
  18. package/dist/components/AlertDialog.js.map +1 -0
  19. package/dist/components/ArchiveCard.d.ts +58 -0
  20. package/dist/components/ArchiveCard.d.ts.map +1 -0
  21. package/dist/components/ArchiveCard.js +40 -0
  22. package/dist/components/ArchiveCard.js.map +1 -0
  23. package/dist/components/Badge.d.ts +17 -0
  24. package/dist/components/Badge.d.ts.map +1 -0
  25. package/dist/components/Badge.js +16 -0
  26. package/dist/components/Badge.js.map +1 -0
  27. package/dist/components/Breadcrumb.d.ts +48 -0
  28. package/dist/components/Breadcrumb.d.ts.map +1 -0
  29. package/dist/components/Breadcrumb.js +55 -0
  30. package/dist/components/Breadcrumb.js.map +1 -0
  31. package/dist/components/Button.d.ts +33 -0
  32. package/dist/components/Button.d.ts.map +1 -0
  33. package/dist/components/Button.js +24 -0
  34. package/dist/components/Button.js.map +1 -0
  35. package/dist/components/Checkbox.d.ts +81 -0
  36. package/dist/components/Checkbox.d.ts.map +1 -0
  37. package/dist/components/Checkbox.js +34 -0
  38. package/dist/components/Checkbox.js.map +1 -0
  39. package/dist/components/Collapsible.d.ts +47 -0
  40. package/dist/components/Collapsible.d.ts.map +1 -0
  41. package/dist/components/Collapsible.js +12 -0
  42. package/dist/components/Collapsible.js.map +1 -0
  43. package/dist/components/Combobox.d.ts +74 -0
  44. package/dist/components/Combobox.d.ts.map +1 -0
  45. package/dist/components/Combobox.js +61 -0
  46. package/dist/components/Combobox.js.map +1 -0
  47. package/dist/components/CommandPalette.d.ts +77 -0
  48. package/dist/components/CommandPalette.d.ts.map +1 -0
  49. package/dist/components/CommandPalette.js +150 -0
  50. package/dist/components/CommandPalette.js.map +1 -0
  51. package/dist/components/ContextMenu.d.ts +31 -0
  52. package/dist/components/ContextMenu.d.ts.map +1 -0
  53. package/dist/components/ContextMenu.js +25 -0
  54. package/dist/components/ContextMenu.js.map +1 -0
  55. package/dist/components/DataTable.d.ts +83 -0
  56. package/dist/components/DataTable.d.ts.map +1 -0
  57. package/dist/components/DataTable.js +97 -0
  58. package/dist/components/DataTable.js.map +1 -0
  59. package/dist/components/Dialog.d.ts +49 -0
  60. package/dist/components/Dialog.d.ts.map +1 -0
  61. package/dist/components/Dialog.js +48 -0
  62. package/dist/components/Dialog.js.map +1 -0
  63. package/dist/components/Drawer.d.ts +56 -0
  64. package/dist/components/Drawer.d.ts.map +1 -0
  65. package/dist/components/Drawer.js +92 -0
  66. package/dist/components/Drawer.js.map +1 -0
  67. package/dist/components/EmptyState.d.ts +39 -0
  68. package/dist/components/EmptyState.d.ts.map +1 -0
  69. package/dist/components/EmptyState.js +19 -0
  70. package/dist/components/EmptyState.js.map +1 -0
  71. package/dist/components/Field.d.ts +37 -0
  72. package/dist/components/Field.d.ts.map +1 -0
  73. package/dist/components/Field.js +12 -0
  74. package/dist/components/Field.js.map +1 -0
  75. package/dist/components/Fieldset.d.ts +25 -0
  76. package/dist/components/Fieldset.d.ts.map +1 -0
  77. package/dist/components/Fieldset.js +17 -0
  78. package/dist/components/Fieldset.js.map +1 -0
  79. package/dist/components/FileDropZone.d.ts +60 -0
  80. package/dist/components/FileDropZone.d.ts.map +1 -0
  81. package/dist/components/FileDropZone.js +121 -0
  82. package/dist/components/FileDropZone.js.map +1 -0
  83. package/dist/components/Form.d.ts +22 -0
  84. package/dist/components/Form.d.ts.map +1 -0
  85. package/dist/components/Form.js +20 -0
  86. package/dist/components/Form.js.map +1 -0
  87. package/dist/components/Icon.d.ts +25 -0
  88. package/dist/components/Icon.d.ts.map +1 -0
  89. package/dist/components/Icon.js +38 -0
  90. package/dist/components/Icon.js.map +1 -0
  91. package/dist/components/IconButton.d.ts +25 -0
  92. package/dist/components/IconButton.d.ts.map +1 -0
  93. package/dist/components/IconButton.js +14 -0
  94. package/dist/components/IconButton.js.map +1 -0
  95. package/dist/components/Input.d.ts +24 -0
  96. package/dist/components/Input.d.ts.map +1 -0
  97. package/dist/components/Input.js +15 -0
  98. package/dist/components/Input.js.map +1 -0
  99. package/dist/components/Menu.d.ts +66 -0
  100. package/dist/components/Menu.d.ts.map +1 -0
  101. package/dist/components/Menu.js +34 -0
  102. package/dist/components/Menu.js.map +1 -0
  103. package/dist/components/MetadataList.d.ts +51 -0
  104. package/dist/components/MetadataList.d.ts.map +1 -0
  105. package/dist/components/MetadataList.js +25 -0
  106. package/dist/components/MetadataList.js.map +1 -0
  107. package/dist/components/NumberField.d.ts +54 -0
  108. package/dist/components/NumberField.d.ts.map +1 -0
  109. package/dist/components/NumberField.js +27 -0
  110. package/dist/components/NumberField.js.map +1 -0
  111. package/dist/components/Pagination.d.ts +40 -0
  112. package/dist/components/Pagination.d.ts.map +1 -0
  113. package/dist/components/Pagination.js +64 -0
  114. package/dist/components/Pagination.js.map +1 -0
  115. package/dist/components/Popover.d.ts +49 -0
  116. package/dist/components/Popover.d.ts.map +1 -0
  117. package/dist/components/Popover.js +14 -0
  118. package/dist/components/Popover.js.map +1 -0
  119. package/dist/components/Progress.d.ts +57 -0
  120. package/dist/components/Progress.d.ts.map +1 -0
  121. package/dist/components/Progress.js +31 -0
  122. package/dist/components/Progress.js.map +1 -0
  123. package/dist/components/Radio.d.ts +68 -0
  124. package/dist/components/Radio.d.ts.map +1 -0
  125. package/dist/components/Radio.js +18 -0
  126. package/dist/components/Radio.js.map +1 -0
  127. package/dist/components/RecordHeader.d.ts +53 -0
  128. package/dist/components/RecordHeader.d.ts.map +1 -0
  129. package/dist/components/RecordHeader.js +19 -0
  130. package/dist/components/RecordHeader.js.map +1 -0
  131. package/dist/components/ResizeHandle.d.ts +32 -0
  132. package/dist/components/ResizeHandle.d.ts.map +1 -0
  133. package/dist/components/ResizeHandle.js +33 -0
  134. package/dist/components/ResizeHandle.js.map +1 -0
  135. package/dist/components/ScrollArea.d.ts +60 -0
  136. package/dist/components/ScrollArea.d.ts.map +1 -0
  137. package/dist/components/ScrollArea.js +63 -0
  138. package/dist/components/ScrollArea.js.map +1 -0
  139. package/dist/components/Select.d.ts +39 -0
  140. package/dist/components/Select.d.ts.map +1 -0
  141. package/dist/components/Select.js +24 -0
  142. package/dist/components/Select.js.map +1 -0
  143. package/dist/components/Separator.d.ts +26 -0
  144. package/dist/components/Separator.d.ts.map +1 -0
  145. package/dist/components/Separator.js +22 -0
  146. package/dist/components/Separator.js.map +1 -0
  147. package/dist/components/Skeleton.d.ts +31 -0
  148. package/dist/components/Skeleton.d.ts.map +1 -0
  149. package/dist/components/Skeleton.js +17 -0
  150. package/dist/components/Skeleton.js.map +1 -0
  151. package/dist/components/Slider.d.ts +65 -0
  152. package/dist/components/Slider.d.ts.map +1 -0
  153. package/dist/components/Slider.js +30 -0
  154. package/dist/components/Slider.js.map +1 -0
  155. package/dist/components/Spinner.d.ts +23 -0
  156. package/dist/components/Spinner.d.ts.map +1 -0
  157. package/dist/components/Spinner.js +13 -0
  158. package/dist/components/Spinner.js.map +1 -0
  159. package/dist/components/SplitButton.d.ts +59 -0
  160. package/dist/components/SplitButton.d.ts.map +1 -0
  161. package/dist/components/SplitButton.js +30 -0
  162. package/dist/components/SplitButton.js.map +1 -0
  163. package/dist/components/Stat.d.ts +53 -0
  164. package/dist/components/Stat.d.ts.map +1 -0
  165. package/dist/components/Stat.js +23 -0
  166. package/dist/components/Stat.js.map +1 -0
  167. package/dist/components/StatusBadge.d.ts +19 -0
  168. package/dist/components/StatusBadge.d.ts.map +1 -0
  169. package/dist/components/StatusBadge.js +8 -0
  170. package/dist/components/StatusBadge.js.map +1 -0
  171. package/dist/components/StatusIndicator.d.ts +29 -0
  172. package/dist/components/StatusIndicator.d.ts.map +1 -0
  173. package/dist/components/StatusIndicator.js +8 -0
  174. package/dist/components/StatusIndicator.js.map +1 -0
  175. package/dist/components/Surface.d.ts +29 -0
  176. package/dist/components/Surface.d.ts.map +1 -0
  177. package/dist/components/Surface.js +8 -0
  178. package/dist/components/Surface.js.map +1 -0
  179. package/dist/components/Switch.d.ts +22 -0
  180. package/dist/components/Switch.d.ts.map +1 -0
  181. package/dist/components/Switch.js +11 -0
  182. package/dist/components/Switch.js.map +1 -0
  183. package/dist/components/Tabs.d.ts +45 -0
  184. package/dist/components/Tabs.d.ts.map +1 -0
  185. package/dist/components/Tabs.js +49 -0
  186. package/dist/components/Tabs.js.map +1 -0
  187. package/dist/components/Text.d.ts +33 -0
  188. package/dist/components/Text.d.ts.map +1 -0
  189. package/dist/components/Text.js +21 -0
  190. package/dist/components/Text.js.map +1 -0
  191. package/dist/components/Textarea.d.ts +54 -0
  192. package/dist/components/Textarea.d.ts.map +1 -0
  193. package/dist/components/Textarea.js +31 -0
  194. package/dist/components/Textarea.js.map +1 -0
  195. package/dist/components/Timeline.d.ts +35 -0
  196. package/dist/components/Timeline.d.ts.map +1 -0
  197. package/dist/components/Timeline.js +13 -0
  198. package/dist/components/Timeline.js.map +1 -0
  199. package/dist/components/Toast.d.ts +67 -0
  200. package/dist/components/Toast.d.ts.map +1 -0
  201. package/dist/components/Toast.js +94 -0
  202. package/dist/components/Toast.js.map +1 -0
  203. package/dist/components/Tooltip.d.ts +26 -0
  204. package/dist/components/Tooltip.d.ts.map +1 -0
  205. package/dist/components/Tooltip.js +15 -0
  206. package/dist/components/Tooltip.js.map +1 -0
  207. package/dist/components/Tree.d.ts +28 -0
  208. package/dist/components/Tree.d.ts.map +1 -0
  209. package/dist/components/Tree.js +129 -0
  210. package/dist/components/Tree.js.map +1 -0
  211. package/dist/components/VisuallyHidden.d.ts +17 -0
  212. package/dist/components/VisuallyHidden.d.ts.map +1 -0
  213. package/dist/components/VisuallyHidden.js +12 -0
  214. package/dist/components/VisuallyHidden.js.map +1 -0
  215. package/dist/components/Workbench.d.ts +31 -0
  216. package/dist/components/Workbench.d.ts.map +1 -0
  217. package/dist/components/Workbench.js +71 -0
  218. package/dist/components/Workbench.js.map +1 -0
  219. package/dist/components/fieldParts.d.ts +17 -0
  220. package/dist/components/fieldParts.d.ts.map +1 -0
  221. package/dist/components/fieldParts.js +22 -0
  222. package/dist/components/fieldParts.js.map +1 -0
  223. package/dist/components/meter-utils.d.ts +15 -0
  224. package/dist/components/meter-utils.d.ts.map +1 -0
  225. package/dist/components/meter-utils.js +15 -0
  226. package/dist/components/meter-utils.js.map +1 -0
  227. package/dist/components/navigation.d.ts +38 -0
  228. package/dist/components/navigation.d.ts.map +1 -0
  229. package/dist/components/navigation.js +96 -0
  230. package/dist/components/navigation.js.map +1 -0
  231. package/dist/components/pagination-utils.d.ts +10 -0
  232. package/dist/components/pagination-utils.d.ts.map +1 -0
  233. package/dist/components/pagination-utils.js +36 -0
  234. package/dist/components/pagination-utils.js.map +1 -0
  235. package/dist/components.css +678 -0
  236. package/dist/data.css +600 -0
  237. package/dist/disclosure.css +93 -0
  238. package/dist/drawer.css +226 -0
  239. package/dist/feedback.css +454 -0
  240. package/dist/forms.css +533 -0
  241. package/dist/index.d.ts +129 -0
  242. package/dist/index.d.ts.map +1 -0
  243. package/dist/index.js +67 -0
  244. package/dist/index.js.map +1 -0
  245. package/dist/motion/lifecycle.d.ts +44 -0
  246. package/dist/motion/lifecycle.d.ts.map +1 -0
  247. package/dist/motion/lifecycle.js +73 -0
  248. package/dist/motion/lifecycle.js.map +1 -0
  249. package/dist/motion/presence.d.ts +69 -0
  250. package/dist/motion/presence.d.ts.map +1 -0
  251. package/dist/motion/presence.js +103 -0
  252. package/dist/motion/presence.js.map +1 -0
  253. package/dist/motion/presets.d.ts +63 -0
  254. package/dist/motion/presets.d.ts.map +1 -0
  255. package/dist/motion/presets.js +30 -0
  256. package/dist/motion/presets.js.map +1 -0
  257. package/dist/motion/resolve.d.ts +31 -0
  258. package/dist/motion/resolve.d.ts.map +1 -0
  259. package/dist/motion/resolve.js +40 -0
  260. package/dist/motion/resolve.js.map +1 -0
  261. package/dist/motion/useRhineMotion.d.ts +19 -0
  262. package/dist/motion/useRhineMotion.d.ts.map +1 -0
  263. package/dist/motion/useRhineMotion.js +19 -0
  264. package/dist/motion/useRhineMotion.js.map +1 -0
  265. package/dist/motion/visibility.d.ts +6 -0
  266. package/dist/motion/visibility.d.ts.map +1 -0
  267. package/dist/motion/visibility.js +31 -0
  268. package/dist/motion/visibility.js.map +1 -0
  269. package/dist/overlays.css +465 -0
  270. package/dist/provider/RhineProvider.d.ts +65 -0
  271. package/dist/provider/RhineProvider.d.ts.map +1 -0
  272. package/dist/provider/RhineProvider.js +26 -0
  273. package/dist/provider/RhineProvider.js.map +1 -0
  274. package/dist/provider/messages.d.ts +209 -0
  275. package/dist/provider/messages.d.ts.map +1 -0
  276. package/dist/provider/messages.js +168 -0
  277. package/dist/provider/messages.js.map +1 -0
  278. package/dist/provider/portal.d.ts +17 -0
  279. package/dist/provider/portal.d.ts.map +1 -0
  280. package/dist/provider/portal.js +20 -0
  281. package/dist/provider/portal.js.map +1 -0
  282. package/dist/reset.css +45 -0
  283. package/dist/split.css +159 -0
  284. package/dist/status.css +353 -0
  285. package/dist/utils/cx.d.ts +2 -0
  286. package/dist/utils/cx.d.ts.map +1 -0
  287. package/dist/utils/cx.js +4 -0
  288. package/dist/utils/cx.js.map +1 -0
  289. package/package.json +67 -3
@@ -0,0 +1,13 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import * as React from 'react';
4
+ import { useRhineMessages } from '../provider/messages.js';
5
+ import { cx } from '../utils/cx.js';
6
+ export const Timeline = React.forwardRef(function Timeline({ events, emptyText, className, ...rest }, ref) {
7
+ const messages = useRhineMessages();
8
+ if (events.length === 0) {
9
+ return (_jsx("p", { className: cx('rl-timeline__empty', className), "data-slot": "timeline", children: emptyText === undefined ? messages.timeline.empty : emptyText }));
10
+ }
11
+ return (_jsx("ol", { ...rest, ref: ref, className: cx('rl-timeline', className), "data-slot": "timeline", children: events.map((event) => (_jsxs("li", { className: "rl-timeline__event", "data-tone": event.tone ?? 'neutral', children: [_jsx("time", { className: "rl-timeline__time", dateTime: event.dateTime, children: event.time ?? event.dateTime }), _jsx("span", { className: "rl-timeline__marker", "aria-hidden": "true" }), _jsxs("div", { className: "rl-timeline__body", children: [_jsx("p", { className: "rl-timeline__title", children: event.title }), event.description != null && _jsx("p", { className: "rl-timeline__description", children: event.description }), event.actor != null && _jsx("p", { className: "rl-timeline__actor", children: event.actor })] })] }, event.id))) }));
12
+ });
13
+ //# sourceMappingURL=Timeline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Timeline.js","sourceRoot":"","sources":["../../src/components/Timeline.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,EAAE,EAAE,MAAM,gBAAgB,CAAC;AA+BpC,MAAM,CAAC,MAAM,QAAQ,GAAG,KAAK,CAAC,UAAU,CAAkC,SAAS,QAAQ,CACzF,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,IAAI,EAAE,EACzC,GAAG;IAEH,MAAM,QAAQ,GAAG,gBAAgB,EAAE,CAAC;IACpC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,CACL,YAAG,SAAS,EAAE,EAAE,CAAC,oBAAoB,EAAE,SAAS,CAAC,eAAY,UAAU,YACpE,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,GAC5D,CACL,CAAC;IACJ,CAAC;IACD,OAAO,CACL,gBAAQ,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,EAAE,CAAC,aAAa,EAAE,SAAS,CAAC,eAAY,UAAU,YAClF,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CACrB,cAAmB,SAAS,EAAC,oBAAoB,eAAY,KAAK,CAAC,IAAI,IAAI,SAAS,aAClF,eAAM,SAAS,EAAC,mBAAmB,EAAC,QAAQ,EAAE,KAAK,CAAC,QAAQ,YACzD,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,QAAQ,GACxB,EACP,eAAM,SAAS,EAAC,qBAAqB,iBAAa,MAAM,GAAG,EAC3D,eAAK,SAAS,EAAC,mBAAmB,aAChC,YAAG,SAAS,EAAC,oBAAoB,YAAE,KAAK,CAAC,KAAK,GAAK,EAClD,KAAK,CAAC,WAAW,IAAI,IAAI,IAAI,YAAG,SAAS,EAAC,0BAA0B,YAAE,KAAK,CAAC,WAAW,GAAK,EAC5F,KAAK,CAAC,KAAK,IAAI,IAAI,IAAI,YAAG,SAAS,EAAC,oBAAoB,YAAE,KAAK,CAAC,KAAK,GAAK,IACvE,KATC,KAAK,CAAC,EAAE,CAUZ,CACN,CAAC,GACC,CACN,CAAC;AACJ,CAAC,CAAC,CAAC"}
@@ -0,0 +1,67 @@
1
+ import * as React from 'react';
2
+ import { Toast as BaseToast } from '@base-ui/react/toast';
3
+ import type { StatusKind } from './StatusBadge.js';
4
+ /**
5
+ * Notifications on Base UI Toast (ADR-0001). The viewport is a polite live region (F6 jumps
6
+ * into it); `priority: 'high'` toasts are announced assertively. Toasts pause their timer
7
+ * while hovered or focused, stack with a peek, and can be swiped away on touch.
8
+ * `RhineProvider` mounts the provider and viewport, so call `useToast()` anywhere inside it.
9
+ *
10
+ * ADR-0006 §8: `show({ id })` with a visible id updates that toast in place and restarts its
11
+ * timer; the action closes its toast after running (unless `keepOpen`); toasts with an action
12
+ * stay at least 10 s; `promise()` turns one toast from 处理中 into the result.
13
+ */
14
+ export type ToastStatus = Exclude<StatusKind, 'neutral'> | 'neutral';
15
+ /** A single follow-up action, e.g. 撤销 / 查看 / 重试. */
16
+ export interface ToastAction {
17
+ label: string;
18
+ onClick: () => void;
19
+ /** Keep the toast open after the action runs. By default it closes. */
20
+ keepOpen?: boolean;
21
+ }
22
+ export interface ToastOptions {
23
+ /** Showing a toast with the id of one still on screen updates it in place (no stacking). */
24
+ id?: string;
25
+ title: React.ReactNode;
26
+ description?: React.ReactNode;
27
+ status?: ToastStatus;
28
+ /**
29
+ * Auto-dismiss delay in ms. `0` keeps it until dismissed; use for errors that need action.
30
+ * Defaults to the provider's `toastTimeout`; with an `action`, to at least 10 s.
31
+ */
32
+ timeout?: number;
33
+ /** `high` interrupts screen readers (role=alert). Reserve for failures and time-critical notices. */
34
+ priority?: 'low' | 'high';
35
+ /** The page must still offer the same result or an equivalent control; the toast is a shortcut. */
36
+ action?: ToastAction;
37
+ onClose?: () => void;
38
+ }
39
+ /** A promise stage: a title, full options, or (for success / error) a function of the outcome. */
40
+ export type ToastPromiseStage<Arg> = string | ToastOptions | ((value: Arg) => string | ToastOptions);
41
+ export interface ToastPromiseOptions<Value> {
42
+ /** Shown until the promise settles; never auto-dismisses. Status defaults to `info`. */
43
+ loading: string | ToastOptions;
44
+ /** Status defaults to `success`. */
45
+ success: ToastPromiseStage<Value>;
46
+ /** Status defaults to `danger`, priority to `high` and timeout to `0` (stays until dismissed). */
47
+ error: ToastPromiseStage<unknown>;
48
+ }
49
+ export interface ToastApi {
50
+ /** Show a toast; returns its id. With an existing `id`, updates that toast instead. */
51
+ show: (options: ToastOptions) => string;
52
+ /** Replace the content of an existing toast (e.g. 处理中 → 已完成). */
53
+ update: (id: string, options: Partial<ToastOptions>) => void;
54
+ dismiss: (id?: string) => void;
55
+ /**
56
+ * One toast follows the promise: `loading` until it settles, then `success` or `error` in
57
+ * place. Returns a promise with the same outcome (it rejects when the input rejects).
58
+ */
59
+ promise: <Value>(promise: Promise<Value>, options: ToastPromiseOptions<Value>) => Promise<Value>;
60
+ }
61
+ export type ToastProviderProps = React.ComponentProps<typeof BaseToast.Provider>;
62
+ /** Toast queue. Mounted by RhineProvider; render it yourself only without one. */
63
+ export declare function ToastProvider({ timeout, ...rest }: ToastProviderProps): React.JSX.Element;
64
+ export declare function useToast(): ToastApi;
65
+ /** Viewport that renders queued toasts. Mounted by RhineProvider; render it yourself only without one. */
66
+ export declare function ToastViewport(): React.JSX.Element | null;
67
+ //# sourceMappingURL=Toast.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Toast.d.ts","sourceRoot":"","sources":["../../src/components/Toast.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAI1D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEnD;;;;;;;;;GASG;AAEH,MAAM,MAAM,WAAW,GAAG,OAAO,CAAC,UAAU,EAAE,SAAS,CAAC,GAAG,SAAS,CAAC;AAErE,oDAAoD;AACpD,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,uEAAuE;IACvE,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,YAAY;IAC3B,4FAA4F;IAC5F,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,WAAW,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC9B,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,qGAAqG;IACrG,QAAQ,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;IAC1B,mGAAmG;IACnG,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;CACtB;AAED,kGAAkG;AAClG,MAAM,MAAM,iBAAiB,CAAC,GAAG,IAAI,MAAM,GAAG,YAAY,GAAG,CAAC,CAAC,KAAK,EAAE,GAAG,KAAK,MAAM,GAAG,YAAY,CAAC,CAAC;AAErG,MAAM,WAAW,mBAAmB,CAAC,KAAK;IACxC,wFAAwF;IACxF,OAAO,EAAE,MAAM,GAAG,YAAY,CAAC;IAC/B,oCAAoC;IACpC,OAAO,EAAE,iBAAiB,CAAC,KAAK,CAAC,CAAC;IAClC,kGAAkG;IAClG,KAAK,EAAE,iBAAiB,CAAC,OAAO,CAAC,CAAC;CACnC;AAOD,MAAM,WAAW,QAAQ;IACvB,uFAAuF;IACvF,IAAI,EAAE,CAAC,OAAO,EAAE,YAAY,KAAK,MAAM,CAAC;IACxC,iEAAiE;IACjE,MAAM,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,YAAY,CAAC,KAAK,IAAI,CAAC;IAC7D,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/B;;;OAGG;IACH,OAAO,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,mBAAmB,CAAC,KAAK,CAAC,KAAK,OAAO,CAAC,KAAK,CAAC,CAAC;CAClG;AASD,MAAM,MAAM,kBAAkB,GAAG,KAAK,CAAC,cAAc,CAAC,OAAO,SAAS,CAAC,QAAQ,CAAC,CAAC;AAEjF,kFAAkF;AAClF,wBAAgB,aAAa,CAAC,EAAE,OAA8B,EAAE,GAAG,IAAI,EAAE,EAAE,kBAAkB,qBAM5F;AAsCD,wBAAgB,QAAQ,IAAI,QAAQ,CA6BnC;AAiDD,0GAA0G;AAC1G,wBAAgB,aAAa,6BAY5B"}
@@ -0,0 +1,94 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import * as React from 'react';
4
+ import { Toast as BaseToast } from '@base-ui/react/toast';
5
+ import { useRhineMessages } from '../provider/messages.js';
6
+ import { usePortalContainer, usePortalPending } from '../provider/portal.js';
7
+ import { Spinner } from './Spinner.js';
8
+ /** Toasts with an action stay at least this long, so there is time to reach the button. */
9
+ const ACTION_MIN_TIMEOUT = 10000;
10
+ const BASE_DEFAULT_TIMEOUT = 5000;
11
+ /** The provider's default timeout; Base UI keeps it private, so ToastProvider republishes it. */
12
+ const ToastTimeoutContext = React.createContext(BASE_DEFAULT_TIMEOUT);
13
+ /** Toast queue. Mounted by RhineProvider; render it yourself only without one. */
14
+ export function ToastProvider({ timeout = BASE_DEFAULT_TIMEOUT, ...rest }) {
15
+ return (_jsx(ToastTimeoutContext.Provider, { value: timeout, children: _jsx(BaseToast.Provider, { timeout: timeout, ...rest }) }));
16
+ }
17
+ function resolveTimeout(timeout, action, providerTimeout) {
18
+ if (timeout !== undefined || !action)
19
+ return timeout;
20
+ // `0` at the provider means "never auto-dismiss"; keep that.
21
+ return providerTimeout === 0 ? 0 : Math.max(providerTimeout, ACTION_MIN_TIMEOUT);
22
+ }
23
+ function toManager({ id, title, description, status = 'neutral', timeout, priority, action, onClose }, providerTimeout) {
24
+ return {
25
+ ...(id !== undefined && { id }),
26
+ title,
27
+ description,
28
+ timeout: resolveTimeout(timeout, action, providerTimeout),
29
+ priority,
30
+ onClose,
31
+ type: status,
32
+ data: { status, action },
33
+ };
34
+ }
35
+ function resolveStage(stage, value, defaults, providerTimeout) {
36
+ const resolved = typeof stage === 'function' ? stage(value) : stage;
37
+ const options = typeof resolved === 'string' ? { title: resolved } : resolved;
38
+ const merged = toManager({ ...defaults, ...options }, providerTimeout);
39
+ // Base UI owns the toast type during a promise (loading → success / error); keep ours in data.
40
+ const { type: _type, id: _id, ...rest } = merged;
41
+ return rest;
42
+ }
43
+ export function useToast() {
44
+ const manager = BaseToast.useToastManager();
45
+ const providerTimeout = React.useContext(ToastTimeoutContext);
46
+ return React.useMemo(() => ({
47
+ show: (options) => manager.add(toManager(options, providerTimeout)),
48
+ update: (id, { title, description, status, timeout, priority, action }) => manager.update(id, (prev) => ({
49
+ ...(title !== undefined && { title }),
50
+ ...(description !== undefined && { description }),
51
+ ...(timeout !== undefined && { timeout }),
52
+ ...(priority !== undefined && { priority }),
53
+ ...(status !== undefined && { type: status }),
54
+ data: {
55
+ status: status ?? prev.data?.status ?? 'neutral',
56
+ action: action ?? prev.data?.action,
57
+ },
58
+ })),
59
+ dismiss: (id) => manager.close(id),
60
+ promise: (promise, { loading, success, error }) => manager.promise(promise, {
61
+ loading: resolveStage(loading, undefined, { status: 'info' }, providerTimeout),
62
+ success: (value) => resolveStage(success, value, { status: 'success' }, providerTimeout),
63
+ error: (reason) => resolveStage(error, reason, { status: 'danger', priority: 'high', timeout: 0 }, providerTimeout),
64
+ }),
65
+ }), [manager, providerTimeout]);
66
+ }
67
+ function StatusIcon({ status }) {
68
+ return (_jsxs("svg", { className: "rl-toast__icon", viewBox: "0 0 16 16", "aria-hidden": "true", focusable: "false", "data-status": status, children: [status === 'success' && _jsx("path", { d: "m3.5 8.5 3 3 6-7" }), status === 'danger' && _jsx("path", { d: "M5 5l6 6M11 5l-6 6" }), status === 'warning' && _jsx("path", { d: "M8 2.5 14 13.5H2L8 2.5ZM8 7v2.5M8 11.5v.01" }), status === 'info' && _jsx("path", { d: "M8 7.5V11.5M8 5v.01" }), status === 'neutral' && _jsx("path", { d: "M4 8h8" })] }));
69
+ }
70
+ function ToastList() {
71
+ const { toasts, close } = BaseToast.useToastManager();
72
+ // Read where the viewport is mounted (the provider that owns the queue), not where show() ran.
73
+ const messages = useRhineMessages();
74
+ return toasts.map((toast) => {
75
+ const status = toast.data?.status ?? 'neutral';
76
+ const action = toast.data?.action;
77
+ const runAction = () => {
78
+ action?.onClick();
79
+ if (!action?.keepOpen)
80
+ close(toast.id);
81
+ };
82
+ return (_jsx(BaseToast.Root, { toast: toast, className: "rl-toast", "data-status": status, children: _jsxs(BaseToast.Content, { className: "rl-toast__content", children: [toast.type === 'loading' ? _jsx(Spinner, { size: "md", className: "rl-toast__icon" }) : _jsx(StatusIcon, { status: status }), _jsxs("div", { className: "rl-toast__text", children: [_jsx(BaseToast.Title, { className: "rl-toast__title" }), _jsx(BaseToast.Description, { className: "rl-toast__description" })] }), action && (_jsx(BaseToast.Action, { className: "rl-toast__action", onClick: runAction, children: action.label })), _jsx(BaseToast.Close, { className: "rl-toast__close", "aria-label": messages.toast.close, children: _jsx("svg", { viewBox: "0 0 16 16", "aria-hidden": "true", focusable: "false", children: _jsx("path", { d: "M4 4l8 8M12 4l-8 8" }) }) })] }) }, toast.id));
83
+ });
84
+ }
85
+ /** Viewport that renders queued toasts. Mounted by RhineProvider; render it yourself only without one. */
86
+ export function ToastViewport() {
87
+ const container = usePortalContainer();
88
+ const messages = useRhineMessages();
89
+ // Wait for the provider's portal node so the viewport never lands outside the themed root.
90
+ if (usePortalPending())
91
+ return null;
92
+ return (_jsx(BaseToast.Portal, { container: container, children: _jsx(BaseToast.Viewport, { className: "rl-toast-viewport", "data-slot": "toast-viewport", "aria-label": messages.toast.region, children: _jsx(ToastList, {}) }) }));
93
+ }
94
+ //# sourceMappingURL=Toast.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Toast.js","sourceRoot":"","sources":["../../src/components/Toast.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import * as React from 'react';
2
+ export type TooltipSide = 'top' | 'bottom' | 'left' | 'right';
3
+ export type TooltipProps = {
4
+ /** Short visual label. Must match the trigger's accessible name — tooltips are not announced. */
5
+ content: React.ReactNode;
6
+ /**
7
+ * A single focusable element (Button, IconButton, link). It must already have an accessible
8
+ * name; the tooltip only mirrors it for sighted mouse and keyboard users.
9
+ */
10
+ children: React.ReactElement<Record<string, unknown>>;
11
+ side?: TooltipSide;
12
+ /** Override the provider's hover delay (ms). Focus always opens immediately. */
13
+ delay?: number;
14
+ disabled?: boolean;
15
+ open?: boolean;
16
+ defaultOpen?: boolean;
17
+ onOpenChange?: (open: boolean) => void;
18
+ className?: string;
19
+ };
20
+ /**
21
+ * Visual label for icon-only or truncated controls (Base UI Tooltip). Not for essential
22
+ * information: tooltips are unavailable to touch and screen-reader users, so put anything
23
+ * important in visible text or a Popover instead.
24
+ */
25
+ export declare function Tooltip({ content, children, side, delay, disabled, open, defaultOpen, onOpenChange, className, }: TooltipProps): React.JSX.Element;
26
+ //# sourceMappingURL=Tooltip.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Tooltip.d.ts","sourceRoot":"","sources":["../../src/components/Tooltip.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAK/B,MAAM,MAAM,WAAW,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,CAAC;AAE9D,MAAM,MAAM,YAAY,GAAG;IACzB,iGAAiG;IACjG,OAAO,EAAE,KAAK,CAAC,SAAS,CAAC;IACzB;;;OAGG;IACH,QAAQ,EAAE,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACtD,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,gFAAgF;IAChF,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACvC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,OAAO,CAAC,EACtB,OAAO,EACP,QAAQ,EACR,IAAY,EACZ,KAAK,EACL,QAAQ,EACR,IAAI,EACJ,WAAW,EACX,YAAY,EACZ,SAAS,GACV,EAAE,YAAY,qBAmBd"}
@@ -0,0 +1,15 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { Tooltip as BaseTooltip } from '@base-ui/react/tooltip';
4
+ import { usePortalContainer } from '../provider/portal.js';
5
+ import { cx } from '../utils/cx.js';
6
+ /**
7
+ * Visual label for icon-only or truncated controls (Base UI Tooltip). Not for essential
8
+ * information: tooltips are unavailable to touch and screen-reader users, so put anything
9
+ * important in visible text or a Popover instead.
10
+ */
11
+ export function Tooltip({ content, children, side = 'top', delay, disabled, open, defaultOpen, onOpenChange, className, }) {
12
+ const container = usePortalContainer();
13
+ return (_jsxs(BaseTooltip.Root, { open: open, defaultOpen: defaultOpen, onOpenChange: onOpenChange ? (o) => onOpenChange(o) : undefined, disabled: disabled, children: [_jsx(BaseTooltip.Trigger, { render: children, delay: delay }), _jsx(BaseTooltip.Portal, { container: container, children: _jsx(BaseTooltip.Positioner, { side: side, sideOffset: 6, collisionPadding: 8, positionMethod: "fixed", className: "rl-tooltip__positioner", children: _jsx(BaseTooltip.Popup, { className: cx('rl-tooltip', className), "data-slot": "tooltip", children: content }) }) })] }));
14
+ }
15
+ //# sourceMappingURL=Tooltip.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Tooltip.js","sourceRoot":"","sources":["../../src/components/Tooltip.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAGb,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,EAAE,EAAE,MAAM,gBAAgB,CAAC;AAsBpC;;;;GAIG;AACH,MAAM,UAAU,OAAO,CAAC,EACtB,OAAO,EACP,QAAQ,EACR,IAAI,GAAG,KAAK,EACZ,KAAK,EACL,QAAQ,EACR,IAAI,EACJ,WAAW,EACX,YAAY,EACZ,SAAS,GACI;IACb,MAAM,SAAS,GAAG,kBAAkB,EAAE,CAAC;IACvC,OAAO,CACL,MAAC,WAAW,CAAC,IAAI,IACf,IAAI,EAAE,IAAI,EACV,WAAW,EAAE,WAAW,EACxB,YAAY,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,EAC/D,QAAQ,EAAE,QAAQ,aAElB,KAAC,WAAW,CAAC,OAAO,IAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,GAAI,EACvD,KAAC,WAAW,CAAC,MAAM,IAAC,SAAS,EAAE,SAAS,YACtC,KAAC,WAAW,CAAC,UAAU,IAAC,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,EAAE,gBAAgB,EAAE,CAAC,EAAE,cAAc,EAAC,OAAO,EAAC,SAAS,EAAC,wBAAwB,YAC/H,KAAC,WAAW,CAAC,KAAK,IAAC,SAAS,EAAE,EAAE,CAAC,YAAY,EAAE,SAAS,CAAC,eAAY,SAAS,YAC3E,OAAO,GACU,GACG,GACN,IACJ,CACpB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,28 @@
1
+ import * as React from 'react';
2
+ export interface TreeNode {
3
+ id: string;
4
+ label: React.ReactNode;
5
+ textValue?: string;
6
+ children?: TreeNode[];
7
+ loading?: boolean;
8
+ error?: React.ReactNode;
9
+ disabled?: boolean;
10
+ hasChildren?: boolean;
11
+ }
12
+ export type TreeProps = Omit<React.HTMLAttributes<HTMLDivElement>, 'children' | 'onSelect'> & {
13
+ label: string;
14
+ nodes: readonly TreeNode[];
15
+ selectedId?: string;
16
+ defaultSelectedId?: string;
17
+ onSelect?: (node: TreeNode) => void;
18
+ expandedIds?: readonly string[];
19
+ defaultExpandedIds?: readonly string[];
20
+ onExpandedChange?: (ids: string[]) => void;
21
+ onToggle?: (node: TreeNode, expanded: boolean) => void;
22
+ onLoadChildren?: (node: TreeNode) => void | Promise<void>;
23
+ onRetry?: (node: TreeNode) => void | Promise<void>;
24
+ empty?: React.ReactNode;
25
+ renderActions?: (node: TreeNode) => React.ReactNode;
26
+ };
27
+ export declare function Tree({ label, nodes, selectedId, defaultSelectedId, onSelect, expandedIds, defaultExpandedIds, onExpandedChange, onToggle, onLoadChildren, onRetry, empty, renderActions, className, onKeyDown, ...rest }: TreeProps): React.JSX.Element;
28
+ //# sourceMappingURL=Tree.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Tree.d.ts","sourceRoot":"","sources":["../../src/components/Tree.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAK/B,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,QAAQ,EAAE,CAAC;IACtB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACxB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AACD,MAAM,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC,EAAE,UAAU,GAAG,UAAU,CAAC,GAAG;IAC5F,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,SAAS,QAAQ,EAAE,CAAC;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,IAAI,CAAC;IACpC,WAAW,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAChC,kBAAkB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACvC,gBAAgB,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;IAC3C,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,KAAK,IAAI,CAAC;IACvD,cAAc,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1D,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnD,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACxB,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,KAAK,CAAC,SAAS,CAAC;CACrD,CAAC;AAEF,wBAAgB,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,iBAAiB,EAAE,QAAQ,EAAE,WAAW,EAAE,kBAAuB,EAAE,gBAAgB,EAAE,QAAQ,EAAE,cAAc,EAAE,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,IAAI,EAAE,EAAE,SAAS,qBAoGxO"}
@@ -0,0 +1,129 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
+ import * as React from 'react';
4
+ import { cx } from '../utils/cx.js';
5
+ import { useRhineMessages } from '../provider/messages.js';
6
+ import { Icon } from './Icon.js';
7
+ export function Tree({ label, nodes, selectedId, defaultSelectedId, onSelect, expandedIds, defaultExpandedIds = [], onExpandedChange, onToggle, onLoadChildren, onRetry, empty, renderActions, className, onKeyDown, ...rest }) {
8
+ const m = useRhineMessages().tree;
9
+ const uid = React.useId();
10
+ const rootRef = React.useRef(null);
11
+ const [selected, setSelected] = React.useState(defaultSelectedId);
12
+ const [innerExpanded, setExpanded] = React.useState([...defaultExpandedIds]);
13
+ const [focused, setFocused] = React.useState(selectedId ?? defaultSelectedId ?? nodes[0]?.id);
14
+ const requested = React.useRef(new Set());
15
+ const expanded = new Set(expandedIds ?? innerExpanded);
16
+ const active = selectedId ?? selected;
17
+ const flat = [];
18
+ const visited = new Set();
19
+ const walk = (list, parent) => list.forEach((node) => {
20
+ if (visited.has(node.id))
21
+ return;
22
+ visited.add(node.id);
23
+ flat.push({ node, parent });
24
+ if (expanded.has(node.id) && node.children)
25
+ walk(node.children, node.id);
26
+ });
27
+ walk(nodes);
28
+ React.useEffect(() => {
29
+ if (!onLoadChildren)
30
+ return;
31
+ for (const { node } of flat) {
32
+ if (expanded.has(node.id) && node.hasChildren && node.children === undefined && !node.loading && !node.error && !requested.current.has(node.id)) {
33
+ requested.current.add(node.id);
34
+ void onLoadChildren(node);
35
+ }
36
+ }
37
+ }, [expandedIds, innerExpanded, nodes, onLoadChildren]);
38
+ React.useEffect(() => {
39
+ if (selectedId !== undefined)
40
+ setFocused(selectedId);
41
+ }, [selectedId]);
42
+ const focus = (id) => {
43
+ if (!id)
44
+ return;
45
+ setFocused(id);
46
+ rootRef.current?.querySelectorAll('[role="treeitem"]').forEach((el) => { if (el.dataset.treeId === id)
47
+ el.focus(); });
48
+ };
49
+ const select = (node) => {
50
+ if (node.disabled)
51
+ return;
52
+ if (selectedId === undefined)
53
+ setSelected(node.id);
54
+ onSelect?.(node);
55
+ };
56
+ const toggle = (node, open = !expanded.has(node.id)) => {
57
+ if (node.disabled || (!node.hasChildren && !node.children?.length))
58
+ return;
59
+ const ids = open ? [...expanded, node.id] : [...expanded].filter((id) => id !== node.id);
60
+ if (expandedIds === undefined)
61
+ setExpanded(ids);
62
+ onExpandedChange?.(ids);
63
+ onToggle?.(node, open);
64
+ if (open && node.hasChildren && node.children === undefined && !node.loading && !node.error && !requested.current.has(node.id)) {
65
+ requested.current.add(node.id);
66
+ void onLoadChildren?.(node);
67
+ }
68
+ };
69
+ const typeahead = React.useRef({ value: '', at: 0 });
70
+ const keyDown = (event) => {
71
+ onKeyDown?.(event);
72
+ if (event.defaultPrevented || event.altKey || event.ctrlKey || event.metaKey)
73
+ return;
74
+ const element = event.target;
75
+ if (element.getAttribute('role') !== 'treeitem')
76
+ return;
77
+ const index = flat.findIndex(({ node }) => node.id === element.dataset.treeId);
78
+ const current = flat[index];
79
+ if (!current)
80
+ return;
81
+ const { node, parent } = current;
82
+ let next;
83
+ if (event.key === 'ArrowDown')
84
+ next = flat[Math.min(index + 1, flat.length - 1)]?.node.id;
85
+ else if (event.key === 'ArrowUp')
86
+ next = flat[Math.max(index - 1, 0)]?.node.id;
87
+ else if (event.key === 'Home')
88
+ next = flat[0]?.node.id;
89
+ else if (event.key === 'End')
90
+ next = flat.at(-1)?.node.id;
91
+ else if (event.key === 'ArrowRight') {
92
+ if (expanded.has(node.id))
93
+ next = node.children?.[0]?.id;
94
+ else
95
+ toggle(node, true);
96
+ }
97
+ else if (event.key === 'ArrowLeft') {
98
+ if (expanded.has(node.id))
99
+ toggle(node, false);
100
+ else
101
+ next = parent;
102
+ }
103
+ else if (event.key === 'Enter' || event.key === ' ')
104
+ select(node);
105
+ else if (event.key.length === 1 && !event.nativeEvent.isComposing) {
106
+ const now = Date.now();
107
+ const query = now - typeahead.current.at < 600 ? typeahead.current.value + event.key : event.key;
108
+ typeahead.current = { value: query, at: now };
109
+ const reordered = [...flat.slice(index + 1), ...flat.slice(0, index + 1)];
110
+ next = reordered.find(({ node: candidate }) => !candidate.disabled && (candidate.textValue ?? String(candidate.label)).toLocaleLowerCase().startsWith(query.toLocaleLowerCase()))?.node.id;
111
+ }
112
+ else
113
+ return;
114
+ event.preventDefault();
115
+ if (next)
116
+ focus(next);
117
+ };
118
+ const tabStop = flat.some(({ node }) => node.id === focused) ? focused : flat[0]?.node.id;
119
+ const renderNodes = (list, depth = 1) => list.map((node, index) => {
120
+ const open = expanded.has(node.id);
121
+ const branch = Boolean(node.hasChildren || node.children?.length);
122
+ const name = node.textValue ?? String(node.label);
123
+ const labelId = `${uid}-${node.id}-label`;
124
+ return _jsxs("li", { role: "treeitem", "data-tree-id": node.id, "aria-level": depth, "aria-posinset": index + 1, "aria-setsize": list.length, "aria-selected": active === node.id, "aria-labelledby": labelId, "aria-expanded": branch ? open : undefined, "aria-disabled": node.disabled || undefined, tabIndex: tabStop === node.id ? 0 : -1, className: "rl-tree__item", onFocus: (event) => { if (event.target === event.currentTarget)
125
+ setFocused(node.id); }, children: [_jsxs("div", { className: "rl-tree__row", "data-selected": active === node.id || undefined, children: [branch && _jsx("button", { type: "button", className: "rl-tree__toggle", tabIndex: -1, disabled: node.disabled, "aria-label": open ? m.collapse(name) : m.expand(name), onClick: () => { focus(node.id); toggle(node); }, children: _jsx(Icon, { name: open ? 'ChevronDown' : 'ChevronRight' }) }), _jsx("button", { type: "button", className: "rl-tree__select", tabIndex: -1, disabled: node.disabled, onClick: () => { focus(node.id); select(node); }, children: _jsx("span", { id: labelId, className: "rl-tree__label", children: node.label }) }), renderActions?.(node)] }), open && _jsxs(_Fragment, { children: [node.loading && _jsx("p", { role: "status", className: "rl-tree__note", children: m.loading }), node.error && _jsxs("div", { className: "rl-tree__note", children: [_jsx("p", { role: "alert", children: node.error }), (onRetry || onLoadChildren) && _jsx("button", { type: "button", onClick: () => (onRetry ?? onLoadChildren)?.(node), children: m.retry(name) })] }), node.children?.length ? _jsx("ul", { role: "group", children: renderNodes(node.children, depth + 1) }) : null] })] }, node.id);
126
+ });
127
+ return _jsxs("div", { ...rest, ref: rootRef, className: cx('rl-tree', className), onKeyDown: keyDown, children: [_jsx("ul", { role: "tree", "aria-label": label, className: "rl-tree__root", children: renderNodes(nodes) }), nodes.length === 0 && _jsx("p", { children: empty ?? m.empty })] });
128
+ }
129
+ //# sourceMappingURL=Tree.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Tree.js","sourceRoot":"","sources":["../../src/components/Tree.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import * as React from 'react';
2
+ export type VisuallyHiddenElement = 'span' | 'div' | 'p' | 'h2' | 'h3' | 'label' | 'legend';
3
+ export type VisuallyHiddenProps = React.HTMLAttributes<HTMLElement> & {
4
+ as?: VisuallyHiddenElement;
5
+ /** Become visible while it or a descendant has focus (skip links). */
6
+ focusable?: boolean;
7
+ };
8
+ /**
9
+ * Content for assistive tech only: still in the accessibility tree, removed from layout.
10
+ * Not a way to hide focusable controls unless `focusable` makes them reappear on focus.
11
+ */
12
+ export declare const VisuallyHidden: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLElement> & {
13
+ as?: VisuallyHiddenElement;
14
+ /** Become visible while it or a descendant has focus (skip links). */
15
+ focusable?: boolean;
16
+ } & React.RefAttributes<HTMLElement>>;
17
+ //# sourceMappingURL=VisuallyHidden.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VisuallyHidden.d.ts","sourceRoot":"","sources":["../../src/components/VisuallyHidden.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAG/B,MAAM,MAAM,qBAAqB,GAAG,MAAM,GAAG,KAAK,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,OAAO,GAAG,QAAQ,CAAC;AAE5F,MAAM,MAAM,mBAAmB,GAAG,KAAK,CAAC,cAAc,CAAC,WAAW,CAAC,GAAG;IACpE,EAAE,CAAC,EAAE,qBAAqB,CAAC;IAC3B,sEAAsE;IACtE,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,cAAc;SATpB,qBAAqB;IAC1B,sEAAsE;gBAC1D,OAAO;qCAmBnB,CAAC"}
@@ -0,0 +1,12 @@
1
+ 'use client';
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import * as React from 'react';
4
+ import { cx } from '../utils/cx.js';
5
+ /**
6
+ * Content for assistive tech only: still in the accessibility tree, removed from layout.
7
+ * Not a way to hide focusable controls unless `focusable` makes them reappear on focus.
8
+ */
9
+ export const VisuallyHidden = React.forwardRef(function VisuallyHidden({ as: Element = 'span', focusable = false, className, ...rest }, ref) {
10
+ return (_jsx(Element, { ...rest, ref: ref, className: cx('rl-visually-hidden', className), "data-focusable": focusable || undefined }));
11
+ });
12
+ //# sourceMappingURL=VisuallyHidden.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VisuallyHidden.js","sourceRoot":"","sources":["../../src/components/VisuallyHidden.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,EAAE,EAAE,MAAM,gBAAgB,CAAC;AAUpC;;;GAGG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,KAAK,CAAC,UAAU,CAAmC,SAAS,cAAc,CACtG,EAAE,EAAE,EAAE,OAAO,GAAG,MAAM,EAAE,SAAS,GAAG,KAAK,EAAE,SAAS,EAAE,GAAG,IAAI,EAAE,EAC/D,GAAG;IAEH,OAAO,CACL,KAAC,OAAO,OACF,IAAI,EACR,GAAG,EAAE,GAAuB,EAC5B,SAAS,EAAE,EAAE,CAAC,oBAAoB,EAAE,SAAS,CAAC,oBAC9B,SAAS,IAAI,SAAS,GACtC,CACH,CAAC;AACJ,CAAC,CAAC,CAAC"}
@@ -0,0 +1,31 @@
1
+ import * as React from 'react';
2
+ export type WorkbenchProps = Omit<React.HTMLAttributes<HTMLDivElement>, 'children'> & {
3
+ rail?: React.ReactNode;
4
+ indexLabel?: string;
5
+ mainLabel?: string;
6
+ header?: React.ReactNode;
7
+ children?: React.ReactNode;
8
+ indexOpen?: boolean;
9
+ defaultIndexOpen?: boolean;
10
+ onIndexOpenChange?: (open: boolean) => void;
11
+ indexSize?: number;
12
+ defaultIndexSize?: number;
13
+ indexMin?: number;
14
+ indexMax?: number;
15
+ onIndexSizeChange?: (size: number) => void;
16
+ index?: React.ReactNode;
17
+ };
18
+ interface WorkbenchContextValue {
19
+ target: HTMLDivElement | null;
20
+ register: (id: string, present: boolean) => void;
21
+ indexOpen: boolean;
22
+ setIndexOpen: (open: boolean) => void;
23
+ }
24
+ /** Route-owned index content. A portal preserves the route's data/provider context. */
25
+ export declare function WorkbenchIndex({ children }: {
26
+ children?: React.ReactNode;
27
+ }): React.ReactPortal | null;
28
+ export declare function useWorkbench(): WorkbenchContextValue | null;
29
+ export declare function Workbench({ rail, index, header, children, indexLabel, mainLabel, indexOpen, defaultIndexOpen, onIndexOpenChange, indexSize, defaultIndexSize, indexMin, indexMax, onIndexSizeChange, className, style, ...rest }: WorkbenchProps): React.JSX.Element;
30
+ export {};
31
+ //# sourceMappingURL=Workbench.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Workbench.d.ts","sourceRoot":"","sources":["../../src/components/Workbench.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAM/B,MAAM,MAAM,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC,EAAE,UAAU,CAAC,GAAG;IACpF,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACzB,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,iBAAiB,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IAC5C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,iBAAiB,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3C,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CACzB,CAAC;AAEF,UAAU,qBAAqB;IAC7B,MAAM,EAAE,cAAc,GAAG,IAAI,CAAC;IAC9B,QAAQ,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IACjD,SAAS,EAAE,OAAO,CAAC;IACnB,YAAY,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;CACvC;AAGD,uFAAuF;AACvF,wBAAgB,cAAc,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;CAAE,4BAU1E;AAED,wBAAgB,YAAY,iCAAiD;AAE7E,wBAAgB,SAAS,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,gBAAuB,EAAE,iBAAiB,EAAE,SAAS,EAAE,gBAAsB,EAAE,QAAc,EAAE,QAAc,EAAE,iBAAiB,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,IAAI,EAAE,EAAE,cAAc,qBAiDzQ"}
@@ -0,0 +1,71 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import * as React from 'react';
4
+ import { createPortal } from 'react-dom';
5
+ import { cx } from '../utils/cx.js';
6
+ import { useRhineMessages } from '../provider/messages.js';
7
+ import { ResizeHandle } from './ResizeHandle.js';
8
+ const WorkbenchContext = React.createContext(null);
9
+ /** Route-owned index content. A portal preserves the route's data/provider context. */
10
+ export function WorkbenchIndex({ children }) {
11
+ const context = React.useContext(WorkbenchContext);
12
+ const id = React.useId();
13
+ const register = context?.register;
14
+ React.useEffect(() => {
15
+ if (!register)
16
+ return;
17
+ register(id, true);
18
+ return () => register(id, false);
19
+ }, [register, id]);
20
+ return context?.target ? createPortal(children, context.target) : null;
21
+ }
22
+ export function useWorkbench() { return React.useContext(WorkbenchContext); }
23
+ export function Workbench({ rail, index, header, children, indexLabel, mainLabel, indexOpen, defaultIndexOpen = true, onIndexOpenChange, indexSize, defaultIndexSize = 260, indexMin = 200, indexMax = 400, onIndexSizeChange, className, style, ...rest }) {
24
+ const messages = useRhineMessages();
25
+ const [inner, setInner] = React.useState(defaultIndexOpen);
26
+ const [innerSize, setInnerSize] = React.useState(defaultIndexSize);
27
+ const [target, setTarget] = React.useState(null);
28
+ const [registered, setRegistered] = React.useState(new Set());
29
+ const mainRef = React.useRef(null);
30
+ const indexRef = React.useRef(null);
31
+ const focusedIndex = React.useRef(false);
32
+ const previousOpen = React.useRef(indexOpen ?? defaultIndexOpen);
33
+ const open = indexOpen ?? inner;
34
+ const hasIndex = index != null || registered.size > 0;
35
+ const size = Math.max(indexMin, Math.min(indexMax, indexSize ?? innerSize));
36
+ const [dragging, setDragging] = React.useState(false);
37
+ const setOpen = React.useCallback((next) => { if (indexOpen === undefined)
38
+ setInner(next); onIndexOpenChange?.(next); }, [indexOpen, onIndexOpenChange]);
39
+ const register = React.useCallback((id, present) => setRegistered((old) => {
40
+ if (old.has(id) === present)
41
+ return old;
42
+ const next = new Set(old);
43
+ if (present)
44
+ next.add(id);
45
+ else
46
+ next.delete(id);
47
+ return next;
48
+ }), []);
49
+ React.useLayoutEffect(() => {
50
+ if (previousOpen.current && !open && (focusedIndex.current || indexRef.current?.contains(document.activeElement))) {
51
+ const target = mainRef.current;
52
+ if (target) {
53
+ target.focus();
54
+ if (document.activeElement !== target)
55
+ requestAnimationFrame(() => target.focus());
56
+ }
57
+ focusedIndex.current = false;
58
+ }
59
+ previousOpen.current = open;
60
+ }, [open]);
61
+ const value = React.useMemo(() => ({ target, register, indexOpen: open, setIndexOpen: setOpen }), [target, register, open, setOpen]);
62
+ return _jsx(WorkbenchContext.Provider, { value: value, children: _jsxs("div", { ...rest, className: cx('rl-workbench', className), style: { ...style, '--rl-workbench-index-size': `${open && hasIndex ? size : 0}px` }, "data-has-rail": rail != null || undefined, "data-index-open": (open && hasIndex) || undefined, "data-dragging": dragging || undefined, children: [rail && _jsx("div", { className: "rl-workbench__rail", children: rail }), header && _jsx("header", { className: "rl-workbench__header", children: header }), _jsxs("aside", { ref: indexRef, role: "complementary", className: "rl-workbench__index", "aria-label": indexLabel ?? messages.workbench.index, hidden: !open || !hasIndex, onFocusCapture: () => { focusedIndex.current = true; }, onBlurCapture: (event) => {
63
+ if (event.relatedTarget && !event.currentTarget.contains(event.relatedTarget))
64
+ focusedIndex.current = false;
65
+ }, children: [index, _jsx("div", { ref: setTarget })] }), open && hasIndex && _jsx(ResizeHandle, { className: "rl-workbench__resize", pane: "start", size: size, min: indexMin, max: indexMax, onSizeChange: (next) => {
66
+ if (indexSize === undefined)
67
+ setInnerSize(next);
68
+ onIndexSizeChange?.(next);
69
+ }, onDraggingChange: setDragging, label: messages.workbench.resize, getAriaValueText: (width) => messages.workbench.width(String(width)) }), _jsx("main", { ref: mainRef, tabIndex: -1, "aria-label": mainLabel ?? messages.workbench.content, className: "rl-workbench__main", children: children })] }) });
70
+ }
71
+ //# sourceMappingURL=Workbench.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Workbench.js","sourceRoot":"","sources":["../../src/components/Workbench.tsx"],"names":[],"mappings":"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"}