@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,632 @@
1
+ /*
2
+ * WzRhineLab UI · component styles
3
+ * Requires @wzrhine/tokens/styles.css and a `.rl-theme` ancestor.
4
+ * Only `rl-` classes are targeted; host elements and :root stay untouched.
5
+ * No literal colours, spacing or radii here: everything resolves to --rl-* tokens.
6
+ */
7
+
8
+ @import './reset.css';
9
+ @import './overlays.css';
10
+ @import './feedback.css';
11
+ @import './archive.css';
12
+ @import './forms.css';
13
+ @import './data.css';
14
+ @import './drawer.css';
15
+ @import './status.css';
16
+ @import './disclosure.css';
17
+ @import './advanced.css';
18
+ @import './command.css';
19
+ @import './split.css';
20
+
21
+ /* Component roots use class specificity so a host `* { box-sizing }` loaded later cannot win. */
22
+ :is(.rl-button, .rl-icon-button, .rl-surface, .rl-badge, .rl-text, .rl-field, .rl-input, .rl-tabs, .rl-tooltip, .rl-dialog, .rl-select, .rl-select__popup, .rl-popover, .rl-menu, .rl-toast, .rl-record, .rl-meta, .rl-status, .rl-archive-card, .rl-timeline, .rl-table-scroll, .rl-table) {
23
+ box-sizing: border-box;
24
+ }
25
+
26
+ :where(.rl-button, .rl-icon-button, .rl-surface, .rl-badge, .rl-field, .rl-input) *,
27
+ :where(.rl-button, .rl-icon-button, .rl-surface, .rl-badge, .rl-field, .rl-input) *::before,
28
+ :where(.rl-button, .rl-icon-button, .rl-surface, .rl-badge, .rl-field, .rl-input) *::after {
29
+ box-sizing: border-box;
30
+ }
31
+
32
+ /* ---------- Button ---------- */
33
+ .rl-button {
34
+ --rl-button-bg: var(--rl-bg-surface);
35
+ --rl-button-fg: var(--rl-fg-primary);
36
+ --rl-button-border: var(--rl-border-strong);
37
+ --rl-button-bg-hover: var(--rl-bg-hover);
38
+ --rl-button-bg-pressed: var(--rl-bg-pressed);
39
+ --rl-button-border-hover: var(--rl-fg-primary);
40
+
41
+ position: relative;
42
+ display: inline-flex;
43
+ align-items: center;
44
+ justify-content: center;
45
+ min-width: 0;
46
+ max-width: 100%;
47
+ min-height: var(--rl-control-height-md);
48
+ padding: 0 var(--rl-control-padding-x-md);
49
+ margin: 0;
50
+ appearance: none;
51
+ border: var(--rl-border-width) solid var(--rl-button-border);
52
+ border-radius: var(--rl-radius-sm);
53
+ background: var(--rl-button-bg);
54
+ color: var(--rl-button-fg);
55
+ font: var(--rl-type-label);
56
+ letter-spacing: 0;
57
+ text-align: center;
58
+ text-decoration: none;
59
+ cursor: pointer;
60
+ user-select: none;
61
+ -webkit-tap-highlight-color: transparent;
62
+ transition:
63
+ background-color var(--rl-motion-fast) var(--rl-ease-out),
64
+ border-color var(--rl-motion-fast) var(--rl-ease-out),
65
+ color var(--rl-motion-fast) var(--rl-ease-out);
66
+ }
67
+
68
+ .rl-button[data-size='sm'] {
69
+ min-height: var(--rl-control-height-sm);
70
+ padding: 0 var(--rl-control-padding-x-sm);
71
+ font: var(--rl-type-label-sm);
72
+ }
73
+
74
+ .rl-button[data-size='lg'] {
75
+ min-height: var(--rl-control-height-lg);
76
+ padding: 0 var(--rl-control-padding-x-lg);
77
+ }
78
+
79
+ .rl-button[data-variant='primary'] {
80
+ --rl-button-bg: var(--rl-bg-inverse);
81
+ --rl-button-fg: var(--rl-fg-inverse);
82
+ --rl-button-border: var(--rl-bg-inverse);
83
+ --rl-button-bg-hover: var(--rl-inverse-hover);
84
+ --rl-button-bg-pressed: var(--rl-inverse-hover);
85
+ --rl-button-border-hover: var(--rl-inverse-hover);
86
+ }
87
+
88
+ .rl-button[data-variant='accent'] {
89
+ --rl-button-bg: var(--rl-accent);
90
+ --rl-button-fg: var(--rl-fg-on-accent);
91
+ --rl-button-border: var(--rl-accent);
92
+ --rl-button-bg-hover: var(--rl-accent-hover);
93
+ --rl-button-bg-pressed: var(--rl-accent-hover);
94
+ --rl-button-border-hover: var(--rl-accent-hover);
95
+ }
96
+
97
+ .rl-button[data-variant='ghost'] {
98
+ --rl-button-bg: transparent;
99
+ --rl-button-border: transparent;
100
+ --rl-button-border-hover: transparent;
101
+ }
102
+
103
+ @media (hover: hover) {
104
+ .rl-button:not(:disabled, [aria-disabled='true']):hover {
105
+ background: var(--rl-button-bg-hover);
106
+ border-color: var(--rl-button-border-hover);
107
+ }
108
+ }
109
+
110
+ .rl-button:not(:disabled, [aria-disabled='true']):active {
111
+ background: var(--rl-button-bg-pressed);
112
+ }
113
+
114
+ .rl-button:focus-visible {
115
+ outline: var(--rl-focus-ring);
116
+ outline-offset: var(--rl-focus-offset);
117
+ }
118
+
119
+ .rl-button:disabled {
120
+ --rl-button-bg: var(--rl-bg-disabled);
121
+ --rl-button-fg: var(--rl-fg-disabled);
122
+ --rl-button-border: var(--rl-border-default);
123
+ cursor: not-allowed;
124
+ }
125
+
126
+ .rl-button[data-variant='ghost']:disabled {
127
+ --rl-button-bg: transparent;
128
+ --rl-button-border: transparent;
129
+ }
130
+
131
+ .rl-button[data-loading] {
132
+ cursor: progress;
133
+ }
134
+
135
+ .rl-button__content {
136
+ display: inline-flex;
137
+ align-items: center;
138
+ justify-content: center;
139
+ gap: var(--rl-control-gap);
140
+ min-width: 0;
141
+ max-width: 100%;
142
+ }
143
+
144
+ .rl-button__label {
145
+ min-width: 0;
146
+ max-width: 100%;
147
+ overflow-wrap: anywhere;
148
+ }
149
+
150
+ .rl-button__icon {
151
+ display: inline-flex;
152
+ flex: none;
153
+ width: var(--rl-icon-size-md);
154
+ height: var(--rl-icon-size-md);
155
+ }
156
+
157
+ .rl-button[data-size='sm'] .rl-button__icon {
158
+ width: var(--rl-icon-size-sm);
159
+ height: var(--rl-icon-size-sm);
160
+ }
161
+
162
+ .rl-button[data-size='lg'] .rl-button__icon {
163
+ width: var(--rl-icon-size-lg);
164
+ height: var(--rl-icon-size-lg);
165
+ }
166
+
167
+ .rl-button__icon > svg {
168
+ width: 100%;
169
+ height: 100%;
170
+ }
171
+
172
+ /* Spinner overlays the hidden label, so loading never changes the button width. */
173
+ .rl-button__spinner {
174
+ position: absolute;
175
+ inset: 0;
176
+ display: grid;
177
+ place-items: center;
178
+ pointer-events: none;
179
+ }
180
+
181
+ /* The spinner itself is the public Spinner (status.css). */
182
+
183
+ /* ---------- Surface ---------- */
184
+ .rl-surface {
185
+ display: block;
186
+ min-width: 0;
187
+ padding: var(--rl-surface-padding);
188
+ border: var(--rl-border-width) solid transparent;
189
+ border-radius: var(--rl-radius-sm);
190
+ background: var(--rl-bg-surface);
191
+ color: var(--rl-fg-primary);
192
+ }
193
+
194
+ .rl-surface[data-bordered] {
195
+ border-color: var(--rl-border-subtle);
196
+ }
197
+
198
+ .rl-surface[data-tone='subtle'] {
199
+ background: var(--rl-bg-subtle);
200
+ }
201
+
202
+ .rl-surface[data-tone='raised'] {
203
+ background: var(--rl-bg-raised);
204
+ box-shadow: var(--rl-shadow-raised);
205
+ }
206
+
207
+ .rl-surface[data-padding='none'] {
208
+ padding: 0;
209
+ }
210
+
211
+ .rl-surface[data-padding='sm'] {
212
+ padding: var(--rl-space-4);
213
+ }
214
+
215
+ .rl-surface[data-padding='lg'] {
216
+ padding: var(--rl-space-8);
217
+ }
218
+
219
+ /* ---------- StatusBadge ---------- */
220
+ .rl-badge {
221
+ --rl-badge-fg: var(--rl-fg-primary);
222
+ --rl-badge-bg: var(--rl-bg-subtle);
223
+ --rl-badge-border: transparent;
224
+ --rl-badge-indicator: var(--rl-fg-muted);
225
+
226
+ display: inline-flex;
227
+ align-items: center;
228
+ gap: var(--rl-space-2);
229
+ max-width: 100%;
230
+ min-height: var(--rl-badge-height-md);
231
+ padding: 0 var(--rl-space-2);
232
+ border: var(--rl-border-width) solid var(--rl-badge-border);
233
+ border-radius: var(--rl-radius-xs);
234
+ background: var(--rl-badge-bg);
235
+ color: var(--rl-badge-fg);
236
+ font: var(--rl-type-meta);
237
+ vertical-align: middle;
238
+ white-space: nowrap;
239
+ }
240
+
241
+ .rl-badge[data-size='sm'] {
242
+ min-height: var(--rl-badge-height-sm);
243
+ gap: var(--rl-space-1);
244
+ }
245
+
246
+ .rl-badge__label {
247
+ min-width: 0;
248
+ overflow: hidden;
249
+ text-overflow: ellipsis;
250
+ }
251
+
252
+ .rl-badge[data-status='info'] { --rl-badge-fg: var(--rl-info); --rl-badge-bg: var(--rl-info-subtle); --rl-badge-indicator: var(--rl-info); }
253
+ .rl-badge[data-status='success'] { --rl-badge-fg: var(--rl-success); --rl-badge-bg: var(--rl-success-subtle); --rl-badge-indicator: var(--rl-success); }
254
+ .rl-badge[data-status='warning'] { --rl-badge-fg: var(--rl-warning); --rl-badge-bg: var(--rl-warning-subtle); --rl-badge-indicator: var(--rl-warning); }
255
+ .rl-badge[data-status='danger'] { --rl-badge-fg: var(--rl-danger); --rl-badge-bg: var(--rl-danger-subtle); --rl-badge-indicator: var(--rl-danger); }
256
+
257
+ .rl-badge[data-appearance='outline'] {
258
+ --rl-badge-fg: var(--rl-fg-primary);
259
+ --rl-badge-bg: var(--rl-bg-surface);
260
+ --rl-badge-border: var(--rl-border-default);
261
+ }
262
+
263
+ /* Indicator shape differs per status so the state is not conveyed by colour alone. */
264
+ .rl-badge__indicator {
265
+ flex: none;
266
+ width: var(--rl-indicator-size);
267
+ height: var(--rl-indicator-size);
268
+ border-radius: var(--rl-radius-round);
269
+ background: var(--rl-badge-indicator);
270
+ }
271
+
272
+ .rl-badge[data-status='neutral'] .rl-badge__indicator {
273
+ background: transparent;
274
+ box-shadow: inset 0 0 0 var(--rl-border-width-strong) var(--rl-badge-indicator);
275
+ }
276
+
277
+ .rl-badge[data-status='warning'] .rl-badge__indicator {
278
+ border-radius: 0;
279
+ transform: rotate(45deg) scale(0.85);
280
+ }
281
+
282
+ .rl-badge[data-status='danger'] .rl-badge__indicator {
283
+ border-radius: 0;
284
+ }
285
+
286
+ /* ---------- Text ---------- */
287
+ .rl-text {
288
+ margin: 0;
289
+ color: var(--rl-text-tone, inherit);
290
+ overflow-wrap: break-word;
291
+ }
292
+
293
+ .rl-text[data-variant='display'] { font: var(--rl-type-display); letter-spacing: var(--rl-tracking-display); }
294
+ .rl-text[data-variant='heading-1'] { font: var(--rl-type-heading-1); letter-spacing: var(--rl-tracking-display); }
295
+ .rl-text[data-variant='heading-2'] { font: var(--rl-type-heading-2); }
296
+ .rl-text[data-variant='heading-3'] { font: var(--rl-type-heading-3); }
297
+ .rl-text[data-variant='body'] { font: var(--rl-type-body); }
298
+ .rl-text[data-variant='body-sm'] { font: var(--rl-type-body-sm); }
299
+ .rl-text[data-variant='label'] { font: var(--rl-type-label); }
300
+ .rl-text[data-variant='meta'] { font: var(--rl-type-meta); }
301
+ .rl-text[data-variant='mono'] { font: var(--rl-type-mono); letter-spacing: var(--rl-tracking-mono); }
302
+
303
+ /* Archive-style index label: mono, uppercase, tracked. Never for Chinese body copy. */
304
+ .rl-text[data-variant='eyebrow'] {
305
+ font: var(--rl-type-mono);
306
+ letter-spacing: var(--rl-tracking-caps);
307
+ text-transform: uppercase;
308
+ }
309
+
310
+ .rl-text[data-tone='primary'] { --rl-text-tone: var(--rl-fg-primary); }
311
+ .rl-text[data-tone='muted'] { --rl-text-tone: var(--rl-fg-muted); }
312
+ .rl-text[data-tone='subtle'] { --rl-text-tone: var(--rl-fg-subtle); }
313
+ .rl-text[data-tone='accent'] { --rl-text-tone: var(--rl-accent-text); }
314
+ .rl-text[data-tone='danger'] { --rl-text-tone: var(--rl-danger); }
315
+ .rl-text[data-tone='success'] { --rl-text-tone: var(--rl-success); }
316
+ .rl-text[data-tone='warning'] { --rl-text-tone: var(--rl-warning); }
317
+ .rl-text[data-tone='info'] { --rl-text-tone: var(--rl-info); }
318
+
319
+ .rl-text[data-truncate] {
320
+ display: block;
321
+ max-width: 100%;
322
+ overflow: hidden;
323
+ text-overflow: ellipsis;
324
+ white-space: nowrap;
325
+ }
326
+
327
+ .rl-text[data-numeric] {
328
+ font-variant-numeric: tabular-nums;
329
+ }
330
+
331
+ /* ---------- IconButton ---------- */
332
+ .rl-icon-button {
333
+ --rl-icon-button-size: var(--rl-control-height-md);
334
+ --rl-icon-button-bg: transparent;
335
+ --rl-icon-button-fg: var(--rl-fg-primary);
336
+ --rl-icon-button-border: transparent;
337
+ --rl-icon-button-bg-hover: var(--rl-bg-hover);
338
+
339
+ display: inline-grid;
340
+ place-items: center;
341
+ flex: none;
342
+ width: var(--rl-icon-button-size);
343
+ height: var(--rl-icon-button-size);
344
+ padding: 0;
345
+ margin: 0;
346
+ appearance: none;
347
+ border: var(--rl-border-width) solid var(--rl-icon-button-border);
348
+ border-radius: var(--rl-radius-sm);
349
+ background: var(--rl-icon-button-bg);
350
+ color: var(--rl-icon-button-fg);
351
+ cursor: pointer;
352
+ -webkit-tap-highlight-color: transparent;
353
+ transition:
354
+ background-color var(--rl-motion-fast) var(--rl-ease-out),
355
+ border-color var(--rl-motion-fast) var(--rl-ease-out),
356
+ color var(--rl-motion-fast) var(--rl-ease-out);
357
+ }
358
+
359
+ .rl-icon-button[data-size='sm'] { --rl-icon-button-size: var(--rl-control-height-sm); }
360
+ .rl-icon-button[data-size='lg'] { --rl-icon-button-size: var(--rl-control-height-lg); }
361
+
362
+ .rl-icon-button[data-variant='secondary'] {
363
+ --rl-icon-button-bg: var(--rl-bg-surface);
364
+ --rl-icon-button-border: var(--rl-border-strong);
365
+ }
366
+
367
+ .rl-icon-button[data-variant='primary'] {
368
+ --rl-icon-button-bg: var(--rl-bg-inverse);
369
+ --rl-icon-button-fg: var(--rl-fg-inverse);
370
+ --rl-icon-button-border: var(--rl-bg-inverse);
371
+ --rl-icon-button-bg-hover: var(--rl-inverse-hover);
372
+ }
373
+
374
+ @media (hover: hover) {
375
+ .rl-icon-button:not(:disabled):hover {
376
+ background: var(--rl-icon-button-bg-hover);
377
+ }
378
+ }
379
+
380
+ .rl-icon-button:not(:disabled):active {
381
+ background: var(--rl-bg-pressed);
382
+ }
383
+
384
+ .rl-icon-button[data-variant='primary']:not(:disabled):active {
385
+ background: var(--rl-inverse-hover);
386
+ }
387
+
388
+ /* Pressed (toggle on) is a distinct state from hover and focus: inset ink rule + accent-subtle fill. */
389
+ .rl-icon-button[aria-pressed='true'] {
390
+ --rl-icon-button-bg: var(--rl-accent-subtle);
391
+ --rl-icon-button-bg-hover: var(--rl-accent-subtle);
392
+ --rl-icon-button-border: var(--rl-fg-primary);
393
+ }
394
+
395
+ .rl-icon-button:focus-visible {
396
+ outline: var(--rl-focus-ring);
397
+ outline-offset: var(--rl-focus-offset);
398
+ }
399
+
400
+ .rl-icon-button:disabled {
401
+ --rl-icon-button-fg: var(--rl-fg-disabled);
402
+ --rl-icon-button-bg: transparent;
403
+ cursor: not-allowed;
404
+ }
405
+
406
+ .rl-icon-button[data-variant='secondary']:disabled,
407
+ .rl-icon-button[data-variant='primary']:disabled {
408
+ --rl-icon-button-bg: var(--rl-bg-disabled);
409
+ --rl-icon-button-border: var(--rl-border-default);
410
+ }
411
+
412
+ .rl-icon-button__icon {
413
+ display: inline-flex;
414
+ width: var(--rl-icon-size-lg);
415
+ height: var(--rl-icon-size-lg);
416
+ pointer-events: none;
417
+ }
418
+
419
+ .rl-icon-button[data-size='sm'] .rl-icon-button__icon {
420
+ width: var(--rl-icon-size-md);
421
+ height: var(--rl-icon-size-md);
422
+ }
423
+
424
+ .rl-icon-button__icon > svg {
425
+ width: 100%;
426
+ height: 100%;
427
+ }
428
+
429
+ /* ---------- Field ---------- */
430
+ .rl-field {
431
+ display: grid;
432
+ gap: var(--rl-space-2);
433
+ min-width: 0;
434
+ }
435
+
436
+ .rl-field[data-layout='inline'] {
437
+ grid-template-columns: minmax(0, var(--rl-field-label-width)) minmax(0, 1fr);
438
+ align-items: start;
439
+ column-gap: var(--rl-space-4);
440
+ }
441
+
442
+ .rl-field[data-layout='inline'] > .rl-field__label {
443
+ /* Align label text with the first line of the control. */
444
+ min-height: var(--rl-control-height-md);
445
+ align-items: center;
446
+ }
447
+
448
+ .rl-field__label {
449
+ display: inline-flex;
450
+ flex-wrap: wrap;
451
+ align-items: baseline;
452
+ gap: var(--rl-space-1);
453
+ font: var(--rl-type-label);
454
+ color: var(--rl-fg-primary);
455
+ }
456
+
457
+ .rl-field[data-disabled] .rl-field__label {
458
+ color: var(--rl-fg-muted);
459
+ }
460
+
461
+ .rl-field__required {
462
+ color: var(--rl-danger);
463
+ }
464
+
465
+ .rl-field__optional {
466
+ font: var(--rl-type-meta);
467
+ color: var(--rl-fg-muted);
468
+ }
469
+
470
+ .rl-field__body {
471
+ display: grid;
472
+ gap: var(--rl-space-2);
473
+ min-width: 0;
474
+ }
475
+
476
+ .rl-field__description {
477
+ margin: 0;
478
+ font: var(--rl-type-meta);
479
+ color: var(--rl-fg-muted);
480
+ }
481
+
482
+ .rl-field__error {
483
+ display: flex;
484
+ align-items: flex-start;
485
+ gap: var(--rl-space-2);
486
+ margin: 0;
487
+ font: var(--rl-type-meta);
488
+ font-weight: 600;
489
+ color: var(--rl-danger);
490
+ }
491
+
492
+ /* Icon + text, never colour alone. */
493
+ .rl-field__error-icon {
494
+ flex: none;
495
+ width: var(--rl-icon-size-sm);
496
+ height: var(--rl-icon-size-sm);
497
+ /* Optical alignment with the 18px meta line box. */
498
+ margin-top: calc((var(--rl-space-4) + var(--rl-border-width-strong) - var(--rl-icon-size-sm)) / 2);
499
+ fill: none;
500
+ stroke: currentColor;
501
+ stroke-width: var(--rl-border-width-strong);
502
+ stroke-linecap: round;
503
+ stroke-linejoin: round;
504
+ }
505
+
506
+ /* ---------- Input ---------- */
507
+ .rl-input {
508
+ --rl-input-border: var(--rl-border-strong);
509
+ --rl-input-bg: var(--rl-bg-surface);
510
+ --rl-input-height: var(--rl-control-height-md);
511
+ --rl-input-padding-x: var(--rl-space-3);
512
+
513
+ display: flex;
514
+ align-items: center;
515
+ gap: var(--rl-space-2);
516
+ width: 100%;
517
+ min-width: 0;
518
+ min-height: var(--rl-input-height);
519
+ padding: 0 var(--rl-input-padding-x);
520
+ border: var(--rl-border-width) solid var(--rl-input-border);
521
+ border-radius: var(--rl-radius-md);
522
+ background: var(--rl-input-bg);
523
+ color: var(--rl-fg-primary);
524
+ cursor: text;
525
+ transition:
526
+ border-color var(--rl-motion-fast) var(--rl-ease-out),
527
+ background-color var(--rl-motion-fast) var(--rl-ease-out);
528
+ }
529
+
530
+ .rl-input[data-size='sm'] {
531
+ --rl-input-height: var(--rl-control-height-sm);
532
+ --rl-input-padding-x: var(--rl-space-2);
533
+ }
534
+
535
+ .rl-input[data-size='lg'] {
536
+ --rl-input-height: var(--rl-control-height-lg);
537
+ --rl-input-padding-x: var(--rl-space-4);
538
+ }
539
+
540
+ @media (hover: hover) {
541
+ .rl-input:not([data-disabled], [data-readonly]):hover {
542
+ --rl-input-border: var(--rl-fg-muted);
543
+ }
544
+ }
545
+
546
+ /* Focus ring sits on the wrapper so adornments are inside the ring. */
547
+ .rl-input:focus-within {
548
+ --rl-input-border: var(--rl-fg-primary);
549
+ outline: var(--rl-focus-ring);
550
+ outline-offset: var(--rl-focus-offset);
551
+ }
552
+
553
+ .rl-input[data-invalid],
554
+ .rl-field[data-invalid] .rl-input {
555
+ --rl-input-border: var(--rl-danger);
556
+ box-shadow: inset 0 0 0 var(--rl-border-width) var(--rl-danger);
557
+ }
558
+
559
+ .rl-input[data-readonly] {
560
+ --rl-input-bg: var(--rl-bg-readonly);
561
+ --rl-input-border: var(--rl-border-default);
562
+ cursor: default;
563
+ }
564
+
565
+ .rl-input[data-disabled] {
566
+ --rl-input-bg: var(--rl-bg-disabled);
567
+ --rl-input-border: var(--rl-border-default);
568
+ color: var(--rl-fg-disabled);
569
+ cursor: not-allowed;
570
+ }
571
+
572
+ .rl-input__control {
573
+ flex: 1;
574
+ width: 100%;
575
+ min-width: 0;
576
+ height: calc(var(--rl-input-height) - var(--rl-border-width) * 2);
577
+ padding: 0;
578
+ margin: 0;
579
+ appearance: none;
580
+ border: 0;
581
+ outline: none;
582
+ background: transparent;
583
+ color: inherit;
584
+ font: var(--rl-type-body-sm);
585
+ cursor: inherit;
586
+ }
587
+
588
+ .rl-input[data-size='lg'] .rl-input__control {
589
+ font: var(--rl-type-body);
590
+ }
591
+
592
+ /* Mono values read at control size, not the 12px meta size. */
593
+ .rl-input[data-mono] .rl-input__control {
594
+ font-family: var(--rl-font-mono);
595
+ letter-spacing: var(--rl-tracking-mono);
596
+ }
597
+
598
+ .rl-input__control::placeholder {
599
+ color: var(--rl-fg-subtle);
600
+ opacity: 1;
601
+ }
602
+
603
+ .rl-input__adornment {
604
+ display: inline-flex;
605
+ flex: none;
606
+ align-items: center;
607
+ color: var(--rl-fg-muted);
608
+ font: var(--rl-type-mono);
609
+ }
610
+
611
+ .rl-input__adornment > svg {
612
+ width: var(--rl-icon-size-md);
613
+ height: var(--rl-icon-size-md);
614
+ }
615
+
616
+ /* ---------- Forced colours (Windows High Contrast) ---------- */
617
+ @media (forced-colors: active) {
618
+ .rl-button,
619
+ .rl-icon-button[data-variant='secondary'] { border-color: ButtonText; }
620
+ .rl-button:disabled,
621
+ .rl-icon-button:disabled { border-color: GrayText; color: GrayText; }
622
+ .rl-button:focus-visible,
623
+ .rl-icon-button:focus-visible,
624
+ .rl-input:focus-within { outline-color: Highlight; }
625
+ .rl-icon-button[aria-pressed='true'] { border-color: Highlight; }
626
+ .rl-badge { border-color: CanvasText; }
627
+ .rl-badge__indicator { background: CanvasText; }
628
+ .rl-surface[data-bordered] { border-color: CanvasText; }
629
+ .rl-input { border-color: FieldText; }
630
+ .rl-input[data-invalid],
631
+ .rl-field[data-invalid] .rl-input { border-color: Mark; }
632
+ }