@wzrhine/react 0.0.0-stage → 0.1.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 (265) hide show
  1. package/CHANGELOG.md +80 -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 +60 -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 +41 -0
  16. package/dist/components/AlertDialog.d.ts.map +1 -0
  17. package/dist/components/AlertDialog.js +101 -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/Breadcrumb.d.ts +48 -0
  24. package/dist/components/Breadcrumb.d.ts.map +1 -0
  25. package/dist/components/Breadcrumb.js +55 -0
  26. package/dist/components/Breadcrumb.js.map +1 -0
  27. package/dist/components/Button.d.ts +30 -0
  28. package/dist/components/Button.d.ts.map +1 -0
  29. package/dist/components/Button.js +24 -0
  30. package/dist/components/Button.js.map +1 -0
  31. package/dist/components/Checkbox.d.ts +81 -0
  32. package/dist/components/Checkbox.d.ts.map +1 -0
  33. package/dist/components/Checkbox.js +34 -0
  34. package/dist/components/Checkbox.js.map +1 -0
  35. package/dist/components/Collapsible.d.ts +47 -0
  36. package/dist/components/Collapsible.d.ts.map +1 -0
  37. package/dist/components/Collapsible.js +12 -0
  38. package/dist/components/Collapsible.js.map +1 -0
  39. package/dist/components/Combobox.d.ts +74 -0
  40. package/dist/components/Combobox.d.ts.map +1 -0
  41. package/dist/components/Combobox.js +61 -0
  42. package/dist/components/Combobox.js.map +1 -0
  43. package/dist/components/CommandPalette.d.ts +77 -0
  44. package/dist/components/CommandPalette.d.ts.map +1 -0
  45. package/dist/components/CommandPalette.js +150 -0
  46. package/dist/components/CommandPalette.js.map +1 -0
  47. package/dist/components/ContextMenu.d.ts +31 -0
  48. package/dist/components/ContextMenu.d.ts.map +1 -0
  49. package/dist/components/ContextMenu.js +25 -0
  50. package/dist/components/ContextMenu.js.map +1 -0
  51. package/dist/components/DataTable.d.ts +83 -0
  52. package/dist/components/DataTable.d.ts.map +1 -0
  53. package/dist/components/DataTable.js +97 -0
  54. package/dist/components/DataTable.js.map +1 -0
  55. package/dist/components/Dialog.d.ts +45 -0
  56. package/dist/components/Dialog.d.ts.map +1 -0
  57. package/dist/components/Dialog.js +46 -0
  58. package/dist/components/Dialog.js.map +1 -0
  59. package/dist/components/Drawer.d.ts +56 -0
  60. package/dist/components/Drawer.d.ts.map +1 -0
  61. package/dist/components/Drawer.js +92 -0
  62. package/dist/components/Drawer.js.map +1 -0
  63. package/dist/components/EmptyState.d.ts +39 -0
  64. package/dist/components/EmptyState.d.ts.map +1 -0
  65. package/dist/components/EmptyState.js +19 -0
  66. package/dist/components/EmptyState.js.map +1 -0
  67. package/dist/components/Field.d.ts +37 -0
  68. package/dist/components/Field.d.ts.map +1 -0
  69. package/dist/components/Field.js +12 -0
  70. package/dist/components/Field.js.map +1 -0
  71. package/dist/components/Fieldset.d.ts +24 -0
  72. package/dist/components/Fieldset.d.ts.map +1 -0
  73. package/dist/components/Fieldset.js +17 -0
  74. package/dist/components/Fieldset.js.map +1 -0
  75. package/dist/components/FileDropZone.d.ts +60 -0
  76. package/dist/components/FileDropZone.d.ts.map +1 -0
  77. package/dist/components/FileDropZone.js +121 -0
  78. package/dist/components/FileDropZone.js.map +1 -0
  79. package/dist/components/Form.d.ts +21 -0
  80. package/dist/components/Form.d.ts.map +1 -0
  81. package/dist/components/Form.js +20 -0
  82. package/dist/components/Form.js.map +1 -0
  83. package/dist/components/IconButton.d.ts +25 -0
  84. package/dist/components/IconButton.d.ts.map +1 -0
  85. package/dist/components/IconButton.js +14 -0
  86. package/dist/components/IconButton.js.map +1 -0
  87. package/dist/components/Input.d.ts +24 -0
  88. package/dist/components/Input.d.ts.map +1 -0
  89. package/dist/components/Input.js +15 -0
  90. package/dist/components/Input.js.map +1 -0
  91. package/dist/components/Menu.d.ts +66 -0
  92. package/dist/components/Menu.d.ts.map +1 -0
  93. package/dist/components/Menu.js +34 -0
  94. package/dist/components/Menu.js.map +1 -0
  95. package/dist/components/MetadataList.d.ts +51 -0
  96. package/dist/components/MetadataList.d.ts.map +1 -0
  97. package/dist/components/MetadataList.js +25 -0
  98. package/dist/components/MetadataList.js.map +1 -0
  99. package/dist/components/NumberField.d.ts +52 -0
  100. package/dist/components/NumberField.d.ts.map +1 -0
  101. package/dist/components/NumberField.js +21 -0
  102. package/dist/components/NumberField.js.map +1 -0
  103. package/dist/components/Pagination.d.ts +40 -0
  104. package/dist/components/Pagination.d.ts.map +1 -0
  105. package/dist/components/Pagination.js +64 -0
  106. package/dist/components/Pagination.js.map +1 -0
  107. package/dist/components/Popover.d.ts +44 -0
  108. package/dist/components/Popover.d.ts.map +1 -0
  109. package/dist/components/Popover.js +14 -0
  110. package/dist/components/Popover.js.map +1 -0
  111. package/dist/components/Progress.d.ts +57 -0
  112. package/dist/components/Progress.d.ts.map +1 -0
  113. package/dist/components/Progress.js +31 -0
  114. package/dist/components/Progress.js.map +1 -0
  115. package/dist/components/Radio.d.ts +61 -0
  116. package/dist/components/Radio.d.ts.map +1 -0
  117. package/dist/components/Radio.js +18 -0
  118. package/dist/components/Radio.js.map +1 -0
  119. package/dist/components/RecordHeader.d.ts +53 -0
  120. package/dist/components/RecordHeader.d.ts.map +1 -0
  121. package/dist/components/RecordHeader.js +19 -0
  122. package/dist/components/RecordHeader.js.map +1 -0
  123. package/dist/components/ScrollArea.d.ts +55 -0
  124. package/dist/components/ScrollArea.d.ts.map +1 -0
  125. package/dist/components/ScrollArea.js +63 -0
  126. package/dist/components/ScrollArea.js.map +1 -0
  127. package/dist/components/Select.d.ts +39 -0
  128. package/dist/components/Select.d.ts.map +1 -0
  129. package/dist/components/Select.js +24 -0
  130. package/dist/components/Select.js.map +1 -0
  131. package/dist/components/Separator.d.ts +26 -0
  132. package/dist/components/Separator.d.ts.map +1 -0
  133. package/dist/components/Separator.js +22 -0
  134. package/dist/components/Separator.js.map +1 -0
  135. package/dist/components/Skeleton.d.ts +31 -0
  136. package/dist/components/Skeleton.d.ts.map +1 -0
  137. package/dist/components/Skeleton.js +17 -0
  138. package/dist/components/Skeleton.js.map +1 -0
  139. package/dist/components/Slider.d.ts +65 -0
  140. package/dist/components/Slider.d.ts.map +1 -0
  141. package/dist/components/Slider.js +30 -0
  142. package/dist/components/Slider.js.map +1 -0
  143. package/dist/components/Spinner.d.ts +23 -0
  144. package/dist/components/Spinner.d.ts.map +1 -0
  145. package/dist/components/Spinner.js +13 -0
  146. package/dist/components/Spinner.js.map +1 -0
  147. package/dist/components/SplitButton.d.ts +59 -0
  148. package/dist/components/SplitButton.d.ts.map +1 -0
  149. package/dist/components/SplitButton.js +30 -0
  150. package/dist/components/SplitButton.js.map +1 -0
  151. package/dist/components/Stat.d.ts +53 -0
  152. package/dist/components/Stat.d.ts.map +1 -0
  153. package/dist/components/Stat.js +23 -0
  154. package/dist/components/Stat.js.map +1 -0
  155. package/dist/components/StatusBadge.d.ts +19 -0
  156. package/dist/components/StatusBadge.d.ts.map +1 -0
  157. package/dist/components/StatusBadge.js +8 -0
  158. package/dist/components/StatusBadge.js.map +1 -0
  159. package/dist/components/StatusIndicator.d.ts +29 -0
  160. package/dist/components/StatusIndicator.d.ts.map +1 -0
  161. package/dist/components/StatusIndicator.js +8 -0
  162. package/dist/components/StatusIndicator.js.map +1 -0
  163. package/dist/components/Surface.d.ts +29 -0
  164. package/dist/components/Surface.d.ts.map +1 -0
  165. package/dist/components/Surface.js +8 -0
  166. package/dist/components/Surface.js.map +1 -0
  167. package/dist/components/Switch.d.ts +22 -0
  168. package/dist/components/Switch.d.ts.map +1 -0
  169. package/dist/components/Switch.js +11 -0
  170. package/dist/components/Switch.js.map +1 -0
  171. package/dist/components/Tabs.d.ts +45 -0
  172. package/dist/components/Tabs.d.ts.map +1 -0
  173. package/dist/components/Tabs.js +49 -0
  174. package/dist/components/Tabs.js.map +1 -0
  175. package/dist/components/Text.d.ts +33 -0
  176. package/dist/components/Text.d.ts.map +1 -0
  177. package/dist/components/Text.js +21 -0
  178. package/dist/components/Text.js.map +1 -0
  179. package/dist/components/Textarea.d.ts +54 -0
  180. package/dist/components/Textarea.d.ts.map +1 -0
  181. package/dist/components/Textarea.js +31 -0
  182. package/dist/components/Textarea.js.map +1 -0
  183. package/dist/components/Timeline.d.ts +35 -0
  184. package/dist/components/Timeline.d.ts.map +1 -0
  185. package/dist/components/Timeline.js +13 -0
  186. package/dist/components/Timeline.js.map +1 -0
  187. package/dist/components/Toast.d.ts +67 -0
  188. package/dist/components/Toast.d.ts.map +1 -0
  189. package/dist/components/Toast.js +94 -0
  190. package/dist/components/Toast.js.map +1 -0
  191. package/dist/components/Tooltip.d.ts +26 -0
  192. package/dist/components/Tooltip.d.ts.map +1 -0
  193. package/dist/components/Tooltip.js +15 -0
  194. package/dist/components/Tooltip.js.map +1 -0
  195. package/dist/components/VisuallyHidden.d.ts +17 -0
  196. package/dist/components/VisuallyHidden.d.ts.map +1 -0
  197. package/dist/components/VisuallyHidden.js +12 -0
  198. package/dist/components/VisuallyHidden.js.map +1 -0
  199. package/dist/components/fieldParts.d.ts +17 -0
  200. package/dist/components/fieldParts.d.ts.map +1 -0
  201. package/dist/components/fieldParts.js +22 -0
  202. package/dist/components/fieldParts.js.map +1 -0
  203. package/dist/components/meter-utils.d.ts +15 -0
  204. package/dist/components/meter-utils.d.ts.map +1 -0
  205. package/dist/components/meter-utils.js +15 -0
  206. package/dist/components/meter-utils.js.map +1 -0
  207. package/dist/components/pagination-utils.d.ts +10 -0
  208. package/dist/components/pagination-utils.d.ts.map +1 -0
  209. package/dist/components/pagination-utils.js +36 -0
  210. package/dist/components/pagination-utils.js.map +1 -0
  211. package/dist/components.css +632 -0
  212. package/dist/data.css +600 -0
  213. package/dist/disclosure.css +93 -0
  214. package/dist/drawer.css +226 -0
  215. package/dist/feedback.css +454 -0
  216. package/dist/forms.css +516 -0
  217. package/dist/index.d.ts +117 -0
  218. package/dist/index.d.ts.map +1 -0
  219. package/dist/index.js +61 -0
  220. package/dist/index.js.map +1 -0
  221. package/dist/motion/lifecycle.d.ts +44 -0
  222. package/dist/motion/lifecycle.d.ts.map +1 -0
  223. package/dist/motion/lifecycle.js +73 -0
  224. package/dist/motion/lifecycle.js.map +1 -0
  225. package/dist/motion/presence.d.ts +69 -0
  226. package/dist/motion/presence.d.ts.map +1 -0
  227. package/dist/motion/presence.js +103 -0
  228. package/dist/motion/presence.js.map +1 -0
  229. package/dist/motion/presets.d.ts +63 -0
  230. package/dist/motion/presets.d.ts.map +1 -0
  231. package/dist/motion/presets.js +30 -0
  232. package/dist/motion/presets.js.map +1 -0
  233. package/dist/motion/resolve.d.ts +31 -0
  234. package/dist/motion/resolve.d.ts.map +1 -0
  235. package/dist/motion/resolve.js +40 -0
  236. package/dist/motion/resolve.js.map +1 -0
  237. package/dist/motion/useRhineMotion.d.ts +19 -0
  238. package/dist/motion/useRhineMotion.d.ts.map +1 -0
  239. package/dist/motion/useRhineMotion.js +19 -0
  240. package/dist/motion/useRhineMotion.js.map +1 -0
  241. package/dist/motion/visibility.d.ts +6 -0
  242. package/dist/motion/visibility.d.ts.map +1 -0
  243. package/dist/motion/visibility.js +31 -0
  244. package/dist/motion/visibility.js.map +1 -0
  245. package/dist/overlays.css +465 -0
  246. package/dist/provider/RhineProvider.d.ts +65 -0
  247. package/dist/provider/RhineProvider.d.ts.map +1 -0
  248. package/dist/provider/RhineProvider.js +26 -0
  249. package/dist/provider/RhineProvider.js.map +1 -0
  250. package/dist/provider/messages.d.ts +190 -0
  251. package/dist/provider/messages.d.ts.map +1 -0
  252. package/dist/provider/messages.js +160 -0
  253. package/dist/provider/messages.js.map +1 -0
  254. package/dist/provider/portal.d.ts +17 -0
  255. package/dist/provider/portal.d.ts.map +1 -0
  256. package/dist/provider/portal.js +20 -0
  257. package/dist/provider/portal.js.map +1 -0
  258. package/dist/reset.css +45 -0
  259. package/dist/split.css +159 -0
  260. package/dist/status.css +353 -0
  261. package/dist/utils/cx.d.ts +2 -0
  262. package/dist/utils/cx.d.ts.map +1 -0
  263. package/dist/utils/cx.js +4 -0
  264. package/dist/utils/cx.js.map +1 -0
  265. package/package.json +62 -3
@@ -0,0 +1,150 @@
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 { Autocomplete } from '@base-ui/react/autocomplete';
5
+ import { Dialog as BaseDialog } from '@base-ui/react/dialog';
6
+ import { AnimatePresence, motion } from 'motion/react';
7
+ import { useRhineMotion } from '../motion/useRhineMotion.js';
8
+ import { useRhineMessages } from '../provider/messages.js';
9
+ import { usePortalContainer } from '../provider/portal.js';
10
+ import { cx } from '../utils/cx.js';
11
+ import { Spinner } from './Spinner.js';
12
+ const normalize = (text) => text.toLocaleLowerCase();
13
+ const terms = (query) => normalize(query).split(/\s+/).filter(Boolean);
14
+ function defaultFilter(command, query) {
15
+ const haystack = normalize([command.label, command.description ?? '', command.group ?? '', ...(command.keywords ?? [])].join(' '));
16
+ return terms(query).every((term) => haystack.includes(term));
17
+ }
18
+ /** Label split into plain and matched parts; matched parts render as <mark>. */
19
+ function highlight(label, query) {
20
+ const words = terms(query);
21
+ if (words.length === 0)
22
+ return label;
23
+ const lower = normalize(label);
24
+ const marks = new Array(label.length).fill(false);
25
+ for (const word of words) {
26
+ let from = lower.indexOf(word);
27
+ while (from !== -1) {
28
+ for (let i = from; i < from + word.length; i += 1)
29
+ marks[i] = true;
30
+ from = lower.indexOf(word, from + word.length);
31
+ }
32
+ }
33
+ const parts = [];
34
+ let start = 0;
35
+ for (let i = 1; i <= label.length; i += 1) {
36
+ if (i === label.length || marks[i] !== marks[start]) {
37
+ const text = label.slice(start, i);
38
+ parts.push(marks[start] ? _jsx("mark", { className: "rl-command__mark", children: text }, start) : text);
39
+ start = i;
40
+ }
41
+ }
42
+ return parts;
43
+ }
44
+ function isApplePlatform() {
45
+ if (typeof navigator === 'undefined')
46
+ return false;
47
+ const platform = navigator.userAgentData?.platform ?? navigator.platform ?? '';
48
+ return /mac|iphone|ipad|ipod/i.test(platform);
49
+ }
50
+ /** Parses `mod+k` style hotkeys into a predicate over keyboard events. */
51
+ export function matchHotkey(hotkey, event, apple = isApplePlatform()) {
52
+ const parts = hotkey.toLowerCase().split('+').map((p) => p.trim()).filter(Boolean);
53
+ const key = parts.pop();
54
+ if (!key)
55
+ return false;
56
+ const want = { ctrl: false, meta: false, alt: false, shift: false };
57
+ for (const part of parts) {
58
+ if (part === 'mod')
59
+ want[apple ? 'meta' : 'ctrl'] = true;
60
+ else if (part === 'ctrl' || part === 'control')
61
+ want.ctrl = true;
62
+ else if (part === 'meta' || part === 'cmd')
63
+ want.meta = true;
64
+ else if (part === 'alt' || part === 'option')
65
+ want.alt = true;
66
+ else if (part === 'shift')
67
+ want.shift = true;
68
+ }
69
+ return (event.key.toLowerCase() === key &&
70
+ event.ctrlKey === want.ctrl &&
71
+ event.metaKey === want.meta &&
72
+ event.altKey === want.alt &&
73
+ event.shiftKey === want.shift);
74
+ }
75
+ function SearchIcon() {
76
+ return (_jsxs("svg", { viewBox: "0 0 16 16", fill: "none", stroke: "currentColor", strokeWidth: "1.75", "aria-hidden": "true", focusable: "false", children: [_jsx("circle", { cx: "7", cy: "7", r: "4.75" }), _jsx("path", { d: "m10.5 10.5 3.5 3.5", strokeLinecap: "round" })] }));
77
+ }
78
+ const offset = 8;
79
+ export function CommandPalette({ commands, onSelect, open: openProp, defaultOpen = false, onOpenChange, trigger, hotkey, title, placeholder, emptyText, hint, filter = defaultFilter, query: queryProp, onQueryChange, loading = false, loadingText, className, }) {
80
+ const messages = useRhineMessages().commandPalette;
81
+ const container = usePortalContainer();
82
+ const motionPrefs = useRhineMotion();
83
+ const rise = motionPrefs.reduced ? 0 : offset;
84
+ const [uncontrolled, setUncontrolled] = React.useState(defaultOpen);
85
+ const controlled = openProp !== undefined;
86
+ const open = controlled ? openProp : uncontrolled;
87
+ const [innerQuery, setInnerQuery] = React.useState('');
88
+ const query = queryProp ?? innerQuery;
89
+ const latestQuery = React.useRef(onQueryChange);
90
+ latestQuery.current = onQueryChange;
91
+ const setQuery = React.useCallback((next) => {
92
+ setInnerQuery(next);
93
+ latestQuery.current?.(next);
94
+ }, []);
95
+ const inputRef = React.useRef(null);
96
+ const hintId = React.useId();
97
+ const setOpen = React.useCallback((next) => {
98
+ if (next && latest.current.query !== '')
99
+ setQuery('');
100
+ if (!controlled)
101
+ setUncontrolled(next);
102
+ onOpenChange?.(next);
103
+ }, [controlled, onOpenChange, setQuery]);
104
+ // Latest values for the document listener without re-subscribing on every render.
105
+ const latest = React.useRef({ open, query, setOpen: () => undefined });
106
+ latest.current = { open, query, setOpen };
107
+ React.useEffect(() => {
108
+ if (!hotkey)
109
+ return undefined;
110
+ const onKeyDown = (event) => {
111
+ if (event.isComposing || event.keyCode === 229 || event.repeat)
112
+ return;
113
+ if (!matchHotkey(hotkey, event))
114
+ return;
115
+ event.preventDefault();
116
+ latest.current.setOpen(!latest.current.open);
117
+ };
118
+ document.addEventListener('keydown', onKeyDown);
119
+ return () => document.removeEventListener('keydown', onKeyDown);
120
+ }, [hotkey]);
121
+ const groups = React.useMemo(() => {
122
+ const trimmed = query.trim();
123
+ const map = new Map();
124
+ for (const command of commands) {
125
+ if (filter !== null && trimmed !== '' && !filter(command, trimmed))
126
+ continue;
127
+ const key = command.group ?? '';
128
+ let group = map.get(key);
129
+ if (!group) {
130
+ group = { value: key, items: [] };
131
+ map.set(key, group);
132
+ }
133
+ group.items.push(command);
134
+ }
135
+ return [...map.values()];
136
+ }, [commands, filter, query]);
137
+ const run = (command) => {
138
+ if (command.disabled)
139
+ return;
140
+ if (onSelect(command) !== false)
141
+ setOpen(false);
142
+ };
143
+ const footer = hint === undefined ? messages.hint : hint;
144
+ return (_jsxs(BaseDialog.Root, { open: open, onOpenChange: (next) => setOpen(next), children: [trigger && _jsx(BaseDialog.Trigger, { render: trigger }), _jsx(AnimatePresence, { children: open && (_jsxs(BaseDialog.Portal, { keepMounted: true, container: container, children: [_jsx(BaseDialog.Backdrop, { className: "rl-dialog__backdrop", render: _jsx(motion.div, { initial: { opacity: 0 }, animate: { opacity: 1 }, exit: { opacity: 0 }, transition: motionPrefs.get('fast') }) }), _jsxs(BaseDialog.Popup, { className: cx('rl-command', className), "data-slot": "command-palette", initialFocus: inputRef, render: _jsx(motion.div, { initial: { opacity: 0, y: rise }, animate: { opacity: 1, y: 0 }, exit: { opacity: 0, y: rise }, transition: motionPrefs.get('panel') }), children: [_jsx(BaseDialog.Title, { className: "rl-visually-hidden", children: title ?? messages.title }), _jsxs(Autocomplete.Root, { open: true, inline: true, items: groups, filter: null, autoHighlight: "always", keepHighlight: true, value: query, onValueChange: (next, details) => {
145
+ // Selecting fills the input by default; a palette keeps the typed query instead.
146
+ if (details.reason !== 'item-press')
147
+ setQuery(next);
148
+ }, itemToStringValue: (command) => command.label, children: [_jsxs("div", { className: "rl-command__search", children: [_jsx("span", { className: "rl-command__search-icon", "aria-hidden": "true", children: _jsx(SearchIcon, {}) }), _jsx(Autocomplete.Input, { ref: inputRef, className: "rl-command__input", "aria-label": messages.inputLabel, "aria-describedby": footer != null ? hintId : undefined, placeholder: placeholder ?? messages.placeholder })] }), _jsx(BaseDialog.Close, { className: "rl-visually-hidden", children: messages.close }), _jsxs("div", { className: "rl-command__body", children: [_jsx(Autocomplete.Status, { className: "rl-command__status", children: loading ? (_jsxs(_Fragment, { children: [_jsx(Spinner, { size: "sm" }), _jsx("span", { children: loadingText ?? messages.loading })] })) : null }), _jsx(Autocomplete.Empty, { className: "rl-command__empty", children: loading ? null : (emptyText ?? messages.empty) }), _jsx(Autocomplete.List, { className: "rl-command__list", "aria-busy": loading || undefined, children: (group) => (_jsxs(Autocomplete.Group, { items: group.items, className: "rl-command__group", children: [group.value !== '' && _jsx(Autocomplete.GroupLabel, { className: "rl-command__group-label", children: group.value }), _jsx(Autocomplete.Collection, { children: (command) => (_jsxs(Autocomplete.Item, { value: command, disabled: command.disabled, className: "rl-command__item", "data-command-id": command.id, "data-icon": command.icon != null || undefined, onClick: () => run(command), children: [command.icon != null && (_jsx("span", { className: "rl-command__icon", "aria-hidden": "true", children: command.icon })), _jsxs("span", { className: "rl-command__text", children: [_jsx("span", { className: "rl-command__label", children: highlight(command.label, query) }), command.description != null && _jsx("span", { className: "rl-command__description", children: command.description }), command.disabled && command.disabledReason != null && (_jsx("span", { className: "rl-command__reason", children: command.disabledReason }))] }), command.meta != null && _jsx("span", { className: "rl-command__meta", children: command.meta }), command.shortcut != null && (_jsx("kbd", { className: "rl-command__shortcut", "aria-hidden": "true", children: command.shortcut }))] }, command.id)) })] }, `g-${group.value}`)) })] }), footer != null && (_jsx("p", { id: hintId, className: "rl-command__hint", children: footer }))] })] })] })) })] }));
149
+ }
150
+ //# sourceMappingURL=CommandPalette.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CommandPalette.js","sourceRoot":"","sources":["../../src/components/CommandPalette.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ import * as React from 'react';
2
+ /**
3
+ * Context menu on Base UI ContextMenu (ADR-0010 §2). Opens at the pointer on right click, on
4
+ * long press (touch, 500 ms) and, from the keyboard, on Shift+F10 / the ContextMenu key while the
5
+ * target has focus (the browser fires `contextmenu` on the focused element). It reuses the Menu
6
+ * parts and styling: put `MenuItem`, `MenuCheckboxItem`, `MenuRadioGroup`, `MenuGroup` and
7
+ * `MenuSeparator` inside. Escape and outside click close it; focus returns to the target.
8
+ *
9
+ * The target must be reachable by keyboard: it gets `tabIndex={0}` unless it sets its own.
10
+ * Every command must also be available elsewhere (a Menu button, a toolbar); a context menu is
11
+ * a shortcut, not the only path (ACCESSIBILITY.md).
12
+ *
13
+ * <ContextMenu trigger={<div className="row">REC-0142</div>}>
14
+ * <MenuItem onSelect={copy}>复制编号</MenuItem>
15
+ * </ContextMenu>
16
+ */
17
+ export type ContextMenuProps = {
18
+ /** The area that opens the menu: one element (usually a row or card) that can hold focus. */
19
+ trigger: React.ReactElement<Record<string, unknown>>;
20
+ /** Menu items (`MenuItem` and friends from Menu). */
21
+ children: React.ReactNode;
22
+ open?: boolean;
23
+ defaultOpen?: boolean;
24
+ onOpenChange?: (open: boolean) => void;
25
+ /** Leave the browser's native context menu in place. */
26
+ disabled?: boolean;
27
+ /** Class name for the popup. */
28
+ className?: string;
29
+ };
30
+ export declare function ContextMenu({ trigger, children, open, defaultOpen, onOpenChange, disabled, className }: ContextMenuProps): React.JSX.Element;
31
+ //# sourceMappingURL=ContextMenu.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ContextMenu.d.ts","sourceRoot":"","sources":["../../src/components/ContextMenu.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAK/B;;;;;;;;;;;;;;GAcG;AAEH,MAAM,MAAM,gBAAgB,GAAG;IAC7B,6FAA6F;IAC7F,OAAO,EAAE,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACrD,qDAAqD;IACrD,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACvC,wDAAwD;IACxD,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,gCAAgC;IAChC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAkBF,wBAAgB,WAAW,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,YAAY,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,gBAAgB,qBA0BxH"}
@@ -0,0 +1,25 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { ContextMenu as BaseContextMenu } from '@base-ui/react/context-menu';
4
+ import { usePortalContainer } from '../provider/portal.js';
5
+ import { cx } from '../utils/cx.js';
6
+ /**
7
+ * Not every engine turns Shift+F10 / the ContextMenu key into a `contextmenu` event on the focused
8
+ * element, so the keyboard path is explicit: it dispatches one at the element's centre. Base UI
9
+ * opens on it; if the browser also fires its own, opening again is a no-op.
10
+ */
11
+ function openFromKeyboard(event) {
12
+ const isShortcut = (event.key === 'F10' && event.shiftKey) || event.key === 'ContextMenu';
13
+ if (!isShortcut || event.defaultPrevented)
14
+ return;
15
+ event.preventDefault();
16
+ const target = event.currentTarget;
17
+ const rect = target.getBoundingClientRect();
18
+ target.dispatchEvent(new MouseEvent('contextmenu', { bubbles: true, cancelable: true, clientX: rect.left + rect.width / 2, clientY: rect.top + rect.height / 2 }));
19
+ }
20
+ export function ContextMenu({ trigger, children, open, defaultOpen, onOpenChange, disabled, className }) {
21
+ const container = usePortalContainer();
22
+ const ownTabIndex = trigger.props.tabIndex;
23
+ return (_jsxs(BaseContextMenu.Root, { open: open, defaultOpen: defaultOpen, onOpenChange: onOpenChange ? (next) => onOpenChange(next) : undefined, disabled: disabled, children: [_jsx(BaseContextMenu.Trigger, { render: trigger, tabIndex: ownTabIndex ?? 0, onKeyDown: disabled ? undefined : openFromKeyboard, className: "rl-context-menu__trigger", "data-slot": "context-menu-trigger" }), _jsx(BaseContextMenu.Portal, { container: container, children: _jsx(BaseContextMenu.Positioner, { className: "rl-menu__positioner", collisionPadding: 8, children: _jsx(BaseContextMenu.Popup, { className: cx('rl-menu', 'rl-context-menu', className), "data-slot": "context-menu", children: children }) }) })] }));
24
+ }
25
+ //# sourceMappingURL=ContextMenu.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ContextMenu.js","sourceRoot":"","sources":["../../src/components/ContextMenu.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAGb,OAAO,EAAE,WAAW,IAAI,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC7E,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,EAAE,EAAE,MAAM,gBAAgB,CAAC;AAgCpC;;;;GAIG;AACH,SAAS,gBAAgB,CAAC,KAAuC;IAC/D,MAAM,UAAU,GAAG,CAAC,KAAK,CAAC,GAAG,KAAK,KAAK,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC,GAAG,KAAK,aAAa,CAAC;IAC1F,IAAI,CAAC,UAAU,IAAI,KAAK,CAAC,gBAAgB;QAAE,OAAO;IAClD,KAAK,CAAC,cAAc,EAAE,CAAC;IACvB,MAAM,MAAM,GAAG,KAAK,CAAC,aAAa,CAAC;IACnC,MAAM,IAAI,GAAG,MAAM,CAAC,qBAAqB,EAAE,CAAC;IAC5C,MAAM,CAAC,aAAa,CAClB,IAAI,UAAU,CAAC,aAAa,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,CAC7I,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,YAAY,EAAE,QAAQ,EAAE,SAAS,EAAoB;IACvH,MAAM,SAAS,GAAG,kBAAkB,EAAE,CAAC;IACvC,MAAM,WAAW,GAAG,OAAO,CAAC,KAAK,CAAC,QAA8B,CAAC;IACjE,OAAO,CACL,MAAC,eAAe,CAAC,IAAI,IACnB,IAAI,EAAE,IAAI,EACV,WAAW,EAAE,WAAW,EACxB,YAAY,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,EACrE,QAAQ,EAAE,QAAQ,aAElB,KAAC,eAAe,CAAC,OAAO,IACtB,MAAM,EAAE,OAAO,EACf,QAAQ,EAAE,WAAW,IAAI,CAAC,EAC1B,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,gBAAgB,EAClD,SAAS,EAAC,0BAA0B,eAC1B,sBAAsB,GAChC,EACF,KAAC,eAAe,CAAC,MAAM,IAAC,SAAS,EAAE,SAAS,YAC1C,KAAC,eAAe,CAAC,UAAU,IAAC,SAAS,EAAC,qBAAqB,EAAC,gBAAgB,EAAE,CAAC,YAC7E,KAAC,eAAe,CAAC,KAAK,IAAC,SAAS,EAAE,EAAE,CAAC,SAAS,EAAE,iBAAiB,EAAE,SAAS,CAAC,eAAY,cAAc,YACpG,QAAQ,GACa,GACG,GACN,IACJ,CACxB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,83 @@
1
+ import * as React from 'react';
2
+ import type { PaginationLabels } from './Pagination.js';
3
+ /**
4
+ * Data table on a native <table>: real header cells, a caption, sortable columns that
5
+ * report `aria-sort`, optional row selection with named checkboxes, and an empty state.
6
+ * Wide tables scroll horizontally inside a focusable, labelled region instead of
7
+ * shrinking text. Sorting is controlled: the component reports the requested order and
8
+ * the caller supplies sorted rows, so it never reorders data it does not understand.
9
+ * Pagination works the same way (ADR-0005 §6): the table renders the pager and the caller
10
+ * supplies the current page's rows (`paginate()` helps for client-side data).
11
+ */
12
+ export type DataTableStatus = 'ready' | 'loading' | 'error';
13
+ export interface DataTablePagination {
14
+ page: number;
15
+ onPageChange: (page: number) => void;
16
+ pageSize: number;
17
+ /** Total rows across all pages; drives the page count and the range summary. */
18
+ totalItems: number;
19
+ siblingCount?: number;
20
+ labels?: PaginationLabels;
21
+ }
22
+ export type SortDirection = 'ascending' | 'descending';
23
+ export interface SortState {
24
+ column: string;
25
+ direction: SortDirection;
26
+ }
27
+ export interface DataTableColumn<Row> {
28
+ key: string;
29
+ header: React.ReactNode;
30
+ /** Cell content. Defaults to `String(row[key])` when the row has that property. */
31
+ cell?: (row: Row) => React.ReactNode;
32
+ /** Allow sorting by this column. */
33
+ sortable?: boolean;
34
+ align?: 'start' | 'end' | 'center';
35
+ /** Monospace, tabular figures for IDs, numbers and timestamps. */
36
+ mono?: boolean;
37
+ /** Fixed column width as a CSS length or token, e.g. `var(--rl-space-16)`. */
38
+ width?: string;
39
+ /** Header text visually hidden but kept for screen readers (e.g. an actions column). */
40
+ hideHeader?: boolean;
41
+ /** Use this column's cell as the row header (<th scope="row">). One per table. */
42
+ rowHeader?: boolean;
43
+ }
44
+ export type DataTableProps<Row> = {
45
+ /** Visible caption; also names the scroll region. Required for an accessible table. */
46
+ caption: React.ReactNode;
47
+ /** Hide the caption visually (keep it for assistive tech) when a heading already labels the table. */
48
+ hideCaption?: boolean;
49
+ columns: readonly DataTableColumn<Row>[];
50
+ rows: readonly Row[];
51
+ getRowId: (row: Row) => string;
52
+ sort?: SortState | null;
53
+ onSortChange?: (sort: SortState) => void;
54
+ /** Enables a checkbox column. */
55
+ selectedIds?: ReadonlySet<string>;
56
+ onSelectionChange?: (ids: Set<string>) => void;
57
+ /** Accessible name for a row's checkbox; defaults to the row id. */
58
+ getRowLabel?: (row: Row) => string;
59
+ /** Empty-state title (rendered by EmptyState size="sm", as a paragraph). */
60
+ emptyText?: React.ReactNode;
61
+ /** Secondary line under the empty text, e.g. how to get results. */
62
+ emptyDescription?: React.ReactNode;
63
+ /** Optional action under the empty text, e.g. a "clear filters" button. */
64
+ emptyAction?: React.ReactNode;
65
+ /**
66
+ * `loading`: skeleton rows on first load; with existing rows they stay visible but dimmed.
67
+ * `error`: message + optional retry. Sorting, selection and paging are disabled in both.
68
+ */
69
+ status?: DataTableStatus;
70
+ /** Skeleton rows on first load. */
71
+ loadingRows?: number;
72
+ loadingText?: React.ReactNode;
73
+ errorText?: React.ReactNode;
74
+ onRetry?: () => void;
75
+ retryLabel?: React.ReactNode;
76
+ pagination?: DataTablePagination;
77
+ density?: 'comfortable' | 'compact';
78
+ /** Accessible label for the horizontal scroll region; defaults to the caption text. */
79
+ scrollLabel?: string;
80
+ className?: string;
81
+ };
82
+ export declare function DataTable<Row>({ caption, hideCaption, columns, rows, getRowId, sort, onSortChange, selectedIds, onSelectionChange, getRowLabel, emptyText: emptyTextProp, emptyDescription, emptyAction, status, loadingRows, loadingText: loadingTextProp, errorText: errorTextProp, onRetry, retryLabel: retryLabelProp, pagination, density, scrollLabel, className, }: DataTableProps<Row>): React.JSX.Element;
83
+ //# sourceMappingURL=DataTable.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DataTable.d.ts","sourceRoot":"","sources":["../../src/components/DataTable.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,97 @@
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 { Button } from './Button.js';
7
+ import { EmptyState } from './EmptyState.js';
8
+ import { Pagination } from './Pagination.js';
9
+ import { Skeleton } from './Skeleton.js';
10
+ function SortIcon({ direction }) {
11
+ return (_jsxs("svg", { className: "rl-table__sort-icon", viewBox: "0 0 16 16", "aria-hidden": "true", focusable: "false", "data-direction": direction ?? 'none', children: [_jsx("path", { className: "rl-table__sort-up", d: "M5 6.5 8 3.5l3 3" }), _jsx("path", { className: "rl-table__sort-down", d: "M5 9.5 8 12.5l3-3" })] }));
12
+ }
13
+ function defaultCell(row, key) {
14
+ const value = row[key];
15
+ return value === null || value === undefined ? '' : String(value);
16
+ }
17
+ export function DataTable({ caption, hideCaption = false, columns, rows, getRowId, sort, onSortChange, selectedIds, onSelectionChange, getRowLabel, emptyText: emptyTextProp, emptyDescription, emptyAction, status = 'ready', loadingRows = 5, loadingText: loadingTextProp, errorText: errorTextProp, onRetry, retryLabel: retryLabelProp, pagination, density = 'comfortable', scrollLabel, className, }) {
18
+ const { messages, formatNumber } = useRhineLocale();
19
+ const m = messages.dataTable;
20
+ // A prop given as `undefined` falls back to the messages, matching the old default parameters.
21
+ const emptyText = emptyTextProp === undefined ? m.empty : emptyTextProp;
22
+ const loadingText = loadingTextProp === undefined ? m.loading : loadingTextProp;
23
+ const errorText = errorTextProp === undefined ? m.error : errorTextProp;
24
+ const retryLabel = retryLabelProp === undefined ? m.retry : retryLabelProp;
25
+ const captionId = React.useId();
26
+ const scrollRef = React.useRef(null);
27
+ const busy = status !== 'ready';
28
+ const loading = status === 'loading';
29
+ const firstLoad = loading && rows.length === 0;
30
+ const selectable = selectedIds !== undefined && onSelectionChange !== undefined;
31
+ const rowIds = React.useMemo(() => rows.map(getRowId), [rows, getRowId]);
32
+ const selectedCount = selectable ? rowIds.filter((id) => selectedIds.has(id)).length : 0;
33
+ const allSelected = selectable && rows.length > 0 && selectedCount === rows.length;
34
+ /** Selected rows that are not on this page (pagination keeps the caller's selection). */
35
+ const offPageSelected = selectable ? selectedIds.size - selectedCount : 0;
36
+ const someSelected = selectable && selectedCount > 0 && !allSelected;
37
+ const headerCheckbox = React.useRef(null);
38
+ React.useEffect(() => {
39
+ if (headerCheckbox.current)
40
+ headerCheckbox.current.indeterminate = someSelected;
41
+ }, [someSelected]);
42
+ const toggleAll = () => {
43
+ if (!selectable)
44
+ return;
45
+ const next = new Set(selectedIds);
46
+ if (allSelected)
47
+ rowIds.forEach((id) => next.delete(id));
48
+ else
49
+ rowIds.forEach((id) => next.add(id));
50
+ onSelectionChange(next);
51
+ };
52
+ const toggleRow = (id) => {
53
+ if (!selectable)
54
+ return;
55
+ const next = new Set(selectedIds);
56
+ if (next.has(id))
57
+ next.delete(id);
58
+ else
59
+ next.add(id);
60
+ onSelectionChange(next);
61
+ };
62
+ const requestSort = (column) => {
63
+ if (!onSortChange)
64
+ return;
65
+ const direction = sort?.column === column && sort.direction === 'ascending' ? 'descending' : 'ascending';
66
+ onSortChange({ column, direction });
67
+ };
68
+ const columnCount = columns.length + (selectable ? 1 : 0);
69
+ const changePage = (next) => {
70
+ // New page starts at its first row; focus stays on the pager (Pagination keeps it).
71
+ if (scrollRef.current)
72
+ scrollRef.current.scrollTop = 0;
73
+ pagination.onPageChange(next);
74
+ };
75
+ const table = (_jsxs("div", { ref: scrollRef, className: cx('rl-table-scroll', !pagination && className), "data-slot": "data-table", "data-density": density, "data-status": status, role: "region", "aria-labelledby": scrollLabel ? undefined : captionId, "aria-label": scrollLabel, tabIndex: 0, children: [_jsxs("table", { className: "rl-table", "aria-busy": loading || undefined, children: [_jsx("caption", { id: captionId, className: hideCaption ? 'rl-visually-hidden' : 'rl-table__caption', children: caption }), _jsxs("colgroup", { children: [selectable && _jsx("col", { className: "rl-table__col-select" }), columns.map((column) => (_jsx("col", { style: column.width ? { width: column.width } : undefined }, column.key)))] }), _jsx("thead", { children: _jsxs("tr", { children: [selectable && (_jsx("th", { scope: "col", className: "rl-table__select", children: _jsx("input", { ref: headerCheckbox, type: "checkbox", className: "rl-table__checkbox", checked: allSelected, onChange: toggleAll, disabled: rows.length === 0 || busy, "aria-label": allSelected ? m.deselectAll : m.selectAll }) })), columns.map((column) => {
76
+ const active = sort?.column === column.key ? sort.direction : null;
77
+ const headerContent = column.hideHeader ? _jsx("span", { className: "rl-visually-hidden", children: column.header }) : column.header;
78
+ return (_jsx("th", { scope: "col", "data-align": column.align ?? 'start', "aria-sort": column.sortable ? (active ?? 'none') : undefined, children: column.sortable && onSortChange ? (_jsxs("button", { type: "button", className: "rl-table__sort", onClick: () => requestSort(column.key), "data-active": active ? true : undefined, disabled: busy, children: [headerContent, _jsx(SortIcon, { direction: active })] })) : (headerContent) }, column.key));
79
+ })] }) }), _jsx("tbody", { "data-stale": (loading && !firstLoad) || undefined, children: status === 'error' ? (_jsx("tr", { children: _jsxs("td", { colSpan: columnCount, className: "rl-table__message", "data-kind": "error", children: [_jsxs("div", { className: "rl-table__message-body", role: "alert", children: [_jsxs("svg", { className: "rl-table__message-icon", viewBox: "0 0 16 16", "aria-hidden": "true", focusable: "false", children: [_jsx("path", { d: "M8 1.75 15 14.25H1L8 1.75Z" }), _jsx("path", { d: "M8 6.5v3.25M8 11.75v.01" })] }), _jsx("span", { children: errorText })] }), onRetry && (_jsx(Button, { size: "sm", variant: "secondary", onClick: onRetry, children: retryLabel }))] }) })) : firstLoad ? (Array.from({ length: loadingRows }, (_, i) => (_jsx("tr", { className: "rl-table__skeleton-row", "aria-hidden": "true", children: Array.from({ length: columnCount }, (_, c) => (_jsx("td", { children: _jsx(Skeleton, { className: "rl-table__skeleton", width: i % 2 === 1 ? '50%' : '70%' }) }, c))) }, `skeleton-${i}`)))) : rows.length === 0 ? (_jsx("tr", { children: _jsx("td", { colSpan: columnCount, className: "rl-table__empty", children: _jsx(EmptyState, { size: "sm", kind: "no-results", icon: null, title: emptyText, description: emptyDescription, action: emptyAction }) }) })) : (rows.map((row) => {
80
+ const id = getRowId(row);
81
+ const selected = selectable && selectedIds.has(id);
82
+ return (_jsxs("tr", { "data-selected": selected || undefined, children: [selectable && (_jsx("td", { className: "rl-table__select", children: _jsx("input", { type: "checkbox", className: "rl-table__checkbox", checked: selected, onChange: () => toggleRow(id), disabled: busy, "aria-label": m.selectRow(getRowLabel ? getRowLabel(row) : id) }) })), columns.map((column) => {
83
+ const content = column.cell ? column.cell(row) : defaultCell(row, column.key);
84
+ const props = {
85
+ 'data-align': column.align ?? 'start',
86
+ 'data-mono': column.mono || undefined,
87
+ };
88
+ return column.rowHeader ? (_jsx("th", { ...props, scope: "row", children: content }, column.key)) : (_jsx("td", { ...props, children: content }, column.key));
89
+ })] }, id));
90
+ })) })] }), loading && (
91
+ // Visible on first load (skeleton rows are aria-hidden); announced in both cases.
92
+ _jsx("p", { className: firstLoad ? 'rl-table__loading' : 'rl-visually-hidden', role: "status", children: loadingText }))] }));
93
+ if (!pagination && !(selectable && offPageSelected > 0))
94
+ return table;
95
+ return (_jsxs("div", { className: cx('rl-table-frame', className), "data-slot": "data-table-frame", children: [table, _jsxs("div", { className: "rl-table__footer", children: [selectable && selectedIds.size > 0 && (_jsx("p", { className: "rl-table__selection", role: "status", children: m.selection(selectedIds.size, offPageSelected, formatNumber) })), pagination && (_jsx(Pagination, { className: "rl-table__pagination", page: pagination.page, onPageChange: changePage, pageSize: pagination.pageSize, totalItems: pagination.totalItems, siblingCount: pagination.siblingCount, labels: pagination.labels, busy: busy }))] })] }));
96
+ }
97
+ //# sourceMappingURL=DataTable.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DataTable.js","sourceRoot":"","sources":["../../src/components/DataTable.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAAE,EAAE,EAAE,MAAM,gBAAgB,CAAC;AACpC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAwFzC,SAAS,QAAQ,CAAC,EAAE,SAAS,EAAuC;IAClE,OAAO,CACL,eAAK,SAAS,EAAC,qBAAqB,EAAC,OAAO,EAAC,WAAW,iBAAa,MAAM,EAAC,SAAS,EAAC,OAAO,oBAAiB,SAAS,IAAI,MAAM,aAC/H,eAAM,SAAS,EAAC,mBAAmB,EAAC,CAAC,EAAC,kBAAkB,GAAG,EAC3D,eAAM,SAAS,EAAC,qBAAqB,EAAC,CAAC,EAAC,mBAAmB,GAAG,IAC1D,CACP,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAAM,GAAQ,EAAE,GAAW;IAC7C,MAAM,KAAK,GAAI,GAA+B,CAAC,GAAG,CAAC,CAAC;IACpD,OAAO,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACpE,CAAC;AAED,MAAM,UAAU,SAAS,CAAM,EAC7B,OAAO,EACP,WAAW,GAAG,KAAK,EACnB,OAAO,EACP,IAAI,EACJ,QAAQ,EACR,IAAI,EACJ,YAAY,EACZ,WAAW,EACX,iBAAiB,EACjB,WAAW,EACX,SAAS,EAAE,aAAa,EACxB,gBAAgB,EAChB,WAAW,EACX,MAAM,GAAG,OAAO,EAChB,WAAW,GAAG,CAAC,EACf,WAAW,EAAE,eAAe,EAC5B,SAAS,EAAE,aAAa,EACxB,OAAO,EACP,UAAU,EAAE,cAAc,EAC1B,UAAU,EACV,OAAO,GAAG,aAAa,EACvB,WAAW,EACX,SAAS,GACW;IACpB,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE,GAAG,cAAc,EAAE,CAAC;IACpD,MAAM,CAAC,GAAG,QAAQ,CAAC,SAAS,CAAC;IAC7B,+FAA+F;IAC/F,MAAM,SAAS,GAAG,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,aAAa,CAAC;IACxE,MAAM,WAAW,GAAG,eAAe,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;IAChF,MAAM,SAAS,GAAG,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,aAAa,CAAC;IACxE,MAAM,UAAU,GAAG,cAAc,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,cAAc,CAAC;IAC3E,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC;IAChC,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,CAAiB,IAAI,CAAC,CAAC;IACrD,MAAM,IAAI,GAAG,MAAM,KAAK,OAAO,CAAC;IAChC,MAAM,OAAO,GAAG,MAAM,KAAK,SAAS,CAAC;IACrC,MAAM,SAAS,GAAG,OAAO,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC;IAC/C,MAAM,UAAU,GAAG,WAAW,KAAK,SAAS,IAAI,iBAAiB,KAAK,SAAS,CAAC;IAChF,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC;IACzE,MAAM,aAAa,GAAG,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,WAAY,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1F,MAAM,WAAW,GAAG,UAAU,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,aAAa,KAAK,IAAI,CAAC,MAAM,CAAC;IACnF,yFAAyF;IACzF,MAAM,eAAe,GAAG,UAAU,CAAC,CAAC,CAAC,WAAY,CAAC,IAAI,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3E,MAAM,YAAY,GAAG,UAAU,IAAI,aAAa,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC;IACrE,MAAM,cAAc,GAAG,KAAK,CAAC,MAAM,CAAmB,IAAI,CAAC,CAAC;IAE5D,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE;QACnB,IAAI,cAAc,CAAC,OAAO;YAAE,cAAc,CAAC,OAAO,CAAC,aAAa,GAAG,YAAY,CAAC;IAClF,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC;IAEnB,MAAM,SAAS,GAAG,GAAG,EAAE;QACrB,IAAI,CAAC,UAAU;YAAE,OAAO;QACxB,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,CAAC;QAClC,IAAI,WAAW;YAAE,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;;YACpD,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;QAC1C,iBAAkB,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC,CAAC;IAEF,MAAM,SAAS,GAAG,CAAC,EAAU,EAAE,EAAE;QAC/B,IAAI,CAAC,UAAU;YAAE,OAAO;QACxB,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,CAAC;QAClC,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YAAE,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;;YAC7B,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAClB,iBAAkB,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC,CAAC;IAEF,MAAM,WAAW,GAAG,CAAC,MAAc,EAAE,EAAE;QACrC,IAAI,CAAC,YAAY;YAAE,OAAO;QAC1B,MAAM,SAAS,GAAkB,IAAI,EAAE,MAAM,KAAK,MAAM,IAAI,IAAI,CAAC,SAAS,KAAK,WAAW,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,WAAW,CAAC;QACxH,YAAY,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;IACtC,CAAC,CAAC;IAEF,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAE1D,MAAM,UAAU,GAAG,CAAC,IAAY,EAAE,EAAE;QAClC,oFAAoF;QACpF,IAAI,SAAS,CAAC,OAAO;YAAE,SAAS,CAAC,OAAO,CAAC,SAAS,GAAG,CAAC,CAAC;QACvD,UAAW,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;IACjC,CAAC,CAAC;IAEF,MAAM,KAAK,GAAG,CACZ,eACE,GAAG,EAAE,SAAS,EACd,SAAS,EAAE,EAAE,CAAC,iBAAiB,EAAE,CAAC,UAAU,IAAI,SAAS,CAAC,eAChD,YAAY,kBACR,OAAO,iBACR,MAAM,EACnB,IAAI,EAAC,QAAQ,qBACI,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,gBACxC,WAAW,EACvB,QAAQ,EAAE,CAAC,aAEX,iBAAO,SAAS,EAAC,UAAU,eAAY,OAAO,IAAI,SAAS,aACzD,kBAAS,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,mBAAmB,YACxF,OAAO,GACA,EACV,+BACG,UAAU,IAAI,cAAK,SAAS,EAAC,sBAAsB,GAAG,EACtD,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CACvB,cAAsB,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,IAArE,MAAM,CAAC,GAAG,CAA+D,CACpF,CAAC,IACO,EACX,0BACE,yBACG,UAAU,IAAI,CACb,aAAI,KAAK,EAAC,KAAK,EAAC,SAAS,EAAC,kBAAkB,YAC1C,gBACE,GAAG,EAAE,cAAc,EACnB,IAAI,EAAC,UAAU,EACf,SAAS,EAAC,oBAAoB,EAC9B,OAAO,EAAE,WAAW,EACpB,QAAQ,EAAE,SAAS,EACnB,QAAQ,EAAE,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,gBACvB,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,GACrD,GACC,CACN,EACA,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;oCACtB,MAAM,MAAM,GAAG,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC;oCACnE,MAAM,aAAa,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,eAAM,SAAS,EAAC,oBAAoB,YAAE,MAAM,CAAC,MAAM,GAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC;oCACtH,OAAO,CACL,aAEE,KAAK,EAAC,KAAK,gBACC,MAAM,CAAC,KAAK,IAAI,OAAO,eACxB,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,YAE1D,MAAM,CAAC,QAAQ,IAAI,YAAY,CAAC,CAAC,CAAC,CACjC,kBACE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAC,gBAAgB,EAC1B,OAAO,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC,iBACzB,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,EACtC,QAAQ,EAAE,IAAI,aAEb,aAAa,EACd,KAAC,QAAQ,IAAC,SAAS,EAAE,MAAM,GAAI,IACxB,CACV,CAAC,CAAC,CAAC,CACF,aAAa,CACd,IAlBI,MAAM,CAAC,GAAG,CAmBZ,CACN,CAAC;gCACJ,CAAC,CAAC,IACC,GACC,EACR,8BAAmB,CAAC,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,SAAS,YACpD,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,CACpB,uBACE,cAAI,OAAO,EAAE,WAAW,EAAE,SAAS,EAAC,mBAAmB,eAAW,OAAO,aACvE,eAAK,SAAS,EAAC,wBAAwB,EAAC,IAAI,EAAC,OAAO,aAClD,eAAK,SAAS,EAAC,wBAAwB,EAAC,OAAO,EAAC,WAAW,iBAAa,MAAM,EAAC,SAAS,EAAC,OAAO,aAC9F,eAAM,CAAC,EAAC,4BAA4B,GAAG,EACvC,eAAM,CAAC,EAAC,yBAAyB,GAAG,IAChC,EACN,yBAAO,SAAS,GAAQ,IACpB,EACL,OAAO,IAAI,CACV,KAAC,MAAM,IAAC,IAAI,EAAC,IAAI,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,EAAE,OAAO,YACnD,UAAU,GACJ,CACV,IACE,GACF,CACN,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CACd,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAC5C,aAA0B,SAAS,EAAC,wBAAwB,iBAAa,MAAM,YAC5E,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAC7C,uBACE,KAAC,QAAQ,IAAC,SAAS,EAAC,oBAAoB,EAAC,KAAK,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,GAAI,IADxE,CAAC,CAEL,CACN,CAAC,IALK,YAAY,CAAC,EAAE,CAMnB,CACN,CAAC,CACH,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CACtB,uBACE,aAAI,OAAO,EAAE,WAAW,EAAE,SAAS,EAAC,iBAAiB,YACnD,KAAC,UAAU,IACT,IAAI,EAAC,IAAI,EACT,IAAI,EAAC,YAAY,EACjB,IAAI,EAAE,IAAI,EACV,KAAK,EAAE,SAAS,EAChB,WAAW,EAAE,gBAAgB,EAC7B,MAAM,EAAE,WAAW,GACnB,GACC,GACF,CACN,CAAC,CAAC,CAAC,CACF,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;4BACf,MAAM,EAAE,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;4BACzB,MAAM,QAAQ,GAAG,UAAU,IAAI,WAAY,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;4BACpD,OAAO,CACL,+BAA4B,QAAQ,IAAI,SAAS,aAC9C,UAAU,IAAI,CACb,aAAI,SAAS,EAAC,kBAAkB,YAC9B,gBACE,IAAI,EAAC,UAAU,EACf,SAAS,EAAC,oBAAoB,EAC9B,OAAO,EAAE,QAAQ,EACjB,QAAQ,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,EAC7B,QAAQ,EAAE,IAAI,gBACF,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,GAC5D,GACC,CACN,EACA,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;wCACtB,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC;wCAC9E,MAAM,KAAK,GAAG;4CACZ,YAAY,EAAE,MAAM,CAAC,KAAK,IAAI,OAAO;4CACrC,WAAW,EAAE,MAAM,CAAC,IAAI,IAAI,SAAS;yCACtC,CAAC;wCACF,OAAO,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CACxB,gBAAyB,KAAK,EAAE,KAAK,EAAC,KAAK,YACxC,OAAO,IADD,MAAM,CAAC,GAAG,CAEd,CACN,CAAC,CAAC,CAAC,CACF,gBAAyB,KAAK,YAC3B,OAAO,IADD,MAAM,CAAC,GAAG,CAEd,CACN,CAAC;oCACJ,CAAC,CAAC,KA5BK,EAAE,CA6BN,CACN,CAAC;wBACJ,CAAC,CAAC,CACH,GACK,IACF,EACP,OAAO,IAAI;YACV,kFAAkF;YAClF,YAAG,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,oBAAoB,EAAE,IAAI,EAAC,QAAQ,YAChF,WAAW,GACV,CACL,IACG,CACP,CAAC;IAEF,IAAI,CAAC,UAAU,IAAI,CAAC,CAAC,UAAU,IAAI,eAAe,GAAG,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IAEtE,OAAO,CACL,eAAK,SAAS,EAAE,EAAE,CAAC,gBAAgB,EAAE,SAAS,CAAC,eAAY,kBAAkB,aAC1E,KAAK,EACN,eAAK,SAAS,EAAC,kBAAkB,aAC9B,UAAU,IAAI,WAAY,CAAC,IAAI,GAAG,CAAC,IAAI,CACtC,YAAG,SAAS,EAAC,qBAAqB,EAAC,IAAI,EAAC,QAAQ,YAC7C,CAAC,CAAC,SAAS,CAAC,WAAY,CAAC,IAAI,EAAE,eAAe,EAAE,YAAY,CAAC,GAC5D,CACL,EACA,UAAU,IAAI,CACb,KAAC,UAAU,IACT,SAAS,EAAC,sBAAsB,EAChC,IAAI,EAAE,UAAU,CAAC,IAAI,EACrB,YAAY,EAAE,UAAU,EACxB,QAAQ,EAAE,UAAU,CAAC,QAAQ,EAC7B,UAAU,EAAE,UAAU,CAAC,UAAU,EACjC,YAAY,EAAE,UAAU,CAAC,YAAY,EACrC,MAAM,EAAE,UAAU,CAAC,MAAM,EACzB,IAAI,EAAE,IAAI,GACV,CACH,IACG,IACF,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,45 @@
1
+ import * as React from 'react';
2
+ /**
3
+ * Modal dialog on Base UI Dialog (ADR-0001): focus trap, Escape, scroll lock, inert background
4
+ * and focus return are handled by Base UI; enter/exit run through motion/react (panel 280ms,
5
+ * 8px rise; opacity-only under reduced motion). Open state is always owned here so exit
6
+ * animations can finish before unmount, whether the caller controls `open` or not.
7
+ */
8
+ export type DialogSize = 'sm' | 'md' | 'lg';
9
+ /** Why the user is trying to close the dialog (ADR-0006 §3). */
10
+ export type DialogCloseReason = 'escape' | 'outside' | 'close-button' | 'trigger';
11
+ export type DialogProps = {
12
+ /** Element that opens the dialog (usually a Button). Omit when opening programmatically. */
13
+ trigger?: React.ReactElement<Record<string, unknown>>;
14
+ title: React.ReactNode;
15
+ description?: React.ReactNode;
16
+ /** Small archive-style label above the title, e.g. "ARCHIVE / CONFIRM". */
17
+ eyebrow?: React.ReactNode;
18
+ /** Footer actions. Use `<DialogClose>` for buttons that only dismiss. */
19
+ actions?: React.ReactNode;
20
+ children?: React.ReactNode;
21
+ open?: boolean;
22
+ defaultOpen?: boolean;
23
+ onOpenChange?: (open: boolean) => void;
24
+ /** Fires after the exit animation, when focus has returned. */
25
+ onClosed?: () => void;
26
+ size?: DialogSize;
27
+ /** `false` keeps outside clicks from dismissing (use for destructive confirmations). */
28
+ dismissOnOutsideClick?: boolean;
29
+ /** Element to focus on open; defaults to the first tabbable element. */
30
+ initialFocus?: React.RefObject<HTMLElement | null>;
31
+ /**
32
+ * Called before a user-initiated close. Return `false` to keep the dialog open (focus stays put),
33
+ * e.g. to ask "放弃未保存的更改?" in a nested AlertDialog. Programmatic `open={false}` skips it.
34
+ */
35
+ onCloseRequest?: (reason: DialogCloseReason) => boolean | void;
36
+ className?: string;
37
+ };
38
+ export declare function Dialog({ trigger, title, description, eyebrow, actions, children, open: openProp, defaultOpen, onOpenChange, onClosed, size, dismissOnOutsideClick, initialFocus, onCloseRequest, className, }: DialogProps): React.JSX.Element;
39
+ export type DialogCloseProps = {
40
+ /** The element that closes the dialog, typically `<Button variant="ghost">取消</Button>`. */
41
+ children: React.ReactElement<Record<string, unknown>>;
42
+ };
43
+ /** Wraps a button so activating it closes the nearest Dialog. */
44
+ export declare function DialogClose({ children }: DialogCloseProps): React.JSX.Element;
45
+ //# sourceMappingURL=Dialog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Dialog.d.ts","sourceRoot":"","sources":["../../src/components/Dialog.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAO/B;;;;;GAKG;AAEH,MAAM,MAAM,UAAU,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAE5C,gEAAgE;AAChE,MAAM,MAAM,iBAAiB,GAAG,QAAQ,GAAG,SAAS,GAAG,cAAc,GAAG,SAAS,CAAC;AASlF,MAAM,MAAM,WAAW,GAAG;IACxB,4FAA4F;IAC5F,OAAO,CAAC,EAAE,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACtD,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,WAAW,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC9B,2EAA2E;IAC3E,OAAO,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,yEAAyE;IACzE,OAAO,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACvC,+DAA+D;IAC/D,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,wFAAwF;IACxF,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,wEAAwE;IACxE,YAAY,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;IACnD;;;OAGG;IACH,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,iBAAiB,KAAK,OAAO,GAAG,IAAI,CAAC;IAC/D,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAIF,wBAAgB,MAAM,CAAC,EACrB,OAAO,EACP,KAAK,EACL,WAAW,EACX,OAAO,EACP,OAAO,EACP,QAAQ,EACR,IAAI,EAAE,QAAQ,EACd,WAAmB,EACnB,YAAY,EACZ,QAAQ,EACR,IAAW,EACX,qBAA4B,EAC5B,YAAY,EACZ,cAAc,EACd,SAAS,GACV,EAAE,WAAW,qBA2Eb;AAED,MAAM,MAAM,gBAAgB,GAAG;IAC7B,2FAA2F;IAC3F,QAAQ,EAAE,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CACvD,CAAC;AAEF,iEAAiE;AACjE,wBAAgB,WAAW,CAAC,EAAE,QAAQ,EAAE,EAAE,gBAAgB,qBAEzD"}
@@ -0,0 +1,46 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import * as React from 'react';
4
+ import { Dialog as BaseDialog } from '@base-ui/react/dialog';
5
+ import { AnimatePresence, motion } from 'motion/react';
6
+ import { usePortalContainer } from '../provider/portal.js';
7
+ import { useRhineMotion } from '../motion/useRhineMotion.js';
8
+ import { cx } from '../utils/cx.js';
9
+ const closeReasons = {
10
+ 'escape-key': 'escape',
11
+ 'outside-press': 'outside',
12
+ 'close-press': 'close-button',
13
+ 'trigger-press': 'trigger',
14
+ };
15
+ const offset = 8;
16
+ export function Dialog({ trigger, title, description, eyebrow, actions, children, open: openProp, defaultOpen = false, onOpenChange, onClosed, size = 'md', dismissOnOutsideClick = true, initialFocus, onCloseRequest, className, }) {
17
+ const [uncontrolled, setUncontrolled] = React.useState(defaultOpen);
18
+ const controlled = openProp !== undefined;
19
+ const open = controlled ? openProp : uncontrolled;
20
+ const container = usePortalContainer();
21
+ const motionPrefs = useRhineMotion();
22
+ const rise = motionPrefs.reduced ? 0 : offset;
23
+ const setOpen = (next) => {
24
+ if (!controlled)
25
+ setUncontrolled(next);
26
+ onOpenChange?.(next);
27
+ };
28
+ return (_jsxs(BaseDialog.Root, { open: open, onOpenChange: (next, eventDetails) => {
29
+ if (!next && onCloseRequest) {
30
+ const reason = closeReasons[eventDetails.reason];
31
+ if (reason && onCloseRequest(reason) === false) {
32
+ eventDetails.cancel();
33
+ return;
34
+ }
35
+ }
36
+ setOpen(next);
37
+ }, onOpenChangeComplete: (isOpen) => {
38
+ if (!isOpen)
39
+ onClosed?.();
40
+ }, disablePointerDismissal: !dismissOnOutsideClick, children: [trigger && _jsx(BaseDialog.Trigger, { render: trigger }), _jsx(AnimatePresence, { children: open && (_jsxs(BaseDialog.Portal, { keepMounted: true, container: container, children: [_jsx(BaseDialog.Backdrop, { className: "rl-dialog__backdrop", render: _jsx(motion.div, { initial: { opacity: 0 }, animate: { opacity: 1 }, exit: { opacity: 0 }, transition: motionPrefs.get('fast') }) }), _jsxs(BaseDialog.Popup, { className: cx('rl-dialog', className), "data-slot": "dialog", "data-size": size, initialFocus: initialFocus, render: _jsx(motion.div, { initial: { opacity: 0, y: rise }, animate: { opacity: 1, y: 0 }, exit: { opacity: 0, y: rise }, transition: motionPrefs.get('panel') }), children: [_jsxs("header", { className: "rl-dialog__header", children: [eyebrow != null && _jsx("p", { className: "rl-dialog__eyebrow", children: eyebrow }), _jsx(BaseDialog.Title, { className: "rl-dialog__title", children: title }), description != null && (_jsx(BaseDialog.Description, { className: "rl-dialog__description", children: description }))] }), children != null && _jsx("div", { className: "rl-dialog__body", children: children }), actions != null && _jsx("footer", { className: "rl-dialog__actions", children: actions })] })] })) })] }));
41
+ }
42
+ /** Wraps a button so activating it closes the nearest Dialog. */
43
+ export function DialogClose({ children }) {
44
+ return _jsx(BaseDialog.Close, { render: children });
45
+ }
46
+ //# sourceMappingURL=Dialog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Dialog.js","sourceRoot":"","sources":["../../src/components/Dialog.tsx"],"names":[],"mappings":"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"}