@rokkit/themes 1.3.1 → 1.3.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 (87) hide show
  1. package/dist/base/chat.css +264 -0
  2. package/dist/base/message.css +28 -0
  3. package/dist/base.css +293 -0
  4. package/dist/frosted/button.css +10 -4
  5. package/dist/frosted/message.css +4 -4
  6. package/dist/frosted/status-list.css +1 -1
  7. package/dist/frosted/table.css +3 -1
  8. package/dist/frosted/tabs.css +7 -2
  9. package/dist/frosted/toggle.css +7 -2
  10. package/dist/frosted.css +32 -14
  11. package/dist/index.css +431 -75
  12. package/dist/material/button.css +3 -1
  13. package/dist/material/message.css +4 -4
  14. package/dist/material/select.css +3 -1
  15. package/dist/material/status-list.css +1 -1
  16. package/dist/material/table.css +3 -1
  17. package/dist/material/tabs.css +5 -2
  18. package/dist/material/toggle.css +5 -2
  19. package/dist/material.css +24 -12
  20. package/dist/minimal/button.css +3 -1
  21. package/dist/minimal/message.css +4 -4
  22. package/dist/minimal/status-list.css +1 -1
  23. package/dist/minimal/table.css +3 -1
  24. package/dist/minimal/tabs.css +1 -1
  25. package/dist/minimal.css +12 -8
  26. package/dist/rokkit/button.css +3 -1
  27. package/dist/rokkit/message.css +4 -4
  28. package/dist/rokkit/status-list.css +1 -1
  29. package/dist/rokkit/table.css +3 -1
  30. package/dist/rokkit.css +11 -7
  31. package/dist/zen-sumi/button.css +26 -3
  32. package/dist/zen-sumi/chart.css +1 -1
  33. package/dist/zen-sumi/command-palette.css +4 -4
  34. package/dist/zen-sumi/floating-action.css +1 -1
  35. package/dist/zen-sumi/floating-navigation.css +3 -3
  36. package/dist/zen-sumi/input.css +2 -2
  37. package/dist/zen-sumi/message.css +4 -4
  38. package/dist/zen-sumi/range.css +2 -2
  39. package/dist/zen-sumi/search-filter.css +2 -2
  40. package/dist/zen-sumi/status-list.css +3 -3
  41. package/dist/zen-sumi/step-indicator.css +2 -2
  42. package/dist/zen-sumi/tabs.css +1 -1
  43. package/dist/zen-sumi/timeline.css +2 -2
  44. package/dist/zen-sumi/toc.css +5 -3
  45. package/dist/zen-sumi/toolbar.css +1 -1
  46. package/dist/zen-sumi.css +59 -34
  47. package/package.json +3 -3
  48. package/src/base/chat.css +264 -0
  49. package/src/base/index.css +1 -0
  50. package/src/base/message.css +28 -0
  51. package/src/frosted/button.css +10 -4
  52. package/src/frosted/message.css +4 -4
  53. package/src/frosted/status-list.css +1 -1
  54. package/src/frosted/table.css +3 -1
  55. package/src/frosted/tabs.css +7 -2
  56. package/src/frosted/toggle.css +7 -2
  57. package/src/material/button.css +3 -1
  58. package/src/material/message.css +4 -4
  59. package/src/material/select.css +3 -1
  60. package/src/material/status-list.css +1 -1
  61. package/src/material/table.css +3 -1
  62. package/src/material/tabs.css +5 -2
  63. package/src/material/toggle.css +5 -2
  64. package/src/minimal/button.css +3 -1
  65. package/src/minimal/message.css +4 -4
  66. package/src/minimal/status-list.css +1 -1
  67. package/src/minimal/table.css +3 -1
  68. package/src/minimal/tabs.css +1 -1
  69. package/src/rokkit/button.css +3 -1
  70. package/src/rokkit/message.css +4 -4
  71. package/src/rokkit/status-list.css +1 -1
  72. package/src/rokkit/table.css +3 -1
  73. package/src/zen-sumi/button.css +26 -3
  74. package/src/zen-sumi/chart.css +1 -1
  75. package/src/zen-sumi/command-palette.css +4 -4
  76. package/src/zen-sumi/floating-action.css +1 -1
  77. package/src/zen-sumi/floating-navigation.css +3 -3
  78. package/src/zen-sumi/input.css +2 -2
  79. package/src/zen-sumi/message.css +4 -4
  80. package/src/zen-sumi/range.css +2 -2
  81. package/src/zen-sumi/search-filter.css +2 -2
  82. package/src/zen-sumi/status-list.css +3 -3
  83. package/src/zen-sumi/step-indicator.css +2 -2
  84. package/src/zen-sumi/tabs.css +1 -1
  85. package/src/zen-sumi/timeline.css +2 -2
  86. package/src/zen-sumi/toc.css +5 -3
  87. package/src/zen-sumi/toolbar.css +1 -1
@@ -0,0 +1,264 @@
1
+ /* Chat — structural + neutral styling for the @rokkit/ui chat components
2
+ (ChatShell / ChatHistory / ChatTimeline / ChatMessage / ChatComposer).
3
+
4
+ The components are headless and emit data-* hooks only; this file owns
5
+ their visual treatment using the Rokkit named-token vocabulary
6
+ (--paper, --ink, --accent, …) so it adapts to every theme + mode
7
+ automatically. Component-intrinsic rules work standalone; shell-context
8
+ rules (the history rail width, composer inset, scroll) are scoped under
9
+ [data-chat-shell]. Per-style files may override for flavor. */
10
+
11
+ /* ─── ChatMessage: avatar + bubble row ──────────────────────────────── */
12
+ [data-chat-message] {
13
+ display: flex;
14
+ align-items: flex-start;
15
+ gap: 12px;
16
+ }
17
+
18
+ [data-chat-bubble] {
19
+ flex: 1;
20
+ min-width: 0;
21
+ display: flex;
22
+ flex-direction: column;
23
+ }
24
+
25
+ [data-chat-body] {
26
+ font: 400 14px/1.55 var(--font-ui);
27
+ color: var(--ink);
28
+ }
29
+
30
+ [data-chat-message][data-role='user'] [data-chat-body] {
31
+ font-family: var(--font-display, var(--font-ui));
32
+ font-size: 16px;
33
+ line-height: 1.4;
34
+ letter-spacing: -0.005em;
35
+ }
36
+
37
+ /* Inline-code chips in prose — but NOT inside a CodeBlock's <pre><code>. */
38
+ [data-chat-body] code:not([data-code-block] code) {
39
+ font: 500 12px var(--font-mono);
40
+ padding: 1px 6px;
41
+ border: 1px solid var(--paper-edge);
42
+ border-radius: 4px;
43
+ background: var(--paper-soft);
44
+ color: var(--ink-mute);
45
+ }
46
+
47
+ [data-chat-time] {
48
+ margin-top: 6px;
49
+ font: 500 10.5px var(--font-mono);
50
+ color: var(--ink-soft);
51
+ letter-spacing: 0.04em;
52
+ }
53
+
54
+ /* Streaming caret (data-status='streaming' on the message). */
55
+ [data-chat-caret] {
56
+ display: inline-block;
57
+ width: 7px;
58
+ height: 1.05em;
59
+ margin-left: 3px;
60
+ vertical-align: text-bottom;
61
+ background: var(--accent);
62
+ border-radius: 1px;
63
+ animation: rokkit-chat-caret 1s steps(2, start) infinite;
64
+ }
65
+
66
+ @keyframes rokkit-chat-caret {
67
+ to {
68
+ opacity: 0;
69
+ }
70
+ }
71
+
72
+ /* ─── ChatTimeline: message list ────────────────────────────────────── */
73
+ [data-chat-timeline] {
74
+ flex: 1;
75
+ min-height: 0;
76
+ overflow-y: auto;
77
+ display: flex;
78
+ flex-direction: column;
79
+ gap: 22px;
80
+ padding: 24px 20px;
81
+ }
82
+
83
+ /* ─── ChatComposer: input card ──────────────────────────────────────── */
84
+ [data-chat-composer] {
85
+ flex-shrink: 0;
86
+ display: flex;
87
+ flex-direction: column;
88
+ gap: 8px;
89
+ padding: 10px 12px;
90
+ background: var(--paper-soft);
91
+ /* Match the standard input chrome: a subtle paper-mute hairline at rest,
92
+ darkening to ink-soft on focus — NOT paper-edge (the near-black etched
93
+ edge in dark mode, which reads as a heavy border). */
94
+ border: 1px solid var(--paper-mute);
95
+ border-radius: 10px;
96
+ transition: border-color 120ms ease;
97
+ }
98
+
99
+ /* Single, calm focus affordance — just darken the border (no ring), exactly
100
+ like [data-input-root]:focus-within. */
101
+ [data-chat-composer]:focus-within {
102
+ border-color: var(--ink-soft);
103
+ }
104
+
105
+ /* Disabled — mirror the input disabled treatment (dim + not-allowed). */
106
+ [data-chat-composer]:has([data-chat-input]:disabled) {
107
+ opacity: 0.55;
108
+ }
109
+
110
+ [data-chat-input]:disabled {
111
+ cursor: not-allowed;
112
+ }
113
+
114
+ [data-chat-input] {
115
+ width: 100%;
116
+ min-height: 22px;
117
+ max-height: 160px;
118
+ padding: 0;
119
+ border: 0;
120
+ outline: none;
121
+ background: transparent;
122
+ resize: none;
123
+ font: 400 14px/1.45 var(--font-ui);
124
+ color: var(--ink);
125
+ }
126
+
127
+ [data-chat-input]::placeholder {
128
+ color: var(--ink-soft);
129
+ }
130
+
131
+ [data-chat-composer][data-busy] [data-chat-input] {
132
+ opacity: 0.7;
133
+ }
134
+
135
+ /* ─── ChatHistory: conversation rail ────────────────────────────────── */
136
+ [data-chat-history] {
137
+ display: flex;
138
+ flex-direction: column;
139
+ min-height: 0;
140
+ overflow-y: auto;
141
+ padding: 8px;
142
+ background: var(--paper);
143
+ color: var(--ink);
144
+ }
145
+
146
+ [data-chat-history-new] {
147
+ display: inline-flex;
148
+ align-items: center;
149
+ gap: 8px;
150
+ height: 32px;
151
+ padding: 0 10px;
152
+ margin-bottom: 6px;
153
+ border: 1px solid var(--paper-edge);
154
+ border-radius: 6px;
155
+ background: var(--paper-soft);
156
+ color: var(--ink);
157
+ font: 500 12.5px var(--font-ui);
158
+ cursor: pointer;
159
+ }
160
+
161
+ [data-chat-history-new]:hover {
162
+ border-color: var(--ink-soft);
163
+ background: var(--paper);
164
+ }
165
+
166
+ [data-chat-history-row] {
167
+ display: flex;
168
+ align-items: center;
169
+ border-radius: 6px;
170
+ }
171
+
172
+ [data-chat-history-row]:hover {
173
+ background: var(--paper-soft);
174
+ }
175
+
176
+ [data-chat-history-row][data-active] {
177
+ background: var(--paper-mute);
178
+ }
179
+
180
+ [data-chat-history-item] {
181
+ flex: 1;
182
+ min-width: 0;
183
+ display: flex;
184
+ align-items: center;
185
+ gap: 8px;
186
+ padding: 7px 8px;
187
+ border: 0;
188
+ background: transparent;
189
+ color: var(--ink-mute);
190
+ cursor: pointer;
191
+ text-align: left;
192
+ font-family: var(--font-ui);
193
+ }
194
+
195
+ [data-chat-history-row][data-active] [data-chat-history-item] {
196
+ color: var(--ink);
197
+ }
198
+
199
+ [data-chat-history-title] {
200
+ flex: 1;
201
+ min-width: 0;
202
+ font: 450 12.5px var(--font-ui);
203
+ overflow: hidden;
204
+ text-overflow: ellipsis;
205
+ white-space: nowrap;
206
+ }
207
+
208
+ [data-chat-history-time] {
209
+ flex-shrink: 0;
210
+ font: 500 10px var(--font-mono);
211
+ color: var(--ink-soft);
212
+ }
213
+
214
+ [data-chat-history-delete] {
215
+ flex-shrink: 0;
216
+ width: 24px;
217
+ height: 24px;
218
+ display: grid;
219
+ place-items: center;
220
+ border: 0;
221
+ background: transparent;
222
+ color: var(--ink-soft);
223
+ border-radius: 4px;
224
+ cursor: pointer;
225
+ opacity: 0;
226
+ }
227
+
228
+ [data-chat-history-row]:hover [data-chat-history-delete] {
229
+ opacity: 1;
230
+ }
231
+
232
+ [data-chat-history-delete]:hover {
233
+ background: var(--paper-mute);
234
+ color: var(--ink);
235
+ }
236
+
237
+ /* ─── ChatShell: history rail + main column ─────────────────────────── */
238
+ [data-chat-shell] {
239
+ display: flex;
240
+ min-height: 0;
241
+ background: var(--paper);
242
+ color: var(--ink);
243
+ }
244
+
245
+ [data-chat-main] {
246
+ flex: 1;
247
+ min-width: 0;
248
+ min-height: 0;
249
+ display: flex;
250
+ flex-direction: column;
251
+ }
252
+
253
+ /* Rail chrome only applies inside the shell — a standalone ChatHistory
254
+ fills its own container instead of imposing a fixed rail width. */
255
+ [data-chat-shell] [data-chat-history] {
256
+ width: 280px;
257
+ flex-shrink: 0;
258
+ border-right: 1px solid var(--paper-edge);
259
+ }
260
+
261
+ /* Inset the composer from the column edges inside the shell. */
262
+ [data-chat-main] [data-chat-composer] {
263
+ margin: 0 20px 20px;
264
+ }
@@ -50,6 +50,7 @@
50
50
  @import './status-list.css';
51
51
  @import './step-indicator.css';
52
52
  @import './message.css';
53
+ @import './chat.css';
53
54
  @import './alert-list.css';
54
55
  @import './chart.css';
55
56
  @import './swatch.css';
@@ -31,6 +31,34 @@
31
31
  min-width: 0;
32
32
  }
33
33
 
34
+ /* Contrast-critical (applies to every style): the status soft-bg is a fixed
35
+ light tint that does NOT flip in dark mode, so the body text must be a fixed
36
+ DARK tone to stay readable. Darken the status hue toward black — keeps the
37
+ colour identity and reaches WCAG AA on the light tint in both modes. The
38
+ icon / border keep the vibrant status-500.
39
+
40
+ The same darkened tone is also set on the ROOT (not just [data-message-text]):
41
+ the root's `color` is the inherited default for any banner text, and the
42
+ styles set the vibrant `text-{status}` on the root — which fails AA on the
43
+ light soft-bg. The vibrant icon/dismiss keep their own higher-specificity
44
+ `text-{status}` rules, so this only re-tones the readable copy. */
45
+ [data-message-root][data-type='error'],
46
+ [data-message-root][data-type='error'] [data-message-text] {
47
+ color: color-mix(in oklch, var(--error) 55%, black);
48
+ }
49
+ [data-message-root][data-type='warning'],
50
+ [data-message-root][data-type='warning'] [data-message-text] {
51
+ color: color-mix(in oklch, var(--warning) 55%, black);
52
+ }
53
+ [data-message-root][data-type='info'],
54
+ [data-message-root][data-type='info'] [data-message-text] {
55
+ color: color-mix(in oklch, var(--info) 55%, black);
56
+ }
57
+ [data-message-root][data-type='success'],
58
+ [data-message-root][data-type='success'] [data-message-text] {
59
+ color: color-mix(in oklch, var(--success) 55%, black);
60
+ }
61
+
34
62
  [data-message-actions] {
35
63
  display: flex;
36
64
  align-items: center;
@@ -21,9 +21,15 @@
21
21
  0 2px 8px rgba(0, 0, 0, 0.08);
22
22
  }
23
23
 
24
+ /* Filled frosted variants use a translucent fill (bg-X/60) that composites
25
+ over the page, so the effective fill is a diluted tint that flips light/dark
26
+ with the mode. The auto on-color (computed against the full-opacity status
27
+ 500) is wrong for the diluted fill — near-black on the dark dilution only
28
+ reaches ~2.4:1. ink flips with the mode and clears AA on both poles
29
+ (~6.2:1 dark, ~7.8:1 light). */
24
30
  [data-style='frosted'] [data-button][data-style='default'][data-variant='primary'],
25
31
  [data-style='frosted'] [data-button]:not([data-style])[data-variant='primary'] {
26
- @apply text-on-primary border backdrop-blur-xl bg-primary/60;
32
+ @apply text-ink border backdrop-blur-xl bg-primary/60;
27
33
  border-color: rgba(255, 255, 255, 0.25);
28
34
  box-shadow:
29
35
  inset 0 1px 0 rgba(255, 255, 255, 0.25),
@@ -32,7 +38,7 @@
32
38
 
33
39
  [data-style='frosted'] [data-button][data-style='default'][data-variant='secondary'],
34
40
  [data-style='frosted'] [data-button]:not([data-style])[data-variant='secondary'] {
35
- @apply text-on-primary border backdrop-blur-xl bg-accent/60;
41
+ @apply text-ink border backdrop-blur-xl bg-accent/60;
36
42
  border-color: rgba(255, 255, 255, 0.25);
37
43
  box-shadow:
38
44
  inset 0 1px 0 rgba(255, 255, 255, 0.25),
@@ -41,7 +47,7 @@
41
47
 
42
48
  [data-style='frosted'] [data-button][data-style='default'][data-variant='accent'],
43
49
  [data-style='frosted'] [data-button]:not([data-style])[data-variant='accent'] {
44
- @apply text-on-accent border backdrop-blur-xl bg-accent/60;
50
+ @apply text-ink border backdrop-blur-xl bg-accent/60;
45
51
  border-color: rgba(255, 255, 255, 0.25);
46
52
  box-shadow:
47
53
  inset 0 1px 0 rgba(255, 255, 255, 0.25),
@@ -50,7 +56,7 @@
50
56
 
51
57
  [data-style='frosted'] [data-button][data-style='default'][data-variant='danger'],
52
58
  [data-style='frosted'] [data-button]:not([data-style])[data-variant='danger'] {
53
- @apply text-on-danger border backdrop-blur-xl bg-danger/60;
59
+ @apply text-ink border backdrop-blur-xl bg-danger/60;
54
60
  border-color: rgba(255, 255, 255, 0.25);
55
61
  box-shadow:
56
62
  inset 0 1px 0 rgba(255, 255, 255, 0.25),
@@ -3,7 +3,7 @@
3
3
  */
4
4
 
5
5
  [data-style='frosted'] [data-message-root][data-type='error'] {
6
- @apply border-error/40 text-error backdrop-blur-sm;
6
+ @apply border-error/40 backdrop-blur-sm;
7
7
  background-color: var(--error-soft);
8
8
  }
9
9
  [data-style='frosted'] [data-message-root][data-type='error'] [data-message-icon],
@@ -12,7 +12,7 @@
12
12
  }
13
13
 
14
14
  [data-style='frosted'] [data-message-root][data-type='warning'] {
15
- @apply border-warning/40 text-warning backdrop-blur-sm;
15
+ @apply border-warning/40 backdrop-blur-sm;
16
16
  background-color: var(--warning-soft);
17
17
  }
18
18
  [data-style='frosted'] [data-message-root][data-type='warning'] [data-message-icon],
@@ -21,7 +21,7 @@
21
21
  }
22
22
 
23
23
  [data-style='frosted'] [data-message-root][data-type='info'] {
24
- @apply border-info/40 text-info backdrop-blur-sm;
24
+ @apply border-info/40 backdrop-blur-sm;
25
25
  background-color: var(--info-soft);
26
26
  }
27
27
  [data-style='frosted'] [data-message-root][data-type='info'] [data-message-icon],
@@ -30,7 +30,7 @@
30
30
  }
31
31
 
32
32
  [data-style='frosted'] [data-message-root][data-type='success'] {
33
- @apply border-success/40 text-success backdrop-blur-sm;
33
+ @apply border-success/40 backdrop-blur-sm;
34
34
  background-color: var(--success-soft);
35
35
  }
36
36
  [data-style='frosted'] [data-message-root][data-type='success'] [data-message-icon],
@@ -14,7 +14,7 @@
14
14
  @apply text-warning;
15
15
  }
16
16
  [data-style='frosted'] [data-status-item][data-status='unknown'] span {
17
- @apply text-paper-edge;
17
+ @apply text-ink-soft;
18
18
  }
19
19
 
20
20
  [data-style='frosted'] [data-status-item][data-status='pass'] {
@@ -9,7 +9,9 @@
9
9
  ============================================================================= */
10
10
 
11
11
  [data-style='frosted'] [data-table-header] th {
12
- @apply text-ink-mute border-b backdrop-blur-sm;
12
+ /* ink (not ink-mute): column headers are primary content; ink-mute on the
13
+ paper-mute header only reaches 4.07:1 in dark mode (AA fail). */
14
+ @apply text-ink border-b backdrop-blur-sm;
13
15
  border-color: color-mix(in oklch, var(--ink-soft) 20%, transparent);
14
16
  background-color: color-mix(in oklch, var(--paper-mute) 80%, transparent);
15
17
  }
@@ -31,9 +31,14 @@
31
31
  background-color: color-mix(in oklch, var(--paper-mute) 15%, transparent);
32
32
  }
33
33
 
34
- /* Selected state */
34
+ /* Selected state.
35
+ ink (not primary): the selected pill's bg is a translucent primary tint
36
+ (bg-primary/40) that composites to a light tint in light mode and a dark
37
+ tint in dark mode. Vibrant primary text on the light tint is only ~1.6:1.
38
+ ink flips with the mode and clears AA on both poles (~10:1 light, ~8.6:1
39
+ dark). The vibrant primary lives on the border + icon below. */
35
40
  [data-style='frosted'] [data-tabs-trigger][data-selected] {
36
- @apply bg-primary/40 text-primary border-primary/50 border backdrop-blur-sm;
41
+ @apply bg-primary/40 text-ink border-primary/50 border backdrop-blur-sm;
37
42
  }
38
43
 
39
44
  /* =============================================================================
@@ -28,9 +28,14 @@
28
28
  background-color: color-mix(in oklch, var(--paper-mute) 15%, transparent);
29
29
  }
30
30
 
31
- /* Selected state */
31
+ /* Selected state.
32
+ ink (not primary): the selected bg is a translucent primary tint
33
+ (bg-primary/40) that composites to a light tint in light mode and a dark
34
+ tint in dark mode. Vibrant primary text on the light tint is only ~1.6:1.
35
+ ink flips with the mode and clears AA on both poles. Vibrant primary stays
36
+ on the border + icon. */
32
37
  [data-style='frosted'] [data-toggle-option][data-selected='true'] {
33
- @apply bg-primary/40 text-primary border-primary/50 border backdrop-blur-sm;
38
+ @apply bg-primary/40 text-ink border-primary/50 border backdrop-blur-sm;
34
39
  }
35
40
 
36
41
  /* =============================================================================
@@ -12,7 +12,9 @@
12
12
  [data-style='material'] [data-button]:not([data-style])[data-variant='default'],
13
13
  [data-style='material'] [data-button][data-style='default']:not([data-variant]),
14
14
  [data-style='material'] [data-button]:not([data-style]):not([data-variant]) {
15
- @apply bg-paper-mute text-ink-mute bg-none shadow-sm;
15
+ /* ink (not ink-mute): the button label is primary content; ink-mute on the
16
+ paper-mute fill only reaches 4.07:1 in dark mode (AA fail). */
17
+ @apply bg-paper-mute text-ink bg-none shadow-sm;
16
18
  }
17
19
 
18
20
  [data-style='material'] [data-button][data-style='default'][data-variant='primary'],
@@ -3,7 +3,7 @@
3
3
  */
4
4
 
5
5
  [data-style='material'] [data-message-root][data-type='error'] {
6
- @apply bg-error-soft border-error text-error shadow-sm;
6
+ @apply bg-error-soft border-error shadow-sm;
7
7
  }
8
8
  [data-style='material'] [data-message-root][data-type='error'] [data-message-icon],
9
9
  [data-style='material'] [data-message-root][data-type='error'] [data-message-dismiss] {
@@ -11,7 +11,7 @@
11
11
  }
12
12
 
13
13
  [data-style='material'] [data-message-root][data-type='warning'] {
14
- @apply bg-warning-soft border-warning text-warning shadow-sm;
14
+ @apply bg-warning-soft border-warning shadow-sm;
15
15
  }
16
16
  [data-style='material'] [data-message-root][data-type='warning'] [data-message-icon],
17
17
  [data-style='material'] [data-message-root][data-type='warning'] [data-message-dismiss] {
@@ -19,7 +19,7 @@
19
19
  }
20
20
 
21
21
  [data-style='material'] [data-message-root][data-type='info'] {
22
- @apply bg-info-soft border-info text-info shadow-sm;
22
+ @apply bg-info-soft border-info shadow-sm;
23
23
  }
24
24
  [data-style='material'] [data-message-root][data-type='info'] [data-message-icon],
25
25
  [data-style='material'] [data-message-root][data-type='info'] [data-message-dismiss] {
@@ -27,7 +27,7 @@
27
27
  }
28
28
 
29
29
  [data-style='material'] [data-message-root][data-type='success'] {
30
- @apply bg-success-soft border-success text-success shadow-sm;
30
+ @apply bg-success-soft border-success shadow-sm;
31
31
  }
32
32
  [data-style='material'] [data-message-root][data-type='success'] [data-message-icon],
33
33
  [data-style='material'] [data-message-root][data-type='success'] [data-message-dismiss] {
@@ -49,7 +49,9 @@
49
49
  ============================================================================= */
50
50
 
51
51
  [data-style='material'] [data-select-tag] {
52
- @apply bg-paper-mute text-ink-mute rounded-full bg-none shadow-sm;
52
+ /* ink (not ink-mute): the tag holds the selected value (primary content);
53
+ ink-mute on the paper-mute chip only reaches 4.07:1 in dark mode (AA fail). */
54
+ @apply bg-paper-mute text-ink rounded-full bg-none shadow-sm;
53
55
  }
54
56
 
55
57
  [data-style='material'] [data-select-tag-remove] {
@@ -14,7 +14,7 @@
14
14
  @apply text-warning;
15
15
  }
16
16
  [data-style='material'] [data-status-item][data-status='unknown'] span {
17
- @apply text-paper-edge;
17
+ @apply text-ink-soft;
18
18
  }
19
19
 
20
20
  [data-style='material'] [data-status-item][data-status='pass'] {
@@ -9,7 +9,9 @@
9
9
  ============================================================================= */
10
10
 
11
11
  [data-style='material'] [data-table-header] th {
12
- @apply text-ink-mute bg-paper-mute border-paper-edge border-b font-medium;
12
+ /* ink (not ink-mute): column headers are primary content; ink-mute on the
13
+ paper-mute header only reaches 4.07:1 in dark mode (AA fail). */
14
+ @apply text-ink bg-paper-mute border-paper-edge border-b font-medium;
13
15
  }
14
16
 
15
17
  [data-style='material'] [data-table-header-cell][data-sortable='true']:hover {
@@ -20,8 +20,11 @@
20
20
  Tab Triggers
21
21
  ============================================================================= */
22
22
 
23
+ /* ink (not ink-mute): an unselected tab label is an interactive navigation
24
+ target that must read clearly; ink-mute on the paper-mute tab list only
25
+ reaches 4.07:1 in dark mode (AA fail). */
23
26
  [data-style='material'] [data-tabs-trigger] {
24
- @apply text-ink-mute rounded-t-lg bg-transparent;
27
+ @apply text-ink rounded-t-lg bg-transparent;
25
28
  }
26
29
 
27
30
  [data-style='material'] [data-tabs][data-position='after'] [data-tabs-trigger] {
@@ -29,7 +32,7 @@
29
32
  }
30
33
 
31
34
  [data-style='material'] [data-tabs-trigger]:hover:not(:disabled):not([data-disabled]) {
32
- @apply bg-paper-mute text-ink-mute;
35
+ @apply bg-paper-mute text-ink;
33
36
  }
34
37
 
35
38
  /* Selected state */
@@ -16,13 +16,16 @@
16
16
  Toggle Options
17
17
  ============================================================================= */
18
18
 
19
+ /* ink (not ink-mute): an unselected option label is an interactive target
20
+ that must read clearly; ink-mute on the paper-mute container only reaches
21
+ 4.07:1 in dark mode (AA fail). */
19
22
  [data-style='material'] [data-toggle-option] {
20
- @apply text-ink-mute rounded-full;
23
+ @apply text-ink rounded-full;
21
24
  }
22
25
 
23
26
  [data-style='material'] [data-toggle-option]:hover:not(:disabled):not([data-disabled='true']),
24
27
  [data-style='material'] [data-toggle-option]:focus:not(:disabled):not([data-disabled='true']) {
25
- @apply bg-paper-mute text-ink-mute bg-none;
28
+ @apply bg-paper-mute text-ink bg-none;
26
29
  }
27
30
 
28
31
  /* Selected state */
@@ -12,7 +12,9 @@
12
12
  [data-style='minimal'] [data-button]:not([data-style])[data-variant='default'],
13
13
  [data-style='minimal'] [data-button][data-style='default']:not([data-variant]),
14
14
  [data-style='minimal'] [data-button]:not([data-style]):not([data-variant]) {
15
- @apply bg-paper-mute border-paper-edge text-ink-mute border bg-none;
15
+ /* ink (not ink-mute): the button label is primary content; ink-mute on the
16
+ paper-mute fill only reaches 4.07:1 in dark mode (AA fail). */
17
+ @apply bg-paper-mute border-paper-edge text-ink border bg-none;
16
18
  }
17
19
 
18
20
  [data-style='minimal'] [data-button][data-style='default'][data-variant='primary'],
@@ -3,7 +3,7 @@
3
3
  */
4
4
 
5
5
  [data-style='minimal'] [data-message-root][data-type='error'] {
6
- @apply bg-error-soft border-error text-error;
6
+ @apply bg-error-soft border-error;
7
7
  }
8
8
  [data-style='minimal'] [data-message-root][data-type='error'] [data-message-icon],
9
9
  [data-style='minimal'] [data-message-root][data-type='error'] [data-message-dismiss] {
@@ -11,7 +11,7 @@
11
11
  }
12
12
 
13
13
  [data-style='minimal'] [data-message-root][data-type='warning'] {
14
- @apply bg-warning-soft border-warning text-warning;
14
+ @apply bg-warning-soft border-warning;
15
15
  }
16
16
  [data-style='minimal'] [data-message-root][data-type='warning'] [data-message-icon],
17
17
  [data-style='minimal'] [data-message-root][data-type='warning'] [data-message-dismiss] {
@@ -19,7 +19,7 @@
19
19
  }
20
20
 
21
21
  [data-style='minimal'] [data-message-root][data-type='info'] {
22
- @apply bg-info-soft border-info text-info;
22
+ @apply bg-info-soft border-info;
23
23
  }
24
24
  [data-style='minimal'] [data-message-root][data-type='info'] [data-message-icon],
25
25
  [data-style='minimal'] [data-message-root][data-type='info'] [data-message-dismiss] {
@@ -27,7 +27,7 @@
27
27
  }
28
28
 
29
29
  [data-style='minimal'] [data-message-root][data-type='success'] {
30
- @apply bg-success-soft border-success text-success;
30
+ @apply bg-success-soft border-success;
31
31
  }
32
32
  [data-style='minimal'] [data-message-root][data-type='success'] [data-message-icon],
33
33
  [data-style='minimal'] [data-message-root][data-type='success'] [data-message-dismiss] {
@@ -14,7 +14,7 @@
14
14
  @apply text-warning;
15
15
  }
16
16
  [data-style='minimal'] [data-status-item][data-status='unknown'] span {
17
- @apply text-paper-edge;
17
+ @apply text-ink-soft;
18
18
  }
19
19
 
20
20
  [data-style='minimal'] [data-status-item][data-status='pass'] {
@@ -9,7 +9,9 @@
9
9
  ============================================================================= */
10
10
 
11
11
  [data-style='minimal'] [data-table-header] th {
12
- @apply text-ink-mute border-paper-edge border-b bg-paper-mute;
12
+ /* ink (not ink-mute): column headers are primary content; ink-mute on the
13
+ paper-mute header only reaches 4.07:1 in dark mode (AA fail). */
14
+ @apply text-ink border-paper-edge border-b bg-paper-mute;
13
15
  }
14
16
 
15
17
  [data-style='minimal'] [data-table-header-cell][data-sortable='true']:hover {
@@ -131,7 +131,7 @@
131
131
  ============================================================================= */
132
132
 
133
133
  [data-style='minimal'] [data-tabs-trigger] [data-tabs-icon] {
134
- @apply text-paper-edge;
134
+ @apply text-ink-soft;
135
135
  }
136
136
 
137
137
  [data-style='minimal'] [data-tabs-trigger]:hover:not(:disabled) [data-tabs-icon] {
@@ -26,7 +26,9 @@
26
26
  [data-style='rokkit'] [data-button]:not([data-style])[data-variant='default'],
27
27
  [data-style='rokkit'] [data-button][data-style='default']:not([data-variant]),
28
28
  [data-style='rokkit'] [data-button]:not([data-style]):not([data-variant]) {
29
- @apply border-paper-edge text-ink-mute border;
29
+ /* ink (not ink-mute): the button label is primary content; ink-mute on the
30
+ paper-mute fill only reaches 4.07:1 in dark mode (AA fail). */
31
+ @apply border-paper-edge text-ink border;
30
32
  background: var(--paper-mute);
31
33
  }
32
34