voa-ds-core 1.0.8 → 1.0.10
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/dist/collection/components/GetStarted/ImportandoEstilos.stories.js +32 -11
- package/dist/collection/components/GetStarted/ImportandoEstilos.stories.js.map +1 -1
- package/dist/collection/styles/external/saas-dashboard.css +566 -0
- package/dist/collection/styles/external/voa-accordion.external.css +295 -0
- package/dist/collection/styles/external/voa-alert.external.css +348 -0
- package/dist/collection/styles/external/voa-avatar.external.css +118 -0
- package/dist/collection/styles/external/voa-badge.external.css +346 -0
- package/dist/collection/styles/external/voa-breadcrumbs.external.css +183 -0
- package/dist/collection/styles/external/voa-button.external.css +257 -0
- package/dist/collection/styles/external/voa-card.external.css +30 -0
- package/dist/collection/styles/external/voa-checkbox.external.css +303 -0
- package/dist/collection/styles/external/voa-input-addon.external.css +204 -0
- package/dist/collection/styles/external/voa-input.external.css +307 -0
- package/dist/collection/styles/external/voa-keybinding.external.css +34 -0
- package/dist/collection/styles/external/voa-option.external.css +213 -0
- package/dist/collection/styles/external/voa-pagination.external.css +125 -0
- package/dist/collection/styles/external/voa-radio.external.css +235 -0
- package/dist/collection/styles/external/voa-radio.styles.ts +155 -0
- package/dist/collection/styles/external/voa-select.external.css +568 -0
- package/dist/collection/styles/external/voa-switch.external.css +215 -0
- package/dist/collection/styles/external/voa-tab.external.css +284 -0
- package/dist/collection/styles/external/voa-tag.external.css +206 -0
- package/dist/collection/styles/external/voa-text-area.external.css +174 -0
- package/dist/collection/styles/external/voa-tooltip.external.css +320 -0
- package/dist/collection/styles/voa-components.css +32 -0
- package/dist/voa/styles/external/saas-dashboard.css +566 -0
- package/dist/voa/styles/external/voa-accordion.external.css +295 -0
- package/dist/voa/styles/external/voa-alert.external.css +348 -0
- package/dist/voa/styles/external/voa-avatar.external.css +118 -0
- package/dist/voa/styles/external/voa-badge.external.css +346 -0
- package/dist/voa/styles/external/voa-breadcrumbs.external.css +183 -0
- package/dist/voa/styles/external/voa-button.external.css +257 -0
- package/dist/voa/styles/external/voa-card.external.css +30 -0
- package/dist/voa/styles/external/voa-checkbox.external.css +303 -0
- package/dist/voa/styles/external/voa-input-addon.external.css +204 -0
- package/dist/voa/styles/external/voa-input.external.css +307 -0
- package/dist/voa/styles/external/voa-keybinding.external.css +34 -0
- package/dist/voa/styles/external/voa-option.external.css +213 -0
- package/dist/voa/styles/external/voa-pagination.external.css +125 -0
- package/dist/voa/styles/external/voa-radio.external.css +235 -0
- package/dist/voa/styles/external/voa-radio.styles.ts +155 -0
- package/dist/voa/styles/external/voa-select.external.css +568 -0
- package/dist/voa/styles/external/voa-switch.external.css +215 -0
- package/dist/voa/styles/external/voa-tab.external.css +284 -0
- package/dist/voa/styles/external/voa-tag.external.css +206 -0
- package/dist/voa/styles/external/voa-text-area.external.css +174 -0
- package/dist/voa/styles/external/voa-tooltip.external.css +320 -0
- package/dist/voa/styles/voa-components.css +32 -0
- package/package.json +3 -1
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Estilização Externa do VoaSwitch
|
|
3
|
+
*
|
|
4
|
+
* Este arquivo demonstra como estilizar o componente voa-switch
|
|
5
|
+
* usando CSS Parts API e design tokens semânticos.
|
|
6
|
+
*
|
|
7
|
+
* Baseado no design do Figma:
|
|
8
|
+
* https://www.figma.com/design/wDStUEuqpl7Tu1oHpiAml6/Voa-Design-System?node-id=443-10259
|
|
9
|
+
*
|
|
10
|
+
* Para usar, importe este arquivo após os tokens:
|
|
11
|
+
* @import '@voa-ds/tokens/global.css';
|
|
12
|
+
* @import '@voa-ds/styles/voa-switch.css';
|
|
13
|
+
*
|
|
14
|
+
* MAPEAMENTO DE TOKENS DO FIGMA PARA STYLE DICTIONARY:
|
|
15
|
+
*
|
|
16
|
+
* Figma Token → Style Dictionary Token
|
|
17
|
+
* --------------------------------------------
|
|
18
|
+
* --asset-colors/brand-base → --brand-base (#0064cb)
|
|
19
|
+
* --asset-colors/brand-secondary → --brand-secondary (#00e5ce)
|
|
20
|
+
* --asset-colors/brand-secondary-50 → --brand-secondary-50 (rgba(0,229,206,0.5)) - Estado OFF default
|
|
21
|
+
* --asset-colors/brand-secondary-15 → --brand-secondary-15 (rgba(0,229,206,0.15)) - Estado disabled
|
|
22
|
+
* --structure-colors/fill-secondary → --structure-colors-fill-secondary (rgba(24,24,27,0.06))
|
|
23
|
+
* --structure-colors/fill-15 → --structure-colors-fill-15 (rgba(24,24,27,0.15))
|
|
24
|
+
* --structure-colors/fill-terciary → --structure-colors-fill-terciary (rgba(24,24,27,0.04))
|
|
25
|
+
* --structure-colors/fill-quaternary → --structure-colors-fill-quaternary (rgba(24,24,27,0.02))
|
|
26
|
+
* --radius/radius-round → --radius-round (1024px)
|
|
27
|
+
* --spacing/spacing-sm → --spacing-spacing-sm (8px)
|
|
28
|
+
* --base/family/family-sans → --font-family-sans ('Lato')
|
|
29
|
+
* --asset-colors/text-primary → --text-primary (#0b1215)
|
|
30
|
+
*/
|
|
31
|
+
|
|
32
|
+
/* ============================================
|
|
33
|
+
BASE - Container do switch
|
|
34
|
+
============================================ */
|
|
35
|
+
|
|
36
|
+
voa-switch::part(base) {
|
|
37
|
+
/* Gap estrutural - Token semântico conforme Figma */
|
|
38
|
+
gap: var(--structure-large-spacing-sm);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/* Sem label, sem gap */
|
|
42
|
+
voa-switch[show-label="false"]::part(base) {
|
|
43
|
+
gap: 0;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/* ============================================
|
|
47
|
+
TRACK - Container do switch (40px x 20px)
|
|
48
|
+
============================================ */
|
|
49
|
+
|
|
50
|
+
voa-switch::part(track) {
|
|
51
|
+
/* Border radius conforme Figma */
|
|
52
|
+
border-radius: var(--structure-large-radius-round);
|
|
53
|
+
/* 1024px - completamente arredondado */
|
|
54
|
+
border: var(--border-width-thin) solid var(--colors-structure-fill-secondary);
|
|
55
|
+
/* rgba(24,24,27,0.06) */
|
|
56
|
+
box-sizing: border-box;
|
|
57
|
+
/* Transições suaves para mudanças de cor */
|
|
58
|
+
transition: background-color 0.2s cubic-bezier(0.4, 0, 0.2, 1),
|
|
59
|
+
border-color 0.2s cubic-bezier(0.4, 0, 0.2, 1);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/* ============================================
|
|
63
|
+
THUMB - Elemento circular que se move (16px)
|
|
64
|
+
============================================ */
|
|
65
|
+
|
|
66
|
+
voa-switch::part(thumb) {
|
|
67
|
+
/* Border radius conforme Figma */
|
|
68
|
+
border-radius: var(--structure-large-radius-round);
|
|
69
|
+
/* 1024px - completamente arredondado */
|
|
70
|
+
border: var(--border-width-thin) solid;
|
|
71
|
+
box-sizing: border-box;
|
|
72
|
+
|
|
73
|
+
/* Variáveis locais para cálculo de posicionamento robusto */
|
|
74
|
+
--thumb-size: var(--switch-thumb-size);
|
|
75
|
+
--track-padding: 2px;
|
|
76
|
+
--thumb-offset: calc(var(--thumb-size) + var(--track-padding));
|
|
77
|
+
|
|
78
|
+
/*
|
|
79
|
+
* ANIMATION FIX:
|
|
80
|
+
* Usamos margin-left para animar porque precisamos de referência à largura do PAI (track).
|
|
81
|
+
* Transform usa % relativo ao próprio elemento, o que não funciona para largura de track variável.
|
|
82
|
+
* Margin-left com % é relativo à largura do container.
|
|
83
|
+
*/
|
|
84
|
+
margin-left: 0;
|
|
85
|
+
transition: margin-left 0.2s cubic-bezier(0.4, 0, 0.2, 1),
|
|
86
|
+
background-color 0.2s cubic-bezier(0.4, 0, 0.2, 1),
|
|
87
|
+
border-color 0.2s cubic-bezier(0.4, 0, 0.2, 1);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/* Quando checked, move o thumb para a direita */
|
|
91
|
+
voa-switch[checked]::part(thumb) {
|
|
92
|
+
/*
|
|
93
|
+
* CÁLCULO ROBUSTO:
|
|
94
|
+
* 100% = Largura total do track (variável)
|
|
95
|
+
* - 16px (thumb)
|
|
96
|
+
* - 2px (padding direito)
|
|
97
|
+
* = Posição final correta independente da largura do track
|
|
98
|
+
*/
|
|
99
|
+
margin-left: calc(100% - var(--thumb-offset));
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/* ============================================
|
|
103
|
+
SHADOW - Sombra interna
|
|
104
|
+
============================================ */
|
|
105
|
+
|
|
106
|
+
voa-switch::part(shadow) {
|
|
107
|
+
/* Shadow interna conforme Figma: inset 0px 2px 4px 0px rgba(24, 24, 24, 0.25) */
|
|
108
|
+
box-shadow: var(--shadow-switch-inset);
|
|
109
|
+
border-radius: inherit;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/* ============================================
|
|
113
|
+
ESTADOS - OFF (default)
|
|
114
|
+
============================================ */
|
|
115
|
+
|
|
116
|
+
/* Default - Off */
|
|
117
|
+
voa-switch:not([checked]):not([disabled])::part(track) {
|
|
118
|
+
background-color: var(--colors-structure-fill-quaternary);
|
|
119
|
+
/* rgba(24,24,27,0.02) */
|
|
120
|
+
border-color: var(--colors-structure-fill-secondary);
|
|
121
|
+
/* rgba(24,24,27,0.06) */
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
voa-switch:not([checked]):not([disabled])::part(thumb) {
|
|
125
|
+
background-color: var(--brand-secondary-50);
|
|
126
|
+
/* rgba(0,229,206,0.5) - Atualizado do Figma para melhor contraste */
|
|
127
|
+
border-color: var(--colors-structure-fill-terciary);
|
|
128
|
+
/* rgba(24,24,27,0.04) */
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/* ============================================
|
|
132
|
+
ESTADOS - ON (checked)
|
|
133
|
+
============================================ */
|
|
134
|
+
|
|
135
|
+
/* Default - On */
|
|
136
|
+
voa-switch[checked]:not([disabled])::part(track) {
|
|
137
|
+
background-color: var(--brand-base);
|
|
138
|
+
/* #0064cb */
|
|
139
|
+
border-color: var(--colors-structure-fill-secondary);
|
|
140
|
+
/* rgba(24,24,27,0.06) */
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
voa-switch[checked]:not([disabled])::part(thumb) {
|
|
144
|
+
background-color: var(--brand-secondary);
|
|
145
|
+
/* #00e5ce */
|
|
146
|
+
border-color: var(--colors-structure-fill-15);
|
|
147
|
+
/* rgba(24,24,27,0.15) */
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
/* ============================================
|
|
151
|
+
ESTADO - DISABLED
|
|
152
|
+
============================================ */
|
|
153
|
+
|
|
154
|
+
/* Disabled - Off */
|
|
155
|
+
voa-switch:not([checked])[disabled]::part(track) {
|
|
156
|
+
background-color: var(--colors-structure-fill-quaternary);
|
|
157
|
+
/* rgba(24,24,27,0.02) */
|
|
158
|
+
border-color: var(--colors-structure-fill-secondary);
|
|
159
|
+
/* rgba(24,24,27,0.06) */
|
|
160
|
+
opacity: 0.5;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
voa-switch:not([checked])[disabled]::part(thumb) {
|
|
164
|
+
background-color: var(--brand-secondary-15);
|
|
165
|
+
/* rgba(0,229,206,0.15) */
|
|
166
|
+
border-color: var(--colors-structure-fill-terciary);
|
|
167
|
+
/* rgba(24,24,27,0.04) */
|
|
168
|
+
opacity: 0.5;
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
/* Disabled - On */
|
|
172
|
+
voa-switch[checked][disabled]::part(track) {
|
|
173
|
+
background-color: var(--brand-base);
|
|
174
|
+
/* #0064cb */
|
|
175
|
+
border-color: var(--colors-structure-fill-secondary);
|
|
176
|
+
/* rgba(24,24,27,0.06) */
|
|
177
|
+
opacity: 0.5;
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
voa-switch[checked][disabled]::part(thumb) {
|
|
181
|
+
background-color: var(--brand-secondary);
|
|
182
|
+
/* #00e5ce */
|
|
183
|
+
border-color: var(--colors-structure-fill-15);
|
|
184
|
+
/* rgba(24,24,27,0.15) */
|
|
185
|
+
opacity: 0.5;
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
/* ============================================
|
|
189
|
+
LABEL - Texto do label
|
|
190
|
+
============================================ */
|
|
191
|
+
|
|
192
|
+
voa-switch::part(label) {
|
|
193
|
+
color: var(--text-primary);
|
|
194
|
+
/* #0b1215 */
|
|
195
|
+
font-family: var(--font-family-sans, 'Lato', sans-serif);
|
|
196
|
+
font-size: var(--typography-base-type-scale-6);
|
|
197
|
+
line-height: var(--line-height-body-md);
|
|
198
|
+
font-weight: var(--typography-base-body-sm-regular-weight);
|
|
199
|
+
user-select: none;
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
voa-switch[disabled]::part(label) {
|
|
203
|
+
color: var(--text-disabled);
|
|
204
|
+
/* rgba(11,18,21,0.25) */
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
/* ============================================
|
|
208
|
+
FOCUS VISIBLE - Outline para acessibilidade
|
|
209
|
+
============================================ */
|
|
210
|
+
|
|
211
|
+
voa-switch:focus-visible::part(base) {
|
|
212
|
+
outline: var(--border-width-medium) solid var(--brand-base);
|
|
213
|
+
outline-offset: var(--structure-large-spacing-xs);
|
|
214
|
+
border-radius: var(--structure-large-radius-xs);
|
|
215
|
+
}
|
|
@@ -0,0 +1,284 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Estilização Externa do VoaTab e VoaTabItem
|
|
3
|
+
*
|
|
4
|
+
* Este arquivo demonstra como estilizar os componentes voa-tab e voa-tab-item
|
|
5
|
+
* usando CSS Parts API e design tokens semânticos.
|
|
6
|
+
*
|
|
7
|
+
* Baseado no design do Figma:
|
|
8
|
+
* - Tab: https://www.figma.com/design/wDStUEuqpl7Tu1oHpiAml6/Voa-Design-System?node-id=545-553
|
|
9
|
+
* - Tab Item: https://www.figma.com/design/wDStUEuqpl7Tu1oHpiAml6/Voa-Design-System?node-id=366-1545
|
|
10
|
+
*
|
|
11
|
+
* Para usar, importe este arquivo após os tokens:
|
|
12
|
+
* @import '@voa-ds/tokens/global.css';
|
|
13
|
+
* @import '@voa-ds/styles/voa-tab.css';
|
|
14
|
+
*
|
|
15
|
+
* MAPEAMENTO DE TOKENS DO FIGMA PARA CSS VARIABLES (global.css):
|
|
16
|
+
*
|
|
17
|
+
* Figma Token → CSS Variable (from global.css)
|
|
18
|
+
* -------------------------------------------------------
|
|
19
|
+
* --asset-colors/brand-base → --brand-base
|
|
20
|
+
* --asset-colors/text-primary → --text-primary
|
|
21
|
+
* --asset-colors/text-disabled → --text-disabled (rendered as rgba, ~0.25 opacity)
|
|
22
|
+
* --spacing/spacing-xs → --spacing-spacing-xs (4px)
|
|
23
|
+
* --spacing/spacing-sm → --spacing-spacing-sm (8px)
|
|
24
|
+
* --spacing/spacing-rg → --spacing-spacing-rg (12px)
|
|
25
|
+
* --spacing/spacing-md → --spacing-spacing-md (16px)
|
|
26
|
+
* --spacing/spacing-lg → --spacing-spacing-lg (24px)
|
|
27
|
+
* --spacing/spacing-xxs → --spacing-spacing-xxs (2px)
|
|
28
|
+
* --radius/radius-md → --radius-md (12px)
|
|
29
|
+
* --radius/radius-xl → --radius-xl (24px)
|
|
30
|
+
* --radius/radius-round → --radius-round (1024px)
|
|
31
|
+
* --base/family/family-sans → --font-family-sans
|
|
32
|
+
* --semantic-colors/danger → --semantic-colors-danger
|
|
33
|
+
* --structure-colors/fill-secondary → --structure-colors-fill-secondary
|
|
34
|
+
* --structure-colors/bg-base → --structure-colors-bg-base
|
|
35
|
+
*/
|
|
36
|
+
|
|
37
|
+
/* ============================================
|
|
38
|
+
VOA-TAB - Container de tabs
|
|
39
|
+
============================================ */
|
|
40
|
+
|
|
41
|
+
voa-tab::part(base) {
|
|
42
|
+
/* Border-bottom para separador entre grupos de tabs */
|
|
43
|
+
border-bottom: var(--border-width-thin) solid var(--text-disabled);
|
|
44
|
+
box-sizing: border-box;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
voa-tab::part(list) {
|
|
48
|
+
/* Gap entre itens conforme direção */
|
|
49
|
+
box-sizing: border-box;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/* Gap horizontal (padrão) */
|
|
53
|
+
voa-tab[direction="horizontal"]::part(list) {
|
|
54
|
+
gap: var(--structure-large-spacing-lg);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/* Gap vertical */
|
|
58
|
+
voa-tab[direction="vertical"]::part(list) {
|
|
59
|
+
gap: var(--structure-large-spacing-md);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/* ============================================
|
|
63
|
+
VOA-TAB-ITEM - Item individual de tab
|
|
64
|
+
============================================ */
|
|
65
|
+
|
|
66
|
+
/* Base - Tipografia e estrutura */
|
|
67
|
+
voa-tab-item::part(base) {
|
|
68
|
+
/* Tipografia - Desktop/Body-sm/Regular */
|
|
69
|
+
font-family: var(--font-family-sans, 'Lato', sans-serif);
|
|
70
|
+
font-size: var(--typography-base-body-sm-regular-size);
|
|
71
|
+
font-weight: var(--typography-base-body-sm-regular-weight);
|
|
72
|
+
line-height: var(--line-height-body-sm);
|
|
73
|
+
|
|
74
|
+
/* Box-sizing */
|
|
75
|
+
box-sizing: border-box;
|
|
76
|
+
|
|
77
|
+
/* Transição suave para estados */
|
|
78
|
+
/* Transição suave para estados */
|
|
79
|
+
transition: color 0.2s ease;
|
|
80
|
+
|
|
81
|
+
/* Gap entre label e badge */
|
|
82
|
+
gap: var(--structure-large-spacing-xxs);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/* ============================================
|
|
86
|
+
ESTADOS - Cores por estado
|
|
87
|
+
============================================ */
|
|
88
|
+
|
|
89
|
+
/* Estado Active - Brand color */
|
|
90
|
+
voa-tab-item[state="active"]::part(base) {
|
|
91
|
+
color: var(--brand-base);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/* Estado Default - Text primary */
|
|
95
|
+
voa-tab-item[state="default"]::part(base) {
|
|
96
|
+
color: var(--text-primary);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/* Estado Disabled - Text disabled com opacity */
|
|
100
|
+
voa-tab-item[state="disabled"]::part(base),
|
|
101
|
+
voa-tab-item[disabled]::part(base) {
|
|
102
|
+
color: var(--text-disabled);
|
|
103
|
+
opacity: 0.4;
|
|
104
|
+
cursor: not-allowed;
|
|
105
|
+
pointer-events: none;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/* ============================================
|
|
109
|
+
POSIÇÕES - Padding e borders por posição
|
|
110
|
+
============================================ */
|
|
111
|
+
|
|
112
|
+
/* Posição Default (bottom border) */
|
|
113
|
+
voa-tab-item[position="default"]::part(base) {
|
|
114
|
+
padding-inline: var(--spacing-spacing-xs);
|
|
115
|
+
padding-block: var(--spacing-spacing-rg);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
voa-tab-item[position="default"]::part(base)::after {
|
|
119
|
+
content: '';
|
|
120
|
+
position: absolute;
|
|
121
|
+
bottom: 0;
|
|
122
|
+
left: 0;
|
|
123
|
+
width: 100%;
|
|
124
|
+
height: 2px;
|
|
125
|
+
background-color: var(--brand-base);
|
|
126
|
+
transform: scaleX(0);
|
|
127
|
+
transform-origin: center;
|
|
128
|
+
transition: transform 0.3s ease;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
voa-tab-item[position="default"][state="active"]::part(base)::after {
|
|
132
|
+
transform: scaleX(1);
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
/* Posição Top (top border) */
|
|
136
|
+
voa-tab-item[position="top"]::part(base) {
|
|
137
|
+
padding-inline: var(--spacing-spacing-xs);
|
|
138
|
+
padding-block: var(--radius-md);
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
voa-tab-item[position="top"]::part(base)::after {
|
|
142
|
+
content: '';
|
|
143
|
+
position: absolute;
|
|
144
|
+
top: 0;
|
|
145
|
+
left: 0;
|
|
146
|
+
width: 100%;
|
|
147
|
+
height: 2px;
|
|
148
|
+
background-color: var(--brand-base);
|
|
149
|
+
transform: scaleX(0);
|
|
150
|
+
transform-origin: center;
|
|
151
|
+
transition: transform 0.3s ease;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
voa-tab-item[position="top"][state="active"]::part(base)::after {
|
|
155
|
+
transform: scaleX(1);
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
/* Posição Right (right border) */
|
|
159
|
+
voa-tab-item[position="right"]::part(base) {
|
|
160
|
+
padding-inline: var(--radius-xl);
|
|
161
|
+
padding-block: var(--spacing-spacing-sm);
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
voa-tab-item[position="right"]::part(base)::after {
|
|
165
|
+
content: '';
|
|
166
|
+
position: absolute;
|
|
167
|
+
top: 0;
|
|
168
|
+
right: 0;
|
|
169
|
+
width: 2px;
|
|
170
|
+
height: 100%;
|
|
171
|
+
background-color: var(--brand-base);
|
|
172
|
+
transform: scaleY(0);
|
|
173
|
+
transform-origin: center;
|
|
174
|
+
transition: transform 0.3s ease;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
voa-tab-item[position="right"][state="active"]::part(base)::after {
|
|
178
|
+
transform: scaleY(1);
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
/* Posição Left (left border) */
|
|
182
|
+
voa-tab-item[position="left"]::part(base) {
|
|
183
|
+
padding-inline: var(--spacing-spacing-lg);
|
|
184
|
+
padding-block: var(--spacing-spacing-sm);
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
voa-tab-item[position="left"]::part(base)::after {
|
|
188
|
+
content: '';
|
|
189
|
+
position: absolute;
|
|
190
|
+
top: 0;
|
|
191
|
+
left: 0;
|
|
192
|
+
width: 2px;
|
|
193
|
+
height: 100%;
|
|
194
|
+
background-color: var(--brand-base);
|
|
195
|
+
transform: scaleY(0);
|
|
196
|
+
transform-origin: center;
|
|
197
|
+
transition: transform 0.3s ease;
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
voa-tab-item[position="left"][state="active"]::part(base)::after {
|
|
201
|
+
transform: scaleY(1);
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
/* ============================================
|
|
205
|
+
LABEL - Texto do item
|
|
206
|
+
============================================ */
|
|
207
|
+
|
|
208
|
+
voa-tab-item::part(label) {
|
|
209
|
+
/* Herda estilos do base, mas pode ser customizado se necessário */
|
|
210
|
+
display: inline-block;
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
/* ============================================
|
|
214
|
+
BADGE - Indicador de notificação
|
|
215
|
+
============================================ */
|
|
216
|
+
|
|
217
|
+
voa-tab-item::part(badge) {
|
|
218
|
+
/* Estrutura do badge */
|
|
219
|
+
display: inline-flex;
|
|
220
|
+
align-items: center;
|
|
221
|
+
justify-content: center;
|
|
222
|
+
width: 16px;
|
|
223
|
+
height: 16px;
|
|
224
|
+
min-width: 16px;
|
|
225
|
+
min-height: 16px;
|
|
226
|
+
box-sizing: border-box;
|
|
227
|
+
|
|
228
|
+
/* Cores - Semantic Tokens */
|
|
229
|
+
background-color: var(--semantic-colors-danger);
|
|
230
|
+
border: var(--border-width-thick) solid var(--structure-colors-fill-secondary);
|
|
231
|
+
border-radius: var(--radius-round);
|
|
232
|
+
|
|
233
|
+
/* Padding interno */
|
|
234
|
+
padding: var(--spacing-spacing-xs);
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
voa-tab-item::part(badge) .voa-tab-item__badge-text {
|
|
238
|
+
/* Tipografia do badge - Typography/Legal-bold */
|
|
239
|
+
font-family: 'Manrope', sans-serif;
|
|
240
|
+
font-size: var(--typography-base-legal-bold-size, 10px);
|
|
241
|
+
font-weight: var(--typography-base-legal-bold-weight, 600);
|
|
242
|
+
line-height: var(--typography-base-legal-bold-line-height, 16px);
|
|
243
|
+
|
|
244
|
+
/* Cores */
|
|
245
|
+
color: var(--structure-colors-bg-base);
|
|
246
|
+
|
|
247
|
+
/* Layout */
|
|
248
|
+
text-align: center;
|
|
249
|
+
white-space: nowrap;
|
|
250
|
+
width: 8px;
|
|
251
|
+
height: 8px;
|
|
252
|
+
display: inline-flex;
|
|
253
|
+
align-items: center;
|
|
254
|
+
justify-content: center;
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
/* ============================================
|
|
258
|
+
ESTADOS HOVER/FOCUS
|
|
259
|
+
============================================ */
|
|
260
|
+
|
|
261
|
+
/* Hover apenas em itens não-disabled */
|
|
262
|
+
voa-tab-item[state="default"]:hover::part(base),
|
|
263
|
+
voa-tab-item[state="active"]:hover::part(base) {
|
|
264
|
+
/* Pode adicionar efeito hover se necessário */
|
|
265
|
+
opacity: 0.8;
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
voa-tab-item[state="disabled"]:hover::part(base),
|
|
269
|
+
voa-tab-item[disabled]:hover::part(base) {
|
|
270
|
+
/* Sem hover em disabled */
|
|
271
|
+
opacity: 1;
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
/* Focus-visible para acessibilidade WCAG 2.2 AA */
|
|
275
|
+
voa-tab-item::part(base):focus-visible {
|
|
276
|
+
outline: 2px solid var(--brand-base);
|
|
277
|
+
outline-offset: 2px;
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
voa-tab-item[state="disabled"]::part(base):focus-visible,
|
|
281
|
+
voa-tab-item[disabled]::part(base):focus-visible {
|
|
282
|
+
/* Sem focus em disabled */
|
|
283
|
+
outline: none;
|
|
284
|
+
}
|
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Estilização Externa do VoaTag
|
|
3
|
+
*
|
|
4
|
+
* Este arquivo demonstra como estilizar o componente voa-tag
|
|
5
|
+
* usando CSS Parts API e design tokens semânticos.
|
|
6
|
+
*
|
|
7
|
+
* Baseado no design do Figma:
|
|
8
|
+
* https://www.figma.com/design/wDStUEuqpl7Tu1oHpiAml6/Voa-Design-System?node-id=1436-769
|
|
9
|
+
*
|
|
10
|
+
* Para usar, importe este arquivo após os tokens:
|
|
11
|
+
* @import '@voa-ds/tokens/global.css';
|
|
12
|
+
* @import '@voa-ds/styles/voa-tag.css';
|
|
13
|
+
*
|
|
14
|
+
* MAPEAMENTO DE TOKENS DO FIGMA PARA STYLE DICTIONARY:
|
|
15
|
+
*
|
|
16
|
+
* Figma Token → Style Dictionary Token
|
|
17
|
+
* --------------------------------------------
|
|
18
|
+
* --structure-colors/bg-container → --structure-colors-bg-container (#f1f3f5)
|
|
19
|
+
* --structure-colors/border-color → --structure-colors-border-color (#adb5bd)
|
|
20
|
+
* --spacing/spacing-xs → --spacing-spacing-xs (4px)
|
|
21
|
+
* --spacing/spacing-sm → --spacing-spacing-sm (8px)
|
|
22
|
+
* --radius/radius-xs → --radius-xs (4px)
|
|
23
|
+
* --radius/radius-round → --radius-round (1024px)
|
|
24
|
+
* --asset-colors/text-primary → --text-primary (#0b1215)
|
|
25
|
+
* --base/family/family-sans → --typography-base-family-sans ("Lato", sans-serif)
|
|
26
|
+
*
|
|
27
|
+
* Tamanhos de fonte do Figma:
|
|
28
|
+
* - MD: 14px, line-height 16px
|
|
29
|
+
* - SM: 11px, line-height 12px
|
|
30
|
+
*
|
|
31
|
+
* Tamanhos de ícone:
|
|
32
|
+
* - MD: 16px
|
|
33
|
+
* - SM: 12px
|
|
34
|
+
*/
|
|
35
|
+
|
|
36
|
+
/* ============================================
|
|
37
|
+
BASE - Container principal do tag
|
|
38
|
+
============================================ */
|
|
39
|
+
voa-tag::part(base) {
|
|
40
|
+
/* Background padrão - Semantic Token (conforme Figma: structure-colors/bg-container) */
|
|
41
|
+
background-color: var(--structure-colors-bg-container, #f1f3f5);
|
|
42
|
+
|
|
43
|
+
/* Border padrão - 1.5px solid (conforme Figma) */
|
|
44
|
+
border: var(--border-width-thick, 1.5px) solid var(--structure-colors-border-color, #adb5bd);
|
|
45
|
+
|
|
46
|
+
/* Border-radius padrão para shape="default" - Semantic Token (conforme Figma: radius/radius-xs) */
|
|
47
|
+
border-radius: var(--radius-xs, 4px);
|
|
48
|
+
|
|
49
|
+
/* Gap entre elementos - Semantic Token (conforme Figma: spacing/spacing-xs) */
|
|
50
|
+
gap: var(--spacing-spacing-xs, 4px);
|
|
51
|
+
|
|
52
|
+
/* Box-sizing */
|
|
53
|
+
box-sizing: border-box;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/* Shape: Pill - Border-radius completamente arredondado */
|
|
57
|
+
voa-tag[shape="pill"]::part(base) {
|
|
58
|
+
/* Border-radius pill - Semantic Token (conforme Figma: radius/radius-round) */
|
|
59
|
+
border-radius: var(--radius-round, 1024px);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/* ============================================
|
|
63
|
+
PADDING POR TAMANHO
|
|
64
|
+
============================================ */
|
|
65
|
+
|
|
66
|
+
/* Size: Medium (md) - Padding padrão */
|
|
67
|
+
voa-tag[size="md"]::part(base) {
|
|
68
|
+
/* Padding para size md - Semantic Tokens (conforme Figma: spacing/spacing-xs vertical, spacing/spacing-sm horizontal) */
|
|
69
|
+
padding-block: var(--spacing-spacing-xs, 4px);
|
|
70
|
+
padding-inline: var(--spacing-spacing-sm, 8px);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/* Size: Small (sm) - Padding reduzido */
|
|
74
|
+
voa-tag[size="sm"]::part(base) {
|
|
75
|
+
/* Padding menor para size sm - Semantic Token (conforme Figma: spacing/spacing-xs) */
|
|
76
|
+
padding: var(--spacing-spacing-xs, 4px);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/* ============================================
|
|
80
|
+
LABEL - Texto do tag
|
|
81
|
+
============================================ */
|
|
82
|
+
voa-tag::part(label) {
|
|
83
|
+
/* Cor do texto - Semantic Token (conforme Figma: asset-colors/text-primary) */
|
|
84
|
+
color: var(--text-primary, #0b1215);
|
|
85
|
+
|
|
86
|
+
/* Família de fonte - Semantic Token (conforme Figma: base/family/family-sans) */
|
|
87
|
+
font-family: var(--typography-base-family-sans, 'Lato', sans-serif);
|
|
88
|
+
|
|
89
|
+
/* Peso da fonte - Regular (400) */
|
|
90
|
+
font-weight: 400;
|
|
91
|
+
|
|
92
|
+
/* Estilo da fonte */
|
|
93
|
+
font-style: normal;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/* Label - Size: Medium (md) */
|
|
97
|
+
voa-tag[size="md"]::part(label) {
|
|
98
|
+
/* Tamanho de fonte md - 14px (conforme Figma) */
|
|
99
|
+
font-size: var(--typography-base-body-sm-regular-size, 14px);
|
|
100
|
+
|
|
101
|
+
/* Line-height md - 16px (conforme Figma) */
|
|
102
|
+
line-height: var(--typography-base-body-sm-regular-line-height, 16px);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/* Label - Size: Small (sm) */
|
|
106
|
+
voa-tag[size="sm"]::part(label) {
|
|
107
|
+
/* Tamanho de fonte sm - 11px (conforme Figma: Desktop/Body-xs/Regular) */
|
|
108
|
+
font-size: var(--typography-base-type-scale-9, 11px);
|
|
109
|
+
|
|
110
|
+
/* Line-height sm - 12px (conforme Figma) */
|
|
111
|
+
line-height: 12px;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/* ============================================
|
|
115
|
+
ÍCONES - Containers dos ícones
|
|
116
|
+
============================================ */
|
|
117
|
+
voa-tag::part(icon-start),
|
|
118
|
+
voa-tag::part(icon-end) {
|
|
119
|
+
/* Cor dos ícones - usando brand-secondary (conforme Figma: teal/cyan) */
|
|
120
|
+
color: var(--brand-secondary, #00e5ce);
|
|
121
|
+
|
|
122
|
+
/* Alinhamento */
|
|
123
|
+
display: inline-flex;
|
|
124
|
+
align-items: center;
|
|
125
|
+
justify-content: center;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/* Ícones - Size: Medium (md) */
|
|
129
|
+
voa-tag[size="md"]::part(icon-start),
|
|
130
|
+
voa-tag[size="md"]::part(icon-end) {
|
|
131
|
+
/* Tamanho do ícone md - 16px (conforme Figma) */
|
|
132
|
+
width: 16px;
|
|
133
|
+
height: 16px;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
/* Ícones - Size: Small (sm) */
|
|
137
|
+
voa-tag[size="sm"]::part(icon-start),
|
|
138
|
+
voa-tag[size="sm"]::part(icon-end) {
|
|
139
|
+
/* Tamanho do ícone sm - 12px (conforme Figma) */
|
|
140
|
+
width: 12px;
|
|
141
|
+
height: 12px;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/* Estilização de SVGs dentro dos slots de ícone */
|
|
145
|
+
voa-tag[size="md"] [slot="icon-start"],
|
|
146
|
+
voa-tag[size="md"] [slot="icon-end"] {
|
|
147
|
+
width: 16px;
|
|
148
|
+
height: 16px;
|
|
149
|
+
fill: var(--brand-secondary, #00e5ce);
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
voa-tag[size="sm"] [slot="icon-start"],
|
|
153
|
+
voa-tag[size="sm"] [slot="icon-end"] {
|
|
154
|
+
width: 12px;
|
|
155
|
+
height: 12px;
|
|
156
|
+
fill: var(--brand-secondary, #00e5ce);
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
/* ============================================
|
|
160
|
+
ESTADOS INTERATIVOS (Opcional - para uso futuro)
|
|
161
|
+
============================================ */
|
|
162
|
+
|
|
163
|
+
/* Hover state */
|
|
164
|
+
voa-tag:hover::part(base) {
|
|
165
|
+
/* Sutil destaque no hover */
|
|
166
|
+
border-color: var(--structure-colors-border-color-secondary, #dee2e6);
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
/* Focus state - Acessibilidade */
|
|
170
|
+
voa-tag:focus-visible::part(base) {
|
|
171
|
+
outline: 2px solid var(--brand-base, #0064cb);
|
|
172
|
+
outline-offset: 2px;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
/* ============================================
|
|
176
|
+
DARK THEME SUPPORT
|
|
177
|
+
============================================ */
|
|
178
|
+
[data-theme="dark"] voa-tag::part(base) {
|
|
179
|
+
/* Background dark - usando tokens dark */
|
|
180
|
+
background-color: var(--structure-colors-bg-container);
|
|
181
|
+
|
|
182
|
+
/* Border dark */
|
|
183
|
+
border-color: var(--structure-colors-border-color);
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
[data-theme="dark"] voa-tag::part(label) {
|
|
187
|
+
/* Cor do texto dark - garantir contraste adequado com fallback explícito */
|
|
188
|
+
color: var(--text-primary, #ffffff);
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
/* Variantes com backgrounds coloridos precisam de texto claro */
|
|
192
|
+
[data-theme="dark"] voa-tag[variant="solid"]::part(label),
|
|
193
|
+
[data-theme="dark"] voa-tag[variant="tonal"]::part(label) {
|
|
194
|
+
color: var(--text-primary, #ffffff);
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
[data-theme="dark"] voa-tag::part(icon-start),
|
|
198
|
+
[data-theme="dark"] voa-tag::part(icon-end) {
|
|
199
|
+
/* Cor dos ícones dark - usando brand primary (teal no dark mode) */
|
|
200
|
+
color: var(--brand-base, #00e5ce);
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
[data-theme="dark"] voa-tag [slot="icon-start"],
|
|
204
|
+
[data-theme="dark"] voa-tag [slot="icon-end"] {
|
|
205
|
+
fill: var(--brand-base, #00e5ce);
|
|
206
|
+
}
|