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