@inchurch/matcha-theme 20.0.11 → 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 (116) hide show
  1. package/abstracts/_colors.scss +404 -404
  2. package/abstracts/_elevation.scss +102 -102
  3. package/abstracts/_functions.scss +1186 -1212
  4. package/abstracts/_media-breakpoint.scss +23 -23
  5. package/abstracts/_theme-api.scss +230 -0
  6. package/abstracts/_typography.scss +127 -127
  7. package/base/_reset.scss +438 -438
  8. package/components/app-page-header.scss +259 -0
  9. package/components/matcha-accordion.scss +293 -157
  10. package/components/matcha-audio-player.scss +1 -2
  11. package/components/matcha-autocomplete.scss +10 -11
  12. package/components/matcha-avatar.scss +173 -33
  13. package/components/matcha-badge.scss +15 -15
  14. package/components/matcha-breadcrumb.scss +231 -126
  15. package/components/matcha-button-toggle.scss +46 -2
  16. package/components/matcha-buttons.scss +908 -784
  17. package/components/matcha-calendar.scss +99 -35
  18. package/components/matcha-cards.scss +58 -33
  19. package/components/matcha-chart-card.scss +5 -12
  20. package/components/matcha-checkbox.scss +191 -490
  21. package/components/matcha-chip.scss +297 -212
  22. package/components/matcha-color-pick.scss +1 -2
  23. package/components/matcha-command-palette.scss +290 -63
  24. package/components/matcha-crop.scss +406 -172
  25. package/components/matcha-date.scss +81 -81
  26. package/components/matcha-divider.scss +86 -31
  27. package/components/matcha-draggable.scss +4 -5
  28. package/components/matcha-drawer.scss +207 -66
  29. package/components/matcha-drop-image.scss +14 -0
  30. package/components/matcha-drop-list.scss +87 -47
  31. package/components/matcha-emoji.scss +2 -2
  32. package/components/matcha-empty-state.scss +195 -83
  33. package/components/matcha-file-uploader.scss +462 -0
  34. package/components/matcha-flag.scss +93 -52
  35. package/components/matcha-footer.scss +67 -164
  36. package/components/matcha-form-field.scss +55 -3
  37. package/components/matcha-form-section.scss +100 -101
  38. package/components/matcha-header.scss +134 -325
  39. package/components/matcha-highlight.scss +65 -197
  40. package/components/matcha-hint-text.scss +25 -4
  41. package/components/matcha-horizontal-tree.scss +316 -317
  42. package/components/matcha-icon.scss +37 -45
  43. package/components/matcha-image.scss +2 -3
  44. package/components/matcha-list.scss +14 -15
  45. package/components/matcha-menu.scss +15 -2
  46. package/components/matcha-modal.scss +59 -86
  47. package/components/matcha-nav.scss +362 -231
  48. package/components/matcha-notification.scss +412 -197
  49. package/components/matcha-option.scss +98 -23
  50. package/components/matcha-page-builder.scss +16 -16
  51. package/components/matcha-paginator.scss +688 -235
  52. package/components/matcha-panel.scss +42 -27
  53. package/components/matcha-profile-card.scss +50 -50
  54. package/components/matcha-progress-bar.scss +257 -153
  55. package/components/matcha-radio.scss +244 -452
  56. package/components/matcha-scrollbar.scss +1 -2
  57. package/components/matcha-scrollbox-shadow.scss +120 -122
  58. package/components/matcha-section.scss +5 -9
  59. package/components/matcha-select-multiple.scss +56 -0
  60. package/components/matcha-select.scss +10 -10
  61. package/components/matcha-skeleton.scss +24 -7
  62. package/components/matcha-slide-toggle.scss +80 -301
  63. package/components/matcha-slider.scss +174 -77
  64. package/components/matcha-snack-bar.scss +123 -131
  65. package/components/matcha-spin.scss +12 -103
  66. package/components/matcha-spinner.scss +76 -57
  67. package/components/matcha-status-pill.scss +82 -0
  68. package/components/matcha-stepper.scss +376 -177
  69. package/components/matcha-table.scss +568 -785
  70. package/components/matcha-tabs.scss +622 -469
  71. package/components/matcha-text-editor.scss +78 -78
  72. package/components/matcha-time.scss +2 -2
  73. package/components/matcha-toolbar.scss +359 -206
  74. package/components/matcha-tooltip.scss +158 -62
  75. package/components/matcha-tree-view.scss +189 -0
  76. package/fonts/manrope/manrope-latin-ext.woff2 +0 -0
  77. package/fonts/manrope/manrope-latin.woff2 +0 -0
  78. package/layout/matcha-page-layout.scss +4 -4
  79. package/main.scss +237 -265
  80. package/package.json +1 -1
  81. package/tokens/_animations-tokens.scss +37 -37
  82. package/tokens/_breakpoints-tokens.scss +35 -26
  83. package/tokens/_color-tokens.scss +1149 -1152
  84. package/tokens/_css-custom-properties.scss +704 -568
  85. package/tokens/_primitives.scss +82 -0
  86. package/tokens/_semantic-aliases.scss +120 -0
  87. package/tokens/_spacing-tokens.scss +94 -94
  88. package/vendors/angular-editor.scss +56 -56
  89. package/vendors/angular-material-fixes.scss +297 -297
  90. package/vendors/charts.scss +92 -92
  91. package/vendors/ng5-slider.scss +56 -56
  92. package/vendors/ngx-material-timepicker.scss +50 -50
  93. package/components/matcha-uploader.scss +0 -215
  94. package/fonts/CircularStd-Black.eot +0 -0
  95. package/fonts/CircularStd-Black.svg +0 -3426
  96. package/fonts/CircularStd-Black.ttf +0 -0
  97. package/fonts/CircularStd-Black.woff +0 -0
  98. package/fonts/CircularStd-Black.woff2 +0 -0
  99. package/fonts/CircularStd-Bold.eot +0 -0
  100. package/fonts/CircularStd-Bold.otf +0 -0
  101. package/fonts/CircularStd-Bold.svg +0 -13532
  102. package/fonts/CircularStd-Bold.ttf +0 -0
  103. package/fonts/CircularStd-Bold.woff +0 -0
  104. package/fonts/CircularStd-Bold.woff2 +0 -0
  105. package/fonts/CircularStd-Medium.eot +0 -0
  106. package/fonts/CircularStd-Medium.otf +0 -0
  107. package/fonts/CircularStd-Medium.svg +0 -13511
  108. package/fonts/CircularStd-Medium.ttf +0 -0
  109. package/fonts/CircularStd-Medium.woff +0 -0
  110. package/fonts/CircularStd-Medium.woff2 +0 -0
  111. package/fonts/CircularStd-Regular.eot +0 -0
  112. package/fonts/CircularStd-Regular.otf +0 -0
  113. package/fonts/CircularStd-Regular.svg +0 -2378
  114. package/fonts/CircularStd-Regular.ttf +0 -0
  115. package/fonts/CircularStd-Regular.woff +0 -0
  116. package/fonts/CircularStd-Regular.woff2 +0 -0
@@ -1,568 +1,704 @@
1
- // =============================================================================
2
- // MATCHA DESIGN SYSTEM — Token Source (CSS Custom Properties)
3
- // =============================================================================
4
- //
5
- // Emits :root variables for Light mode + [data-theme="dark"] overrides,
6
- // enabling runtime theming without Sass recompilation.
7
- //
8
- // 1:1 PARIDADE com Figma variables em DS-PAINEL (fileKey K673r19KQE8lm2S74nQ5ob):
9
- // - matcha/primitives (99 vars) → primitives section below
10
- // - matcha/colors (117 vars) → semantic color sections below
11
- // - matcha/interaction (4 vars) → via matcha/color/interaction/* aliases
12
- // - matcha/text/* (30 styles) text-* + leading-* + tracking-* props
13
- // - matcha/elevation (4 styles) → shadow-1..4
14
- // - matcha/grid (6 styles) grid-col-* + grid-offset-*
15
- //
16
- // CONVENÇÃO:
17
- // - Nome token Figma: `matcha/category/subcategory/variant` (slash)
18
- // - Nome CSS var: `--matcha-category-subcategory-variant` (hyphen)
19
- // ex.: `matcha/color/surface/card` ↔ `--matcha-color-surface-card`
20
- //
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. Brand Accent 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. Typographyfont/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)
38
- //
39
- // =============================================================================
40
- @use "sass:map";
41
-
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
-
52
- // ── Surface (9) matcha/color/surface/* ─────────────────────────────────
53
- // Light mode: sage-tinted neutrals (2–4% green hue da marca) + hierarquia perceptível
54
- --matcha-color-surface-bg: #{if($is-dark, #111318, #f1f4f1)};
55
- --matcha-color-surface-bg-alpha: #{if($is-dark, rgba(#111318, .5), rgba(#f1f4f1, .5))};
56
- --matcha-color-surface-bg-inverse: #{if($is-dark, #f1f4f1, #111318)};
57
- --matcha-color-surface-bg-inverse-alpha: #{if($is-dark, rgba(#f1f4f1, .5), rgba(#111318, .5))};
58
-
59
- --matcha-color-surface: #{if($is-dark, #1c1f26, #ffffff)};
60
- --matcha-color-surface-card: #{if($is-dark, #1c1f26, #ffffff)};
61
- // Canvas aninhada dentro de card (preview stage, code body, inset panels)
62
- // Light: sage (= bg da page, cria recorte sutil sobre card branco)
63
- // Dark: mais clara que card (inverte lógica, profundidade em vez de buraco)
64
- --matcha-color-surface-inner: #{if($is-dark, #262a32, #f1f4f1)};
65
- --matcha-color-surface-card-alpha: #{if($is-dark, rgba(#1c1f26, .5), rgba(#ffffff, .85))};
66
- --matcha-color-surface-card-inverse: #{if($is-dark, #ffffff, #1c1f26)};
67
-
68
- --matcha-color-surface-sidebar: #{if($is-dark, #0d0f14, #e4ebe5)};
69
- --matcha-color-surface-sidebar-hover: #{if($is-dark, #161920, #d8e1da)};
70
- --matcha-color-surface-table-row-hover: #{if($is-dark, #1a1e25, #eff5f0)};
71
-
72
- // Border sólido e visível (era rgba(0,0,0,.08) = invisível sobre sage bg)
73
- --matcha-color-surface-border: #{if($is-dark, rgba(255,255,255,.12), #e1e7e2)};
74
- // Border mais forte pra cards elevados (hero, playground — com shadow)
75
- --matcha-color-surface-border-strong: #{if($is-dark, rgba(255,255,255,.24), #c8d2ca)};
76
- --matcha-color-surface-hover: #{if($is-dark, rgba(#111318, .5), rgba(#e4ebe5, .5))};
77
-
78
- // Aliases (flat) — usados massivamente
79
- --matcha-color-bg: #{if($is-dark, #111318, #f1f4f1)};
80
- --matcha-color-fg: #{if($is-dark, #e8eaed, #1a1d21)};
81
- --matcha-color-fg-alpha: #{if($is-dark, rgba(#e8eaed, .5), rgba(#1a1d21, .5))};
82
- --matcha-color-fg-inverse: #{if($is-dark, #1a1d21, #e8eaed)};
83
- --matcha-color-fg-inverse-alpha: #{if($is-dark, rgba(#1a1d21, .5), rgba(#e8eaed, .5))};
84
- --matcha-color-border: #{if($is-dark, rgba(255,255,255,.12), #e1e7e2)};
85
-
86
- // ── Text (9) matcha/color/text/* ───────────────────────────────────────
87
- // Light mode: tudo sólido (antes era rgba misturado) — evita lama sobre bg tintado
88
- --matcha-color-text-primary: #{if($is-dark, #e8eaed, #1a1d21)};
89
- --matcha-color-text-inverse: #{if($is-dark, #1a1d21, #e8eaed)};
90
- --matcha-color-text-secondary: #{if($is-dark, rgba(255,255,255,.7), #4a5056)};
91
- // Muted: tintado com hue da marca pra recuar visualmente sem baixar contraste
92
- // (Figma VariableID:17111:11 matcha/color/text/muted)
93
- --matcha-color-text-muted: #{if($is-dark, #a8b5a0, #5a6a5e)};
94
- --matcha-color-text-label: #{if($is-dark, #bdc1c6, #6b7177)};
95
- --matcha-color-text-placeholder: #{if($is-dark, #6e747a, #9aa0a6)};
96
- --matcha-color-text-hint: #{if($is-dark, #9aa0a6, #6b7177)};
97
- --matcha-color-text-static-light: #ffffff;
98
- --matcha-color-text-static-dark: #1a1d21;
99
-
100
- // ── Icon (2) matcha/color/icon/* ───────────────────────────────────────
101
- --matcha-color-icon-default: #{if($is-dark, #9aa0a6, #5f656b)};
102
- --matcha-color-icon-active: #{if($is-dark, #e8eaed, #1a1d21)};
103
-
104
- // ── Interaction (4) matcha/color/interaction/* ─────────────────────────
105
- // Light mode: disabled sólido com sage tint (antes alpha sobre bg = inconsistente)
106
- --matcha-color-interaction-disabled-bg: #{if($is-dark, #282c34, #cfd6d1)};
107
- --matcha-color-interaction-disabled-bg-alpha: #{if($is-dark, rgba(#282c34, .5), rgba(#cfd6d1, .5))};
108
- --matcha-color-interaction-disabled-fg: #{if($is-dark, rgba(#e8eaed, .38), #8a9090)};
109
- --matcha-color-interaction-disabled-border: #{if($is-dark, rgba(#e8eaed, .38), #c8d2ca)};
110
- --matcha-color-focus-ring: #{if($is-dark, #a8d94e, #43a047)};
111
- // Aliases legados
112
- --matcha-color-disabled: #{if($is-dark, #282c34, #cfd6d1)};
113
- --matcha-color-disabled-fg: #{if($is-dark, rgba(#e8eaed, .38), #8a9090)};
114
- --matcha-color-disabled-border: #{if($is-dark, rgba(#e8eaed, .38), #c8d2ca)};
115
- --matcha-color-disabled-bg: #{if($is-dark, #282c34, #cfd6d1)};
116
-
117
- // ── Neutral (4 tokens Figma matcha/color/neutral/*) ───────────────────────
118
- // Cor base pra botões e controles sem ênfase semântica (basic, ghost default).
119
- // Light: sage-tinted grey | Dark: grey neutro escuro.
120
- --matcha-color-neutral: #{if($is-dark, #282c34, #e4ebe5)};
121
- --matcha-color-neutral-contrast: #{if($is-dark, #e8eaed, #1a1d21)};
122
- --matcha-color-neutral-alpha: #{if($is-dark, rgba(#e8eaed, .1), rgba(#1a1d21, .08))};
123
- --matcha-color-neutral-hover: #{if($is-dark, #333842, #d8e1da)};
124
-
125
- // ── Elevation (6) — matcha/color/elevation/* ─────────────────────────────
126
- --matcha-color-elevation-surface-1: #{if($is-dark, #1c1f26, #f8faf8)}; // cards, dropdowns (sage)
127
- --matcha-color-elevation-surface-2: #{if($is-dark, #262a32, #ffffff)}; // menus, floating
128
- --matcha-color-elevation-surface-3: #{if($is-dark, #2e333c, #ffffff)}; // modals, drawers
129
- // Shadow base: Figma light usa tinta accent #1A2C1E (não preto puro), dark usa #000000
130
- --matcha-color-elevation-shadow: #{if($is-dark, #000000, #1a2c1e)};
131
- --matcha-color-elevation-shadow-tint: #{if($is-dark, #000000, #1a2c1e)}; // tint da marca pra shadows light
132
- --matcha-color-elevation-scrim: #000000;
133
- // Figma matcha/color/state-layer/fg (camada sobre interações)
134
- --matcha-color-state-layer-fg: #{if($is-dark, #ffffff, #000000)};
135
-
136
- // ── Accent (10) matcha/color/accent/* ──────────────────────────────────
137
- // Light #2d7a2f (dark green) | Dark #a8d94e (lima A400)
138
- // Light mode: verde puro #009400 — hue 120° (green clássico, sem hint yellow/olive)
139
- // IMPORTANTE: Figma matcha/button usa matcha/color/text/inverse (= #E8EAED branco) como label,
140
- // NÃO accent/contrast. Mantendo accent-contrast = branco aqui pra o código bater visualmente com Figma.
141
- // Dark mode: preto em cima do lima bright (~11:1 AAA)
142
- --matcha-color-accent: #{if($is-dark, #a8d94e, #009400)};
143
- --matcha-color-accent-contrast: #{if($is-dark, rgba(0,0,0,.87), #E8EAED)};
144
- --matcha-color-accent-contrast-alpha: #{if($is-dark, rgba(0,0,0,.12), rgba(255,255,255,.20))};
145
- // Figma matcha/color/accent/text-on branco puro Light / quase preto Dark
146
- // Dedicado pra foreground sobre accent/default em Filled buttons, icon buttons.
147
- // Garante contraste ≥ 3:1 em ambos modos (supera accent/contrast que é preto fixo).
148
- --matcha-color-accent-text-on: #{if($is-dark, #1a1d21, #ffffff)};
149
- --matcha-color-accent-alpha: #{if($is-dark, rgba(#a8d94e, .1), rgba(#009400, .1))};
150
- // Light/dark auxiliares: Material Green 200/800 (decorativo, mais neutro que derivar do #009400)
151
- --matcha-color-accent-light: #{if($is-dark, #b9f6ca, #a5d6a7)};
152
- --matcha-color-accent-dark: #{if($is-dark, #c5e1a5, #2e7d32)};
153
- --matcha-color-accent-hover: #{if($is-dark, #bee57a, #008400)};
154
- --matcha-color-accent-pressed: #{if($is-dark, #d4eea0, #007400)};
155
- --matcha-color-accent-surface-hover: #{if($is-dark, #161e12, #d4ecd4)};
156
- --matcha-color-accent-surface-pressed: #{if($is-dark, #1f2d18, #bcdfbc)};
157
-
158
- // ── Accent Secondary (teal 4 tokens Figma matcha/color/accent-2/*) ─────
159
- // Light #00796b (teal-700) | Dark #4fb7ad (teal-light)
160
- --matcha-color-accent-2: #{if($is-dark, #4fb7ad, #00796b)};
161
- --matcha-color-accent-2-contrast: #ffffff;
162
- --matcha-color-accent-2-alpha: #{if($is-dark, rgba(#4fb7ad, .12), rgba(#00796b, .10))};
163
- --matcha-color-accent-2-surface: #{if($is-dark, #1d332e, #e0f0ee)};
164
-
165
- // ── Primary (10) matcha/color/primary/* ────────────────────────────────
166
- // Light #1664c2 (blue-700) | Dark #64b5f6 (blue-300)
167
- --matcha-color-primary: #{if($is-dark, #64b5f6, #1664c2)};
168
- --matcha-color-primary-contrast: #{if($is-dark, rgba(0,0,0,.87), #ffffff)};
169
- --matcha-color-primary-contrast-alpha: #{if($is-dark, rgba(0,0,0,.1), rgba(255,255,255,.1))};
170
- --matcha-color-primary-alpha: #{if($is-dark, rgba(#64b5f6, .1), rgba(#1664c2, .1))};
171
- --matcha-color-primary-light: #{if($is-dark, #bbdefb, #b3d7fd)};
172
- --matcha-color-primary-dark: #{if($is-dark, #90caf9, #0d3c8c)};
173
- --matcha-color-primary-hover: #{if($is-dark, #90caf9, #2576d2)};
174
- --matcha-color-primary-pressed: #{if($is-dark, #bbdefb, #378ce1)};
175
- --matcha-color-primary-surface-hover: #{if($is-dark, #141922, #e4eefa)};
176
- --matcha-color-primary-surface-pressed: #{if($is-dark, #1a2436, #cddef5)};
177
-
178
- // ── Feedback Success (9) ───────────────────────────────────────────────
179
- --matcha-color-success: #{if($is-dark, #69f0ae, #2e7d32)};
180
- --matcha-color-success-contrast: #{if($is-dark, rgba(0,0,0,.87), #ffffff)};
181
- --matcha-color-success-contrast-alpha: #{if($is-dark, rgba(0,0,0,.1), rgba(255,255,255,.1))};
182
- --matcha-color-success-alpha: #{if($is-dark, rgba(#69f0ae, .1), rgba(#2e7d32, .1))};
183
- --matcha-color-success-hover: #{if($is-dark, #4cd992, #388e3c)};
184
- --matcha-color-success-pressed: #{if($is-dark, #33c078, #43a047)};
185
- --matcha-color-success-fill: #{if($is-dark, #43a047, #2e7d32)};
186
- --matcha-color-success-surface-hover: #{if($is-dark, #121d17, #e8f5e9)};
187
- --matcha-color-success-surface-pressed: #{if($is-dark, #192f24, #c8e6c9)};
188
-
189
- // ── Feedback Danger (9) ────────────────────────────────────────────────
190
- --matcha-color-danger: #{if($is-dark, #ef9a9a, #c81010)};
191
- --matcha-color-danger-contrast: #{if($is-dark, rgba(0,0,0,.87), #ffffff)};
192
- --matcha-color-danger-contrast-alpha: #{if($is-dark, rgba(0,0,0,.1), rgba(255,255,255,.1))};
193
- --matcha-color-danger-alpha: #{if($is-dark, rgba(#ef9a9a, .1), rgba(#c81010, .1))};
194
- --matcha-color-danger-hover: #{if($is-dark, #f4b8b8, #da2c2c)};
195
- --matcha-color-danger-pressed: #{if($is-dark, #f7d0d0, #e64848)};
196
- --matcha-color-danger-fill: #{if($is-dark, #e53935, #c81010)};
197
- --matcha-color-danger-surface-hover: #{if($is-dark, #1d1616, #fae8e8)};
198
- --matcha-color-danger-surface-pressed: #{if($is-dark, #2f2121, #f5d2d2)};
199
-
200
- // ── Feedback — Warn (9) ──────────────────────────────────────────────────
201
- // Light #a64e00 (âmbar escuro) | Dark #ffb74d (orange-300)
202
- --matcha-color-warn: #{if($is-dark, #ffb74d, #a64e00)};
203
- --matcha-color-warn-contrast: #{if($is-dark, rgba(0,0,0,.87), #ffffff)};
204
- --matcha-color-warn-contrast-alpha: #{if($is-dark, rgba(0,0,0,.1), rgba(255,255,255,.1))};
205
- --matcha-color-warn-alpha: #{if($is-dark, rgba(#ffb74d, .1), rgba(#a64e00, .1))};
206
- --matcha-color-warn-hover: #{if($is-dark, #e69f33, #924200)};
207
- --matcha-color-warn-pressed: #{if($is-dark, #cc881a, #7e3600)};
208
- --matcha-color-warn-fill: #{if($is-dark, #fb8c00, #a64e00)};
209
- --matcha-color-warn-surface-hover: #{if($is-dark, #1e1910, #fcf0e1)};
210
- --matcha-color-warn-surface-pressed: #{if($is-dark, #2f2616, #f8e1c3)};
211
-
212
- // ── Feedback — Info (8) ──────────────────────────────────────────────────
213
- --matcha-color-info: #{if($is-dark, #4090d8, #0a2fc2)};
214
- --matcha-color-info-contrast: #ffffff;
215
- --matcha-color-info-contrast-alpha: rgba(255,255,255,.1);
216
- --matcha-color-info-alpha: #{if($is-dark, rgba(#4090d8, .1), rgba(#0a2fc2, .1))};
217
- --matcha-color-info-hover: #{if($is-dark, #5aa0e0, #294cd4)};
218
- --matcha-color-info-pressed: #{if($is-dark, #74b0e8, #4265e0)};
219
- --matcha-color-info-surface-hover: #{if($is-dark, #0f141e, #ebeefa)};
220
- --matcha-color-info-surface-pressed: #{if($is-dark, #131f31, #d8def5)};
221
-
222
- // ── Palette (18) — matcha/color/palette/* ────────────────────────────────
223
- --matcha-color-palette-teal: #{if($is-dark, #4fb7ad, #00796b)};
224
- --matcha-color-palette-teal-light: #{if($is-dark, #009688, #4fb7ad)};
225
- --matcha-color-palette-teal-alpha: #{if($is-dark, rgba(#4fb7ad, .1), rgba(#00796b, .1))};
226
- --matcha-color-palette-light-blue: #{if($is-dark, #54c5f7, #0288d1)};
227
- --matcha-color-palette-light-blue-light: #{if($is-dark, #03a9f4, #54c5f7)};
228
- --matcha-color-palette-light-blue-alpha: #{if($is-dark, rgba(#54c5f7, .1), rgba(#0288d1, .1))};
229
- --matcha-color-palette-purple: #{if($is-dark, #bb6ac8, #9c27b0)};
230
- --matcha-color-palette-purple-light: #{if($is-dark, #9c27b0, #bb6ac8)};
231
- --matcha-color-palette-purple-alpha: #{if($is-dark, rgba(#bb6ac8, .1), rgba(#9c27b0, .1))};
232
- --matcha-color-palette-pink: #{if($is-dark, #e46291, #d81b60)};
233
- --matcha-color-palette-pink-light: #{if($is-dark, #d81b60, #e46291)};
234
- --matcha-color-palette-pink-alpha: #{if($is-dark, rgba(#e46291, .1), rgba(#d81b60, .1))};
235
- --matcha-color-palette-orange: #{if($is-dark, #f9a25d, #e65100)};
236
- --matcha-color-palette-orange-light: #{if($is-dark, #f77814, #f9a25d)};
237
- --matcha-color-palette-orange-alpha: #{if($is-dark, rgba(#f9a25d, .1), rgba(#e65100, .1))};
238
- --matcha-color-palette-yellow: #{if($is-dark, #efd64f, #ffa000)};
239
- --matcha-color-palette-yellow-light: #{if($is-dark, #e8c300, #efd64f)};
240
- --matcha-color-palette-yellow-alpha: #{if($is-dark, rgba(#efd64f, .1), rgba(#ffa000, .1))};
241
-
242
- // ── Chart (5) matcha/color/chart/* ─────────────────────────────────────
243
- --matcha-color-chart-series-1: #{if($is-dark, #8782f2, #615ce5)};
244
- --matcha-color-chart-series-2: #{if($is-dark, #66ba6b, #42a147)};
245
- --matcha-color-chart-series-3: #{if($is-dark, #f5876b, #ed6645)};
246
- --matcha-color-chart-series-4: #{if($is-dark, #ffc93d, #c28700)};
247
- --matcha-color-chart-series-5: #{if($is-dark, #26c2d9, #008094)};
248
-
249
- // ── Spacing (14 tokens matches matcha/space/* exato) ────────────────────
250
- --matcha-space-025: 2px;
251
- --matcha-space-050: 4px;
252
- --matcha-space-075: 6px;
253
- --matcha-space-100: 8px;
254
- --matcha-space-150: 12px;
255
- --matcha-space-200: 16px;
256
- --matcha-space-250: 20px;
257
- --matcha-space-300: 24px;
258
- --matcha-space-400: 32px;
259
- --matcha-space-500: 40px;
260
- --matcha-space-600: 48px;
261
- --matcha-space-800: 64px;
262
- --matcha-space-1000: 80px;
263
- --matcha-space-1200: 96px;
264
-
265
- // ── Border radius (8 tokens matches matcha/radius/* exato) ─────────────
266
- --matcha-radius-none: 0;
267
- --matcha-radius-sm: 2px;
268
- --matcha-radius-md: 4px;
269
- --matcha-radius-3xs: 6px; // Figma matcha/radius/3xs
270
- --matcha-radius-lg: 8px;
271
- --matcha-radius-2xl: 12px; // Figma: 12px (antes code tinha 24, divergia)
272
- --matcha-radius-xl: 16px;
273
- --matcha-radius-pill: 9999px;
274
- // Alias legado pra usos em páginas de doc (refatorar depois pra usar radius-2xl)
275
- --matcha-radius-card: var(--matcha-radius-2xl);
276
-
277
- // ── Border width (4 tokens — matches matcha/border/* exato) ──────────────
278
- --matcha-border-hairline: 1px; // Subtle borders (card outlines, internal separators)
279
- --matcha-border-thin: 2px; // Primary borders (button outlines, form fields, active states)
280
- --matcha-border-medium: 4px; // Emphasis borders (status indicators, nav-item indicators, focus rings on large)
281
- --matcha-border-thick: 8px; // Heavy borders (section dividers, decoration)
282
-
283
- // ── Font family (1 token) ────────────────────────────────────────────────
284
- --matcha-font-family: 'Manrope', sans-serif;
285
-
286
- // ── Font size (8 tokens — matches matcha/font/size/* from Figma) ──────────
287
- --matcha-font-size-2xs: 10px;
288
- --matcha-font-size-xs: 12px;
289
- --matcha-font-size-sm: 14px;
290
- --matcha-font-size-md: 16px;
291
- --matcha-font-size-lg: 18px;
292
- --matcha-font-size-xl: 20px;
293
- --matcha-font-size-2xl: 24px;
294
- --matcha-font-size-3xl: 32px;
295
-
296
- // ── Font weight (6 tokensmatches matcha/font/weight/* exato) ──────────
297
- // Canônico Figma: normal (400), medium (500), semi-bold (600), bold (700), extrabold (800), black (900)
298
- // Código mantém regular/semibold por retrocompat + aliases Figma-exatos
299
- --matcha-weight-regular: 400;
300
- --matcha-weight-normal: 400; // Figma canonical alias
301
- --matcha-weight-medium: 500;
302
- --matcha-weight-semibold: 600;
303
- --matcha-weight-semi-bold: 600; // Figma canonical alias
304
- --matcha-weight-bold: 700;
305
- --matcha-weight-extrabold: 800; // Figma VariableID:17195:11 (criado oficialmente)
306
- --matcha-weight-black: 900;
307
-
308
- // ── Typography composites (18 text styles from Figma) ────────────────────
309
- --matcha-text-display: 32px;
310
- --matcha-text-headline: 24px;
311
- --matcha-text-title-xl: 20px;
312
- --matcha-text-title-lg: 20px;
313
- --matcha-text-title-md: 18px;
314
- --matcha-text-title-sm: 16px;
315
- --matcha-text-title-xs: 14px;
316
- --matcha-text-body-lg: 16px;
317
- --matcha-text-body-md: 14px;
318
- --matcha-text-body-sm: 12px;
319
- --matcha-text-label-lg: 16px;
320
- --matcha-text-label-md: 14px;
321
- --matcha-text-label-sm: 12px;
322
- --matcha-text-button-lg: 16px; // SemiBold 22 letter 0.2
323
- --matcha-text-button-md: 14px; // Medium 20 letter 0.2
324
- --matcha-text-button-sm: 13px; // Medium 19 letter 0.2 (Figma instance usage)
325
- --matcha-text-caption: 11px;
326
- --matcha-text-overline: 10px;
327
-
328
- // Novos text styles (paridade 1:1 com matcha/text/* no Figma)
329
- --matcha-text-display-hero: 36px;
330
- --matcha-text-display-xl: 40px;
331
- --matcha-text-display-sm: 28px;
332
- --matcha-text-title-xl: 20px; // ExtraBold — distinto de title-lg (SemiBold)
333
- --matcha-text-title-xs: 14px;
334
- --matcha-text-body-premium: 14px;
335
- --matcha-text-nav-section: 11px;
336
- --matcha-text-section-label: 11px;
337
- --matcha-text-overline-status: 11px;
338
- --matcha-text-stat-number: 20px;
339
- --matcha-text-stat-label: 13px;
340
- --matcha-text-wordmark: 16px;
341
- --matcha-text-card-title: 14px;
342
- --matcha-text-badge-sm: 11px;
343
-
344
- // Shorthand aliases (usados massivamente em components/*.scss)
345
- // Mapeiam para os text styles canônicos do Figma.
346
- --matcha-text-xs: var(--matcha-text-caption); // 11px — legendas, metadados
347
- --matcha-text-sm: var(--matcha-text-body-sm); // 12px — texto auxiliar
348
- --matcha-text-md: var(--matcha-text-body-md); // 14px — corpo padrão
349
- --matcha-text-lg: var(--matcha-text-body-lg); // 16px — texto de destaque
350
- --matcha-text-xl: var(--matcha-text-title-md); // 18px — títulos de grupo
351
-
352
- // Line heights (matching Figma text styles exactly)
353
- --matcha-leading-display: 40px;
354
- --matcha-leading-headline: 32px;
355
- --matcha-leading-title-xl: 28px;
356
- --matcha-leading-title-lg: 28px;
357
- --matcha-leading-title-md: 24px;
358
- --matcha-leading-title-sm: 22px;
359
- --matcha-leading-title-xs: 20px;
360
- --matcha-leading-body-lg: 24px;
361
- --matcha-leading-body-md: 20px;
362
- --matcha-leading-body-sm: 16px;
363
- --matcha-leading-label-lg: 22px;
364
- --matcha-leading-label-md: 20px;
365
- --matcha-leading-label-sm: 16px;
366
- --matcha-leading-button-lg: 22px;
367
- --matcha-leading-button-md: 20px;
368
- --matcha-leading-button-sm: 19px; // Atualizado p/ 19 (antes 16, descri\u00e7\u00e3o Figma mentia)
369
- --matcha-leading-caption: 14px;
370
- --matcha-leading-overline: 14px;
371
-
372
- // Leading novos text styles
373
- --matcha-leading-display-hero: 40px;
374
- --matcha-leading-display-xl: 48px;
375
- --matcha-leading-display-sm: 36px;
376
- --matcha-leading-title-xs: 20px;
377
- --matcha-leading-body-premium: 20px;
378
- --matcha-leading-nav-section: 16px;
379
- --matcha-leading-section-label: 16px;
380
- --matcha-leading-overline-status: 14px;
381
- --matcha-leading-stat-number: 24px;
382
- --matcha-leading-stat-label: 18px;
383
- --matcha-leading-wordmark: 20px;
384
- --matcha-leading-card-title: 20px;
385
- --matcha-leading-badge-sm: 14px;
386
-
387
- // Tracking (letter-spacing) — por style (só quem tem valor não-zero)
388
- --matcha-tracking-display-hero: -1.2px;
389
- --matcha-tracking-display-xl: -0.5px;
390
- --matcha-tracking-body-premium: -0.1px;
391
- --matcha-tracking-overline-status: 0.5px;
392
- --matcha-tracking-stat-number: -0.3px;
393
- --matcha-tracking-wordmark: -0.3px;
394
- --matcha-tracking-badge-sm: 0.3px;
395
-
396
- // Shorthand aliases para line-heights (acompanham --matcha-text-*)
397
- --matcha-leading-xs: var(--matcha-leading-caption); // 14px
398
- --matcha-leading-sm: var(--matcha-leading-body-sm); // 16px
399
- --matcha-leading-md: var(--matcha-leading-body-md); // 20px
400
- --matcha-leading-lg: var(--matcha-leading-body-lg); // 24px
401
- --matcha-leading-xl: var(--matcha-leading-title-md); // 24px
402
-
403
- // ── Line height primitives (4 tokens — matches matcha/line-height/*) ─────
404
- --matcha-line-height-none: 1;
405
- --matcha-line-height-tight: 1.2;
406
- --matcha-line-height-normal: 1.5;
407
- --matcha-line-height-relaxed: 1.75;
408
-
409
- // ── Letter spacing (primitives + semantic aliases) ───────────────────────
410
- --matcha-letter-spacing-tight: -0.5px;
411
- --matcha-letter-spacing-normal: 0px;
412
- --matcha-letter-spacing-wide: 0.5px;
413
- --matcha-letter-spacing-wider: 1px;
414
- // Semantic aliases alinhados com Figma text styles
415
- --matcha-letter-spacing-button: 0.2px; // matcha/text/button-*
416
- --matcha-letter-spacing-caption: 0.3px; // matcha/text/caption + link-sm
417
-
418
- // ── Elevation (4 shadow tokens) ──────────────────────────────────────────
419
- --matcha-shadow-1: #{if($is-dark, $shadow-1-dark, $shadow-1-light)};
420
- --matcha-shadow-2: #{if($is-dark, $shadow-2-dark, $shadow-2-light)};
421
- --matcha-shadow-3: #{if($is-dark, $shadow-3-dark, $shadow-3-light)};
422
- --matcha-shadow-4: #{if($is-dark, $shadow-4-dark, $shadow-4-light)};
423
-
424
- // ── Animation (4 tokens — matches matcha/duration/* from Figma) ──────────
425
- --matcha-duration-instant: 80ms;
426
- --matcha-duration-fast: 200ms;
427
- --matcha-duration-normal: 400ms;
428
- --matcha-duration-slow: 600ms;
429
-
430
- // ── Easing (4 tokens matches matcha/easing/* from Figma) ───────────────
431
- --matcha-easing-standard: cubic-bezier(0.4, 0, 0.2, 1);
432
- --matcha-easing-accelerated: cubic-bezier(0.4, 0, 1, 1);
433
- --matcha-easing-decelerated: cubic-bezier(0, 0, 0.2, 1);
434
- --matcha-easing-emphasized: cubic-bezier(0.2, 0, 0, 1);
435
-
436
- // ── Opacity (7 tokens — matches matcha/opacity/* from Figma) ─────────────
437
- --matcha-opacity-hover: 0.04;
438
- --matcha-opacity-subtle: 0.10;
439
- --matcha-opacity-medium: 0.20;
440
- --matcha-opacity-strong: 0.30;
441
- --matcha-opacity-disabled: 0.38;
442
- --matcha-opacity-secondary: 0.54;
443
- --matcha-opacity-high: 0.87;
444
-
445
- // ── State layers (matches matcha/state-layer/* from Figma) ────────────────
446
- --matcha-state-layer-subtle: 0.04; // Figma matcha/state-layer/subtle
447
- --matcha-state-layer-hover: 0.08; // Figma matcha/state-layer/hover
448
- --matcha-state-layer-pressed: 0.12; // Figma matcha/state-layer/pressed
449
- --matcha-state-layer-active: 0.16; // Figma matcha/state-layer/active
450
- // Aliases legados (usados nos componentes atuais)
451
- --matcha-state-hover: var(--matcha-state-layer-hover);
452
- --matcha-state-active: var(--matcha-state-layer-pressed);
453
- --matcha-state-focus-ring-width: 2px;
454
- --matcha-state-focus-ring-offset: 2px;
455
-
456
- // ── Scrim / Overlay (Figma matcha/overlay Type=Modal / Type=Drawer) ──────
457
- --matcha-scrim-modal: rgba(0, 0, 0, 0.5);
458
- --matcha-scrim-modal-blur: 6px;
459
- --matcha-scrim-drawer: rgba(0, 0, 0, 0.3);
460
- --matcha-scrim-drawer-blur: 4px;
461
-
462
- // ── Icon sizes (4 tokens — matches matcha/icon/size/* exato) ─────────────
463
- --matcha-icon-size-sm: 16px;
464
- --matcha-icon-size-md: 24px;
465
- --matcha-icon-size-lg: 32px;
466
- --matcha-icon-size-xl: 48px;
467
-
468
- // ── Avatar sizes (1:1 com Figma matcha/avatar — Type=Photo, Size variants)
469
- --matcha-avatar-xs: 24px;
470
- --matcha-avatar-sm: 32px;
471
- --matcha-avatar-md: 40px;
472
- --matcha-avatar-lg: 56px;
473
- --matcha-avatar-xl: 80px;
474
- --matcha-avatar-2xl: 96px;
475
- // Status indicator — 1:1 com Figma (Status ellipse em cada Size variant)
476
- --matcha-avatar-status-xs: 6px;
477
- --matcha-avatar-status-sm: 8px;
478
- --matcha-avatar-status-md: 10px;
479
- --matcha-avatar-status-lg: 12px;
480
- --matcha-avatar-status-xl: 14px;
481
- --matcha-avatar-status-2xl: 16px;
482
-
483
- // ── Z-index (8 tokens — matches matcha/z-index/* from Figma) ─────────────
484
- --matcha-z-base: 1;
485
- --matcha-z-dropdown: 100;
486
- --matcha-z-sticky: 200;
487
- --matcha-z-popover: 300;
488
- --matcha-z-tooltip: 400;
489
- --matcha-z-modal-bg: 998;
490
- --matcha-z-modal: 999;
491
- --matcha-z-overlay: 1000;
492
-
493
- // ── Grid (22 tokens 1:1 com matcha/grid/* do Figma) ────────────────────
494
- // Frames (breakpoints)
495
- --matcha-grid-frame-mobile: 375px;
496
- --matcha-grid-frame-tablet: 768px;
497
- --matcha-grid-frame-notebook: 1360px;
498
- --matcha-grid-frame-wide: 1920px;
499
- // Chrome
500
- --matcha-grid-header-height: 56px;
501
- --matcha-grid-sidebar-rail: 72px;
502
- --matcha-grid-sidebar-submenu: 216px;
503
- --matcha-grid-sidebar-total: 304px;
504
- --matcha-grid-sidebar-gap: 16px;
505
- // Gutters (espaço entre colunas)
506
- --matcha-grid-gutter-compact: 8px;
507
- --matcha-grid-gutter-default: 16px;
508
- --matcha-grid-gutter-wide: 16px;
509
- --matcha-grid-max-content-width: 1600px;
510
- // Column widths (largura INDIVIDUAL de coluna) — Figma verdadeiro
511
- --matcha-grid-col-painel-full: 72px;
512
- --matcha-grid-col-painel-rail: 88px;
513
- --matcha-grid-col-painel-compact: 96px;
514
- --matcha-grid-col-wide-full: 120px;
515
- --matcha-grid-col-wide-rail: 112px;
516
- // Content widths (área útil total) — Figma verdadeiro
517
- --matcha-grid-content-painel-full: 1040px;
518
- --matcha-grid-content-painel-rail: 1232px;
519
- --matcha-grid-content-wide-full: 1616px;
520
- --matcha-grid-content-wide-rail: 1520px;
521
-
522
- // Public-facing column widths (site institucional/landing — breakpoint-aware)
523
- --matcha-grid-col-public-desktop: 80px;
524
- --matcha-grid-col-public-mobile: 80px;
525
- --matcha-grid-col-public-tablet: 64px;
526
-
527
- // Horizontal offsets (distância da borda do frame ao primeiro col da grid)
528
- --matcha-grid-offset-painel-compact: 24px;
529
- --matcha-grid-offset-painel-full: 304px;
530
- --matcha-grid-offset-painel-rail: 96px;
531
- --matcha-grid-offset-wide-full: 304px;
532
- --matcha-grid-offset-wide-rail: 248px;
533
-
534
- // ═════════════════════════════════════════════════════════════════════════
535
- // 16. NAMING-PARITY ALIASES
536
- // Aliases que espelham o nome exato das variables do Figma, garantindo que
537
- // dev possa referenciar o token pelo nome que vê no Figma.
538
- // ═════════════════════════════════════════════════════════════════════════
539
-
540
- // Figma: matcha/color/surface/background → ↔ --matcha-color-surface-bg
541
- --matcha-color-surface-background: var(--matcha-color-surface-bg);
542
- --matcha-color-surface-background-alpha: var(--matcha-color-surface-bg-alpha);
543
- --matcha-color-surface-background-inverse: var(--matcha-color-surface-bg-inverse);
544
-
545
- // Figma: matcha/color/neutral/default → ↔ --matcha-color-neutral
546
- --matcha-color-neutral-default: var(--matcha-color-neutral);
547
-
548
- // Figma: matcha/color/interaction/focus-ring → ↔ --matcha-color-focus-ring
549
- --matcha-color-interaction-focus-ring: var(--matcha-color-focus-ring);
550
-
551
- // Figma: matcha/z-index/{base,dropdown,…} --matcha-z-{base,dropdown,…}
552
- --matcha-z-index-base: var(--matcha-z-base);
553
- --matcha-z-index-dropdown: var(--matcha-z-dropdown);
554
- --matcha-z-index-sticky: var(--matcha-z-sticky);
555
- --matcha-z-index-popover: var(--matcha-z-popover);
556
- --matcha-z-index-tooltip: var(--matcha-z-tooltip);
557
- --matcha-z-index-modal-bg: var(--matcha-z-modal-bg);
558
- --matcha-z-index-modal: var(--matcha-z-modal);
559
- --matcha-z-index-overlay: var(--matcha-z-overlay);
560
-
561
- // Figma: matcha/font/weight/semi-bold → ↔ --matcha-weight-semibold
562
- --matcha-font-weight-semi-bold: var(--matcha-weight-semibold);
563
- --matcha-font-weight-regular: var(--matcha-weight-regular);
564
- --matcha-font-weight-medium: var(--matcha-weight-medium);
565
- --matcha-font-weight-bold: var(--matcha-weight-bold);
566
- --matcha-font-weight-extrabold: var(--matcha-weight-extrabold);
567
- --matcha-font-weight-black: var(--matcha-weight-black);
568
- }
1
+ // =============================================================================
2
+ // MATCHA DESIGN SYSTEM — Token Source (CSS Custom Properties)
3
+ // =============================================================================
4
+ //
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).
10
+ //
11
+ // 1:1 PARIDADE com Figma variables em DS-PAINEL (fileKey K673r19KQE8lm2S74nQ5ob):
12
+ // - matcha/primitives (99 vars) primitives section below
13
+ // - matcha/colors (117 vars) → $matcha-color-tokens below
14
+ // - matcha/interaction (4 vars) via matcha/color/interaction/* aliases
15
+ // - matcha/text/* (30 styles) → text-* + leading-* + tracking-* props
16
+ // - matcha/elevation (4 styles) → shadow-1..4
17
+ // - matcha/grid (6 styles) → grid-col-* + grid-offset-*
18
+ //
19
+ // CONVENÇÃO:
20
+ // - Nome token Figma: `matcha/category/subcategory/variant` (slash)
21
+ // - Nome CSS var: `--matcha-category-subcategory-variant` (hyphen)
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`
25
+ //
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.
36
+ //
37
+ // =============================================================================
38
+ @use "sass:map";
39
+
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: (
46
+ // ── Surface (9) — matcha/color/surface/* ─────────────────────────────────
47
+ // 1:1 Figma DSV3 (Light + Dark JSON export 2026-05-29).
48
+ // Light mode: sage-tinted neutrals (2–4% green hue da marca) + hierarquia perceptível.
49
+ surface-bg: (light: #f1f4f1, dark: #111318),
50
+ // bg-alpha light usa cor BASE distinta (#f0f2f5) — não é #f1f4f1 com alpha.
51
+ // Decisão Figma intencional pra sutil shift de tint no estado transparente.
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)),
55
+
56
+ // Card soft default — light #f7fcf7 (off-white com tint sage muito sutil).
57
+ // Reduz glare contra surface-bg #f1f4f1 (Δ ~5 luminance). Pure white só pra
58
+ // floating overlays via surface-card-strong (modal, command-palette).
59
+ // Pattern Linear / Vercel / Notion: soft cards default + bright float.
60
+ surface: (light: #f7fcf7, dark: #1c1f26),
61
+ surface-card: (light: #f7fcf7, dark: #1c1f26),
62
+ // Card strong pure white (light) / lifted dark, pra floating overlays
63
+ // que precisam máximo destaque sobre scrim. Modal, popover, dropdown,
64
+ // command-palette. NÃO usar pra cards inline — vira agressivo.
65
+ surface-card-strong: (light: #ffffff, dark: #262a32),
66
+ // Canvas aninhada dentro de card (preview stage, code body, inset panels)
67
+ // Light: sage (= bg da page, cria recorte sutil sobre card off-white)
68
+ // Dark: mais clara que card (inverte lógica, dá profundidade em vez de buraco)
69
+ surface-inner: (light: #f1f4f1, dark: #262a32),
70
+ // card-alpha light usa #ffffff base (não #f7fcf7) — overlay/zebra com white puro
71
+ surface-card-alpha: (light: rgba(#ffffff, .85), dark: rgba(#1c1f26, .5)),
72
+ surface-card-inverse: (light: #1c1f26, dark: #ffffff),
73
+
74
+ surface-sidebar: (light: #e4ebe5, dark: #0d0f14),
75
+ surface-sidebar-hover: (light: #d8e1da, dark: #161920),
76
+ // table-row-hover light: neutral #f4f4f4 (Figma não tinted sage)
77
+ surface-table-row-hover: (light: #f4f4f4, dark: #151a22),
78
+
79
+ // Border sólido e visível (era rgba(0,0,0,.08) = invisível sobre sage bg)
80
+ surface-border: (light: #e1e7e2, dark: rgba(255, 255, 255, .12)),
81
+ // Border mais forte pra cards elevados (hero, playground — com shadow)
82
+ surface-border-strong: (light: #c8d2ca, dark: rgba(255, 255, 255, .24)),
83
+ surface-hover: (light: rgba(#e4ebe5, .5), dark: rgba(#111318, .5)),
84
+
85
+ // Aliases (flat) — usados massivamente
86
+ // Light mode softening 2026-05-18: fg de #1a1d21 (17:1, "tinta preta") #2a2d33 (12:1 AAA, "tinta carvão").
87
+ // Inspiração: tom entre Linear (#1a1d21, mais pesado) e GitHub (#1f2328) — reduz fatiga em sessions longas.
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)),
94
+
95
+ // ── Text (9) — matcha/color/text/* ───────────────────────────────────────
96
+ // Light mode softening 2026-05-18 todos os tons recuados ~1 step pra reduzir
97
+ // peso visual sem perder hierarquia. Contrastes recalculados sobre card #f7fcf7:
98
+ // primary #2a2d33 → 12.0:1 (AAA, antes era #1a1d21 17:1 = exagero)
99
+ // secondary #5a6066 → 6.8:1 (AAA Large + AA Normal, antes #4a5056 8.5:1)
100
+ // muted #6e7681 5.2:1 (AA, antes #5a6a5e 7.4:1)
101
+ // label #7a818a → 4.6:1 (AA, antes #6b7177 5.9:1)
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)),
105
+ // Muted: GitHub-ish neutral (antes era sage-tinted #5a6a5e verde demais em form helper text)
106
+ text-muted: (light: #6e7681, dark: #a8b5a0),
107
+ text-label: (light: #7a818a, dark: #bdc1c6),
108
+ // Placeholder: #7a818a (4.5:1 sobre card — passa AA mantendo low-emphasis)
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),
113
+
114
+ // ── Icon (2) — matcha/color/icon/* ───────────────────────────────────────
115
+ // Light mode softening 2026-05-18:
116
+ // default #5f656b → #75767a — recua ícones decorativos (sort, leading) pra não competir com texto
117
+ // active #1a1d21 #3d4248 ainda firme mas menos "tinta china" em toggles/sortable headers
118
+ icon-default: (light: #9aa0a6, dark: #9aa0a6),
119
+ icon-active: (light: #3d4248, dark: #e8eaed),
120
+
121
+ // ── Interaction (4) matcha/color/interaction/* ─────────────────────────
122
+ // Light mode: disabled sólido com sage tint (antes alpha sobre bg = inconsistente)
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),
128
+ // Aliases legados
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),
133
+
134
+ // ── Neutral (4 tokens Figma matcha/color/neutral/*) ───────────────────────
135
+ // Cor base pra botões e controles sem ênfase semântica (basic, ghost default).
136
+ // Light: sage-tinted grey | Dark: grey neutro escuro.
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),
141
+
142
+ // ── Elevation (6) matcha/color/elevation/* ─────────────────────────────
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
146
+ // Shadow base: Figma light usa tinta accent #1A2C1E (não preto puro), dark usa #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),
150
+ // Figma matcha/color/state-layer/fg (camada sobre interações)
151
+ state-layer-fg: (light: #000000, dark: #ffffff),
152
+
153
+ // ── Accent (10) — matcha/color/accent/* ──────────────────────────────────
154
+ // Brand inChurch: lime/chartreuse #86BD00 (hue 78°, "matcha tea").
155
+ // Brand bright #86BD00 com white dá 2.25:1 (fail UI). Light mode escurece pra
156
+ // #6E9A00 (3.31:1 passa WCAG UI/large text mínimo 3:1) mantendo a MESMA hue
157
+ // 78° pra preservar identidade lime. Tradeoff aceito 2026-05-18: accent é usado
158
+ // praticamente em buttons (CTA filled c/ label branco) onde 3:1 UI é OK.
159
+ // Dark mode: lima bright #a8d94e + label preto (~11:1 AAA).
160
+ // accent-contrast 1:1 Figma DSV3: rgba(0,0,0,.87) em AMBOS os modos (Light + Dark).
161
+ // É label-on-accent ripple/text token, semantica é "preto sobre amarelo-lima". Pra label
162
+ // branco em Filled buttons use accent/text-on (branco no Light / quase-preto no Dark).
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)),
166
+ // Figma matcha/color/accent/text-on — branco puro Light / quase preto Dark.
167
+ // Dedicado pra foreground sobre accent/default em Filled buttons, icon buttons.
168
+ // Garante contraste ≥ 3:1 em ambos modos (supera accent/contrast que é preto fixo).
169
+ accent-text-on: (light: #ffffff, dark: #1a1d21),
170
+ accent-alpha: (light: rgba(#54a71d, .1), dark: rgba(#a8d94e, .1)),
171
+ // Light/dark auxiliares: spring green tint (hue 143° matching accent base)
172
+ accent-light: (light: #b9e3a3, dark: #b9f6ca),
173
+ accent-dark: (light: #3a7515, dark: #c5e1a5),
174
+ // Hover/pressed: step ~10% darker mesma hue (3.0:1 3.75:1 → 4.7:1)
175
+ accent-hover: (light: #4b9519, dark: #bee57a),
176
+ accent-pressed: (light: #428316, dark: #d4eea0),
177
+ // Surface tints — light spring green
178
+ accent-surface-hover: (light: #e8f3dc, dark: #161e12),
179
+ accent-surface-pressed: (light: #cbe4ab, dark: #1f2d18),
180
+
181
+ // ── Accent Secondary (teal — 4 tokens Figma matcha/color/accent-2/*) ─────
182
+ // Light #00796b (teal-700) | Dark #4fb7ad (teal-light)
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),
187
+
188
+ // ── Primary (10) — matcha/color/primary/* ────────────────────────────────
189
+ // Light #1664c2 (blue-700) | Dark #64b5f6 (blue-300)
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),
200
+
201
+ // ── Feedback Success (9) ───────────────────────────────────────────────
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),
211
+
212
+ // ── Feedback — Danger (9) ────────────────────────────────────────────────
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),
222
+
223
+ // ── Feedback — Warn (9) ──────────────────────────────────────────────────
224
+ // Light #a64e00 (âmbar escuro) | Dark #ffb74d (orange-300)
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),
234
+
235
+ // ── Feedback — Info (8) ──────────────────────────────────────────────────
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
+ );
320
+
321
+ // ── Feedback namespace (matcha/color/feedback/* canon DSV3) ───────────────
322
+ // Aliases semânticos pros tokens base — namespace dedicado pra status/banners/
323
+ // table row variants. Naming match Figma DSV3 (flat: feedback/info, sem suffix).
324
+ --matcha-color-feedback-info: var(--matcha-color-info);
325
+ --matcha-color-feedback-success: var(--matcha-color-success);
326
+ --matcha-color-feedback-warn: var(--matcha-color-warn);
327
+ --matcha-color-feedback-danger: var(--matcha-color-danger);
328
+
329
+ // Variantes alpha pra row backgrounds, badges filled-alpha, etc.
330
+ --matcha-color-feedback-info-alpha: var(--matcha-color-info-alpha);
331
+ --matcha-color-feedback-success-alpha: var(--matcha-color-success-alpha);
332
+ --matcha-color-feedback-warn-alpha: var(--matcha-color-warn-alpha);
333
+ --matcha-color-feedback-danger-alpha: var(--matcha-color-danger-alpha);
334
+
335
+ // Surface hover (bg tinted pra hover em row de table)
336
+ --matcha-color-feedback-info-surface-hover: var(--matcha-color-info-surface-hover);
337
+ --matcha-color-feedback-success-surface-hover: var(--matcha-color-success-surface-hover);
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);
340
+
341
+ // ── Spacing (14 tokens — matches matcha/space/* exato) ────────────────────
342
+ --matcha-space-025: 2px;
343
+ --matcha-space-050: 4px;
344
+ --matcha-space-075: 6px;
345
+ --matcha-space-100: 8px;
346
+ --matcha-space-150: 12px;
347
+ --matcha-space-200: 16px;
348
+ --matcha-space-250: 20px;
349
+ --matcha-space-300: 24px;
350
+ --matcha-space-400: 32px;
351
+ --matcha-space-500: 40px;
352
+ --matcha-space-600: 48px;
353
+ --matcha-space-800: 64px;
354
+ --matcha-space-1000: 80px;
355
+ --matcha-space-1200: 96px;
356
+
357
+ // ── Border radius (8 tokens — matches matcha/radius/* exato) ─────────────
358
+ --matcha-radius-none: 0;
359
+ --matcha-radius-sm: 2px;
360
+ --matcha-radius-md: 4px;
361
+ --matcha-radius-3xs: 6px; // Figma matcha/radius/3xs
362
+ --matcha-radius-lg: 8px;
363
+ --matcha-radius-2xl: 12px; // Figma: 12px (antes code tinha 24, divergia)
364
+ --matcha-radius-xl: 16px;
365
+ --matcha-radius-3xl: 24px; // Figma: matcha/radius/3xl (criado 2026-05-06 pra cobrir uso do utility .radius-24)
366
+ --matcha-radius-pill: 9999px;
367
+ // Alias legado pra usos em páginas de doc (refatorar depois pra usar radius-2xl)
368
+ --matcha-radius-card: var(--matcha-radius-2xl);
369
+
370
+ // ── Border width (4 tokens — matches matcha/border/* exato) ──────────────
371
+ --matcha-border-hairline: 1px; // Subtle borders (card outlines, internal separators)
372
+ --matcha-border-thin: 2px; // Primary borders (button outlines, form fields, active states)
373
+ --matcha-border-medium: 4px; // Emphasis borders (status indicators, nav-item indicators, focus rings on large)
374
+ --matcha-border-thick: 8px; // Heavy borders (section dividers, decoration)
375
+
376
+ // ── Font family (1 token) ────────────────────────────────────────────────
377
+ --matcha-font-family: 'Manrope', sans-serif;
378
+
379
+ // ── Font size (13 tokens — matches matcha/font/size/* from Figma) ─────────
380
+ --matcha-font-size-3xs: 8px;
381
+ --matcha-font-size-2xs: 10px;
382
+ --matcha-font-size-xs: 12px;
383
+ --matcha-font-size-sm: 14px;
384
+ --matcha-font-size-md: 16px;
385
+ --matcha-font-size-lg: 18px;
386
+ --matcha-font-size-xl: 20px;
387
+ --matcha-font-size-2xl: 24px;
388
+ --matcha-font-size-3xl: 32px;
389
+ --matcha-font-size-4xl: 36px;
390
+ --matcha-font-size-5xl: 48px;
391
+ --matcha-font-size-6xl: 60px;
392
+ --matcha-font-size-7xl: 72px;
393
+
394
+ // ── Font weight (8 tokens — matches matcha/font/weight/* exato) ──────────
395
+ // Canônico Figma: extralight (200), light (300), normal (400), medium (500),
396
+ // semi-bold (600), bold (700), extrabold (800), black (900)
397
+ // Código mantém regular/semibold por retrocompat + aliases Figma-exatos
398
+ --matcha-weight-extralight: 200; // Figma canonical
399
+ --matcha-weight-light: 300; // Figma canonical
400
+ --matcha-weight-regular: 400;
401
+ --matcha-weight-normal: 400; // Figma canonical alias
402
+ --matcha-weight-medium: 500;
403
+ --matcha-weight-semibold: 600;
404
+ --matcha-weight-semi-bold: 600; // Figma canonical alias
405
+ --matcha-weight-bold: 700;
406
+ --matcha-weight-extrabold: 800; // Figma VariableID:17195:11 (criado oficialmente)
407
+ --matcha-weight-black: 900;
408
+
409
+ // ── Typography 15 canonical text styles (1:1 com matcha/text/* Figma) ──
410
+ // 13 styles publicados + `display` e `p-tiny` (recriados no Figma 2026-06-03).
411
+ --matcha-text-display-hero: 36px; // matcha/text/Stat Card (EB 36/40/-1.2)
412
+ --matcha-text-display: 32px; // matcha/text/display (Bold 32/40/-0.3)
413
+ --matcha-text-headline: 24px; // matcha/text/headline (Bold 24/32/-0.3)
414
+ --matcha-text-title-lg: 20px; // matcha/text/title-large (SemiBold 20/28)
415
+ --matcha-text-title-md: 18px; // matcha/text/title-medium (SemiBold 18/24)
416
+ --matcha-text-title-sm: 16px; // matcha/text/title-small (SemiBold 16/22)
417
+ --matcha-text-title-xs: 14px; // matcha/text/title-tiny (ExtraBold 14/20)
418
+ --matcha-text-body-lg: 16px; // matcha/text/p-large (Regular 16/24)
419
+ --matcha-text-body-md: 14px; // matcha/text/p-medium (Regular 14/20)
420
+ --matcha-text-body-sm: 12px; // matcha/text/p-small (Regular 12/16)
421
+ --matcha-text-p-tiny: 11px; // matcha/text/p-tiny (Regular 11/14/0.3)
422
+ --matcha-text-label-lg: 16px; // matcha/text/label-large (Medium 16/22)
423
+ --matcha-text-label-md: 14px; // matcha/text/label-medium (Medium 14/20)
424
+ --matcha-text-label-sm: 12px; // matcha/text/label-small (Medium 12/16)
425
+ --matcha-text-overline: 10px; // matcha/text/Uppercase (SemiBold 10/14/1)
426
+
427
+ // Shorthand aliases (usados massivamente em components/*.scss)
428
+ --matcha-text-xs: var(--matcha-text-p-tiny); // 11px — legendas, metadados
429
+ --matcha-text-sm: var(--matcha-text-body-sm); // 12px — texto auxiliar
430
+ --matcha-text-md: var(--matcha-text-body-md); // 14px corpo padrão
431
+ --matcha-text-lg: var(--matcha-text-body-lg); // 16px — texto de destaque
432
+ --matcha-text-xl: var(--matcha-text-title-md); // 18px — títulos de grupo
433
+
434
+ // ── Line heights — canônico (matches Figma text styles) ──────────────────
435
+ --matcha-leading-display-hero: 40px; // Stat Card
436
+ --matcha-leading-display: 40px;
437
+ --matcha-leading-headline: 32px;
438
+ --matcha-leading-title-lg: 28px;
439
+ --matcha-leading-title-md: 24px;
440
+ --matcha-leading-title-sm: 22px;
441
+ --matcha-leading-title-xs: 20px; // title-tiny
442
+ --matcha-leading-body-lg: 24px;
443
+ --matcha-leading-body-md: 20px;
444
+ --matcha-leading-body-sm: 16px;
445
+ --matcha-leading-p-tiny: 14px;
446
+ --matcha-leading-label-lg: 22px;
447
+ --matcha-leading-label-md: 20px;
448
+ --matcha-leading-label-sm: 16px;
449
+ --matcha-leading-overline: 14px; // Uppercase
450
+
451
+ // ── Tracking (letter-spacing) — só styles com valor não-zero ─────────────
452
+ --matcha-tracking-display-hero: -1.2px; // Stat Card
453
+ --matcha-tracking-display: -0.3px;
454
+ --matcha-tracking-headline: -0.3px;
455
+ --matcha-tracking-overline: 1px; // Uppercase
456
+ --matcha-tracking-p-tiny: 0.3px;
457
+
458
+ // Shorthand aliases para line-heights (acompanham --matcha-text-*)
459
+ --matcha-leading-xs: var(--matcha-leading-p-tiny); // 14px
460
+ --matcha-leading-sm: var(--matcha-leading-body-sm); // 16px
461
+ --matcha-leading-md: var(--matcha-leading-body-md); // 20px
462
+ --matcha-leading-lg: var(--matcha-leading-body-lg); // 24px
463
+ --matcha-leading-xl: var(--matcha-leading-title-md); // 24px
464
+
465
+ // ── Line height primitives (4 tokens — matches matcha/line-height/*) ─────
466
+ --matcha-line-height-none: 1;
467
+ --matcha-line-height-tight: 1.2;
468
+ --matcha-line-height-normal: 1.5;
469
+ --matcha-line-height-relaxed: 1.75;
470
+
471
+ // ── Letter spacing (primitives + semantic aliases) ───────────────────────
472
+ --matcha-letter-spacing-tight: -0.5px;
473
+ --matcha-letter-spacing-normal: 0px;
474
+ --matcha-letter-spacing-wide: 0.5px;
475
+ --matcha-letter-spacing-wider: 1px;
476
+ // Semantic aliases alinhados com Figma text styles
477
+ --matcha-letter-spacing-button: 0.2px; // matcha/text/button-*
478
+ --matcha-letter-spacing-caption: 0.3px; // matcha/text/caption + link-sm
479
+
480
+ // ── Elevation (4 shadow tokens) ──────────────────────────────────────────
481
+ --matcha-shadow-1: #{if($is-dark, $shadow-1-dark, $shadow-1-light)};
482
+ --matcha-shadow-2: #{if($is-dark, $shadow-2-dark, $shadow-2-light)};
483
+ --matcha-shadow-3: #{if($is-dark, $shadow-3-dark, $shadow-3-light)};
484
+ --matcha-shadow-4: #{if($is-dark, $shadow-4-dark, $shadow-4-light)};
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
+
497
+ // ── Animation (4 tokens — matches matcha/duration/* from Figma) ──────────
498
+ --matcha-duration-instant: 80ms;
499
+ --matcha-duration-fast: 200ms;
500
+ --matcha-duration-normal: 400ms;
501
+ --matcha-duration-slow: 600ms;
502
+
503
+ // ── Easing (4 tokens — matches matcha/easing/* from Figma) ───────────────
504
+ --matcha-easing-standard: cubic-bezier(0.4, 0, 0.2, 1);
505
+ --matcha-easing-accelerated: cubic-bezier(0.4, 0, 1, 1);
506
+ --matcha-easing-decelerated: cubic-bezier(0, 0, 0.2, 1);
507
+ --matcha-easing-emphasized: cubic-bezier(0.2, 0, 0, 1);
508
+
509
+ // ── Opacity (7 tokens — matches matcha/opacity/* from Figma) ─────────────
510
+ --matcha-opacity-hover: 0.04;
511
+ --matcha-opacity-subtle: 0.10;
512
+ --matcha-opacity-medium: 0.20;
513
+ --matcha-opacity-strong: 0.30;
514
+ --matcha-opacity-disabled: 0.38;
515
+ --matcha-opacity-overlay-soft: 0.40;
516
+ // Específico do matcha/option (Figma DSV3 14237:113) — diferente do disabled global (0.38)
517
+ --matcha-opacity-option-disabled: 0.5;
518
+ --matcha-opacity-secondary: 0.54;
519
+ --matcha-opacity-high: 0.87;
520
+
521
+ // ── State layers (matches matcha/state-layer/* from Figma) ────────────────
522
+ --matcha-state-layer-subtle: 0.04; // Figma matcha/state-layer/subtle
523
+ --matcha-state-layer-hover: 0.08; // Figma matcha/state-layer/hover
524
+ --matcha-state-layer-pressed: 0.12; // Figma matcha/state-layer/pressed
525
+ --matcha-state-layer-active: 0.16; // Figma matcha/state-layer/active
526
+ // Aliases legados (usados nos componentes atuais)
527
+ --matcha-state-hover: var(--matcha-state-layer-hover);
528
+ --matcha-state-active: var(--matcha-state-layer-pressed);
529
+ --matcha-state-focus-ring-width: 2px;
530
+ --matcha-state-focus-ring-offset: 2px;
531
+
532
+ // ── Scrim / Overlay (Figma matcha/overlay Type=Modal / Type=Drawer) ──────
533
+ --matcha-scrim-modal: rgba(0, 0, 0, 0.5);
534
+ --matcha-scrim-modal-blur: 6px;
535
+ --matcha-scrim-drawer: rgba(0, 0, 0, 0.3);
536
+ --matcha-scrim-drawer-blur: 4px;
537
+
538
+ // ── Icon sizes (4 tokens — matches matcha/icon/size/* exato) ─────────────
539
+ --matcha-icon-size-sm: 16px;
540
+ --matcha-icon-size-md: 24px;
541
+ --matcha-icon-size-lg: 32px;
542
+ --matcha-icon-size-xl: 48px;
543
+
544
+ // ── Avatar sizes (1:1 com Figma matcha/avatar — Type=Photo, Size variants)
545
+ --matcha-avatar-xs: 24px;
546
+ --matcha-avatar-sm: 32px;
547
+ --matcha-avatar-md: 40px;
548
+ --matcha-avatar-lg: 56px;
549
+ --matcha-avatar-xl: 80px;
550
+ --matcha-avatar-2xl: 96px;
551
+ // Status indicator — 1:1 com Figma (Status ellipse em cada Size variant)
552
+ --matcha-avatar-status-xs: 6px;
553
+ --matcha-avatar-status-sm: 8px;
554
+ --matcha-avatar-status-md: 10px;
555
+ --matcha-avatar-status-lg: 12px;
556
+ --matcha-avatar-status-xl: 14px;
557
+ --matcha-avatar-status-2xl: 16px;
558
+
559
+ // ── Z-index (8 tokens — matches matcha/z-index/* from Figma) ─────────────
560
+ --matcha-z-base: 1;
561
+ --matcha-z-dropdown: 100;
562
+ --matcha-z-sticky: 200;
563
+ --matcha-z-popover: 300;
564
+ --matcha-z-tooltip: 400;
565
+ --matcha-z-modal-bg: 998;
566
+ --matcha-z-modal: 999;
567
+ --matcha-z-overlay: 1000;
568
+ // Panel flutuante (matcha-panel) — acima de modal pra suportar select/menu
569
+ // dentro de modal. Renderizado via portal-to-body fora de stacking contexts.
570
+ --matcha-z-popover-floating: 10001;
571
+
572
+ // ── Grid (22 tokens — 1:1 com matcha/grid/* do Figma) ────────────────────
573
+ // Frames (breakpoints)
574
+ --matcha-grid-frame-mobile: 375px;
575
+ --matcha-grid-frame-tablet: 768px;
576
+ --matcha-grid-frame-notebook: 1360px;
577
+ --matcha-grid-frame-wide: 1920px;
578
+ // Chrome
579
+ --matcha-grid-header-height: 56px;
580
+ --matcha-grid-header-height-mobile: 48px;
581
+ --matcha-grid-sidebar-rail: 72px;
582
+ --matcha-grid-sidebar-submenu: 216px;
583
+ --matcha-grid-sidebar-total: 304px;
584
+ --matcha-grid-sidebar-gap: 16px;
585
+ // Gutters (espaço entre colunas)
586
+ --matcha-grid-gutter-compact: 8px;
587
+ --matcha-grid-gutter-default: 16px;
588
+ --matcha-grid-gutter-wide: 16px;
589
+ --matcha-grid-max-content-width: 1600px;
590
+ // Column widths (largura INDIVIDUAL de coluna) — Figma verdadeiro
591
+ --matcha-grid-col-painel-full: 72px;
592
+ --matcha-grid-col-painel-rail: 88px;
593
+ --matcha-grid-col-painel-compact: 96px;
594
+ --matcha-grid-col-wide-full: 120px;
595
+ --matcha-grid-col-wide-rail: 112px;
596
+ // Content widths (área útil total) — Figma verdadeiro
597
+ --matcha-grid-content-painel-full: 1040px;
598
+ --matcha-grid-content-painel-rail: 1232px;
599
+ --matcha-grid-content-wide-full: 1616px;
600
+ --matcha-grid-content-wide-rail: 1520px;
601
+
602
+ // Public-facing column widths (site institucional/landing — breakpoint-aware)
603
+ --matcha-grid-col-public-desktop: 80px;
604
+ --matcha-grid-col-public-mobile: 80px;
605
+ --matcha-grid-col-public-tablet: 64px;
606
+
607
+ // Horizontal offsets (distância da borda do frame ao primeiro col da grid)
608
+ --matcha-grid-offset-painel-compact: 24px;
609
+ --matcha-grid-offset-painel-full: 304px;
610
+ --matcha-grid-offset-painel-rail: 96px;
611
+ --matcha-grid-offset-wide-full: 304px;
612
+ --matcha-grid-offset-wide-rail: 248px;
613
+
614
+ // ── Breakpoints (6 tokens — Tailwind-aligned, expostos como CSS vars) ────
615
+ // Pra container queries, JS-side responsive logic (`matchMedia`) e media
616
+ // queries inline (`@media (min-width: var(...))` em CSS moderno). Valores
617
+ // alinhados ao padrão Tailwind/Chakra — familiares e cobrem todos os tiers
618
+ // (mobile pequeno até desktop wide). 1:1 com Figma `matcha/bp/*`.
619
+ //
620
+ // NOTA: SCSS `@mixin breakpoint(...)` em `_breakpoints-tokens.scss` usa
621
+ // valores Angular Material legacy (600/1024/1440/1920) — DESALINHADO destes.
622
+ // Em refactors novos, prefira CSS custom prop `var(--matcha-bp-md)` em vez
623
+ // do mixin SCSS.
624
+ --matcha-bp-xs: 480px; // mobile pequeno
625
+ --matcha-bp-sm: 640px; // mobile grande / tablet portrait
626
+ --matcha-bp-md: 768px; // tablet
627
+ --matcha-bp-lg: 1024px; // desktop pequeno
628
+ --matcha-bp-xl: 1280px; // desktop padrão
629
+ --matcha-bp-2xl: 1536px; // desktop grande / wide
630
+
631
+ // ═════════════════════════════════════════════════════════════════════════
632
+ // 16. NAMING-PARITY ALIASES
633
+ // Aliases que espelham o nome exato das variables do Figma, garantindo que
634
+ // dev possa referenciar o token pelo nome que vê no Figma.
635
+ // ═════════════════════════════════════════════════════════════════════════
636
+
637
+ // Figma: matcha/color/surface/background → ↔ --matcha-color-surface-bg
638
+ --matcha-color-surface-background: var(--matcha-color-surface-bg);
639
+ --matcha-color-surface-background-alpha: var(--matcha-color-surface-bg-alpha);
640
+ --matcha-color-surface-background-inverse: var(--matcha-color-surface-bg-inverse);
641
+
642
+ // Figma: matcha/color/neutral/default → ↔ --matcha-color-neutral
643
+ --matcha-color-neutral-default: var(--matcha-color-neutral);
644
+
645
+ // Figma: matcha/color/interaction/focus-ring → ↔ --matcha-color-focus-ring
646
+ --matcha-color-interaction-focus-ring: var(--matcha-color-focus-ring);
647
+
648
+ // Figma: matcha/z-index/{base,dropdown,…} → ↔ --matcha-z-{base,dropdown,…}
649
+ --matcha-z-index-base: var(--matcha-z-base);
650
+ --matcha-z-index-dropdown: var(--matcha-z-dropdown);
651
+ --matcha-z-index-sticky: var(--matcha-z-sticky);
652
+ --matcha-z-index-popover: var(--matcha-z-popover);
653
+ --matcha-z-index-tooltip: var(--matcha-z-tooltip);
654
+ --matcha-z-index-modal-bg: var(--matcha-z-modal-bg);
655
+ --matcha-z-index-modal: var(--matcha-z-modal);
656
+ --matcha-z-index-overlay: var(--matcha-z-overlay);
657
+ --matcha-z-index-popover-floating: var(--matcha-z-popover-floating);
658
+
659
+ // Figma: matcha/font/weight/semi-bold → ↔ --matcha-weight-semibold
660
+ --matcha-font-weight-extralight: var(--matcha-weight-extralight);
661
+ --matcha-font-weight-light: var(--matcha-weight-light);
662
+ --matcha-font-weight-semi-bold: var(--matcha-weight-semibold);
663
+ --matcha-font-weight-regular: var(--matcha-weight-regular);
664
+ --matcha-font-weight-medium: var(--matcha-weight-medium);
665
+ --matcha-font-weight-bold: var(--matcha-weight-bold);
666
+ --matcha-font-weight-extrabold: var(--matcha-weight-extrabold);
667
+ --matcha-font-weight-black: var(--matcha-weight-black);
668
+
669
+ // ═════════════════════════════════════════════════════════════════════════
670
+ // 17. GRADIENTS
671
+ // Gradients tonais semânticos. Compostos por 2 stops (alpha → surface-card)
672
+ // pra dar fade lateral em banners. Mantém compat com Figma — lá cada stop
673
+ // é uma variable separada (gradients não são tipo nativo de variable).
674
+ // Centralizar aqui evita repetir o linear-gradient em cada componente.
675
+ // ═════════════════════════════════════════════════════════════════════════
676
+
677
+ // Figma DSV3 (matcha/banner 19080:308): tone="info" mapeia pra primary-alpha
678
+ // (#64b5f6 azul), não info-alpha (cyan/turquesa) — alinhamento visual com border + eyebrow.
679
+ --matcha-gradient-banner-info: linear-gradient(
680
+ 90deg,
681
+ var(--matcha-color-primary-alpha) 0%,
682
+ var(--matcha-color-surface-card) 100%
683
+ );
684
+ --matcha-gradient-banner-success: linear-gradient(
685
+ 90deg,
686
+ var(--matcha-color-success-alpha) 0%,
687
+ var(--matcha-color-surface-card) 100%
688
+ );
689
+ --matcha-gradient-banner-warning: linear-gradient(
690
+ 90deg,
691
+ var(--matcha-color-warn-alpha) 0%,
692
+ var(--matcha-color-surface-card) 100%
693
+ );
694
+ --matcha-gradient-banner-accent: linear-gradient(
695
+ 90deg,
696
+ var(--matcha-color-accent-alpha) 0%,
697
+ var(--matcha-color-surface-card) 100%
698
+ );
699
+ --matcha-gradient-banner-danger: linear-gradient(
700
+ 90deg,
701
+ var(--matcha-color-danger-alpha) 0%,
702
+ var(--matcha-color-surface-card) 100%
703
+ );
704
+ }