@inchurch/matcha-theme 20.0.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 (112) hide show
  1. package/README.md +303 -0
  2. package/abstracts/_colors.scss +405 -0
  3. package/abstracts/_elevation.scss +102 -0
  4. package/abstracts/_functions.scss +1213 -0
  5. package/abstracts/_media-breakpoint.scss +23 -0
  6. package/abstracts/_typography.scss +127 -0
  7. package/base/_reset.scss +438 -0
  8. package/components/matcha-accordion.scss +157 -0
  9. package/components/matcha-audio-player.scss +32 -0
  10. package/components/matcha-autocomplete.scss +134 -0
  11. package/components/matcha-avatar.scss +161 -0
  12. package/components/matcha-badge.scss +120 -0
  13. package/components/matcha-breadcrumb.scss +126 -0
  14. package/components/matcha-button-toggle.scss +363 -0
  15. package/components/matcha-buttons.scss +784 -0
  16. package/components/matcha-calendar.scss +154 -0
  17. package/components/matcha-cards.scss +205 -0
  18. package/components/matcha-chart-card.scss +60 -0
  19. package/components/matcha-checkbox.scss +554 -0
  20. package/components/matcha-chip.scss +212 -0
  21. package/components/matcha-color-pick.scss +35 -0
  22. package/components/matcha-command-palette.scss +89 -0
  23. package/components/matcha-crop.scss +172 -0
  24. package/components/matcha-date.scss +81 -0
  25. package/components/matcha-divider.scss +45 -0
  26. package/components/matcha-draggable.scss +24 -0
  27. package/components/matcha-drawer.scss +235 -0
  28. package/components/matcha-drop-list.scss +390 -0
  29. package/components/matcha-emoji.scss +69 -0
  30. package/components/matcha-empty-state.scss +118 -0
  31. package/components/matcha-flag.scss +62 -0
  32. package/components/matcha-footer.scss +187 -0
  33. package/components/matcha-form-field.scss +552 -0
  34. package/components/matcha-form-section.scss +101 -0
  35. package/components/matcha-header.scss +325 -0
  36. package/components/matcha-highlight.scss +296 -0
  37. package/components/matcha-hint-text.scss +66 -0
  38. package/components/matcha-horizontal-tree.scss +317 -0
  39. package/components/matcha-icon.scss +106 -0
  40. package/components/matcha-image.scss +62 -0
  41. package/components/matcha-list.scss +212 -0
  42. package/components/matcha-menu.scss +86 -0
  43. package/components/matcha-modal.scss +234 -0
  44. package/components/matcha-nav.scss +450 -0
  45. package/components/matcha-notification.scss +197 -0
  46. package/components/matcha-option.scss +95 -0
  47. package/components/matcha-page-builder.scss +4186 -0
  48. package/components/matcha-paginator.scss +235 -0
  49. package/components/matcha-panel.scss +167 -0
  50. package/components/matcha-profile-card.scss +50 -0
  51. package/components/matcha-progress-bar.scss +209 -0
  52. package/components/matcha-radio.scss +528 -0
  53. package/components/matcha-ripple.scss +7 -0
  54. package/components/matcha-scrollbar.scss +35 -0
  55. package/components/matcha-scrollbox-shadow.scss +123 -0
  56. package/components/matcha-section.scss +105 -0
  57. package/components/matcha-select.scss +661 -0
  58. package/components/matcha-skeleton.scss +138 -0
  59. package/components/matcha-slide-toggle.scss +590 -0
  60. package/components/matcha-slider.scss +188 -0
  61. package/components/matcha-snack-bar.scss +266 -0
  62. package/components/matcha-spin.scss +252 -0
  63. package/components/matcha-spinner.scss +78 -0
  64. package/components/matcha-stepper.scss +177 -0
  65. package/components/matcha-table-cell.scss +41 -0
  66. package/components/matcha-table.scss +785 -0
  67. package/components/matcha-tabs.scss +469 -0
  68. package/components/matcha-text-editor.scss +151 -0
  69. package/components/matcha-time.scss +33 -0
  70. package/components/matcha-timepicker.scss +13 -0
  71. package/components/matcha-toolbar.scss +206 -0
  72. package/components/matcha-tooltip.scss +128 -0
  73. package/components/matcha-uploader.scss +215 -0
  74. package/css/matcha-style.css +76772 -0
  75. package/fonts/CircularStd-Black.eot +0 -0
  76. package/fonts/CircularStd-Black.svg +3426 -0
  77. package/fonts/CircularStd-Black.ttf +0 -0
  78. package/fonts/CircularStd-Black.woff +0 -0
  79. package/fonts/CircularStd-Black.woff2 +0 -0
  80. package/fonts/CircularStd-Bold.eot +0 -0
  81. package/fonts/CircularStd-Bold.otf +0 -0
  82. package/fonts/CircularStd-Bold.svg +13532 -0
  83. package/fonts/CircularStd-Bold.ttf +0 -0
  84. package/fonts/CircularStd-Bold.woff +0 -0
  85. package/fonts/CircularStd-Bold.woff2 +0 -0
  86. package/fonts/CircularStd-Medium.eot +0 -0
  87. package/fonts/CircularStd-Medium.otf +0 -0
  88. package/fonts/CircularStd-Medium.svg +13511 -0
  89. package/fonts/CircularStd-Medium.ttf +0 -0
  90. package/fonts/CircularStd-Medium.woff +0 -0
  91. package/fonts/CircularStd-Medium.woff2 +0 -0
  92. package/fonts/CircularStd-Regular.eot +0 -0
  93. package/fonts/CircularStd-Regular.otf +0 -0
  94. package/fonts/CircularStd-Regular.svg +2378 -0
  95. package/fonts/CircularStd-Regular.ttf +0 -0
  96. package/fonts/CircularStd-Regular.woff +0 -0
  97. package/fonts/CircularStd-Regular.woff2 +0 -0
  98. package/main.scss +262 -0
  99. package/package.json +11 -0
  100. package/tokens/_animations-tokens.scss +37 -0
  101. package/tokens/_breakpoints-tokens.scss +26 -0
  102. package/tokens/_color-tokens.scss +1153 -0
  103. package/tokens/_css-custom-properties.scss +568 -0
  104. package/tokens/_elevation-tokens.scss +33 -0
  105. package/tokens/_spacing-tokens.scss +94 -0
  106. package/tokens/_typography-tokens.scss +65 -0
  107. package/vendors/angular-editor.scss +56 -0
  108. package/vendors/angular-material-fixes.scss +297 -0
  109. package/vendors/calendar.scss +2880 -0
  110. package/vendors/charts.scss +92 -0
  111. package/vendors/ng5-slider.scss +56 -0
  112. package/vendors/ngx-material-timepicker.scss +50 -0
@@ -0,0 +1,528 @@
1
+ // =============================================================================
2
+ // matcha-radio.scss — Migração Fase 3.1
3
+ //
4
+ // Mudanças em relação ao original:
5
+ // [3.1-A] State layer em .matcha-radio-container (replaced element: input não suporta ::before)
6
+ // Pattern: color: getXxx($theme) no container → currentColor funciona no ::before
7
+ // [3.1-B] .matcha-radio-container:hover background-color removido (substituído por state layer)
8
+ // [3.1-C] Ripple de paleta: // ok: ripple palette. Semântico (accent/primary/…): CSS var com fallback
9
+ // Semantic colors (primary/accent/success/warn/danger/info): usa CSS vars com fallback
10
+ // [3.1-D] :focus → removido (vazio); :focus-visible adicionado dentro do mixin ($theme disponível)
11
+ // [3.1-E] Disabled: opacity:0.6 + cursor:not-allowed removidos; tokens semânticos usados
12
+ // [3.1-F] transition: all → transition: border-color específico
13
+ // [3.1-G] @media (prefers-reduced-motion: reduce) adicionado
14
+ // [3.1-H] :not([disabled]) guards via seletor de contexto do pai
15
+ // =============================================================================
16
+
17
+ @mixin matcha-radio($theme) {
18
+ matcha-radio {
19
+
20
+ // ── Sem cor: usa accent ────────────────────────────────────────────
21
+ &:not([color]) {
22
+ // [3.1-A] color no container → currentColor para o state layer
23
+ .matcha-radio-container {
24
+ color: var(--matcha-color-accent, #{getAccent($theme)});
25
+ }
26
+
27
+ input[type="radio"] {
28
+ border-color: var(--matcha-color-text-label, #{getBlueGrey($theme)});
29
+
30
+ &:active {
31
+ border-color: var(--matcha-color-accent, #{getAccent($theme)});
32
+ }
33
+
34
+ &:checked {
35
+ border-color: var(--matcha-color-accent, #{getAccent($theme)});
36
+
37
+ &::after {
38
+ background-color: var(--matcha-color-accent, #{getAccent($theme)});
39
+ }
40
+ }
41
+ }
42
+
43
+ // [3.1-C] ripple — accent é semântico, usa CSS var com fallback
44
+ .matcha-radio-container .ripple {
45
+ background: var(--matcha-color-accent-contrast-alpha, #{getAccentContrastAlpha($theme)}) !important;
46
+ }
47
+ }
48
+
49
+ // ── Com cor customizada ────────────────────────────────────────────
50
+ &[color] {
51
+ input[type="radio"] {
52
+ border-color: var(--matcha-color-text-label, #{getBlueGrey($theme)});
53
+ }
54
+ }
55
+
56
+ // ── Paleta: red ────────────────────────────────────────────────────
57
+ &[color="red"] {
58
+ .matcha-radio-container { color: getRed($theme); } // [3.1-A]
59
+
60
+ input[type="radio"]:active { border-color: getRed($theme); }
61
+ input[type="radio"]:checked { border-color: getRed($theme); }
62
+ input[type="radio"]:checked::after { background-color: getRed($theme); }
63
+
64
+ .matcha-radio-container .ripple {
65
+ background: rgba(getRedContrast($theme), 0.1) !important; // ok: ripple palette
66
+ }
67
+ }
68
+
69
+ // ── Paleta: pink ───────────────────────────────────────────────────
70
+ &[color="pink"] {
71
+ .matcha-radio-container { color: getPink($theme); } // [3.1-A]
72
+
73
+ input[type="radio"]:active { border-color: getPink($theme); }
74
+ input[type="radio"]:checked { border-color: getPink($theme); }
75
+ input[type="radio"]:checked::after { background-color: getPink($theme); }
76
+
77
+ .matcha-radio-container .ripple {
78
+ background: rgba(getPinkContrast($theme), 0.1) !important; // ok: ripple palette
79
+ }
80
+ }
81
+
82
+ // ── Paleta: purple ─────────────────────────────────────────────────
83
+ &[color="purple"] {
84
+ .matcha-radio-container { color: getPurple($theme); } // [3.1-A]
85
+
86
+ input[type="radio"]:active { border-color: getPurple($theme); }
87
+ input[type="radio"]:checked { border-color: getPurple($theme); }
88
+ input[type="radio"]:checked::after { background-color: getPurple($theme); }
89
+
90
+ .matcha-radio-container .ripple {
91
+ background: rgba(getPurpleContrast($theme), 0.1) !important; // ok: ripple palette
92
+ }
93
+ }
94
+
95
+ // ── Paleta: deep-purple ────────────────────────────────────────────
96
+ &[color="deep-purple"] {
97
+ .matcha-radio-container { color: getDeepPurple($theme); } // [3.1-A]
98
+
99
+ input[type="radio"]:active { border-color: getDeepPurple($theme); }
100
+ input[type="radio"]:checked { border-color: getDeepPurple($theme); }
101
+ input[type="radio"]:checked::after { background-color: getDeepPurple($theme); }
102
+
103
+ .matcha-radio-container .ripple {
104
+ background: rgba(getDeepPurpleContrast($theme), 0.1) !important; // ok: ripple palette
105
+ }
106
+ }
107
+
108
+ // ── Paleta: indigo ─────────────────────────────────────────────────
109
+ &[color="indigo"] {
110
+ .matcha-radio-container { color: getIndigo($theme); } // [3.1-A]
111
+
112
+ input[type="radio"]:active { border-color: getIndigo($theme); }
113
+ input[type="radio"]:checked { border-color: getIndigo($theme); }
114
+ input[type="radio"]:checked::after { background-color: getIndigo($theme); }
115
+
116
+ .matcha-radio-container .ripple {
117
+ background: rgba(getIndigoContrast($theme), 0.1) !important; // ok: ripple palette
118
+ }
119
+ }
120
+
121
+ // ── Paleta: blue ───────────────────────────────────────────────────
122
+ &[color="blue"] {
123
+ .matcha-radio-container { color: getBlue($theme); } // [3.1-A]
124
+
125
+ input[type="radio"]:active { border-color: getBlue($theme); }
126
+ input[type="radio"]:checked { border-color: getBlue($theme); }
127
+ input[type="radio"]:checked::after { background-color: getBlue($theme); }
128
+
129
+ .matcha-radio-container .ripple {
130
+ background: rgba(getBlueContrast($theme), 0.1) !important; // ok: ripple palette
131
+ }
132
+ }
133
+
134
+ // ── Paleta: light-blue ─────────────────────────────────────────────
135
+ &[color="light-blue"] {
136
+ .matcha-radio-container { color: getLightBlue($theme); } // [3.1-A]
137
+
138
+ input[type="radio"]:active { border-color: getLightBlue($theme); }
139
+ input[type="radio"]:checked { border-color: getLightBlue($theme); }
140
+ input[type="radio"]:checked::after { background-color: getLightBlue($theme); }
141
+
142
+ .matcha-radio-container .ripple {
143
+ background: rgba(getLightBlueContrast($theme), 0.1) !important; // ok: ripple palette
144
+ }
145
+ }
146
+
147
+ // ── Paleta: cyan ───────────────────────────────────────────────────
148
+ &[color="cyan"] {
149
+ .matcha-radio-container { color: getCyan($theme); } // [3.1-A]
150
+
151
+ input[type="radio"]:active { border-color: getCyan($theme); }
152
+ input[type="radio"]:checked { border-color: getCyan($theme); }
153
+ input[type="radio"]:checked::after { background-color: getCyan($theme); }
154
+
155
+ .matcha-radio-container .ripple {
156
+ background: rgba(getCyanContrast($theme), 0.1) !important; // ok: ripple palette
157
+ }
158
+ }
159
+
160
+ // ── Paleta: teal ───────────────────────────────────────────────────
161
+ &[color="teal"] {
162
+ .matcha-radio-container { color: getTeal($theme); } // [3.1-A]
163
+
164
+ input[type="radio"]:active { border-color: getTeal($theme); }
165
+ input[type="radio"]:checked { border-color: getTeal($theme); }
166
+ input[type="radio"]:checked::after { background-color: getTeal($theme); }
167
+
168
+ .matcha-radio-container .ripple {
169
+ background: rgba(getTealContrast($theme), 0.1) !important; // ok: ripple palette
170
+ }
171
+ }
172
+
173
+ // ── Paleta: green ──────────────────────────────────────────────────
174
+ &[color="green"] {
175
+ .matcha-radio-container { color: getGreen($theme); } // [3.1-A]
176
+
177
+ input[type="radio"]:active { border-color: getGreen($theme); }
178
+ input[type="radio"]:checked { border-color: getGreen($theme); }
179
+ input[type="radio"]:checked::after { background-color: getGreen($theme); }
180
+
181
+ .matcha-radio-container .ripple {
182
+ background: rgba(getGreenContrast($theme), 0.1) !important; // ok: ripple palette
183
+ }
184
+ }
185
+
186
+ // ── Paleta: light-green ────────────────────────────────────────────
187
+ &[color="light-green"] {
188
+ .matcha-radio-container { color: getLightGreen($theme); } // [3.1-A]
189
+
190
+ input[type="radio"]:active { border-color: getLightGreen($theme); }
191
+ input[type="radio"]:checked { border-color: getLightGreen($theme); }
192
+ input[type="radio"]:checked::after { background-color: getLightGreen($theme); }
193
+
194
+ .matcha-radio-container .ripple {
195
+ background: rgba(getLightGreenContrast($theme), 0.1) !important; // ok: ripple palette
196
+ }
197
+ }
198
+
199
+ // ── Paleta: lime ───────────────────────────────────────────────────
200
+ &[color="lime"] {
201
+ .matcha-radio-container { color: getLime($theme); } // [3.1-A]
202
+
203
+ input[type="radio"]:active { border-color: getLime($theme); }
204
+ input[type="radio"]:checked { border-color: getLime($theme); }
205
+ input[type="radio"]:checked::after { background-color: getLime($theme); }
206
+
207
+ .matcha-radio-container .ripple {
208
+ background: rgba(getLimeContrast($theme), 0.1) !important; // ok: ripple palette
209
+ }
210
+ }
211
+
212
+ // ── Paleta: yellow ─────────────────────────────────────────────────
213
+ &[color="yellow"] {
214
+ .matcha-radio-container { color: getYellow($theme); } // [3.1-A]
215
+
216
+ input[type="radio"]:active { border-color: getYellow($theme); }
217
+ input[type="radio"]:checked { border-color: getYellow($theme); }
218
+ input[type="radio"]:checked::after { background-color: getYellow($theme); }
219
+
220
+ .matcha-radio-container .ripple {
221
+ background: rgba(getYellowContrast($theme), 0.1) !important; // ok: ripple palette
222
+ }
223
+ }
224
+
225
+ // ── Paleta: amber ──────────────────────────────────────────────────
226
+ &[color="amber"] {
227
+ .matcha-radio-container { color: getAmber($theme); } // [3.1-A]
228
+
229
+ input[type="radio"]:active { border-color: getAmber($theme); }
230
+ input[type="radio"]:checked { border-color: getAmber($theme); }
231
+ input[type="radio"]:checked::after { background-color: getAmber($theme); }
232
+
233
+ .matcha-radio-container .ripple {
234
+ background: rgba(getAmberContrast($theme), 0.1) !important; // ok: ripple palette
235
+ }
236
+ }
237
+
238
+ // ── Paleta: orange ─────────────────────────────────────────────────
239
+ &[color="orange"] {
240
+ .matcha-radio-container { color: getOrange($theme); } // [3.1-A]
241
+
242
+ input[type="radio"]:active { border-color: getOrange($theme); }
243
+ input[type="radio"]:checked { border-color: getOrange($theme); }
244
+ input[type="radio"]:checked::after { background-color: getOrange($theme); }
245
+
246
+ .matcha-radio-container .ripple {
247
+ background: rgba(getOrangeContrast($theme), 0.1) !important; // ok: ripple palette
248
+ }
249
+ }
250
+
251
+ // ── Paleta: deep-orange ────────────────────────────────────────────
252
+ &[color="deep-orange"] {
253
+ .matcha-radio-container { color: getDeepOrange($theme); } // [3.1-A]
254
+
255
+ input[type="radio"]:active { border-color: getDeepOrange($theme); }
256
+ input[type="radio"]:checked { border-color: getDeepOrange($theme); }
257
+ input[type="radio"]:checked::after { background-color: getDeepOrange($theme); }
258
+
259
+ .matcha-radio-container .ripple {
260
+ background: rgba(getDeepOrangeContrast($theme), 0.1) !important; // ok: ripple palette
261
+ }
262
+ }
263
+
264
+ // ── Paleta: brown ──────────────────────────────────────────────────
265
+ &[color="brown"] {
266
+ .matcha-radio-container { color: getBrown($theme); } // [3.1-A]
267
+
268
+ input[type="radio"]:active { border-color: getBrown($theme); }
269
+ input[type="radio"]:checked { border-color: getBrown($theme); }
270
+ input[type="radio"]:checked::after { background-color: getBrown($theme); }
271
+
272
+ .matcha-radio-container .ripple {
273
+ background: rgba(getBrownContrast($theme), 0.1) !important; // ok: ripple palette
274
+ }
275
+ }
276
+
277
+ // ── Paleta: grey ───────────────────────────────────────────────────
278
+ &[color="grey"] {
279
+ .matcha-radio-container { color: getGrey($theme); } // [3.1-A]
280
+
281
+ input[type="radio"]:active { border-color: getGrey($theme); }
282
+ input[type="radio"]:checked { border-color: getGrey($theme); }
283
+ input[type="radio"]:checked::after { background-color: getGrey($theme); }
284
+
285
+ .matcha-radio-container .ripple {
286
+ background: rgba(getGreyContrast($theme), 0.1) !important; // ok: ripple palette
287
+ }
288
+ }
289
+
290
+ // ── Paleta: blue-grey ──────────────────────────────────────────────
291
+ &[color="blue-grey"] {
292
+ .matcha-radio-container { color: getBlueGrey($theme); } // [3.1-A]
293
+
294
+ input[type="radio"]:active { border-color: getBlueGrey($theme); }
295
+ input[type="radio"]:checked { border-color: getBlueGrey($theme); }
296
+ input[type="radio"]:checked::after { background-color: getBlueGrey($theme); }
297
+
298
+ .matcha-radio-container .ripple {
299
+ background: rgba(getBlueGreyContrast($theme), 0.1) !important; // ok: ripple palette
300
+ }
301
+ }
302
+
303
+ // ── Semântica: primary ─────────────────────────────────────────────
304
+ &[color="primary"] {
305
+ .matcha-radio-container { color: var(--matcha-color-primary, #{getPrimary($theme)}); } // [3.1-A]
306
+
307
+ input[type="radio"]:active { border-color: var(--matcha-color-primary, #{getPrimary($theme)}); }
308
+ input[type="radio"]:checked { border-color: var(--matcha-color-primary, #{getPrimary($theme)}); }
309
+ input[type="radio"]:checked::after { background-color: var(--matcha-color-primary, #{getPrimary($theme)}); }
310
+
311
+ // [3.1-C] semantic: CSS var com fallback SCSS
312
+ .matcha-radio-container .ripple {
313
+ background: var(--matcha-color-primary-contrast-alpha, #{getPrimaryContrastAlpha($theme)}) !important;
314
+ }
315
+ }
316
+
317
+ // ── Semântica: accent ──────────────────────────────────────────────
318
+ &[color="accent"] {
319
+ .matcha-radio-container { color: var(--matcha-color-accent, #{getAccent($theme)}); } // [3.1-A]
320
+
321
+ input[type="radio"]:active { border-color: var(--matcha-color-accent, #{getAccent($theme)}); }
322
+ input[type="radio"]:checked { border-color: var(--matcha-color-accent, #{getAccent($theme)}); }
323
+ input[type="radio"]:checked::after { background-color: var(--matcha-color-accent, #{getAccent($theme)}); }
324
+
325
+ .matcha-radio-container .ripple {
326
+ background: var(--matcha-color-accent-contrast-alpha, #{getAccentContrastAlpha($theme)}) !important;
327
+ }
328
+ }
329
+
330
+ // ── Semântica: success ─────────────────────────────────────────────
331
+ &[color="success"] {
332
+ .matcha-radio-container { color: getSuccess($theme); } // [3.1-A]
333
+
334
+ input[type="radio"]:active { border-color: getSuccess($theme); }
335
+ input[type="radio"]:checked { border-color: getSuccess($theme); }
336
+ input[type="radio"]:checked::after { background-color: getSuccess($theme); }
337
+
338
+ .matcha-radio-container .ripple {
339
+ background: var(--matcha-color-success-contrast-alpha, #{getSuccessContrastAlpha($theme)}) !important;
340
+ }
341
+ }
342
+
343
+ // ── Semântica: warn ────────────────────────────────────────────────
344
+ &[color="warn"] {
345
+ .matcha-radio-container { color: getWarn($theme); } // [3.1-A]
346
+
347
+ input[type="radio"]:active { border-color: getWarn($theme); }
348
+ input[type="radio"]:checked { border-color: getWarn($theme); }
349
+ input[type="radio"]:checked::after { background-color: getWarn($theme); }
350
+
351
+ .matcha-radio-container .ripple {
352
+ background: var(--matcha-color-warn-contrast-alpha, #{getWarnContrastAlpha($theme)}) !important;
353
+ }
354
+ }
355
+
356
+ // ── Semântica: danger ──────────────────────────────────────────────
357
+ &[color="danger"] {
358
+ .matcha-radio-container { color: getDanger($theme); } // [3.1-A]
359
+
360
+ input[type="radio"]:active { border-color: getDanger($theme); }
361
+ input[type="radio"]:checked { border-color: getDanger($theme); }
362
+ input[type="radio"]:checked::after { background-color: getDanger($theme); }
363
+
364
+ .matcha-radio-container .ripple {
365
+ background: var(--matcha-color-danger-contrast-alpha, #{getDangerContrastAlpha($theme)}) !important;
366
+ }
367
+ }
368
+
369
+ // ── Semântica: info ────────────────────────────────────────────────
370
+ &[color="info"] {
371
+ .matcha-radio-container { color: getInfo($theme); } // [3.1-A]
372
+
373
+ input[type="radio"]:active { border-color: getInfo($theme); }
374
+ input[type="radio"]:checked { border-color: getInfo($theme); }
375
+ input[type="radio"]:checked::after { background-color: getInfo($theme); }
376
+
377
+ .matcha-radio-container .ripple {
378
+ background: var(--matcha-color-info-contrast-alpha, #{getInfoContrastAlpha($theme)}) !important;
379
+ }
380
+ }
381
+
382
+ // ── Error state (aligned with Figma State=Error) ──────────────────
383
+ &.matcha-radio-error,
384
+ &[error] {
385
+ input[type="radio"] {
386
+ border-color: var(--matcha-color-danger, #{getDanger($theme)});
387
+
388
+ &:checked {
389
+ border-color: var(--matcha-color-danger, #{getDanger($theme)});
390
+
391
+ &::after {
392
+ background-color: var(--matcha-color-danger, #{getDanger($theme)});
393
+ }
394
+ }
395
+ }
396
+ }
397
+
398
+ // ── [3.1-D] Disabled — tokens semânticos (sem opacity no host) ─────
399
+ &[disabled] {
400
+ input[type="radio"] {
401
+ border-color: var(--matcha-color-disabled-bg, #{getDisabled($theme)});
402
+ }
403
+
404
+ // Container recebe cor de disabled para que currentColor do state layer seja correto
405
+ // (state layer já está bloqueado por pointer-events, mas garante visual consistente)
406
+ .matcha-radio-container {
407
+ color: var(--matcha-color-disabled-fg, #{getDisabledBgContrast($theme)});
408
+ }
409
+
410
+ .matcha-radio-label {
411
+ color: var(--matcha-color-disabled-fg, #{getDisabledBgContrast($theme)});
412
+ }
413
+ }
414
+
415
+ // ── [3.1-D] :focus-visible — DEVE ficar no mixin (precisa de #{getForeground($theme)}) ──
416
+ // Aplica no container circular (o foco é visível ali, não no input oculto)
417
+ .matcha-radio-container:focus-within {
418
+ outline: var(--matcha-state-focus-ring-width, 2px) solid
419
+ var(--matcha-color-primary, #{getPrimary($theme)});
420
+ outline-offset: var(--matcha-state-focus-ring-offset, 2px);
421
+ }
422
+
423
+ // Label padrão (preservado do original)
424
+ .matcha-radio-label {
425
+ color: getGrey($theme);
426
+ }
427
+ }
428
+ }
429
+
430
+
431
+ // =============================================================================
432
+ // Bloco estrutural — fora do mixin de tema
433
+ // =============================================================================
434
+
435
+ // [3.1-A] Container do radio recebe o state layer
436
+ // input[type="radio"] é replaced element — ::before não renderiza nele
437
+ // O container (.matcha-radio-container) é a área clicável circular
438
+ .matcha-radio-container {
439
+ position: relative;
440
+ overflow: hidden;
441
+ border-radius: 50%; // área de hover circular (Material Design radio pattern)
442
+
443
+ // State layer — segue INTERACTION-SYSTEM.md template
444
+ &::before {
445
+ content: '';
446
+ position: absolute;
447
+ inset: 0;
448
+ background: currentColor; // usa color: getXxx($theme) definido no mixin por variante
449
+ opacity: 0;
450
+ border-radius: inherit;
451
+ pointer-events: none;
452
+ transition: opacity var(--matcha-duration-instant, 80ms) linear;
453
+ }
454
+ }
455
+
456
+ // [3.1-H] Hover/active: [disabled] está em matcha-radio (pai), não no container
457
+ // Seletor de contexto do pai evita ativar o state layer quando desabilitado
458
+ matcha-radio:not([disabled]) .matcha-radio-container:hover::before { opacity: var(--matcha-state-hover, 0.08); }
459
+ matcha-radio:not([disabled]) .matcha-radio-container:active::before { opacity: var(--matcha-state-active, 0.12); }
460
+
461
+ matcha-radio {
462
+ display: inline-flex;
463
+ align-items: center;
464
+ gap: 8px;
465
+ cursor: pointer;
466
+
467
+ input[type="radio"] {
468
+ appearance: none;
469
+ -webkit-appearance: none;
470
+ width: var(--matcha-radio-size, 18px);
471
+ height: var(--matcha-radio-size, 18px);
472
+ padding: 0;
473
+ margin: 0;
474
+ border-radius: 50%;
475
+ border-width: 2px;
476
+ border-style: solid;
477
+ cursor: pointer;
478
+ position: relative;
479
+
480
+ // [3.1-F] transition específico (não 'all')
481
+ transition: border-color 0.2s ease;
482
+
483
+ // outline: none REMOVIDO — :focus-visible no mixin garante acessibilidade
484
+ // &:focus {} REMOVIDO — estava vazio (WCAG 2.4.7)
485
+
486
+ &:checked::after {
487
+ content: '';
488
+ position: absolute;
489
+ left: 3px;
490
+ top: 3px;
491
+ width: 8px;
492
+ height: 8px;
493
+ border-radius: 50%;
494
+ }
495
+ }
496
+
497
+ // Figma matcha/radio label: 12px Medium line 16 (weight 500, diferente do checkbox 400)
498
+ .matcha-radio-label {
499
+ font-size: var(--matcha-text-body-sm, 12px);
500
+ font-weight: var(--matcha-weight-medium, 500);
501
+ line-height: var(--matcha-leading-body-sm, 16px);
502
+ user-select: none;
503
+ cursor: pointer;
504
+ }
505
+
506
+ // [3.1-E] Disabled — sem opacity no host, sem cursor: not-allowed
507
+ // pointer-events: none é suficiente para bloquear interação
508
+ // Cores gerenciadas pelo mixin via tokens semânticos
509
+ &[disabled] {
510
+ pointer-events: none;
511
+ cursor: default;
512
+
513
+ input[type="radio"] {
514
+ // cursor: not-allowed REMOVIDO (pointer-events: none o torna ineficaz)
515
+ }
516
+
517
+ .matcha-radio-label {
518
+ cursor: default;
519
+ }
520
+ }
521
+
522
+ // [3.1-G] Movimento reduzido — obrigatório (WCAG 2.3.3)
523
+ @media (prefers-reduced-motion: reduce) {
524
+ input[type="radio"] { transition: none; }
525
+
526
+ .matcha-radio-container::before { transition: none; }
527
+ }
528
+ }
@@ -0,0 +1,7 @@
1
+ @mixin matcha-ripple-theme($theme) {
2
+
3
+ [matchaRipple] .ripple {
4
+ transform-origin: center;
5
+ pointer-events: none;
6
+ }
7
+ }
@@ -0,0 +1,35 @@
1
+ @use "sass:map";
2
+
3
+ @mixin matcha-scrollbar-theme($theme) {
4
+ $is-dark: map.get($theme, is-dark);
5
+
6
+ :not(.is-mobile) {
7
+ ::-webkit-scrollbar {
8
+ width: var(--matcha-space-200, 16px);
9
+ height: var(--matcha-space-200, 16px);
10
+ background-color: transparent;
11
+ }
12
+
13
+ ::-webkit-scrollbar:hover {
14
+ background-color: var(--matcha-color-surface-hover, #{getBackgroundAlpha($theme)});
15
+ }
16
+
17
+ ::-webkit-scrollbar-thumb {
18
+ border: var(--matcha-space-050, 4px) solid transparent;
19
+ // Thumb: grey #888 + alpha 0x33 (~0.2) — fallback hex pra estabilidade em webkit
20
+ box-shadow: inset 0 0 0 var(--matcha-space-150, 12px) #88888833;
21
+ border-radius: var(--matcha-radius-xl, 16px);
22
+ }
23
+
24
+ ::-webkit-scrollbar-thumb:active {
25
+ // Thumb active: grey #888 + alpha 0x44 (~0.27)
26
+ box-shadow: inset 0 0 0 var(--matcha-space-150, 12px) #88888844;
27
+ border-radius: var(--matcha-radius-xl, 16px);
28
+ }
29
+
30
+ ::-webkit-scrollbar-corner {
31
+ background: transparent;
32
+ }
33
+ }
34
+
35
+ }