@inchurch/matcha-theme 22.40.1 → 22.40.2

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