@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,25 @@
1
+ import * as React from 'react';
2
+ import type { ButtonSize } from './Button.js';
3
+ type MotionConflictingProps = 'onDrag' | 'onDragStart' | 'onDragEnd' | 'onAnimationStart' | 'onAnimationEnd' | 'onAnimationIteration';
4
+ export type IconButtonVariant = 'secondary' | 'ghost' | 'primary';
5
+ type NativeProps = Omit<React.ComponentPropsWithoutRef<'button'>, 'disabled' | 'children' | 'aria-label' | 'aria-labelledby' | MotionConflictingProps>;
6
+ /** An accessible name is mandatory: either `label` (preferred) or `aria-labelledby`. */
7
+ type Naming = {
8
+ label: string;
9
+ 'aria-labelledby'?: never;
10
+ } | {
11
+ label?: never;
12
+ 'aria-labelledby': string;
13
+ };
14
+ export type IconButtonProps = NativeProps & Naming & {
15
+ /** The icon. Rendered aria-hidden; the button's name comes from `label`. */
16
+ icon: React.ReactNode;
17
+ variant?: IconButtonVariant;
18
+ size?: ButtonSize;
19
+ disabled?: boolean;
20
+ /** Toggle state for on/off tools (e.g. pin, grid view). Renders `aria-pressed`. */
21
+ pressed?: boolean;
22
+ };
23
+ export declare const IconButton: React.ForwardRefExoticComponent<IconButtonProps & React.RefAttributes<HTMLButtonElement>>;
24
+ export {};
25
+ //# sourceMappingURL=IconButton.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IconButton.d.ts","sourceRoot":"","sources":["../../src/components/IconButton.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAK/B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9C,KAAK,sBAAsB,GACvB,QAAQ,GACR,aAAa,GACb,WAAW,GACX,kBAAkB,GAClB,gBAAgB,GAChB,sBAAsB,CAAC;AAE3B,MAAM,MAAM,iBAAiB,GAAG,WAAW,GAAG,OAAO,GAAG,SAAS,CAAC;AAElE,KAAK,WAAW,GAAG,IAAI,CACrB,KAAK,CAAC,wBAAwB,CAAC,QAAQ,CAAC,EACxC,UAAU,GAAG,UAAU,GAAG,YAAY,GAAG,iBAAiB,GAAG,sBAAsB,CACpF,CAAC;AAEF,wFAAwF;AACxF,KAAK,MAAM,GACP;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,iBAAiB,CAAC,EAAE,KAAK,CAAA;CAAE,GAC5C;IAAE,KAAK,CAAC,EAAE,KAAK,CAAC;IAAC,iBAAiB,EAAE,MAAM,CAAA;CAAE,CAAC;AAEjD,MAAM,MAAM,eAAe,GAAG,WAAW,GACvC,MAAM,GAAG;IACP,4EAA4E;IAC5E,IAAI,EAAE,KAAK,CAAC,SAAS,CAAC;IACtB,OAAO,CAAC,EAAE,iBAAiB,CAAC;IAC5B,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,mFAAmF;IACnF,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,CAAC;AAEJ,eAAO,MAAM,UAAU,2FA2BrB,CAAC"}
@@ -0,0 +1,14 @@
1
+ 'use client';
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import * as React from 'react';
4
+ import { motion } from 'motion/react';
5
+ import { pressScale } from '../motion/presets.js';
6
+ import { useRhineMotion } from '../motion/useRhineMotion.js';
7
+ import { cx } from '../utils/cx.js';
8
+ export const IconButton = React.forwardRef(function IconButton({ icon, label, variant = 'ghost', size = 'md', disabled = false, pressed, type = 'button', className, title, ...rest }, ref) {
9
+ const motionPrefs = useRhineMotion();
10
+ return (_jsx(motion.button, { ...rest, ref: ref, type: type, disabled: disabled, "aria-label": label, "aria-pressed": pressed,
11
+ // Mirror the name as a tooltip for sighted mouse users unless the caller overrides it.
12
+ title: title ?? label, "data-slot": "icon-button", "data-variant": variant, "data-size": size, className: cx('rl-icon-button', className), whileTap: !disabled && !motionPrefs.reduced ? { scale: pressScale } : undefined, transition: motionPrefs.get('press'), children: _jsx("span", { className: "rl-icon-button__icon", "aria-hidden": "true", children: icon }) }));
13
+ });
14
+ //# sourceMappingURL=IconButton.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IconButton.js","sourceRoot":"","sources":["../../src/components/IconButton.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,EAAE,EAAE,MAAM,gBAAgB,CAAC;AAkCpC,MAAM,CAAC,MAAM,UAAU,GAAG,KAAK,CAAC,UAAU,CAAqC,SAAS,UAAU,CAChG,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,EAAE,IAAI,GAAG,IAAI,EAAE,QAAQ,GAAG,KAAK,EAAE,OAAO,EAAE,IAAI,GAAG,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,IAAI,EAAE,EACtH,GAAG;IAEH,MAAM,WAAW,GAAG,cAAc,EAAE,CAAC;IACrC,OAAO,CACL,KAAC,MAAM,CAAC,MAAM,OACR,IAAI,EACR,GAAG,EAAE,GAAG,EACR,IAAI,EAAE,IAAI,EACV,QAAQ,EAAE,QAAQ,gBACN,KAAK,kBACH,OAAO;QACrB,uFAAuF;QACvF,KAAK,EAAE,KAAK,IAAI,KAAK,eACX,aAAa,kBACT,OAAO,eACV,IAAI,EACf,SAAS,EAAE,EAAE,CAAC,gBAAgB,EAAE,SAAS,CAAC,EAC1C,QAAQ,EAAE,CAAC,QAAQ,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,SAAS,EAC/E,UAAU,EAAE,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,YAEpC,eAAM,SAAS,EAAC,sBAAsB,iBAAa,MAAM,YACtD,IAAI,GACA,GACO,CACjB,CAAC;AACJ,CAAC,CAAC,CAAC"}
@@ -0,0 +1,24 @@
1
+ import * as React from 'react';
2
+ import { Input as BaseInput } from '@base-ui/react/input';
3
+ export type InputSize = 'sm' | 'md' | 'lg';
4
+ type BaseInputProps = React.ComponentProps<typeof BaseInput>;
5
+ export type InputProps = Omit<BaseInputProps, 'className' | 'style' | 'render' | 'size' | 'prefix'> & {
6
+ size?: InputSize;
7
+ /** Decorative leading adornment (icon). Hidden from assistive tech. */
8
+ prefix?: React.ReactNode;
9
+ /** Trailing adornment: unit text such as "mm" is read by screen readers via aria-describedby. */
10
+ suffix?: React.ReactNode;
11
+ /** Monospace value for IDs, codes and measurements. */
12
+ mono?: boolean;
13
+ /** Mark invalid outside a Field (inside a Field, validity comes from Field). */
14
+ invalid?: boolean;
15
+ className?: string;
16
+ style?: React.CSSProperties;
17
+ };
18
+ /**
19
+ * Text input on Base UI Input: inside `<Field>` it picks up label, description, error and
20
+ * validity automatically; standalone it still needs an accessible name (`aria-label`).
21
+ */
22
+ export declare const Input: React.ForwardRefExoticComponent<Omit<InputProps, "ref"> & React.RefAttributes<HTMLInputElement>>;
23
+ export {};
24
+ //# sourceMappingURL=Input.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Input.d.ts","sourceRoot":"","sources":["../../src/components/Input.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAG1D,MAAM,MAAM,SAAS,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAE3C,KAAK,cAAc,GAAG,KAAK,CAAC,cAAc,CAAC,OAAO,SAAS,CAAC,CAAC;AAG7D,MAAM,MAAM,UAAU,GAAG,IAAI,CAAC,cAAc,EAAE,WAAW,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,GAAG,QAAQ,CAAC,GAAG;IACpG,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,uEAAuE;IACvE,MAAM,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACzB,iGAAiG;IACjG,MAAM,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACzB,uDAAuD;IACvD,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,gFAAgF;IAChF,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;CAC7B,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,KAAK,kGAsChB,CAAC"}
@@ -0,0 +1,15 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import * as React from 'react';
4
+ import { Input as BaseInput } from '@base-ui/react/input';
5
+ import { cx } from '../utils/cx.js';
6
+ /**
7
+ * Text input on Base UI Input: inside `<Field>` it picks up label, description, error and
8
+ * validity automatically; standalone it still needs an accessible name (`aria-label`).
9
+ */
10
+ export const Input = React.forwardRef(function Input({ size = 'md', prefix, suffix, mono = false, invalid, className, style, disabled, readOnly, ...rest }, ref) {
11
+ const suffixId = React.useId();
12
+ const describedBy = [rest['aria-describedby'], suffix != null ? suffixId : undefined].filter(Boolean).join(' ') || undefined;
13
+ return (_jsxs("span", { className: cx('rl-input', className), style: style, "data-slot": "input", "data-size": size, "data-mono": mono || undefined, "data-disabled": disabled || undefined, "data-readonly": readOnly || undefined, "data-invalid": invalid || undefined, children: [prefix != null && (_jsx("span", { className: "rl-input__adornment", "data-position": "start", "aria-hidden": "true", children: prefix })), _jsx(BaseInput, { ...rest, ref: ref, disabled: disabled, readOnly: readOnly, ...(invalid ? { 'aria-invalid': true } : null), "aria-describedby": describedBy, className: "rl-input__control" }), suffix != null && (_jsx("span", { id: suffixId, className: "rl-input__adornment", "data-position": "end", children: suffix }))] }));
14
+ });
15
+ //# sourceMappingURL=Input.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Input.js","sourceRoot":"","sources":["../../src/components/Input.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,EAAE,EAAE,MAAM,gBAAgB,CAAC;AAqBpC;;;GAGG;AACH,MAAM,CAAC,MAAM,KAAK,GAAG,KAAK,CAAC,UAAU,CAA+B,SAAS,KAAK,CAChF,EAAE,IAAI,GAAG,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,GAAG,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,IAAI,EAAE,EACrG,GAAG;IAEH,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC;IAC/B,MAAM,WAAW,GAAG,CAAC,IAAI,CAAC,kBAAkB,CAAC,EAAE,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,SAAS,CAAC;IAC7H,OAAO,CACL,gBACE,SAAS,EAAE,EAAE,CAAC,UAAU,EAAE,SAAS,CAAC,EACpC,KAAK,EAAE,KAAK,eACF,OAAO,eACN,IAAI,eACJ,IAAI,IAAI,SAAS,mBACb,QAAQ,IAAI,SAAS,mBACrB,QAAQ,IAAI,SAAS,kBACtB,OAAO,IAAI,SAAS,aAEjC,MAAM,IAAI,IAAI,IAAI,CACjB,eAAM,SAAS,EAAC,qBAAqB,mBAAe,OAAO,iBAAa,MAAM,YAC3E,MAAM,GACF,CACR,EACD,KAAC,SAAS,OACJ,IAAI,EACR,GAAG,EAAE,GAAG,EACR,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,QAAQ,KACd,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,sBAC7B,WAAW,EAC7B,SAAS,EAAC,mBAAmB,GAC7B,EACD,MAAM,IAAI,IAAI,IAAI,CACjB,eAAM,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAC,qBAAqB,mBAAe,KAAK,YACpE,MAAM,GACF,CACR,IACI,CACR,CAAC;AACJ,CAAC,CAAC,CAAC"}
@@ -0,0 +1,66 @@
1
+ import * as React from 'react';
2
+ /**
3
+ * Action menu on Base UI Menu (ADR-0001): menu / menuitem semantics, arrow-key roving focus,
4
+ * typeahead, Home/End, Escape and outside-click dismissal, focus return to the trigger.
5
+ * Use for commands on an object ("导出 / 复制编号 / 归档"); use Select to choose a value
6
+ * and Tabs to switch views. Popup motion is a CSS transition (--rl-motion-fast).
7
+ */
8
+ export type MenuSide = 'top' | 'bottom' | 'left' | 'right';
9
+ export type MenuAlign = 'start' | 'center' | 'end';
10
+ export type MenuProps = {
11
+ /** Element that opens the menu (Button / IconButton with its own accessible name). */
12
+ trigger: React.ReactElement<Record<string, unknown>>;
13
+ children: React.ReactNode;
14
+ side?: MenuSide;
15
+ align?: MenuAlign;
16
+ open?: boolean;
17
+ defaultOpen?: boolean;
18
+ onOpenChange?: (open: boolean) => void;
19
+ disabled?: boolean;
20
+ className?: string;
21
+ };
22
+ export declare function Menu({ trigger, children, side, align, open, defaultOpen, onOpenChange, disabled, className }: MenuProps): React.JSX.Element;
23
+ export type MenuItemProps = {
24
+ children: React.ReactNode;
25
+ onSelect?: () => void;
26
+ /** Decorative leading icon. */
27
+ icon?: React.ReactNode;
28
+ /** Keyboard hint shown on the right, e.g. "Ctrl E". Visual only; wire the shortcut yourself. */
29
+ shortcut?: string;
30
+ /** `danger` for destructive commands; pair with a confirmation Dialog. */
31
+ tone?: 'default' | 'danger';
32
+ disabled?: boolean;
33
+ /** Keep the menu open after selection (default closes). */
34
+ keepOpen?: boolean;
35
+ };
36
+ export declare function MenuItem({ children, onSelect, icon, shortcut, tone, disabled, keepOpen }: MenuItemProps): React.JSX.Element;
37
+ export type MenuCheckboxItemProps = {
38
+ children: React.ReactNode;
39
+ checked?: boolean;
40
+ defaultChecked?: boolean;
41
+ onCheckedChange?: (checked: boolean) => void;
42
+ disabled?: boolean;
43
+ };
44
+ export declare function MenuCheckboxItem({ children, checked, defaultChecked, onCheckedChange, disabled }: MenuCheckboxItemProps): React.JSX.Element;
45
+ export type MenuRadioGroupProps = {
46
+ /** Visible group heading; also names the group for assistive tech. */
47
+ label?: React.ReactNode;
48
+ value?: string;
49
+ defaultValue?: string;
50
+ onValueChange?: (value: string) => void;
51
+ children: React.ReactNode;
52
+ };
53
+ export declare function MenuRadioGroup({ label, value, defaultValue, onValueChange, children }: MenuRadioGroupProps): React.JSX.Element;
54
+ export type MenuRadioItemProps = {
55
+ value: string;
56
+ children: React.ReactNode;
57
+ disabled?: boolean;
58
+ };
59
+ export declare function MenuRadioItem({ value, children, disabled }: MenuRadioItemProps): React.JSX.Element;
60
+ export type MenuGroupProps = {
61
+ label?: React.ReactNode;
62
+ children: React.ReactNode;
63
+ };
64
+ export declare function MenuGroup({ label, children }: MenuGroupProps): React.JSX.Element;
65
+ export declare function MenuSeparator(): React.JSX.Element;
66
+ //# sourceMappingURL=Menu.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Menu.d.ts","sourceRoot":"","sources":["../../src/components/Menu.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { Menu as BaseMenu } from '@base-ui/react/menu';
4
+ import { usePortalContainer } from '../provider/portal.js';
5
+ import { cx } from '../utils/cx.js';
6
+ function Check() {
7
+ return (_jsx("svg", { viewBox: "0 0 16 16", fill: "none", stroke: "currentColor", strokeWidth: "1.75", "aria-hidden": "true", focusable: "false", children: _jsx("path", { d: "m3 8.5 3.5 3.5L13 4.5", strokeLinecap: "round", strokeLinejoin: "round" }) }));
8
+ }
9
+ function Dot() {
10
+ return (_jsx("svg", { viewBox: "0 0 16 16", "aria-hidden": "true", focusable: "false", children: _jsx("circle", { cx: "8", cy: "8", r: "3", fill: "currentColor" }) }));
11
+ }
12
+ export function Menu({ trigger, children, side = 'bottom', align = 'start', open, defaultOpen, onOpenChange, disabled, className }) {
13
+ const container = usePortalContainer();
14
+ return (_jsxs(BaseMenu.Root, { open: open, defaultOpen: defaultOpen, onOpenChange: onOpenChange ? (next) => onOpenChange(next) : undefined, disabled: disabled, children: [_jsx(BaseMenu.Trigger, { render: trigger }), _jsx(BaseMenu.Portal, { container: container, children: _jsx(BaseMenu.Positioner, { className: "rl-menu__positioner", side: side, align: align, sideOffset: 4, collisionPadding: 8, positionMethod: "fixed", children: _jsx(BaseMenu.Popup, { className: cx('rl-menu', className), "data-slot": "menu", children: children }) }) })] }));
15
+ }
16
+ export function MenuItem({ children, onSelect, icon, shortcut, tone = 'default', disabled, keepOpen = false }) {
17
+ return (_jsxs(BaseMenu.Item, { className: "rl-menu__item", "data-tone": tone, disabled: disabled, closeOnClick: !keepOpen, onClick: onSelect ? () => onSelect() : undefined, children: [_jsx("span", { className: "rl-menu__icon", "aria-hidden": "true", children: icon }), _jsx("span", { className: "rl-menu__label", children: children }), shortcut != null && (_jsx("kbd", { className: "rl-menu__shortcut", "aria-hidden": "true", children: shortcut }))] }));
18
+ }
19
+ export function MenuCheckboxItem({ children, checked, defaultChecked, onCheckedChange, disabled }) {
20
+ return (_jsxs(BaseMenu.CheckboxItem, { className: "rl-menu__item", checked: checked, defaultChecked: defaultChecked, onCheckedChange: onCheckedChange ? (next) => onCheckedChange(next) : undefined, disabled: disabled, children: [_jsx(BaseMenu.CheckboxItemIndicator, { className: "rl-menu__icon", keepMounted: true, children: _jsx("span", { className: "rl-menu__indicator", children: _jsx(Check, {}) }) }), _jsx("span", { className: "rl-menu__label", children: children })] }));
21
+ }
22
+ export function MenuRadioGroup({ label, value, defaultValue, onValueChange, children }) {
23
+ return (_jsxs(BaseMenu.Group, { className: "rl-menu__group", children: [label != null && _jsx(BaseMenu.GroupLabel, { className: "rl-menu__group-label", children: label }), _jsx(BaseMenu.RadioGroup, { value: value, defaultValue: defaultValue, onValueChange: onValueChange ? (next) => onValueChange(String(next)) : undefined, children: children })] }));
24
+ }
25
+ export function MenuRadioItem({ value, children, disabled }) {
26
+ return (_jsxs(BaseMenu.RadioItem, { className: "rl-menu__item", value: value, disabled: disabled, children: [_jsx(BaseMenu.RadioItemIndicator, { className: "rl-menu__icon", keepMounted: true, children: _jsx("span", { className: "rl-menu__indicator", children: _jsx(Dot, {}) }) }), _jsx("span", { className: "rl-menu__label", children: children })] }));
27
+ }
28
+ export function MenuGroup({ label, children }) {
29
+ return (_jsxs(BaseMenu.Group, { className: "rl-menu__group", children: [label != null && _jsx(BaseMenu.GroupLabel, { className: "rl-menu__group-label", children: label }), children] }));
30
+ }
31
+ export function MenuSeparator() {
32
+ return _jsx(BaseMenu.Separator, { className: "rl-menu__separator" });
33
+ }
34
+ //# sourceMappingURL=Menu.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Menu.js","sourceRoot":"","sources":["../../src/components/Menu.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ import * as React from 'react';
2
+ /**
3
+ * Archive metadata as a semantic description list (<dl>). Values come from the caller's
4
+ * real record; missing values are hidden by default so the component never displays
5
+ * invented placeholders as if they were data.
6
+ */
7
+ export type MetadataValue = React.ReactNode;
8
+ export interface MetadataItem {
9
+ /** Stable key; defaults to the label when it is a string. */
10
+ key?: string;
11
+ label: React.ReactNode;
12
+ value: MetadataValue;
13
+ /** Monospace value for IDs, codes, measurements and timestamps. */
14
+ mono?: boolean;
15
+ /** Machine-readable date/time; wraps the value in <time dateTime>. */
16
+ dateTime?: string;
17
+ /** Short note under the value, e.g. a unit basis or provenance. */
18
+ hint?: React.ReactNode;
19
+ /** Let a long value span the full row in multi-column layouts. */
20
+ wide?: boolean;
21
+ }
22
+ export type MetadataListLayout = 'inline' | 'stacked';
23
+ export type MetadataEmpty = 'hide' | 'placeholder';
24
+ export type MetadataListProps = Omit<React.HTMLAttributes<HTMLDListElement>, 'children'> & {
25
+ items: readonly MetadataItem[];
26
+ /** `inline`: label column + value; `stacked`: label above value (narrow panels). */
27
+ layout?: MetadataListLayout;
28
+ /** Number of item columns on wide containers; collapses to one on narrow ones. */
29
+ columns?: 1 | 2 | 3;
30
+ /**
31
+ * How to treat items whose value is null / undefined / ''. `hide` (default) omits the row;
32
+ * `placeholder` keeps the row with a dash announced as「未记录」.
33
+ */
34
+ empty?: MetadataEmpty;
35
+ size?: 'sm' | 'md';
36
+ };
37
+ export declare function isEmptyValue(value: MetadataValue): boolean;
38
+ export declare const MetadataList: React.ForwardRefExoticComponent<Omit<React.HTMLAttributes<HTMLDListElement>, "children"> & {
39
+ items: readonly MetadataItem[];
40
+ /** `inline`: label column + value; `stacked`: label above value (narrow panels). */
41
+ layout?: MetadataListLayout;
42
+ /** Number of item columns on wide containers; collapses to one on narrow ones. */
43
+ columns?: 1 | 2 | 3;
44
+ /**
45
+ * How to treat items whose value is null / undefined / ''. `hide` (default) omits the row;
46
+ * `placeholder` keeps the row with a dash announced as「未记录」.
47
+ */
48
+ empty?: MetadataEmpty;
49
+ size?: "sm" | "md";
50
+ } & React.RefAttributes<HTMLDListElement>>;
51
+ //# sourceMappingURL=MetadataList.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MetadataList.d.ts","sourceRoot":"","sources":["../../src/components/MetadataList.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B;;;;GAIG;AAEH,MAAM,MAAM,aAAa,GAAG,KAAK,CAAC,SAAS,CAAC;AAE5C,MAAM,WAAW,YAAY;IAC3B,6DAA6D;IAC7D,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,KAAK,EAAE,aAAa,CAAC;IACrB,mEAAmE;IACnE,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,sEAAsE;IACtE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,mEAAmE;IACnE,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,kEAAkE;IAClE,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,MAAM,kBAAkB,GAAG,QAAQ,GAAG,SAAS,CAAC;AACtD,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,aAAa,CAAC;AAEnD,MAAM,MAAM,iBAAiB,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,gBAAgB,CAAC,EAAE,UAAU,CAAC,GAAG;IACzF,KAAK,EAAE,SAAS,YAAY,EAAE,CAAC;IAC/B,oFAAoF;IACpF,MAAM,CAAC,EAAE,kBAAkB,CAAC;IAC5B,kFAAkF;IAClF,OAAO,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACpB;;;OAGG;IACH,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;CACpB,CAAC;AAEF,wBAAgB,YAAY,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAE1D;AAOD,eAAO,MAAM,YAAY;WAtBhB,SAAS,YAAY,EAAE;IAC9B,oFAAoF;aAC3E,kBAAkB;IAC3B,kFAAkF;cACxE,CAAC,GAAG,CAAC,GAAG,CAAC;IACnB;;;OAGG;YACK,aAAa;WACd,IAAI,GAAG,IAAI;0CAqDlB,CAAC"}
@@ -0,0 +1,25 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import * as React from 'react';
4
+ import { useRhineMessages } from '../provider/messages.js';
5
+ import { cx } from '../utils/cx.js';
6
+ export function isEmptyValue(value) {
7
+ return value === null || value === undefined || value === false || (typeof value === 'string' && value.trim() === '');
8
+ }
9
+ function itemKey(item, index) {
10
+ if (item.key)
11
+ return item.key;
12
+ return typeof item.label === 'string' ? item.label : String(index);
13
+ }
14
+ export const MetadataList = React.forwardRef(function MetadataList({ items, layout = 'inline', columns = 1, empty = 'hide', size = 'md', className, ...rest }, ref) {
15
+ const messages = useRhineMessages();
16
+ const visible = empty === 'hide' ? items.filter((item) => !isEmptyValue(item.value)) : items;
17
+ if (visible.length === 0)
18
+ return null;
19
+ return (_jsx("dl", { ...rest, ref: ref, className: cx('rl-meta', className), "data-slot": "metadata-list", "data-layout": layout, "data-columns": columns, "data-size": size, children: visible.map((item, index) => {
20
+ const missing = isEmptyValue(item.value);
21
+ const content = missing ? (_jsxs("span", { className: "rl-meta__empty", children: [_jsx("span", { "aria-hidden": "true", children: "\u2014" }), _jsx("span", { className: "rl-visually-hidden", children: messages.metadataList.missing })] })) : item.dateTime ? (_jsx("time", { dateTime: item.dateTime, children: item.value })) : (item.value);
22
+ return (_jsxs("div", { className: "rl-meta__item", "data-wide": item.wide || undefined, children: [_jsx("dt", { className: "rl-meta__label", children: item.label }), _jsxs("dd", { className: "rl-meta__value", "data-mono": item.mono || undefined, "data-empty": missing || undefined, children: [content, item.hint != null && !missing && _jsx("span", { className: "rl-meta__hint", children: item.hint })] })] }, itemKey(item, index)));
23
+ }) }));
24
+ });
25
+ //# sourceMappingURL=MetadataList.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MetadataList.js","sourceRoot":"","sources":["../../src/components/MetadataList.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,EAAE,EAAE,MAAM,gBAAgB,CAAC;AA0CpC,MAAM,UAAU,YAAY,CAAC,KAAoB;IAC/C,OAAO,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,KAAK,IAAI,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;AACxH,CAAC;AAED,SAAS,OAAO,CAAC,IAAkB,EAAE,KAAa;IAChD,IAAI,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC,GAAG,CAAC;IAC9B,OAAO,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACrE,CAAC;AAED,MAAM,CAAC,MAAM,YAAY,GAAG,KAAK,CAAC,UAAU,CAAsC,SAAS,YAAY,CACrG,EAAE,KAAK,EAAE,MAAM,GAAG,QAAQ,EAAE,OAAO,GAAG,CAAC,EAAE,KAAK,GAAG,MAAM,EAAE,IAAI,GAAG,IAAI,EAAE,SAAS,EAAE,GAAG,IAAI,EAAE,EAC1F,GAAG;IAEH,MAAM,QAAQ,GAAG,gBAAgB,EAAE,CAAC;IACpC,MAAM,OAAO,GAAG,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IAC7F,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACtC,OAAO,CACL,gBACM,IAAI,EACR,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,EAAE,CAAC,SAAS,EAAE,SAAS,CAAC,eACzB,eAAe,iBACZ,MAAM,kBACL,OAAO,eACV,IAAI,YAEd,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;YAC3B,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACzC,MAAM,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,CACxB,gBAAM,SAAS,EAAC,gBAAgB,aAC9B,8BAAkB,MAAM,uBAAS,EACjC,eAAM,SAAS,EAAC,oBAAoB,YAAE,QAAQ,CAAC,YAAY,CAAC,OAAO,GAAQ,IACtE,CACR,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAClB,eAAM,QAAQ,EAAE,IAAI,CAAC,QAAQ,YAAG,IAAI,CAAC,KAAK,GAAQ,CACnD,CAAC,CAAC,CAAC,CACF,IAAI,CAAC,KAAK,CACX,CAAC;YACF,OAAO,CACL,eAAgC,SAAS,EAAC,eAAe,eAAY,IAAI,CAAC,IAAI,IAAI,SAAS,aACzF,aAAI,SAAS,EAAC,gBAAgB,YAAE,IAAI,CAAC,KAAK,GAAM,EAChD,cAAI,SAAS,EAAC,gBAAgB,eAAY,IAAI,CAAC,IAAI,IAAI,SAAS,gBAAc,OAAO,IAAI,SAAS,aAC/F,OAAO,EACP,IAAI,CAAC,IAAI,IAAI,IAAI,IAAI,CAAC,OAAO,IAAI,eAAM,SAAS,EAAC,eAAe,YAAE,IAAI,CAAC,IAAI,GAAQ,IACjF,KALG,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAMxB,CACP,CAAC;QACJ,CAAC,CAAC,GACC,CACN,CAAC;AACJ,CAAC,CAAC,CAAC"}
@@ -0,0 +1,52 @@
1
+ import * as React from 'react';
2
+ import type { InputSize } from './Input.js';
3
+ /**
4
+ * Numeric input with stepper buttons on Base UI NumberField + Field (ADR-0010 §2). Label,
5
+ * description and error are wired like `Field` (aria-labelledby / aria-describedby /
6
+ * aria-invalid). The visible text input parses and formats with the provider locale; a hidden
7
+ * native input carries the raw number for form submission under `name`.
8
+ *
9
+ * Keyboard (Base UI): ↑/↓ step, Shift + arrow takes `largeStep`, Alt + arrow `smallStep`,
10
+ * Home/End jump to min/max (when set). The stepper buttons are out of the Tab order (the
11
+ * arrows do the same) but stay reachable for pointer and touch; their names come from the
12
+ * message table (`numberField.increment` / `decrement`).
13
+ *
14
+ * <NumberField label="并发上限" min={1} max={16} defaultValue={4} name="concurrency" />
15
+ */
16
+ export type NumberFieldProps = Omit<React.HTMLAttributes<HTMLDivElement>, 'children' | 'defaultValue' | 'onChange'> & {
17
+ label: React.ReactNode;
18
+ hideLabel?: boolean;
19
+ description?: React.ReactNode;
20
+ /** Error text: shows on native validity failure, or always together with `invalid`. */
21
+ error?: React.ReactNode;
22
+ invalid?: boolean;
23
+ required?: boolean;
24
+ optional?: boolean;
25
+ /** `null` means empty. */
26
+ value?: number | null;
27
+ defaultValue?: number;
28
+ onValueChange?: (value: number | null) => void;
29
+ /** Fires on blur after typing and on pointer release after stepping. */
30
+ onValueCommitted?: (value: number | null) => void;
31
+ min?: number;
32
+ max?: number;
33
+ step?: number;
34
+ largeStep?: number;
35
+ smallStep?: number;
36
+ /** Intl options for display and parsing (e.g. `{ style: 'percent' }`); locale comes from RhineProvider. */
37
+ format?: Intl.NumberFormatOptions;
38
+ /** Snap stepped values to multiples of `step`. */
39
+ snapOnStep?: boolean;
40
+ name?: string;
41
+ disabled?: boolean;
42
+ readOnly?: boolean;
43
+ size?: InputSize;
44
+ placeholder?: string;
45
+ /** Trailing unit text (e.g. "个"), read as part of the description. */
46
+ unit?: React.ReactNode;
47
+ /** Ref to the visible text input. */
48
+ inputRef?: React.Ref<HTMLInputElement>;
49
+ ref?: React.Ref<HTMLDivElement>;
50
+ };
51
+ export declare function NumberField({ label, hideLabel, description, error, invalid, required, optional, value, defaultValue, onValueChange, onValueCommitted, min, max, step, largeStep, smallStep, format, snapOnStep, name, disabled, readOnly, size, placeholder, unit, inputRef, className, style, ref, ...rest }: NumberFieldProps): React.JSX.Element;
52
+ //# sourceMappingURL=NumberField.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NumberField.d.ts","sourceRoot":"","sources":["../../src/components/NumberField.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAM/B,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C;;;;;;;;;;;;GAYG;AAEH,MAAM,MAAM,gBAAgB,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC,EAAE,UAAU,GAAG,cAAc,GAAG,UAAU,CAAC,GAAG;IACpH,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,WAAW,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC9B,uFAAuF;IACvF,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACxB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,0BAA0B;IAC1B,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IAC/C,wEAAwE;IACxE,gBAAgB,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IAClD,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,2GAA2G;IAC3G,MAAM,CAAC,EAAE,IAAI,CAAC,mBAAmB,CAAC;IAClC,kDAAkD;IAClD,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,sEAAsE;IACtE,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,qCAAqC;IACrC,QAAQ,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;IACvC,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;CACjC,CAAC;AAkBF,wBAAgB,WAAW,CAAC,EAC1B,KAAK,EACL,SAAiB,EACjB,WAAW,EACX,KAAK,EACL,OAAO,EACP,QAAgB,EAChB,QAAgB,EAChB,KAAK,EACL,YAAY,EACZ,aAAa,EACb,gBAAgB,EAChB,GAAG,EACH,GAAG,EACH,IAAI,EACJ,SAAS,EACT,SAAS,EACT,MAAM,EACN,UAAU,EACV,IAAI,EACJ,QAAQ,EACR,QAAQ,EACR,IAAW,EACX,WAAW,EACX,IAAI,EACJ,QAAQ,EACR,SAAS,EACT,KAAK,EACL,GAAG,EACH,GAAG,IAAI,EACR,EAAE,gBAAgB,qBAuElB"}
@@ -0,0 +1,21 @@
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 { NumberField as BaseNumberField } from '@base-ui/react/number-field';
6
+ import { useRhineLocale } from '../provider/messages.js';
7
+ import { cx } from '../utils/cx.js';
8
+ import { FieldErrorMessage, LabelText } from './fieldParts.js';
9
+ function Minus() {
10
+ return (_jsx("svg", { viewBox: "0 0 16 16", "aria-hidden": "true", focusable: "false", children: _jsx("path", { d: "M3.5 8h9" }) }));
11
+ }
12
+ function Plus() {
13
+ return (_jsx("svg", { viewBox: "0 0 16 16", "aria-hidden": "true", focusable: "false", children: _jsx("path", { d: "M3.5 8h9M8 3.5v9" }) }));
14
+ }
15
+ export function NumberField({ label, hideLabel = false, description, error, invalid, required = false, optional = false, value, defaultValue, onValueChange, onValueCommitted, min, max, step, largeStep, smallStep, format, snapOnStep, name, disabled, readOnly, size = 'md', placeholder, unit, inputRef, className, style, ref, ...rest }) {
16
+ const { messages, locale } = useRhineLocale();
17
+ const unitId = React.useId();
18
+ const match = invalid ? true : undefined;
19
+ return (_jsxs(BaseField.Root, { ...rest, ref: ref, name: name, invalid: invalid, disabled: disabled, className: cx('rl-field', 'rl-number-field', className), style: style, "data-slot": "number-field", "data-required": required || undefined, children: [_jsx(BaseField.Label, { className: cx('rl-field__label', hideLabel && 'rl-visually-hidden'), children: _jsx(LabelText, { label: label, required: required, optional: optional }) }), _jsxs("div", { className: "rl-field__body", children: [_jsx(BaseNumberField.Root, { name: name, value: value, defaultValue: defaultValue, onValueChange: onValueChange ? (next) => onValueChange(next) : undefined, onValueCommitted: onValueCommitted ? (next) => onValueCommitted(next) : undefined, min: min, max: max, step: step, largeStep: largeStep, smallStep: smallStep, format: format, snapOnStep: snapOnStep, locale: locale, required: required, disabled: disabled, readOnly: readOnly, className: "rl-number-field__root", children: _jsxs(BaseNumberField.Group, { className: "rl-input rl-number-field__group", "data-size": size, "data-disabled": disabled || undefined, "data-readonly": readOnly || undefined, "data-invalid": invalid || undefined, children: [_jsx(BaseNumberField.Decrement, { className: "rl-number-field__stepper", "aria-label": messages.numberField.decrement, "data-position": "start", children: _jsx(Minus, {}) }), _jsx(BaseNumberField.Input, { ref: inputRef, className: "rl-input__control rl-number-field__input", placeholder: placeholder, "aria-roledescription": messages.numberField.roleDescription, "aria-describedby": unit != null ? unitId : undefined }), unit != null && (_jsx("span", { id: unitId, className: "rl-input__adornment rl-number-field__unit", children: unit })), _jsx(BaseNumberField.Increment, { className: "rl-number-field__stepper", "aria-label": messages.numberField.increment, "data-position": "end", children: _jsx(Plus, {}) })] }) }), description != null && _jsx(BaseField.Description, { className: "rl-field__description", children: description }), (error != null || name != null) && _jsx(FieldErrorMessage, { error: error, match: match, name: name })] })] }));
20
+ }
21
+ //# sourceMappingURL=NumberField.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NumberField.js","sourceRoot":"","sources":["../../src/components/NumberField.tsx"],"names":[],"mappings":"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"}
@@ -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,44 @@
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
+ /** Visible heading; also the popup's accessible name. Use `aria-label` when there is no title. */
16
+ title?: React.ReactNode;
17
+ description?: React.ReactNode;
18
+ children?: React.ReactNode;
19
+ /** Footer actions. Wrap dismiss-only buttons in `<PopoverClose>`. */
20
+ actions?: React.ReactNode;
21
+ side?: PopoverSide;
22
+ align?: PopoverAlign;
23
+ size?: PopoverSize;
24
+ /** Also open on hover (for preview content). Focus and click still open it. */
25
+ openOnHover?: boolean;
26
+ /** Show a pointer arrow toward the trigger. */
27
+ arrow?: boolean;
28
+ open?: boolean;
29
+ defaultOpen?: boolean;
30
+ onOpenChange?: (open: boolean) => void;
31
+ /** Element to focus on open; defaults to the first tabbable element, or the popup. */
32
+ initialFocus?: React.RefObject<HTMLElement | null>;
33
+ /** Accessible name when no visible `title` is rendered. */
34
+ 'aria-label'?: string;
35
+ className?: string;
36
+ };
37
+ export declare function Popover({ trigger, title, description, children, actions, side, align, size, openOnHover, arrow, open, defaultOpen, onOpenChange, initialFocus, 'aria-label': ariaLabel, className, }: PopoverProps): React.JSX.Element;
38
+ export type PopoverCloseProps = {
39
+ /** The element that closes the popover, e.g. `<Button variant="ghost">完成</Button>`. */
40
+ children: React.ReactElement<Record<string, unknown>>;
41
+ };
42
+ /** Wraps a button so activating it closes the nearest Popover. */
43
+ export declare function PopoverClose({ children }: PopoverCloseProps): React.JSX.Element;
44
+ //# 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,EAAE,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACrD,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,KAAK,CAAC,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;IACnD,2DAA2D;IAC3D,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,wBAAgB,OAAO,CAAC,EACtB,OAAO,EACP,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,YAAY,EAAE,SAAS,EACvB,SAAS,GACV,EAAE,YAAY,qBAgDd;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"}