@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
@@ -16,6 +16,17 @@
16
16
  to { opacity: 0; }
17
17
  }
18
18
 
19
+ // Shake feedback — disparado quando ESC/backdrop click são bloqueados por
20
+ // disableClose=true. Sinaliza visualmente que a ação foi capturada mas
21
+ // bloqueada (em vez de silent fail).
22
+ @keyframes matcha-drawer-shake {
23
+ 0%, 100% { transform: translate3d(0, 0, 0); }
24
+ 20% { transform: translate3d(-8px, 0, 0); }
25
+ 40% { transform: translate3d(8px, 0, 0); }
26
+ 60% { transform: translate3d(-4px, 0, 0); }
27
+ 80% { transform: translate3d(4px, 0, 0); }
28
+ }
29
+
19
30
  @media (prefers-reduced-motion: reduce) {
20
31
  matcha-drawer,
21
32
  .matcha-drawer-backdrop,
@@ -25,12 +36,52 @@
25
36
  }
26
37
  }
27
38
 
39
+ // ── Forced colors (Windows High Contrast) ──
40
+ // rgba/blur/shadow somem; usar Canvas/CanvasText/SelectedItem.
41
+ @media (forced-colors: active) {
42
+ matcha-drawer {
43
+ border: 1px solid CanvasText !important;
44
+ background: Canvas !important;
45
+ box-shadow: none !important;
46
+ }
47
+
48
+ .matcha-drawer-backdrop {
49
+ background: rgba(0, 0, 0, 0.7) !important;
50
+ backdrop-filter: none !important;
51
+ }
52
+
53
+ matcha-drawer:focus-visible {
54
+ outline: 2px solid CanvasText !important;
55
+ }
56
+ }
57
+
58
+ // ── Reduced transparency ──
59
+ // Backdrop blur 4px → solid 85% pra usuários com dificuldade de ler sobre blur.
60
+ @media (prefers-reduced-transparency: reduce) {
61
+ .matcha-drawer-backdrop {
62
+ background: rgba(0, 0, 0, 0.85) !important;
63
+ backdrop-filter: none !important;
64
+ }
65
+ }
66
+
67
+ // ── Print ──
68
+ // Drawer + chrome flutuante somem em impressão.
69
+ @media print {
70
+ matcha-drawer,
71
+ .matcha-drawer-backdrop {
72
+ display: none !important;
73
+ }
74
+
75
+ matcha-drawer-content {
76
+ margin: 0 !important;
77
+ }
78
+ }
79
+
28
80
  // =============================================================================
29
81
  // Theme mixin
30
82
  // =============================================================================
31
83
 
32
84
  @mixin matcha-drawer-theme($theme) {
33
- $is-dark: map.get($theme, is-dark);
34
85
 
35
86
  // ── Container ──
36
87
  matcha-drawer-container {
@@ -40,8 +91,8 @@
40
91
  box-sizing: border-box;
41
92
  -webkit-overflow-scrolling: touch;
42
93
  overflow: hidden;
43
- background-color: var(--matcha-color-bg, #{getBackground($theme)});
44
- color: var(--matcha-color-fg, #{getForeground($theme)});
94
+ background-color: var(--matcha-color-bg);
95
+ color: var(--matcha-color-fg);
45
96
  }
46
97
 
47
98
  // ── Backdrop ──
@@ -77,39 +128,51 @@
77
128
 
78
129
  // ── Drawer ──
79
130
  matcha-drawer {
80
- display: block;
131
+ display: flex;
132
+ flex-direction: column;
81
133
  position: absolute;
82
134
  top: 0;
83
135
  bottom: 0;
136
+ // Default position=start ancora à esquerda. End/bottom override via .matcha-drawer-end/.matcha-drawer-bottom.
137
+ // Sem o explícito, layouts que usam o drawer dentro de containers flexíveis renderizam fora da posição esperada.
138
+ left: 0;
84
139
  z-index: 10;
85
140
  outline: 0;
86
141
  box-sizing: border-box;
87
- overflow-y: auto;
88
- overflow-x: hidden;
142
+ // Drawer raiz não scrolla — só o body slot scrolla (overflow-y:auto).
143
+ // Header/footer são flex-shrink:0 e ficam fixos.
144
+ overflow: hidden;
145
+ // Defensivo: drawer nunca extrapola viewport mesmo com [width] absurdo.
146
+ max-width: 100vw;
89
147
  transform: translate3d(-100%, 0, 0);
90
148
  visibility: hidden;
149
+ // Width inclusa pra animar resize dinâmico (responsive token, [width] bound).
91
150
  transition: transform var(--matcha-duration-normal, 200ms) cubic-bezier(0.16, 1, 0.3, 1),
92
- visibility var(--matcha-duration-normal, 200ms) ease;
93
- background-color: var(--matcha-color-surface, #{getSurface($theme)});
94
- color: var(--matcha-color-fg, #{getForeground($theme)});
151
+ visibility var(--matcha-duration-normal, 200ms) ease,
152
+ width var(--matcha-duration-normal, 200ms) cubic-bezier(0.16, 1, 0.3, 1);
153
+ background-color: var(--matcha-color-surface);
154
+ color: var(--matcha-color-fg);
95
155
  pointer-events: auto;
96
156
 
97
- // Shadow level 3 (modals, drawers)
98
- box-shadow: var(--matcha-shadow-3, #{if($is-dark, $shadow-3-dark, $shadow-3-light)});
157
+ // Shadow inline (3 stacked) — Figma DSV3 spec exato pro drawer.
158
+ // Não usa --matcha-shadow-3 token porque o Figma drawer também usa inline
159
+ // (não bound a um effect style). Side/push modes removem via override.
160
+ box-shadow:
161
+ 0 0 1px rgba(0, 0, 0, 0.08),
162
+ 0 4px 16px rgba(0, 0, 0, 0.12),
163
+ 0 16px 48px rgba(0, 0, 0, 0.16);
99
164
 
100
- @if $is-dark {
101
- border-right: var(--matcha-border-hairline, 1px) solid rgba(255, 255, 255, 0.06);
102
- }
165
+ // Borda da edge só aparece no dark (var = 0/transparent no light, sem mudar layout).
166
+ border-right: var(--matcha-drawer-border);
103
167
 
104
- // Position end (right)
168
+ // Position end (right) — overrides left:0 default
105
169
  &.matcha-drawer-end {
170
+ left: auto;
106
171
  right: 0;
107
172
  transform: translate3d(100%, 0, 0);
108
173
 
109
- @if $is-dark {
110
- border-right: none;
111
- border-left: var(--matcha-border-hairline, 1px) solid rgba(255, 255, 255, 0.06);
112
- }
174
+ border-right: 0 solid transparent;
175
+ border-left: var(--matcha-drawer-border);
113
176
  }
114
177
 
115
178
  // Position bottom (bottom sheet)
@@ -119,28 +182,61 @@
119
182
  right: 0;
120
183
  bottom: 0;
121
184
  width: 100%;
122
- max-height: 90vh;
185
+ // 90% do container (relative ao matcha-drawer-container parent).
186
+ // Em produção (container = viewport via 100vh), == 90vh efetivo.
187
+ // Em playground/embed (container 360px), == 324px e respeita o frame.
188
+ // min() com fallback 90vh garante comportamento se parent for auto.
189
+ max-height: min(90vh, 90%);
123
190
  border-radius: var(--matcha-radius-xl, 16px) var(--matcha-radius-xl, 16px) 0 0;
124
191
  transform: translate3d(0, 100%, 0);
125
192
 
126
- @if $is-dark {
127
- border-right: none;
128
- border-top: var(--matcha-border-hairline, 1px) solid rgba(255, 255, 255, 0.06);
129
- } @else {
130
- border-right: none;
193
+ border-right: 0 solid transparent;
194
+ border-top: var(--matcha-drawer-border);
195
+
196
+ // safe-area-inset-bottom — iPhone X+ home indicator não cobre footer.
197
+ // Aplicado no slot footer porque é onde botões/CTAs ficam.
198
+ .matcha-drawer__slot--footer {
199
+ padding-block-end: max(var(--drawer-pad-y), env(safe-area-inset-bottom, var(--drawer-pad-y)));
131
200
  }
201
+ }
202
+
203
+ // ── Drag handle (bottom sheet drag-to-dismiss) ──
204
+ // Real elemento (não pseudo) pra capturar pointer events. Renderiza só
205
+ // em position=bottom. 32×4 visual + 32×24 hit area via pad pra touch.
206
+ .matcha-drawer__handle {
207
+ display: none;
208
+ flex-shrink: 0;
209
+ width: 100%;
210
+ padding: var(--matcha-space-100, 8px) 0;
211
+ cursor: grab;
212
+ touch-action: none; // bloqueia scroll-pan vertical default no handle
213
+ user-select: none;
132
214
 
133
- // Drag handle
134
215
  &::before {
135
216
  content: '';
136
217
  display: block;
137
218
  width: 32px;
138
219
  height: 4px;
139
- margin: var(--matcha-space-100, 8px) auto;
220
+ margin: 0 auto;
140
221
  border-radius: var(--matcha-radius-sm, 2px);
141
- background: var(--matcha-color-hint, #{getGrey($theme)});
222
+ background: var(--matcha-color-hint, var(--matcha-color-text-muted));
142
223
  opacity: 0.3;
143
224
  }
225
+
226
+ &:active {
227
+ cursor: grabbing;
228
+
229
+ &::before { opacity: 0.5; }
230
+ }
231
+ }
232
+
233
+ &.matcha-drawer-bottom .matcha-drawer__handle {
234
+ display: block;
235
+ }
236
+
237
+ // Drag em andamento — desabilita transition pra seguir o dedo 1:1.
238
+ &.matcha-drawer--dragging {
239
+ transition: none !important;
144
240
  }
145
241
 
146
242
  // Opened state
@@ -154,68 +250,113 @@
154
250
  z-index: 15;
155
251
  }
156
252
 
157
- // Mode: side — fixed, no shadow, border only
253
+ // Mode: side — fixed, no shadow, border via surface-border token (DSV3 canônico).
158
254
  &.matcha-drawer-side {
159
255
  z-index: 10;
160
- border-right: var(--matcha-border-hairline, 1px) solid var(--matcha-color-border, #{getGrey($theme)});
256
+ border-right: var(--matcha-border-hairline, 1px) solid var(--matcha-color-surface-border, var(--matcha-color-border));
161
257
  box-shadow: none;
162
258
 
163
259
  &.matcha-drawer-end {
164
260
  border-right: none;
165
- border-left: var(--matcha-border-hairline, 1px) solid var(--matcha-color-border, #{getGrey($theme)});
261
+ border-left: var(--matcha-border-hairline, 1px) solid var(--matcha-color-surface-border, var(--matcha-color-border));
166
262
  }
167
263
  }
168
264
 
169
- // Mode: push — pushes content, border only
265
+ // Mode: push — pushes content, border only.
170
266
  &.matcha-drawer-push {
171
- border-right: var(--matcha-border-hairline, 1px) solid var(--matcha-color-border, #{getGrey($theme)});
267
+ border-right: var(--matcha-border-hairline, 1px) solid var(--matcha-color-surface-border, var(--matcha-color-border));
172
268
  box-shadow: none;
173
269
 
174
270
  &.matcha-drawer-end {
175
271
  border-right: none;
176
- border-left: var(--matcha-border-hairline, 1px) solid var(--matcha-color-border, #{getGrey($theme)});
272
+ border-left: var(--matcha-border-hairline, 1px) solid var(--matcha-color-surface-border, var(--matcha-color-border));
177
273
  }
178
274
  }
179
275
 
180
- // Inner container
181
- .matcha-drawer-inner-container {
182
- width: 100%;
183
- height: 100%;
276
+ // Shake state — feedback visual quando ESC/backdrop bloqueados por disableClose.
277
+ // Animation roda 400ms, sobrepondo o transform: translate3d(0,0,0) do .matcha-drawer-opened.
278
+ // Após terminar, transform volta pro estado .matcha-drawer-opened normal.
279
+ &.matcha-drawer-shake {
280
+ animation: matcha-drawer-shake 400ms ease-in-out;
281
+ }
282
+
283
+ // ── Slot architecture (header / body / footer) ──
284
+ //
285
+ // CSS vars (consumer override sem !important):
286
+ // --drawer-pad-x / --drawer-pad-y → padding uniforme de cada slot
287
+ // --drawer-divider → border entre slots (default mostra)
288
+ //
289
+ // Cada slot tem padding UNIFORME (não asymmetric). Header e footer
290
+ // ganham border-bottom/top respectivamente — separação visual clara
291
+ // sem depender de gaps assimétricos. Pattern canônico Material/Antd.
292
+ //
293
+ // Defaults simétricos 20/20 (calibração 2026-05-08): alinha com card md
294
+ // e segue padrão DS moderno (Material 16, shadcn 24, Notion 16 — 20 é o
295
+ // sweet spot). Antes era 24/20 assimétrico — quirky e sem motivo claro.
296
+ --drawer-pad-x: var(--matcha-space-250, 20px);
297
+ --drawer-pad-y: var(--matcha-space-250, 20px);
298
+ --drawer-divider: var(--matcha-border-hairline, 1px) solid var(--matcha-color-surface-border, rgba(255, 255, 255, 0.12));
299
+
300
+ .matcha-drawer__slot {
184
301
  display: flex;
185
302
  flex-direction: column;
303
+ min-width: 0;
304
+
305
+ // Hide vazio (Chrome 105+/Safari 15.4+/FF 121+).
306
+ &:not(:has(*)) {
307
+ display: none;
308
+ }
309
+ }
310
+
311
+ // Header — fixo no topo (não scrolla com body). Border-bottom separa do body.
312
+ // Elemento projetado pelo consumer recebe flex row via `> *`.
313
+ .matcha-drawer__slot--header {
314
+ flex: 0 0 auto;
315
+ padding: var(--drawer-pad-y) var(--drawer-pad-x);
316
+ border-bottom: var(--drawer-divider);
317
+ color: var(--matcha-color-fg);
318
+
319
+ > * {
320
+ display: flex;
321
+ flex-direction: row;
322
+ align-items: center;
323
+ justify-content: space-between;
324
+ gap: var(--matcha-space-150, 12px);
325
+ width: 100%;
326
+ min-width: 0;
327
+ }
328
+ }
329
+
330
+ // Body — cresce e scrolla quando overflow.
331
+ .matcha-drawer__slot--body {
332
+ flex: 1 1 auto;
333
+ overflow-y: auto;
334
+ overflow-x: hidden;
335
+ padding: var(--drawer-pad-y) var(--drawer-pad-x);
336
+ color: var(--matcha-color-fg);
186
337
  -webkit-overflow-scrolling: touch;
338
+ gap: var(--matcha-space-150, 12px);
187
339
  }
188
- }
189
340
 
190
- // ── Drawer header ──
191
- .matcha-drawer-header {
192
- display: flex;
193
- align-items: center;
194
- justify-content: space-between;
195
- gap: var(--matcha-space-150, 12px);
196
- padding: var(--matcha-space-200, 16px) var(--matcha-space-300, 24px);
197
- flex-shrink: 0;
198
- color: var(--matcha-color-fg, #{getForeground($theme)});
199
- }
341
+ // Footer fixo no bottom. Border-top separa do body.
342
+ .matcha-drawer__slot--footer {
343
+ flex: 0 0 auto;
344
+ padding: var(--drawer-pad-y) var(--drawer-pad-x);
345
+ border-top: var(--drawer-divider);
200
346
 
201
- // ── Drawer content ──
202
- .matcha-drawer-content-area {
203
- flex: 1;
204
- overflow-y: auto;
205
- overflow-x: hidden;
206
- padding: var(--matcha-space-300, 24px);
207
- color: var(--matcha-color-fg, #{getForeground($theme)});
347
+ > * {
348
+ display: flex;
349
+ flex-direction: row;
350
+ align-items: center;
351
+ justify-content: flex-end;
352
+ gap: var(--matcha-space-150, 12px);
353
+ width: 100%;
354
+ min-width: 0;
355
+ flex-wrap: wrap;
356
+ }
357
+ }
208
358
  }
209
359
 
210
- // ── Drawer footer ──
211
- .matcha-drawer-footer {
212
- display: flex;
213
- align-items: center;
214
- justify-content: flex-end;
215
- gap: var(--matcha-space-150, 12px);
216
- padding: var(--matcha-space-200, 16px) var(--matcha-space-300, 24px);
217
- flex-shrink: 0;
218
- }
219
360
 
220
361
  // ── Drawer content (main page) ──
221
362
  matcha-drawer-content {
@@ -229,7 +370,7 @@
229
370
 
230
371
  // ── Focus ring ──
231
372
  matcha-drawer:focus-visible {
232
- outline: var(--matcha-state-focus-ring-width, 2px) solid var(--matcha-color-accent, #{getAccent($theme)});
373
+ outline: var(--matcha-state-focus-ring-width, 2px) solid var(--matcha-color-accent);
233
374
  outline-offset: var(--matcha-state-focus-ring-offset, 2px);
234
375
  }
235
376
  }
@@ -0,0 +1,14 @@
1
+ @use "sass:map";
2
+
3
+ // =============================================================================
4
+ // matcha-drop-image — Estilos completos vivem no próprio componente
5
+ // (drop-image.component.scss com ViewEncapsulation.None).
6
+ //
7
+ // Esse arquivo mantém apenas o mixin no-op pra preservar a chamada @include
8
+ // no main.scss sem quebrar. Quando o componente DSV3 amadurecer e precisar de
9
+ // theme-specific styling (light/dark sass-side), retornar aqui.
10
+ // =============================================================================
11
+
12
+ @mixin matcha-drop-image-theme($theme) {
13
+ // No-op — estilos no componente.
14
+ }
@@ -6,7 +6,6 @@
6
6
 
7
7
  // Mixin para cores e temas
8
8
  @mixin matcha-drop-list-theme($theme) {
9
- $is-dark: map.get($theme, is-dark);
10
9
 
11
10
  // =============================================================================
12
11
  // COMPONENTE PRINCIPAL
@@ -33,8 +32,8 @@
33
32
  transition: background-color 0.2s ease, border-color 0.2s ease, padding 0.2s ease;
34
33
 
35
34
  &.matcha-drop-list-receiving {
36
- background-color: getPrimaryAlpha($theme);
37
- border-color: var(--matcha-color-accent, #{getAccent($theme)});
35
+ background-color: var(--matcha-color-primary-alpha);
36
+ border-color: var(--matcha-color-accent);
38
37
  border-width: 2px;
39
38
  border-style: dashed;
40
39
  border-radius: var(--matcha-radius-lg, 8px);
@@ -50,12 +49,12 @@
50
49
  bottom: 0;
51
50
  background: linear-gradient(45deg,
52
51
  transparent 25%,
53
- getPrimaryAlpha($theme) 25%,
54
- getPrimaryAlpha($theme) 50%,
52
+ var(--matcha-color-primary-alpha) 25%,
53
+ var(--matcha-color-primary-alpha) 50%,
55
54
  transparent 50%,
56
55
  transparent 75%,
57
- getPrimaryAlpha($theme) 75%,
58
- getPrimaryAlpha($theme));
56
+ var(--matcha-color-primary-alpha) 75%,
57
+ var(--matcha-color-primary-alpha));
59
58
  background-size: 16px 16px;
60
59
  animation: drop-zone-animation 2s linear infinite;
61
60
  border-radius: var(--matcha-radius-md, 4px);
@@ -65,19 +64,19 @@
65
64
 
66
65
  // Estados de aceitação de drop
67
66
  &.matcha-drop-list-can-accept {
68
- background-color: getGreenAlpha($theme);
69
- border-color: getGreen($theme);
67
+ background-color: var(--matcha-color-success-alpha);
68
+ border-color: var(--matcha-color-success);
70
69
  cursor: copy;
71
70
 
72
71
  &::before {
73
72
  background: linear-gradient(45deg,
74
73
  transparent 25%,
75
- getGreenAlpha($theme) 25%,
76
- getGreenAlpha($theme) 50%,
74
+ var(--matcha-color-success-alpha) 25%,
75
+ var(--matcha-color-success-alpha) 50%,
77
76
  transparent 50%,
78
77
  transparent 75%,
79
- getGreenAlpha($theme) 75%,
80
- getGreenAlpha($theme));
78
+ var(--matcha-color-success-alpha) 75%,
79
+ var(--matcha-color-success-alpha));
81
80
  background-size: 16px 16px;
82
81
  animation: drop-zone-animation 1.5s linear infinite;
83
82
  opacity: 0.5;
@@ -87,20 +86,20 @@
87
86
 
88
87
 
89
88
  &.matcha-drop-list-cannot-accept {
90
- background-color: getRedAlpha($theme);
91
- border-color: getRed($theme);
89
+ background-color: var(--matcha-color-danger-alpha);
90
+ border-color: var(--matcha-color-danger);
92
91
  pointer-events: none;
93
92
  cursor: default;
94
93
 
95
94
  &::before {
96
95
  background: linear-gradient(45deg,
97
96
  transparent 25%,
98
- getRedAlpha($theme) 25%,
99
- getRedAlpha($theme) 50%,
97
+ var(--matcha-color-danger-alpha) 25%,
98
+ var(--matcha-color-danger-alpha) 50%,
100
99
  transparent 50%,
101
100
  transparent 75%,
102
- getRedAlpha($theme) 75%,
103
- getRedAlpha($theme));
101
+ var(--matcha-color-danger-alpha) 75%,
102
+ var(--matcha-color-danger-alpha));
104
103
  background-size: 16px 16px;
105
104
  animation: drop-zone-animation 0.8s linear infinite;
106
105
  opacity: 0.6;
@@ -108,13 +107,54 @@
108
107
  }
109
108
 
110
109
  &.matcha-drop-list-disabled {
111
- color: var(--matcha-color-disabled-fg, #{getDisabledBgContrast($theme)});
112
- background-color: var(--matcha-color-disabled-bg, #{getDisabled($theme)});
110
+ color: var(--matcha-color-disabled-fg);
111
+ background-color: var(--matcha-color-disabled-bg);
113
112
  pointer-events: none;
114
113
  cursor: default;
115
114
  }
116
115
  }
117
116
 
117
+ // =============================================================================
118
+ // DROP ZONE (matchaDropZone directive — reparenting target)
119
+ // =============================================================================
120
+
121
+ .matcha-drop-zone-cannot-accept {
122
+ border: 2px dashed var(--matcha-color-danger) !important;
123
+ border-radius: 8px;
124
+ background-color: var(--matcha-color-danger-alpha);
125
+ cursor: not-allowed;
126
+ transition: background-color 0.15s linear, border-color 0.15s linear;
127
+ }
128
+
129
+ // Fix C: quando o drop zone pai está rejeitado (vermelho), a lista filha
130
+ // recebendo o drag também deve ficar vermelha — não verde.
131
+ .matcha-drop-zone-cannot-accept .matcha-drop-list-container.matcha-drop-list-receiving {
132
+ background-color: var(--matcha-color-danger-alpha);
133
+ border-color: var(--matcha-color-danger);
134
+
135
+ &::before {
136
+ background: linear-gradient(45deg,
137
+ transparent 25%, var(--matcha-color-danger-alpha) 25%, var(--matcha-color-danger-alpha) 50%,
138
+ transparent 50%, transparent 75%, var(--matcha-color-danger-alpha) 75%, var(--matcha-color-danger-alpha));
139
+ background-size: 16px 16px;
140
+ animation: drop-zone-animation 0.8s linear infinite;
141
+ opacity: 0.6;
142
+ }
143
+ }
144
+
145
+ // =============================================================================
146
+ // GHOST CLONE (criado dinamicamente no body durante o drag)
147
+ // =============================================================================
148
+
149
+ .matcha-drag-ghost {
150
+ pointer-events: none;
151
+ opacity: 0.85;
152
+ z-index: 9999;
153
+ box-shadow: 0 8px 24px rgba(0, 0, 0, 0.18);
154
+ border-radius: var(--matcha-radius-md, 4px);
155
+ will-change: transform;
156
+ }
157
+
118
158
  // =============================================================================
119
159
  // ITENS ARRASTÁVEIS — Template A
120
160
  // =============================================================================
@@ -127,8 +167,8 @@
127
167
  overflow: hidden;
128
168
  transition: box-shadow 0.2s ease, transform 0.2s ease, opacity 0.2s ease;
129
169
  user-select: none;
130
- background-color: var(--matcha-color-surface, #{getSurface($theme)});
131
- color: var(--matcha-color-fg, #{getForeground($theme)});
170
+ background-color: var(--matcha-color-surface);
171
+ color: var(--matcha-color-fg);
132
172
 
133
173
  // State layer (Template A)
134
174
  &::before {
@@ -150,7 +190,7 @@
150
190
  &:active:not([disabled])::before { opacity: var(--matcha-state-active, 0.12); }
151
191
 
152
192
  &:focus-visible:not([disabled]) {
153
- outline: var(--matcha-state-focus-ring-width, 2px) solid var(--matcha-color-accent, #{getAccent($theme)});
193
+ outline: var(--matcha-state-focus-ring-width, 2px) solid var(--matcha-color-accent);
154
194
  outline-offset: var(--matcha-state-focus-ring-offset, 2px);
155
195
  }
156
196
 
@@ -162,8 +202,8 @@
162
202
  z-index: 1000;
163
203
  cursor: grabbing;
164
204
  position: relative;
165
- box-shadow: 0 8px 25px getDisabledContrastAlpha($theme);
166
- background-color: var(--matcha-color-surface, #{getSurface($theme)});
205
+ box-shadow: 0 8px 25px var(--matcha-color-text-muted);
206
+ background-color: var(--matcha-color-surface);
167
207
  transform: scale(1.02);
168
208
  opacity: 0.95;
169
209
 
@@ -175,7 +215,7 @@
175
215
  border-radius: var(--matcha-radius-lg, 8px);
176
216
  z-index: -1;
177
217
  opacity: 0.1;
178
- background: linear-gradient(45deg, getSurface($theme), getPrimary($theme));
218
+ background: linear-gradient(45deg, var(--matcha-color-surface), var(--matcha-color-primary));
179
219
  animation: drag-glow 1s ease-in-out infinite alternate;
180
220
  }
181
221
  }
@@ -183,15 +223,15 @@
183
223
  &.matcha-drag-disabled {
184
224
  pointer-events: none;
185
225
  cursor: default;
186
- color: var(--matcha-color-disabled-fg, #{getDisabledBgContrast($theme)});
187
- background-color: var(--matcha-color-disabled-bg, #{getDisabled($theme)});
226
+ color: var(--matcha-color-disabled-fg);
227
+ background-color: var(--matcha-color-disabled-bg);
188
228
  }
189
229
 
190
230
  &.disabled-item {
191
231
  pointer-events: none;
192
232
  cursor: default;
193
- color: var(--matcha-color-disabled-fg, #{getDisabledBgContrast($theme)});
194
- background-color: var(--matcha-color-disabled-bg, #{getDisabled($theme)});
233
+ color: var(--matcha-color-disabled-fg);
234
+ background-color: var(--matcha-color-disabled-bg);
195
235
  }
196
236
  }
197
237
 
@@ -225,7 +265,7 @@
225
265
 
226
266
  .item-title {
227
267
  font-weight: 500;
228
- color: var(--matcha-color-fg, #{getForeground($theme)});
268
+ color: var(--matcha-color-fg);
229
269
 
230
270
  &.completed {
231
271
  text-decoration: line-through;
@@ -236,13 +276,13 @@
236
276
  .item-id {
237
277
  font-size: var(--matcha-text-body-sm, 12px);
238
278
  font-family: monospace;
239
- color: getDisabledContrastAlpha($theme);
279
+ color: var(--matcha-color-text-muted);
240
280
  }
241
281
 
242
282
  small {
243
- font-size: var(--matcha-text-caption, 11px);
283
+ font-size: var(--matcha-text-p-tiny, 11px);
244
284
  font-style: italic;
245
- color: getForegroundAlpha($theme);
285
+ color: var(--matcha-color-fg-alpha);
246
286
  }
247
287
  }
248
288
 
@@ -276,7 +316,7 @@
276
316
  pointer-events: none;
277
317
  margin: 0;
278
318
  border-radius: var(--matcha-radius-sm, 2px);
279
- background-color: var(--matcha-color-accent, #{getAccent($theme)});
319
+ background-color: var(--matcha-color-accent);
280
320
 
281
321
  &.active {
282
322
  opacity: 1;
@@ -305,19 +345,19 @@
305
345
  font-size: var(--matcha-text-body-md, 14px);
306
346
  border-radius: var(--matcha-radius-md, 4px);
307
347
  transition: color 0.2s ease, border-color 0.2s ease, background-color 0.2s ease;
308
- color: getDisabledContrastAlpha($theme);
309
- border-color: getForegroundAlpha($theme);
348
+ color: var(--matcha-color-text-muted);
349
+ border-color: var(--matcha-color-fg-alpha);
310
350
 
311
351
  &.can-accept {
312
- color: getGreen($theme);
313
- border-color: getGreen($theme);
314
- background-color: getGreenAlpha($theme);
352
+ color: var(--matcha-color-success);
353
+ border-color: var(--matcha-color-success);
354
+ background-color: var(--matcha-color-success-alpha);
315
355
  }
316
356
 
317
357
  &.cannot-accept {
318
- color: getRed($theme);
319
- border-color: getRed($theme);
320
- background-color: getRedAlpha($theme);
358
+ color: var(--matcha-color-danger);
359
+ border-color: var(--matcha-color-danger);
360
+ background-color: var(--matcha-color-danger-alpha);
321
361
  animation: shake 0.5s ease-in-out;
322
362
  }
323
363
  }
@@ -329,12 +369,12 @@
329
369
 
330
370
  @media (prefers-contrast: high) {
331
371
  .matcha-drop-list-container.matcha-drop-list-receiving {
332
- border-color: var(--matcha-color-fg, #{getForeground($theme)});
333
- background-color: getForegroundAlpha($theme);
372
+ border-color: var(--matcha-color-fg);
373
+ background-color: var(--matcha-color-fg-alpha);
334
374
  }
335
375
 
336
376
  .matcha-drag-item.matcha-drag-dragging {
337
- border: 2px solid var(--matcha-color-fg, #{getForeground($theme)});
377
+ border: 2px solid var(--matcha-color-fg);
338
378
  }
339
379
  }
340
380
  }