@inchurch/matcha-theme 21.3.3 → 22.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/abstracts/_colors.scss +236 -229
- 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 +445 -432
- 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 +384 -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-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 +74 -41
- package/components/matcha-table.scss +579 -578
- 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 -212
- package/layout/matcha-page-layout.scss +778 -778
- package/main.scss +329 -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 -261
- 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,69 +1,69 @@
|
|
|
1
|
-
@use "sass:map";
|
|
2
|
-
|
|
3
|
-
// =============================================================================
|
|
4
|
-
// matcha-emoji.scss — Pastoral sentiment emojis
|
|
5
|
-
// Aligned with Figma matcha/emoji:
|
|
6
|
-
// 9 sentimentos × 3 estilos = 27 variantes
|
|
7
|
-
// Sentimentos: Feliz, Grato, Abençoado, Doente, Sozinho, Triste, Pouca fé, Cuidado, Angustiado
|
|
8
|
-
// Estilos: Default (emoji nativo), Outline, Filled
|
|
9
|
-
// Tamanhos: sm (16px), md (24px), lg (32px)
|
|
10
|
-
// Angular: matcha-emoji
|
|
11
|
-
// =============================================================================
|
|
12
|
-
|
|
13
|
-
// ── Layout ──────────────────────────────────────────────────────────────────
|
|
14
|
-
|
|
15
|
-
.matcha-emoji {
|
|
16
|
-
display: inline-flex;
|
|
17
|
-
align-items: center;
|
|
18
|
-
justify-content: center;
|
|
19
|
-
flex-shrink: 0;
|
|
20
|
-
user-select: none;
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
// ── Sizes ───────────────────────────────────────────────────────────────────
|
|
24
|
-
|
|
25
|
-
.matcha-emoji--sm {
|
|
26
|
-
width: var(--matcha-icon-size-sm, 16px);
|
|
27
|
-
height: var(--matcha-icon-size-sm, 16px);
|
|
28
|
-
font-size: var(--matcha-icon-size-sm, 16px);
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
.matcha-emoji--md {
|
|
32
|
-
width: var(--matcha-icon-size-md, 24px);
|
|
33
|
-
height: var(--matcha-icon-size-md, 24px);
|
|
34
|
-
font-size: var(--matcha-icon-size-md, 24px);
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
.matcha-emoji--lg {
|
|
38
|
-
width: var(--matcha-icon-size-lg, 32px);
|
|
39
|
-
height: var(--matcha-icon-size-lg, 32px);
|
|
40
|
-
font-size: var(--matcha-icon-size-lg, 32px);
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
// ── Styles ──────────────────────────────────────────────────────────────────
|
|
44
|
-
|
|
45
|
-
.matcha-emoji--default {
|
|
46
|
-
// Native emoji — no additional styling needed
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
.matcha-emoji--outline,
|
|
50
|
-
.matcha-emoji--filled {
|
|
51
|
-
svg {
|
|
52
|
-
width: 100%;
|
|
53
|
-
height: 100%;
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
// ── Theme ───────────────────────────────────────────────────────────────────
|
|
58
|
-
|
|
59
|
-
@mixin matcha-emoji-theme($theme) {
|
|
60
|
-
.matcha-emoji--outline svg {
|
|
61
|
-
fill: none;
|
|
62
|
-
stroke: var(--matcha-color-fg);
|
|
63
|
-
stroke-width: 1.5;
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
.matcha-emoji--filled svg {
|
|
67
|
-
fill: var(--matcha-color-fg);
|
|
68
|
-
}
|
|
69
|
-
}
|
|
1
|
+
@use "sass:map";
|
|
2
|
+
|
|
3
|
+
// =============================================================================
|
|
4
|
+
// matcha-emoji.scss — Pastoral sentiment emojis
|
|
5
|
+
// Aligned with Figma matcha/emoji:
|
|
6
|
+
// 9 sentimentos × 3 estilos = 27 variantes
|
|
7
|
+
// Sentimentos: Feliz, Grato, Abençoado, Doente, Sozinho, Triste, Pouca fé, Cuidado, Angustiado
|
|
8
|
+
// Estilos: Default (emoji nativo), Outline, Filled
|
|
9
|
+
// Tamanhos: sm (16px), md (24px), lg (32px)
|
|
10
|
+
// Angular: matcha-emoji
|
|
11
|
+
// =============================================================================
|
|
12
|
+
|
|
13
|
+
// ── Layout ──────────────────────────────────────────────────────────────────
|
|
14
|
+
|
|
15
|
+
.matcha-emoji {
|
|
16
|
+
display: inline-flex;
|
|
17
|
+
align-items: center;
|
|
18
|
+
justify-content: center;
|
|
19
|
+
flex-shrink: 0;
|
|
20
|
+
user-select: none;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
// ── Sizes ───────────────────────────────────────────────────────────────────
|
|
24
|
+
|
|
25
|
+
.matcha-emoji--sm {
|
|
26
|
+
width: var(--matcha-icon-size-sm, 16px);
|
|
27
|
+
height: var(--matcha-icon-size-sm, 16px);
|
|
28
|
+
font-size: var(--matcha-icon-size-sm, 16px);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
.matcha-emoji--md {
|
|
32
|
+
width: var(--matcha-icon-size-md, 24px);
|
|
33
|
+
height: var(--matcha-icon-size-md, 24px);
|
|
34
|
+
font-size: var(--matcha-icon-size-md, 24px);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
.matcha-emoji--lg {
|
|
38
|
+
width: var(--matcha-icon-size-lg, 32px);
|
|
39
|
+
height: var(--matcha-icon-size-lg, 32px);
|
|
40
|
+
font-size: var(--matcha-icon-size-lg, 32px);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// ── Styles ──────────────────────────────────────────────────────────────────
|
|
44
|
+
|
|
45
|
+
.matcha-emoji--default {
|
|
46
|
+
// Native emoji — no additional styling needed
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
.matcha-emoji--outline,
|
|
50
|
+
.matcha-emoji--filled {
|
|
51
|
+
svg {
|
|
52
|
+
width: 100%;
|
|
53
|
+
height: 100%;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// ── Theme ───────────────────────────────────────────────────────────────────
|
|
58
|
+
|
|
59
|
+
@mixin matcha-emoji-theme($theme) {
|
|
60
|
+
.matcha-emoji--outline svg {
|
|
61
|
+
fill: none;
|
|
62
|
+
stroke: var(--matcha-color-fg);
|
|
63
|
+
stroke-width: 1.5;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
.matcha-emoji--filled svg {
|
|
67
|
+
fill: var(--matcha-color-fg);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
@@ -1,230 +1,230 @@
|
|
|
1
|
-
// =============================================================================
|
|
2
|
-
// matcha-empty-state.scss — Figma DSV3 matcha/empty-state (14935:130)
|
|
3
|
-
// 6 variants: Tamanho (Padrão 400/Compacto 280) × Ação (Sim/Não) × Descrição (Sim/Não)
|
|
4
|
-
// + extensão DSV3: variantes semânticas (success/warning/error/info), slot media,
|
|
5
|
-
// heading level configurável, anúncio aria-live opt-in.
|
|
6
|
-
// =============================================================================
|
|
7
|
-
|
|
8
|
-
// ── Structural ──────────────────────────────────────────────────────────────
|
|
9
|
-
|
|
10
|
-
matcha-empty-state {
|
|
11
|
-
display: flex;
|
|
12
|
-
flex-direction: column;
|
|
13
|
-
align-items: center;
|
|
14
|
-
justify-content: center;
|
|
15
|
-
gap: var(--matcha-space-200, 16px);
|
|
16
|
-
width: 400px;
|
|
17
|
-
max-width: 100%;
|
|
18
|
-
// Centraliza o bloco horizontalmente quando o parent é mais largo que 400px
|
|
19
|
-
// (canon Figma DSV3 — empty-state sempre no centro do container).
|
|
20
|
-
margin-inline: auto;
|
|
21
|
-
padding: var(--matcha-space-600, 48px) var(--matcha-space-400, 32px);
|
|
22
|
-
box-sizing: border-box;
|
|
23
|
-
text-align: center;
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
// ── Container do ícone — 64×64 com bg disabled e opacity 0.4 ────────────────
|
|
27
|
-
.matcha-empty-state__icon-container {
|
|
28
|
-
display: flex;
|
|
29
|
-
align-items: center;
|
|
30
|
-
justify-content: center;
|
|
31
|
-
flex-shrink: 0;
|
|
32
|
-
width: 64px;
|
|
33
|
-
height: 64px;
|
|
34
|
-
border-radius: var(--matcha-radius-xl, 16px);
|
|
35
|
-
background-color: var(--matcha-color-interaction-disabled-bg, #282C34);
|
|
36
|
-
opacity: var(--matcha-opacity-overlay-soft, 0.4);
|
|
37
|
-
overflow: hidden;
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
// ── Ícone dentro do container — 28×28 (Figma exato) ────────────────────────
|
|
41
|
-
matcha-empty-state .matcha-empty-state__icon-container .matcha-empty-state__icon,
|
|
42
|
-
matcha-empty-state .matcha-empty-state__icon-container matcha-icon {
|
|
43
|
-
font-size: 28px;
|
|
44
|
-
width: 28px;
|
|
45
|
-
height: 28px;
|
|
46
|
-
line-height: 28px;
|
|
47
|
-
color: var(--matcha-color-text-primary, #E8EAED);
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
// ── Variantes semânticas — colorem o container do ícone ────────────────────
|
|
51
|
-
matcha-empty-state[variant="success"] .matcha-empty-state__icon-container {
|
|
52
|
-
background-color: var(--matcha-color-success, #4caf50);
|
|
53
|
-
}
|
|
54
|
-
matcha-empty-state[variant="warning"] .matcha-empty-state__icon-container {
|
|
55
|
-
background-color: var(--matcha-color-warn, #ff9800);
|
|
56
|
-
}
|
|
57
|
-
matcha-empty-state[variant="error"] .matcha-empty-state__icon-container {
|
|
58
|
-
background-color: var(--matcha-color-danger, #f44336);
|
|
59
|
-
}
|
|
60
|
-
matcha-empty-state[variant="info"] .matcha-empty-state__icon-container {
|
|
61
|
-
background-color: var(--matcha-color-info, #64B5F6);
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
// Em variantes semânticas, ícone fica branco/contraste, sem opacity baixa
|
|
65
|
-
matcha-empty-state[variant]:not([variant="default"]) .matcha-empty-state__icon-container {
|
|
66
|
-
opacity: 1;
|
|
67
|
-
}
|
|
68
|
-
matcha-empty-state[variant]:not([variant="default"]) .matcha-empty-state__icon-container .matcha-empty-state__icon,
|
|
69
|
-
matcha-empty-state[variant]:not([variant="default"]) .matcha-empty-state__icon-container matcha-icon {
|
|
70
|
-
color: var(--matcha-color-on-feedback, #FFFFFF);
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
// Pareamento canônico por variant — usa o token *-contrast de cada feedback,
|
|
74
|
-
// que respeita WCAG AA em ambos os themes (preto em dark / branco em light
|
|
75
|
-
// pros tons claros; e o inverso pros tons escuros).
|
|
76
|
-
// !important: a regra global do matcha-icon (`matcha-icon { color: ... }`)
|
|
77
|
-
// tem mesma specificity que esses descendant selectors em alguns casos, e o
|
|
78
|
-
// browser cai no source order. !important garante que o contrast vence sempre.
|
|
79
|
-
matcha-empty-state[variant="success"] .matcha-empty-state__icon-container .matcha-empty-state__icon,
|
|
80
|
-
matcha-empty-state[variant="success"] .matcha-empty-state__icon-container matcha-icon {
|
|
81
|
-
color: var(--matcha-color-success-contrast) !important;
|
|
82
|
-
}
|
|
83
|
-
matcha-empty-state[variant="warning"] .matcha-empty-state__icon-container .matcha-empty-state__icon,
|
|
84
|
-
matcha-empty-state[variant="warning"] .matcha-empty-state__icon-container matcha-icon {
|
|
85
|
-
color: var(--matcha-color-warn-contrast) !important;
|
|
86
|
-
}
|
|
87
|
-
matcha-empty-state[variant="error"] .matcha-empty-state__icon-container .matcha-empty-state__icon,
|
|
88
|
-
matcha-empty-state[variant="error"] .matcha-empty-state__icon-container matcha-icon {
|
|
89
|
-
color: var(--matcha-color-danger-contrast) !important;
|
|
90
|
-
}
|
|
91
|
-
matcha-empty-state[variant="info"] .matcha-empty-state__icon-container .matcha-empty-state__icon,
|
|
92
|
-
matcha-empty-state[variant="info"] .matcha-empty-state__icon-container matcha-icon {
|
|
93
|
-
color: var(--matcha-color-info-contrast) !important;
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
// ── Slot media (ilustração custom) — 64×64 default, 48×48 compact ──────────
|
|
97
|
-
matcha-empty-state [matchaEmptyStateMedia] {
|
|
98
|
-
display: block;
|
|
99
|
-
flex-shrink: 0;
|
|
100
|
-
max-width: 120px;
|
|
101
|
-
max-height: 120px;
|
|
102
|
-
object-fit: contain;
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
// Quando slot media presente, esconde o container do ícone padrão
|
|
106
|
-
matcha-empty-state:has([matchaEmptyStateMedia]) .matcha-empty-state__icon-container {
|
|
107
|
-
display: none;
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
// ── Bloco texto — título + descrição ────────────────────────────────────────
|
|
111
|
-
.matcha-empty-state__text {
|
|
112
|
-
display: flex;
|
|
113
|
-
flex-direction: column;
|
|
114
|
-
align-items: center;
|
|
115
|
-
gap: var(--matcha-space-100, 8px);
|
|
116
|
-
width: 100%;
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
// ── Título — matcha/text/button-lg (16/600/22, letter-spacing 0.2) ─────────
|
|
120
|
-
.matcha-empty-state__title {
|
|
121
|
-
font-family: var(--matcha-font-family);
|
|
122
|
-
font-size: var(--matcha-text-label-lg, 16px);
|
|
123
|
-
font-weight: var(--matcha-weight-semibold, 600);
|
|
124
|
-
line-height: var(--matcha-leading-label-lg, 22px);
|
|
125
|
-
letter-spacing: 0.2px;
|
|
126
|
-
color: var(--matcha-color-text-primary, #E8EAED);
|
|
127
|
-
margin: 0;
|
|
128
|
-
max-width: 336px;
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
// ── Descrição — matcha/text/body-md (14/400/20) — w fixo 210px (Figma) ─────
|
|
132
|
-
.matcha-empty-state__description {
|
|
133
|
-
font-family: var(--matcha-font-family);
|
|
134
|
-
font-size: var(--matcha-text-body-md, 14px);
|
|
135
|
-
font-weight: var(--matcha-weight-regular, 400);
|
|
136
|
-
line-height: var(--matcha-leading-body-md, 20px);
|
|
137
|
-
color: var(--matcha-color-text-secondary);
|
|
138
|
-
margin: 0;
|
|
139
|
-
max-width: 210px;
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
// ── Slot da ação — suporta múltiplas ações com gap padrão ──────────────────
|
|
143
|
-
.matcha-empty-state__action {
|
|
144
|
-
display: inline-flex;
|
|
145
|
-
flex-wrap: wrap;
|
|
146
|
-
align-items: center;
|
|
147
|
-
justify-content: center;
|
|
148
|
-
gap: var(--matcha-space-100, 8px);
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
// Esconde container vazio (sem ng-content projetado)
|
|
152
|
-
.matcha-empty-state__action:empty {
|
|
153
|
-
display: none;
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
// ── Compact variant — 280px largura, ícone menor, padding reduzido ─────────
|
|
157
|
-
matcha-empty-state[size="compact"],
|
|
158
|
-
matcha-empty-state.matcha-empty-state--compact {
|
|
159
|
-
width: 280px;
|
|
160
|
-
padding: var(--matcha-space-300, 24px) var(--matcha-space-200, 16px);
|
|
161
|
-
gap: var(--matcha-space-150, 12px);
|
|
162
|
-
|
|
163
|
-
.matcha-empty-state__icon-container {
|
|
164
|
-
width: 48px;
|
|
165
|
-
height: 48px;
|
|
166
|
-
border-radius: var(--matcha-radius-lg, 12px);
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
.matcha-empty-state__icon,
|
|
170
|
-
matcha-icon.matcha-empty-state__icon {
|
|
171
|
-
font-size: 20px;
|
|
172
|
-
width: 20px;
|
|
173
|
-
height: 20px;
|
|
174
|
-
line-height: 20px;
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
.matcha-empty-state__title {
|
|
178
|
-
font-size: var(--matcha-text-body-md, 14px);
|
|
179
|
-
line-height: var(--matcha-leading-body-md, 20px);
|
|
180
|
-
max-width: 240px;
|
|
181
|
-
}
|
|
182
|
-
|
|
183
|
-
.matcha-empty-state__description {
|
|
184
|
-
max-width: 240px;
|
|
185
|
-
}
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
// ── Responsive: telas pequenas reduzem padding lateral ─────────────────────
|
|
189
|
-
@media (max-width: 479px) {
|
|
190
|
-
matcha-empty-state:not([size="compact"]):not(.matcha-empty-state--compact) {
|
|
191
|
-
padding: var(--matcha-space-400, 32px) var(--matcha-space-250, 20px);
|
|
192
|
-
}
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
// =============================================================================
|
|
196
|
-
// Theme mixin — vazia. Tudo via CSS custom properties globais.
|
|
197
|
-
// =============================================================================
|
|
198
|
-
|
|
199
|
-
@mixin matcha-empty-state-theme($theme) {
|
|
200
|
-
// Sem overrides — tokens globais bastam.
|
|
201
|
-
}
|
|
202
|
-
|
|
203
|
-
// ── Forced colors ──
|
|
204
|
-
@media (forced-colors: active) {
|
|
205
|
-
matcha-empty-state {
|
|
206
|
-
.matcha-empty-state__icon-container {
|
|
207
|
-
background: Canvas !important;
|
|
208
|
-
border: 1px solid CanvasText !important;
|
|
209
|
-
opacity: 1 !important;
|
|
210
|
-
|
|
211
|
-
matcha-icon { color: CanvasText !important; }
|
|
212
|
-
}
|
|
213
|
-
}
|
|
214
|
-
}
|
|
215
|
-
|
|
216
|
-
// ── Reduced motion ──
|
|
217
|
-
@media (prefers-reduced-motion: reduce) {
|
|
218
|
-
matcha-empty-state * {
|
|
219
|
-
transition: none !important;
|
|
220
|
-
animation: none !important;
|
|
221
|
-
}
|
|
222
|
-
}
|
|
223
|
-
|
|
224
|
-
// ── Print ──
|
|
225
|
-
// Empty state é informacional — mantém visível, ação pode hide.
|
|
226
|
-
@media print {
|
|
227
|
-
matcha-empty-state .matcha-empty-state__action {
|
|
228
|
-
display: none !important;
|
|
229
|
-
}
|
|
230
|
-
}
|
|
1
|
+
// =============================================================================
|
|
2
|
+
// matcha-empty-state.scss — Figma DSV3 matcha/empty-state (14935:130)
|
|
3
|
+
// 6 variants: Tamanho (Padrão 400/Compacto 280) × Ação (Sim/Não) × Descrição (Sim/Não)
|
|
4
|
+
// + extensão DSV3: variantes semânticas (success/warning/error/info), slot media,
|
|
5
|
+
// heading level configurável, anúncio aria-live opt-in.
|
|
6
|
+
// =============================================================================
|
|
7
|
+
|
|
8
|
+
// ── Structural ──────────────────────────────────────────────────────────────
|
|
9
|
+
|
|
10
|
+
matcha-empty-state {
|
|
11
|
+
display: flex;
|
|
12
|
+
flex-direction: column;
|
|
13
|
+
align-items: center;
|
|
14
|
+
justify-content: center;
|
|
15
|
+
gap: var(--matcha-space-200, 16px);
|
|
16
|
+
width: 400px;
|
|
17
|
+
max-width: 100%;
|
|
18
|
+
// Centraliza o bloco horizontalmente quando o parent é mais largo que 400px
|
|
19
|
+
// (canon Figma DSV3 — empty-state sempre no centro do container).
|
|
20
|
+
margin-inline: auto;
|
|
21
|
+
padding: var(--matcha-space-600, 48px) var(--matcha-space-400, 32px);
|
|
22
|
+
box-sizing: border-box;
|
|
23
|
+
text-align: center;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
// ── Container do ícone — 64×64 com bg disabled e opacity 0.4 ────────────────
|
|
27
|
+
.matcha-empty-state__icon-container {
|
|
28
|
+
display: flex;
|
|
29
|
+
align-items: center;
|
|
30
|
+
justify-content: center;
|
|
31
|
+
flex-shrink: 0;
|
|
32
|
+
width: 64px;
|
|
33
|
+
height: 64px;
|
|
34
|
+
border-radius: var(--matcha-radius-xl, 16px);
|
|
35
|
+
background-color: var(--matcha-color-interaction-disabled-bg, #282C34);
|
|
36
|
+
opacity: var(--matcha-opacity-overlay-soft, 0.4);
|
|
37
|
+
overflow: hidden;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
// ── Ícone dentro do container — 28×28 (Figma exato) ────────────────────────
|
|
41
|
+
matcha-empty-state .matcha-empty-state__icon-container .matcha-empty-state__icon,
|
|
42
|
+
matcha-empty-state .matcha-empty-state__icon-container matcha-icon {
|
|
43
|
+
font-size: 28px;
|
|
44
|
+
width: 28px;
|
|
45
|
+
height: 28px;
|
|
46
|
+
line-height: 28px;
|
|
47
|
+
color: var(--matcha-color-text-primary, #E8EAED);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
// ── Variantes semânticas — colorem o container do ícone ────────────────────
|
|
51
|
+
matcha-empty-state[variant="success"] .matcha-empty-state__icon-container {
|
|
52
|
+
background-color: var(--matcha-color-success, #4caf50);
|
|
53
|
+
}
|
|
54
|
+
matcha-empty-state[variant="warning"] .matcha-empty-state__icon-container {
|
|
55
|
+
background-color: var(--matcha-color-warn, #ff9800);
|
|
56
|
+
}
|
|
57
|
+
matcha-empty-state[variant="error"] .matcha-empty-state__icon-container {
|
|
58
|
+
background-color: var(--matcha-color-danger, #f44336);
|
|
59
|
+
}
|
|
60
|
+
matcha-empty-state[variant="info"] .matcha-empty-state__icon-container {
|
|
61
|
+
background-color: var(--matcha-color-info, #64B5F6);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
// Em variantes semânticas, ícone fica branco/contraste, sem opacity baixa
|
|
65
|
+
matcha-empty-state[variant]:not([variant="default"]) .matcha-empty-state__icon-container {
|
|
66
|
+
opacity: 1;
|
|
67
|
+
}
|
|
68
|
+
matcha-empty-state[variant]:not([variant="default"]) .matcha-empty-state__icon-container .matcha-empty-state__icon,
|
|
69
|
+
matcha-empty-state[variant]:not([variant="default"]) .matcha-empty-state__icon-container matcha-icon {
|
|
70
|
+
color: var(--matcha-color-on-feedback, #FFFFFF);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
// Pareamento canônico por variant — usa o token *-contrast de cada feedback,
|
|
74
|
+
// que respeita WCAG AA em ambos os themes (preto em dark / branco em light
|
|
75
|
+
// pros tons claros; e o inverso pros tons escuros).
|
|
76
|
+
// !important: a regra global do matcha-icon (`matcha-icon { color: ... }`)
|
|
77
|
+
// tem mesma specificity que esses descendant selectors em alguns casos, e o
|
|
78
|
+
// browser cai no source order. !important garante que o contrast vence sempre.
|
|
79
|
+
matcha-empty-state[variant="success"] .matcha-empty-state__icon-container .matcha-empty-state__icon,
|
|
80
|
+
matcha-empty-state[variant="success"] .matcha-empty-state__icon-container matcha-icon {
|
|
81
|
+
color: var(--matcha-color-success-contrast) !important;
|
|
82
|
+
}
|
|
83
|
+
matcha-empty-state[variant="warning"] .matcha-empty-state__icon-container .matcha-empty-state__icon,
|
|
84
|
+
matcha-empty-state[variant="warning"] .matcha-empty-state__icon-container matcha-icon {
|
|
85
|
+
color: var(--matcha-color-warn-contrast) !important;
|
|
86
|
+
}
|
|
87
|
+
matcha-empty-state[variant="error"] .matcha-empty-state__icon-container .matcha-empty-state__icon,
|
|
88
|
+
matcha-empty-state[variant="error"] .matcha-empty-state__icon-container matcha-icon {
|
|
89
|
+
color: var(--matcha-color-danger-contrast) !important;
|
|
90
|
+
}
|
|
91
|
+
matcha-empty-state[variant="info"] .matcha-empty-state__icon-container .matcha-empty-state__icon,
|
|
92
|
+
matcha-empty-state[variant="info"] .matcha-empty-state__icon-container matcha-icon {
|
|
93
|
+
color: var(--matcha-color-info-contrast) !important;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
// ── Slot media (ilustração custom) — 64×64 default, 48×48 compact ──────────
|
|
97
|
+
matcha-empty-state [matchaEmptyStateMedia] {
|
|
98
|
+
display: block;
|
|
99
|
+
flex-shrink: 0;
|
|
100
|
+
max-width: 120px;
|
|
101
|
+
max-height: 120px;
|
|
102
|
+
object-fit: contain;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
// Quando slot media presente, esconde o container do ícone padrão
|
|
106
|
+
matcha-empty-state:has([matchaEmptyStateMedia]) .matcha-empty-state__icon-container {
|
|
107
|
+
display: none;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
// ── Bloco texto — título + descrição ────────────────────────────────────────
|
|
111
|
+
.matcha-empty-state__text {
|
|
112
|
+
display: flex;
|
|
113
|
+
flex-direction: column;
|
|
114
|
+
align-items: center;
|
|
115
|
+
gap: var(--matcha-space-100, 8px);
|
|
116
|
+
width: 100%;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
// ── Título — matcha/text/button-lg (16/600/22, letter-spacing 0.2) ─────────
|
|
120
|
+
.matcha-empty-state__title {
|
|
121
|
+
font-family: var(--matcha-font-family);
|
|
122
|
+
font-size: var(--matcha-text-label-lg, 16px);
|
|
123
|
+
font-weight: var(--matcha-weight-semibold, 600);
|
|
124
|
+
line-height: var(--matcha-leading-label-lg, 22px);
|
|
125
|
+
letter-spacing: 0.2px;
|
|
126
|
+
color: var(--matcha-color-text-primary, #E8EAED);
|
|
127
|
+
margin: 0;
|
|
128
|
+
max-width: 336px;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
// ── Descrição — matcha/text/body-md (14/400/20) — w fixo 210px (Figma) ─────
|
|
132
|
+
.matcha-empty-state__description {
|
|
133
|
+
font-family: var(--matcha-font-family);
|
|
134
|
+
font-size: var(--matcha-text-body-md, 14px);
|
|
135
|
+
font-weight: var(--matcha-weight-regular, 400);
|
|
136
|
+
line-height: var(--matcha-leading-body-md, 20px);
|
|
137
|
+
color: var(--matcha-color-text-secondary);
|
|
138
|
+
margin: 0;
|
|
139
|
+
max-width: 210px;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
// ── Slot da ação — suporta múltiplas ações com gap padrão ──────────────────
|
|
143
|
+
.matcha-empty-state__action {
|
|
144
|
+
display: inline-flex;
|
|
145
|
+
flex-wrap: wrap;
|
|
146
|
+
align-items: center;
|
|
147
|
+
justify-content: center;
|
|
148
|
+
gap: var(--matcha-space-100, 8px);
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
// Esconde container vazio (sem ng-content projetado)
|
|
152
|
+
.matcha-empty-state__action:empty {
|
|
153
|
+
display: none;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
// ── Compact variant — 280px largura, ícone menor, padding reduzido ─────────
|
|
157
|
+
matcha-empty-state[size="compact"],
|
|
158
|
+
matcha-empty-state.matcha-empty-state--compact {
|
|
159
|
+
width: 280px;
|
|
160
|
+
padding: var(--matcha-space-300, 24px) var(--matcha-space-200, 16px);
|
|
161
|
+
gap: var(--matcha-space-150, 12px);
|
|
162
|
+
|
|
163
|
+
.matcha-empty-state__icon-container {
|
|
164
|
+
width: 48px;
|
|
165
|
+
height: 48px;
|
|
166
|
+
border-radius: var(--matcha-radius-lg, 12px);
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
.matcha-empty-state__icon,
|
|
170
|
+
matcha-icon.matcha-empty-state__icon {
|
|
171
|
+
font-size: 20px;
|
|
172
|
+
width: 20px;
|
|
173
|
+
height: 20px;
|
|
174
|
+
line-height: 20px;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
.matcha-empty-state__title {
|
|
178
|
+
font-size: var(--matcha-text-body-md, 14px);
|
|
179
|
+
line-height: var(--matcha-leading-body-md, 20px);
|
|
180
|
+
max-width: 240px;
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
.matcha-empty-state__description {
|
|
184
|
+
max-width: 240px;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
// ── Responsive: telas pequenas reduzem padding lateral ─────────────────────
|
|
189
|
+
@media (max-width: 479px) {
|
|
190
|
+
matcha-empty-state:not([size="compact"]):not(.matcha-empty-state--compact) {
|
|
191
|
+
padding: var(--matcha-space-400, 32px) var(--matcha-space-250, 20px);
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
// =============================================================================
|
|
196
|
+
// Theme mixin — vazia. Tudo via CSS custom properties globais.
|
|
197
|
+
// =============================================================================
|
|
198
|
+
|
|
199
|
+
@mixin matcha-empty-state-theme($theme) {
|
|
200
|
+
// Sem overrides — tokens globais bastam.
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
// ── Forced colors ──
|
|
204
|
+
@media (forced-colors: active) {
|
|
205
|
+
matcha-empty-state {
|
|
206
|
+
.matcha-empty-state__icon-container {
|
|
207
|
+
background: Canvas !important;
|
|
208
|
+
border: 1px solid CanvasText !important;
|
|
209
|
+
opacity: 1 !important;
|
|
210
|
+
|
|
211
|
+
matcha-icon { color: CanvasText !important; }
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
// ── Reduced motion ──
|
|
217
|
+
@media (prefers-reduced-motion: reduce) {
|
|
218
|
+
matcha-empty-state * {
|
|
219
|
+
transition: none !important;
|
|
220
|
+
animation: none !important;
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
// ── Print ──
|
|
225
|
+
// Empty state é informacional — mantém visível, ação pode hide.
|
|
226
|
+
@media print {
|
|
227
|
+
matcha-empty-state .matcha-empty-state__action {
|
|
228
|
+
display: none !important;
|
|
229
|
+
}
|
|
230
|
+
}
|