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.
Files changed (49) hide show
  1. package/dist/collection/components/GetStarted/ImportandoEstilos.stories.js +32 -11
  2. package/dist/collection/components/GetStarted/ImportandoEstilos.stories.js.map +1 -1
  3. package/dist/collection/styles/external/saas-dashboard.css +566 -0
  4. package/dist/collection/styles/external/voa-accordion.external.css +295 -0
  5. package/dist/collection/styles/external/voa-alert.external.css +348 -0
  6. package/dist/collection/styles/external/voa-avatar.external.css +118 -0
  7. package/dist/collection/styles/external/voa-badge.external.css +346 -0
  8. package/dist/collection/styles/external/voa-breadcrumbs.external.css +183 -0
  9. package/dist/collection/styles/external/voa-button.external.css +257 -0
  10. package/dist/collection/styles/external/voa-card.external.css +30 -0
  11. package/dist/collection/styles/external/voa-checkbox.external.css +303 -0
  12. package/dist/collection/styles/external/voa-input-addon.external.css +204 -0
  13. package/dist/collection/styles/external/voa-input.external.css +307 -0
  14. package/dist/collection/styles/external/voa-keybinding.external.css +34 -0
  15. package/dist/collection/styles/external/voa-option.external.css +213 -0
  16. package/dist/collection/styles/external/voa-pagination.external.css +125 -0
  17. package/dist/collection/styles/external/voa-radio.external.css +235 -0
  18. package/dist/collection/styles/external/voa-radio.styles.ts +155 -0
  19. package/dist/collection/styles/external/voa-select.external.css +568 -0
  20. package/dist/collection/styles/external/voa-switch.external.css +215 -0
  21. package/dist/collection/styles/external/voa-tab.external.css +284 -0
  22. package/dist/collection/styles/external/voa-tag.external.css +206 -0
  23. package/dist/collection/styles/external/voa-text-area.external.css +174 -0
  24. package/dist/collection/styles/external/voa-tooltip.external.css +320 -0
  25. package/dist/collection/styles/voa-components.css +32 -0
  26. package/dist/voa/styles/external/saas-dashboard.css +566 -0
  27. package/dist/voa/styles/external/voa-accordion.external.css +295 -0
  28. package/dist/voa/styles/external/voa-alert.external.css +348 -0
  29. package/dist/voa/styles/external/voa-avatar.external.css +118 -0
  30. package/dist/voa/styles/external/voa-badge.external.css +346 -0
  31. package/dist/voa/styles/external/voa-breadcrumbs.external.css +183 -0
  32. package/dist/voa/styles/external/voa-button.external.css +257 -0
  33. package/dist/voa/styles/external/voa-card.external.css +30 -0
  34. package/dist/voa/styles/external/voa-checkbox.external.css +303 -0
  35. package/dist/voa/styles/external/voa-input-addon.external.css +204 -0
  36. package/dist/voa/styles/external/voa-input.external.css +307 -0
  37. package/dist/voa/styles/external/voa-keybinding.external.css +34 -0
  38. package/dist/voa/styles/external/voa-option.external.css +213 -0
  39. package/dist/voa/styles/external/voa-pagination.external.css +125 -0
  40. package/dist/voa/styles/external/voa-radio.external.css +235 -0
  41. package/dist/voa/styles/external/voa-radio.styles.ts +155 -0
  42. package/dist/voa/styles/external/voa-select.external.css +568 -0
  43. package/dist/voa/styles/external/voa-switch.external.css +215 -0
  44. package/dist/voa/styles/external/voa-tab.external.css +284 -0
  45. package/dist/voa/styles/external/voa-tag.external.css +206 -0
  46. package/dist/voa/styles/external/voa-text-area.external.css +174 -0
  47. package/dist/voa/styles/external/voa-tooltip.external.css +320 -0
  48. package/dist/voa/styles/voa-components.css +32 -0
  49. package/package.json +3 -1
@@ -0,0 +1,295 @@
1
+ @import '../../tokens/global.css';
2
+
3
+ /**
4
+ * Estilização Externa do VoaAccordion
5
+ *
6
+ * Este arquivo demonstra como estilizar o componente voa-accordion
7
+ * usando CSS Parts API e design tokens semânticos.
8
+ *
9
+ * Baseado no design do Figma:
10
+ * https://www.figma.com/design/wDStUEuqpl7Tu1oHpiAml6/Voa-Design-System?node-id=397-201
11
+ *
12
+ * Para usar, importe este arquivo após os tokens:
13
+ * @import '@voa-ds/tokens/dist/tokens.css';
14
+ * @import '@voa-ds/styles/voa-accordion.css';
15
+ *
16
+ * ============================================
17
+ * ARQUITETURA DE ANIMAÇÃO
18
+ * ============================================
19
+ *
20
+ * Este componente segue a filosofia "Headless" onde:
21
+ * - Stencil fornece a MECÂNICA (estado, estrutura Grid)
22
+ * - Consumidor fornece a MOTION (timing, easing, comportamento)
23
+ *
24
+ * TÉCNICA: CSS Grid Trick
25
+ * - Usa grid-template-rows: 0fr → 1fr para animar altura
26
+ * - Permite animação suave de altura 0 para auto
27
+ * - Mais performático que max-height ou height
28
+ *
29
+ * TIMING:
30
+ * - Conteúdo: 250ms cubic-bezier(0.4, 0, 0.2, 1) - Material Design easing
31
+ * - Ícone: 200ms cubic-bezier(0.4, 0, 0.2, 1) - Interação rápida
32
+ * - Header: 200ms cubic-bezier(0.4, 0, 0.2, 1) - Hover suave
33
+ *
34
+ * ACESSIBILIDADE:
35
+ * - Suporta prefers-reduced-motion para usuários sensíveis a movimento
36
+ * - Remove todas as animações quando reduzido é preferido
37
+ *
38
+ * CUSTOMIZAÇÃO:
39
+ * - Consumidor pode sobrescrever timing via CSS Parts
40
+ * - Consumidor pode adicionar diferentes tipos de animação (slide, fade, etc.)
41
+ * - Consumidor controla acessibilidade globalmente
42
+ */
43
+
44
+ /* ============================================
45
+ BASE - Container principal do accordion
46
+ ============================================ */
47
+ voa-accordion::part(base) {
48
+ /* Background - Semantic Token */
49
+ background-color: var(--structure-colors-bg-base);
50
+
51
+ /* Padding do container - Semantic Token */
52
+ padding: var(--structure-large-spacing-sm);
53
+
54
+ /* Gap entre header e content (5px conforme Figma) */
55
+ gap: 5px;
56
+
57
+ /* Border quando divider=true */
58
+ border-top: none;
59
+ border-right: none;
60
+ border-bottom: none;
61
+ border-left: none;
62
+ }
63
+
64
+ /* Aplicar border-top quando divider=true */
65
+ voa-accordion[divider]::part(base) {
66
+ border-top: 1px solid var(--structure-colors-border-color-secondary);
67
+ }
68
+
69
+ /* ============================================
70
+ HEADER - Botão clicável do cabeçalho
71
+ ============================================ */
72
+ voa-accordion::part(header) {
73
+ /* Reset de estilos do botão */
74
+ background: transparent;
75
+ border: none;
76
+ padding: 0;
77
+ margin: 0;
78
+
79
+ /* Tipografia do header (herdada do title) */
80
+ font-family: var(--voa-font-family-sans, var(--font-family-sans, 'Lato', sans-serif));
81
+
82
+ /* Cursor pointer */
83
+ cursor: pointer;
84
+
85
+ /* Transição suave para hover - Matches design system pattern */
86
+ transition: opacity 200ms cubic-bezier(0.4, 0, 0.2, 1);
87
+ }
88
+
89
+ voa-accordion::part(header):hover {
90
+ opacity: 0.8;
91
+ }
92
+
93
+ voa-accordion::part(header):focus-visible {
94
+ outline: 2px solid var(--brand-base);
95
+ outline-offset: 2px;
96
+ border-radius: var(--radius-xs);
97
+ }
98
+
99
+ /* ============================================
100
+ HEADER-CONTENT - Container flex do header
101
+ ============================================ */
102
+ /* Layout flex já definido no CSS estrutural */
103
+ /* Padding horizontal apenas para size=lg (definido abaixo) */
104
+
105
+ /* Padding horizontal para size=lg */
106
+ voa-accordion[size="lg"]::part(header-content) {
107
+ padding-inline: var(--structure-large-spacing-sm);
108
+ }
109
+
110
+ /* ============================================
111
+ TITLE - Texto do título
112
+ ============================================ */
113
+ voa-accordion::part(title) {
114
+ /* Tipografia: 16px, SemiBold (600), line-height 24px */
115
+ font-family: var(--voa-font-family-sans, var(--font-family-sans, 'Lato', sans-serif));
116
+ font-size: var(--typography-base-type-scale-6, 16px);
117
+ font-weight: var(--typography-base-body-sm-bold-weight, 600);
118
+ line-height: 24px;
119
+
120
+ /* Cor do texto - Semantic Token */
121
+ color: var(--text-primary);
122
+
123
+ /* Espaçamento */
124
+ margin: 0;
125
+ padding: 0;
126
+ }
127
+
128
+ /* ============================================
129
+ ICON - Ícone expand/collapse
130
+ ============================================ */
131
+ voa-accordion::part(icon) {
132
+ /* Cor do ícone - Semantic Token */
133
+ color: var(--text-primary);
134
+
135
+ /* Tamanho fixo 16x16px */
136
+ width: 16px;
137
+ height: 16px;
138
+
139
+ /* Transição suave para rotação - Consumer controls timing
140
+ Matches design system pattern: 200ms for quick interactions */
141
+ transition: transform 200ms cubic-bezier(0.4, 0, 0.2, 1);
142
+ }
143
+
144
+ /* Rotação do ícone quando aberto (opcional, para melhor UX) */
145
+ voa-accordion[open]::part(icon) {
146
+ transform: rotate(180deg);
147
+ }
148
+
149
+ /* ============================================
150
+ CONTENT - Container do conteúdo expansível
151
+ ============================================ */
152
+ voa-accordion::part(content) {
153
+ /* Tipografia do conteúdo: 14px, Regular (400), line-height 16px */
154
+ font-family: var(--voa-font-family-sans, var(--font-family-sans, 'Lato', sans-serif));
155
+ font-size: var(--typography-base-body-sm-regular-size, 14px);
156
+ font-weight: var(--typography-base-body-sm-regular-weight, 400);
157
+ line-height: var(--typography-base-body-sm-regular-line-height, 16px);
158
+
159
+ /* Cor do texto - Semantic Token */
160
+ color: var(--text-primary);
161
+
162
+ /* Padding padrão (size=md) */
163
+ padding: 0;
164
+
165
+ /* ANIMATION: The visual transition logic lives here.
166
+ Consumer controls timing, easing, and behavior.
167
+
168
+ Using Material Design-inspired easing for smooth height transitions:
169
+ - Height animation: 250ms with ease-out for natural deceleration
170
+ - Opacity: synchronized with height for smooth fade effect
171
+ - Matches design system patterns (similar to switch/button timing) */
172
+ transition: grid-template-rows 250ms cubic-bezier(0.4, 0, 0.2, 1),
173
+ opacity 250ms cubic-bezier(0.4, 0, 0.2, 1);
174
+ opacity: 1;
175
+ }
176
+
177
+ /* Padding para size=lg conforme Figma */
178
+ voa-accordion[size="lg"]::part(content) {
179
+ padding-inline: var(--structure-large-spacing-sm);
180
+ padding-block: var(--structure-large-radius-xl);
181
+ }
182
+
183
+ /* Espaçamento interno do conteúdo */
184
+ voa-accordion::part(content)>* {
185
+ margin: 0;
186
+ padding: 0;
187
+ }
188
+
189
+ /* Espaçamento entre parágrafos no conteúdo */
190
+ voa-accordion::part(content)>*+* {
191
+ margin-top: var(--structure-large-spacing-xs);
192
+ }
193
+
194
+ /* ============================================
195
+ ESTADOS E VARIAÇÕES - ANIMAÇÃO
196
+ ============================================ */
197
+
198
+ /* Accordion fechado - anima para altura 0
199
+ Usa múltiplos seletores para garantir compatibilidade
200
+ com diferentes formas de controle de estado */
201
+ voa-accordion:not([open])::part(content),
202
+ voa-accordion.voa-accordion--closed::part(content) {
203
+ /* Grid trick: 0fr = altura zero, permitindo animação suave */
204
+ grid-template-rows: 0fr;
205
+ /* Opacidade zero para fade out suave */
206
+ opacity: 0;
207
+ /* Garante que o conteúdo não seja interativo quando fechado */
208
+ pointer-events: none;
209
+ }
210
+
211
+ /* Accordion aberto - anima para altura auto (1fr) */
212
+ voa-accordion[open]::part(content),
213
+ voa-accordion.voa-accordion--open::part(content) {
214
+ /* Grid trick: 1fr = altura automática baseada no conteúdo */
215
+ grid-template-rows: 1fr;
216
+ /* Opacidade total para fade in suave */
217
+ opacity: 1;
218
+ /* Restaura interatividade quando aberto */
219
+ pointer-events: auto;
220
+ }
221
+
222
+ /* ============================================
223
+ ACESSIBILIDADE
224
+ ============================================ */
225
+
226
+ /* Focus visível para navegação por teclado */
227
+ voa-accordion::part(header):focus-visible {
228
+ outline: 2px solid var(--brand-base);
229
+ outline-offset: 2px;
230
+ border-radius: var(--radius-xs);
231
+ }
232
+
233
+ /* ============================================
234
+ ACESSIBILIDADE - PREFERS REDUCED MOTION
235
+ ============================================ */
236
+
237
+ /* Prefers Reduced Motion - Mandatory for accessibility
238
+ Disables animations for users who prefer reduced motion.
239
+ This ensures the component remains accessible to users with
240
+ vestibular disorders or motion sensitivity. */
241
+ @media (prefers-reduced-motion: reduce) {
242
+ /* Remove todas as transições de animação */
243
+ voa-accordion::part(content) {
244
+ transition: none;
245
+ /* Mantém estados visuais, apenas remove animação */
246
+ }
247
+
248
+ voa-accordion::part(icon) {
249
+ transition: none;
250
+ }
251
+
252
+ voa-accordion::part(header) {
253
+ transition: none;
254
+ }
255
+
256
+ /* Garante que o estado final seja aplicado imediatamente */
257
+ voa-accordion:not([open])::part(content),
258
+ voa-accordion.voa-accordion--closed::part(content) {
259
+ grid-template-rows: 0fr;
260
+ opacity: 0;
261
+ }
262
+
263
+ voa-accordion[open]::part(content),
264
+ voa-accordion.voa-accordion--open::part(content) {
265
+ grid-template-rows: 1fr;
266
+ opacity: 1;
267
+ }
268
+ }
269
+
270
+ /* ============================================
271
+ EXEMPLOS DE CUSTOMIZAÇÃO
272
+ ============================================ */
273
+
274
+ /* Exemplo: Accordion com cor de fundo customizada */
275
+ /*
276
+ voa-accordion.custom-bg::part(base) {
277
+ background-color: var(--structure-colors-bg-container, #f5f5f5);
278
+ }
279
+ */
280
+
281
+ /* Exemplo: Accordion com espaçamento customizado */
282
+ /*
283
+ voa-accordion.custom-spacing::part(base) {
284
+ padding: var(--structure-large-spacing-md, 1rem);
285
+ gap: var(--spacing-spacing-sm, 0.5rem);
286
+ }
287
+ */
288
+
289
+ /* Exemplo: Accordion com tipografia customizada */
290
+ /*
291
+ voa-accordion.custom-typography::part(title) {
292
+ font-size: var(--typography-base-type-scale-5, 20px);
293
+ font-weight: var(--typography-base-type-scale-4-weight, 700);
294
+ }
295
+ */
@@ -0,0 +1,348 @@
1
+ /**
2
+ * Estilização Externa do VoaAlert
3
+ *
4
+ * Este arquivo demonstra como estilizar o componente voa-alert
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=397-2706
9
+ *
10
+ * Para usar, importe este arquivo após os tokens:
11
+ * @import '@voa-ds/tokens/dist/tokens.css';
12
+ * @import '@voa-ds/styles/voa-alert.css';
13
+ */
14
+
15
+ /* ============================================
16
+ BASE - Container principal do alert
17
+ ============================================ */
18
+ voa-alert::part(base) {
19
+ /* Border radius padrão - Semantic Token */
20
+ border-radius: var(--radius-sm);
21
+
22
+ /* Border - Separado em propriedades explícitas para permitir override apenas da cor */
23
+ border-width: 1.5px;
24
+ border-style: solid;
25
+ /* Cor padrão da borda - será sobrescrita por regras específicas de tipo */
26
+ border-color: var(--structure-colors-border-color);
27
+
28
+ /* Padding padrão para variant default - Semantic Token */
29
+ padding: var(--spacing-spacing-md);
30
+
31
+ /* Gap entre conteúdo e botões - Semantic Token */
32
+ gap: var(--spacing-spacing-md, 1rem);
33
+ }
34
+
35
+ /* Variante inline: padding e border-radius diferentes */
36
+ voa-alert[variant="inline"]::part(base) {
37
+ /* Padding inline: 20px horizontal, 14px vertical - conforme Figma */
38
+ padding: var(--spacing-spacing-lg, 14px) var(--spacing-spacing-xl, 20px);
39
+ border-radius: var(--radius-md);
40
+ /* Gap entre elementos na variante inline - Figma especifica 10px */
41
+ gap: 10px;
42
+ }
43
+
44
+ /* ============================================
45
+ CORES POR TIPO - Background e Border
46
+ ============================================ */
47
+
48
+ /* Basic */
49
+ voa-alert[type="basic"]::part(base) {
50
+ background-color: var(--structure-colors-bg-container);
51
+ border-color: var(--structure-colors-border-color);
52
+ }
53
+
54
+ /* Success */
55
+ voa-alert[type="success"]::part(base) {
56
+ background-color: var(--palette-green-green-2);
57
+ border-color: var(--palette-green-green-4);
58
+ }
59
+
60
+ /* Info */
61
+ voa-alert[type="info"]::part(base) {
62
+ background-color: var(--palette-blue-blue-2);
63
+ border-color: var(--palette-blue-blue-3);
64
+ }
65
+
66
+ /* Warning */
67
+ voa-alert[type="warning"]::part(base) {
68
+ background-color: var(--palette-yellow-yellow-2);
69
+ border-color: var(--palette-yellow-yellow-4);
70
+ }
71
+
72
+ /* Warning Inline */
73
+ voa-alert[type="warning-inline"]::part(base) {
74
+ background-color: var(--palette-yellow-yellow-1);
75
+ border-color: var(--palette-yellow-yellow-4);
76
+ }
77
+
78
+ /* Error */
79
+ voa-alert[type="error"]::part(base) {
80
+ background-color: var(--palette-red-red-2);
81
+ border-color: var(--palette-red-red-4);
82
+ }
83
+
84
+ /* Variante inline - ajustes de border para alguns tipos */
85
+ voa-alert[variant="inline"][type="info"]::part(base) {
86
+ border-color: var(--palette-blue-blue-4);
87
+ }
88
+
89
+ voa-alert[variant="inline"][type="success"]::part(base) {
90
+ border-color: var(--palette-green-green-3);
91
+ }
92
+
93
+ voa-alert[variant="inline"][type="error"]::part(base) {
94
+ border-color: var(--palette-red-red-5);
95
+ }
96
+
97
+ /* ============================================
98
+ CONTENT-WRAPPER - Wrapper do conteúdo principal
99
+ ============================================ */
100
+ voa-alert::part(content-wrapper) {
101
+ /* Gap entre ícone e conteúdo - Figma especifica 16px (radius-lg) */
102
+ gap: var(--radius-lg, 16px);
103
+ }
104
+
105
+ voa-alert[variant="inline"]::part(content-wrapper) {
106
+ /* Gap entre ícone e conteúdo na variante inline - Figma especifica 10px */
107
+ gap: 10px;
108
+ }
109
+
110
+ /* ============================================
111
+ ICON - Container do ícone
112
+ ============================================ */
113
+ voa-alert::part(icon) {
114
+ /* Tamanho do ícone para variant default */
115
+ width: 24px;
116
+ height: 24px;
117
+ flex-shrink: 0;
118
+
119
+ /* Cor do ícone - será definida por tipo */
120
+ color: currentColor;
121
+ }
122
+
123
+ voa-alert[variant="inline"]::part(icon) {
124
+ /* Tamanho do ícone para variant inline */
125
+ width: 20px;
126
+ height: 20px;
127
+ }
128
+
129
+ /* Cores dos ícones por tipo - Semantic Tokens quando disponíveis */
130
+ voa-alert[type="success"]::part(icon),
131
+ voa-alert[type="success"]::part(icon) svg {
132
+ color: var(--semantic-colors-success);
133
+ }
134
+
135
+ voa-alert[type="info"]::part(icon),
136
+ voa-alert[type="info"]::part(icon) svg {
137
+ color: var(--palette-blue-blue-9);
138
+ }
139
+
140
+ voa-alert[type="warning"]::part(icon),
141
+ voa-alert[type="warning"]::part(icon) svg,
142
+ voa-alert[type="warning-inline"]::part(icon),
143
+ voa-alert[type="warning-inline"]::part(icon) svg {
144
+ color: var(--palette-yellow-yellow-9);
145
+ }
146
+
147
+ voa-alert[type="error"]::part(icon),
148
+ voa-alert[type="error"]::part(icon) svg {
149
+ color: var(--palette-red-red-9);
150
+ }
151
+
152
+ voa-alert[type="basic"]::part(icon),
153
+ voa-alert[type="basic"]::part(icon) svg {
154
+ color: var(--palette-gray-gray-6);
155
+ }
156
+
157
+ /* ============================================
158
+ CONTENT - Container do conteúdo
159
+ ============================================ */
160
+ voa-alert::part(content) {
161
+ /* Flex para layout vertical (default) ou horizontal (inline) */
162
+ flex: 1;
163
+
164
+ /* Tipografia base - Design Token */
165
+ font-family: var(--typography-base-family-sans, 'Lato', sans-serif);
166
+ color: var(--text-primary);
167
+ }
168
+
169
+ /* ============================================
170
+ TITLE - Título do alerta
171
+ ============================================ */
172
+ voa-alert::part(title) {
173
+ /* Tipografia - Design Tokens */
174
+ font-family: var(--typography-base-family-sans, 'Lato', sans-serif);
175
+ font-size: var(--typography-base-type-scale-6, 16px);
176
+ font-weight: var(--typography-base-body-sm-bold-weight, 600);
177
+ line-height: var(--line-height-body-md, 24px);
178
+ color: var(--text-primary);
179
+
180
+ /* Margin */
181
+ margin: 0;
182
+ }
183
+
184
+ voa-alert[variant="inline"]::part(title) {
185
+ /* Tipografia inline - menor */
186
+ font-size: var(--typography-base-type-scale-7, 14px);
187
+ line-height: var(--line-height-body-sm, 16px);
188
+ }
189
+
190
+ /* ============================================
191
+ DESCRIPTION - Descrição do alerta
192
+ ============================================ */
193
+ voa-alert::part(description) {
194
+ /* Tipografia - Design Tokens */
195
+ font-family: var(--typography-base-family-sans, 'Lato', sans-serif);
196
+ font-size: var(--typography-base-body-sm-regular-size, 14px);
197
+ font-weight: var(--typography-base-body-sm-regular-weight, 400);
198
+ line-height: var(--typography-base-body-sm-regular-line-height, 16px);
199
+ color: var(--text-secondary);
200
+
201
+ /* Espaçamento do título - Semantic Token */
202
+ margin-top: var(--spacing-spacing-xs, 4px);
203
+ margin-bottom: 0;
204
+ }
205
+
206
+ /* ============================================
207
+ CONTENT-INNER - Wrapper interno do conteúdo
208
+ ============================================ */
209
+ voa-alert::part(content-inner) {
210
+ /* Layout flex vertical para título e descrição */
211
+ display: flex;
212
+ flex-direction: column;
213
+ gap: 0; /* Gap será controlado via margin-top na descrição */
214
+ }
215
+
216
+ /* ============================================
217
+ CLOSE-BUTTON - Botão de fechar
218
+ ============================================ */
219
+ voa-alert::part(close-button) {
220
+ /* Tamanho do ícone de fechar para variant default */
221
+ width: 16px;
222
+ height: 16px;
223
+ flex-shrink: 0;
224
+
225
+ /* Cor do ícone de fechar - Primitive Token (não há token semântico para isso) */
226
+ color: var(--palette-gray-gray-6);
227
+
228
+ /* Hover */
229
+ transition: opacity 0.2s ease;
230
+ }
231
+
232
+ voa-alert::part(close-button):hover {
233
+ opacity: 0.7;
234
+ }
235
+
236
+ voa-alert::part(close-button):focus-visible {
237
+ outline: 2px solid var(--brand-base);
238
+ outline-offset: 2px;
239
+ border-radius: 2px;
240
+ }
241
+
242
+ voa-alert[variant="inline"]::part(close-button) {
243
+ /* Tamanho do ícone de fechar para variant inline */
244
+ width: 16px;
245
+ height: 16px;
246
+ }
247
+
248
+ /* ============================================
249
+ ACTIONS - Container dos botões de ação
250
+ ============================================ */
251
+ voa-alert::part(actions) {
252
+ /* Layout flex para botões */
253
+ display: flex;
254
+ justify-content: flex-end;
255
+ align-items: center;
256
+
257
+ /* Gap entre botões - Semantic Token */
258
+ gap: var(--spacing-spacing-sm, 0.5rem);
259
+
260
+ /* Padding top para separar do conteúdo - Semantic Token */
261
+ padding-top: var(--spacing-spacing-xs);
262
+ }
263
+
264
+ /* ============================================
265
+ BUTTONS - Estilização via exportparts
266
+ ============================================ */
267
+ /*
268
+ * Os botões são expostos via exportparts no voa-alert:
269
+ * - primary-btn-base: Parte "base" do botão primário
270
+ * - secondary-btn-base: Parte "base" do botão secundário (ghost)
271
+ *
272
+ * Isso permite estilizar os botões de fora do Shadow DOM.
273
+ */
274
+
275
+ /* Base styles for both buttons */
276
+ voa-alert::part(primary-btn-base),
277
+ voa-alert::part(secondary-btn-base) {
278
+ /* Tipografia - Design Tokens */
279
+ font-family: var(--typography-base-family-sans, 'Lato', sans-serif);
280
+ font-size: var(--typography-base-body-sm-regular-size, 14px);
281
+ font-weight: var(--typography-base-body-sm-regular-weight, 400);
282
+ line-height: var(--typography-base-body-sm-regular-line-height, 16px);
283
+ text-align: center;
284
+
285
+ /* Border-radius padrão - Semantic Token */
286
+ border-radius: var(--radius-sm);
287
+
288
+ /* Box-sizing */
289
+ box-sizing: border-box;
290
+
291
+ /* Transição suave para estados hover/active */
292
+ transition: background-color 0.2s ease, border-color 0.2s ease, color 0.2s ease;
293
+
294
+ /* Padding para size="sm" */
295
+ padding-block: var(--spacing-spacing-xs);
296
+ padding-inline: var(--spacing-spacing-xs);
297
+ min-width: 98px;
298
+ gap: var(--spacing-spacing-xs, 0.25rem);
299
+ }
300
+
301
+ /* Primary Button */
302
+ voa-alert::part(primary-btn-base) {
303
+ background-color: var(--brand-base);
304
+ color: var(--text-on-primary);
305
+ border: var(--border-width-thin) solid var(--brand-base-50);
306
+ }
307
+
308
+ voa-alert::part(primary-btn-base):hover {
309
+ background-color: var(--brand-hover);
310
+ border-color: var(--brand-base-50);
311
+ }
312
+
313
+ voa-alert::part(primary-btn-base):active {
314
+ background-color: var(--brand-active);
315
+ border-color: var(--brand-base-50);
316
+ }
317
+
318
+ voa-alert::part(primary-btn-base):focus-visible {
319
+ outline: 2px solid var(--brand-base);
320
+ outline-offset: 2px;
321
+ }
322
+
323
+ /* Secondary/Ghost Button - Com cores de danger */
324
+ voa-alert::part(secondary-btn-base) {
325
+ background-color: transparent;
326
+ color: var(--semantic-colors-danger);
327
+ border: 1px solid transparent;
328
+ }
329
+
330
+ voa-alert::part(secondary-btn-base):hover {
331
+ background-color: var(--semantic-colors-danger);
332
+ color: var(--text-on-primary);
333
+ border-color: var(--semantic-colors-danger);
334
+ }
335
+
336
+ voa-alert::part(secondary-btn-base):active {
337
+ background-color: var(--semantic-colors-danger);
338
+ color: var(--text-on-primary);
339
+ border-color: var(--semantic-colors-danger);
340
+ opacity: 0.9;
341
+ }
342
+
343
+ voa-alert::part(secondary-btn-base):focus-visible {
344
+ outline: 2px solid var(--semantic-colors-danger);
345
+ outline-offset: 2px;
346
+ }
347
+
348
+