@ecopages/radiant-themes 0.2.1 → 0.2.3

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 (39) hide show
  1. package/README.md +27 -15
  2. package/dist/compiled/themes/cloudflare/compact.css +40 -12
  3. package/dist/compiled/themes/cloudflare.css +40 -12
  4. package/dist/compiled/themes/github/compact.css +264 -67
  5. package/dist/compiled/themes/github.css +264 -67
  6. package/dist/compiled/themes/high-contrast/compact.css +88 -5
  7. package/dist/compiled/themes/high-contrast.css +88 -5
  8. package/dist/compiled/themes/macos/compact.css +679 -294
  9. package/dist/compiled/themes/macos-classic/compact.css +197 -25
  10. package/dist/compiled/themes/macos-classic.css +197 -25
  11. package/dist/compiled/themes/macos.css +679 -294
  12. package/dist/compiled/themes/material/compact.css +447 -132
  13. package/dist/compiled/themes/material.css +447 -132
  14. package/dist/compiled/themes/vercel/compact.css +104 -62
  15. package/dist/compiled/themes/vercel.css +104 -62
  16. package/dist/compiled/themes/vscode/compact.css +255 -40
  17. package/dist/compiled/themes/vscode.css +255 -40
  18. package/dist/compiled/themes/windows95/compact.css +260 -22
  19. package/dist/compiled/themes/windows95.css +260 -22
  20. package/dist/tokens/colors/github.css +32 -0
  21. package/dist/tokens/colors/macos.css +65 -25
  22. package/dist/tokens/colors/material.css +61 -20
  23. package/dist/tokens/colors/vercel.css +43 -39
  24. package/dist/tokens/colors/vscode.css +48 -4
  25. package/dist/tokens/colors/windows95.css +10 -5
  26. package/dist/tokens/components/cloudflare.css +55 -5
  27. package/dist/tokens/components/github.css +258 -40
  28. package/dist/tokens/components/high-contrast.css +93 -5
  29. package/dist/tokens/components/macos-classic.css +262 -24
  30. package/dist/tokens/components/macos.css +542 -106
  31. package/dist/tokens/components/material.css +354 -25
  32. package/dist/tokens/components/vercel.css +77 -15
  33. package/dist/tokens/components/vscode.css +248 -27
  34. package/dist/tokens/components/windows95.css +304 -19
  35. package/dist/tokens/roles/github.css +12 -12
  36. package/dist/tokens/roles/macos.css +97 -93
  37. package/dist/tokens/roles/material.css +65 -65
  38. package/dist/tokens/roles/vercel.css +3 -3
  39. package/package.json +3 -3
@@ -1,80 +1,133 @@
1
1
  @reference 'tailwindcss';
2
2
 
3
+ /**
4
+ * macOS Sonoma and Sequoia AppKit controls: SF Pro at the 13px system size, 6px push buttons drawn with a hairline
5
+ * shadow instead of a border, accent-filled default buttons, check boxes, and radio buttons, pop-up buttons with an
6
+ * accent arrow well, segmented tab controls, white slider knobs, and translucent menus and popovers.
7
+ *
8
+ * @remarks Control heights map regular, large, and extra large AppKit sizes (22, 28, 36px) to `sm`, `md`, and `lg`.
9
+ * Text fields keep a 3:1 border instead of AppKit's lighter bezel so their boundary stays visible.
10
+ */
3
11
  :root,
4
12
  :root[data-rui-theme='macos'] {
5
- --font-sans: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', Arial, sans-serif;
6
- --font-heading: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', Arial, sans-serif;
7
- --font-mono: 'SFMono-Regular', Menlo, Monaco, monospace;
8
- --border-radius-xs: 0.375rem;
9
- --border-radius-sm: 0.5rem;
10
- --border-radius-md: 0.5rem;
13
+ --font-sans: system-ui, -apple-system, BlinkMacSystemFont, 'SF Pro Text', 'Helvetica Neue', Arial, sans-serif;
14
+ --font-heading: system-ui, -apple-system, BlinkMacSystemFont, 'SF Pro Display', 'Helvetica Neue', Arial, sans-serif;
15
+ --font-mono: ui-monospace, 'SF Mono', SFMono-Regular, Menlo, Monaco, monospace;
16
+ --text-control: 0.8125rem;
17
+ --border-radius-xs: 0.25rem;
18
+ --border-radius-sm: 0.3125rem;
19
+ --border-radius-md: 0.375rem;
11
20
  --border-radius-lg: 0.625rem;
12
21
  --border-radius-xl: 0.75rem;
13
22
  --border-radius-2xl: 1rem;
14
23
  --border-radius-3xl: 1.25rem;
15
24
  --radius-control: var(--border-radius-md);
16
25
  --radius-container: var(--border-radius-lg);
26
+ --size-control-sm: 1.375rem;
27
+ --size-control-md: 1.75rem;
28
+ --size-control-lg: 2.25rem;
17
29
  --rui-border-alpha: 100%;
18
30
  --focus-ring-width: 3px;
19
- --focus-ring-offset: 3px;
31
+ --focus-ring-offset: 1px;
32
+ --macos-hover-fill: color-mix(in srgb, var(--macos-text) 7%, transparent);
33
+ --macos-press-fill: color-mix(in srgb, var(--macos-text) 14%, transparent);
34
+ --macos-default-button-sheen: linear-gradient(to bottom, rgb(255 255 255 / 0.14), rgb(255 255 255 / 0));
20
35
  }
21
36
 
22
37
  @layer components {
38
+ :root .rui-button {
39
+ @apply rounded-control border border-transparent font-normal;
40
+ background-image: none;
41
+ box-shadow: none;
42
+ transition-duration: var(--duration-fast);
43
+ }
44
+
23
45
  /**
24
- * @remarks macOS fills dark destructive buttons with a saturated red and white text; `--error` stays the lighter
25
- * red used for error text on dark surfaces.
46
+ * @remarks Secondary push buttons have no border: a hairline shadow outlines the white (light) or grey (dark) face,
47
+ * and they only darken while pressed.
26
48
  */
27
- :root.dark .rui-button--destructive {
28
- background-color: #d93036;
29
- color: #ffffff;
49
+ :root .rui-button--outline,
50
+ :root .rui-button--destructive {
51
+ border-color: transparent;
52
+ background-color: var(--macos-control);
53
+ color: var(--macos-text);
54
+ box-shadow: var(--macos-control-shadow);
30
55
  }
31
56
 
32
- :root.dark .rui-button--destructive:hover:not(:disabled) {
33
- background-color: #c9302c;
57
+ :root .rui-button--outline:hover:not(:disabled),
58
+ :root .rui-button--destructive:hover:not(:disabled) {
59
+ background-color: var(--macos-control);
34
60
  }
35
61
 
36
- :root.dark .rui-button--destructive:active:not(:disabled) {
37
- background-color: #b62324;
62
+ :root .rui-button--outline:active:not(:disabled),
63
+ :root .rui-button--outline[aria-pressed='true'],
64
+ :root .rui-button--destructive:active:not(:disabled) {
65
+ background-color: var(--macos-control-pressed);
66
+ box-shadow: var(--macos-control-shadow);
38
67
  }
39
68
 
40
69
  /**
41
- * @remarks macOS dark push buttons use the accent blue with white text. `#0a6cd6` keeps the system blue's hue at
42
- * 5:1 contrast, and `--primary` stays the lighter accent for primary text.
70
+ * @remarks AppKit marks a destructive alert action with red text on an ordinary push button, not a red fill.
43
71
  */
44
- :root.dark .rui-button--filled {
45
- background-color: #0a6cd6;
46
- color: #ffffff;
72
+ :root .rui-button--destructive {
73
+ color: var(--macos-red);
47
74
  }
48
75
 
49
- :root.dark .rui-button--filled:hover:not(:disabled) {
50
- background-color: #0a64c8;
76
+ :root.dark .rui-button--destructive {
77
+ color: #ffcdc9;
51
78
  }
52
79
 
53
- :root.dark .rui-button--filled:active:not(:disabled),
54
- :root.dark .rui-button--filled[aria-pressed='true'] {
55
- background-color: #0a5bb5;
80
+ /**
81
+ * @remarks The default button fills with `selectedContentBackgroundColor` rather than the brighter accent so its
82
+ * white label keeps 4.5:1.
83
+ */
84
+ :root .rui-button--filled {
85
+ border-color: transparent;
86
+ background-color: var(--macos-selection);
87
+ background-image: var(--macos-default-button-sheen);
88
+ color: var(--macos-selection-text);
89
+ box-shadow:
90
+ 0 0 0 0.5px rgb(0 0 0 / 0.12),
91
+ 0 0.5px 1px rgb(0 0 0 / 0.25);
56
92
  }
57
93
 
58
- :root .rui-button {
59
- @apply rounded-control border border-transparent font-medium shadow-none;
60
- transition-duration: var(--duration-fast);
94
+ :root .rui-button--filled:hover:not(:disabled) {
95
+ background-color: var(--macos-selection);
61
96
  }
62
97
 
63
- :root .rui-button--filled,
64
- :root .rui-button--destructive {
65
- @apply shadow-sm;
98
+ :root .rui-button--filled:active:not(:disabled),
99
+ :root .rui-button--filled[aria-pressed='true'] {
100
+ background-color: color-mix(in srgb, var(--macos-selection), black 18%);
101
+ box-shadow:
102
+ 0 0 0 0.5px rgb(0 0 0 / 0.12),
103
+ 0 0.5px 1px rgb(0 0 0 / 0.25);
66
104
  }
67
105
 
68
- :root .rui-button--outline {
69
- @apply border-border bg-surface text-on-surface;
70
- border-color: var(--rui-control-border-color);
106
+ :root .rui-button--ghost {
107
+ color: var(--macos-text);
71
108
  }
72
109
 
73
- :root .rui-button--outline:hover:not(:disabled),
74
110
  :root .rui-button--ghost:hover:not(:disabled) {
75
- @apply bg-surface-container-low;
111
+ background-color: var(--macos-hover-fill);
112
+ }
113
+
114
+ :root .rui-button--ghost:active:not(:disabled),
115
+ :root .rui-button--ghost[aria-pressed='true'] {
116
+ background-color: var(--macos-press-fill);
117
+ box-shadow: none;
76
118
  }
77
119
 
120
+ :root .rui-button--link {
121
+ color: var(--link);
122
+ }
123
+
124
+ :root .rui-button:focus-visible {
125
+ @apply ring-[3px] ring-focus-ring/60;
126
+ }
127
+
128
+ /**
129
+ * @remarks AppKit text fields are near-square white wells; the accent focus ring hugs the bezel.
130
+ */
78
131
  :root .rui-input,
79
132
  :root .rui-textarea,
80
133
  :root .rui-autocomplete__input,
@@ -83,130 +136,422 @@
83
136
  :root .rui-date-range-picker__group,
84
137
  :root .rui-input-group,
85
138
  :root .rui-number-field__group,
86
- :root rui-date-input:where(:not([data-date-field-input], [data-range-start], [data-range-end])),
87
- :root .rui-select__control {
88
- @apply rounded-control border-border bg-surface text-on-surface shadow-none;
139
+ :root rui-date-input:where(:not([data-date-field-input], [data-range-start], [data-range-end])) {
140
+ @apply rounded-sm bg-surface text-on-surface shadow-none;
89
141
  border-color: var(--rui-control-border-color);
90
142
  }
91
143
 
144
+ :root .rui-input:focus-visible,
145
+ :root .rui-textarea:focus-visible,
146
+ :root .rui-autocomplete__input:focus-visible,
147
+ :root .rui-combobox__control:focus-within,
148
+ :root .rui-date-field__group:focus-within,
149
+ :root .rui-date-range-picker__group:focus-within,
150
+ :root .rui-input-group:focus-within,
151
+ :root .rui-number-field__group:focus-within {
152
+ @apply outline-none ring-[3px] ring-focus-ring/60;
153
+ }
154
+
155
+ /**
156
+ * Pop-up buttons are push buttons whose arrow sits in an accent-filled rounded well.
157
+ */
158
+ :root .rui-select__control {
159
+ @apply rounded-control;
160
+ border-color: transparent;
161
+ background-color: var(--macos-control);
162
+ color: var(--macos-text);
163
+ box-shadow: var(--macos-control-shadow);
164
+ }
165
+
166
+ :root .rui-select__control:focus-within {
167
+ @apply ring-[3px] ring-focus-ring/60;
168
+ }
169
+
170
+ :root .rui-select__trigger {
171
+ color: var(--macos-text);
172
+ }
173
+
174
+ :root .rui-select__control .rui-control-toggle,
175
+ :root .rui-combobox__control .rui-control-toggle {
176
+ width: 1.0625rem;
177
+ height: 1.0625rem;
178
+ margin-inline-end: 0.125rem;
179
+ border-radius: var(--border-radius-xs);
180
+ background-color: var(--macos-accent);
181
+ background-image: var(--macos-default-button-sheen);
182
+ color: #ffffff;
183
+ }
184
+
185
+ :root .rui-select__control .rui-control-toggle:hover:not(:disabled),
186
+ :root .rui-combobox__control .rui-control-toggle:hover:not(:disabled) {
187
+ background-color: var(--macos-accent);
188
+ }
189
+
190
+ :root .rui-select__control .rui-control-toggle > svg,
191
+ :root .rui-combobox__control .rui-control-toggle > svg {
192
+ width: 0.75rem;
193
+ height: 0.75rem;
194
+ stroke-width: 2.5;
195
+ }
196
+
197
+ /**
198
+ * Check boxes and radio buttons fill with the accent and draw a white mark; unchecked ones are white with a hairline.
199
+ */
92
200
  :root .rui-checkbox__control,
93
201
  :root .rui-radio__control {
94
- @apply border-border bg-surface;
202
+ width: 0.875rem;
203
+ height: 0.875rem;
95
204
  border-color: var(--rui-control-border-color);
205
+ background-color: var(--macos-surface);
206
+ box-shadow: 0 0.5px 1px rgb(0 0 0 / 0.12);
207
+ }
208
+
209
+ :root.dark .rui-checkbox__control,
210
+ :root.dark .rui-radio__control {
211
+ background-color: var(--macos-control);
212
+ }
213
+
214
+ :root .rui-checkbox__control {
215
+ @apply rounded-xs;
216
+ }
217
+
218
+ :root .rui-checkbox__input:checked:not(:indeterminate):not([aria-checked='mixed']) + .rui-checkbox__control,
219
+ :root .rui-checkbox__input:indeterminate + .rui-checkbox__control,
220
+ :root .rui-checkbox__input[aria-checked='mixed'] + .rui-checkbox__control,
221
+ :root .rui-radio__input:checked + .rui-radio__control {
222
+ border-color: var(--primary);
223
+ background-color: var(--macos-accent);
224
+ background-image: var(--macos-default-button-sheen);
225
+ }
226
+
227
+ :root .rui-checkbox__input:checked:not(:indeterminate):not([aria-checked='mixed']) + .rui-checkbox__control::after {
228
+ width: 0.5625rem;
229
+ height: 0.5625rem;
230
+ color: #ffffff;
231
+ }
232
+
233
+ :root .rui-checkbox__input:indeterminate + .rui-checkbox__control::after,
234
+ :root .rui-checkbox__input[aria-checked='mixed'] + .rui-checkbox__control::after {
235
+ width: 0.5rem;
236
+ background-color: #ffffff;
237
+ }
238
+
239
+ :root .rui-radio__input:checked + .rui-radio__control::after {
240
+ width: 0.375rem;
241
+ height: 0.375rem;
242
+ background-color: #ffffff;
243
+ }
244
+
245
+ :root .rui-checkbox__input:focus-visible + .rui-checkbox__control,
246
+ :root .rui-radio__input:focus-visible + .rui-radio__control,
247
+ :root .rui-switch__input:focus-visible + .rui-switch__track {
248
+ @apply ring-[3px] ring-focus-ring/60 ring-offset-0;
96
249
  }
97
250
 
98
251
  :root .rui-switch {
99
- --rui-switch-track: color-mix(in oklab, var(--on-background) 14%, transparent);
100
- --rui-switch-track-hover: color-mix(in oklab, var(--on-background) 20%, transparent);
252
+ --rui-switch-width: 2.375rem;
253
+ --rui-switch-height: 1.375rem;
254
+ --rui-switch-thumb-size: 1.25rem;
255
+ --rui-switch-track: color-mix(in srgb, var(--macos-text) 12%, transparent);
256
+ --rui-switch-track-hover: color-mix(in srgb, var(--macos-text) 12%, transparent);
257
+ --rui-switch-track-on: var(--macos-accent);
258
+ --rui-switch-track-on-hover: var(--macos-accent);
101
259
  --rui-switch-thumb: #ffffff;
102
260
  --rui-switch-thumb-on: #ffffff;
103
261
  }
104
262
 
105
263
  :root .rui-switch__track {
106
264
  @apply rounded-pill;
265
+ box-shadow: inset 0 0 0 0.5px rgb(0 0 0 / 0.12);
107
266
  }
108
267
 
109
268
  :root .rui-switch__thumb {
269
+ left: 1px;
110
270
  box-shadow:
111
- 0 0 0 0.5px rgb(0 0 0 / 0.12),
112
- 0 1px 2px rgb(0 0 0 / 0.24);
271
+ 0 0 0 0.5px rgb(0 0 0 / 0.1),
272
+ 0 1px 2px rgb(0 0 0 / 0.25);
113
273
  }
114
274
 
115
- :root .rui-checkbox__control {
116
- @apply rounded-xs;
275
+ :root .rui-switch__input:checked + .rui-switch__track .rui-switch__thumb {
276
+ right: 1px;
117
277
  }
118
278
 
119
- :root .rui-listbox__option[aria-selected='true'],
279
+ /**
280
+ * Selection uses `selectedContentBackgroundColor` with white text: list and menu rows, calendar days, and the
281
+ * source-list sidebar.
282
+ */
283
+ :root .rui-listbox__option[aria-selected='true']:not([aria-disabled='true']),
284
+ :root .rui-listbox__option[aria-selected='true']:focus-visible,
120
285
  :root .rui-menu-button__item[aria-checked='true'],
121
286
  :root .rui-menubar__menu-item[aria-checked='true'],
122
287
  :root .rui-tree__node[aria-selected='true'],
123
- :root .rui-calendar__day[aria-selected='true'],
124
- :root .rui-sidebar__menu-button--active,
288
+ :root .rui-calendar__day[aria-selected='true']:not([data-range-middle='true']),
289
+ :root .rui-calendar__day[aria-selected='true']:not([data-range-middle='true']):hover:not(:disabled),
125
290
  :root .rui-navigation-menu__link-list a[aria-current='page'] {
126
- @apply rounded-control bg-primary-container text-on-primary-container;
291
+ @apply rounded-sm;
292
+ background-color: var(--macos-selection);
293
+ background-image: none;
294
+ color: var(--macos-selection-text);
295
+ }
296
+
297
+ :root .rui-listbox__option[aria-selected='true'] .rui-listbox__option-indicator {
298
+ color: var(--macos-selection-text);
299
+ }
300
+
301
+ :root .rui-listbox__option {
302
+ @apply rounded-sm;
303
+ padding-block: 0.1875rem;
304
+ }
305
+
306
+ :root .rui-calendar__day {
307
+ @apply h-7 rounded-full;
308
+ }
309
+
310
+ :root .rui-calendar__day[aria-selected='true']:not([data-range-middle='true']) {
311
+ @apply rounded-full;
312
+ }
313
+
314
+ :root .rui-calendar__day[aria-current='date']:not([aria-selected='true']) {
315
+ @apply no-underline;
316
+ color: var(--macos-red);
317
+ }
318
+
319
+ /**
320
+ * @remarks Menu rows highlight with the accent and white text while the pointer or keyboard is on them, inset 5px
321
+ * from the menu edge with 4px corners.
322
+ */
323
+ :root .rui-menu-button__menu,
324
+ :root .rui-menubar__menu {
325
+ @apply p-[5px];
326
+ --rui-menu-item-hover: var(--macos-selection);
327
+ }
328
+
329
+ :root .rui-menu-button__item,
330
+ :root .rui-menubar__menu-item {
331
+ @apply rounded-xs;
332
+ padding-block: 0.1875rem;
333
+ padding-inline: 0.625rem;
334
+ font-size: var(--text-control);
335
+ }
336
+
337
+ :root .rui-menu-button__item:focus-visible:not([aria-disabled='true']),
338
+ :root .rui-menu-button__item[aria-expanded='true'],
339
+ :root .rui-menubar__menu-item:focus-visible:not([aria-disabled='true']),
340
+ :root .rui-menubar__menu-item[aria-expanded='true'] {
341
+ color: var(--macos-selection-text);
342
+ --tw-ring-shadow: 0 0 #0000;
343
+ }
344
+
345
+ @media (hover: hover) and (pointer: fine) {
346
+ :root .rui-menu-button__item:hover:not([aria-disabled='true']),
347
+ :root .rui-menubar__menu-item:hover:not([aria-disabled='true']) {
348
+ background-color: var(--macos-selection);
349
+ color: var(--macos-selection-text);
350
+ }
351
+
352
+ :root .rui-menu-button__item:hover:not([aria-disabled='true'])::after,
353
+ :root .rui-menubar__menu-item:hover:not([aria-disabled='true'])::after {
354
+ color: inherit;
355
+ }
356
+ }
357
+
358
+ :root .rui-sidebar__menu-button:hover {
359
+ background-color: var(--macos-hover-fill);
360
+ }
361
+
362
+ /**
363
+ * @remarks Source lists mark the current row with the unemphasized grey selection, as Finder and System Settings do
364
+ * while the sidebar is not the key view.
365
+ */
366
+ :root .rui-sidebar__menu-button[aria-current='page'],
367
+ :root .rui-sidebar__menu-button--active {
368
+ background-color: var(--macos-unemphasized-selection);
369
+ color: var(--macos-text);
127
370
  }
128
371
 
129
- :root .rui-dialog__surface,
130
- :root .rui-popover-host,
131
- :root .rui-hover-card__content,
372
+ /**
373
+ * Menus, pop-up lists, popovers, and hover cards are translucent, blurred materials with a hairline edge.
374
+ */
375
+ :root .rui-popover,
132
376
  :root .rui-menu-button__menu,
133
377
  :root .rui-menubar__menu,
134
378
  :root .rui-select__listbox,
135
379
  :root .rui-combobox__listbox,
136
- :root .rui-calendar,
137
- :root rui-tabs[variant='boxed'] {
138
- @apply rounded-container border border-border bg-surface shadow-lg;
380
+ :root .rui-hover-card__content {
381
+ --rui-popover-surface: var(--macos-elevated);
382
+ --rui-popover-border-color: transparent;
383
+ --rui-popover-shadow: var(--macos-menu-shadow);
384
+ --rui-popover-radius: var(--border-radius-lg);
385
+ @apply border-transparent text-on-surface;
386
+ background-color: var(--macos-elevated);
387
+ box-shadow: var(--macos-menu-shadow);
388
+ backdrop-filter: blur(24px) saturate(1.6);
389
+ }
390
+
391
+ :root .rui-menu-button__menu,
392
+ :root .rui-menubar__menu,
393
+ :root .rui-select__listbox,
394
+ :root .rui-combobox__listbox {
395
+ --rui-popover-radius: var(--border-radius-md);
396
+ border-radius: var(--border-radius-md);
397
+ }
398
+
399
+ :root .rui-hover-card__content {
400
+ border-radius: var(--border-radius-lg);
401
+ }
402
+
403
+ :root .rui-select__listbox .rui-listbox,
404
+ :root .rui-combobox__listbox .rui-listbox,
405
+ :root .rui-popover--listbox .rui-listbox {
406
+ @apply bg-transparent p-[5px];
407
+ }
408
+
409
+ :root .rui-tooltip {
410
+ --rui-tooltip-surface: var(--macos-elevated-solid);
411
+ --rui-tooltip-color: var(--macos-text);
412
+ --rui-tooltip-radius: var(--border-radius-xs);
413
+ --rui-tooltip-shadow: 0 0 0 0.5px var(--macos-elevated-edge), 0 2px 8px rgb(0 0 0 / 0.18);
414
+ --rui-tooltip-padding-x: 0.375rem;
415
+ --rui-tooltip-padding-y: 0.125rem;
416
+ }
417
+
418
+ /**
419
+ * @remarks Alerts are window-background panels with 10px corners and a deep shadow; the title is bold text, not a
420
+ * title-bar band.
421
+ */
422
+ :root .rui-dialog {
423
+ --rui-dialog-surface: var(--macos-canvas);
424
+ --rui-dialog-radius: var(--border-radius-lg);
425
+ --rui-dialog-shadow: 0 0 0 0.5px var(--macos-elevated-edge), 0 20px 50px rgb(0 0 0 / 0.35);
426
+ }
427
+
428
+ :root .rui-dialog__surface {
429
+ @apply text-on-surface;
430
+ background-color: var(--macos-canvas);
431
+ box-shadow:
432
+ 0 0 0 0.5px var(--macos-elevated-edge),
433
+ inset 0 0 0 0.5px var(--macos-elevated-highlight),
434
+ 0 20px 50px rgb(0 0 0 / 0.35);
435
+ }
436
+
437
+ :root .rui-dialog__title {
438
+ @apply font-bold text-on-surface;
439
+ }
440
+
441
+ :root .rui-calendar {
442
+ @apply rounded-container border-0 text-on-surface;
443
+ background-color: var(--macos-surface);
444
+ box-shadow: var(--macos-control-shadow);
445
+ }
446
+
447
+ :root .rui-calendar__header {
448
+ @apply font-semibold text-on-surface;
449
+ }
450
+
451
+ :root .rui-sidebar__header {
452
+ @apply font-semibold text-on-surface;
139
453
  }
140
454
 
141
- :root .rui-dialog__title,
142
- :root .rui-calendar__header,
143
- :root .rui-sidebar__header,
144
- :root .rui-table__header {
145
- @apply bg-surface-container-low text-on-surface font-semibold;
455
+ /**
456
+ * Tabs are a 24px segmented control: a recessed track with the selected segment raised as a push-button face. Boxed
457
+ * tabs center that control on the group box's top edge, as `NSTabView` does, and pad the panel by the overlap.
458
+ *
459
+ * @remarks Selectors carry `rui-tabs[variant]` to outrank the catalog's per-variant padding, font size, and list
460
+ * border; the element always reflects its variant.
461
+ */
462
+ :root rui-tabs[variant] .rui-tabs__list {
463
+ @apply w-fit max-w-full gap-0 border-0 p-0.5;
464
+ border-radius: calc(var(--radius-control) + 1px);
465
+ background-color: color-mix(in srgb, var(--macos-text) 7%, transparent);
466
+ }
467
+
468
+ :root rui-tabs[variant] .rui-tabs__tab {
469
+ @apply rounded-control border-0 font-normal;
470
+ color: var(--macos-text);
471
+ padding-block: 0.125rem;
472
+ padding-inline: 0.75rem;
473
+ font-size: var(--text-control);
474
+ line-height: 1rem;
475
+ }
476
+
477
+ :root rui-tabs[variant] .rui-tabs__tab[aria-selected='true'] {
478
+ @apply font-normal;
479
+ background-color: var(--macos-control);
480
+ color: var(--macos-text);
481
+ box-shadow: var(--macos-control-shadow);
482
+ }
483
+
484
+ :root rui-tabs[variant] .rui-tabs__tab:focus-visible {
485
+ @apply ring-[3px] ring-focus-ring/60 ring-offset-0;
146
486
  }
147
487
 
148
488
  :root rui-tabs[variant='boxed'] {
149
- @apply rounded-container border border-border bg-surface shadow-sm;
489
+ @apply overflow-visible rounded-none border-0 bg-transparent shadow-none;
150
490
  }
151
491
 
152
492
  :root rui-tabs[variant='boxed'] .rui-tabs__list {
153
- @apply gap-1 border-0 bg-surface-container-low px-1 py-1;
154
- border-radius: var(--radius-control);
493
+ @apply relative z-10 mx-auto;
494
+ margin-bottom: -0.75rem;
495
+ box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--macos-text) 12%, transparent);
496
+ }
497
+
498
+ :root.dark rui-tabs[variant='boxed'] .rui-tabs__list {
499
+ background-color: #2a2a2a;
155
500
  }
156
501
 
157
- :root rui-tabs[variant='boxed'] .rui-tabs__tab {
158
- @apply rounded-control border-0 bg-transparent text-on-surface-container-low;
159
- padding-inline: var(--rui-tabs-tab-padding-x);
160
- padding-block: var(--rui-tabs-tab-padding-y);
502
+ :root:not(.dark) rui-tabs[variant='boxed'] .rui-tabs__list {
503
+ background-color: #e3e3e3;
161
504
  }
162
505
 
163
- :root rui-tabs[variant='boxed'] .rui-tabs__tab[aria-selected='true'] {
164
- @apply rounded-control bg-surface text-on-surface font-semibold shadow-sm;
506
+ :root rui-tabs[variant='boxed'] .rui-tabs__tab,
507
+ :root rui-tabs[variant='boxed'] .rui-tabs__tab:not([aria-selected='true']) {
508
+ @apply opacity-100;
509
+ color: var(--macos-text);
165
510
  border-bottom-color: transparent;
166
511
  }
167
512
 
168
513
  :root rui-tabs[variant='boxed'] .rui-tabs__panel {
169
- @apply rounded-none bg-surface;
514
+ @apply rounded-md text-on-surface;
515
+ border: 1px solid color-mix(in srgb, var(--macos-text) 12%, transparent);
516
+ background-color: color-mix(in srgb, var(--macos-text) 4%, transparent);
170
517
  padding: var(--rui-tabs-panel-padding);
171
- }
172
-
173
- :root .rui-tabs__tab[aria-selected='true'] {
174
- @apply rounded-pill bg-surface-container text-on-surface font-semibold;
175
- border-bottom-color: transparent;
518
+ padding-top: calc(var(--rui-tabs-panel-padding) + 0.75rem);
176
519
  }
177
520
 
178
521
  :root .rui-alert,
179
- :root .rui-toast__content {
180
- @apply rounded-container border border-border bg-surface text-on-surface shadow-md;
522
+ :root .rui-toast {
523
+ @apply rounded-container border-transparent text-on-surface;
524
+ background-color: var(--macos-elevated);
525
+ background-image: none;
526
+ box-shadow: var(--macos-menu-shadow);
527
+ backdrop-filter: blur(24px) saturate(1.6);
181
528
  }
182
529
 
183
530
  /**
184
- * @remarks Finder-style lists keep the hierarchy quiet: rounded surfaces, subtle row dividers, and a full-width
185
- * accent selection make the tree feel like a native macOS source list rather than a spreadsheet.
531
+ * @remarks Notification banners use the 16px corner of macOS notifications; status shows in the icon, not the text.
186
532
  */
187
- :root .rui-treegrid {
188
- @apply rounded-container border border-border bg-surface shadow-md;
189
- --rui-treegrid-indent: 0.875rem;
533
+ :root .rui-toast {
534
+ @apply rounded-2xl;
190
535
  }
191
536
 
192
- :root .rui-treegrid__cell {
193
- @apply border-0 bg-transparent px-control-x py-2 text-on-surface;
537
+ :root .rui-toast--info .rui-toast__icon {
538
+ color: var(--macos-accent);
194
539
  }
195
540
 
196
- :root .rui-treegrid__row--header .rui-treegrid__cell {
197
- @apply border-b border-border bg-surface-container-low font-semibold;
541
+ :root .rui-toast--success .rui-toast__icon {
542
+ color: var(--success);
198
543
  }
199
544
 
200
- :root .rui-treegrid__row:not(.rui-treegrid__row--header):hover .rui-treegrid__cell:not([aria-selected='true']) {
201
- @apply bg-surface-container-low;
545
+ :root .rui-toast--warning .rui-toast__icon {
546
+ color: var(--warning);
202
547
  }
203
548
 
204
- :root .rui-treegrid__cell[aria-selected='true'] {
205
- @apply bg-primary-container text-on-primary-container;
549
+ :root .rui-toast--error .rui-toast__icon {
550
+ color: var(--error);
206
551
  }
207
552
 
208
553
  :root .rui-alert--info .rui-alert__icon {
209
- color: var(--info);
554
+ color: var(--macos-accent);
210
555
  }
211
556
 
212
557
  :root .rui-alert--success .rui-alert__icon {
@@ -221,15 +566,80 @@
221
566
  color: var(--error);
222
567
  }
223
568
 
224
- :root .rui-badge,
569
+ :root .rui-feed__article {
570
+ @apply rounded-container border-0 text-on-surface;
571
+ background-color: var(--macos-surface);
572
+ box-shadow: var(--macos-control-shadow);
573
+ }
574
+
575
+ :root .rui-badge {
576
+ @apply rounded-pill;
577
+ }
578
+
225
579
  :root .rui-chip,
226
580
  :root .rui-pagination__link {
227
- @apply rounded-pill;
581
+ @apply rounded-control;
582
+ }
583
+
584
+ /**
585
+ * @remarks Table views are white content areas with `alternatingContentBackgroundColors` stripes, a plain header
586
+ * divided by hairlines, and no grid lines between rows.
587
+ */
588
+ :root .rui-table,
589
+ :root .rui-grid {
590
+ background-color: var(--macos-surface);
591
+ }
592
+
593
+ :root .rui-grid {
594
+ @apply border-0;
595
+ box-shadow: var(--macos-control-shadow);
596
+ }
597
+
598
+ :root .rui-table__column,
599
+ :root .rui-table__cell,
600
+ :root .rui-grid__cell {
601
+ @apply border-b-transparent text-on-surface;
602
+ border-right-color: transparent;
603
+ background-color: var(--macos-surface);
228
604
  }
229
605
 
230
- :root .rui-table__row:nth-child(even),
231
- :root .rui-grid__row:nth-child(even) {
232
- @apply bg-surface-container-low;
606
+ :root .rui-table__column,
607
+ :root .rui-grid__row:first-child .rui-grid__cell {
608
+ @apply font-semibold;
609
+ border-bottom-color: var(--macos-grid);
610
+ border-right-color: var(--macos-grid);
611
+ }
612
+
613
+ :root .rui-table__row:nth-child(even) > .rui-table__cell,
614
+ :root .rui-grid__row:nth-child(odd):not(:first-child) > .rui-grid__cell {
615
+ background-color: var(--macos-alternate-row);
616
+ }
617
+
618
+ :root .rui-treegrid {
619
+ @apply rounded-container border-0 text-on-surface;
620
+ background-color: var(--macos-surface);
621
+ box-shadow: var(--macos-control-shadow);
622
+ --rui-treegrid-indent: 0.875rem;
623
+ }
624
+
625
+ :root .rui-treegrid__cell {
626
+ @apply border-0 bg-transparent px-2 py-1 text-on-surface;
627
+ font-size: var(--text-control);
628
+ }
629
+
630
+ :root .rui-treegrid__row--header .rui-treegrid__cell {
631
+ @apply font-semibold;
632
+ border-bottom: 1px solid var(--macos-grid);
633
+ background-color: var(--macos-surface);
634
+ }
635
+
636
+ :root .rui-treegrid__row:not(.rui-treegrid__row--header):hover .rui-treegrid__cell:not([aria-selected='true']) {
637
+ background-color: var(--macos-hover-fill);
638
+ }
639
+
640
+ :root .rui-treegrid__cell[aria-selected='true'] {
641
+ background-color: var(--macos-selection);
642
+ color: var(--macos-selection-text);
233
643
  }
234
644
 
235
645
  :root .rui-separator,
@@ -237,17 +647,43 @@
237
647
  @apply bg-border;
238
648
  }
239
649
 
240
- :root .rui-slider__thumb {
241
- @apply rounded-pill border border-surface bg-primary shadow-sm;
650
+ /**
651
+ * @remarks Sliders draw a thin grey track with an accent fill and a white knob with a soft shadow.
652
+ */
653
+ :root .rui-slider {
654
+ --rui-slider-track-size: 0.25rem;
655
+ --rui-slider-track-radius: 9999px;
656
+ --rui-slider-track-color: color-mix(in srgb, var(--macos-text) 15%, transparent);
657
+ --rui-slider-fill-color: var(--macos-accent);
658
+ --rui-slider-thumb-size: 1.25rem;
659
+ --rui-slider-thumb-radius: 9999px;
660
+ --rui-slider-thumb-border-width: 0px;
661
+ --rui-slider-thumb-border-color: transparent;
662
+ --rui-slider-thumb-background: #ffffff;
663
+ --rui-slider-thumb-shadow: 0 0 0 0.5px rgb(0 0 0 / 0.18), 0 1px 3px rgb(0 0 0 / 0.3);
664
+ --rui-slider-focus-ring-width: 3px;
665
+ --rui-slider-focus-ring: color-mix(in srgb, var(--focus-ring) 60%, transparent);
666
+ }
667
+
668
+ :root .rui-meter__track {
669
+ @apply rounded-pill;
670
+ background-color: color-mix(in srgb, var(--macos-text) 12%, transparent);
671
+ box-shadow: inset 0 0 0 0.5px rgb(0 0 0 / 0.08);
242
672
  }
243
673
 
244
- :root .rui-meter__track,
245
- :root .rui-slider__range-track {
246
- @apply rounded-pill bg-surface-container;
674
+ :root .rui-meter__fill {
675
+ @apply rounded-pill;
676
+ background-color: var(--macos-accent);
247
677
  }
678
+ }
248
679
 
249
- :root .rui-meter__fill,
250
- :root .rui-slider__range-fill {
251
- @apply rounded-pill bg-primary;
680
+ @media (prefers-contrast: more) {
681
+ @layer components {
682
+ :root .rui-button--outline,
683
+ :root .rui-button--destructive,
684
+ :root .rui-select__control,
685
+ :root .rui-tabs__tab[aria-selected='true'] {
686
+ border-color: var(--rui-control-border-color);
687
+ }
252
688
  }
253
689
  }