@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,32 +16,16 @@ $icon-size-md: 24px;
16
16
  $icon-size-lg: 32px;
17
17
  $icon-size-xl: 48px;
18
18
 
19
- // ── Material Symbols Rounded aplicação global da font ─────────────────
20
- // Usa as propriedades herdáveis (font-family, font-feature-settings) no host
21
- // para que o texto filho (ligature) renderize como glyph.
22
- matcha-icon[library="symbols"] {
23
- font-family: 'Material Symbols Rounded', sans-serif !important;
24
- font-weight: normal;
25
- font-style: normal;
26
- letter-spacing: normal;
27
- text-transform: none;
28
- white-space: nowrap;
29
- word-wrap: normal;
30
- direction: ltr;
31
- -webkit-font-smoothing: antialiased;
32
- -moz-osx-font-smoothing: grayscale;
33
- text-rendering: optimizeLegibility;
34
- font-feature-settings: 'liga' !important;
35
- overflow: hidden;
36
- }
19
+ // matcha-icon[library="symbols"]renderiza SVG inline via figma-icons.ts.
20
+ // Sem dependência de font externa. Apenas tamanho via [size="..."] tokens.
37
21
 
38
22
  [class^="i-matcha-"],
39
23
  [class*=" i-matcha-"],
40
24
  matcha-icon[library="symbols"] {
41
- font-size: var(--matcha-icon-size-md, #{$icon-size-md});
42
- width: var(--matcha-icon-size-md, #{$icon-size-md});
43
- height: var(--matcha-icon-size-md, #{$icon-size-md});
44
- line-height: var(--matcha-icon-size-md, #{$icon-size-md});
25
+ font-size: var(--matcha-icon-size-md);
26
+ width: var(--matcha-icon-size-md);
27
+ height: var(--matcha-icon-size-md);
28
+ line-height: var(--matcha-icon-size-md);
45
29
 
46
30
  &.i-size-xs,
47
31
  &[size="xs"] {
@@ -53,50 +37,58 @@ matcha-icon[library="symbols"] {
53
37
 
54
38
  &.i-size-sm,
55
39
  &[size="sm"] {
56
- font-size: var(--matcha-icon-size-sm, #{$icon-size-sm});
57
- width: var(--matcha-icon-size-sm, #{$icon-size-sm});
58
- height: var(--matcha-icon-size-sm, #{$icon-size-sm});
59
- line-height: var(--matcha-icon-size-sm, #{$icon-size-sm});
40
+ font-size: var(--matcha-icon-size-sm);
41
+ width: var(--matcha-icon-size-sm);
42
+ height: var(--matcha-icon-size-sm);
43
+ line-height: var(--matcha-icon-size-sm);
60
44
  }
61
45
 
62
46
  &.i-size-md,
63
47
  &[size="md"] {
64
- font-size: var(--matcha-icon-size-md, #{$icon-size-md});
65
- width: var(--matcha-icon-size-md, #{$icon-size-md});
66
- height: var(--matcha-icon-size-md, #{$icon-size-md});
67
- line-height: var(--matcha-icon-size-md, #{$icon-size-md});
48
+ font-size: var(--matcha-icon-size-md);
49
+ width: var(--matcha-icon-size-md);
50
+ height: var(--matcha-icon-size-md);
51
+ line-height: var(--matcha-icon-size-md);
68
52
  }
69
53
 
70
54
  &.i-size-lg,
71
55
  &[size="lg"] {
72
- font-size: var(--matcha-icon-size-lg, #{$icon-size-lg});
73
- width: var(--matcha-icon-size-lg, #{$icon-size-lg});
74
- height: var(--matcha-icon-size-lg, #{$icon-size-lg});
75
- line-height: var(--matcha-icon-size-lg, #{$icon-size-lg});
56
+ font-size: var(--matcha-icon-size-lg);
57
+ width: var(--matcha-icon-size-lg);
58
+ height: var(--matcha-icon-size-lg);
59
+ line-height: var(--matcha-icon-size-lg);
76
60
  }
77
61
 
78
62
  &.i-size-xl,
79
63
  &[size="xl"] {
80
- font-size: var(--matcha-icon-size-xl, #{$icon-size-xl});
81
- width: var(--matcha-icon-size-xl, #{$icon-size-xl});
82
- height: var(--matcha-icon-size-xl, #{$icon-size-xl});
83
- line-height: var(--matcha-icon-size-xl, #{$icon-size-xl});
64
+ font-size: var(--matcha-icon-size-xl);
65
+ width: var(--matcha-icon-size-xl);
66
+ height: var(--matcha-icon-size-xl);
67
+ line-height: var(--matcha-icon-size-xl);
84
68
  }
85
69
  }
86
70
 
87
71
  // ── Theme mixin (color inheritance) ─────────────────────────────────────────
72
+ // Pattern CSS-var: `--matcha-icon-color` resolve a cor final.
73
+ // Cascateia naturalmente — qualquer parent pode override sem specificity battle.
74
+ //
75
+ // <!-- Override no consumer (sem [color] attr): -->
76
+ // .my-banner { --matcha-icon-color: var(--matcha-color-feedback-danger); }
77
+ //
78
+ // <!-- Override no proprio matcha-icon: -->
79
+ // <matcha-icon color="danger" /> // attr seta --matcha-icon-color via SCSS abaixo
88
80
  @mixin matcha-icon-theme($theme) {
89
81
  matcha-icon,
90
82
  [class^="i-matcha-"],
91
83
  [class*=" i-matcha-"] {
92
- color: var(--matcha-color-icon-default, #{getBlueGrey($theme)});
84
+ color: var(--matcha-icon-color, var(--matcha-color-icon-default));
93
85
 
94
- &.color-fg, &[color="fg"] { color: var(--matcha-color-fg, #{getForeground($theme)}); }
95
- &.color-accent, &[color="accent"] { color: var(--matcha-color-accent, #{getAccent($theme)}); }
96
- &.color-primary, &[color="primary"] { color: var(--matcha-color-primary, #{getPrimary($theme)}); }
97
- &.color-danger, &[color="danger"] { color: var(--matcha-color-danger, #{getDanger($theme)}); }
98
- &.color-warn, &[color="warn"] { color: var(--matcha-color-warn, #{getWarn($theme)}); }
99
- &.color-success, &[color="success"] { color: var(--matcha-color-success, #{getSuccess($theme)}); }
86
+ &.color-fg, &[color="fg"] { --matcha-icon-color: var(--matcha-color-fg); }
87
+ &.color-accent, &[color="accent"] { --matcha-icon-color: var(--matcha-color-accent); }
88
+ &.color-primary, &[color="primary"] { --matcha-icon-color: var(--matcha-color-primary); }
89
+ &.color-danger, &[color="danger"] { --matcha-icon-color: var(--matcha-color-danger); }
90
+ &.color-warn, &[color="warn"] { --matcha-icon-color: var(--matcha-color-warn); }
91
+ &.color-success, &[color="success"] { --matcha-icon-color: var(--matcha-color-success); }
100
92
 
101
93
  &[disabled],
102
94
  &.disabled {
@@ -8,14 +8,13 @@
8
8
  // =============================================================================
9
9
 
10
10
  @mixin matcha-image-theme($theme) {
11
- $is-dark: map.get($theme, is-dark);
12
11
 
13
12
  .matcha-image {
14
- background: var(--matcha-color-surface, #{getSurface($theme)});
13
+ background: var(--matcha-color-surface);
15
14
  }
16
15
 
17
16
  .matcha-image__placeholder-icon {
18
- color: var(--matcha-color-text-placeholder, #{getBlueGrey($theme)});
17
+ color: var(--matcha-color-text-placeholder);
19
18
  }
20
19
  }
21
20
 
@@ -39,7 +39,6 @@
39
39
  // =============================================================================
40
40
 
41
41
  @mixin matcha-list-theme($theme) {
42
- $is-dark: map.get($theme, is-dark);
43
42
 
44
43
  // ── List container ──
45
44
  matcha-list,
@@ -67,13 +66,13 @@
67
66
  border-radius: var(--matcha-radius-md, 4px);
68
67
  cursor: pointer;
69
68
  outline: none;
70
- color: var(--matcha-color-fg, #{getForeground($theme)});
69
+ color: var(--matcha-list-item-text, var(--matcha-color-fg));
71
70
  text-decoration: none;
72
71
  transition: background-color 150ms;
73
72
 
74
73
  // Focus ring
75
74
  &:focus-visible {
76
- outline: var(--matcha-state-focus-ring-width, 2px) solid var(--matcha-color-accent, #{getAccent($theme)});
75
+ outline: var(--matcha-state-focus-ring-width, 2px) solid var(--matcha-color-accent);
77
76
  outline-offset: var(--matcha-state-focus-ring-offset, 2px);
78
77
  }
79
78
 
@@ -87,15 +86,15 @@
87
86
 
88
87
  // Active/Selected
89
88
  &.matcha-list-item--active {
90
- background-color: var(--matcha-color-accent-surface, #{getAccentAlpha($theme)});
89
+ background-color: var(--matcha-color-accent-surface, var(--matcha-color-accent-alpha));
91
90
 
92
91
  .matcha-list-item__label {
93
- color: var(--matcha-color-accent, #{getAccent($theme)});
92
+ color: var(--matcha-color-accent);
94
93
  font-weight: 600;
95
94
  }
96
95
 
97
96
  .matcha-list-item__leading {
98
- color: var(--matcha-color-accent, #{getAccent($theme)});
97
+ color: var(--matcha-color-accent);
99
98
  }
100
99
  }
101
100
  }
@@ -115,7 +114,7 @@
115
114
  display: flex;
116
115
  align-items: center;
117
116
  justify-content: center;
118
- color: var(--matcha-color-hint, #{getGrey($theme)});
117
+ color: var(--matcha-color-hint, var(--matcha-color-text-muted));
119
118
  }
120
119
 
121
120
  // ── Text area (label + description) ──
@@ -131,7 +130,7 @@
131
130
  font-size: var(--matcha-text-body-md, 14px);
132
131
  font-weight: var(--matcha-weight-regular, 400);
133
132
  line-height: var(--matcha-leading-body-md, 20px);
134
- color: var(--matcha-color-fg, #{getForeground($theme)});
133
+ color: var(--matcha-list-item-text, var(--matcha-color-fg));
135
134
  overflow: hidden;
136
135
  text-overflow: ellipsis;
137
136
  white-space: nowrap;
@@ -141,7 +140,7 @@
141
140
  font-size: var(--matcha-text-body-sm, 12px);
142
141
  font-weight: var(--matcha-weight-regular, 400);
143
142
  line-height: var(--matcha-leading-body-sm, 16px);
144
- color: var(--matcha-color-hint, #{getGrey($theme)});
143
+ color: var(--matcha-color-hint, var(--matcha-color-text-muted));
145
144
  overflow: hidden;
146
145
  text-overflow: ellipsis;
147
146
  white-space: nowrap;
@@ -153,14 +152,14 @@
153
152
  display: flex;
154
153
  align-items: center;
155
154
  gap: var(--matcha-space-100, 8px);
156
- color: var(--matcha-color-hint, #{getGrey($theme)});
155
+ color: var(--matcha-color-hint, var(--matcha-color-text-muted));
157
156
  }
158
157
 
159
158
  // ── Divider between items ──
160
159
  .matcha-list-divider {
161
160
  height: var(--matcha-border-hairline, 1px);
162
161
  margin: var(--matcha-space-050, 4px) var(--matcha-space-200, 16px);
163
- background-color: var(--matcha-color-border, #{getGrey($theme)});
162
+ background-color: var(--matcha-color-border);
164
163
  opacity: var(--matcha-opacity-subtle, 0.10);
165
164
  }
166
165
 
@@ -169,12 +168,12 @@
169
168
  display: flex;
170
169
  align-items: center;
171
170
  padding: var(--matcha-space-200, 16px) var(--matcha-space-200, 16px) var(--matcha-space-075, 6px);
172
- font-size: var(--matcha-text-caption, 11px);
171
+ font-size: var(--matcha-text-p-tiny, 11px);
173
172
  font-weight: var(--matcha-weight-medium, 500);
174
- line-height: var(--matcha-leading-caption, 14px);
173
+ line-height: var(--matcha-leading-p-tiny, 14px);
175
174
  letter-spacing: var(--matcha-letter-spacing-wide, 0.5px);
176
175
  text-transform: uppercase;
177
- color: var(--matcha-color-hint, #{getGrey($theme)});
176
+ color: var(--matcha-color-hint, var(--matcha-color-text-muted));
178
177
  }
179
178
 
180
179
  // ── 2-line variant (with description) ──
@@ -193,7 +192,7 @@
193
192
  padding: var(--matcha-space-050, 4px) var(--matcha-space-200, 16px);
194
193
 
195
194
  .matcha-list-item__label {
196
- font-size: var(--matcha-text-button-sm, 13px);
195
+ font-size: var(--matcha-text-label-sm, 13px);
197
196
  }
198
197
  }
199
198
  }
@@ -2,6 +2,19 @@
2
2
  // matcha-menu.scss — Dropdown context menu (modernized)
3
3
  // =============================================================================
4
4
 
5
+ // matcha-menu é overlay-only: o host nunca deve ocupar espaço no fluxo.
6
+ // display:contents tira o host (e o matcha-panel interno) do layout sem
7
+ // afetar a popover — o overlay interno usa position:fixed/absolute. Sem isso,
8
+ // quando o menu é filho direto de um container flex/grid com `gap` (ex.:
9
+ // page-layout `.center.gap-outside` com gap 24px), o host vazio de altura ~0
10
+ // vira um flex item que consome `gap` dos DOIS lados → "phantom gap" duplo
11
+ // entre o elemento anterior e o seguinte. O matcha-toolbar já fazia isso
12
+ // scoped (`> matcha-menu`); aqui generaliza pra qualquer container.
13
+ matcha-menu,
14
+ matcha-menu > matcha-panel {
15
+ display: contents;
16
+ }
17
+
5
18
  .matcha-menu-content {
6
19
  button,
7
20
  [matcha-button] {
@@ -47,7 +60,7 @@
47
60
  font-weight: var(--matcha-weight-medium, 500);
48
61
 
49
62
  &:focus-visible:not([disabled]) {
50
- outline: var(--matcha-state-focus-ring-width, 2px) solid var(--matcha-color-accent, #{getAccent($theme)});
63
+ outline: var(--matcha-state-focus-ring-width, 2px) solid var(--matcha-color-accent);
51
64
  outline-offset: var(--matcha-state-focus-ring-offset, 2px);
52
65
  }
53
66
 
@@ -69,7 +82,7 @@
69
82
  transform: translateY(-50%);
70
83
  width: 0;
71
84
  height: 0;
72
- border-left: calc(var(--matcha-border-medium, 4px) + var(--matcha-border-hairline, 1px)) solid var(--matcha-color-hint, #{getGrey($theme)});
85
+ border-left: calc(var(--matcha-border-medium, 4px) + var(--matcha-border-hairline, 1px)) solid var(--matcha-color-hint, var(--matcha-color-text-muted));
73
86
  border-top: var(--matcha-border-medium, 4px) solid transparent;
74
87
  border-bottom: var(--matcha-border-medium, 4px) solid transparent;
75
88
  opacity: var(--matcha-opacity-secondary, 0.54);
@@ -69,26 +69,17 @@
69
69
  to { opacity: 0; }
70
70
  }
71
71
 
72
+ // Enter: scale 0.96 + translate -4 + fade (Material 3 emphasized motion).
73
+ // Mais sutil que 0.95/-8 — menos jumpy, mais "presença suave".
72
74
  @keyframes matcha-modal-in {
73
- from {
74
- opacity: 0;
75
- transform: scale(0.95) translateY(-8px);
76
- }
77
- to {
78
- opacity: 1;
79
- transform: scale(1) translateY(0);
80
- }
75
+ from { opacity: 0; transform: scale(0.96) translateY(-4px); }
76
+ to { opacity: 1; transform: scale(1) translateY(0); }
81
77
  }
82
78
 
79
+ // Exit: assimétrico — sai mais rápido que entra (180ms vs 200ms).
83
80
  @keyframes matcha-modal-out {
84
- from {
85
- opacity: 1;
86
- transform: scale(1) translateY(0);
87
- }
88
- to {
89
- opacity: 0;
90
- transform: scale(0.97) translateY(4px);
91
- }
81
+ from { opacity: 1; transform: scale(1) translateY(0); }
82
+ to { opacity: 0; transform: scale(0.96) translateY(-4px); }
92
83
  }
93
84
 
94
85
  @media (prefers-reduced-motion: reduce) {
@@ -105,7 +96,6 @@
105
96
  // =============================================================================
106
97
 
107
98
  @mixin matcha-modal-theme($theme) {
108
- $is-dark: map.get($theme, is-dark);
109
99
 
110
100
  // ── Host element ──
111
101
  matcha-modal {
@@ -118,10 +108,10 @@
118
108
 
119
109
  @include generate-matcha-modal-sizes-classes($helper-breakpoints);
120
110
 
121
- // Exit animation class (added by service before destroy)
111
+ // Exit animation (added by service before destroy) — accelerated 180ms.
122
112
  &.matcha-modal--closing {
123
113
  .matcha-modal {
124
- animation: matcha-modal-out 150ms cubic-bezier(0.4, 0, 1, 1) forwards;
114
+ animation: matcha-modal-out 180ms var(--matcha-easing-accelerated, cubic-bezier(0.4, 0, 1, 1)) forwards;
125
115
  }
126
116
  }
127
117
  }
@@ -142,93 +132,76 @@
142
132
  }
143
133
  }
144
134
 
145
- // ── Modal card ──
135
+ // ── Modal card (Figma DSV3 1:1) ──
136
+ // bg surface/card · radius 16 · shadow 8r@4y + 32r@12y · sem border.
146
137
  .matcha-modal {
147
138
  position: relative;
148
139
  z-index: 999;
149
140
  display: flex;
150
141
  flex-direction: column;
142
+ // Perf: contain layout/paint pra browser não recalcular reflow da page atrás.
143
+ contain: layout paint;
151
144
  border-radius: var(--matcha-radius-xl, 16px);
152
- background-color: var(--matcha-color-surface, #{getSurface($theme)});
153
- color: var(--matcha-color-fg, #{getForeground($theme)});
145
+ // Floating overlay sobre scrim — usa surface-card-strong (pure white
146
+ // no light, lifted dark) pra máximo destaque. Cards inline usam o card
147
+ // soft default (#f8faf8) mas modal precisa pop.
148
+ background-color: var(--matcha-color-surface-card-strong, var(--matcha-color-surface-card));
149
+ color: var(--matcha-color-fg);
154
150
  overflow: hidden;
155
- animation: matcha-modal-in var(--matcha-duration-normal, 200ms) cubic-bezier(0.16, 1, 0.3, 1);
156
-
157
- // Shadow level 3 (modals, drawers)
158
- box-shadow: var(--matcha-shadow-3, #{if($is-dark, $shadow-3-dark, $shadow-3-light)});
151
+ animation: matcha-modal-in var(--matcha-duration-fast, 200ms) var(--matcha-easing-emphasized, cubic-bezier(0.2, 0, 0, 1));
159
152
 
160
- @if $is-dark {
161
- border: var(--matcha-border-hairline, 1px) solid rgba(255, 255, 255, 0.06);
162
- }
153
+ // Figma DSV3 1:1: 0 4px 8px rgba(0,0,0,0.06), 0 12px 32px rgba(0,0,0,0.12)
154
+ box-shadow:
155
+ 0 4px 8px rgba(0, 0, 0, 0.06),
156
+ 0 12px 32px rgba(0, 0, 0, 0.12);
163
157
  }
164
158
 
165
- // ── Header ──
166
- .matcha-modal-header {
167
- display: flex;
168
- align-items: center;
169
- justify-content: space-between;
170
- gap: var(--matcha-space-150, 12px);
171
- padding: var(--matcha-space-200, 16px) var(--matcha-space-300, 24px);
172
- flex-shrink: 0;
173
-
174
- // Figma matcha/modal title: 20/800/28 (title-xl ExtraBold)
175
- .matcha-modal-header__title {
176
- flex: 1;
177
- font-size: var(--matcha-text-title-xl, 20px);
178
- font-weight: var(--matcha-weight-extrabold, 800);
179
- line-height: var(--matcha-leading-title-xl, 28px);
180
- color: var(--matcha-color-fg, #{getForeground($theme)});
181
- }
159
+ // ── Section coloring (layout vive nos component SCSS — single source of truth) ──
160
+ // Theme só pinta: bg dos slots herda surface-card-strong do parent .matcha-modal,
161
+ // texto pega text-primary, dividers usam surface-border.
162
+ .matcha-modal-header__title {
163
+ color: var(--matcha-color-text-primary);
182
164
  }
183
165
 
184
- // ── Content ──
185
166
  .matcha-modal-content {
186
- flex: 1;
187
- overflow-y: auto;
188
- overflow-x: hidden;
189
- padding: var(--matcha-space-300, 24px);
190
- max-height: calc(100vh - 300px);
191
- color: var(--matcha-color-fg, #{getForeground($theme)});
192
-
193
- // Smooth content resize
194
- transition: max-height var(--matcha-duration-normal, 200ms) ease;
167
+ color: var(--matcha-color-text-primary);
195
168
  }
196
169
 
197
- // ── Footer ──
198
- .matcha-modal-footer {
199
- display: flex;
200
- align-items: center;
201
- justify-content: flex-end;
202
- gap: var(--matcha-space-150, 12px);
203
- padding: var(--matcha-space-200, 16px) var(--matcha-space-300, 24px);
204
- flex-shrink: 0;
205
-
206
- // Mobile: stack buttons vertically
207
- @media (max-width: 575px) {
208
- flex-direction: column-reverse;
209
-
210
- .matcha-button {
211
- width: 100%;
212
- }
213
- }
170
+ // ── Focus ring on modal ──
171
+ .matcha-modal:focus-visible {
172
+ outline: var(--matcha-state-focus-ring-width, 2px) solid var(--matcha-color-accent);
173
+ outline-offset: var(--matcha-state-focus-ring-offset, 2px);
214
174
  }
175
+ }
215
176
 
216
- // ── Dividers inside modal ──
217
- matcha-modal-header matcha-divider,
218
- matcha-modal-footer matcha-divider {
219
- margin-inline: calc(-1 * var(--matcha-space-300, 24px));
177
+ // ── Forced colors (Windows High Contrast) ──
178
+ // rgba/border hairline pode sumir; CanvasText/Canvas são system tokens visíveis.
179
+ @media (forced-colors: active) {
180
+ .matcha-modal {
181
+ border: 1px solid CanvasText;
182
+ background-color: Canvas !important;
220
183
  }
184
+ .matcha-modal-backdrop {
185
+ background: rgba(0, 0, 0, 0.7) !important;
186
+ backdrop-filter: none !important;
187
+ }
188
+ }
221
189
 
222
- // ── Options (action icons in header) ──
223
- .matcha-modal-options {
224
- display: flex;
225
- align-items: center;
226
- gap: var(--matcha-space-100, 8px);
190
+ // ── Reduced transparency (acessibilidade visual) ──
191
+ // Usuários com dificuldade de ler texto sobre blur preferem solid bg.
192
+ @media (prefers-reduced-transparency: reduce) {
193
+ .matcha-modal-backdrop {
194
+ background: rgba(0, 0, 0, 0.85) !important;
195
+ backdrop-filter: none !important;
227
196
  }
197
+ }
228
198
 
229
- // ── Focus ring on modal ──
230
- .matcha-modal:focus-visible {
231
- outline: var(--matcha-state-focus-ring-width, 2px) solid var(--matcha-color-accent, #{getAccent($theme)});
232
- outline-offset: var(--matcha-state-focus-ring-offset, 2px);
199
+ // ── Print ──
200
+ // Convenção DSV3: chrome flutuante (modal/drawer/tooltip) some em impressão.
201
+ @media print {
202
+ .matcha-overlay-container,
203
+ .matcha-modal-backdrop,
204
+ matcha-modal {
205
+ display: none !important;
233
206
  }
234
207
  }