@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,257 +1,257 @@
|
|
|
1
|
-
// =============================================================================
|
|
2
|
-
// matcha-tree-view.scss — Slot row indentado por nível hierárquico
|
|
3
|
-
// Componente é um FRAME minimal (indent + estados). Consumer compõe o conteúdo
|
|
4
|
-
// livre via ng-content. Responsivo via container queries.
|
|
5
|
-
// =============================================================================
|
|
6
|
-
|
|
7
|
-
// ── Container opcional (qualquer wrapper .matcha-tree-view) ─────────────────
|
|
8
|
-
// Provê: bg "tray" Figma + gap entre rows + propagação de gap dentro de drop-list.
|
|
9
|
-
.matcha-tree-view {
|
|
10
|
-
display: flex;
|
|
11
|
-
flex-direction: column;
|
|
12
|
-
gap: var(--matcha-space-050, 4px);
|
|
13
|
-
padding: var(--matcha-space-200, 16px);
|
|
14
|
-
background: var(--matcha-color-surface-background);
|
|
15
|
-
border-radius: var(--matcha-radius-lg, 8px);
|
|
16
|
-
|
|
17
|
-
// Container queries — base pra responsivo dos filhos
|
|
18
|
-
container-type: inline-size;
|
|
19
|
-
container-name: matcha-tree-view;
|
|
20
|
-
|
|
21
|
-
.matcha-drop-list-container {
|
|
22
|
-
display: flex;
|
|
23
|
-
flex-direction: column;
|
|
24
|
-
gap: var(--matcha-space-050, 4px);
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
// ── Container data-driven (matcha-tree-view) + branches recursivos ──────────
|
|
29
|
-
// O host <matcha-tree-view> reusa a classe .matcha-tree-view acima (tray + gap).
|
|
30
|
-
// Cada nível é um <matcha-tree-branch> (drop container); a indentação é por item
|
|
31
|
-
// (via [level] do tree-view-item), então os wrappers NÃO adicionam indent.
|
|
32
|
-
matcha-tree-branch,
|
|
33
|
-
.matcha-tree-view__children {
|
|
34
|
-
display: flex;
|
|
35
|
-
flex-direction: column;
|
|
36
|
-
gap: var(--matcha-space-050, 4px);
|
|
37
|
-
min-height: 2px; // alvo de drop mínimo quando o branch está vazio
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
.matcha-tree-view__node {
|
|
41
|
-
display: block;
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
// Feedback de rejeição na zona de reparenting (self-drop / tipo não aceito)
|
|
45
|
-
.matcha-drop-zone-cannot-accept {
|
|
46
|
-
outline: 2px dashed var(--matcha-color-danger, #e5484d);
|
|
47
|
-
outline-offset: -2px;
|
|
48
|
-
border-radius: var(--matcha-radius-md, 4px);
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
// ── Item host — flex row com indent dinâmico ────────────────────────────────
|
|
52
|
-
matcha-tree-view-item {
|
|
53
|
-
display: flex;
|
|
54
|
-
flex-direction: row;
|
|
55
|
-
align-items: stretch;
|
|
56
|
-
width: 100%;
|
|
57
|
-
box-sizing: border-box;
|
|
58
|
-
outline: none;
|
|
59
|
-
|
|
60
|
-
// Disabled
|
|
61
|
-
&[disabled] {
|
|
62
|
-
opacity: 0.5;
|
|
63
|
-
pointer-events: none;
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
// Clickable
|
|
67
|
-
&[clickable]:not([disabled]) {
|
|
68
|
-
cursor: pointer;
|
|
69
|
-
|
|
70
|
-
&:focus-visible .matcha-tree-view-item__row {
|
|
71
|
-
outline: 2px solid var(--matcha-color-accent);
|
|
72
|
-
outline-offset: -2px;
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
// ── Indent (Nível 2+) — width vem inline do componente ──────────────────────
|
|
78
|
-
.matcha-tree-view-item__indent {
|
|
79
|
-
flex: none;
|
|
80
|
-
// height auto — se ajusta ao row
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
// ── Guias de conector (modo organograma) — render quando [guides] é passado ──
|
|
84
|
-
// Cada célula (largura = indentStep, inline) desenha a linha vertical do ancestral
|
|
85
|
-
// (data-guide=line|tee) e/ou o cotovelo do nó (tee ├ / ell └). Linha via
|
|
86
|
-
// --matcha-tree-view-guide-color (theme-aware, default = surface-border). As
|
|
87
|
-
// verticais transbordam o padding-block da row (--_pad) p/ emendar entre rows —
|
|
88
|
-
// use gap:0 no container quando quiser linhas 100% contínuas.
|
|
89
|
-
.matcha-tree-view-item__guides {
|
|
90
|
-
flex: none;
|
|
91
|
-
align-self: stretch;
|
|
92
|
-
display: flex;
|
|
93
|
-
}
|
|
94
|
-
.matcha-tree-view-item__guide {
|
|
95
|
-
--_guide: var(--matcha-tree-view-guide-color, var(--matcha-color-surface-border));
|
|
96
|
-
--_pad: var(--matcha-space-100, 8px);
|
|
97
|
-
position: relative;
|
|
98
|
-
flex: none;
|
|
99
|
-
|
|
100
|
-
// Linha vertical no centro — 'line'/'tee' atravessam; 'ell' (último) para no centro.
|
|
101
|
-
&[data-guide="line"]::before,
|
|
102
|
-
&[data-guide="tee"]::before,
|
|
103
|
-
&[data-guide="ell"]::before {
|
|
104
|
-
content: "";
|
|
105
|
-
position: absolute;
|
|
106
|
-
left: 50%;
|
|
107
|
-
top: calc(-1 * var(--_pad));
|
|
108
|
-
width: 1px;
|
|
109
|
-
background: var(--_guide);
|
|
110
|
-
}
|
|
111
|
-
&[data-guide="line"]::before,
|
|
112
|
-
&[data-guide="tee"]::before { bottom: calc(-1 * var(--_pad)); }
|
|
113
|
-
&[data-guide="ell"]::before { height: calc(50% + var(--_pad)); }
|
|
114
|
-
|
|
115
|
-
// Cotovelo horizontal (centro → direita, na metade da altura) — 'tee'/'ell'.
|
|
116
|
-
&[data-guide="tee"]::after,
|
|
117
|
-
&[data-guide="ell"]::after {
|
|
118
|
-
content: "";
|
|
119
|
-
position: absolute;
|
|
120
|
-
top: 50%;
|
|
121
|
-
left: 50%;
|
|
122
|
-
right: 0;
|
|
123
|
-
height: 1px;
|
|
124
|
-
background: var(--_guide);
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
// ── Row — bg transparente por default; container .matcha-tree-view dá bg card
|
|
129
|
-
.matcha-tree-view-item__row {
|
|
130
|
-
flex: 1;
|
|
131
|
-
display: flex;
|
|
132
|
-
flex-direction: row;
|
|
133
|
-
align-items: center;
|
|
134
|
-
gap: var(--matcha-space-100, 8px);
|
|
135
|
-
min-height: 48px;
|
|
136
|
-
padding: var(--matcha-space-100, 8px) var(--matcha-space-150, 12px);
|
|
137
|
-
background: transparent;
|
|
138
|
-
border-bottom: 1px solid var(--matcha-color-surface-border);
|
|
139
|
-
border-radius: var(--matcha-radius-md, 4px);
|
|
140
|
-
box-sizing: border-box;
|
|
141
|
-
min-width: 0;
|
|
142
|
-
transition: background-color var(--matcha-duration-instant, 80ms) ease;
|
|
143
|
-
|
|
144
|
-
// Permitir conteúdo wrap se consumer quiser
|
|
145
|
-
flex-wrap: var(--matcha-tree-view-item-wrap, nowrap);
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
// Hover sutil na row
|
|
149
|
-
matcha-tree-view-item:not([disabled]):hover .matcha-tree-view-item__row {
|
|
150
|
-
background: var(--matcha-color-surface-hover);
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
// ── Estilos comuns dos slots opcionais (CSS classes utilitárias do DS) ─────
|
|
154
|
-
// Consumer aplica esses classes nos elementos projetados; o componente NÃO impõe.
|
|
155
|
-
// .matcha-tree-view-item__grip — aplicado automaticamente pela diretiva matchaTreeViewGrip.
|
|
156
|
-
.matcha-tree-view-item__grip {
|
|
157
|
-
flex: none;
|
|
158
|
-
display: inline-flex;
|
|
159
|
-
align-items: center;
|
|
160
|
-
justify-content: center;
|
|
161
|
-
width: 24px;
|
|
162
|
-
height: 24px;
|
|
163
|
-
--matcha-icon-color: var(--matcha-color-text-muted);
|
|
164
|
-
cursor: grab;
|
|
165
|
-
transition: --matcha-icon-color var(--matcha-duration-instant, 80ms) ease;
|
|
166
|
-
|
|
167
|
-
&:hover { --matcha-icon-color: var(--matcha-color-text-primary); }
|
|
168
|
-
&:active { cursor: grabbing; }
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
// Dentro do container canon (.matcha-tree-view), row ganha bg "card on tray" (Figma)
|
|
172
|
-
.matcha-tree-view matcha-tree-view-item:not([disabled]) .matcha-tree-view-item__row {
|
|
173
|
-
background: var(--matcha-color-surface-card);
|
|
174
|
-
}
|
|
175
|
-
.matcha-tree-view matcha-tree-view-item:not([disabled]):hover .matcha-tree-view-item__row {
|
|
176
|
-
background: var(--matcha-color-surface-card-strong, var(--matcha-color-surface-card));
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
// ── DnD states (compõe com matcha-drop-list) ────────────────────────────────
|
|
180
|
-
.matcha-drag-item.matcha-drag-dragging {
|
|
181
|
-
opacity: 0.35;
|
|
182
|
-
|
|
183
|
-
.matcha-tree-view-item__row { background: var(--matcha-color-surface-hover); }
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
.matcha-tree-view .matcha-drop-list-placeholder {
|
|
187
|
-
height: 4px;
|
|
188
|
-
margin: var(--matcha-space-050, 4px) 0;
|
|
189
|
-
background: var(--matcha-color-accent);
|
|
190
|
-
border-radius: var(--matcha-radius-sm, 2px);
|
|
191
|
-
opacity: 0.85;
|
|
192
|
-
box-shadow: 0 0 0 2px var(--matcha-color-accent-alpha, rgba(168, 217, 78, 0.2));
|
|
193
|
-
animation: matcha-tree-view-pulse 800ms ease-in-out infinite alternate;
|
|
194
|
-
}
|
|
195
|
-
|
|
196
|
-
@keyframes matcha-tree-view-pulse {
|
|
197
|
-
from { opacity: 0.7; }
|
|
198
|
-
to { opacity: 1; }
|
|
199
|
-
}
|
|
200
|
-
|
|
201
|
-
.matcha-tree-view .matcha-drop-list-empty-placeholder {
|
|
202
|
-
display: flex;
|
|
203
|
-
align-items: center;
|
|
204
|
-
justify-content: center;
|
|
205
|
-
padding: var(--matcha-space-400, 32px);
|
|
206
|
-
font-size: var(--matcha-text-body-sm, 12px);
|
|
207
|
-
color: var(--matcha-color-text-muted);
|
|
208
|
-
border: 2px dashed var(--matcha-color-surface-border);
|
|
209
|
-
border-radius: var(--matcha-radius-md, 4px);
|
|
210
|
-
background: transparent;
|
|
211
|
-
}
|
|
212
|
-
|
|
213
|
-
.matcha-drag-item.matcha-drag-dragging .matcha-tree-view-item__grip { cursor: grabbing; }
|
|
214
|
-
|
|
215
|
-
// ── Entrance animation ──────────────────────────────────────────────────────
|
|
216
|
-
matcha-tree-view-item:not(.matcha-drag-dragging) {
|
|
217
|
-
animation: matcha-tree-view-item-in 220ms cubic-bezier(0.4, 0, 0.2, 1) both;
|
|
218
|
-
}
|
|
219
|
-
|
|
220
|
-
@keyframes matcha-tree-view-item-in {
|
|
221
|
-
from { opacity: 0; transform: translateY(-4px); }
|
|
222
|
-
to { opacity: 1; transform: translateY(0); }
|
|
223
|
-
}
|
|
224
|
-
|
|
225
|
-
// ── Responsividade — container query baseada no .matcha-tree-view container
|
|
226
|
-
// Em containers estreitos (< 480px), reduz indent visual pra preservar espaço útil.
|
|
227
|
-
// Indent visual = padding-left implícito via --matcha-tree-view-item-indent setado
|
|
228
|
-
// inline pelo componente. Container query NÃO consegue overridar inline style
|
|
229
|
-
// diretamente, então usamos uma estratégia diferente: scale do indent div.
|
|
230
|
-
@container matcha-tree-view (max-width: 480px) {
|
|
231
|
-
.matcha-tree-view-item__indent {
|
|
232
|
-
// Reduz 50% do width inline — preserva indent visual sem perder hierarquia
|
|
233
|
-
transform: scaleX(0.6);
|
|
234
|
-
transform-origin: left center;
|
|
235
|
-
}
|
|
236
|
-
|
|
237
|
-
.matcha-tree-view-item__row {
|
|
238
|
-
gap: var(--matcha-space-050, 4px);
|
|
239
|
-
padding: var(--matcha-space-100, 8px);
|
|
240
|
-
min-height: 44px; // touch target WCAG 2.5.5 em mobile
|
|
241
|
-
}
|
|
242
|
-
}
|
|
243
|
-
|
|
244
|
-
// Respeita preferência de redução de movimento
|
|
245
|
-
@media (prefers-reduced-motion: reduce) {
|
|
246
|
-
matcha-tree-view-item,
|
|
247
|
-
matcha-tree-view-item:not(.matcha-drag-dragging),
|
|
248
|
-
.matcha-tree-view .matcha-drop-list-placeholder {
|
|
249
|
-
animation: none !important;
|
|
250
|
-
transition: none !important;
|
|
251
|
-
}
|
|
252
|
-
}
|
|
253
|
-
|
|
254
|
-
// ── Theme mixin ─────────────────────────────────────────────────────────────
|
|
255
|
-
@mixin matcha-tree-view-theme($theme) {
|
|
256
|
-
// Tudo via CSS vars — sem theme-specific overrides.
|
|
257
|
-
}
|
|
1
|
+
// =============================================================================
|
|
2
|
+
// matcha-tree-view.scss — Slot row indentado por nível hierárquico
|
|
3
|
+
// Componente é um FRAME minimal (indent + estados). Consumer compõe o conteúdo
|
|
4
|
+
// livre via ng-content. Responsivo via container queries.
|
|
5
|
+
// =============================================================================
|
|
6
|
+
|
|
7
|
+
// ── Container opcional (qualquer wrapper .matcha-tree-view) ─────────────────
|
|
8
|
+
// Provê: bg "tray" Figma + gap entre rows + propagação de gap dentro de drop-list.
|
|
9
|
+
.matcha-tree-view {
|
|
10
|
+
display: flex;
|
|
11
|
+
flex-direction: column;
|
|
12
|
+
gap: var(--matcha-space-050, 4px);
|
|
13
|
+
padding: var(--matcha-space-200, 16px);
|
|
14
|
+
background: var(--matcha-color-surface-background);
|
|
15
|
+
border-radius: var(--matcha-radius-lg, 8px);
|
|
16
|
+
|
|
17
|
+
// Container queries — base pra responsivo dos filhos
|
|
18
|
+
container-type: inline-size;
|
|
19
|
+
container-name: matcha-tree-view;
|
|
20
|
+
|
|
21
|
+
.matcha-drop-list-container {
|
|
22
|
+
display: flex;
|
|
23
|
+
flex-direction: column;
|
|
24
|
+
gap: var(--matcha-space-050, 4px);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
// ── Container data-driven (matcha-tree-view) + branches recursivos ──────────
|
|
29
|
+
// O host <matcha-tree-view> reusa a classe .matcha-tree-view acima (tray + gap).
|
|
30
|
+
// Cada nível é um <matcha-tree-branch> (drop container); a indentação é por item
|
|
31
|
+
// (via [level] do tree-view-item), então os wrappers NÃO adicionam indent.
|
|
32
|
+
matcha-tree-branch,
|
|
33
|
+
.matcha-tree-view__children {
|
|
34
|
+
display: flex;
|
|
35
|
+
flex-direction: column;
|
|
36
|
+
gap: var(--matcha-space-050, 4px);
|
|
37
|
+
min-height: 2px; // alvo de drop mínimo quando o branch está vazio
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
.matcha-tree-view__node {
|
|
41
|
+
display: block;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// Feedback de rejeição na zona de reparenting (self-drop / tipo não aceito)
|
|
45
|
+
.matcha-drop-zone-cannot-accept {
|
|
46
|
+
outline: 2px dashed var(--matcha-color-danger, #e5484d);
|
|
47
|
+
outline-offset: -2px;
|
|
48
|
+
border-radius: var(--matcha-radius-md, 4px);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
// ── Item host — flex row com indent dinâmico ────────────────────────────────
|
|
52
|
+
matcha-tree-view-item {
|
|
53
|
+
display: flex;
|
|
54
|
+
flex-direction: row;
|
|
55
|
+
align-items: stretch;
|
|
56
|
+
width: 100%;
|
|
57
|
+
box-sizing: border-box;
|
|
58
|
+
outline: none;
|
|
59
|
+
|
|
60
|
+
// Disabled
|
|
61
|
+
&[disabled] {
|
|
62
|
+
opacity: 0.5;
|
|
63
|
+
pointer-events: none;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
// Clickable
|
|
67
|
+
&[clickable]:not([disabled]) {
|
|
68
|
+
cursor: pointer;
|
|
69
|
+
|
|
70
|
+
&:focus-visible .matcha-tree-view-item__row {
|
|
71
|
+
outline: 2px solid var(--matcha-color-accent);
|
|
72
|
+
outline-offset: -2px;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// ── Indent (Nível 2+) — width vem inline do componente ──────────────────────
|
|
78
|
+
.matcha-tree-view-item__indent {
|
|
79
|
+
flex: none;
|
|
80
|
+
// height auto — se ajusta ao row
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
// ── Guias de conector (modo organograma) — render quando [guides] é passado ──
|
|
84
|
+
// Cada célula (largura = indentStep, inline) desenha a linha vertical do ancestral
|
|
85
|
+
// (data-guide=line|tee) e/ou o cotovelo do nó (tee ├ / ell └). Linha via
|
|
86
|
+
// --matcha-tree-view-guide-color (theme-aware, default = surface-border). As
|
|
87
|
+
// verticais transbordam o padding-block da row (--_pad) p/ emendar entre rows —
|
|
88
|
+
// use gap:0 no container quando quiser linhas 100% contínuas.
|
|
89
|
+
.matcha-tree-view-item__guides {
|
|
90
|
+
flex: none;
|
|
91
|
+
align-self: stretch;
|
|
92
|
+
display: flex;
|
|
93
|
+
}
|
|
94
|
+
.matcha-tree-view-item__guide {
|
|
95
|
+
--_guide: var(--matcha-tree-view-guide-color, var(--matcha-color-surface-border));
|
|
96
|
+
--_pad: var(--matcha-space-100, 8px);
|
|
97
|
+
position: relative;
|
|
98
|
+
flex: none;
|
|
99
|
+
|
|
100
|
+
// Linha vertical no centro — 'line'/'tee' atravessam; 'ell' (último) para no centro.
|
|
101
|
+
&[data-guide="line"]::before,
|
|
102
|
+
&[data-guide="tee"]::before,
|
|
103
|
+
&[data-guide="ell"]::before {
|
|
104
|
+
content: "";
|
|
105
|
+
position: absolute;
|
|
106
|
+
left: 50%;
|
|
107
|
+
top: calc(-1 * var(--_pad));
|
|
108
|
+
width: 1px;
|
|
109
|
+
background: var(--_guide);
|
|
110
|
+
}
|
|
111
|
+
&[data-guide="line"]::before,
|
|
112
|
+
&[data-guide="tee"]::before { bottom: calc(-1 * var(--_pad)); }
|
|
113
|
+
&[data-guide="ell"]::before { height: calc(50% + var(--_pad)); }
|
|
114
|
+
|
|
115
|
+
// Cotovelo horizontal (centro → direita, na metade da altura) — 'tee'/'ell'.
|
|
116
|
+
&[data-guide="tee"]::after,
|
|
117
|
+
&[data-guide="ell"]::after {
|
|
118
|
+
content: "";
|
|
119
|
+
position: absolute;
|
|
120
|
+
top: 50%;
|
|
121
|
+
left: 50%;
|
|
122
|
+
right: 0;
|
|
123
|
+
height: 1px;
|
|
124
|
+
background: var(--_guide);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
// ── Row — bg transparente por default; container .matcha-tree-view dá bg card
|
|
129
|
+
.matcha-tree-view-item__row {
|
|
130
|
+
flex: 1;
|
|
131
|
+
display: flex;
|
|
132
|
+
flex-direction: row;
|
|
133
|
+
align-items: center;
|
|
134
|
+
gap: var(--matcha-space-100, 8px);
|
|
135
|
+
min-height: 48px;
|
|
136
|
+
padding: var(--matcha-space-100, 8px) var(--matcha-space-150, 12px);
|
|
137
|
+
background: transparent;
|
|
138
|
+
border-bottom: 1px solid var(--matcha-color-surface-border);
|
|
139
|
+
border-radius: var(--matcha-radius-md, 4px);
|
|
140
|
+
box-sizing: border-box;
|
|
141
|
+
min-width: 0;
|
|
142
|
+
transition: background-color var(--matcha-duration-instant, 80ms) ease;
|
|
143
|
+
|
|
144
|
+
// Permitir conteúdo wrap se consumer quiser
|
|
145
|
+
flex-wrap: var(--matcha-tree-view-item-wrap, nowrap);
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
// Hover sutil na row
|
|
149
|
+
matcha-tree-view-item:not([disabled]):hover .matcha-tree-view-item__row {
|
|
150
|
+
background: var(--matcha-color-surface-hover);
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
// ── Estilos comuns dos slots opcionais (CSS classes utilitárias do DS) ─────
|
|
154
|
+
// Consumer aplica esses classes nos elementos projetados; o componente NÃO impõe.
|
|
155
|
+
// .matcha-tree-view-item__grip — aplicado automaticamente pela diretiva matchaTreeViewGrip.
|
|
156
|
+
.matcha-tree-view-item__grip {
|
|
157
|
+
flex: none;
|
|
158
|
+
display: inline-flex;
|
|
159
|
+
align-items: center;
|
|
160
|
+
justify-content: center;
|
|
161
|
+
width: 24px;
|
|
162
|
+
height: 24px;
|
|
163
|
+
--matcha-icon-color: var(--matcha-color-text-muted);
|
|
164
|
+
cursor: grab;
|
|
165
|
+
transition: --matcha-icon-color var(--matcha-duration-instant, 80ms) ease;
|
|
166
|
+
|
|
167
|
+
&:hover { --matcha-icon-color: var(--matcha-color-text-primary); }
|
|
168
|
+
&:active { cursor: grabbing; }
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
// Dentro do container canon (.matcha-tree-view), row ganha bg "card on tray" (Figma)
|
|
172
|
+
.matcha-tree-view matcha-tree-view-item:not([disabled]) .matcha-tree-view-item__row {
|
|
173
|
+
background: var(--matcha-color-surface-card);
|
|
174
|
+
}
|
|
175
|
+
.matcha-tree-view matcha-tree-view-item:not([disabled]):hover .matcha-tree-view-item__row {
|
|
176
|
+
background: var(--matcha-color-surface-card-strong, var(--matcha-color-surface-card));
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
// ── DnD states (compõe com matcha-drop-list) ────────────────────────────────
|
|
180
|
+
.matcha-drag-item.matcha-drag-dragging {
|
|
181
|
+
opacity: 0.35;
|
|
182
|
+
|
|
183
|
+
.matcha-tree-view-item__row { background: var(--matcha-color-surface-hover); }
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
.matcha-tree-view .matcha-drop-list-placeholder {
|
|
187
|
+
height: 4px;
|
|
188
|
+
margin: var(--matcha-space-050, 4px) 0;
|
|
189
|
+
background: var(--matcha-color-accent);
|
|
190
|
+
border-radius: var(--matcha-radius-sm, 2px);
|
|
191
|
+
opacity: 0.85;
|
|
192
|
+
box-shadow: 0 0 0 2px var(--matcha-color-accent-alpha, rgba(168, 217, 78, 0.2));
|
|
193
|
+
animation: matcha-tree-view-pulse 800ms ease-in-out infinite alternate;
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
@keyframes matcha-tree-view-pulse {
|
|
197
|
+
from { opacity: 0.7; }
|
|
198
|
+
to { opacity: 1; }
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
.matcha-tree-view .matcha-drop-list-empty-placeholder {
|
|
202
|
+
display: flex;
|
|
203
|
+
align-items: center;
|
|
204
|
+
justify-content: center;
|
|
205
|
+
padding: var(--matcha-space-400, 32px);
|
|
206
|
+
font-size: var(--matcha-text-body-sm, 12px);
|
|
207
|
+
color: var(--matcha-color-text-muted);
|
|
208
|
+
border: 2px dashed var(--matcha-color-surface-border);
|
|
209
|
+
border-radius: var(--matcha-radius-md, 4px);
|
|
210
|
+
background: transparent;
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
.matcha-drag-item.matcha-drag-dragging .matcha-tree-view-item__grip { cursor: grabbing; }
|
|
214
|
+
|
|
215
|
+
// ── Entrance animation ──────────────────────────────────────────────────────
|
|
216
|
+
matcha-tree-view-item:not(.matcha-drag-dragging) {
|
|
217
|
+
animation: matcha-tree-view-item-in 220ms cubic-bezier(0.4, 0, 0.2, 1) both;
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
@keyframes matcha-tree-view-item-in {
|
|
221
|
+
from { opacity: 0; transform: translateY(-4px); }
|
|
222
|
+
to { opacity: 1; transform: translateY(0); }
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
// ── Responsividade — container query baseada no .matcha-tree-view container
|
|
226
|
+
// Em containers estreitos (< 480px), reduz indent visual pra preservar espaço útil.
|
|
227
|
+
// Indent visual = padding-left implícito via --matcha-tree-view-item-indent setado
|
|
228
|
+
// inline pelo componente. Container query NÃO consegue overridar inline style
|
|
229
|
+
// diretamente, então usamos uma estratégia diferente: scale do indent div.
|
|
230
|
+
@container matcha-tree-view (max-width: 480px) {
|
|
231
|
+
.matcha-tree-view-item__indent {
|
|
232
|
+
// Reduz 50% do width inline — preserva indent visual sem perder hierarquia
|
|
233
|
+
transform: scaleX(0.6);
|
|
234
|
+
transform-origin: left center;
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
.matcha-tree-view-item__row {
|
|
238
|
+
gap: var(--matcha-space-050, 4px);
|
|
239
|
+
padding: var(--matcha-space-100, 8px);
|
|
240
|
+
min-height: 44px; // touch target WCAG 2.5.5 em mobile
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
// Respeita preferência de redução de movimento
|
|
245
|
+
@media (prefers-reduced-motion: reduce) {
|
|
246
|
+
matcha-tree-view-item,
|
|
247
|
+
matcha-tree-view-item:not(.matcha-drag-dragging),
|
|
248
|
+
.matcha-tree-view .matcha-drop-list-placeholder {
|
|
249
|
+
animation: none !important;
|
|
250
|
+
transition: none !important;
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
// ── Theme mixin ─────────────────────────────────────────────────────────────
|
|
255
|
+
@mixin matcha-tree-view-theme($theme) {
|
|
256
|
+
// Tudo via CSS vars — sem theme-specific overrides.
|
|
257
|
+
}
|