@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,40 @@
1
+ import * as React from 'react';
2
+ export interface PaginationLabels {
3
+ nav?: string;
4
+ previous?: string;
5
+ next?: string;
6
+ page?: (page: number) => string;
7
+ /** Compact summary shown in narrow containers, e.g. "第 3 / 40 页". */
8
+ compact?: (page: number, pageCount: number) => string;
9
+ /** Range summary when `totalItems` is known, e.g. "第 51–75 条,共 1000 条". */
10
+ status?: (from: number, to: number, total: number) => string;
11
+ }
12
+ type PageCountSource = {
13
+ pageCount: number;
14
+ totalItems?: number;
15
+ pageSize?: number;
16
+ } | {
17
+ pageCount?: never;
18
+ totalItems: number;
19
+ pageSize: number;
20
+ };
21
+ export type PaginationProps = Omit<React.HTMLAttributes<HTMLElement>, 'onChange' | 'children'> & PageCountSource & {
22
+ page?: number;
23
+ defaultPage?: number;
24
+ onPageChange?: (page: number) => void;
25
+ /** Pages shown on each side of the current page. */
26
+ siblingCount?: number;
27
+ /** Disable every control. */
28
+ disabled?: boolean;
29
+ /**
30
+ * A page request is in flight: controls ignore presses and announce `aria-disabled`, but stay
31
+ * focusable so keyboard focus is not dropped to <body> while the table reloads.
32
+ */
33
+ busy?: boolean;
34
+ /** Show the "第 a–b 条,共 n 条" summary (needs `totalItems` and `pageSize`). */
35
+ showStatus?: boolean;
36
+ labels?: PaginationLabels;
37
+ };
38
+ export declare const Pagination: React.ForwardRefExoticComponent<PaginationProps & React.RefAttributes<HTMLElement>>;
39
+ export {};
40
+ //# sourceMappingURL=Pagination.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Pagination.d.ts","sourceRoot":"","sources":["../../src/components/Pagination.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAiB/B,MAAM,WAAW,gBAAgB;IAC/B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;IAChC,qEAAqE;IACrE,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,MAAM,CAAC;IACtD,2EAA2E;IAC3E,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;CAC9D;AAED,KAAK,eAAe,GAChB;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,GAC7D;IAAE,SAAS,CAAC,EAAE,KAAK,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC;AAEhE,MAAM,MAAM,eAAe,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,WAAW,CAAC,EAAE,UAAU,GAAG,UAAU,CAAC,GAC5F,eAAe,GAAG;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,oDAAoD;IACpD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,6BAA6B;IAC7B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;OAGG;IACH,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,4EAA4E;IAC5E,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,MAAM,CAAC,EAAE,gBAAgB,CAAC;CAC3B,CAAC;AAUJ,eAAO,MAAM,UAAU,qFAyIrB,CAAC"}
@@ -0,0 +1,64 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import * as React from 'react';
4
+ import { useRhineLocale } from '../provider/messages.js';
5
+ import { cx } from '../utils/cx.js';
6
+ import { getPaginationItems } from './pagination-utils.js';
7
+ /**
8
+ * Page navigation (ADR-0005 §3): a `<nav>` of plain buttons in normal Tab order. The current page
9
+ * keeps `aria-current="page"` and stays focusable so it can be announced. Narrow containers
10
+ * switch to "上一页 · 第 n / m 页 · 下一页" through a container query.
11
+ *
12
+ * <Pagination page={page} totalItems={1000} pageSize={25} onPageChange={setPage} />
13
+ */
14
+ function clamp(value, min, max) {
15
+ return Math.min(Math.max(Math.round(value), min), max);
16
+ }
17
+ function ChevronIcon({ direction }) {
18
+ return (_jsx("svg", { className: "rl-pagination__icon", viewBox: "0 0 16 16", "aria-hidden": "true", focusable: "false", children: _jsx("path", { d: direction === 'previous' ? 'M10 3.5 5.5 8l4.5 4.5' : 'M6 3.5 10.5 8 6 12.5' }) }));
19
+ }
20
+ export const Pagination = React.forwardRef(function Pagination({ page: pageProp, defaultPage = 1, onPageChange, pageCount: pageCountProp, totalItems, pageSize, siblingCount = 1, disabled = false, busy = false, showStatus = totalItems != null && pageSize != null, labels: labelsProp, className, ...rest }, ref) {
21
+ const { messages, formatNumber } = useRhineLocale();
22
+ const m = messages.pagination;
23
+ // `labels` (component prop) > provider messages > zhCN (ADR-0009 §1).
24
+ const labels = {
25
+ nav: labelsProp?.nav ?? m.nav,
26
+ previous: labelsProp?.previous ?? m.previous,
27
+ next: labelsProp?.next ?? m.next,
28
+ page: labelsProp?.page ?? ((p) => m.page(p, formatNumber)),
29
+ compact: labelsProp?.compact ?? ((p, n) => m.compact(p, n, formatNumber)),
30
+ status: labelsProp?.status ?? ((from, to, total) => m.status(from, to, total, formatNumber)),
31
+ };
32
+ const pageCount = Math.max(1, pageCountProp ?? (totalItems != null && pageSize ? Math.ceil(totalItems / pageSize) : 1));
33
+ const [uncontrolled, setUncontrolled] = React.useState(defaultPage);
34
+ const page = clamp(pageProp ?? uncontrolled, 1, pageCount);
35
+ const listRef = React.useRef(null);
36
+ const pendingFocus = React.useRef(null);
37
+ const go = (next, focusKey) => {
38
+ const target = clamp(next, 1, pageCount);
39
+ if (target === page || disabled || busy)
40
+ return;
41
+ pendingFocus.current = focusKey;
42
+ if (pageProp === undefined)
43
+ setUncontrolled(target);
44
+ onPageChange?.(target);
45
+ };
46
+ // Keep focus on the control the user pressed. If the page list re-flowed and that button is
47
+ // gone (or became disabled at an edge), fall back to the current page instead of <body>.
48
+ React.useLayoutEffect(() => {
49
+ const key = pendingFocus.current;
50
+ if (!key || !listRef.current)
51
+ return;
52
+ pendingFocus.current = null;
53
+ const active = document.activeElement;
54
+ if (active && listRef.current.contains(active) && !active.disabled)
55
+ return;
56
+ const byKey = listRef.current.querySelector(`[data-key="${key}"]:not(:disabled)`);
57
+ (byKey ?? listRef.current.querySelector('[aria-current="page"]'))?.focus();
58
+ }, [page]);
59
+ const items = getPaginationItems(page, pageCount, siblingCount);
60
+ const from = totalItems != null && pageSize ? Math.min(totalItems, (page - 1) * pageSize + 1) : 0;
61
+ const to = totalItems != null && pageSize ? Math.min(totalItems, page * pageSize) : 0;
62
+ return (_jsx("nav", { ...rest, ref: ref, className: cx('rl-pagination', className), "aria-label": rest['aria-label'] ?? labels.nav, "aria-disabled": disabled || undefined, "aria-busy": busy || undefined, "data-slot": "pagination", "data-disabled": disabled || undefined, "data-busy": busy || undefined, children: _jsxs("div", { className: "rl-pagination__row", children: [_jsxs("ul", { ref: listRef, className: "rl-pagination__list", children: [_jsx("li", { children: _jsxs("button", { type: "button", className: "rl-pagination__step", "data-key": "previous", disabled: disabled || page <= 1, "aria-disabled": busy || undefined, onClick: () => go(page - 1, 'previous'), children: [_jsx(ChevronIcon, { direction: "previous" }), _jsx("span", { className: "rl-pagination__step-label", children: labels.previous })] }) }), items.map((item) => typeof item === 'number' ? (_jsx("li", { className: "rl-pagination__page-item", children: _jsx("button", { type: "button", className: "rl-pagination__page", "data-key": `page-${item}`, "aria-label": labels.page(item), "aria-current": item === page ? 'page' : undefined, disabled: disabled, "aria-disabled": busy || undefined, onClick: () => go(item, `page-${item}`), children: item }) }, item)) : (_jsx("li", { className: "rl-pagination__page-item", "aria-hidden": "true", children: _jsx("span", { className: "rl-pagination__ellipsis", children: "\u2026" }) }, item))), _jsx("li", { className: "rl-pagination__compact", children: labels.compact(page, pageCount) }), _jsx("li", { children: _jsxs("button", { type: "button", className: "rl-pagination__step", "data-key": "next", disabled: disabled || page >= pageCount, "aria-disabled": busy || undefined, onClick: () => go(page + 1, 'next'), children: [_jsx("span", { className: "rl-pagination__step-label", children: labels.next }), _jsx(ChevronIcon, { direction: "next" })] }) })] }), showStatus && totalItems != null && (_jsx("p", { className: "rl-pagination__status", role: "status", children: labels.status(from, to, totalItems) }))] }) }));
63
+ });
64
+ //# sourceMappingURL=Pagination.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Pagination.js","sourceRoot":"","sources":["../../src/components/Pagination.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ import * as React from 'react';
2
+ /**
3
+ * Non-modal floating panel on Base UI Popover (ADR-0001). Unlike Tooltip it may hold
4
+ * interactive content and is reachable by touch and assistive tech: the trigger gets
5
+ * aria-expanded / aria-controls, the popup is a labelled dialog, focus moves in on open
6
+ * and returns on close, Escape and outside clicks dismiss. Popup motion is a CSS
7
+ * transition on Base UI's starting/ending styles (--rl-motion-fast).
8
+ */
9
+ export type PopoverSide = 'top' | 'bottom' | 'left' | 'right';
10
+ export type PopoverAlign = 'start' | 'center' | 'end';
11
+ export type PopoverSize = 'sm' | 'md' | 'lg';
12
+ export type PopoverProps = {
13
+ /** Element that toggles the popover (usually a Button or IconButton with its own name). */
14
+ trigger?: React.ReactElement<Record<string, unknown>>;
15
+ /** External element or virtual rectangle used when the popover has no trigger. */
16
+ anchor?: React.RefObject<HTMLElement | null> | HTMLElement | {
17
+ getBoundingClientRect: () => DOMRect;
18
+ };
19
+ /** Visible heading; also the popup's accessible name. Use `aria-label` when there is no title. */
20
+ title?: React.ReactNode;
21
+ description?: React.ReactNode;
22
+ children?: React.ReactNode;
23
+ /** Footer actions. Wrap dismiss-only buttons in `<PopoverClose>`. */
24
+ actions?: React.ReactNode;
25
+ side?: PopoverSide;
26
+ align?: PopoverAlign;
27
+ size?: PopoverSize;
28
+ /** Also open on hover (for preview content). Focus and click still open it. */
29
+ openOnHover?: boolean;
30
+ /** Show a pointer arrow toward the trigger. */
31
+ arrow?: boolean;
32
+ open?: boolean;
33
+ defaultOpen?: boolean;
34
+ onOpenChange?: (open: boolean) => void;
35
+ /** Element to focus on open; defaults to the first tabbable element, or the popup. */
36
+ initialFocus?: boolean | React.RefObject<HTMLElement | null>;
37
+ sideOffset?: number;
38
+ /** Accessible name when no visible `title` is rendered. */
39
+ 'aria-label'?: string;
40
+ className?: string;
41
+ };
42
+ export declare function Popover({ trigger, anchor, title, description, children, actions, side, align, size, openOnHover, arrow, open, defaultOpen, onOpenChange, initialFocus, sideOffset, 'aria-label': ariaLabel, className, }: PopoverProps): React.JSX.Element;
43
+ export type PopoverCloseProps = {
44
+ /** The element that closes the popover, e.g. `<Button variant="ghost">完成</Button>`. */
45
+ children: React.ReactElement<Record<string, unknown>>;
46
+ };
47
+ /** Wraps a button so activating it closes the nearest Popover. */
48
+ export declare function PopoverClose({ children }: PopoverCloseProps): React.JSX.Element;
49
+ //# sourceMappingURL=Popover.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Popover.d.ts","sourceRoot":"","sources":["../../src/components/Popover.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAK/B;;;;;;GAMG;AAEH,MAAM,MAAM,WAAW,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,CAAC;AAC9D,MAAM,MAAM,YAAY,GAAG,OAAO,GAAG,QAAQ,GAAG,KAAK,CAAC;AACtD,MAAM,MAAM,WAAW,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAE7C,MAAM,MAAM,YAAY,GAAG;IACzB,2FAA2F;IAC3F,OAAO,CAAC,EAAE,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACtD,kFAAkF;IAClF,MAAM,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,WAAW,GAAG;QAAE,qBAAqB,EAAE,MAAM,OAAO,CAAA;KAAE,CAAC;IACtG,kGAAkG;IAClG,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACxB,WAAW,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC9B,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B,qEAAqE;IACrE,OAAO,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,KAAK,CAAC,EAAE,YAAY,CAAC;IACrB,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,+EAA+E;IAC/E,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,+CAA+C;IAC/C,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACvC,sFAAsF;IACtF,YAAY,CAAC,EAAE,OAAO,GAAG,KAAK,CAAC,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;IAC7D,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,2DAA2D;IAC3D,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,wBAAgB,OAAO,CAAC,EACtB,OAAO,EACP,MAAM,EACN,KAAK,EACL,WAAW,EACX,QAAQ,EACR,OAAO,EACP,IAAe,EACf,KAAgB,EAChB,IAAW,EACX,WAAmB,EACnB,KAAa,EACb,IAAI,EACJ,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,UAAc,EACd,YAAY,EAAE,SAAS,EACvB,SAAS,GACV,EAAE,YAAY,qBAiDd;AAED,MAAM,MAAM,iBAAiB,GAAG;IAC9B,uFAAuF;IACvF,QAAQ,EAAE,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CACvD,CAAC;AAEF,kEAAkE;AAClE,wBAAgB,YAAY,CAAC,EAAE,QAAQ,EAAE,EAAE,iBAAiB,qBAE3D"}
@@ -0,0 +1,14 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { Popover as BasePopover } from '@base-ui/react/popover';
4
+ import { usePortalContainer } from '../provider/portal.js';
5
+ import { cx } from '../utils/cx.js';
6
+ export function Popover({ trigger, anchor, title, description, children, actions, side = 'bottom', align = 'center', size = 'md', openOnHover = false, arrow = false, open, defaultOpen, onOpenChange, initialFocus, sideOffset = 8, 'aria-label': ariaLabel, className, }) {
7
+ const container = usePortalContainer();
8
+ return (_jsxs(BasePopover.Root, { open: open, defaultOpen: defaultOpen, onOpenChange: onOpenChange ? (next) => onOpenChange(next) : undefined, children: [trigger && _jsx(BasePopover.Trigger, { render: trigger, openOnHover: openOnHover }), _jsx(BasePopover.Portal, { container: container, children: _jsx(BasePopover.Positioner, { className: "rl-popover__positioner", side: side, align: align, sideOffset: sideOffset, anchor: anchor && ('current' in anchor ? anchor.current : anchor), collisionPadding: 8, positionMethod: "fixed", children: _jsxs(BasePopover.Popup, { className: cx('rl-popover', className), "data-slot": "popover", "data-size": size, "aria-label": title == null ? ariaLabel : undefined, initialFocus: initialFocus, children: [arrow && (_jsx(BasePopover.Arrow, { className: "rl-popover__arrow", children: _jsxs("svg", { viewBox: "0 0 16 8", "aria-hidden": "true", focusable: "false", children: [_jsx("path", { className: "rl-popover__arrow-fill", d: "M0 8 8 0l8 8Z" }), _jsx("path", { className: "rl-popover__arrow-stroke", d: "M0 8 8 0l8 8" })] }) })), (title != null || description != null) && (_jsxs("header", { className: "rl-popover__header", children: [title != null && _jsx(BasePopover.Title, { className: "rl-popover__title", children: title }), description != null && (_jsx(BasePopover.Description, { className: "rl-popover__description", children: description }))] })), children != null && _jsx("div", { className: "rl-popover__body", children: children }), actions != null && _jsx("footer", { className: "rl-popover__actions", children: actions })] }) }) })] }));
9
+ }
10
+ /** Wraps a button so activating it closes the nearest Popover. */
11
+ export function PopoverClose({ children }) {
12
+ return _jsx(BasePopover.Close, { render: children });
13
+ }
14
+ //# sourceMappingURL=Popover.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Popover.js","sourceRoot":"","sources":["../../src/components/Popover.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,57 @@
1
+ import * as React from 'react';
2
+ import { Meter as BaseMeter } from '@base-ui/react/meter';
3
+ import { Progress as BaseProgress } from '@base-ui/react/progress';
4
+ import type { MeterState } from './meter-utils.js';
5
+ /**
6
+ * Progress vs Meter (ADR-0005 §2):
7
+ * - Progress: a task advancing over time to completion. `value={null}` = indeterminate.
8
+ * - Meter: a static measurement inside a known range; never "complete", never indeterminate.
9
+ * Both need a visible label; the value is announced as formatted text, not colour.
10
+ */
11
+ export type ProgressSize = 'sm' | 'md';
12
+ export type ProgressTone = 'neutral' | 'accent' | 'success' | 'warning' | 'danger';
13
+ type BaseProgressProps = React.ComponentProps<typeof BaseProgress.Root>;
14
+ export type ProgressProps = Omit<BaseProgressProps, 'className' | 'style' | 'render' | 'children' | 'value' | 'getAriaValueText' | 'aria-label' | 'aria-labelledby'> & {
15
+ label: React.ReactNode;
16
+ /** The accessible name comes from `label`. */
17
+ 'aria-label'?: never;
18
+ 'aria-labelledby'?: never;
19
+ /** Current value between `min` and `max`; `null` while the total is unknown. */
20
+ value: number | null;
21
+ /** Visible text after the label; defaults to the formatted value (e.g. "42%"). `false` hides it. */
22
+ valueText?: React.ReactNode | false;
23
+ /** Spoken value; defaults to the formatted value, or "进行中" when indeterminate. */
24
+ getValueText?: (formatted: string, value: number | null) => string;
25
+ description?: React.ReactNode;
26
+ size?: ProgressSize;
27
+ tone?: ProgressTone;
28
+ hideLabel?: boolean;
29
+ className?: string;
30
+ style?: React.CSSProperties;
31
+ };
32
+ export declare const Progress: React.ForwardRefExoticComponent<Omit<ProgressProps, "ref"> & React.RefAttributes<HTMLDivElement>>;
33
+ type BaseMeterProps = React.ComponentProps<typeof BaseMeter.Root>;
34
+ export type MeterProps = Omit<BaseMeterProps, 'className' | 'style' | 'render' | 'children' | 'getAriaValueText' | 'aria-label' | 'aria-labelledby'> & {
35
+ label: React.ReactNode;
36
+ /** The accessible name comes from `label`. */
37
+ 'aria-label'?: never;
38
+ 'aria-labelledby'?: never;
39
+ /** Values below `low` / above `high` are out of the preferred range (like native <meter>). */
40
+ low?: number;
41
+ high?: number;
42
+ /** Where the good region is; decides whether low or high values are the warning side. */
43
+ optimum?: number;
44
+ /** Visible value text; defaults to the formatted value. */
45
+ valueText?: React.ReactNode | false;
46
+ getValueText?: (formatted: string, value: number) => string;
47
+ /** Text for the derived state, appended to the spoken value: e.g. { warning: '偏高' }. */
48
+ stateLabels?: Partial<Record<MeterState, string>>;
49
+ description?: React.ReactNode;
50
+ size?: ProgressSize;
51
+ hideLabel?: boolean;
52
+ className?: string;
53
+ style?: React.CSSProperties;
54
+ };
55
+ export declare const Meter: React.ForwardRefExoticComponent<Omit<MeterProps, "ref"> & React.RefAttributes<HTMLDivElement>>;
56
+ export {};
57
+ //# sourceMappingURL=Progress.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Progress.d.ts","sourceRoot":"","sources":["../../src/components/Progress.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,QAAQ,IAAI,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAInE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEnD;;;;;GAKG;AAEH,MAAM,MAAM,YAAY,GAAG,IAAI,GAAG,IAAI,CAAC;AACvC,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,CAAC;AAEnF,KAAK,iBAAiB,GAAG,KAAK,CAAC,cAAc,CAAC,OAAO,YAAY,CAAC,IAAI,CAAC,CAAC;AAExE,MAAM,MAAM,aAAa,GAAG,IAAI,CAC9B,iBAAiB,EACjB,WAAW,GAAG,OAAO,GAAG,QAAQ,GAAG,UAAU,GAAG,OAAO,GAAG,kBAAkB,GAAG,YAAY,GAAG,iBAAiB,CAChH,GAAG;IACF,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,8CAA8C;IAC9C,YAAY,CAAC,EAAE,KAAK,CAAC;IACrB,iBAAiB,CAAC,EAAE,KAAK,CAAC;IAC1B,gFAAgF;IAChF,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,oGAAoG;IACpG,SAAS,CAAC,EAAE,KAAK,CAAC,SAAS,GAAG,KAAK,CAAC;IACpC,kFAAkF;IAClF,YAAY,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,KAAK,MAAM,CAAC;IACnE,WAAW,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC9B,IAAI,CAAC,EAAE,YAAY,CAAC;IACpB,IAAI,CAAC,EAAE,YAAY,CAAC;IACpB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;CAC7B,CAAC;AAEF,eAAO,MAAM,QAAQ,mGA0DnB,CAAC;AAEH,KAAK,cAAc,GAAG,KAAK,CAAC,cAAc,CAAC,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC;AAElE,MAAM,MAAM,UAAU,GAAG,IAAI,CAC3B,cAAc,EACd,WAAW,GAAG,OAAO,GAAG,QAAQ,GAAG,UAAU,GAAG,kBAAkB,GAAG,YAAY,GAAG,iBAAiB,CACtG,GAAG;IACF,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,8CAA8C;IAC9C,YAAY,CAAC,EAAE,KAAK,CAAC;IACrB,iBAAiB,CAAC,EAAE,KAAK,CAAC;IAC1B,8FAA8F;IAC9F,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,yFAAyF;IACzF,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,2DAA2D;IAC3D,SAAS,CAAC,EAAE,KAAK,CAAC,SAAS,GAAG,KAAK,CAAC;IACpC,YAAY,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;IAC5D,wFAAwF;IACxF,WAAW,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC;IAClD,WAAW,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC9B,IAAI,CAAC,EAAE,YAAY,CAAC;IACpB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;CAC7B,CAAC;AAIF,eAAO,MAAM,KAAK,gGAmEhB,CAAC"}
@@ -0,0 +1,31 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import * as React from 'react';
4
+ import { Meter as BaseMeter } from '@base-ui/react/meter';
5
+ import { Progress as BaseProgress } from '@base-ui/react/progress';
6
+ import { useRhineLocale } from '../provider/messages.js';
7
+ import { cx } from '../utils/cx.js';
8
+ import { getMeterState } from './meter-utils.js';
9
+ export const Progress = React.forwardRef(function Progress({ label, value, valueText, getValueText, description, size = 'md', tone = 'neutral', hideLabel = false, format, locale, className, style, ...rest }, ref) {
10
+ const descriptionId = React.useId();
11
+ const { messages, locale: contextLocale } = useRhineLocale();
12
+ const fallbackText = (formatted, v) => (v === null ? messages.progress.indeterminate : formatted);
13
+ return (_jsxs(BaseProgress.Root, { ...rest, ref: ref, locale: locale ?? contextLocale, value: value,
14
+ // Without `format`, Base UI shows the share of the range as a percentage; with it, the raw value.
15
+ format: format, getAriaValueText: getValueText ?? fallbackText, "aria-describedby": description != null ? descriptionId : undefined, className: cx('rl-progress', className), style: style, "data-slot": "progress", "data-size": size, "data-tone": tone, children: [_jsxs("div", { className: hideLabel ? 'rl-visually-hidden' : 'rl-progress__header', children: [_jsx(BaseProgress.Label, { className: "rl-progress__label", children: label }), valueText !== false &&
16
+ (valueText != null ? (_jsx("span", { className: "rl-progress__value", "aria-hidden": "true", children: valueText })) : (value !== null && _jsx(BaseProgress.Value, { className: "rl-progress__value", "aria-hidden": "true" })))] }), _jsx(BaseProgress.Track, { className: "rl-progress__track", children: _jsx(BaseProgress.Indicator, { className: "rl-progress__indicator" }) }), description != null && (_jsx("p", { id: descriptionId, className: "rl-progress__description", children: description }))] }));
17
+ });
18
+ const meterTone = { optimum: 'success', suboptimum: 'warning', critical: 'danger' };
19
+ export const Meter = React.forwardRef(function Meter({ label, value, min = 0, max = 100, low, high, optimum, valueText, getValueText, stateLabels, description, size = 'md', hideLabel = false, locale, className, style, ...rest }, ref) {
20
+ const descriptionId = React.useId();
21
+ const { messages, locale: contextLocale } = useRhineLocale();
22
+ const hasThresholds = low != null || high != null;
23
+ const state = getMeterState(value, { min, max, low, high, optimum });
24
+ const stateText = hasThresholds ? stateLabels?.[state] : undefined;
25
+ const spoken = (formatted, v) => {
26
+ const base = getValueText ? getValueText(formatted, v) : formatted;
27
+ return stateText ? messages.progress.meterValue(base, stateText) : base;
28
+ };
29
+ return (_jsxs(BaseMeter.Root, { ...rest, ref: ref, locale: locale ?? contextLocale, value: value, min: min, max: max, getAriaValueText: spoken, "aria-describedby": description != null ? descriptionId : undefined, className: cx('rl-progress', 'rl-meter', className), style: style, "data-slot": "meter", "data-size": size, "data-tone": hasThresholds ? meterTone[state] : 'neutral', "data-state": hasThresholds ? state : undefined, children: [_jsxs("div", { className: hideLabel ? 'rl-visually-hidden' : 'rl-progress__header', children: [_jsx(BaseMeter.Label, { className: "rl-progress__label", children: label }), valueText !== false && (_jsxs("span", { className: "rl-progress__value", "aria-hidden": "true", children: [valueText ?? _jsx(BaseMeter.Value, {}), stateText && _jsx("span", { className: "rl-meter__state", children: stateText })] }))] }), _jsx(BaseMeter.Track, { className: "rl-progress__track", children: _jsx(BaseMeter.Indicator, { className: "rl-progress__indicator" }) }), description != null && (_jsx("p", { id: descriptionId, className: "rl-progress__description", children: description }))] }));
30
+ });
31
+ //# sourceMappingURL=Progress.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Progress.js","sourceRoot":"","sources":["../../src/components/Progress.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,68 @@
1
+ import * as React from 'react';
2
+ import { Radio as BaseRadio } from '@base-ui/react/radio';
3
+ import { RadioGroup as BaseRadioGroup } from '@base-ui/react/radio-group';
4
+ import type { ChoiceOrientation } from './Checkbox.js';
5
+ import type { FieldValidationMode } from './Field.js';
6
+ /**
7
+ * Single choice from a short, fully visible list (≤ 6 options; use Select beyond that).
8
+ * Arrow keys move and select within the group; Tab enters at the checked option.
9
+ *
10
+ * <RadioGroup label="保密级别" name="level" defaultValue="internal">
11
+ * <Radio value="public" label="公开" />
12
+ * <Radio value="internal" label="内部" description="仅本机构成员可见。" />
13
+ * </RadioGroup>
14
+ */
15
+ type BaseGroupProps = React.ComponentProps<typeof BaseRadioGroup>;
16
+ export type RadioGroupProps = Pick<BaseGroupProps, 'value' | 'defaultValue' | 'onValueChange' | 'readOnly'> & {
17
+ label: React.ReactNode;
18
+ description?: React.ReactNode;
19
+ /** Shown when nothing is chosen on submit (`required`) or when `invalid` is set. */
20
+ error?: React.ReactNode;
21
+ invalid?: boolean;
22
+ name?: string;
23
+ required?: boolean;
24
+ optional?: boolean;
25
+ disabled?: boolean;
26
+ validationMode?: FieldValidationMode;
27
+ orientation?: ChoiceOrientation;
28
+ appearance?: 'default' | 'chip' | 'card';
29
+ hideLabel?: boolean;
30
+ renderIcon?: (value: string) => React.ReactNode;
31
+ className?: string;
32
+ style?: React.CSSProperties;
33
+ children: React.ReactNode;
34
+ };
35
+ export declare const RadioGroup: React.ForwardRefExoticComponent<Pick<BaseRadioGroup.Props<unknown>, "value" | "defaultValue" | "readOnly" | "onValueChange"> & {
36
+ label: React.ReactNode;
37
+ description?: React.ReactNode;
38
+ /** Shown when nothing is chosen on submit (`required`) or when `invalid` is set. */
39
+ error?: React.ReactNode;
40
+ invalid?: boolean;
41
+ name?: string;
42
+ required?: boolean;
43
+ optional?: boolean;
44
+ disabled?: boolean;
45
+ validationMode?: FieldValidationMode;
46
+ orientation?: ChoiceOrientation;
47
+ appearance?: "default" | "chip" | "card";
48
+ hideLabel?: boolean;
49
+ renderIcon?: (value: string) => React.ReactNode;
50
+ className?: string;
51
+ style?: React.CSSProperties;
52
+ children: React.ReactNode;
53
+ } & React.RefAttributes<HTMLDivElement>>;
54
+ type BaseRadioProps = React.ComponentProps<typeof BaseRadio.Root>;
55
+ export type RadioProps = Omit<BaseRadioProps, 'className' | 'style' | 'render' | 'children' | 'nativeButton' | 'value' | 'aria-label' | 'aria-labelledby'> & {
56
+ value: string;
57
+ label: React.ReactNode;
58
+ /** The name comes from `label`; a second naming channel would drift from the visible text. */
59
+ 'aria-label'?: never;
60
+ 'aria-labelledby'?: never;
61
+ description?: React.ReactNode;
62
+ className?: string;
63
+ style?: React.CSSProperties;
64
+ icon?: React.ReactNode;
65
+ };
66
+ export declare const Radio: React.ForwardRefExoticComponent<Omit<RadioProps, "ref"> & React.RefAttributes<HTMLElement>>;
67
+ export {};
68
+ //# sourceMappingURL=Radio.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Radio.d.ts","sourceRoot":"","sources":["../../src/components/Radio.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAG/B,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,UAAU,IAAI,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAG1E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEtD;;;;;;;;GAQG;AAEH,KAAK,cAAc,GAAG,KAAK,CAAC,cAAc,CAAC,OAAO,cAAc,CAAC,CAAC;AAElE,MAAM,MAAM,eAAe,GAAG,IAAI,CAAC,cAAc,EAAE,OAAO,GAAG,cAAc,GAAG,eAAe,GAAG,UAAU,CAAC,GAAG;IAC5G,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,WAAW,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC9B,oFAAoF;IACpF,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACxB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,cAAc,CAAC,EAAE,mBAAmB,CAAC;IACrC,WAAW,CAAC,EAAE,iBAAiB,CAAC;IAChC,UAAU,CAAC,EAAE,SAAS,GAAG,MAAM,GAAG,MAAM,CAAC;IACzC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,KAAK,CAAC,SAAS,CAAC;IAChD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;IAC5B,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B,CAAC;AAEF,eAAO,MAAM,UAAU;WAnBd,KAAK,CAAC,SAAS;kBACR,KAAK,CAAC,SAAS;IAC7B,oFAAoF;YAC5E,KAAK,CAAC,SAAS;cACb,OAAO;WACV,MAAM;eACF,OAAO;eACP,OAAO;eACP,OAAO;qBACD,mBAAmB;kBACtB,iBAAiB;iBAClB,SAAS,GAAG,MAAM,GAAG,MAAM;gBAC5B,OAAO;iBACN,CAAC,KAAK,EAAE,MAAM,KAAK,KAAK,CAAC,SAAS;gBACnC,MAAM;YACV,KAAK,CAAC,aAAa;cACjB,KAAK,CAAC,SAAS;wCAsDzB,CAAC;AAEH,KAAK,cAAc,GAAG,KAAK,CAAC,cAAc,CAAC,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC;AAElE,MAAM,MAAM,UAAU,GAAG,IAAI,CAC3B,cAAc,EACd,WAAW,GAAG,OAAO,GAAG,QAAQ,GAAG,UAAU,GAAG,cAAc,GAAG,OAAO,GAAG,YAAY,GAAG,iBAAiB,CAC5G,GAAG;IACF,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,8FAA8F;IAC9F,YAAY,CAAC,EAAE,KAAK,CAAC;IACrB,iBAAiB,CAAC,EAAE,KAAK,CAAC;IAC1B,WAAW,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;IAC5B,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CACxB,CAAC;AAEF,eAAO,MAAM,KAAK,6FAkBhB,CAAC"}
@@ -0,0 +1,18 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import * as React from 'react';
4
+ import { Field as BaseField } from '@base-ui/react/field';
5
+ import { Fieldset as BaseFieldset } from '@base-ui/react/fieldset';
6
+ import { Radio as BaseRadio } from '@base-ui/react/radio';
7
+ import { RadioGroup as BaseRadioGroup } from '@base-ui/react/radio-group';
8
+ import { cx } from '../utils/cx.js';
9
+ import { ChoiceGroupContext, FieldErrorMessage, LabelText } from './fieldParts.js';
10
+ export const RadioGroup = React.forwardRef(function RadioGroup({ label, description, error, invalid, name, required = false, optional = false, disabled, validationMode, orientation = 'vertical', appearance = 'default', hideLabel = false, renderIcon, className, style, children, ...groupProps }, ref) {
11
+ const match = invalid ? true : undefined;
12
+ return (_jsxs(BaseField.Root, { ref: ref, name: name, disabled: disabled, invalid: invalid, validationMode: validationMode, className: cx('rl-choice-group', className), style: style, "data-slot": "radio-group", "data-appearance": appearance, "data-hide-label": hideLabel || undefined, children: [_jsxs(BaseFieldset.Root, { className: "rl-choice-group__fieldset", render: _jsx(BaseRadioGroup, { ...groupProps, required: required, disabled: disabled }), children: [_jsx(BaseFieldset.Legend, { className: "rl-choice-group__legend", children: _jsx(LabelText, { label: label, required: required, optional: optional }) }), _jsx("div", { className: "rl-choice-group__items", "data-orientation": orientation, children: _jsx(ChoiceGroupContext.Provider, { value: "radio", children: React.Children.map(children, (child) => React.isValidElement(child) && renderIcon ? React.cloneElement(child, { icon: renderIcon(String(child.props.value)) }) : child) }) })] }), description != null && _jsx(BaseField.Description, { className: "rl-field__description", children: description }), (error != null || name != null) && _jsx(FieldErrorMessage, { error: error, match: match, name: name })] }));
13
+ });
14
+ export const Radio = React.forwardRef(function Radio({ value, label, description, disabled, className, style, icon, ...rest }, ref) {
15
+ // Outside <RadioGroup> Base UI throws (Field.Item needs a Field.Root), which is the intended failure.
16
+ return (_jsxs(BaseField.Item, { className: cx('rl-choice', className), style: style, disabled: disabled, "data-kind": "radio", children: [_jsxs(BaseField.Label, { className: "rl-choice__label", children: [_jsx(BaseRadio.Root, { ...rest, ref: ref, value: value, disabled: disabled, className: "rl-radio", "data-slot": "radio", children: _jsx(BaseRadio.Indicator, { className: "rl-radio__indicator", keepMounted: true }) }), icon && _jsx("span", { className: "rl-choice__icon", "aria-hidden": "true", children: icon }), _jsx("span", { className: "rl-choice__text", children: label })] }), description != null && (_jsx(BaseField.Description, { className: "rl-choice__description", children: description }))] }));
17
+ });
18
+ //# sourceMappingURL=Radio.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Radio.js","sourceRoot":"","sources":["../../src/components/Radio.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ import * as React from 'react';
2
+ import type { BreadcrumbItem } from './Breadcrumb.js';
3
+ import type { MetadataItem } from './MetadataList.js';
4
+ import type { StatusKind } from './StatusBadge.js';
5
+ /**
6
+ * Archive record header: location trail, record ID, status, title, classification,
7
+ * summary, key timestamps and actions. Every field except `title` is optional and is
8
+ * omitted when absent — the header never fabricates IDs, dates or access levels.
9
+ */
10
+ /** Same shape as a Breadcrumb item (ADR-0005 §4). */
11
+ export type RecordTrailItem = BreadcrumbItem;
12
+ export interface RecordStatus {
13
+ tone: StatusKind;
14
+ /** Visible text; colour never carries the status alone. */
15
+ label: React.ReactNode;
16
+ }
17
+ export type RecordHeaderProps = Omit<React.HTMLAttributes<HTMLElement>, 'title' | 'id'> & {
18
+ title: React.ReactNode;
19
+ /** Record identifier, e.g. "ARC-1024". Rendered in mono above the title. */
20
+ recordId?: string;
21
+ status?: RecordStatus;
22
+ /** Ancestors of this record. Rendered as a breadcrumb <nav>; the last item is the current page. */
23
+ trail?: readonly RecordTrailItem[];
24
+ /** Classification terms, e.g. ["样本", "海洋来源"]. Joined with a hairline separator. */
25
+ classification?: readonly React.ReactNode[];
26
+ summary?: React.ReactNode;
27
+ /** Key facts beside the title (created / updated / owner). Empty values are hidden. */
28
+ meta?: readonly MetadataItem[];
29
+ actions?: React.ReactNode;
30
+ /** Heading level of the title; keep the document outline correct. */
31
+ headingLevel?: 1 | 2 | 3;
32
+ /** Accessible name of the breadcrumb navigation. */
33
+ trailLabel?: string;
34
+ };
35
+ export declare const RecordHeader: React.ForwardRefExoticComponent<Omit<React.HTMLAttributes<HTMLElement>, "id" | "title"> & {
36
+ title: React.ReactNode;
37
+ /** Record identifier, e.g. "ARC-1024". Rendered in mono above the title. */
38
+ recordId?: string;
39
+ status?: RecordStatus;
40
+ /** Ancestors of this record. Rendered as a breadcrumb <nav>; the last item is the current page. */
41
+ trail?: readonly RecordTrailItem[];
42
+ /** Classification terms, e.g. ["样本", "海洋来源"]. Joined with a hairline separator. */
43
+ classification?: readonly React.ReactNode[];
44
+ summary?: React.ReactNode;
45
+ /** Key facts beside the title (created / updated / owner). Empty values are hidden. */
46
+ meta?: readonly MetadataItem[];
47
+ actions?: React.ReactNode;
48
+ /** Heading level of the title; keep the document outline correct. */
49
+ headingLevel?: 1 | 2 | 3;
50
+ /** Accessible name of the breadcrumb navigation. */
51
+ trailLabel?: string;
52
+ } & React.RefAttributes<HTMLElement>>;
53
+ //# sourceMappingURL=RecordHeader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RecordHeader.d.ts","sourceRoot":"","sources":["../../src/components/RecordHeader.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEtD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEtD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEnD;;;;GAIG;AAEH,qDAAqD;AACrD,MAAM,MAAM,eAAe,GAAG,cAAc,CAAC;AAE7C,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,UAAU,CAAC;IACjB,2DAA2D;IAC3D,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC;CACxB;AAED,MAAM,MAAM,iBAAiB,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,WAAW,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC,GAAG;IACxF,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,4EAA4E;IAC5E,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,mGAAmG;IACnG,KAAK,CAAC,EAAE,SAAS,eAAe,EAAE,CAAC;IACnC,mFAAmF;IACnF,cAAc,CAAC,EAAE,SAAS,KAAK,CAAC,SAAS,EAAE,CAAC;IAC5C,OAAO,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,uFAAuF;IACvF,IAAI,CAAC,EAAE,SAAS,YAAY,EAAE,CAAC;IAC/B,OAAO,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,qEAAqE;IACrE,YAAY,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACzB,oDAAoD;IACpD,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,eAAO,MAAM,YAAY;WAlBhB,KAAK,CAAC,SAAS;IACtB,4EAA4E;eACjE,MAAM;aACR,YAAY;IACrB,mGAAmG;YAC3F,SAAS,eAAe,EAAE;IAClC,mFAAmF;qBAClE,SAAS,KAAK,CAAC,SAAS,EAAE;cACjC,KAAK,CAAC,SAAS;IACzB,uFAAuF;WAChF,SAAS,YAAY,EAAE;cACpB,KAAK,CAAC,SAAS;IACzB,qEAAqE;mBACtD,CAAC,GAAG,CAAC,GAAG,CAAC;IACxB,oDAAoD;iBACvC,MAAM;qCAgEnB,CAAC"}
@@ -0,0 +1,19 @@
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
+ import { Breadcrumb } from './Breadcrumb.js';
7
+ import { MetadataList, isEmptyValue } from './MetadataList.js';
8
+ import { StatusBadge } from './StatusBadge.js';
9
+ export const RecordHeader = React.forwardRef(function RecordHeader({ title, recordId, status, trail, classification, summary, meta, actions, headingLevel = 1, trailLabel: trailLabelProp, className, ...rest }, ref) {
10
+ const messages = useRhineMessages();
11
+ const trailLabel = trailLabelProp ?? messages.recordHeader.trail;
12
+ const Heading = `h${headingLevel}`;
13
+ const terms = (classification ?? []).filter((term) => !isEmptyValue(term));
14
+ const hasMeta = (meta ?? []).some((item) => !isEmptyValue(item.value));
15
+ return (_jsxs("header", { ...rest, ref: ref, className: cx('rl-record', className), "data-slot": "record-header", "data-has-meta": hasMeta || undefined, children: [trail && trail.length > 0 && (
16
+ // maxItems={0}: record trails are short and always shown in full.
17
+ _jsx(Breadcrumb, { className: "rl-record__trail", items: trail, label: trailLabel, maxItems: 0 })), _jsxs("div", { className: "rl-record__main", children: [_jsxs("div", { className: "rl-record__identity", children: [(recordId || status) && (_jsxs("p", { className: "rl-record__id-row", children: [recordId && _jsx("span", { className: "rl-record__id", children: recordId }), status && (_jsx(StatusBadge, { status: status.tone, size: "sm", appearance: "outline", children: status.label }))] })), _jsx(Heading, { className: "rl-record__title", children: title }), terms.length > 0 && (_jsx("p", { className: "rl-record__classification", children: terms.map((term, index) => (_jsx("span", { className: "rl-record__term", children: term }, index))) })), !isEmptyValue(summary) && _jsx("p", { className: "rl-record__summary", children: summary })] }), hasMeta && _jsx(MetadataList, { className: "rl-record__meta", items: meta, size: "sm" })] }), actions != null && _jsx("div", { className: "rl-record__actions", children: actions })] }));
18
+ });
19
+ //# sourceMappingURL=RecordHeader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RecordHeader.js","sourceRoot":"","sources":["../../src/components/RecordHeader.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ import * as React from 'react';
2
+ export type ResizeHandleProps = Omit<React.HTMLAttributes<HTMLDivElement>, 'children' | 'role' | 'defaultValue' | 'onChange'> & {
3
+ size?: number;
4
+ defaultSize?: number;
5
+ onSizeChange?: (size: number) => void;
6
+ onDraggingChange?: (dragging: boolean) => void;
7
+ min: number;
8
+ max: number;
9
+ step?: number;
10
+ largeStep?: number;
11
+ resetSize?: number;
12
+ pane?: 'start' | 'end';
13
+ label?: string;
14
+ getAriaValueText?: (size: number) => string;
15
+ disabled?: boolean;
16
+ };
17
+ export declare const ResizeHandle: React.ForwardRefExoticComponent<Omit<React.HTMLAttributes<HTMLDivElement>, "children" | "role" | "defaultValue" | "onChange"> & {
18
+ size?: number;
19
+ defaultSize?: number;
20
+ onSizeChange?: (size: number) => void;
21
+ onDraggingChange?: (dragging: boolean) => void;
22
+ min: number;
23
+ max: number;
24
+ step?: number;
25
+ largeStep?: number;
26
+ resetSize?: number;
27
+ pane?: "start" | "end";
28
+ label?: string;
29
+ getAriaValueText?: (size: number) => string;
30
+ disabled?: boolean;
31
+ } & React.RefAttributes<HTMLDivElement>>;
32
+ //# sourceMappingURL=ResizeHandle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ResizeHandle.d.ts","sourceRoot":"","sources":["../../src/components/ResizeHandle.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAG/B,MAAM,MAAM,iBAAiB,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC,EAAE,UAAU,GAAG,MAAM,GAAG,cAAc,GAAG,UAAU,CAAC,GAAG;IAC9H,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,gBAAgB,CAAC,EAAE,CAAC,QAAQ,EAAE,OAAO,KAAK,IAAI,CAAC;IAC/C,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,OAAO,GAAG,KAAK,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gBAAgB,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;IAC5C,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,CAAC;AAKF,eAAO,MAAM,YAAY;WAlBhB,MAAM;kBACC,MAAM;mBACL,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI;uBAClB,CAAC,QAAQ,EAAE,OAAO,KAAK,IAAI;SACzC,MAAM;SACN,MAAM;WACJ,MAAM;gBACD,MAAM;gBACN,MAAM;WACX,OAAO,GAAG,KAAK;YACd,MAAM;uBACK,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM;eAChC,OAAO;wCAiBlB,CAAC"}
@@ -0,0 +1,33 @@
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
+ const clamp = (value, min, max) => Math.round(Math.min(Math.max(value, min), Math.max(min, max)));
6
+ const rtl = (el) => typeof getComputedStyle !== 'undefined' && getComputedStyle(el).direction === 'rtl';
7
+ export const ResizeHandle = React.forwardRef(function ResizeHandle({ size: sizeProp, defaultSize, onSizeChange, onDraggingChange, min, max, step = 16, largeStep = 64, resetSize, pane = 'end', label = 'Resize panel', getAriaValueText, disabled = false, className, onKeyDown, onPointerDown, onPointerMove, onPointerUp, onPointerCancel, onLostPointerCapture, onDoubleClick, ...rest }, ref) {
8
+ const [inner, setInner] = React.useState(defaultSize ?? min);
9
+ const [dragging, setDragging] = React.useState(false);
10
+ const raw = sizeProp ?? inner;
11
+ const value = clamp(raw, min, max);
12
+ const drag = React.useRef(null);
13
+ const commit = (next) => { const clamped = clamp(next, min, max); if (sizeProp === undefined)
14
+ setInner(clamped); onSizeChange?.(clamped); };
15
+ const direction = (el) => ((pane === 'end') !== rtl(el) ? -1 : 1);
16
+ const stop = () => { if (drag.current) {
17
+ drag.current = null;
18
+ setDragging(false);
19
+ onDraggingChange?.(false);
20
+ } };
21
+ React.useEffect(() => () => { if (drag.current)
22
+ onDraggingChange?.(false); }, [onDraggingChange]);
23
+ return _jsx("div", { ...rest, ref: ref, role: "separator", "aria-orientation": "vertical", "aria-label": rest['aria-labelledby'] ? undefined : label, "aria-valuenow": value, "aria-valuemin": min, "aria-valuemax": Math.max(min, max), "aria-valuetext": getAriaValueText?.(value) ?? `${value}px`, "aria-disabled": disabled || undefined, tabIndex: disabled ? -1 : 0, className: cx('rl-resize-handle', className), "data-pane": pane, "data-dragging": dragging || undefined, onKeyDown: (event) => { onKeyDown?.(event); if (event.defaultPrevented || disabled)
24
+ return; const amount = event.shiftKey ? largeStep : step; const dir = direction(event.currentTarget); const next = event.key === 'ArrowLeft' ? value - amount * dir : event.key === 'ArrowRight' ? value + amount * dir : event.key === 'Home' ? min : event.key === 'End' ? max : null; if (next == null)
25
+ return; event.preventDefault(); commit(next); }, onPointerDown: (event) => { onPointerDown?.(event); if (event.defaultPrevented || disabled || event.button !== 0 || drag.current)
26
+ return; event.currentTarget.setPointerCapture?.(event.pointerId); drag.current = { x: event.clientX, value, direction: direction(event.currentTarget), pointerId: event.pointerId }; setDragging(true); onDraggingChange?.(true); event.preventDefault(); event.currentTarget.focus(); }, onPointerMove: (event) => { onPointerMove?.(event); const current = drag.current; if (!current || current.pointerId !== event.pointerId)
27
+ return; commit(current.value + (event.clientX - current.x) * current.direction); }, onPointerUp: (event) => { onPointerUp?.(event); if (drag.current?.pointerId === event.pointerId)
28
+ stop(); }, onPointerCancel: (event) => { onPointerCancel?.(event); if (drag.current?.pointerId === event.pointerId)
29
+ stop(); }, onLostPointerCapture: (event) => { onLostPointerCapture?.(event); if (drag.current && (!event.pointerId || drag.current.pointerId === event.pointerId))
30
+ stop(); }, onDoubleClick: (event) => { onDoubleClick?.(event); if (!event.defaultPrevented && !disabled)
31
+ commit(resetSize ?? defaultSize ?? min); } });
32
+ });
33
+ //# sourceMappingURL=ResizeHandle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ResizeHandle.js","sourceRoot":"","sources":["../../src/components/ResizeHandle.tsx"],"names":[],"mappings":"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"}