@inchurch/matcha-theme 20.276.0 → 20.277.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 (69) hide show
  1. package/abstracts/_functions.scss +0 -26
  2. package/abstracts/_theme-api.scss +230 -0
  3. package/components/app-page-header.scss +16 -17
  4. package/components/matcha-accordion.scss +5 -6
  5. package/components/matcha-audio-player.scss +1 -2
  6. package/components/matcha-autocomplete.scss +10 -11
  7. package/components/matcha-avatar.scss +3 -3
  8. package/components/matcha-badge.scss +11 -11
  9. package/components/matcha-breadcrumb.scss +6 -7
  10. package/components/matcha-button-toggle.scss +2 -2
  11. package/components/matcha-buttons.scss +34 -34
  12. package/components/matcha-calendar.scss +31 -35
  13. package/components/matcha-cards.scss +31 -32
  14. package/components/matcha-chart-card.scss +5 -12
  15. package/components/matcha-checkbox.scss +13 -13
  16. package/components/matcha-chip.scss +2 -2
  17. package/components/matcha-color-pick.scss +1 -2
  18. package/components/matcha-command-palette.scss +17 -18
  19. package/components/matcha-crop.scss +0 -1
  20. package/components/matcha-date.scss +3 -3
  21. package/components/matcha-draggable.scss +4 -5
  22. package/components/matcha-drawer.scss +18 -28
  23. package/components/matcha-drop-list.scss +51 -52
  24. package/components/matcha-emoji.scss +2 -2
  25. package/components/{matcha-uploader.scss → matcha-file-uploader.scss} +185 -116
  26. package/components/matcha-footer.scss +3 -4
  27. package/components/matcha-form-field.scss +3 -3
  28. package/components/matcha-form-section.scss +5 -6
  29. package/components/matcha-header.scss +3 -4
  30. package/components/matcha-hint-text.scss +4 -4
  31. package/components/matcha-horizontal-tree.scss +15 -16
  32. package/components/matcha-icon.scss +27 -27
  33. package/components/matcha-image.scss +2 -3
  34. package/components/matcha-list.scss +11 -12
  35. package/components/matcha-menu.scss +2 -2
  36. package/components/matcha-modal.scss +5 -6
  37. package/components/matcha-nav.scss +16 -16
  38. package/components/matcha-notification.scss +3 -4
  39. package/components/matcha-option.scss +19 -0
  40. package/components/matcha-page-builder.scss +16 -16
  41. package/components/matcha-paginator.scss +6 -7
  42. package/components/matcha-panel.scss +4 -5
  43. package/components/matcha-profile-card.scss +3 -3
  44. package/components/matcha-progress-bar.scss +1 -1
  45. package/components/matcha-radio.scss +6 -6
  46. package/components/matcha-scrollbar.scss +1 -2
  47. package/components/matcha-scrollbox-shadow.scss +35 -37
  48. package/components/matcha-section.scss +5 -9
  49. package/components/matcha-select-multiple.scss +56 -0
  50. package/components/matcha-select.scss +7 -7
  51. package/components/matcha-skeleton.scss +6 -7
  52. package/components/matcha-slide-toggle.scss +33 -299
  53. package/components/matcha-slider.scss +5 -5
  54. package/components/matcha-snack-bar.scss +17 -18
  55. package/components/matcha-spin.scss +12 -103
  56. package/components/matcha-spinner.scss +1 -1
  57. package/components/matcha-stepper.scss +15 -16
  58. package/components/matcha-table.scss +14 -15
  59. package/components/matcha-tabs.scss +22 -24
  60. package/components/matcha-text-editor.scss +78 -78
  61. package/components/matcha-time.scss +2 -2
  62. package/components/matcha-toolbar.scss +1 -1
  63. package/components/matcha-tooltip.scss +14 -12
  64. package/main.scss +7 -2
  65. package/package.json +1 -1
  66. package/tokens/_color-tokens.scss +0 -3
  67. package/tokens/_css-custom-properties.scss +233 -179
  68. package/tokens/_primitives.scss +82 -0
  69. package/tokens/_semantic-aliases.scss +120 -0
@@ -2,12 +2,15 @@
2
2
  // MATCHA DESIGN SYSTEM — Token Source (CSS Custom Properties)
3
3
  // =============================================================================
4
4
  //
5
- // Emits :root variables for Light mode + [data-theme="dark"] overrides,
6
- // enabling runtime theming without Sass recompilation.
5
+ // Emite as CSS custom properties (--matcha-*) de um tema. A classe de tema
6
+ // (ex.: .theme-default-light) recebe as vars via matcha-components($theme) →
7
+ // matcha-css-custom-properties($theme), habilitando override em runtime sem
8
+ // recompilação Sass (base do whitelabel e de temas adicionais — ver
9
+ // abstracts/_theme-api.scss e docs/theming-guide.md).
7
10
  //
8
11
  // 1:1 PARIDADE com Figma variables em DS-PAINEL (fileKey K673r19KQE8lm2S74nQ5ob):
9
12
  // - matcha/primitives (99 vars) → primitives section below
10
- // - matcha/colors (117 vars) → semantic color sections below
13
+ // - matcha/colors (117 vars) → $matcha-color-tokens below
11
14
  // - matcha/interaction (4 vars) → via matcha/color/interaction/* aliases
12
15
  // - matcha/text/* (30 styles) → text-* + leading-* + tracking-* props
13
16
  // - matcha/elevation (4 styles) → shadow-1..4
@@ -17,86 +20,77 @@
17
20
  // - Nome token Figma: `matcha/category/subcategory/variant` (slash)
18
21
  // - Nome CSS var: `--matcha-category-subcategory-variant` (hyphen)
19
22
  // ex.: `matcha/color/surface/card` ↔ `--matcha-color-surface-card`
23
+ // - Chave do mapa $matcha-color-tokens = sufixo da var sem `--matcha-color-`
24
+ // ex.: `surface-card` ↔ `--matcha-color-surface-card`
20
25
  //
21
- // ORDEM DO ARQUIVO (escalável, do mais genérico → mais específico):
22
- // 1. Surface (camadas de fundo)
23
- // 2. Text (cores de texto semântico)
24
- // 3. Icon
25
- // 4. Interaction (disabled, focus)
26
- // 5. Neutral
27
- // 6. Elevation (surface layers + shadow)
28
- // 7. BrandAccent primário + Accent-2 secundário
29
- // 8. Brand Primary
30
- // 9. Feedback — Success, Danger, Warn, Info
31
- // 10. Data — Chart series + decorative palette
32
- // 11. Typography — font/size/weight/leading/tracking
33
- // 12. Spacing / Radius / Border
34
- // 13. Motion / Opacity / State layers
35
- // 14. Icon sizes / Touch targets / Avatar
36
- // 15. Layout — Z-index / Grid
37
- // 16. Naming-parity aliases (Figma→CSS onde os nomes divergem)
26
+ // ESTRUTURA DESTE ARQUIVO:
27
+ // 1. $matcha-color-tokens fonte única dos valores de cor por modo
28
+ // (light/dark), na ordem de emissão. Todo token aqui é sobrescrevível
29
+ // por tema via matcha-emit-color-properties() (abstracts/_theme-api.scss).
30
+ // 2. matcha-default-colors($mode) + $matcha-colors-light/dark — mapas flat
31
+ // derivados (token → valor), consumidos pelo emissor e pela theme API.
32
+ // 3. matcha-emit-color-properties($colors) emissor genérico.
33
+ // 4. matcha-css-custom-properties($theme)mixin canônico (assinatura
34
+ // preservada): cores via emissor + tokens estáticos (spacing, radius,
35
+ // tipografia, motion, grid, …) + aliases.
38
36
  //
39
37
  // =============================================================================
40
38
  @use "sass:map";
41
39
 
42
- @mixin matcha-css-custom-properties($theme) {
43
- $is-dark: map.get($theme, is-dark);
44
- $bg: map.get($theme, background);
45
- $fg: map.get($theme, foreground);
46
-
47
- // ═════════════════════════════════════════════════════════════════════════
48
- // LIGHT = Figma oficial (matcha/color/* JSON export hierárquico)
49
- // DARK = tokens confirmados pelo usuário (flat JSON)
50
- // ═════════════════════════════════════════════════════════════════════════
51
-
40
+ // ═══════════════════════════════════════════════════════════════════════════
41
+ // 1. COLOR TOKENS — fonte única (light/dark) na ordem de emissão
42
+ // LIGHT = Figma oficial (matcha/color/* JSON export hierárquico)
43
+ // DARK = tokens confirmados pelo usuário (flat JSON)
44
+ // ═══════════════════════════════════════════════════════════════════════════
45
+ $matcha-color-tokens: (
52
46
  // ── Surface (9) — matcha/color/surface/* ─────────────────────────────────
53
47
  // 1:1 Figma DSV3 (Light + Dark JSON export 2026-05-29).
54
48
  // Light mode: sage-tinted neutrals (2–4% green hue da marca) + hierarquia perceptível.
55
- --matcha-color-surface-bg: #{if($is-dark, #111318, #f1f4f1)};
49
+ surface-bg: (light: #f1f4f1, dark: #111318),
56
50
  // bg-alpha light usa cor BASE distinta (#f0f2f5) — não é #f1f4f1 com alpha.
57
51
  // Decisão Figma intencional pra sutil shift de tint no estado transparente.
58
- --matcha-color-surface-bg-alpha: #{if($is-dark, rgba(#111318, .5), rgba(#f0f2f5, .5))};
59
- --matcha-color-surface-bg-inverse: #{if($is-dark, #f0f2f5, #111318)};
60
- --matcha-color-surface-bg-inverse-alpha: #{if($is-dark, rgba(#f0f2f5, .5), rgba(#111318, .5))};
52
+ surface-bg-alpha: (light: rgba(#f0f2f5, .5), dark: rgba(#111318, .5)),
53
+ surface-bg-inverse: (light: #111318, dark: #f0f2f5),
54
+ surface-bg-inverse-alpha: (light: rgba(#111318, .5), dark: rgba(#f0f2f5, .5)),
61
55
 
62
56
  // Card soft default — light #f7fcf7 (off-white com tint sage muito sutil).
63
57
  // Reduz glare contra surface-bg #f1f4f1 (Δ ~5 luminance). Pure white só pra
64
58
  // floating overlays via surface-card-strong (modal, command-palette).
65
59
  // Pattern Linear / Vercel / Notion: soft cards default + bright float.
66
- --matcha-color-surface: #{if($is-dark, #1c1f26, #f7fcf7)};
67
- --matcha-color-surface-card: #{if($is-dark, #1c1f26, #f7fcf7)};
60
+ surface: (light: #f7fcf7, dark: #1c1f26),
61
+ surface-card: (light: #f7fcf7, dark: #1c1f26),
68
62
  // Card strong — pure white (light) / lifted dark, pra floating overlays
69
63
  // que precisam máximo destaque sobre scrim. Modal, popover, dropdown,
70
64
  // command-palette. NÃO usar pra cards inline — vira agressivo.
71
- --matcha-color-surface-card-strong: #{if($is-dark, #262a32, #ffffff)};
65
+ surface-card-strong: (light: #ffffff, dark: #262a32),
72
66
  // Canvas aninhada dentro de card (preview stage, code body, inset panels)
73
67
  // Light: sage (= bg da page, cria recorte sutil sobre card off-white)
74
68
  // Dark: mais clara que card (inverte lógica, dá profundidade em vez de buraco)
75
- --matcha-color-surface-inner: #{if($is-dark, #262a32, #f1f4f1)};
69
+ surface-inner: (light: #f1f4f1, dark: #262a32),
76
70
  // card-alpha light usa #ffffff base (não #f7fcf7) — overlay/zebra com white puro
77
- --matcha-color-surface-card-alpha: #{if($is-dark, rgba(#1c1f26, .5), rgba(#ffffff, .85))};
78
- --matcha-color-surface-card-inverse: #{if($is-dark, #ffffff, #1c1f26)};
71
+ surface-card-alpha: (light: rgba(#ffffff, .85), dark: rgba(#1c1f26, .5)),
72
+ surface-card-inverse: (light: #1c1f26, dark: #ffffff),
79
73
 
80
- --matcha-color-surface-sidebar: #{if($is-dark, #0d0f14, #e4ebe5)};
81
- --matcha-color-surface-sidebar-hover: #{if($is-dark, #161920, #d8e1da)};
74
+ surface-sidebar: (light: #e4ebe5, dark: #0d0f14),
75
+ surface-sidebar-hover: (light: #d8e1da, dark: #161920),
82
76
  // table-row-hover light: neutral #f4f4f4 (Figma — não tinted sage)
83
- --matcha-color-surface-table-row-hover: #{if($is-dark, #151a22, #f4f4f4)};
77
+ surface-table-row-hover: (light: #f4f4f4, dark: #151a22),
84
78
 
85
79
  // Border sólido e visível (era rgba(0,0,0,.08) = invisível sobre sage bg)
86
- --matcha-color-surface-border: #{if($is-dark, rgba(255,255,255,.12), #e1e7e2)};
80
+ surface-border: (light: #e1e7e2, dark: rgba(255, 255, 255, .12)),
87
81
  // Border mais forte pra cards elevados (hero, playground — com shadow)
88
- --matcha-color-surface-border-strong: #{if($is-dark, rgba(255,255,255,.24), #c8d2ca)};
89
- --matcha-color-surface-hover: #{if($is-dark, rgba(#111318, .5), rgba(#e4ebe5, .5))};
82
+ surface-border-strong: (light: #c8d2ca, dark: rgba(255, 255, 255, .24)),
83
+ surface-hover: (light: rgba(#e4ebe5, .5), dark: rgba(#111318, .5)),
90
84
 
91
85
  // Aliases (flat) — usados massivamente
92
86
  // Light mode softening 2026-05-18: fg de #1a1d21 (17:1, "tinta preta") → #2a2d33 (12:1 AAA, "tinta carvão").
93
87
  // Inspiração: tom entre Linear (#1a1d21, mais pesado) e GitHub (#1f2328) — reduz fatiga em sessions longas.
94
- --matcha-color-bg: #{if($is-dark, #111318, #f1f4f1)};
95
- --matcha-color-fg: #{if($is-dark, #e8eaed, #2a2d33)};
96
- --matcha-color-fg-alpha: #{if($is-dark, rgba(#e8eaed, .5), rgba(#2a2d33, .5))};
97
- --matcha-color-fg-inverse: #{if($is-dark, #2a2d33, #e8eaed)};
98
- --matcha-color-fg-inverse-alpha: #{if($is-dark, rgba(#2a2d33, .5), rgba(#e8eaed, .5))};
99
- --matcha-color-border: #{if($is-dark, rgba(255,255,255,.12), #e1e7e2)};
88
+ bg: (light: #f1f4f1, dark: #111318),
89
+ fg: (light: #2a2d33, dark: #e8eaed),
90
+ fg-alpha: (light: rgba(#2a2d33, .5), dark: rgba(#e8eaed, .5)),
91
+ fg-inverse: (light: #e8eaed, dark: #2a2d33),
92
+ fg-inverse-alpha: (light: rgba(#e8eaed, .5), dark: rgba(#2a2d33, .5)),
93
+ border: (light: #e1e7e2, dark: rgba(255, 255, 255, .12)),
100
94
 
101
95
  // ── Text (9) — matcha/color/text/* ───────────────────────────────────────
102
96
  // Light mode softening 2026-05-18 — todos os tons recuados ~1 step pra reduzir
@@ -105,56 +99,56 @@
105
99
  // secondary #5a6066 → 6.8:1 (AAA Large + AA Normal, antes #4a5056 8.5:1)
106
100
  // muted #6e7681 → 5.2:1 (AA, antes #5a6a5e 7.4:1)
107
101
  // label #7a818a → 4.6:1 (AA, antes #6b7177 5.9:1)
108
- --matcha-color-text-primary: #{if($is-dark, #e8eaed, #2a2d33)};
109
- --matcha-color-text-inverse: #{if($is-dark, #2a2d33, #e8eaed)};
110
- --matcha-color-text-secondary: #{if($is-dark, rgba(255,255,255,.7), #5a6066)};
102
+ text-primary: (light: #2a2d33, dark: #e8eaed),
103
+ text-inverse: (light: #e8eaed, dark: #2a2d33),
104
+ text-secondary: (light: #5a6066, dark: rgba(255, 255, 255, .7)),
111
105
  // Muted: GitHub-ish neutral (antes era sage-tinted #5a6a5e — verde demais em form helper text)
112
- --matcha-color-text-muted: #{if($is-dark, #a8b5a0, #6e7681)};
113
- --matcha-color-text-label: #{if($is-dark, #bdc1c6, #7a818a)};
106
+ text-muted: (light: #6e7681, dark: #a8b5a0),
107
+ text-label: (light: #7a818a, dark: #bdc1c6),
114
108
  // Placeholder: #7a818a (4.5:1 sobre card — passa AA mantendo low-emphasis)
115
- --matcha-color-text-placeholder: #{if($is-dark, #6e747a, #7a818a)};
116
- --matcha-color-text-hint: #{if($is-dark, #9aa0a6, #7a818a)};
117
- --matcha-color-text-static-light: #ffffff;
118
- --matcha-color-text-static-dark: #1a1d21;
109
+ text-placeholder: (light: #7a818a, dark: #6e747a),
110
+ text-hint: (light: #7a818a, dark: #9aa0a6),
111
+ text-static-light: (light: #ffffff, dark: #ffffff),
112
+ text-static-dark: (light: #1a1d21, dark: #1a1d21),
119
113
 
120
114
  // ── Icon (2) — matcha/color/icon/* ───────────────────────────────────────
121
115
  // Light mode softening 2026-05-18:
122
116
  // default #5f656b → #75767a — recua ícones decorativos (sort, leading) pra não competir com texto
123
117
  // active #1a1d21 → #3d4248 — ainda firme mas menos "tinta china" em toggles/sortable headers
124
- --matcha-color-icon-default: #{if($is-dark, #9aa0a6, #75767a)};
125
- --matcha-color-icon-active: #{if($is-dark, #e8eaed, #3d4248)};
118
+ icon-default: (light: #9aa0a6, dark: #9aa0a6),
119
+ icon-active: (light: #3d4248, dark: #e8eaed),
126
120
 
127
121
  // ── Interaction (4) — matcha/color/interaction/* ─────────────────────────
128
122
  // Light mode: disabled sólido com sage tint (antes alpha sobre bg = inconsistente)
129
- --matcha-color-interaction-disabled-bg: #{if($is-dark, #282c34, #cfd6d1)};
130
- --matcha-color-interaction-disabled-bg-alpha: #{if($is-dark, rgba(#282c34, .5), rgba(#cfd6d1, .5))};
131
- --matcha-color-interaction-disabled-fg: #{if($is-dark, rgba(#e8eaed, .38), #8a9090)};
132
- --matcha-color-interaction-disabled-border: #{if($is-dark, rgba(#e8eaed, .38), #c8d2ca)};
133
- --matcha-color-focus-ring: #{if($is-dark, #a8d94e, #43a047)};
123
+ interaction-disabled-bg: (light: #cfd6d1, dark: #282c34),
124
+ interaction-disabled-bg-alpha: (light: rgba(#cfd6d1, .5), dark: rgba(#282c34, .5)),
125
+ interaction-disabled-fg: (light: #8a9090, dark: rgba(#e8eaed, .38)),
126
+ interaction-disabled-border: (light: #c8d2ca, dark: rgba(#e8eaed, .38)),
127
+ focus-ring: (light: #43a047, dark: #a8d94e),
134
128
  // Aliases legados
135
- --matcha-color-disabled: #{if($is-dark, #282c34, #cfd6d1)};
136
- --matcha-color-disabled-fg: #{if($is-dark, rgba(#e8eaed, .38), #8a9090)};
137
- --matcha-color-disabled-border: #{if($is-dark, rgba(#e8eaed, .38), #c8d2ca)};
138
- --matcha-color-disabled-bg: #{if($is-dark, #282c34, #cfd6d1)};
129
+ disabled: (light: #cfd6d1, dark: #282c34),
130
+ disabled-fg: (light: #8a9090, dark: rgba(#e8eaed, .38)),
131
+ disabled-border: (light: #c8d2ca, dark: rgba(#e8eaed, .38)),
132
+ disabled-bg: (light: #cfd6d1, dark: #282c34),
139
133
 
140
134
  // ── Neutral (4 tokens Figma matcha/color/neutral/*) ───────────────────────
141
135
  // Cor base pra botões e controles sem ênfase semântica (basic, ghost default).
142
136
  // Light: sage-tinted grey | Dark: grey neutro escuro.
143
- --matcha-color-neutral: #{if($is-dark, #282c34, #e4ebe5)};
144
- --matcha-color-neutral-contrast: #{if($is-dark, #e8eaed, #1a1d21)};
145
- --matcha-color-neutral-alpha: #{if($is-dark, rgba(#e8eaed, .1), rgba(#1a1d21, .08))};
146
- --matcha-color-neutral-hover: #{if($is-dark, #333842, #d8e1da)};
137
+ neutral: (light: #e4ebe5, dark: #282c34),
138
+ neutral-contrast: (light: #1a1d21, dark: #e8eaed),
139
+ neutral-alpha: (light: rgba(#1a1d21, .08), dark: rgba(#e8eaed, .1)),
140
+ neutral-hover: (light: #d8e1da, dark: #333842),
147
141
 
148
142
  // ── Elevation (6) — matcha/color/elevation/* ─────────────────────────────
149
- --matcha-color-elevation-surface-1: #{if($is-dark, #1c1f26, #f8faf8)}; // cards, dropdowns (sage)
150
- --matcha-color-elevation-surface-2: #{if($is-dark, #262a32, #ffffff)}; // menus, floating
151
- --matcha-color-elevation-surface-3: #{if($is-dark, #2e333c, #ffffff)}; // modals, drawers
143
+ elevation-surface-1: (light: #f8faf8, dark: #1c1f26), // cards, dropdowns (sage)
144
+ elevation-surface-2: (light: #ffffff, dark: #262a32), // menus, floating
145
+ elevation-surface-3: (light: #ffffff, dark: #2e333c), // modals, drawers
152
146
  // Shadow base: Figma light usa tinta accent #1A2C1E (não preto puro), dark usa #000000
153
- --matcha-color-elevation-shadow: #{if($is-dark, #000000, #1a2c1e)};
154
- --matcha-color-elevation-shadow-tint: #{if($is-dark, #000000, #1a2c1e)}; // tint da marca pra shadows light
155
- --matcha-color-elevation-scrim: #000000;
147
+ elevation-shadow: (light: #1a2c1e, dark: #000000),
148
+ elevation-shadow-tint: (light: #1a2c1e, dark: #000000), // tint da marca pra shadows light
149
+ elevation-scrim: (light: #000000, dark: #000000),
156
150
  // Figma matcha/color/state-layer/fg (camada sobre interações)
157
- --matcha-color-state-layer-fg: #{if($is-dark, #ffffff, #000000)};
151
+ state-layer-fg: (light: #000000, dark: #ffffff),
158
152
 
159
153
  // ── Accent (10) — matcha/color/accent/* ──────────────────────────────────
160
154
  // Brand inChurch: lime/chartreuse #86BD00 (hue 78°, "matcha tea").
@@ -166,134 +160,183 @@
166
160
  // accent-contrast 1:1 Figma DSV3: rgba(0,0,0,.87) em AMBOS os modos (Light + Dark).
167
161
  // É label-on-accent ripple/text token, semantica é "preto sobre amarelo-lima". Pra label
168
162
  // branco em Filled buttons use accent/text-on (branco no Light / quase-preto no Dark).
169
- --matcha-color-accent: #{if($is-dark, #a8d94e, #54a71d)};
170
- --matcha-color-accent-contrast: rgba(0,0,0,.87);
171
- --matcha-color-accent-contrast-alpha: rgba(0,0,0,.1);
163
+ accent: (light: #54a71d, dark: #a8d94e),
164
+ accent-contrast: (light: rgba(0, 0, 0, .87), dark: rgba(0, 0, 0, .87)),
165
+ accent-contrast-alpha: (light: rgba(0, 0, 0, .1), dark: rgba(0, 0, 0, .1)),
172
166
  // Figma matcha/color/accent/text-on — branco puro Light / quase preto Dark.
173
167
  // Dedicado pra foreground sobre accent/default em Filled buttons, icon buttons.
174
168
  // Garante contraste ≥ 3:1 em ambos modos (supera accent/contrast que é preto fixo).
175
- --matcha-color-accent-text-on: #{if($is-dark, #1a1d21, #ffffff)};
176
- --matcha-color-accent-alpha: #{if($is-dark, rgba(#a8d94e, .1), rgba(#54a71d, .1))};
169
+ accent-text-on: (light: #ffffff, dark: #1a1d21),
170
+ accent-alpha: (light: rgba(#54a71d, .1), dark: rgba(#a8d94e, .1)),
177
171
  // Light/dark auxiliares: spring green tint (hue 143° matching accent base)
178
- --matcha-color-accent-light: #{if($is-dark, #b9f6ca, #b9e3a3)};
179
- --matcha-color-accent-dark: #{if($is-dark, #c5e1a5, #3a7515)};
172
+ accent-light: (light: #b9e3a3, dark: #b9f6ca),
173
+ accent-dark: (light: #3a7515, dark: #c5e1a5),
180
174
  // Hover/pressed: step ~10% darker mesma hue (3.0:1 → 3.75:1 → 4.7:1)
181
- --matcha-color-accent-hover: #{if($is-dark, #bee57a, #4b9519)};
182
- --matcha-color-accent-pressed: #{if($is-dark, #d4eea0, #428316)};
175
+ accent-hover: (light: #4b9519, dark: #bee57a),
176
+ accent-pressed: (light: #428316, dark: #d4eea0),
183
177
  // Surface tints — light spring green
184
- --matcha-color-accent-surface-hover: #{if($is-dark, #161e12, #e8f3dc)};
185
- --matcha-color-accent-surface-pressed: #{if($is-dark, #1f2d18, #cbe4ab)};
178
+ accent-surface-hover: (light: #e8f3dc, dark: #161e12),
179
+ accent-surface-pressed: (light: #cbe4ab, dark: #1f2d18),
186
180
 
187
181
  // ── Accent Secondary (teal — 4 tokens Figma matcha/color/accent-2/*) ─────
188
182
  // Light #00796b (teal-700) | Dark #4fb7ad (teal-light)
189
- --matcha-color-accent-2: #{if($is-dark, #4fb7ad, #00796b)};
190
- --matcha-color-accent-2-contrast: #ffffff;
191
- --matcha-color-accent-2-alpha: #{if($is-dark, rgba(#4fb7ad, .12), rgba(#00796b, .10))};
192
- --matcha-color-accent-2-surface: #{if($is-dark, #1d332e, #e0f0ee)};
183
+ accent-2: (light: #00796b, dark: #4fb7ad),
184
+ accent-2-contrast: (light: #ffffff, dark: #ffffff),
185
+ accent-2-alpha: (light: rgba(#00796b, .10), dark: rgba(#4fb7ad, .12)),
186
+ accent-2-surface: (light: #e0f0ee, dark: #1d332e),
193
187
 
194
188
  // ── Primary (10) — matcha/color/primary/* ────────────────────────────────
195
189
  // Light #1664c2 (blue-700) | Dark #64b5f6 (blue-300)
196
- --matcha-color-primary: #{if($is-dark, #64b5f6, #1664c2)};
197
- --matcha-color-primary-contrast: #{if($is-dark, rgba(0,0,0,.87), #ffffff)};
198
- --matcha-color-primary-contrast-alpha: #{if($is-dark, rgba(0,0,0,.1), rgba(255,255,255,.1))};
199
- --matcha-color-primary-alpha: #{if($is-dark, rgba(#64b5f6, .1), rgba(#1664c2, .1))};
200
- --matcha-color-primary-light: #{if($is-dark, #bbdefb, #b3d7fd)};
201
- --matcha-color-primary-dark: #{if($is-dark, #90caf9, #0d3c8c)};
202
- --matcha-color-primary-hover: #{if($is-dark, #90caf9, #2576d2)};
203
- --matcha-color-primary-pressed: #{if($is-dark, #bbdefb, #378ce1)};
204
- --matcha-color-primary-surface-hover: #{if($is-dark, #141922, #e4eefa)};
205
- --matcha-color-primary-surface-pressed: #{if($is-dark, #1a2436, #cddef5)};
190
+ primary: (light: #1664c2, dark: #64b5f6),
191
+ primary-contrast: (light: #ffffff, dark: rgba(0, 0, 0, .87)),
192
+ primary-contrast-alpha: (light: rgba(255, 255, 255, .1), dark: rgba(0, 0, 0, .1)),
193
+ primary-alpha: (light: rgba(#1664c2, .1), dark: rgba(#64b5f6, .1)),
194
+ primary-light: (light: #b3d7fd, dark: #bbdefb),
195
+ primary-dark: (light: #0d3c8c, dark: #90caf9),
196
+ primary-hover: (light: #2576d2, dark: #90caf9),
197
+ primary-pressed: (light: #378ce1, dark: #bbdefb),
198
+ primary-surface-hover: (light: #e4eefa, dark: #141922),
199
+ primary-surface-pressed: (light: #cddef5, dark: #1a2436),
206
200
 
207
201
  // ── Feedback — Success (9) ───────────────────────────────────────────────
208
- --matcha-color-success: #{if($is-dark, #69f0ae, #2e7d32)};
209
- --matcha-color-success-contrast: #{if($is-dark, rgba(0,0,0,.87), #ffffff)};
210
- --matcha-color-success-contrast-alpha: #{if($is-dark, rgba(0,0,0,.1), rgba(255,255,255,.1))};
211
- --matcha-color-success-alpha: #{if($is-dark, rgba(#69f0ae, .1), rgba(#2e7d32, .1))};
212
- --matcha-color-success-hover: #{if($is-dark, #4cd992, #388e3c)};
213
- --matcha-color-success-pressed: #{if($is-dark, #33c078, #43a047)};
214
- --matcha-color-success-fill: #{if($is-dark, #43a047, #2e7d32)};
215
- --matcha-color-success-surface-hover: #{if($is-dark, #121d17, #e8f5e9)};
216
- --matcha-color-success-surface-pressed: #{if($is-dark, #192f24, #c8e6c9)};
202
+ success: (light: #2e7d32, dark: #69f0ae),
203
+ success-contrast: (light: #ffffff, dark: rgba(0, 0, 0, .87)),
204
+ success-contrast-alpha: (light: rgba(255, 255, 255, .1), dark: rgba(0, 0, 0, .1)),
205
+ success-alpha: (light: rgba(#2e7d32, .1), dark: rgba(#69f0ae, .1)),
206
+ success-hover: (light: #388e3c, dark: #4cd992),
207
+ success-pressed: (light: #43a047, dark: #33c078),
208
+ success-fill: (light: #2e7d32, dark: #43a047),
209
+ success-surface-hover: (light: #e8f5e9, dark: #121d17),
210
+ success-surface-pressed: (light: #c8e6c9, dark: #192f24),
217
211
 
218
212
  // ── Feedback — Danger (9) ────────────────────────────────────────────────
219
- --matcha-color-danger: #{if($is-dark, #ef9a9a, #c81010)};
220
- --matcha-color-danger-contrast: #{if($is-dark, rgba(0,0,0,.87), #ffffff)};
221
- --matcha-color-danger-contrast-alpha: #{if($is-dark, rgba(0,0,0,.1), rgba(255,255,255,.1))};
222
- --matcha-color-danger-alpha: #{if($is-dark, rgba(#ef9a9a, .1), rgba(#c81010, .1))};
223
- --matcha-color-danger-hover: #{if($is-dark, #f4b8b8, #da2c2c)};
224
- --matcha-color-danger-pressed: #{if($is-dark, #f7d0d0, #e64848)};
225
- --matcha-color-danger-fill: #{if($is-dark, #e53935, #c81010)};
226
- --matcha-color-danger-surface-hover: #{if($is-dark, #1d1616, #fae8e8)};
227
- --matcha-color-danger-surface-pressed: #{if($is-dark, #2f2121, #f5d2d2)};
213
+ danger: (light: #c81010, dark: #ef9a9a),
214
+ danger-contrast: (light: #ffffff, dark: rgba(0, 0, 0, .87)),
215
+ danger-contrast-alpha: (light: rgba(255, 255, 255, .1), dark: rgba(0, 0, 0, .1)),
216
+ danger-alpha: (light: rgba(#c81010, .1), dark: rgba(#ef9a9a, .1)),
217
+ danger-hover: (light: #da2c2c, dark: #f4b8b8),
218
+ danger-pressed: (light: #e64848, dark: #f7d0d0),
219
+ danger-fill: (light: #c81010, dark: #e53935),
220
+ danger-surface-hover: (light: #fae8e8, dark: #1d1616),
221
+ danger-surface-pressed: (light: #f5d2d2, dark: #2f2121),
228
222
 
229
223
  // ── Feedback — Warn (9) ──────────────────────────────────────────────────
230
224
  // Light #a64e00 (âmbar escuro) | Dark #ffb74d (orange-300)
231
- --matcha-color-warn: #{if($is-dark, #ffb74d, #a64e00)};
232
- --matcha-color-warn-contrast: #{if($is-dark, rgba(0,0,0,.87), #ffffff)};
233
- --matcha-color-warn-contrast-alpha: #{if($is-dark, rgba(0,0,0,.1), rgba(255,255,255,.1))};
234
- --matcha-color-warn-alpha: #{if($is-dark, rgba(#ffb74d, .1), rgba(#a64e00, .1))};
235
- --matcha-color-warn-hover: #{if($is-dark, #e69f33, #924200)};
236
- --matcha-color-warn-pressed: #{if($is-dark, #cc881a, #7e3600)};
237
- --matcha-color-warn-fill: #{if($is-dark, #fb8c00, #a64e00)};
238
- --matcha-color-warn-surface-hover: #{if($is-dark, #1e1910, #fcf0e1)};
239
- --matcha-color-warn-surface-pressed: #{if($is-dark, #2f2616, #f8e1c3)};
225
+ warn: (light: #a64e00, dark: #ffb74d),
226
+ warn-contrast: (light: #ffffff, dark: rgba(0, 0, 0, .87)),
227
+ warn-contrast-alpha: (light: rgba(255, 255, 255, .1), dark: rgba(0, 0, 0, .1)),
228
+ warn-alpha: (light: rgba(#a64e00, .1), dark: rgba(#ffb74d, .1)),
229
+ warn-hover: (light: #924200, dark: #e69f33),
230
+ warn-pressed: (light: #7e3600, dark: #cc881a),
231
+ warn-fill: (light: #a64e00, dark: #fb8c00),
232
+ warn-surface-hover: (light: #fcf0e1, dark: #1e1910),
233
+ warn-surface-pressed: (light: #f8e1c3, dark: #2f2616),
240
234
 
241
235
  // ── Feedback — Info (8) ──────────────────────────────────────────────────
242
- --matcha-color-info: #{if($is-dark, #4090d8, #0a2fc2)};
243
- --matcha-color-info-contrast: #ffffff;
244
- --matcha-color-info-contrast-alpha: rgba(255,255,255,.1);
245
- --matcha-color-info-alpha: #{if($is-dark, rgba(#4090d8, .1), rgba(#0a2fc2, .1))};
246
- --matcha-color-info-hover: #{if($is-dark, #5aa0e0, #294cd4)};
247
- --matcha-color-info-pressed: #{if($is-dark, #74b0e8, #4265e0)};
248
- --matcha-color-info-surface-hover: #{if($is-dark, #0f141e, #ebeefa)};
249
- --matcha-color-info-surface-pressed: #{if($is-dark, #131f31, #d8def5)};
236
+ info: (light: #0a2fc2, dark: #4090d8),
237
+ info-contrast: (light: #ffffff, dark: #ffffff),
238
+ info-contrast-alpha: (light: rgba(255, 255, 255, .1), dark: rgba(255, 255, 255, .1)),
239
+ info-alpha: (light: rgba(#0a2fc2, .1), dark: rgba(#4090d8, .1)),
240
+ info-hover: (light: #294cd4, dark: #5aa0e0),
241
+ info-pressed: (light: #4265e0, dark: #74b0e8),
242
+ info-surface-hover: (light: #ebeefa, dark: #0f141e),
243
+ info-surface-pressed: (light: #d8def5, dark: #131f31),
244
+
245
+ // ── Palette (18) — matcha/color/palette/* ────────────────────────────────
246
+ palette-teal: (light: #00796b, dark: #4fb7ad),
247
+ palette-teal-light: (light: #4fb7ad, dark: #009688),
248
+ palette-teal-alpha: (light: rgba(#00796b, .1), dark: rgba(#4fb7ad, .1)),
249
+ palette-light-blue: (light: #0288d1, dark: #54c5f7),
250
+ palette-light-blue-light: (light: #54c5f7, dark: #03a9f4),
251
+ palette-light-blue-alpha: (light: rgba(#0288d1, .1), dark: rgba(#54c5f7, .1)),
252
+ palette-purple: (light: #9c27b0, dark: #bb6ac8),
253
+ palette-purple-light: (light: #bb6ac8, dark: #9c27b0),
254
+ palette-purple-alpha: (light: rgba(#9c27b0, .1), dark: rgba(#bb6ac8, .1)),
255
+ palette-pink: (light: #d81b60, dark: #e46291),
256
+ palette-pink-light: (light: #e46291, dark: #d81b60),
257
+ palette-pink-alpha: (light: rgba(#d81b60, .1), dark: rgba(#e46291, .1)),
258
+ palette-orange: (light: #e65100, dark: #f9a25d),
259
+ palette-orange-light: (light: #f9a25d, dark: #f77814),
260
+ palette-orange-alpha: (light: rgba(#e65100, .1), dark: rgba(#f9a25d, .1)),
261
+ palette-yellow: (light: #ffa000, dark: #efd64f),
262
+ palette-yellow-light: (light: #efd64f, dark: #e8c300),
263
+ palette-yellow-alpha: (light: rgba(#ffa000, .1), dark: rgba(#efd64f, .1)),
264
+
265
+ // ── Chart (5) — matcha/color/chart/* ─────────────────────────────────────
266
+ chart-series-1: (light: #615ce5, dark: #8782f2),
267
+ chart-series-2: (light: #42a147, dark: #66ba6b),
268
+ chart-series-3: (light: #ed6645, dark: #f5876b),
269
+ chart-series-4: (light: #c28700, dark: #ffc93d),
270
+ chart-series-5: (light: #008094, dark: #26c2d9),
271
+ );
272
+
273
+ // ═══════════════════════════════════════════════════════════════════════════
274
+ // 2. MAPAS FLAT POR MODO — token → valor (derivados de $matcha-color-tokens).
275
+ // Consumidos pelo emissor abaixo e pela theme API
276
+ // (matcha-build-color-map() em abstracts/_theme-api.scss).
277
+ // ═══════════════════════════════════════════════════════════════════════════
278
+ @function matcha-default-colors($mode) {
279
+ $out: ();
280
+ @each $token, $modes in $matcha-color-tokens {
281
+ $out: map.set($out, $token, map.get($modes, $mode));
282
+ }
283
+ @return $out;
284
+ }
285
+
286
+ $matcha-colors-light: matcha-default-colors(light);
287
+ $matcha-colors-dark: matcha-default-colors(dark);
288
+
289
+ // ═══════════════════════════════════════════════════════════════════════════
290
+ // 3. EMISSOR GENÉRICO — mapa flat (token → valor) vira --matcha-color-<token>.
291
+ // Usado pelo mixin canônico abaixo e por matcha-define-theme() (theme API).
292
+ // ═══════════════════════════════════════════════════════════════════════════
293
+ // $aliases (opcional): token → "--matcha-prim-*". Quando presente p/ um token, emite
294
+ // `var(--matcha-prim-*)` (Camada 2 referencia a primitiva) em vez do hex literal.
295
+ // A rota clássica (matcha-css-custom-properties) passa $matcha-prim-aliases-{light,dark};
296
+ // matcha-define-theme() não passa (mantém hex computado dos seeds — whitelabel intacto).
297
+ @mixin matcha-emit-color-properties($colors, $aliases: ()) {
298
+ @each $token, $value in $colors {
299
+ $alias: map.get($aliases, $token);
300
+ @if $alias {
301
+ --matcha-color-#{$token}: var(#{$alias});
302
+ } @else {
303
+ --matcha-color-#{$token}: #{$value};
304
+ }
305
+ }
306
+ }
307
+
308
+ // ═══════════════════════════════════════════════════════════════════════════
309
+ // 4. MIXIN CANÔNICO — assinatura preservada (retrocompat).
310
+ // ═══════════════════════════════════════════════════════════════════════════
311
+ @mixin matcha-css-custom-properties($theme) {
312
+ $is-dark: map.get($theme, is-dark);
313
+
314
+ // ── Cores semânticas (ver $matcha-color-tokens acima) ────────────────────
315
+ // Aliases sólidos → var(--matcha-prim-*); derivados/alphas/cross-semantic → hex literal.
316
+ @include matcha-emit-color-properties(
317
+ if($is-dark, $matcha-colors-dark, $matcha-colors-light),
318
+ if($is-dark, $matcha-prim-aliases-dark, $matcha-prim-aliases-light)
319
+ );
250
320
 
251
321
  // ── Feedback namespace (matcha/color/feedback/* canon DSV3) ───────────────
252
322
  // Aliases semânticos pros tokens base — namespace dedicado pra status/banners/
253
323
  // table row variants. Naming match Figma DSV3 (flat: feedback/info, sem suffix).
254
- --matcha-color-feedback-info: var(--matcha-color-info);
324
+ --matcha-color-feedback-info: var(--matcha-color-info);
255
325
  --matcha-color-feedback-success: var(--matcha-color-success);
256
- --matcha-color-feedback-warn: var(--matcha-color-warn);
257
- --matcha-color-feedback-danger: var(--matcha-color-danger);
326
+ --matcha-color-feedback-warn: var(--matcha-color-warn);
327
+ --matcha-color-feedback-danger: var(--matcha-color-danger);
258
328
 
259
329
  // Variantes alpha pra row backgrounds, badges filled-alpha, etc.
260
- --matcha-color-feedback-info-alpha: var(--matcha-color-info-alpha);
330
+ --matcha-color-feedback-info-alpha: var(--matcha-color-info-alpha);
261
331
  --matcha-color-feedback-success-alpha: var(--matcha-color-success-alpha);
262
- --matcha-color-feedback-warn-alpha: var(--matcha-color-warn-alpha);
263
- --matcha-color-feedback-danger-alpha: var(--matcha-color-danger-alpha);
332
+ --matcha-color-feedback-warn-alpha: var(--matcha-color-warn-alpha);
333
+ --matcha-color-feedback-danger-alpha: var(--matcha-color-danger-alpha);
264
334
 
265
335
  // Surface hover (bg tinted pra hover em row de table)
266
- --matcha-color-feedback-info-surface-hover: var(--matcha-color-info-surface-hover);
336
+ --matcha-color-feedback-info-surface-hover: var(--matcha-color-info-surface-hover);
267
337
  --matcha-color-feedback-success-surface-hover: var(--matcha-color-success-surface-hover);
268
- --matcha-color-feedback-warn-surface-hover: var(--matcha-color-warn-surface-hover);
269
- --matcha-color-feedback-danger-surface-hover: var(--matcha-color-danger-surface-hover);
270
-
271
- // ── Palette (18) — matcha/color/palette/* ────────────────────────────────
272
- --matcha-color-palette-teal: #{if($is-dark, #4fb7ad, #00796b)};
273
- --matcha-color-palette-teal-light: #{if($is-dark, #009688, #4fb7ad)};
274
- --matcha-color-palette-teal-alpha: #{if($is-dark, rgba(#4fb7ad, .1), rgba(#00796b, .1))};
275
- --matcha-color-palette-light-blue: #{if($is-dark, #54c5f7, #0288d1)};
276
- --matcha-color-palette-light-blue-light: #{if($is-dark, #03a9f4, #54c5f7)};
277
- --matcha-color-palette-light-blue-alpha: #{if($is-dark, rgba(#54c5f7, .1), rgba(#0288d1, .1))};
278
- --matcha-color-palette-purple: #{if($is-dark, #bb6ac8, #9c27b0)};
279
- --matcha-color-palette-purple-light: #{if($is-dark, #9c27b0, #bb6ac8)};
280
- --matcha-color-palette-purple-alpha: #{if($is-dark, rgba(#bb6ac8, .1), rgba(#9c27b0, .1))};
281
- --matcha-color-palette-pink: #{if($is-dark, #e46291, #d81b60)};
282
- --matcha-color-palette-pink-light: #{if($is-dark, #d81b60, #e46291)};
283
- --matcha-color-palette-pink-alpha: #{if($is-dark, rgba(#e46291, .1), rgba(#d81b60, .1))};
284
- --matcha-color-palette-orange: #{if($is-dark, #f9a25d, #e65100)};
285
- --matcha-color-palette-orange-light: #{if($is-dark, #f77814, #f9a25d)};
286
- --matcha-color-palette-orange-alpha: #{if($is-dark, rgba(#f9a25d, .1), rgba(#e65100, .1))};
287
- --matcha-color-palette-yellow: #{if($is-dark, #efd64f, #ffa000)};
288
- --matcha-color-palette-yellow-light: #{if($is-dark, #e8c300, #efd64f)};
289
- --matcha-color-palette-yellow-alpha: #{if($is-dark, rgba(#efd64f, .1), rgba(#ffa000, .1))};
290
-
291
- // ── Chart (5) — matcha/color/chart/* ─────────────────────────────────────
292
- --matcha-color-chart-series-1: #{if($is-dark, #8782f2, #615ce5)};
293
- --matcha-color-chart-series-2: #{if($is-dark, #66ba6b, #42a147)};
294
- --matcha-color-chart-series-3: #{if($is-dark, #f5876b, #ed6645)};
295
- --matcha-color-chart-series-4: #{if($is-dark, #ffc93d, #c28700)};
296
- --matcha-color-chart-series-5: #{if($is-dark, #26c2d9, #008094)};
338
+ --matcha-color-feedback-warn-surface-hover: var(--matcha-color-warn-surface-hover);
339
+ --matcha-color-feedback-danger-surface-hover: var(--matcha-color-danger-surface-hover);
297
340
 
298
341
  // ── Spacing (14 tokens — matches matcha/space/* exato) ────────────────────
299
342
  --matcha-space-025: 2px;
@@ -440,6 +483,17 @@
440
483
  --matcha-shadow-3: #{if($is-dark, $shadow-3-dark, $shadow-3-light)};
441
484
  --matcha-shadow-4: #{if($is-dark, $shadow-4-dark, $shadow-4-light)};
442
485
 
486
+ // ── Vars estruturais de componente (mode-dependentes, ex-@if $is-dark) ───
487
+ // Bordas que só existiam no dark + shimmer do skeleton. No light viram no-op
488
+ // (0/transparent) pra não alterar layout. O $is-dark aqui é o seletor de modo
489
+ // legítimo da emissão (mesmo papel dos shadows acima) — não é o $is-dark
490
+ // espalhado nos componentes, que foi eliminado na migração runtime-theming.
491
+ --matcha-skeleton-shimmer: #{if($is-dark, rgba(255, 255, 255, 0.07), rgba(255, 255, 255, 0.5))};
492
+ --matcha-chart-card-border: #{if($is-dark, 1px solid rgba(#212121, 0.06), 0 solid transparent)};
493
+ --matcha-section-border: #{if($is-dark, 1px solid rgba(#212121, 0.06), 0 solid transparent)};
494
+ --matcha-calendar-border: #{if($is-dark, 1px solid var(--matcha-color-surface-border), 0 solid transparent)};
495
+ --matcha-drawer-border: #{if($is-dark, 1px solid var(--matcha-color-surface-border), 0 solid transparent)};
496
+
443
497
  // ── Animation (4 tokens — matches matcha/duration/* from Figma) ──────────
444
498
  --matcha-duration-instant: 80ms;
445
499
  --matcha-duration-fast: 200ms;