@inchurch/matcha-theme 21.4.0 → 22.1.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 (94) hide show
  1. package/abstracts/_colors.scss +236 -236
  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 +446 -445
  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 +383 -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-contact.scss +35 -0
  25. package/components/matcha-crop.scss +406 -406
  26. package/components/matcha-date.scss +81 -81
  27. package/components/matcha-divider.scss +100 -100
  28. package/components/matcha-draggable.scss +23 -23
  29. package/components/matcha-drawer.scss +376 -376
  30. package/components/matcha-drop-image.scss +14 -14
  31. package/components/matcha-drop-list.scss +430 -430
  32. package/components/matcha-emoji.scss +69 -69
  33. package/components/matcha-empty-state.scss +230 -230
  34. package/components/matcha-file-uploader.scss +471 -471
  35. package/components/matcha-flag.scss +103 -103
  36. package/components/matcha-footer.scss +91 -91
  37. package/components/matcha-form-field.scss +606 -606
  38. package/components/matcha-form-section.scss +100 -100
  39. package/components/matcha-header.scss +135 -135
  40. package/components/matcha-highlight.scss +164 -164
  41. package/components/matcha-hint-text.scss +90 -90
  42. package/components/matcha-horizontal-tree.scss +316 -316
  43. package/components/matcha-icon.scss +98 -98
  44. package/components/matcha-image.scss +61 -61
  45. package/components/matcha-list.scss +211 -211
  46. package/components/matcha-menu.scss +99 -99
  47. package/components/matcha-modal.scss +210 -210
  48. package/components/matcha-nav.scss +581 -581
  49. package/components/matcha-notification.scss +413 -413
  50. package/components/matcha-option.scss +170 -170
  51. package/components/matcha-page-builder.scss +4196 -4196
  52. package/components/matcha-paginator.scss +689 -689
  53. package/components/matcha-panel.scss +194 -194
  54. package/components/matcha-profile-card.scss +50 -50
  55. package/components/matcha-progress-bar.scss +313 -313
  56. package/components/matcha-radio.scss +320 -320
  57. package/components/matcha-ripple.scss +7 -7
  58. package/components/matcha-scrollbar.scss +33 -33
  59. package/components/matcha-scrollbox-shadow.scss +120 -120
  60. package/components/matcha-section.scss +102 -102
  61. package/components/matcha-select-multiple.scss +56 -56
  62. package/components/matcha-select.scss +667 -667
  63. package/components/matcha-skeleton.scss +155 -155
  64. package/components/matcha-slide-toggle.scss +369 -369
  65. package/components/matcha-slider.scss +285 -285
  66. package/components/matcha-snack-bar.scss +259 -259
  67. package/components/matcha-spin.scss +164 -164
  68. package/components/matcha-spinner.scss +97 -97
  69. package/components/matcha-status-pill.scss +38 -18
  70. package/components/matcha-stepper.scss +376 -376
  71. package/components/matcha-table-cell.scss +49 -41
  72. package/components/matcha-table.scss +579 -579
  73. package/components/matcha-tabs.scss +600 -600
  74. package/components/matcha-text-editor.scss +105 -105
  75. package/components/matcha-time.scss +33 -33
  76. package/components/matcha-timepicker.scss +13 -13
  77. package/components/matcha-toolbar.scss +359 -359
  78. package/components/matcha-tooltip.scss +224 -224
  79. package/components/matcha-tree-view.scss +257 -257
  80. package/layout/matcha-page-layout.scss +778 -778
  81. package/main.scss +331 -329
  82. package/package.json +1 -1
  83. package/tokens/_animations-tokens.scss +37 -37
  84. package/tokens/_breakpoints-tokens.scss +35 -35
  85. package/tokens/_color-tokens.scss +274 -274
  86. package/tokens/_elevation-tokens.scss +33 -33
  87. package/tokens/_emit-tokens.scss +324 -324
  88. package/tokens/_material-palette.scss +1149 -1149
  89. package/tokens/_primitives.scss +98 -98
  90. package/tokens/_semantic-aliases.scss +120 -120
  91. package/tokens/_spacing-tokens.scss +94 -94
  92. package/tokens/_static-tokens.scss +137 -137
  93. package/tokens/_typography-tokens.scss +65 -65
  94. 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
+ }