@inchurch/matcha-theme 21.3.3 → 22.0.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 (93) hide show
  1. package/abstracts/_colors.scss +236 -229
  2. package/abstracts/_elevation.scss +108 -108
  3. package/abstracts/_functions.scss +321 -321
  4. package/abstracts/_media-breakpoint.scss +26 -26
  5. package/abstracts/_theme-api.scss +219 -219
  6. package/abstracts/_typography.scss +128 -128
  7. package/base/_reset.scss +445 -432
  8. package/components/app-page-header.scss +260 -260
  9. package/components/matcha-accordion.scss +293 -293
  10. package/components/matcha-audio-player.scss +31 -31
  11. package/components/matcha-autocomplete.scss +145 -145
  12. package/components/matcha-avatar.scss +440 -301
  13. package/components/matcha-badge.scss +120 -120
  14. package/components/matcha-breadcrumb.scss +231 -231
  15. package/components/matcha-button-toggle.scss +384 -384
  16. package/components/matcha-buttons.scss +913 -913
  17. package/components/matcha-calendar.scss +218 -218
  18. package/components/matcha-cards.scss +230 -230
  19. package/components/matcha-chart-card.scss +53 -53
  20. package/components/matcha-checkbox.scss +255 -255
  21. package/components/matcha-chip.scss +292 -292
  22. package/components/matcha-color-pick.scss +34 -34
  23. package/components/matcha-command-palette.scss +316 -316
  24. package/components/matcha-crop.scss +406 -406
  25. package/components/matcha-date.scss +81 -81
  26. package/components/matcha-divider.scss +100 -100
  27. package/components/matcha-draggable.scss +23 -23
  28. package/components/matcha-drawer.scss +376 -376
  29. package/components/matcha-drop-image.scss +14 -14
  30. package/components/matcha-drop-list.scss +430 -430
  31. package/components/matcha-emoji.scss +69 -69
  32. package/components/matcha-empty-state.scss +230 -230
  33. package/components/matcha-file-uploader.scss +471 -471
  34. package/components/matcha-flag.scss +103 -103
  35. package/components/matcha-footer.scss +91 -91
  36. package/components/matcha-form-field.scss +606 -606
  37. package/components/matcha-form-section.scss +100 -100
  38. package/components/matcha-header.scss +135 -135
  39. package/components/matcha-highlight.scss +164 -164
  40. package/components/matcha-hint-text.scss +90 -90
  41. package/components/matcha-horizontal-tree.scss +316 -316
  42. package/components/matcha-icon.scss +98 -98
  43. package/components/matcha-image.scss +61 -61
  44. package/components/matcha-list.scss +211 -211
  45. package/components/matcha-menu.scss +99 -99
  46. package/components/matcha-modal.scss +210 -210
  47. package/components/matcha-nav.scss +581 -581
  48. package/components/matcha-notification.scss +413 -413
  49. package/components/matcha-option.scss +170 -170
  50. package/components/matcha-page-builder.scss +4196 -4196
  51. package/components/matcha-paginator.scss +689 -689
  52. package/components/matcha-panel.scss +194 -194
  53. package/components/matcha-profile-card.scss +50 -50
  54. package/components/matcha-progress-bar.scss +313 -313
  55. package/components/matcha-radio.scss +320 -320
  56. package/components/matcha-ripple.scss +7 -7
  57. package/components/matcha-scrollbar.scss +33 -33
  58. package/components/matcha-scrollbox-shadow.scss +120 -120
  59. package/components/matcha-section.scss +102 -102
  60. package/components/matcha-select-multiple.scss +56 -56
  61. package/components/matcha-select.scss +667 -667
  62. package/components/matcha-skeleton.scss +155 -155
  63. package/components/matcha-slide-toggle.scss +369 -369
  64. package/components/matcha-slider.scss +285 -285
  65. package/components/matcha-snack-bar.scss +259 -259
  66. package/components/matcha-spin.scss +164 -164
  67. package/components/matcha-spinner.scss +97 -97
  68. package/components/matcha-status-pill.scss +38 -18
  69. package/components/matcha-stepper.scss +376 -376
  70. package/components/matcha-table-cell.scss +74 -41
  71. package/components/matcha-table.scss +579 -578
  72. package/components/matcha-tabs.scss +600 -600
  73. package/components/matcha-text-editor.scss +105 -105
  74. package/components/matcha-time.scss +33 -33
  75. package/components/matcha-timepicker.scss +13 -13
  76. package/components/matcha-toolbar.scss +359 -359
  77. package/components/matcha-tooltip.scss +224 -224
  78. package/components/matcha-tree-view.scss +257 -212
  79. package/layout/matcha-page-layout.scss +778 -778
  80. package/main.scss +329 -329
  81. package/package.json +1 -1
  82. package/tokens/_animations-tokens.scss +37 -37
  83. package/tokens/_breakpoints-tokens.scss +35 -35
  84. package/tokens/_color-tokens.scss +274 -261
  85. package/tokens/_elevation-tokens.scss +33 -33
  86. package/tokens/_emit-tokens.scss +324 -324
  87. package/tokens/_material-palette.scss +1149 -1149
  88. package/tokens/_primitives.scss +98 -98
  89. package/tokens/_semantic-aliases.scss +120 -120
  90. package/tokens/_spacing-tokens.scss +94 -94
  91. package/tokens/_static-tokens.scss +137 -137
  92. package/tokens/_typography-tokens.scss +65 -65
  93. package/vendors/charts.scss +90 -90
@@ -1,359 +1,359 @@
1
- // =============================================================================
2
- // matcha-toolbar — flex row + slot único (1:1 Figma DSV3 15866:92)
3
- //
4
- // Canon Figma: 1 slot `content` (flex gap-100 items-center p-200 radius-lg).
5
- // Consumer compõe Title + Actions + CTA livremente no slot default.
6
- // Slots nomeados (title/actions/primary) preservados pra back-compat com
7
- // consumers anteriores ao realinhamento Figma.
8
- //
9
- // Modifiers via host data-attrs:
10
- // data-layout — horizontal | stack
11
- // data-size — compact | comfortable | spacious
12
- // data-color — accent | success | warn | danger | info (sem 'default')
13
- // data-elevation — 1 | 2 | 3 (sem 0)
14
- // data-bordered — outline 1px
15
- // data-sticky — position sticky top
16
- // data-collapse-search — search vira icon-button em stack mode
17
- //
18
- // Zero hardcoded fora do bloco de vars no topo.
19
- // =============================================================================
20
-
21
- @mixin matcha-toolbar($theme) {
22
-
23
- // ── CSS vars (single source of truth) ─────────────────────────────────
24
- matcha-toolbar {
25
- // Spacing — alinhado ao Figma DSV3 15866:92.
26
- // Toolbar padding 16px simétrico, gap entre groups 12px (Figma Frame interno),
27
- // gap interno de actions group 8px. Height 68 = 16+36+16.
28
- // Consumer pode override per-side via --matcha-toolbar-padding-left/right.
29
- --matcha-toolbar-padding-y: var(--matcha-space-200, 16px);
30
- --matcha-toolbar-padding-x: var(--matcha-space-200, 16px);
31
- --matcha-toolbar-padding-left: var(--matcha-toolbar-padding-x);
32
- --matcha-toolbar-padding-right: var(--matcha-toolbar-padding-x);
33
- --matcha-toolbar-gap: var(--matcha-space-150, 12px);
34
- --matcha-toolbar-actions-gap: var(--matcha-space-100, 8px);
35
- --matcha-toolbar-min-height: 68px;
36
-
37
- // Item max-widths — UX guardrails canon DSV3.
38
- // Title NÃO tem cap por default (flex: 1 1 auto cresce até preencher
39
- // o espaço disponível). Consumer pode aplicar max-width localmente se
40
- // precisar (raro — só pra casos com title gigante por i18n).
41
- // Search: 320px = Figma 280 + buffer. Acima disso vira "barrão" desproporcional.
42
- --matcha-toolbar-search-max-width: 320px;
43
-
44
- // Breakpoint pra auto-stack (mobile). Default 768px = md Tailwind / matcha bp-md.
45
- --matcha-toolbar-stack-breakpoint: 768px;
46
-
47
- // Size variants — padding/min-height (consumer override no escopo).
48
- --matcha-toolbar-padding-y-compact: var(--matcha-space-150, 12px);
49
- --matcha-toolbar-padding-x-compact: var(--matcha-space-150, 12px);
50
- --matcha-toolbar-min-height-compact: var(--matcha-space-600, 48px);
51
- --matcha-toolbar-padding-y-spacious: var(--matcha-space-300, 24px);
52
- --matcha-toolbar-padding-x-spacious: var(--matcha-space-300, 24px);
53
- --matcha-toolbar-min-height-spacious: var(--matcha-space-900, 72px);
54
-
55
- // Surface
56
- --matcha-toolbar-bg: var(--matcha-color-surface-card);
57
- --matcha-toolbar-radius: var(--matcha-radius-lg, 8px);
58
- --matcha-toolbar-border-color: var(--matcha-color-surface-border);
59
- --matcha-toolbar-border-width: var(--matcha-border-hairline, 1px);
60
-
61
- // Elevation (3 níveis canon)
62
- --matcha-toolbar-shadow-1: var(--matcha-shadow-1);
63
- --matcha-toolbar-shadow-2: var(--matcha-shadow-2);
64
- --matcha-toolbar-shadow-3: var(--matcha-shadow-3);
65
-
66
- // Sticky
67
- --matcha-toolbar-sticky-z: var(--matcha-z-sticky, 10);
68
-
69
- // Transition
70
- --matcha-toolbar-transition-duration: var(--matcha-duration-fast, 200ms);
71
- }
72
-
73
- // ── Container — flex row (1:1 Figma DSV3 15866:92) ────────────────────
74
- matcha-toolbar {
75
- display: flex;
76
- flex-direction: row;
77
- align-items: center;
78
- flex-wrap: nowrap;
79
- gap: var(--matcha-toolbar-gap);
80
- padding:
81
- var(--matcha-toolbar-padding-y)
82
- var(--matcha-toolbar-padding-right)
83
- var(--matcha-toolbar-padding-y)
84
- var(--matcha-toolbar-padding-left);
85
- background: var(--matcha-toolbar-bg);
86
- border-radius: var(--matcha-toolbar-radius);
87
- min-height: var(--matcha-toolbar-min-height);
88
- box-sizing: border-box;
89
- width: 100%;
90
-
91
- transition:
92
- padding var(--matcha-toolbar-transition-duration) ease,
93
- gap var(--matcha-toolbar-transition-duration) ease,
94
- box-shadow var(--matcha-toolbar-transition-duration) ease;
95
-
96
- // ── Layout pattern canon: título CRESCE, empurra resto pra direita ──
97
- // Regra única e simples: matcha-title é o único flex-grow do toolbar.
98
- // Ele se expande pra ocupar todo o leftover space, empurrando search/
99
- // actions/CTA naturalmente pra direita. Sem ml-auto, sem spacer manual.
100
- //
101
- // Comportamento:
102
- // - Title curto ("Igrejas"): cresce até o limite, todo o resto à direita
103
- // - Title longo ("Configurações de Membros"): cresce até o cap natural,
104
- // trunca com ellipsis se passar (via matcha-title__text rules abaixo)
105
- //
106
- // Consumer NUNCA deve aplicar .ml-auto ou margin: auto em flex children
107
- // do toolbar — quebra a regra e gera inconsistência visual entre telas.
108
- > matcha-title {
109
- flex: 1 1 auto;
110
- min-width: 0;
111
- }
112
-
113
- matcha-title[type="icon"] {
114
- --matcha-title-fill: var(--matcha-color-text-secondary,
115
- color-mix(in srgb, var(--matcha-color-fg) 55%, transparent));
116
- }
117
-
118
- matcha-title .matcha-title__text {
119
- white-space: nowrap;
120
- overflow: hidden;
121
- text-overflow: ellipsis;
122
- }
123
-
124
- // Search field tem cap pra não virar "barrão" em wide screens.
125
- // Figma desktop = 280px. Cap 320px = buffer pra labels longos.
126
- > matcha-field[type="search"],
127
- [matcha-toolbar-actions] > matcha-field[type="search"] {
128
- max-width: var(--matcha-toolbar-search-max-width);
129
- }
130
-
131
- // Icon-buttons NUNCA deformam — flex:0 0 auto preserva 1:1 quadrado
132
- // independente do espaço disponível. Aplica em qualquer profundidade
133
- // dentro do toolbar (direto ou em [matcha-toolbar-actions]).
134
- button[matcha-icon-button],
135
- [matcha-icon-button] {
136
- flex: 0 0 auto;
137
- }
138
-
139
- // Defensiva contra "gap fantasma": custom elements popover (matcha-menu)
140
- // e seu matcha-panel interno são display:inline default → flex items invisíveis.
141
- // Dentro do toolbar consumem 12px de column-gap cada um, criando respiro
142
- // não-intencional entre o último item visível e a borda direita.
143
- //
144
- // Solução ideal: consumer move `<matcha-menu>` pra FORA do `<matcha-toolbar>`
145
- // (referência via template variable continua funcionando). Esta regra é
146
- // defesa em profundidade pra legacy que ainda tem matcha-menu dentro.
147
- //
148
- // display:contents tira o host do layout sem afetar a popover (matcha-panel
149
- // interno usa position:fixed/absolute via overlay).
150
- > matcha-menu,
151
- > matcha-menu > matcha-panel {
152
- display: contents;
153
- }
154
-
155
- // Botão CTA principal também não shrinka (mantém label legível).
156
- > button[matcha-button],
157
- > [matcha-button] {
158
- flex: 0 0 auto;
159
- }
160
-
161
- // ── Back-compat: atributos legacy [matcha-toolbar-*] ──────────────────
162
- // Não são mais ng-content selectors — viram hints de layout via CSS:
163
- // [matcha-toolbar-actions] → flex inline group com gap (mesmo padding visual)
164
- // [matcha-toolbar-primary] → fica naturalmente à direita (último child)
165
- // [matcha-toolbar-title] → idêntico a matcha-title:first-child
166
- [matcha-toolbar-actions] {
167
- display: flex;
168
- align-items: center;
169
- gap: var(--matcha-toolbar-actions-gap);
170
- }
171
-
172
- // ── Layout: stack — flex-wrap + order (1:1 Figma Mobile 15870:84) ────
173
- // Estratégia: mantém flex-direction:row mas habilita flex-wrap. Search
174
- // recebe order:99 + flex-basis:100% → wrappa pra row 2 com full-width.
175
- // Title + actions + CTA continuam na row 1 com fluxo natural.
176
- //
177
- // Vantagem vs Grid: zero overlap. Funciona com qualquer combinação de
178
- // children (search direto OU dentro de actions, CTA direto OU dentro de actions).
179
- //
180
- // Aplicado em 2 contextos: [data-layout="stack"] explícito ou auto-stack
181
- // via media query <768px (a menos que [data-no-auto-stack] esteja setado).
182
- &[data-layout="stack"] {
183
- flex-wrap: wrap;
184
- row-gap: var(--matcha-space-100, 8px);
185
-
186
- > * {
187
- margin-left: 0;
188
- min-width: 0; // permite shrink
189
- }
190
-
191
- // Search vai pra row 2 full-width (independente de estar direto ou em actions).
192
- > matcha-field[type="search"],
193
- [matcha-toolbar-actions] {
194
- // Actions div como um todo wrappa pra row 2 se contém search inside
195
- // (caso de members-list legacy onde search vive dentro do actions).
196
- // Pra evitar quebra de outros casos, só wrappamos se o consumer
197
- // declarou estrutura legacy. Default: actions stay row 1.
198
- }
199
-
200
- > matcha-field[type="search"] {
201
- flex: 1 1 100%;
202
- order: 99;
203
- max-width: 100%;
204
- width: 100%;
205
- }
206
-
207
- // Title cresce mas com cap pra não empurrar actions pra row 2 sozinho.
208
- > matcha-title {
209
- flex: 1 1 auto;
210
- max-width: 100%;
211
- }
212
-
213
- // Actions div + CTA standalone ficam row 1 com fluxo natural.
214
- > [matcha-toolbar-actions] {
215
- flex: 0 0 auto;
216
- }
217
-
218
- > button[matcha-button],
219
- > [matcha-button] {
220
- flex: 0 0 auto;
221
- }
222
- }
223
-
224
- // Auto-stack em mobile (viewport <768px) — sem precisar setar [layout="stack"]
225
- // manualmente. Consumer pode opt-out via [data-no-auto-stack].
226
- @media (max-width: 768px) {
227
- &:not([data-no-auto-stack]) {
228
- flex-wrap: wrap;
229
- row-gap: var(--matcha-space-100, 8px);
230
-
231
- > * {
232
- margin-left: 0;
233
- min-width: 0;
234
- }
235
-
236
- > matcha-field[type="search"] {
237
- flex: 1 1 100%;
238
- order: 99;
239
- max-width: 100%;
240
- width: 100%;
241
- }
242
-
243
- > matcha-title {
244
- flex: 1 1 auto;
245
- max-width: 100%;
246
- }
247
-
248
- > [matcha-toolbar-actions] {
249
- flex: 0 0 auto;
250
- }
251
-
252
- > button[matcha-button],
253
- > [matcha-button] {
254
- flex: 0 0 auto;
255
- }
256
- }
257
- }
258
-
259
- // ── Viewport extra-narrow (<480px) — actions também wrappa ───────────
260
- // Quando tela muito apertada (~iPhone SE 1ª gen, browsers com sidebar
261
- // dev-tools aberta), até title + actions juntos não cabem. Permite que
262
- // actions wrappe pra sua própria row 3, mantendo CTA legível.
263
- @media (max-width: 479px) {
264
- &:not([data-no-auto-stack]) {
265
- > [matcha-toolbar-actions] {
266
- flex: 1 1 100%;
267
- order: 50; // depois do title (0), antes do search (99)
268
- justify-content: flex-end;
269
- }
270
-
271
- > button[matcha-button],
272
- > [matcha-button] {
273
- flex: 1 1 auto;
274
- order: 60;
275
- }
276
- }
277
- }
278
-
279
- // ── Size: compact ────────────────────────────────────────────────────
280
- &[data-size="compact"] {
281
- padding: var(--matcha-toolbar-padding-y-compact) var(--matcha-toolbar-padding-x-compact);
282
- min-height: var(--matcha-toolbar-min-height-compact);
283
- }
284
-
285
- // ── Size: spacious ───────────────────────────────────────────────────
286
- &[data-size="spacious"] {
287
- padding: var(--matcha-toolbar-padding-y-spacious) var(--matcha-toolbar-padding-x-spacious);
288
- min-height: var(--matcha-toolbar-min-height-spacious);
289
- }
290
-
291
- // ── Color variants — accent border-left + bg tint ────────────────────
292
- // Pattern Material/Polaris status bar. Border 4px na esquerda + bg alpha.
293
- &[data-color] {
294
- position: relative;
295
- overflow: hidden;
296
-
297
- &::before {
298
- content: '';
299
- position: absolute;
300
- left: 0;
301
- top: 0;
302
- bottom: 0;
303
- width: var(--matcha-space-050, 4px);
304
- background: var(--matcha-toolbar-accent-color, var(--matcha-color-accent));
305
- pointer-events: none;
306
- }
307
- }
308
- &[data-color="accent"] { --matcha-toolbar-accent-color: var(--matcha-color-accent); }
309
- &[data-color="success"] { --matcha-toolbar-accent-color: var(--matcha-color-success); }
310
- &[data-color="warn"] { --matcha-toolbar-accent-color: var(--matcha-color-warn); }
311
- &[data-color="danger"] { --matcha-toolbar-accent-color: var(--matcha-color-danger); }
312
- &[data-color="info"] { --matcha-toolbar-accent-color: var(--matcha-color-info); }
313
-
314
- // ── Elevation 1-3 (Material-like progressive shadows) ────────────────
315
- &[data-elevation="1"] { box-shadow: var(--matcha-toolbar-shadow-1); }
316
- &[data-elevation="2"] { box-shadow: var(--matcha-toolbar-shadow-2); }
317
- &[data-elevation="3"] { box-shadow: var(--matcha-toolbar-shadow-3); }
318
-
319
- // ── Bordered — outline 1px sobre flat surface ────────────────────────
320
- &[data-bordered] {
321
- border: var(--matcha-toolbar-border-width) solid var(--matcha-toolbar-border-color);
322
- }
323
-
324
- // ── Sticky — gruda no topo do scroll container ──────────────────────
325
- &[data-sticky] {
326
- position: sticky;
327
- top: 0;
328
- z-index: var(--matcha-toolbar-sticky-z);
329
- }
330
-
331
- // ── Auto-collapse search em stack mode (CSS-only via :focus-within) ──
332
- // matcha-field type=search vira icon-button (32x32) por default.
333
- // Click/focus expande pro tamanho natural (flex:1).
334
- &[data-collapse-search][data-layout="stack"] {
335
- [matcha-toolbar-actions] matcha-field,
336
- > matcha-field {
337
- flex: 0 0 auto;
338
- width: var(--matcha-space-800, 32px);
339
- transition: width var(--matcha-toolbar-transition-duration) ease,
340
- flex var(--matcha-toolbar-transition-duration) ease;
341
-
342
- // Foco expande pra row inteira
343
- &:focus-within {
344
- flex: 1 1 0;
345
- width: 100%;
346
- }
347
- }
348
- }
349
- }
350
-
351
- // ── Reduced motion ────────────────────────────────────────────────────
352
- @media (prefers-reduced-motion: reduce) {
353
- matcha-toolbar {
354
- transition: none;
355
- [matcha-toolbar-actions] matcha-field { transition: none; }
356
- > matcha-field { transition: none; }
357
- }
358
- }
359
- }
1
+ // =============================================================================
2
+ // matcha-toolbar — flex row + slot único (1:1 Figma DSV3 15866:92)
3
+ //
4
+ // Canon Figma: 1 slot `content` (flex gap-100 items-center p-200 radius-lg).
5
+ // Consumer compõe Title + Actions + CTA livremente no slot default.
6
+ // Slots nomeados (title/actions/primary) preservados pra back-compat com
7
+ // consumers anteriores ao realinhamento Figma.
8
+ //
9
+ // Modifiers via host data-attrs:
10
+ // data-layout — horizontal | stack
11
+ // data-size — compact | comfortable | spacious
12
+ // data-color — accent | success | warn | danger | info (sem 'default')
13
+ // data-elevation — 1 | 2 | 3 (sem 0)
14
+ // data-bordered — outline 1px
15
+ // data-sticky — position sticky top
16
+ // data-collapse-search — search vira icon-button em stack mode
17
+ //
18
+ // Zero hardcoded fora do bloco de vars no topo.
19
+ // =============================================================================
20
+
21
+ @mixin matcha-toolbar($theme) {
22
+
23
+ // ── CSS vars (single source of truth) ─────────────────────────────────
24
+ matcha-toolbar {
25
+ // Spacing — alinhado ao Figma DSV3 15866:92.
26
+ // Toolbar padding 16px simétrico, gap entre groups 12px (Figma Frame interno),
27
+ // gap interno de actions group 8px. Height 68 = 16+36+16.
28
+ // Consumer pode override per-side via --matcha-toolbar-padding-left/right.
29
+ --matcha-toolbar-padding-y: var(--matcha-space-200, 16px);
30
+ --matcha-toolbar-padding-x: var(--matcha-space-200, 16px);
31
+ --matcha-toolbar-padding-left: var(--matcha-toolbar-padding-x);
32
+ --matcha-toolbar-padding-right: var(--matcha-toolbar-padding-x);
33
+ --matcha-toolbar-gap: var(--matcha-space-150, 12px);
34
+ --matcha-toolbar-actions-gap: var(--matcha-space-100, 8px);
35
+ --matcha-toolbar-min-height: 68px;
36
+
37
+ // Item max-widths — UX guardrails canon DSV3.
38
+ // Title NÃO tem cap por default (flex: 1 1 auto cresce até preencher
39
+ // o espaço disponível). Consumer pode aplicar max-width localmente se
40
+ // precisar (raro — só pra casos com title gigante por i18n).
41
+ // Search: 320px = Figma 280 + buffer. Acima disso vira "barrão" desproporcional.
42
+ --matcha-toolbar-search-max-width: 320px;
43
+
44
+ // Breakpoint pra auto-stack (mobile). Default 768px = md Tailwind / matcha bp-md.
45
+ --matcha-toolbar-stack-breakpoint: 768px;
46
+
47
+ // Size variants — padding/min-height (consumer override no escopo).
48
+ --matcha-toolbar-padding-y-compact: var(--matcha-space-150, 12px);
49
+ --matcha-toolbar-padding-x-compact: var(--matcha-space-150, 12px);
50
+ --matcha-toolbar-min-height-compact: var(--matcha-space-600, 48px);
51
+ --matcha-toolbar-padding-y-spacious: var(--matcha-space-300, 24px);
52
+ --matcha-toolbar-padding-x-spacious: var(--matcha-space-300, 24px);
53
+ --matcha-toolbar-min-height-spacious: var(--matcha-space-900, 72px);
54
+
55
+ // Surface
56
+ --matcha-toolbar-bg: var(--matcha-color-surface-card);
57
+ --matcha-toolbar-radius: var(--matcha-radius-lg, 8px);
58
+ --matcha-toolbar-border-color: var(--matcha-color-surface-border);
59
+ --matcha-toolbar-border-width: var(--matcha-border-hairline, 1px);
60
+
61
+ // Elevation (3 níveis canon)
62
+ --matcha-toolbar-shadow-1: var(--matcha-shadow-1);
63
+ --matcha-toolbar-shadow-2: var(--matcha-shadow-2);
64
+ --matcha-toolbar-shadow-3: var(--matcha-shadow-3);
65
+
66
+ // Sticky
67
+ --matcha-toolbar-sticky-z: var(--matcha-z-sticky, 10);
68
+
69
+ // Transition
70
+ --matcha-toolbar-transition-duration: var(--matcha-duration-fast, 200ms);
71
+ }
72
+
73
+ // ── Container — flex row (1:1 Figma DSV3 15866:92) ────────────────────
74
+ matcha-toolbar {
75
+ display: flex;
76
+ flex-direction: row;
77
+ align-items: center;
78
+ flex-wrap: nowrap;
79
+ gap: var(--matcha-toolbar-gap);
80
+ padding:
81
+ var(--matcha-toolbar-padding-y)
82
+ var(--matcha-toolbar-padding-right)
83
+ var(--matcha-toolbar-padding-y)
84
+ var(--matcha-toolbar-padding-left);
85
+ background: var(--matcha-toolbar-bg);
86
+ border-radius: var(--matcha-toolbar-radius);
87
+ min-height: var(--matcha-toolbar-min-height);
88
+ box-sizing: border-box;
89
+ width: 100%;
90
+
91
+ transition:
92
+ padding var(--matcha-toolbar-transition-duration) ease,
93
+ gap var(--matcha-toolbar-transition-duration) ease,
94
+ box-shadow var(--matcha-toolbar-transition-duration) ease;
95
+
96
+ // ── Layout pattern canon: título CRESCE, empurra resto pra direita ──
97
+ // Regra única e simples: matcha-title é o único flex-grow do toolbar.
98
+ // Ele se expande pra ocupar todo o leftover space, empurrando search/
99
+ // actions/CTA naturalmente pra direita. Sem ml-auto, sem spacer manual.
100
+ //
101
+ // Comportamento:
102
+ // - Title curto ("Igrejas"): cresce até o limite, todo o resto à direita
103
+ // - Title longo ("Configurações de Membros"): cresce até o cap natural,
104
+ // trunca com ellipsis se passar (via matcha-title__text rules abaixo)
105
+ //
106
+ // Consumer NUNCA deve aplicar .ml-auto ou margin: auto em flex children
107
+ // do toolbar — quebra a regra e gera inconsistência visual entre telas.
108
+ > matcha-title {
109
+ flex: 1 1 auto;
110
+ min-width: 0;
111
+ }
112
+
113
+ matcha-title[type="icon"] {
114
+ --matcha-title-fill: var(--matcha-color-text-secondary,
115
+ color-mix(in srgb, var(--matcha-color-fg) 55%, transparent));
116
+ }
117
+
118
+ matcha-title .matcha-title__text {
119
+ white-space: nowrap;
120
+ overflow: hidden;
121
+ text-overflow: ellipsis;
122
+ }
123
+
124
+ // Search field tem cap pra não virar "barrão" em wide screens.
125
+ // Figma desktop = 280px. Cap 320px = buffer pra labels longos.
126
+ > matcha-field[type="search"],
127
+ [matcha-toolbar-actions] > matcha-field[type="search"] {
128
+ max-width: var(--matcha-toolbar-search-max-width);
129
+ }
130
+
131
+ // Icon-buttons NUNCA deformam — flex:0 0 auto preserva 1:1 quadrado
132
+ // independente do espaço disponível. Aplica em qualquer profundidade
133
+ // dentro do toolbar (direto ou em [matcha-toolbar-actions]).
134
+ button[matcha-icon-button],
135
+ [matcha-icon-button] {
136
+ flex: 0 0 auto;
137
+ }
138
+
139
+ // Defensiva contra "gap fantasma": custom elements popover (matcha-menu)
140
+ // e seu matcha-panel interno são display:inline default → flex items invisíveis.
141
+ // Dentro do toolbar consumem 12px de column-gap cada um, criando respiro
142
+ // não-intencional entre o último item visível e a borda direita.
143
+ //
144
+ // Solução ideal: consumer move `<matcha-menu>` pra FORA do `<matcha-toolbar>`
145
+ // (referência via template variable continua funcionando). Esta regra é
146
+ // defesa em profundidade pra legacy que ainda tem matcha-menu dentro.
147
+ //
148
+ // display:contents tira o host do layout sem afetar a popover (matcha-panel
149
+ // interno usa position:fixed/absolute via overlay).
150
+ > matcha-menu,
151
+ > matcha-menu > matcha-panel {
152
+ display: contents;
153
+ }
154
+
155
+ // Botão CTA principal também não shrinka (mantém label legível).
156
+ > button[matcha-button],
157
+ > [matcha-button] {
158
+ flex: 0 0 auto;
159
+ }
160
+
161
+ // ── Back-compat: atributos legacy [matcha-toolbar-*] ──────────────────
162
+ // Não são mais ng-content selectors — viram hints de layout via CSS:
163
+ // [matcha-toolbar-actions] → flex inline group com gap (mesmo padding visual)
164
+ // [matcha-toolbar-primary] → fica naturalmente à direita (último child)
165
+ // [matcha-toolbar-title] → idêntico a matcha-title:first-child
166
+ [matcha-toolbar-actions] {
167
+ display: flex;
168
+ align-items: center;
169
+ gap: var(--matcha-toolbar-actions-gap);
170
+ }
171
+
172
+ // ── Layout: stack — flex-wrap + order (1:1 Figma Mobile 15870:84) ────
173
+ // Estratégia: mantém flex-direction:row mas habilita flex-wrap. Search
174
+ // recebe order:99 + flex-basis:100% → wrappa pra row 2 com full-width.
175
+ // Title + actions + CTA continuam na row 1 com fluxo natural.
176
+ //
177
+ // Vantagem vs Grid: zero overlap. Funciona com qualquer combinação de
178
+ // children (search direto OU dentro de actions, CTA direto OU dentro de actions).
179
+ //
180
+ // Aplicado em 2 contextos: [data-layout="stack"] explícito ou auto-stack
181
+ // via media query <768px (a menos que [data-no-auto-stack] esteja setado).
182
+ &[data-layout="stack"] {
183
+ flex-wrap: wrap;
184
+ row-gap: var(--matcha-space-100, 8px);
185
+
186
+ > * {
187
+ margin-left: 0;
188
+ min-width: 0; // permite shrink
189
+ }
190
+
191
+ // Search vai pra row 2 full-width (independente de estar direto ou em actions).
192
+ > matcha-field[type="search"],
193
+ [matcha-toolbar-actions] {
194
+ // Actions div como um todo wrappa pra row 2 se contém search inside
195
+ // (caso de members-list legacy onde search vive dentro do actions).
196
+ // Pra evitar quebra de outros casos, só wrappamos se o consumer
197
+ // declarou estrutura legacy. Default: actions stay row 1.
198
+ }
199
+
200
+ > matcha-field[type="search"] {
201
+ flex: 1 1 100%;
202
+ order: 99;
203
+ max-width: 100%;
204
+ width: 100%;
205
+ }
206
+
207
+ // Title cresce mas com cap pra não empurrar actions pra row 2 sozinho.
208
+ > matcha-title {
209
+ flex: 1 1 auto;
210
+ max-width: 100%;
211
+ }
212
+
213
+ // Actions div + CTA standalone ficam row 1 com fluxo natural.
214
+ > [matcha-toolbar-actions] {
215
+ flex: 0 0 auto;
216
+ }
217
+
218
+ > button[matcha-button],
219
+ > [matcha-button] {
220
+ flex: 0 0 auto;
221
+ }
222
+ }
223
+
224
+ // Auto-stack em mobile (viewport <768px) — sem precisar setar [layout="stack"]
225
+ // manualmente. Consumer pode opt-out via [data-no-auto-stack].
226
+ @media (max-width: 768px) {
227
+ &:not([data-no-auto-stack]) {
228
+ flex-wrap: wrap;
229
+ row-gap: var(--matcha-space-100, 8px);
230
+
231
+ > * {
232
+ margin-left: 0;
233
+ min-width: 0;
234
+ }
235
+
236
+ > matcha-field[type="search"] {
237
+ flex: 1 1 100%;
238
+ order: 99;
239
+ max-width: 100%;
240
+ width: 100%;
241
+ }
242
+
243
+ > matcha-title {
244
+ flex: 1 1 auto;
245
+ max-width: 100%;
246
+ }
247
+
248
+ > [matcha-toolbar-actions] {
249
+ flex: 0 0 auto;
250
+ }
251
+
252
+ > button[matcha-button],
253
+ > [matcha-button] {
254
+ flex: 0 0 auto;
255
+ }
256
+ }
257
+ }
258
+
259
+ // ── Viewport extra-narrow (<480px) — actions também wrappa ───────────
260
+ // Quando tela muito apertada (~iPhone SE 1ª gen, browsers com sidebar
261
+ // dev-tools aberta), até title + actions juntos não cabem. Permite que
262
+ // actions wrappe pra sua própria row 3, mantendo CTA legível.
263
+ @media (max-width: 479px) {
264
+ &:not([data-no-auto-stack]) {
265
+ > [matcha-toolbar-actions] {
266
+ flex: 1 1 100%;
267
+ order: 50; // depois do title (0), antes do search (99)
268
+ justify-content: flex-end;
269
+ }
270
+
271
+ > button[matcha-button],
272
+ > [matcha-button] {
273
+ flex: 1 1 auto;
274
+ order: 60;
275
+ }
276
+ }
277
+ }
278
+
279
+ // ── Size: compact ────────────────────────────────────────────────────
280
+ &[data-size="compact"] {
281
+ padding: var(--matcha-toolbar-padding-y-compact) var(--matcha-toolbar-padding-x-compact);
282
+ min-height: var(--matcha-toolbar-min-height-compact);
283
+ }
284
+
285
+ // ── Size: spacious ───────────────────────────────────────────────────
286
+ &[data-size="spacious"] {
287
+ padding: var(--matcha-toolbar-padding-y-spacious) var(--matcha-toolbar-padding-x-spacious);
288
+ min-height: var(--matcha-toolbar-min-height-spacious);
289
+ }
290
+
291
+ // ── Color variants — accent border-left + bg tint ────────────────────
292
+ // Pattern Material/Polaris status bar. Border 4px na esquerda + bg alpha.
293
+ &[data-color] {
294
+ position: relative;
295
+ overflow: hidden;
296
+
297
+ &::before {
298
+ content: '';
299
+ position: absolute;
300
+ left: 0;
301
+ top: 0;
302
+ bottom: 0;
303
+ width: var(--matcha-space-050, 4px);
304
+ background: var(--matcha-toolbar-accent-color, var(--matcha-color-accent));
305
+ pointer-events: none;
306
+ }
307
+ }
308
+ &[data-color="accent"] { --matcha-toolbar-accent-color: var(--matcha-color-accent); }
309
+ &[data-color="success"] { --matcha-toolbar-accent-color: var(--matcha-color-success); }
310
+ &[data-color="warn"] { --matcha-toolbar-accent-color: var(--matcha-color-warn); }
311
+ &[data-color="danger"] { --matcha-toolbar-accent-color: var(--matcha-color-danger); }
312
+ &[data-color="info"] { --matcha-toolbar-accent-color: var(--matcha-color-info); }
313
+
314
+ // ── Elevation 1-3 (Material-like progressive shadows) ────────────────
315
+ &[data-elevation="1"] { box-shadow: var(--matcha-toolbar-shadow-1); }
316
+ &[data-elevation="2"] { box-shadow: var(--matcha-toolbar-shadow-2); }
317
+ &[data-elevation="3"] { box-shadow: var(--matcha-toolbar-shadow-3); }
318
+
319
+ // ── Bordered — outline 1px sobre flat surface ────────────────────────
320
+ &[data-bordered] {
321
+ border: var(--matcha-toolbar-border-width) solid var(--matcha-toolbar-border-color);
322
+ }
323
+
324
+ // ── Sticky — gruda no topo do scroll container ──────────────────────
325
+ &[data-sticky] {
326
+ position: sticky;
327
+ top: 0;
328
+ z-index: var(--matcha-toolbar-sticky-z);
329
+ }
330
+
331
+ // ── Auto-collapse search em stack mode (CSS-only via :focus-within) ──
332
+ // matcha-field type=search vira icon-button (32x32) por default.
333
+ // Click/focus expande pro tamanho natural (flex:1).
334
+ &[data-collapse-search][data-layout="stack"] {
335
+ [matcha-toolbar-actions] matcha-field,
336
+ > matcha-field {
337
+ flex: 0 0 auto;
338
+ width: var(--matcha-space-800, 32px);
339
+ transition: width var(--matcha-toolbar-transition-duration) ease,
340
+ flex var(--matcha-toolbar-transition-duration) ease;
341
+
342
+ // Foco expande pra row inteira
343
+ &:focus-within {
344
+ flex: 1 1 0;
345
+ width: 100%;
346
+ }
347
+ }
348
+ }
349
+ }
350
+
351
+ // ── Reduced motion ────────────────────────────────────────────────────
352
+ @media (prefers-reduced-motion: reduce) {
353
+ matcha-toolbar {
354
+ transition: none;
355
+ [matcha-toolbar-actions] matcha-field { transition: none; }
356
+ > matcha-field { transition: none; }
357
+ }
358
+ }
359
+ }