@wzrhine/react 0.0.0-stage → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (289) hide show
  1. package/CHANGELOG.md +99 -0
  2. package/LICENSE +21 -0
  3. package/README.md +37 -3
  4. package/dist/advanced.css +398 -0
  5. package/dist/archive.css +704 -0
  6. package/dist/command.css +671 -0
  7. package/dist/components/Accordion.d.ts +82 -0
  8. package/dist/components/Accordion.d.ts.map +1 -0
  9. package/dist/components/Accordion.js +19 -0
  10. package/dist/components/Accordion.js.map +1 -0
  11. package/dist/components/Alert.d.ts +63 -0
  12. package/dist/components/Alert.d.ts.map +1 -0
  13. package/dist/components/Alert.js +29 -0
  14. package/dist/components/Alert.js.map +1 -0
  15. package/dist/components/AlertDialog.d.ts +49 -0
  16. package/dist/components/AlertDialog.d.ts.map +1 -0
  17. package/dist/components/AlertDialog.js +122 -0
  18. package/dist/components/AlertDialog.js.map +1 -0
  19. package/dist/components/ArchiveCard.d.ts +58 -0
  20. package/dist/components/ArchiveCard.d.ts.map +1 -0
  21. package/dist/components/ArchiveCard.js +40 -0
  22. package/dist/components/ArchiveCard.js.map +1 -0
  23. package/dist/components/Badge.d.ts +17 -0
  24. package/dist/components/Badge.d.ts.map +1 -0
  25. package/dist/components/Badge.js +16 -0
  26. package/dist/components/Badge.js.map +1 -0
  27. package/dist/components/Breadcrumb.d.ts +48 -0
  28. package/dist/components/Breadcrumb.d.ts.map +1 -0
  29. package/dist/components/Breadcrumb.js +55 -0
  30. package/dist/components/Breadcrumb.js.map +1 -0
  31. package/dist/components/Button.d.ts +33 -0
  32. package/dist/components/Button.d.ts.map +1 -0
  33. package/dist/components/Button.js +24 -0
  34. package/dist/components/Button.js.map +1 -0
  35. package/dist/components/Checkbox.d.ts +81 -0
  36. package/dist/components/Checkbox.d.ts.map +1 -0
  37. package/dist/components/Checkbox.js +34 -0
  38. package/dist/components/Checkbox.js.map +1 -0
  39. package/dist/components/Collapsible.d.ts +47 -0
  40. package/dist/components/Collapsible.d.ts.map +1 -0
  41. package/dist/components/Collapsible.js +12 -0
  42. package/dist/components/Collapsible.js.map +1 -0
  43. package/dist/components/Combobox.d.ts +74 -0
  44. package/dist/components/Combobox.d.ts.map +1 -0
  45. package/dist/components/Combobox.js +61 -0
  46. package/dist/components/Combobox.js.map +1 -0
  47. package/dist/components/CommandPalette.d.ts +77 -0
  48. package/dist/components/CommandPalette.d.ts.map +1 -0
  49. package/dist/components/CommandPalette.js +150 -0
  50. package/dist/components/CommandPalette.js.map +1 -0
  51. package/dist/components/ContextMenu.d.ts +31 -0
  52. package/dist/components/ContextMenu.d.ts.map +1 -0
  53. package/dist/components/ContextMenu.js +25 -0
  54. package/dist/components/ContextMenu.js.map +1 -0
  55. package/dist/components/DataTable.d.ts +83 -0
  56. package/dist/components/DataTable.d.ts.map +1 -0
  57. package/dist/components/DataTable.js +97 -0
  58. package/dist/components/DataTable.js.map +1 -0
  59. package/dist/components/Dialog.d.ts +49 -0
  60. package/dist/components/Dialog.d.ts.map +1 -0
  61. package/dist/components/Dialog.js +48 -0
  62. package/dist/components/Dialog.js.map +1 -0
  63. package/dist/components/Drawer.d.ts +56 -0
  64. package/dist/components/Drawer.d.ts.map +1 -0
  65. package/dist/components/Drawer.js +92 -0
  66. package/dist/components/Drawer.js.map +1 -0
  67. package/dist/components/EmptyState.d.ts +39 -0
  68. package/dist/components/EmptyState.d.ts.map +1 -0
  69. package/dist/components/EmptyState.js +19 -0
  70. package/dist/components/EmptyState.js.map +1 -0
  71. package/dist/components/Field.d.ts +37 -0
  72. package/dist/components/Field.d.ts.map +1 -0
  73. package/dist/components/Field.js +12 -0
  74. package/dist/components/Field.js.map +1 -0
  75. package/dist/components/Fieldset.d.ts +25 -0
  76. package/dist/components/Fieldset.d.ts.map +1 -0
  77. package/dist/components/Fieldset.js +17 -0
  78. package/dist/components/Fieldset.js.map +1 -0
  79. package/dist/components/FileDropZone.d.ts +60 -0
  80. package/dist/components/FileDropZone.d.ts.map +1 -0
  81. package/dist/components/FileDropZone.js +121 -0
  82. package/dist/components/FileDropZone.js.map +1 -0
  83. package/dist/components/Form.d.ts +22 -0
  84. package/dist/components/Form.d.ts.map +1 -0
  85. package/dist/components/Form.js +20 -0
  86. package/dist/components/Form.js.map +1 -0
  87. package/dist/components/Icon.d.ts +25 -0
  88. package/dist/components/Icon.d.ts.map +1 -0
  89. package/dist/components/Icon.js +38 -0
  90. package/dist/components/Icon.js.map +1 -0
  91. package/dist/components/IconButton.d.ts +25 -0
  92. package/dist/components/IconButton.d.ts.map +1 -0
  93. package/dist/components/IconButton.js +14 -0
  94. package/dist/components/IconButton.js.map +1 -0
  95. package/dist/components/Input.d.ts +24 -0
  96. package/dist/components/Input.d.ts.map +1 -0
  97. package/dist/components/Input.js +15 -0
  98. package/dist/components/Input.js.map +1 -0
  99. package/dist/components/Menu.d.ts +66 -0
  100. package/dist/components/Menu.d.ts.map +1 -0
  101. package/dist/components/Menu.js +34 -0
  102. package/dist/components/Menu.js.map +1 -0
  103. package/dist/components/MetadataList.d.ts +51 -0
  104. package/dist/components/MetadataList.d.ts.map +1 -0
  105. package/dist/components/MetadataList.js +25 -0
  106. package/dist/components/MetadataList.js.map +1 -0
  107. package/dist/components/NumberField.d.ts +54 -0
  108. package/dist/components/NumberField.d.ts.map +1 -0
  109. package/dist/components/NumberField.js +27 -0
  110. package/dist/components/NumberField.js.map +1 -0
  111. package/dist/components/Pagination.d.ts +40 -0
  112. package/dist/components/Pagination.d.ts.map +1 -0
  113. package/dist/components/Pagination.js +64 -0
  114. package/dist/components/Pagination.js.map +1 -0
  115. package/dist/components/Popover.d.ts +49 -0
  116. package/dist/components/Popover.d.ts.map +1 -0
  117. package/dist/components/Popover.js +14 -0
  118. package/dist/components/Popover.js.map +1 -0
  119. package/dist/components/Progress.d.ts +57 -0
  120. package/dist/components/Progress.d.ts.map +1 -0
  121. package/dist/components/Progress.js +31 -0
  122. package/dist/components/Progress.js.map +1 -0
  123. package/dist/components/Radio.d.ts +68 -0
  124. package/dist/components/Radio.d.ts.map +1 -0
  125. package/dist/components/Radio.js +18 -0
  126. package/dist/components/Radio.js.map +1 -0
  127. package/dist/components/RecordHeader.d.ts +53 -0
  128. package/dist/components/RecordHeader.d.ts.map +1 -0
  129. package/dist/components/RecordHeader.js +19 -0
  130. package/dist/components/RecordHeader.js.map +1 -0
  131. package/dist/components/ResizeHandle.d.ts +32 -0
  132. package/dist/components/ResizeHandle.d.ts.map +1 -0
  133. package/dist/components/ResizeHandle.js +33 -0
  134. package/dist/components/ResizeHandle.js.map +1 -0
  135. package/dist/components/ScrollArea.d.ts +60 -0
  136. package/dist/components/ScrollArea.d.ts.map +1 -0
  137. package/dist/components/ScrollArea.js +63 -0
  138. package/dist/components/ScrollArea.js.map +1 -0
  139. package/dist/components/Select.d.ts +39 -0
  140. package/dist/components/Select.d.ts.map +1 -0
  141. package/dist/components/Select.js +24 -0
  142. package/dist/components/Select.js.map +1 -0
  143. package/dist/components/Separator.d.ts +26 -0
  144. package/dist/components/Separator.d.ts.map +1 -0
  145. package/dist/components/Separator.js +22 -0
  146. package/dist/components/Separator.js.map +1 -0
  147. package/dist/components/Skeleton.d.ts +31 -0
  148. package/dist/components/Skeleton.d.ts.map +1 -0
  149. package/dist/components/Skeleton.js +17 -0
  150. package/dist/components/Skeleton.js.map +1 -0
  151. package/dist/components/Slider.d.ts +65 -0
  152. package/dist/components/Slider.d.ts.map +1 -0
  153. package/dist/components/Slider.js +30 -0
  154. package/dist/components/Slider.js.map +1 -0
  155. package/dist/components/Spinner.d.ts +23 -0
  156. package/dist/components/Spinner.d.ts.map +1 -0
  157. package/dist/components/Spinner.js +13 -0
  158. package/dist/components/Spinner.js.map +1 -0
  159. package/dist/components/SplitButton.d.ts +59 -0
  160. package/dist/components/SplitButton.d.ts.map +1 -0
  161. package/dist/components/SplitButton.js +30 -0
  162. package/dist/components/SplitButton.js.map +1 -0
  163. package/dist/components/Stat.d.ts +53 -0
  164. package/dist/components/Stat.d.ts.map +1 -0
  165. package/dist/components/Stat.js +23 -0
  166. package/dist/components/Stat.js.map +1 -0
  167. package/dist/components/StatusBadge.d.ts +19 -0
  168. package/dist/components/StatusBadge.d.ts.map +1 -0
  169. package/dist/components/StatusBadge.js +8 -0
  170. package/dist/components/StatusBadge.js.map +1 -0
  171. package/dist/components/StatusIndicator.d.ts +29 -0
  172. package/dist/components/StatusIndicator.d.ts.map +1 -0
  173. package/dist/components/StatusIndicator.js +8 -0
  174. package/dist/components/StatusIndicator.js.map +1 -0
  175. package/dist/components/Surface.d.ts +29 -0
  176. package/dist/components/Surface.d.ts.map +1 -0
  177. package/dist/components/Surface.js +8 -0
  178. package/dist/components/Surface.js.map +1 -0
  179. package/dist/components/Switch.d.ts +22 -0
  180. package/dist/components/Switch.d.ts.map +1 -0
  181. package/dist/components/Switch.js +11 -0
  182. package/dist/components/Switch.js.map +1 -0
  183. package/dist/components/Tabs.d.ts +45 -0
  184. package/dist/components/Tabs.d.ts.map +1 -0
  185. package/dist/components/Tabs.js +49 -0
  186. package/dist/components/Tabs.js.map +1 -0
  187. package/dist/components/Text.d.ts +33 -0
  188. package/dist/components/Text.d.ts.map +1 -0
  189. package/dist/components/Text.js +21 -0
  190. package/dist/components/Text.js.map +1 -0
  191. package/dist/components/Textarea.d.ts +54 -0
  192. package/dist/components/Textarea.d.ts.map +1 -0
  193. package/dist/components/Textarea.js +31 -0
  194. package/dist/components/Textarea.js.map +1 -0
  195. package/dist/components/Timeline.d.ts +35 -0
  196. package/dist/components/Timeline.d.ts.map +1 -0
  197. package/dist/components/Timeline.js +13 -0
  198. package/dist/components/Timeline.js.map +1 -0
  199. package/dist/components/Toast.d.ts +67 -0
  200. package/dist/components/Toast.d.ts.map +1 -0
  201. package/dist/components/Toast.js +94 -0
  202. package/dist/components/Toast.js.map +1 -0
  203. package/dist/components/Tooltip.d.ts +26 -0
  204. package/dist/components/Tooltip.d.ts.map +1 -0
  205. package/dist/components/Tooltip.js +15 -0
  206. package/dist/components/Tooltip.js.map +1 -0
  207. package/dist/components/Tree.d.ts +28 -0
  208. package/dist/components/Tree.d.ts.map +1 -0
  209. package/dist/components/Tree.js +129 -0
  210. package/dist/components/Tree.js.map +1 -0
  211. package/dist/components/VisuallyHidden.d.ts +17 -0
  212. package/dist/components/VisuallyHidden.d.ts.map +1 -0
  213. package/dist/components/VisuallyHidden.js +12 -0
  214. package/dist/components/VisuallyHidden.js.map +1 -0
  215. package/dist/components/Workbench.d.ts +31 -0
  216. package/dist/components/Workbench.d.ts.map +1 -0
  217. package/dist/components/Workbench.js +71 -0
  218. package/dist/components/Workbench.js.map +1 -0
  219. package/dist/components/fieldParts.d.ts +17 -0
  220. package/dist/components/fieldParts.d.ts.map +1 -0
  221. package/dist/components/fieldParts.js +22 -0
  222. package/dist/components/fieldParts.js.map +1 -0
  223. package/dist/components/meter-utils.d.ts +15 -0
  224. package/dist/components/meter-utils.d.ts.map +1 -0
  225. package/dist/components/meter-utils.js +15 -0
  226. package/dist/components/meter-utils.js.map +1 -0
  227. package/dist/components/navigation.d.ts +38 -0
  228. package/dist/components/navigation.d.ts.map +1 -0
  229. package/dist/components/navigation.js +96 -0
  230. package/dist/components/navigation.js.map +1 -0
  231. package/dist/components/pagination-utils.d.ts +10 -0
  232. package/dist/components/pagination-utils.d.ts.map +1 -0
  233. package/dist/components/pagination-utils.js +36 -0
  234. package/dist/components/pagination-utils.js.map +1 -0
  235. package/dist/components.css +678 -0
  236. package/dist/data.css +600 -0
  237. package/dist/disclosure.css +93 -0
  238. package/dist/drawer.css +226 -0
  239. package/dist/feedback.css +454 -0
  240. package/dist/forms.css +533 -0
  241. package/dist/index.d.ts +129 -0
  242. package/dist/index.d.ts.map +1 -0
  243. package/dist/index.js +67 -0
  244. package/dist/index.js.map +1 -0
  245. package/dist/motion/lifecycle.d.ts +44 -0
  246. package/dist/motion/lifecycle.d.ts.map +1 -0
  247. package/dist/motion/lifecycle.js +73 -0
  248. package/dist/motion/lifecycle.js.map +1 -0
  249. package/dist/motion/presence.d.ts +69 -0
  250. package/dist/motion/presence.d.ts.map +1 -0
  251. package/dist/motion/presence.js +103 -0
  252. package/dist/motion/presence.js.map +1 -0
  253. package/dist/motion/presets.d.ts +63 -0
  254. package/dist/motion/presets.d.ts.map +1 -0
  255. package/dist/motion/presets.js +30 -0
  256. package/dist/motion/presets.js.map +1 -0
  257. package/dist/motion/resolve.d.ts +31 -0
  258. package/dist/motion/resolve.d.ts.map +1 -0
  259. package/dist/motion/resolve.js +40 -0
  260. package/dist/motion/resolve.js.map +1 -0
  261. package/dist/motion/useRhineMotion.d.ts +19 -0
  262. package/dist/motion/useRhineMotion.d.ts.map +1 -0
  263. package/dist/motion/useRhineMotion.js +19 -0
  264. package/dist/motion/useRhineMotion.js.map +1 -0
  265. package/dist/motion/visibility.d.ts +6 -0
  266. package/dist/motion/visibility.d.ts.map +1 -0
  267. package/dist/motion/visibility.js +31 -0
  268. package/dist/motion/visibility.js.map +1 -0
  269. package/dist/overlays.css +465 -0
  270. package/dist/provider/RhineProvider.d.ts +65 -0
  271. package/dist/provider/RhineProvider.d.ts.map +1 -0
  272. package/dist/provider/RhineProvider.js +26 -0
  273. package/dist/provider/RhineProvider.js.map +1 -0
  274. package/dist/provider/messages.d.ts +209 -0
  275. package/dist/provider/messages.d.ts.map +1 -0
  276. package/dist/provider/messages.js +168 -0
  277. package/dist/provider/messages.js.map +1 -0
  278. package/dist/provider/portal.d.ts +17 -0
  279. package/dist/provider/portal.d.ts.map +1 -0
  280. package/dist/provider/portal.js +20 -0
  281. package/dist/provider/portal.js.map +1 -0
  282. package/dist/reset.css +45 -0
  283. package/dist/split.css +159 -0
  284. package/dist/status.css +353 -0
  285. package/dist/utils/cx.d.ts +2 -0
  286. package/dist/utils/cx.d.ts.map +1 -0
  287. package/dist/utils/cx.js +4 -0
  288. package/dist/utils/cx.js.map +1 -0
  289. package/package.json +67 -3
@@ -0,0 +1,209 @@
1
+ import * as React from 'react';
2
+ /**
3
+ * Built-in copy (ADR-0009). Every visible or screen-reader string a component renders on its own
4
+ * lives here, grouped by component. This file is the only place in `components/` and `provider/`
5
+ * allowed to contain CJK text (package-boundary test).
6
+ *
7
+ * Priority: component prop > nearest provider `messages` > `zhCN`.
8
+ *
9
+ * The tables live in a `'use client'` module on purpose: a Server Component can then pass
10
+ * `messages={enUS}` to `RhineProvider` as a client reference, although the tables contain functions.
11
+ */
12
+ /** Formats a number with the provider's `locale` (Intl.NumberFormat). */
13
+ export type RhineNumberFormat = (value: number) => string;
14
+ /**
15
+ * Parameterised entries are functions. Functions with numeric arguments receive the provider's
16
+ * number formatter as their last argument; using it is up to the table (`zhCN` keeps the
17
+ * pre-M9.5 output, which prints raw digits).
18
+ */
19
+ export interface RhineMessages {
20
+ workbench: {
21
+ index: string;
22
+ content: string;
23
+ resize: string;
24
+ width: (width: string) => string;
25
+ };
26
+ tree: {
27
+ loading: string;
28
+ empty: string;
29
+ retry: (name: string) => string;
30
+ expand: (name: string) => string;
31
+ collapse: (name: string) => string;
32
+ };
33
+ tag: {
34
+ remove: (name: string) => string;
35
+ };
36
+ alert: {
37
+ /** Dismiss button of a dismissible Alert. */
38
+ dismiss: string;
39
+ };
40
+ alertDialog: {
41
+ cancel: string;
42
+ /** Shown when `onConfirm` rejects and no `errorText` is given. */
43
+ error: string;
44
+ };
45
+ dialog: {
46
+ close: string;
47
+ };
48
+ breadcrumb: {
49
+ /** Accessible name of the `<nav>`. */
50
+ nav: string;
51
+ /** Button that reveals collapsed levels. */
52
+ expand: (count: number, format: RhineNumberFormat) => string;
53
+ };
54
+ combobox: {
55
+ /** Shown in the list when nothing matches. */
56
+ empty: string;
57
+ /** Status row while `loading`. */
58
+ loading: string;
59
+ /** Accessible name of the clear button. */
60
+ clear: string;
61
+ /** Accessible name of the button that opens the list. */
62
+ openList: string;
63
+ };
64
+ commandPalette: {
65
+ /** Accessible name of the dialog (visually hidden). */
66
+ title: string;
67
+ /** Accessible name of the search input. */
68
+ inputLabel: string;
69
+ placeholder: string;
70
+ /** Shown when no command matches. */
71
+ empty: string;
72
+ /** Keyboard hint in the footer, also the input's description. */
73
+ hint: string;
74
+ /** Visually hidden close button for touch screen readers. */
75
+ close: string;
76
+ /** Status row while `loading` (async search). */
77
+ loading: string;
78
+ };
79
+ dataTable: {
80
+ empty: string;
81
+ loading: string;
82
+ error: string;
83
+ retry: string;
84
+ /** Header checkbox while not every row on the page is selected. */
85
+ selectAll: string;
86
+ /** Header checkbox while every row on the page is selected. */
87
+ deselectAll: string;
88
+ /** Row checkbox; `label` is `getRowLabel(row)` or the row id. */
89
+ selectRow: (label: string) => string;
90
+ /** Selection summary; `offPage` = selected rows that are not on the current page. */
91
+ selection: (count: number, offPage: number, format: RhineNumberFormat) => string;
92
+ };
93
+ drawer: {
94
+ close: string;
95
+ };
96
+ field: {
97
+ /** Marker after the label of an `optional` field. */
98
+ optional: string;
99
+ };
100
+ fileDropZone: {
101
+ /** Default prompt inside the drop area. */
102
+ prompt: string;
103
+ /** Text of the visible button that opens the file picker. */
104
+ browse: string;
105
+ /** A file whose type does not match `accept`. */
106
+ rejectedType: (fileName: string) => string;
107
+ /** A file larger than `maxSize`; `limit` is already formatted, e.g. "1 MB". */
108
+ rejectedSize: (fileName: string, limit: string) => string;
109
+ /** A file beyond `maxFiles`. */
110
+ rejectedCount: (fileName: string, max: number, format: RhineNumberFormat) => string;
111
+ /** Polite announcement after files were accepted. */
112
+ accepted: (count: number, format: RhineNumberFormat) => string;
113
+ };
114
+ metadataList: {
115
+ /** Spoken text of an empty value shown as "—" (`empty="placeholder"`). */
116
+ missing: string;
117
+ };
118
+ numberField: {
119
+ /** Accessible name of the decrement stepper button. */
120
+ decrement: string;
121
+ /** Accessible name of the increment stepper button. */
122
+ increment: string;
123
+ /** `aria-roledescription` of the text input (Base UI defaults to English "Number field"). */
124
+ roleDescription: string;
125
+ };
126
+ pagination: {
127
+ nav: string;
128
+ previous: string;
129
+ next: string;
130
+ page: (page: number, format: RhineNumberFormat) => string;
131
+ compact: (page: number, pageCount: number, format: RhineNumberFormat) => string;
132
+ status: (from: number, to: number, total: number, format: RhineNumberFormat) => string;
133
+ };
134
+ progress: {
135
+ /** Spoken value of an indeterminate Progress (`value={null}`). */
136
+ indeterminate: string;
137
+ /** Spoken value of a Meter with a state label, e.g. "72%,偏高". */
138
+ meterValue: (value: string, state: string) => string;
139
+ };
140
+ recordHeader: {
141
+ /** Accessible name of the breadcrumb trail. */
142
+ trail: string;
143
+ };
144
+ select: {
145
+ placeholder: string;
146
+ };
147
+ stat: {
148
+ loading: string;
149
+ /** Spoken text of a missing value shown as "—". */
150
+ empty: string;
151
+ up: string;
152
+ down: string;
153
+ flat: string;
154
+ };
155
+ textarea: {
156
+ count: (current: number, max: number, format: RhineNumberFormat) => string;
157
+ };
158
+ timeline: {
159
+ empty: string;
160
+ };
161
+ toast: {
162
+ /** Close button of every toast. */
163
+ close: string;
164
+ /**
165
+ * Accessible name of the toast viewport region. `zhCN` keeps Base UI's built-in
166
+ * "Notifications" so the default output does not change.
167
+ */
168
+ region: string;
169
+ };
170
+ }
171
+ /** Override shape accepted by providers: any namespace, any subset of its keys. */
172
+ export type RhineMessagesOverrides = {
173
+ [K in keyof RhineMessages]?: Partial<RhineMessages[K]>;
174
+ };
175
+ /** Built-in default (zh-CN). Output is identical to the pre-M9.5 hard-coded defaults. */
176
+ export declare const zhCN: RhineMessages;
177
+ /** Reference English translation (参考译文): wording may change before 1.0. */
178
+ export declare const enUS: RhineMessages;
179
+ /** Default number locale when no provider sets one (ADR-0009 §3). Never read from the runtime. */
180
+ export declare const DEFAULT_LOCALE = "zh-CN";
181
+ export interface RhineLocaleValue {
182
+ messages: RhineMessages;
183
+ locale: string;
184
+ }
185
+ /** Shallow merge per namespace; `undefined` values in the override are ignored. */
186
+ export declare function mergeMessages(base: RhineMessages, overrides: RhineMessagesOverrides | undefined): RhineMessages;
187
+ export interface RhineMessagesProviderProps {
188
+ /** Partial table merged over the outer provider's (or `zhCN`). */
189
+ messages?: RhineMessagesOverrides;
190
+ /** Number locale for this subtree; defaults to the outer provider's (or `zh-CN`). */
191
+ locale?: string;
192
+ children: React.ReactNode;
193
+ }
194
+ /** Internal: merges a provider's overrides over the outer value (shared by both providers). */
195
+ export declare function useResolvedLocale(messages: RhineMessagesOverrides | undefined, locale: string | undefined): RhineLocaleValue;
196
+ /** Internal: publishes a resolved value (used by RhineProvider). */
197
+ export declare const RhineLocaleProvider: React.Provider<RhineLocaleValue>;
198
+ /**
199
+ * Copy (and number locale) for a region without its own RhineProvider. Nested providers merge
200
+ * with the outer one per namespace.
201
+ */
202
+ export declare function RhineMessagesProvider({ messages, locale, children }: RhineMessagesProviderProps): React.JSX.Element;
203
+ /** The merged message table of the nearest provider (`zhCN` without one). */
204
+ export declare function useRhineMessages(): RhineMessages;
205
+ /** Messages, number locale and a cached formatter of the nearest provider (also used by @wzrhine/agent). */
206
+ export declare function useRhineLocale(): RhineLocaleValue & {
207
+ formatNumber: RhineNumberFormat;
208
+ };
209
+ //# sourceMappingURL=messages.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../../src/provider/messages.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,168 @@
1
+ 'use client';
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import * as React from 'react';
4
+ /** Built-in default (zh-CN). Output is identical to the pre-M9.5 hard-coded defaults. */
5
+ export const zhCN = {
6
+ workbench: { index: '索引', content: '工作台内容', resize: '调整索引宽度', width: (width) => `宽度 ${width} 像素` },
7
+ tree: { loading: '正在读取…', empty: '暂无项目', retry: (name) => `重试读取 ${name}`, expand: (name) => `展开 ${name}`, collapse: (name) => `收起 ${name}` },
8
+ tag: { remove: (name) => `移除 ${name}` },
9
+ alert: { dismiss: '关闭提示' },
10
+ alertDialog: { cancel: '取消', error: '操作未完成,请重试。' },
11
+ dialog: { close: '关闭' },
12
+ breadcrumb: { nav: '路径', expand: (count) => `显示全部 ${count} 级路径` },
13
+ combobox: { empty: '没有匹配的选项', loading: '正在搜索…', clear: '清除选择', openList: '展开选项' },
14
+ commandPalette: {
15
+ title: '命令面板',
16
+ inputLabel: '搜索命令',
17
+ placeholder: '输入命令名称或关键词…',
18
+ empty: '没有匹配的命令',
19
+ hint: '↑ ↓ 选择,Enter 执行,Esc 关闭',
20
+ close: '关闭命令面板',
21
+ loading: '正在搜索命令…',
22
+ },
23
+ dataTable: {
24
+ empty: '没有符合条件的记录',
25
+ loading: '正在加载…',
26
+ error: '加载失败。',
27
+ retry: '重试',
28
+ selectAll: '全选',
29
+ deselectAll: '取消全选',
30
+ selectRow: (label) => `选择 ${label}`,
31
+ selection: (count, offPage) => `已选 ${count} 条${offPage > 0 ? `(其中 ${offPage} 条在其他页)` : ''}`,
32
+ },
33
+ drawer: { close: '关闭' },
34
+ field: { optional: '(可选)' },
35
+ fileDropZone: {
36
+ prompt: '将文件拖放到此处,或',
37
+ browse: '选择文件',
38
+ rejectedType: (name) => `「${name}」的文件类型不受支持`,
39
+ rejectedSize: (name, limit) => `「${name}」超过 ${limit} 的大小上限`,
40
+ rejectedCount: (name, max) => `「${name}」未添加:最多 ${max} 个文件`,
41
+ accepted: (count) => `已添加 ${count} 个文件`,
42
+ },
43
+ metadataList: { missing: '未记录' },
44
+ numberField: { decrement: '减少', increment: '增加', roleDescription: '数字输入框' },
45
+ pagination: {
46
+ nav: '分页',
47
+ previous: '上一页',
48
+ next: '下一页',
49
+ page: (p) => `第 ${p} 页`,
50
+ compact: (p, n) => `第 ${p} / ${n} 页`,
51
+ status: (from, to, total) => (total === 0 ? '共 0 条' : `第 ${from}–${to} 条,共 ${total} 条`),
52
+ },
53
+ progress: { indeterminate: '进行中', meterValue: (value, state) => `${value},${state}` },
54
+ recordHeader: { trail: '档案位置' },
55
+ select: { placeholder: '请选择' },
56
+ stat: { loading: '正在加载', empty: '无数据', up: '上升', down: '下降', flat: '持平' },
57
+ textarea: { count: (current, max) => `已输入 ${current} / ${max}` },
58
+ timeline: { empty: '暂无记录' },
59
+ toast: { close: '关闭通知', region: 'Notifications' },
60
+ };
61
+ /** Reference English translation (参考译文): wording may change before 1.0. */
62
+ export const enUS = {
63
+ workbench: { index: 'Index', content: 'Workbench content', resize: 'Resize index', width: (width) => `Width ${width} pixels` },
64
+ tree: { loading: 'Loading…', empty: 'No items', retry: (name) => `Retry loading ${name}`, expand: (name) => `Expand ${name}`, collapse: (name) => `Collapse ${name}` },
65
+ tag: { remove: (name) => `Remove ${name}` },
66
+ alert: { dismiss: 'Dismiss alert' },
67
+ alertDialog: { cancel: 'Cancel', error: 'The action did not complete. Please try again.' },
68
+ dialog: { close: 'Close' },
69
+ breadcrumb: { nav: 'Breadcrumb', expand: (count, f) => `Show all ${f(count)} levels` },
70
+ combobox: { empty: 'No matching options', loading: 'Searching…', clear: 'Clear selection', openList: 'Show options' },
71
+ commandPalette: {
72
+ title: 'Command palette',
73
+ inputLabel: 'Search commands',
74
+ placeholder: 'Type a command or keyword…',
75
+ empty: 'No matching commands',
76
+ hint: '↑ ↓ to choose, Enter to run, Esc to close',
77
+ close: 'Close command palette',
78
+ loading: 'Searching commands…',
79
+ },
80
+ dataTable: {
81
+ empty: 'No matching records',
82
+ loading: 'Loading…',
83
+ error: 'Failed to load.',
84
+ retry: 'Retry',
85
+ selectAll: 'Select all',
86
+ deselectAll: 'Deselect all',
87
+ selectRow: (label) => `Select ${label}`,
88
+ selection: (count, offPage, f) => `${f(count)} selected${offPage > 0 ? ` (${f(offPage)} on other pages)` : ''}`,
89
+ },
90
+ drawer: { close: 'Close' },
91
+ field: { optional: '(optional)' },
92
+ fileDropZone: {
93
+ prompt: 'Drop files here, or',
94
+ browse: 'Choose files',
95
+ rejectedType: (name) => `"${name}" is not a supported file type`,
96
+ rejectedSize: (name, limit) => `"${name}" is larger than ${limit}`,
97
+ rejectedCount: (name, max, f) => `"${name}" was not added: up to ${f(max)} files`,
98
+ accepted: (count, f) => `${f(count)} ${count === 1 ? 'file' : 'files'} added`,
99
+ },
100
+ metadataList: { missing: 'Not recorded' },
101
+ numberField: { decrement: 'Decrease', increment: 'Increase', roleDescription: 'Number field' },
102
+ pagination: {
103
+ nav: 'Pagination',
104
+ previous: 'Previous',
105
+ next: 'Next',
106
+ page: (p, f) => `Page ${f(p)}`,
107
+ compact: (p, n, f) => `Page ${f(p)} of ${f(n)}`,
108
+ status: (from, to, total, f) => (total === 0 ? '0 items' : `${f(from)}–${f(to)} of ${f(total)} items`),
109
+ },
110
+ progress: { indeterminate: 'In progress', meterValue: (value, state) => `${value}, ${state}` },
111
+ recordHeader: { trail: 'Record location' },
112
+ select: { placeholder: 'Select…' },
113
+ stat: { loading: 'Loading', empty: 'No data', up: 'Up', down: 'Down', flat: 'No change' },
114
+ textarea: { count: (current, max, f) => `${f(current)} / ${f(max)} characters` },
115
+ timeline: { empty: 'No entries' },
116
+ toast: { close: 'Dismiss notification', region: 'Notifications' },
117
+ };
118
+ /** Default number locale when no provider sets one (ADR-0009 §3). Never read from the runtime. */
119
+ export const DEFAULT_LOCALE = 'zh-CN';
120
+ const RhineLocaleContext = React.createContext({ messages: zhCN, locale: DEFAULT_LOCALE });
121
+ /** Shallow merge per namespace; `undefined` values in the override are ignored. */
122
+ export function mergeMessages(base, overrides) {
123
+ if (!overrides)
124
+ return base;
125
+ const result = { ...base };
126
+ for (const [namespace, entries] of Object.entries(overrides)) {
127
+ if (!entries || !(namespace in base))
128
+ continue;
129
+ const merged = { ...result[namespace] };
130
+ for (const [key, value] of Object.entries(entries)) {
131
+ if (value !== undefined)
132
+ merged[key] = value;
133
+ }
134
+ result[namespace] = merged;
135
+ }
136
+ return result;
137
+ }
138
+ /** Internal: merges a provider's overrides over the outer value (shared by both providers). */
139
+ export function useResolvedLocale(messages, locale) {
140
+ const outer = React.useContext(RhineLocaleContext);
141
+ const merged = React.useMemo(() => mergeMessages(outer.messages, messages), [outer.messages, messages]);
142
+ const resolvedLocale = locale ?? outer.locale;
143
+ return React.useMemo(() => ({ messages: merged, locale: resolvedLocale }), [merged, resolvedLocale]);
144
+ }
145
+ /** Internal: publishes a resolved value (used by RhineProvider). */
146
+ export const RhineLocaleProvider = RhineLocaleContext.Provider;
147
+ /**
148
+ * Copy (and number locale) for a region without its own RhineProvider. Nested providers merge
149
+ * with the outer one per namespace.
150
+ */
151
+ export function RhineMessagesProvider({ messages, locale, children }) {
152
+ const value = useResolvedLocale(messages, locale);
153
+ return _jsx(RhineLocaleContext.Provider, { value: value, children: children });
154
+ }
155
+ /** The merged message table of the nearest provider (`zhCN` without one). */
156
+ export function useRhineMessages() {
157
+ return React.useContext(RhineLocaleContext).messages;
158
+ }
159
+ /** Messages, number locale and a cached formatter of the nearest provider (also used by @wzrhine/agent). */
160
+ export function useRhineLocale() {
161
+ const value = React.useContext(RhineLocaleContext);
162
+ const formatNumber = React.useMemo(() => {
163
+ const formatter = new Intl.NumberFormat(value.locale);
164
+ return (n) => formatter.format(n);
165
+ }, [value.locale]);
166
+ return { ...value, formatNumber };
167
+ }
168
+ //# sourceMappingURL=messages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"messages.js","sourceRoot":"","sources":["../../src/provider/messages.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import * as React from 'react';
2
+ export interface PortalContextValue {
3
+ /** The portal node, or null until the provider has mounted it. */
4
+ container: HTMLElement | null;
5
+ }
6
+ export declare const PortalContext: React.Context<PortalContextValue | null>;
7
+ /**
8
+ * Portal target for popups (Dialog, Select, Tooltip, Popover, Menu, Toast). Inside a RhineProvider it
9
+ * is a node within the themed root, so popups inherit --rl-* tokens, theme, density and reduced
10
+ * motion. The value is the element itself (not a ref) so portals re-render once it exists;
11
+ * a null container would otherwise make Base UI fall back to <body> and lose the theme.
12
+ * Returns `undefined` outside a provider.
13
+ */
14
+ export declare function usePortalContainer(): HTMLElement | null | undefined;
15
+ /** True while inside a provider whose portal node is not mounted yet; popups should wait. */
16
+ export declare function usePortalPending(): boolean;
17
+ //# sourceMappingURL=portal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"portal.d.ts","sourceRoot":"","sources":["../../src/provider/portal.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,MAAM,WAAW,kBAAkB;IACjC,kEAAkE;IAClE,SAAS,EAAE,WAAW,GAAG,IAAI,CAAC;CAC/B;AAED,eAAO,MAAM,aAAa,0CAAuD,CAAC;AAElF;;;;;;GAMG;AACH,wBAAgB,kBAAkB,IAAI,WAAW,GAAG,IAAI,GAAG,SAAS,CAGnE;AAED,6FAA6F;AAC7F,wBAAgB,gBAAgB,IAAI,OAAO,CAG1C"}
@@ -0,0 +1,20 @@
1
+ 'use client';
2
+ import * as React from 'react';
3
+ export const PortalContext = React.createContext(null);
4
+ /**
5
+ * Portal target for popups (Dialog, Select, Tooltip, Popover, Menu, Toast). Inside a RhineProvider it
6
+ * is a node within the themed root, so popups inherit --rl-* tokens, theme, density and reduced
7
+ * motion. The value is the element itself (not a ref) so portals re-render once it exists;
8
+ * a null container would otherwise make Base UI fall back to <body> and lose the theme.
9
+ * Returns `undefined` outside a provider.
10
+ */
11
+ export function usePortalContainer() {
12
+ const ctx = React.useContext(PortalContext);
13
+ return ctx ? ctx.container : undefined;
14
+ }
15
+ /** True while inside a provider whose portal node is not mounted yet; popups should wait. */
16
+ export function usePortalPending() {
17
+ const ctx = React.useContext(PortalContext);
18
+ return ctx !== null && ctx.container === null;
19
+ }
20
+ //# sourceMappingURL=portal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"portal.js","sourceRoot":"","sources":["../../src/provider/portal.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAO/B,MAAM,CAAC,MAAM,aAAa,GAAG,KAAK,CAAC,aAAa,CAA4B,IAAI,CAAC,CAAC;AAElF;;;;;;GAMG;AACH,MAAM,UAAU,kBAAkB;IAChC,MAAM,GAAG,GAAG,KAAK,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;IAC5C,OAAO,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;AACzC,CAAC;AAED,6FAA6F;AAC7F,MAAM,UAAU,gBAAgB;IAC9B,MAAM,GAAG,GAAG,KAAK,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;IAC5C,OAAO,GAAG,KAAK,IAAI,IAAI,GAAG,CAAC,SAAS,KAAK,IAAI,CAAC;AAChD,CAAC"}
package/dist/reset.css ADDED
@@ -0,0 +1,45 @@
1
+ /*
2
+ * WzRhineLab UI · host isolation
3
+ * Host pages often style bare elements (button, table, th, td, h1–h3, input). Wherever a component
4
+ * does not set a property itself, such rules would leak in. This file resets those properties on
5
+ * library classes only — never on bare elements — so the host keeps its own styling.
6
+ * Class selectors outrank element selectors; this file is imported first, so component rules that
7
+ * follow still win ties. Verified against a hostile host stylesheet in examples/host-embed.
8
+ */
9
+
10
+ :is(.rl-button, .rl-icon-button, .rl-select, .rl-tabs__tab, .rl-toast__action, .rl-toast__close, .rl-table__sort, .rl-archive-card, .rl-input__control, .rl-text) {
11
+ text-transform: none;
12
+ letter-spacing: normal;
13
+ text-shadow: none;
14
+ }
15
+
16
+ :is(.rl-record__title, .rl-dialog__title, .rl-popover__title, .rl-toast__title) {
17
+ margin: 0;
18
+ color: inherit;
19
+ font-family: var(--rl-font-body);
20
+ text-transform: none;
21
+ letter-spacing: normal;
22
+ }
23
+
24
+ :is(.rl-dialog__description, .rl-popover__description, .rl-toast__description, .rl-dialog__eyebrow) {
25
+ margin: 0;
26
+ }
27
+
28
+ .rl-table {
29
+ box-sizing: border-box;
30
+ margin: 0;
31
+ padding: 0;
32
+ border: 0;
33
+ }
34
+
35
+ /* :where keeps this at class specificity so .rl-table__caption / .rl-table th still win. */
36
+ .rl-table :where(caption, th, td) {
37
+ box-sizing: border-box;
38
+ padding: 0;
39
+ border: 0;
40
+ }
41
+
42
+ .rl-table__checkbox {
43
+ padding: 0;
44
+ font-size: inherit;
45
+ }
package/dist/split.css ADDED
@@ -0,0 +1,159 @@
1
+ /*
2
+ * WzRhineLab UI · M12 gap components: SplitButton, ScrollArea.
3
+ * Imported by components.css; tokens only (package-boundary test).
4
+ */
5
+
6
+ /* ---------- SplitButton ---------- */
7
+ /* One frame, two real buttons: the inner corners are squared and the seam is a single rule. */
8
+ .rl-split-button {
9
+ box-sizing: border-box;
10
+ display: inline-flex;
11
+ align-items: stretch;
12
+ min-width: 0;
13
+ max-width: 100%;
14
+ vertical-align: middle;
15
+ }
16
+
17
+ .rl-split-button > .rl-split-button__main {
18
+ min-width: 0;
19
+ border-start-end-radius: 0;
20
+ border-end-end-radius: 0;
21
+ }
22
+
23
+ .rl-split-button > .rl-split-button__toggle {
24
+ height: auto;
25
+ min-height: var(--rl-icon-button-size);
26
+ margin-inline-start: calc(var(--rl-border-width) * -1);
27
+ border-start-start-radius: 0;
28
+ border-end-start-radius: 0;
29
+ }
30
+
31
+ /* The focused half sits above its neighbour so its ring is never clipped by the seam. */
32
+ .rl-split-button > :focus-visible {
33
+ position: relative;
34
+ z-index: 1;
35
+ }
36
+
37
+ .rl-split-button[data-variant='primary'] > .rl-split-button__toggle:not(:disabled) {
38
+ border-inline-start-color: color-mix(in srgb, var(--rl-fg-inverse) 35%, var(--rl-bg-inverse));
39
+ }
40
+
41
+ .rl-split-button[data-variant='accent'] > .rl-split-button__toggle {
42
+ --rl-icon-button-bg: var(--rl-accent);
43
+ --rl-icon-button-fg: var(--rl-fg-on-accent);
44
+ --rl-icon-button-border: var(--rl-accent);
45
+ --rl-icon-button-bg-hover: var(--rl-accent-hover);
46
+ }
47
+
48
+ .rl-split-button[data-variant='accent'] > .rl-split-button__toggle:not(:disabled) {
49
+ border-inline-start-color: color-mix(in srgb, var(--rl-fg-on-accent) 35%, var(--rl-accent));
50
+ }
51
+
52
+ .rl-split-button[data-variant='accent'] > .rl-split-button__toggle:not(:disabled):active {
53
+ background: var(--rl-accent-hover);
54
+ }
55
+
56
+ .rl-split-button[data-variant='ghost'] > .rl-split-button__toggle {
57
+ border-inline-start-color: var(--rl-border-default);
58
+ }
59
+
60
+ .rl-split-button > .rl-split-button__toggle[aria-disabled='true'] {
61
+ cursor: progress;
62
+ }
63
+
64
+ .rl-split-button__toggle[data-popup-open] .rl-icon-button__icon > svg {
65
+ rotate: 180deg;
66
+ }
67
+
68
+ .rl-split-button__toggle .rl-icon-button__icon > svg {
69
+ transition: rotate var(--rl-motion-fast) var(--rl-ease-out);
70
+ }
71
+
72
+ /* ---------- ScrollArea ---------- */
73
+ .rl-scroll-area {
74
+ box-sizing: border-box;
75
+ position: relative;
76
+ display: flex;
77
+ flex-direction: column;
78
+ min-width: 0;
79
+ min-height: 0;
80
+ max-height: var(--rl-scroll-area-max-height, 100%);
81
+ }
82
+
83
+ .rl-scroll-area *,
84
+ .rl-scroll-area *::before,
85
+ .rl-scroll-area *::after {
86
+ box-sizing: border-box;
87
+ }
88
+
89
+ .rl-scroll-area > .rl-scroll-area__viewport {
90
+ flex: 1 1 auto;
91
+ min-width: 0;
92
+ min-height: 0;
93
+ max-height: var(--rl-scroll-area-max-height, none);
94
+ overscroll-behavior: contain;
95
+ outline: none;
96
+ }
97
+
98
+ .rl-scroll-area > .rl-scroll-area__viewport:focus-visible {
99
+ outline: var(--rl-focus-ring);
100
+ outline-offset: calc(var(--rl-focus-width) * -1);
101
+ }
102
+
103
+ .rl-scroll-area__scrollbar {
104
+ display: flex;
105
+ padding: var(--rl-border-width);
106
+ opacity: 0;
107
+ transition: opacity var(--rl-motion-fast) var(--rl-ease-out);
108
+ user-select: none;
109
+ touch-action: none;
110
+ }
111
+
112
+ .rl-scroll-area__scrollbar[data-orientation='vertical'] {
113
+ width: var(--rl-space-2);
114
+ }
115
+
116
+ .rl-scroll-area__scrollbar[data-orientation='horizontal'] {
117
+ height: var(--rl-space-2);
118
+ }
119
+
120
+ /* Visible while the pointer is over the area, while it scrolls, and while the viewport has focus. */
121
+ .rl-scroll-area__scrollbar:is([data-hovering], [data-scrolling]),
122
+ .rl-scroll-area:focus-within > .rl-scroll-area__scrollbar {
123
+ opacity: 1;
124
+ }
125
+
126
+ .rl-scroll-area__thumb {
127
+ flex: none;
128
+ border-radius: var(--rl-radius-round);
129
+ background: var(--rl-border-strong);
130
+ transition: background-color var(--rl-motion-fast) var(--rl-ease-out);
131
+ }
132
+
133
+ .rl-scroll-area__scrollbar[data-orientation='vertical'] > .rl-scroll-area__thumb {
134
+ width: 100%;
135
+ }
136
+
137
+ .rl-scroll-area__scrollbar[data-orientation='horizontal'] > .rl-scroll-area__thumb {
138
+ height: 100%;
139
+ }
140
+
141
+ @media (hover: hover) {
142
+ .rl-scroll-area__thumb:hover {
143
+ background: var(--rl-fg-muted);
144
+ }
145
+ }
146
+
147
+ .rl-scroll-area__thumb:active {
148
+ background: var(--rl-fg-primary);
149
+ }
150
+
151
+ /* ---------- Forced colours ---------- */
152
+ @media (forced-colors: active) {
153
+ .rl-split-button > .rl-split-button__toggle:not(:disabled) { border-color: ButtonText; }
154
+ /* The overlay cannot be themed by the system: hide it and bring the native scrollbar back. */
155
+ .rl-scroll-area__scrollbar,
156
+ .rl-scroll-area__corner { display: none; }
157
+ .rl-scroll-area > .rl-scroll-area__viewport { scrollbar-width: thin; }
158
+ .rl-scroll-area > .rl-scroll-area__viewport:focus-visible { outline-color: Highlight; }
159
+ }