@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.
- package/abstracts/_colors.scss +236 -236
- package/abstracts/_elevation.scss +108 -108
- package/abstracts/_functions.scss +321 -321
- package/abstracts/_media-breakpoint.scss +26 -26
- package/abstracts/_theme-api.scss +219 -219
- package/abstracts/_typography.scss +128 -128
- package/base/_reset.scss +446 -445
- package/components/app-page-header.scss +260 -260
- package/components/matcha-accordion.scss +293 -293
- package/components/matcha-audio-player.scss +31 -31
- package/components/matcha-autocomplete.scss +145 -145
- package/components/matcha-avatar.scss +440 -301
- package/components/matcha-badge.scss +120 -120
- package/components/matcha-breadcrumb.scss +231 -231
- package/components/matcha-button-toggle.scss +383 -384
- package/components/matcha-buttons.scss +913 -913
- package/components/matcha-calendar.scss +218 -218
- package/components/matcha-cards.scss +230 -230
- package/components/matcha-chart-card.scss +53 -53
- package/components/matcha-checkbox.scss +255 -255
- package/components/matcha-chip.scss +292 -292
- package/components/matcha-color-pick.scss +34 -34
- package/components/matcha-command-palette.scss +316 -316
- package/components/matcha-contact.scss +35 -0
- package/components/matcha-crop.scss +406 -406
- package/components/matcha-date.scss +81 -81
- package/components/matcha-divider.scss +100 -100
- package/components/matcha-draggable.scss +23 -23
- package/components/matcha-drawer.scss +376 -376
- package/components/matcha-drop-image.scss +14 -14
- package/components/matcha-drop-list.scss +430 -430
- package/components/matcha-emoji.scss +69 -69
- package/components/matcha-empty-state.scss +230 -230
- package/components/matcha-file-uploader.scss +471 -471
- package/components/matcha-flag.scss +103 -103
- package/components/matcha-footer.scss +91 -91
- package/components/matcha-form-field.scss +606 -606
- package/components/matcha-form-section.scss +100 -100
- package/components/matcha-header.scss +135 -135
- package/components/matcha-highlight.scss +164 -164
- package/components/matcha-hint-text.scss +90 -90
- package/components/matcha-horizontal-tree.scss +316 -316
- package/components/matcha-icon.scss +98 -98
- package/components/matcha-image.scss +61 -61
- package/components/matcha-list.scss +211 -211
- package/components/matcha-menu.scss +99 -99
- package/components/matcha-modal.scss +210 -210
- package/components/matcha-nav.scss +581 -581
- package/components/matcha-notification.scss +413 -413
- package/components/matcha-option.scss +170 -170
- package/components/matcha-page-builder.scss +4196 -4196
- package/components/matcha-paginator.scss +689 -689
- package/components/matcha-panel.scss +194 -194
- package/components/matcha-profile-card.scss +50 -50
- package/components/matcha-progress-bar.scss +313 -313
- package/components/matcha-radio.scss +320 -320
- package/components/matcha-ripple.scss +7 -7
- package/components/matcha-scrollbar.scss +33 -33
- package/components/matcha-scrollbox-shadow.scss +120 -120
- package/components/matcha-section.scss +102 -102
- package/components/matcha-select-multiple.scss +56 -56
- package/components/matcha-select.scss +667 -667
- package/components/matcha-skeleton.scss +155 -155
- package/components/matcha-slide-toggle.scss +369 -369
- package/components/matcha-slider.scss +285 -285
- package/components/matcha-snack-bar.scss +259 -259
- package/components/matcha-spin.scss +164 -164
- package/components/matcha-spinner.scss +97 -97
- package/components/matcha-status-pill.scss +38 -18
- package/components/matcha-stepper.scss +376 -376
- package/components/matcha-table-cell.scss +49 -41
- package/components/matcha-table.scss +579 -579
- package/components/matcha-tabs.scss +600 -600
- package/components/matcha-text-editor.scss +105 -105
- package/components/matcha-time.scss +33 -33
- package/components/matcha-timepicker.scss +13 -13
- package/components/matcha-toolbar.scss +359 -359
- package/components/matcha-tooltip.scss +224 -224
- package/components/matcha-tree-view.scss +257 -257
- package/layout/matcha-page-layout.scss +778 -778
- package/main.scss +331 -329
- package/package.json +1 -1
- package/tokens/_animations-tokens.scss +37 -37
- package/tokens/_breakpoints-tokens.scss +35 -35
- package/tokens/_color-tokens.scss +274 -274
- package/tokens/_elevation-tokens.scss +33 -33
- package/tokens/_emit-tokens.scss +324 -324
- package/tokens/_material-palette.scss +1149 -1149
- package/tokens/_primitives.scss +98 -98
- package/tokens/_semantic-aliases.scss +120 -120
- package/tokens/_spacing-tokens.scss +94 -94
- package/tokens/_static-tokens.scss +137 -137
- package/tokens/_typography-tokens.scss +65 -65
- 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
|
+
}
|