@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,704 @@
1
+ /*
2
+ * WzRhineLab UI · archive patterns (M3): RecordHeader, MetadataList, StatusIndicator, ArchiveCard, Timeline.
3
+ * Imported by components.css; tokens only.
4
+ */
5
+
6
+ /* Visually hidden text stays in the accessibility tree. Pinned to the top-left of its containing
7
+ block so it can never extend a scroll container. */
8
+ .rl-visually-hidden {
9
+ position: absolute;
10
+ top: 0;
11
+ left: 0;
12
+ width: var(--rl-border-width);
13
+ height: var(--rl-border-width);
14
+ margin: calc(var(--rl-border-width) * -1);
15
+ padding: 0;
16
+ overflow: hidden;
17
+ clip-path: inset(50%);
18
+ white-space: nowrap;
19
+ border: 0;
20
+ }
21
+
22
+ /* ---------- MetadataList ---------- */
23
+ .rl-meta {
24
+ --rl-meta-label-width: var(--rl-field-label-width);
25
+ --rl-meta-row-gap: var(--rl-space-2);
26
+ --rl-meta-columns: 1;
27
+ --rl-meta-gap: var(--rl-space-8);
28
+ /* A column never gets narrower than label + value; below that the list reflows to fewer columns. */
29
+ --rl-meta-min-column: calc(var(--rl-field-label-width) * 2);
30
+
31
+ display: grid;
32
+ /* At most N columns, each at least --rl-meta-min-column wide: no breakpoint needed. */
33
+ grid-template-columns: repeat(
34
+ auto-fill,
35
+ minmax(
36
+ max(min(100%, var(--rl-meta-min-column)), calc((100% - (var(--rl-meta-columns) - 1) * var(--rl-meta-gap)) / var(--rl-meta-columns))),
37
+ 1fr
38
+ )
39
+ );
40
+ column-gap: var(--rl-meta-gap);
41
+ margin: 0;
42
+ min-width: 0;
43
+ }
44
+
45
+ .rl-meta[data-columns='2'] { --rl-meta-columns: 2; }
46
+ .rl-meta[data-columns='3'] { --rl-meta-columns: 3; }
47
+
48
+ /* Stacked items have no label column, so they fit in narrower columns. */
49
+ .rl-meta[data-layout='stacked'] {
50
+ --rl-meta-min-column: calc(var(--rl-field-label-width) * 1.25);
51
+ }
52
+
53
+ .rl-meta__item {
54
+ display: grid;
55
+ gap: var(--rl-space-1);
56
+ padding: var(--rl-meta-row-gap) 0;
57
+ border-bottom: var(--rl-border-width) solid var(--rl-border-subtle);
58
+ min-width: 0;
59
+ }
60
+
61
+ .rl-meta[data-layout='inline'] .rl-meta__item {
62
+ grid-template-columns: minmax(0, var(--rl-meta-label-width)) minmax(0, 1fr);
63
+ align-items: baseline;
64
+ column-gap: var(--rl-space-4);
65
+ }
66
+
67
+ .rl-meta__item[data-wide] {
68
+ grid-column: 1 / -1;
69
+ }
70
+
71
+ .rl-meta__label {
72
+ margin: 0;
73
+ font: var(--rl-type-mono);
74
+ letter-spacing: var(--rl-tracking-mono);
75
+ color: var(--rl-fg-subtle);
76
+ overflow-wrap: anywhere;
77
+ }
78
+
79
+ .rl-meta__value {
80
+ display: grid;
81
+ gap: var(--rl-space-1);
82
+ margin: 0;
83
+ min-width: 0;
84
+ font: var(--rl-type-body-sm);
85
+ color: var(--rl-fg-primary);
86
+ overflow-wrap: anywhere;
87
+ }
88
+
89
+ .rl-meta__value[data-mono] {
90
+ font-family: var(--rl-font-mono);
91
+ letter-spacing: var(--rl-tracking-mono);
92
+ font-variant-numeric: tabular-nums;
93
+ }
94
+
95
+ .rl-meta__value[data-empty] {
96
+ color: var(--rl-fg-subtle);
97
+ }
98
+
99
+ .rl-meta__hint {
100
+ font: var(--rl-type-meta);
101
+ color: var(--rl-fg-muted);
102
+ }
103
+
104
+ .rl-meta[data-size='sm'] {
105
+ --rl-meta-row-gap: var(--rl-space-1);
106
+ --rl-meta-label-width: calc(var(--rl-field-label-width) * 0.75);
107
+ }
108
+
109
+ .rl-meta[data-size='sm'] .rl-meta__value {
110
+ font: var(--rl-type-meta);
111
+ }
112
+
113
+ .rl-meta[data-size='sm'] .rl-meta__value[data-mono] {
114
+ font: var(--rl-type-mono);
115
+ }
116
+
117
+ /* ---------- RecordHeader ---------- */
118
+ .rl-record {
119
+ display: grid;
120
+ gap: var(--rl-space-4);
121
+ min-width: 0;
122
+ padding-bottom: var(--rl-space-6);
123
+ border-bottom: var(--rl-border-width) solid var(--rl-border-strong);
124
+ }
125
+
126
+ /* The location trail is a Breadcrumb (data.css). */
127
+
128
+ /* Meta sits beside the title when both fit, and wraps below it otherwise (flex-wrap, no breakpoint). */
129
+ .rl-record__main {
130
+ display: flex;
131
+ flex-wrap: wrap;
132
+ align-items: flex-start;
133
+ gap: var(--rl-space-4) var(--rl-space-8);
134
+ }
135
+
136
+ .rl-record__identity {
137
+ flex: 999 1 calc(var(--rl-field-label-width) * 2.5);
138
+ display: grid;
139
+ gap: var(--rl-space-2);
140
+ min-width: 0;
141
+ /* Accent rule marks the record as the page subject; one per view. */
142
+ padding-left: var(--rl-space-4);
143
+ border-left: var(--rl-border-width-strong) solid var(--rl-accent);
144
+ }
145
+
146
+ .rl-record__id-row {
147
+ display: flex;
148
+ flex-wrap: wrap;
149
+ align-items: center;
150
+ gap: var(--rl-space-3);
151
+ margin: 0;
152
+ }
153
+
154
+ .rl-record__id {
155
+ font: var(--rl-type-heading-1);
156
+ font-family: var(--rl-font-mono);
157
+ letter-spacing: var(--rl-tracking-mono);
158
+ font-variant-numeric: tabular-nums;
159
+ overflow-wrap: anywhere;
160
+ }
161
+
162
+ .rl-record__title {
163
+ margin: 0;
164
+ font: var(--rl-type-heading-3);
165
+ overflow-wrap: anywhere;
166
+ }
167
+
168
+ .rl-record__classification {
169
+ display: flex;
170
+ flex-wrap: wrap;
171
+ gap: var(--rl-space-2);
172
+ margin: 0;
173
+ font: var(--rl-type-mono);
174
+ letter-spacing: var(--rl-tracking-caps);
175
+ text-transform: uppercase;
176
+ color: var(--rl-fg-muted);
177
+ }
178
+
179
+ .rl-record__term + .rl-record__term::before {
180
+ content: '//';
181
+ margin-right: var(--rl-space-2);
182
+ color: var(--rl-border-strong);
183
+ }
184
+
185
+ .rl-record__summary {
186
+ max-width: 64ch;
187
+ margin: 0;
188
+ font: var(--rl-type-body-sm);
189
+ color: var(--rl-fg-muted);
190
+ }
191
+
192
+ .rl-record__meta {
193
+ flex: 1 1 calc(var(--rl-field-label-width) * 2);
194
+ max-width: 100%;
195
+ }
196
+
197
+ .rl-record__actions {
198
+ display: flex;
199
+ flex-wrap: wrap;
200
+ gap: var(--rl-space-2);
201
+ }
202
+
203
+ /* ---------- StatusIndicator ---------- */
204
+ .rl-status {
205
+ --rl-status-color: var(--rl-fg-muted);
206
+
207
+ display: inline-flex;
208
+ align-items: baseline;
209
+ gap: var(--rl-space-2);
210
+ font: var(--rl-type-meta);
211
+ color: var(--rl-fg-primary);
212
+ }
213
+
214
+ .rl-status[data-tone='info'] { --rl-status-color: var(--rl-info); }
215
+ .rl-status[data-tone='success'] { --rl-status-color: var(--rl-success); }
216
+ .rl-status[data-tone='warning'] { --rl-status-color: var(--rl-warning); }
217
+ .rl-status[data-tone='danger'] { --rl-status-color: var(--rl-danger); }
218
+
219
+ /* Marker shape varies by tone (same grammar as StatusBadge), so colour is not the only cue. */
220
+ .rl-status__marker {
221
+ position: relative;
222
+ flex: none;
223
+ align-self: center;
224
+ width: var(--rl-indicator-size);
225
+ height: var(--rl-indicator-size);
226
+ border-radius: var(--rl-radius-round);
227
+ background: var(--rl-status-color);
228
+ }
229
+
230
+ .rl-status[data-tone='neutral'] .rl-status__marker {
231
+ background: transparent;
232
+ box-shadow: inset 0 0 0 var(--rl-border-width-strong) var(--rl-status-color);
233
+ }
234
+
235
+ .rl-status[data-tone='warning'] .rl-status__marker {
236
+ border-radius: 0;
237
+ transform: rotate(45deg) scale(0.85);
238
+ }
239
+
240
+ .rl-status[data-tone='danger'] .rl-status__marker {
241
+ border-radius: 0;
242
+ }
243
+
244
+ .rl-status[data-pulse] .rl-status__marker::after {
245
+ content: '';
246
+ position: absolute;
247
+ inset: 0;
248
+ border-radius: inherit;
249
+ background: var(--rl-status-color);
250
+ animation: rl-status-pulse calc(var(--rl-motion-loop) * 2) var(--rl-ease-out) infinite;
251
+ }
252
+
253
+ @keyframes rl-status-pulse {
254
+ from { opacity: 0.6; scale: 1; }
255
+ to { opacity: 0; scale: 2.6; }
256
+ }
257
+
258
+ .rl-theme[data-rl-motion='reduce'] .rl-status[data-pulse] .rl-status__marker::after {
259
+ animation: none;
260
+ opacity: 0;
261
+ }
262
+
263
+ @media (prefers-reduced-motion: reduce) {
264
+ .rl-status[data-pulse] .rl-status__marker::after {
265
+ animation: none;
266
+ opacity: 0;
267
+ }
268
+ }
269
+
270
+ .rl-status__label {
271
+ font-weight: 600;
272
+ }
273
+
274
+ .rl-status__detail {
275
+ font: var(--rl-type-mono);
276
+ color: var(--rl-fg-muted);
277
+ }
278
+
279
+ /* ---------- ArchiveCard ---------- */
280
+ .rl-archive-card {
281
+ display: grid;
282
+ grid-template-columns: minmax(0, 1fr) auto;
283
+ align-items: start;
284
+ gap: var(--rl-space-3) var(--rl-space-4);
285
+ width: 100%;
286
+ min-width: 0;
287
+ margin: 0;
288
+ padding: var(--rl-space-3) var(--rl-space-4);
289
+ appearance: none;
290
+ border: var(--rl-border-width) solid var(--rl-border-subtle);
291
+ border-radius: var(--rl-radius-sm);
292
+ background: var(--rl-bg-surface);
293
+ color: var(--rl-fg-primary);
294
+ font: inherit;
295
+ text-align: left;
296
+ text-decoration: none;
297
+ transition:
298
+ border-color var(--rl-motion-fast) var(--rl-ease-out),
299
+ background-color var(--rl-motion-fast) var(--rl-ease-out);
300
+ }
301
+
302
+ .rl-archive-card:has(.rl-archive-card__media) {
303
+ grid-template-columns: auto minmax(0, 1fr) auto;
304
+ }
305
+
306
+ .rl-archive-card[data-interactive] {
307
+ cursor: pointer;
308
+ }
309
+
310
+ @media (hover: hover) {
311
+ .rl-archive-card[data-interactive]:hover {
312
+ border-color: var(--rl-border-strong);
313
+ }
314
+ }
315
+
316
+ .rl-archive-card[data-interactive]:active {
317
+ background: var(--rl-bg-hover);
318
+ }
319
+
320
+ .rl-archive-card:focus-visible {
321
+ outline: var(--rl-focus-ring);
322
+ outline-offset: var(--rl-focus-offset);
323
+ }
324
+
325
+ /* Selected: inset accent rule on the leading edge plus raised fill — distinct from hover and focus. */
326
+ .rl-archive-card[data-selected] {
327
+ border-color: var(--rl-border-strong);
328
+ background: var(--rl-bg-raised);
329
+ box-shadow: inset var(--rl-border-width-strong) 0 0 var(--rl-accent);
330
+ }
331
+
332
+ .rl-archive-card__media {
333
+ display: block;
334
+ width: var(--rl-space-16);
335
+ aspect-ratio: 1;
336
+ overflow: hidden;
337
+ border-radius: var(--rl-radius-xs);
338
+ background: var(--rl-bg-subtle);
339
+ }
340
+
341
+ .rl-archive-card__media img {
342
+ display: block;
343
+ width: 100%;
344
+ height: 100%;
345
+ object-fit: cover;
346
+ }
347
+
348
+ .rl-archive-card__body {
349
+ display: grid;
350
+ gap: var(--rl-space-1);
351
+ min-width: 0;
352
+ }
353
+
354
+ .rl-archive-card__id {
355
+ font: var(--rl-type-mono);
356
+ font-weight: 600;
357
+ letter-spacing: var(--rl-tracking-mono);
358
+ }
359
+
360
+ .rl-archive-identity {
361
+ display: inline-block;
362
+ font: var(--rl-type-mono);
363
+ font-weight: 600;
364
+ letter-spacing: var(--rl-tracking-mono);
365
+ }
366
+
367
+ .rl-archive-card__title {
368
+ font: var(--rl-type-body-sm);
369
+ font-weight: 600;
370
+ overflow-wrap: anywhere;
371
+ }
372
+
373
+ .rl-archive-card__class {
374
+ display: flex;
375
+ flex-wrap: wrap;
376
+ gap: var(--rl-space-2);
377
+ font: var(--rl-type-meta);
378
+ color: var(--rl-fg-muted);
379
+ }
380
+
381
+ .rl-archive-card__class > * + *::before {
382
+ content: '//';
383
+ margin-right: var(--rl-space-2);
384
+ color: var(--rl-border-strong);
385
+ }
386
+
387
+ .rl-archive-card__aside {
388
+ display: grid;
389
+ justify-items: end;
390
+ gap: var(--rl-space-2);
391
+ }
392
+
393
+ .rl-archive-card__date {
394
+ font: var(--rl-type-mono);
395
+ color: var(--rl-fg-subtle);
396
+ font-variant-numeric: tabular-nums;
397
+ white-space: nowrap;
398
+ }
399
+
400
+ .rl-archive-card[data-layout='tile'],
401
+ .rl-archive-card[data-layout='tile']:has(.rl-archive-card__media) {
402
+ grid-template-columns: minmax(0, 1fr);
403
+ }
404
+
405
+ .rl-archive-card[data-layout='tile'] .rl-archive-card__media {
406
+ width: 100%;
407
+ aspect-ratio: 4 / 3;
408
+ }
409
+
410
+ .rl-archive-card[data-layout='tile'] .rl-archive-card__aside {
411
+ display: flex;
412
+ flex-wrap: wrap;
413
+ justify-content: space-between;
414
+ align-items: center;
415
+ }
416
+
417
+ /* ---------- Timeline ---------- */
418
+ .rl-timeline {
419
+ --rl-timeline-time-width: calc(var(--rl-field-label-width) * 0.75);
420
+
421
+ margin: 0;
422
+ padding: 0;
423
+ list-style: none;
424
+ }
425
+
426
+ .rl-timeline__event {
427
+ --rl-timeline-color: var(--rl-fg-muted);
428
+
429
+ position: relative;
430
+ display: grid;
431
+ grid-template-columns: minmax(0, var(--rl-timeline-time-width)) var(--rl-space-4) minmax(0, 1fr);
432
+ column-gap: var(--rl-space-3);
433
+ padding-bottom: var(--rl-space-4);
434
+ }
435
+
436
+ .rl-timeline__event[data-tone='info'] { --rl-timeline-color: var(--rl-info); }
437
+ .rl-timeline__event[data-tone='success'] { --rl-timeline-color: var(--rl-success); }
438
+ .rl-timeline__event[data-tone='warning'] { --rl-timeline-color: var(--rl-warning); }
439
+ .rl-timeline__event[data-tone='danger'] { --rl-timeline-color: var(--rl-danger); }
440
+
441
+ /* Hairline spine connecting markers, centred in the marker column. */
442
+ .rl-timeline__event:not(:last-child)::before {
443
+ content: '';
444
+ position: absolute;
445
+ top: calc(var(--rl-space-1) + var(--rl-space-3));
446
+ bottom: 0;
447
+ left: calc(var(--rl-timeline-time-width) + var(--rl-space-3) + var(--rl-space-2) - var(--rl-border-width) / 2);
448
+ width: var(--rl-border-width);
449
+ background: var(--rl-border-default);
450
+ }
451
+
452
+ .rl-timeline__time {
453
+ font: var(--rl-type-mono);
454
+ color: var(--rl-fg-subtle);
455
+ font-variant-numeric: tabular-nums;
456
+ text-align: right;
457
+ overflow-wrap: anywhere;
458
+ }
459
+
460
+ .rl-timeline__marker {
461
+ justify-self: center;
462
+ width: var(--rl-space-3);
463
+ height: var(--rl-space-3);
464
+ margin-top: var(--rl-space-1);
465
+ border: var(--rl-border-width-strong) solid var(--rl-timeline-color);
466
+ border-radius: var(--rl-radius-round);
467
+ background: var(--rl-bg-surface);
468
+ }
469
+
470
+ .rl-timeline__event[data-tone='warning'] .rl-timeline__marker,
471
+ .rl-timeline__event[data-tone='danger'] .rl-timeline__marker {
472
+ border-radius: 0;
473
+ }
474
+
475
+ .rl-timeline__event[data-tone='warning'] .rl-timeline__marker {
476
+ transform: rotate(45deg) scale(0.85);
477
+ }
478
+
479
+ .rl-timeline__body {
480
+ display: grid;
481
+ gap: var(--rl-space-1);
482
+ min-width: 0;
483
+ }
484
+
485
+ .rl-timeline__title {
486
+ margin: 0;
487
+ font: var(--rl-type-body-sm);
488
+ font-weight: 600;
489
+ }
490
+
491
+ .rl-timeline__description {
492
+ margin: 0;
493
+ font: var(--rl-type-meta);
494
+ color: var(--rl-fg-muted);
495
+ }
496
+
497
+ .rl-timeline__actor {
498
+ margin: 0;
499
+ font: var(--rl-type-mono);
500
+ color: var(--rl-fg-subtle);
501
+ }
502
+
503
+ .rl-timeline__empty {
504
+ margin: 0;
505
+ font: var(--rl-type-body-sm);
506
+ color: var(--rl-fg-muted);
507
+ }
508
+
509
+ /* ---------- DataTable ---------- */
510
+ .rl-table-scroll {
511
+ /* Containing block for absolutely positioned descendants (visually hidden headers), so they
512
+ stay inside the scroll clip instead of widening the page. */
513
+ position: relative;
514
+ max-width: 100%;
515
+ min-width: 0;
516
+ overflow-x: auto;
517
+ border: var(--rl-border-width) solid var(--rl-border-subtle);
518
+ border-radius: var(--rl-radius-sm);
519
+ /* Scroll-driven edge shadows signal hidden columns. */
520
+ background:
521
+ linear-gradient(to right, var(--rl-bg-surface) 30%, transparent) left / var(--rl-space-6) 100% no-repeat local,
522
+ linear-gradient(to left, var(--rl-bg-surface) 30%, transparent) right / var(--rl-space-6) 100% no-repeat local,
523
+ linear-gradient(to right, var(--rl-border-default), transparent) left / var(--rl-space-3) 100% no-repeat scroll,
524
+ linear-gradient(to left, var(--rl-border-default), transparent) right / var(--rl-space-3) 100% no-repeat scroll,
525
+ var(--rl-bg-surface);
526
+ }
527
+
528
+ .rl-table-scroll:focus-visible {
529
+ outline: var(--rl-focus-ring);
530
+ outline-offset: var(--rl-focus-offset);
531
+ }
532
+
533
+ .rl-table {
534
+ --rl-table-cell-y: var(--rl-space-3);
535
+ --rl-table-cell-x: var(--rl-space-4);
536
+
537
+ width: 100%;
538
+ border-collapse: collapse;
539
+ font: var(--rl-type-body-sm);
540
+ color: var(--rl-fg-primary);
541
+ }
542
+
543
+ .rl-table-scroll[data-density='compact'] .rl-table {
544
+ --rl-table-cell-y: var(--rl-space-2);
545
+ --rl-table-cell-x: var(--rl-space-3);
546
+ }
547
+
548
+ .rl-table__caption {
549
+ padding: var(--rl-space-3) var(--rl-table-cell-x);
550
+ border-bottom: var(--rl-border-width) solid var(--rl-border-subtle);
551
+ font: var(--rl-type-label);
552
+ text-align: left;
553
+ caption-side: top;
554
+ }
555
+
556
+ .rl-table th,
557
+ .rl-table td {
558
+ padding: var(--rl-table-cell-y) var(--rl-table-cell-x);
559
+ border-bottom: var(--rl-border-width) solid var(--rl-border-subtle);
560
+ text-align: left;
561
+ vertical-align: middle;
562
+ /* Columns keep their natural width; a narrow container scrolls rather than stacking CJK text
563
+ one character per line. Long free-text cells may still wrap once they exceed the max width. */
564
+ white-space: nowrap;
565
+ }
566
+
567
+ .rl-table td:not([data-mono]) {
568
+ white-space: normal;
569
+ min-width: calc(var(--rl-field-label-width) * 0.6);
570
+ max-width: calc(var(--rl-field-label-width) * 2.5);
571
+ }
572
+
573
+ .rl-table thead th {
574
+ border-bottom-color: var(--rl-border-strong);
575
+ font: var(--rl-type-mono);
576
+ letter-spacing: var(--rl-tracking-mono);
577
+ text-transform: uppercase;
578
+ color: var(--rl-fg-muted);
579
+ white-space: nowrap;
580
+ }
581
+
582
+ .rl-table tbody th {
583
+ font-weight: 600;
584
+ }
585
+
586
+ .rl-table tbody tr:last-child > * {
587
+ border-bottom: 0;
588
+ }
589
+
590
+ .rl-table [data-align='end'] { text-align: right; }
591
+ .rl-table [data-align='center'] { text-align: center; }
592
+
593
+ .rl-table [data-mono] {
594
+ font-family: var(--rl-font-mono);
595
+ letter-spacing: var(--rl-tracking-mono);
596
+ font-variant-numeric: tabular-nums;
597
+ white-space: nowrap;
598
+ }
599
+
600
+ @media (hover: hover) {
601
+ .rl-table tbody tr:hover > * {
602
+ background: var(--rl-bg-hover);
603
+ }
604
+ }
605
+
606
+ .rl-table tbody tr[data-selected] > * {
607
+ background: var(--rl-accent-subtle);
608
+ }
609
+
610
+ .rl-table tbody tr[data-selected] > :first-child {
611
+ box-shadow: inset var(--rl-border-width-strong) 0 0 var(--rl-accent);
612
+ }
613
+
614
+ .rl-table__select,
615
+ .rl-table__col-select {
616
+ width: var(--rl-space-12);
617
+ }
618
+
619
+ .rl-table__checkbox {
620
+ width: var(--rl-icon-size-md);
621
+ height: var(--rl-icon-size-md);
622
+ margin: 0;
623
+ accent-color: var(--rl-bg-inverse);
624
+ cursor: pointer;
625
+ }
626
+
627
+ .rl-table__checkbox:focus-visible {
628
+ outline: var(--rl-focus-ring);
629
+ outline-offset: var(--rl-focus-offset);
630
+ }
631
+
632
+ .rl-table__sort {
633
+ display: inline-flex;
634
+ align-items: center;
635
+ gap: var(--rl-space-1);
636
+ margin: calc(var(--rl-space-1) * -1) calc(var(--rl-space-2) * -1);
637
+ padding: var(--rl-space-1) var(--rl-space-2);
638
+ appearance: none;
639
+ border: 0;
640
+ border-radius: var(--rl-radius-xs);
641
+ background: transparent;
642
+ color: inherit;
643
+ font: inherit;
644
+ letter-spacing: inherit;
645
+ text-transform: inherit;
646
+ cursor: pointer;
647
+ }
648
+
649
+ .rl-table [data-align='end'] > .rl-table__sort {
650
+ flex-direction: row-reverse;
651
+ }
652
+
653
+ @media (hover: hover) {
654
+ .rl-table__sort:hover {
655
+ color: var(--rl-fg-primary);
656
+ background: var(--rl-bg-hover);
657
+ }
658
+ }
659
+
660
+ .rl-table__sort[data-active] {
661
+ color: var(--rl-fg-primary);
662
+ }
663
+
664
+ .rl-table__sort:focus-visible {
665
+ outline: var(--rl-focus-ring);
666
+ outline-offset: var(--rl-focus-offset);
667
+ }
668
+
669
+ .rl-table__sort-icon {
670
+ width: var(--rl-icon-size-sm);
671
+ height: var(--rl-icon-size-sm);
672
+ fill: none;
673
+ stroke: currentColor;
674
+ stroke-width: var(--rl-border-width-strong);
675
+ stroke-linecap: round;
676
+ stroke-linejoin: round;
677
+ }
678
+
679
+ .rl-table__sort-icon path {
680
+ opacity: 0.35;
681
+ }
682
+
683
+ .rl-table__sort-icon[data-direction='ascending'] .rl-table__sort-up,
684
+ .rl-table__sort-icon[data-direction='descending'] .rl-table__sort-down {
685
+ opacity: 1;
686
+ }
687
+
688
+ /* td-qualified: `.rl-table td` (0,1,1) would otherwise win and left-align the message. */
689
+ .rl-table td.rl-table__empty {
690
+ padding: var(--rl-space-8) var(--rl-table-cell-x);
691
+ text-align: center;
692
+ color: var(--rl-fg-muted);
693
+ }
694
+
695
+ @media (forced-colors: active) {
696
+ .rl-table-scroll { border-color: CanvasText; }
697
+ .rl-table tbody tr[data-selected] > * { background: Highlight; color: HighlightText; }
698
+ .rl-record__identity { border-left-color: CanvasText; }
699
+ .rl-meta__item { border-bottom-color: CanvasText; }
700
+ .rl-archive-card { border-color: CanvasText; }
701
+ .rl-archive-card[data-selected] { border-color: Highlight; box-shadow: none; }
702
+ .rl-status__marker,
703
+ .rl-timeline__marker { background: CanvasText; border-color: CanvasText; }
704
+ }