voa-ds-core 1.0.10 → 1.0.12

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 (48) hide show
  1. package/dist/styles/voa-components.css +4841 -0
  2. package/package.json +2 -2
  3. package/dist/collection/styles/external/saas-dashboard.css +0 -566
  4. package/dist/collection/styles/external/voa-accordion.external.css +0 -295
  5. package/dist/collection/styles/external/voa-alert.external.css +0 -348
  6. package/dist/collection/styles/external/voa-avatar.external.css +0 -118
  7. package/dist/collection/styles/external/voa-badge.external.css +0 -346
  8. package/dist/collection/styles/external/voa-breadcrumbs.external.css +0 -183
  9. package/dist/collection/styles/external/voa-button.external.css +0 -257
  10. package/dist/collection/styles/external/voa-card.external.css +0 -30
  11. package/dist/collection/styles/external/voa-checkbox.external.css +0 -303
  12. package/dist/collection/styles/external/voa-input-addon.external.css +0 -204
  13. package/dist/collection/styles/external/voa-input.external.css +0 -307
  14. package/dist/collection/styles/external/voa-keybinding.external.css +0 -34
  15. package/dist/collection/styles/external/voa-option.external.css +0 -213
  16. package/dist/collection/styles/external/voa-pagination.external.css +0 -125
  17. package/dist/collection/styles/external/voa-radio.external.css +0 -235
  18. package/dist/collection/styles/external/voa-radio.styles.ts +0 -155
  19. package/dist/collection/styles/external/voa-select.external.css +0 -568
  20. package/dist/collection/styles/external/voa-switch.external.css +0 -215
  21. package/dist/collection/styles/external/voa-tab.external.css +0 -284
  22. package/dist/collection/styles/external/voa-tag.external.css +0 -206
  23. package/dist/collection/styles/external/voa-text-area.external.css +0 -174
  24. package/dist/collection/styles/external/voa-tooltip.external.css +0 -320
  25. package/dist/collection/styles/voa-components.css +0 -32
  26. package/dist/voa/styles/external/saas-dashboard.css +0 -566
  27. package/dist/voa/styles/external/voa-accordion.external.css +0 -295
  28. package/dist/voa/styles/external/voa-alert.external.css +0 -348
  29. package/dist/voa/styles/external/voa-avatar.external.css +0 -118
  30. package/dist/voa/styles/external/voa-badge.external.css +0 -346
  31. package/dist/voa/styles/external/voa-breadcrumbs.external.css +0 -183
  32. package/dist/voa/styles/external/voa-button.external.css +0 -257
  33. package/dist/voa/styles/external/voa-card.external.css +0 -30
  34. package/dist/voa/styles/external/voa-checkbox.external.css +0 -303
  35. package/dist/voa/styles/external/voa-input-addon.external.css +0 -204
  36. package/dist/voa/styles/external/voa-input.external.css +0 -307
  37. package/dist/voa/styles/external/voa-keybinding.external.css +0 -34
  38. package/dist/voa/styles/external/voa-option.external.css +0 -213
  39. package/dist/voa/styles/external/voa-pagination.external.css +0 -125
  40. package/dist/voa/styles/external/voa-radio.external.css +0 -235
  41. package/dist/voa/styles/external/voa-radio.styles.ts +0 -155
  42. package/dist/voa/styles/external/voa-select.external.css +0 -568
  43. package/dist/voa/styles/external/voa-switch.external.css +0 -215
  44. package/dist/voa/styles/external/voa-tab.external.css +0 -284
  45. package/dist/voa/styles/external/voa-tag.external.css +0 -206
  46. package/dist/voa/styles/external/voa-text-area.external.css +0 -174
  47. package/dist/voa/styles/external/voa-tooltip.external.css +0 -320
  48. package/dist/voa/styles/voa-components.css +0 -32
@@ -0,0 +1,4841 @@
1
+ /**
2
+ * VOA Design System - Consolidated Component Styles
3
+ *
4
+ * Este arquivo consolida todos os estilos visuais dos componentes
5
+ * para uso em aplicações que consomem o voa-ds-core.
6
+ *
7
+ * IMPORTANTE: Importe este arquivo APÓS os tokens:
8
+ * @import 'voa-ds-core/dist/voa/voa.css'; // Tokens
9
+ * @import 'voa-ds-core/components'; // Estilos dos componentes
10
+ *
11
+ * Versão: 1.0.12
12
+ * Gerado automaticamente em: 2025-12-22T17:32:54.977Z
13
+ */
14
+
15
+
16
+ /* ============================================
17
+ voa-accordion.external.css
18
+ ============================================ */
19
+
20
+ /**
21
+ * Estilização Externa do VoaAccordion
22
+ *
23
+ * Este arquivo demonstra como estilizar o componente voa-accordion
24
+ * usando CSS Parts API e design tokens semânticos.
25
+ *
26
+ * Baseado no design do Figma:
27
+ * https://www.figma.com/design/wDStUEuqpl7Tu1oHpiAml6/Voa-Design-System?node-id=397-201
28
+ *
29
+ * Para usar, importe este arquivo após os tokens:
30
+ * * *
31
+ * ============================================
32
+ * ARQUITETURA DE ANIMAÇÃO
33
+ * ============================================
34
+ *
35
+ * Este componente segue a filosofia "Headless" onde:
36
+ * - Stencil fornece a MECÂNICA (estado, estrutura Grid)
37
+ * - Consumidor fornece a MOTION (timing, easing, comportamento)
38
+ *
39
+ * TÉCNICA: CSS Grid Trick
40
+ * - Usa grid-template-rows: 0fr → 1fr para animar altura
41
+ * - Permite animação suave de altura 0 para auto
42
+ * - Mais performático que max-height ou height
43
+ *
44
+ * TIMING:
45
+ * - Conteúdo: 250ms cubic-bezier(0.4, 0, 0.2, 1) - Material Design easing
46
+ * - Ícone: 200ms cubic-bezier(0.4, 0, 0.2, 1) - Interação rápida
47
+ * - Header: 200ms cubic-bezier(0.4, 0, 0.2, 1) - Hover suave
48
+ *
49
+ * ACESSIBILIDADE:
50
+ * - Suporta prefers-reduced-motion para usuários sensíveis a movimento
51
+ * - Remove todas as animações quando reduzido é preferido
52
+ *
53
+ * CUSTOMIZAÇÃO:
54
+ * - Consumidor pode sobrescrever timing via CSS Parts
55
+ * - Consumidor pode adicionar diferentes tipos de animação (slide, fade, etc.)
56
+ * - Consumidor controla acessibilidade globalmente
57
+ */
58
+
59
+ /* ============================================
60
+ BASE - Container principal do accordion
61
+ ============================================ */
62
+ voa-accordion::part(base) {
63
+ /* Background - Semantic Token */
64
+ background-color: var(--structure-colors-bg-base);
65
+
66
+ /* Padding do container - Semantic Token */
67
+ padding: var(--structure-large-spacing-sm);
68
+
69
+ /* Gap entre header e content (5px conforme Figma) */
70
+ gap: 5px;
71
+
72
+ /* Border quando divider=true */
73
+ border-top: none;
74
+ border-right: none;
75
+ border-bottom: none;
76
+ border-left: none;
77
+ }
78
+
79
+ /* Aplicar border-top quando divider=true */
80
+ voa-accordion[divider]::part(base) {
81
+ border-top: 1px solid var(--structure-colors-border-color-secondary);
82
+ }
83
+
84
+ /* ============================================
85
+ HEADER - Botão clicável do cabeçalho
86
+ ============================================ */
87
+ voa-accordion::part(header) {
88
+ /* Reset de estilos do botão */
89
+ background: transparent;
90
+ border: none;
91
+ padding: 0;
92
+ margin: 0;
93
+
94
+ /* Tipografia do header (herdada do title) */
95
+ font-family: var(--voa-font-family-sans, var(--font-family-sans, 'Lato', sans-serif));
96
+
97
+ /* Cursor pointer */
98
+ cursor: pointer;
99
+
100
+ /* Transição suave para hover - Matches design system pattern */
101
+ transition: opacity 200ms cubic-bezier(0.4, 0, 0.2, 1);
102
+ }
103
+
104
+ voa-accordion::part(header):hover {
105
+ opacity: 0.8;
106
+ }
107
+
108
+ voa-accordion::part(header):focus-visible {
109
+ outline: 2px solid var(--brand-base);
110
+ outline-offset: 2px;
111
+ border-radius: var(--radius-xs);
112
+ }
113
+
114
+ /* ============================================
115
+ HEADER-CONTENT - Container flex do header
116
+ ============================================ */
117
+ /* Layout flex já definido no CSS estrutural */
118
+ /* Padding horizontal apenas para size=lg (definido abaixo) */
119
+
120
+ /* Padding horizontal para size=lg */
121
+ voa-accordion[size="lg"]::part(header-content) {
122
+ padding-inline: var(--structure-large-spacing-sm);
123
+ }
124
+
125
+ /* ============================================
126
+ TITLE - Texto do título
127
+ ============================================ */
128
+ voa-accordion::part(title) {
129
+ /* Tipografia: 16px, SemiBold (600), line-height 24px */
130
+ font-family: var(--voa-font-family-sans, var(--font-family-sans, 'Lato', sans-serif));
131
+ font-size: var(--typography-base-type-scale-6, 16px);
132
+ font-weight: var(--typography-base-body-sm-bold-weight, 600);
133
+ line-height: 24px;
134
+
135
+ /* Cor do texto - Semantic Token */
136
+ color: var(--text-primary);
137
+
138
+ /* Espaçamento */
139
+ margin: 0;
140
+ padding: 0;
141
+ }
142
+
143
+ /* ============================================
144
+ ICON - Ícone expand/collapse
145
+ ============================================ */
146
+ voa-accordion::part(icon) {
147
+ /* Cor do ícone - Semantic Token */
148
+ color: var(--text-primary);
149
+
150
+ /* Tamanho fixo 16x16px */
151
+ width: 16px;
152
+ height: 16px;
153
+
154
+ /* Transição suave para rotação - Consumer controls timing
155
+ Matches design system pattern: 200ms for quick interactions */
156
+ transition: transform 200ms cubic-bezier(0.4, 0, 0.2, 1);
157
+ }
158
+
159
+ /* Rotação do ícone quando aberto (opcional, para melhor UX) */
160
+ voa-accordion[open]::part(icon) {
161
+ transform: rotate(180deg);
162
+ }
163
+
164
+ /* ============================================
165
+ CONTENT - Container do conteúdo expansível
166
+ ============================================ */
167
+ voa-accordion::part(content) {
168
+ /* Tipografia do conteúdo: 14px, Regular (400), line-height 16px */
169
+ font-family: var(--voa-font-family-sans, var(--font-family-sans, 'Lato', sans-serif));
170
+ font-size: var(--typography-base-body-sm-regular-size, 14px);
171
+ font-weight: var(--typography-base-body-sm-regular-weight, 400);
172
+ line-height: var(--typography-base-body-sm-regular-line-height, 16px);
173
+
174
+ /* Cor do texto - Semantic Token */
175
+ color: var(--text-primary);
176
+
177
+ /* Padding padrão (size=md) */
178
+ padding: 0;
179
+
180
+ /* ANIMATION: The visual transition logic lives here.
181
+ Consumer controls timing, easing, and behavior.
182
+
183
+ Using Material Design-inspired easing for smooth height transitions:
184
+ - Height animation: 250ms with ease-out for natural deceleration
185
+ - Opacity: synchronized with height for smooth fade effect
186
+ - Matches design system patterns (similar to switch/button timing) */
187
+ transition: grid-template-rows 250ms cubic-bezier(0.4, 0, 0.2, 1),
188
+ opacity 250ms cubic-bezier(0.4, 0, 0.2, 1);
189
+ opacity: 1;
190
+ }
191
+
192
+ /* Padding para size=lg conforme Figma */
193
+ voa-accordion[size="lg"]::part(content) {
194
+ padding-inline: var(--structure-large-spacing-sm);
195
+ padding-block: var(--structure-large-radius-xl);
196
+ }
197
+
198
+ /* Espaçamento interno do conteúdo */
199
+ voa-accordion::part(content)>* {
200
+ margin: 0;
201
+ padding: 0;
202
+ }
203
+
204
+ /* Espaçamento entre parágrafos no conteúdo */
205
+ voa-accordion::part(content)>*+* {
206
+ margin-top: var(--structure-large-spacing-xs);
207
+ }
208
+
209
+ /* ============================================
210
+ ESTADOS E VARIAÇÕES - ANIMAÇÃO
211
+ ============================================ */
212
+
213
+ /* Accordion fechado - anima para altura 0
214
+ Usa múltiplos seletores para garantir compatibilidade
215
+ com diferentes formas de controle de estado */
216
+ voa-accordion:not([open])::part(content),
217
+ voa-accordion.voa-accordion--closed::part(content) {
218
+ /* Grid trick: 0fr = altura zero, permitindo animação suave */
219
+ grid-template-rows: 0fr;
220
+ /* Opacidade zero para fade out suave */
221
+ opacity: 0;
222
+ /* Garante que o conteúdo não seja interativo quando fechado */
223
+ pointer-events: none;
224
+ }
225
+
226
+ /* Accordion aberto - anima para altura auto (1fr) */
227
+ voa-accordion[open]::part(content),
228
+ voa-accordion.voa-accordion--open::part(content) {
229
+ /* Grid trick: 1fr = altura automática baseada no conteúdo */
230
+ grid-template-rows: 1fr;
231
+ /* Opacidade total para fade in suave */
232
+ opacity: 1;
233
+ /* Restaura interatividade quando aberto */
234
+ pointer-events: auto;
235
+ }
236
+
237
+ /* ============================================
238
+ ACESSIBILIDADE
239
+ ============================================ */
240
+
241
+ /* Focus visível para navegação por teclado */
242
+ voa-accordion::part(header):focus-visible {
243
+ outline: 2px solid var(--brand-base);
244
+ outline-offset: 2px;
245
+ border-radius: var(--radius-xs);
246
+ }
247
+
248
+ /* ============================================
249
+ ACESSIBILIDADE - PREFERS REDUCED MOTION
250
+ ============================================ */
251
+
252
+ /* Prefers Reduced Motion - Mandatory for accessibility
253
+ Disables animations for users who prefer reduced motion.
254
+ This ensures the component remains accessible to users with
255
+ vestibular disorders or motion sensitivity. */
256
+ @media (prefers-reduced-motion: reduce) {
257
+ /* Remove todas as transições de animação */
258
+ voa-accordion::part(content) {
259
+ transition: none;
260
+ /* Mantém estados visuais, apenas remove animação */
261
+ }
262
+
263
+ voa-accordion::part(icon) {
264
+ transition: none;
265
+ }
266
+
267
+ voa-accordion::part(header) {
268
+ transition: none;
269
+ }
270
+
271
+ /* Garante que o estado final seja aplicado imediatamente */
272
+ voa-accordion:not([open])::part(content),
273
+ voa-accordion.voa-accordion--closed::part(content) {
274
+ grid-template-rows: 0fr;
275
+ opacity: 0;
276
+ }
277
+
278
+ voa-accordion[open]::part(content),
279
+ voa-accordion.voa-accordion--open::part(content) {
280
+ grid-template-rows: 1fr;
281
+ opacity: 1;
282
+ }
283
+ }
284
+
285
+ /* ============================================
286
+ EXEMPLOS DE CUSTOMIZAÇÃO
287
+ ============================================ */
288
+
289
+ /* Exemplo: Accordion com cor de fundo customizada */
290
+ /*
291
+ voa-accordion.custom-bg::part(base) {
292
+ background-color: var(--structure-colors-bg-container, #f5f5f5);
293
+ }
294
+ */
295
+
296
+ /* Exemplo: Accordion com espaçamento customizado */
297
+ /*
298
+ voa-accordion.custom-spacing::part(base) {
299
+ padding: var(--structure-large-spacing-md, 1rem);
300
+ gap: var(--spacing-spacing-sm, 0.5rem);
301
+ }
302
+ */
303
+
304
+ /* Exemplo: Accordion com tipografia customizada */
305
+ /*
306
+ voa-accordion.custom-typography::part(title) {
307
+ font-size: var(--typography-base-type-scale-5, 20px);
308
+ font-weight: var(--typography-base-type-scale-4-weight, 700);
309
+ }
310
+ */
311
+
312
+ /* ============================================
313
+ voa-alert.external.css
314
+ ============================================ */
315
+
316
+ /**
317
+ * Estilização Externa do VoaAlert
318
+ *
319
+ * Este arquivo demonstra como estilizar o componente voa-alert
320
+ * usando CSS Parts API e design tokens semânticos.
321
+ *
322
+ * Baseado no design do Figma:
323
+ * https://www.figma.com/design/wDStUEuqpl7Tu1oHpiAml6/Voa-Design-System?node-id=397-2706
324
+ *
325
+ * Para usar, importe este arquivo após os tokens:
326
+ * * */
327
+
328
+ /* ============================================
329
+ BASE - Container principal do alert
330
+ ============================================ */
331
+ voa-alert::part(base) {
332
+ /* Border radius padrão - Semantic Token */
333
+ border-radius: var(--radius-sm);
334
+
335
+ /* Border - Separado em propriedades explícitas para permitir override apenas da cor */
336
+ border-width: 1.5px;
337
+ border-style: solid;
338
+ /* Cor padrão da borda - será sobrescrita por regras específicas de tipo */
339
+ border-color: var(--structure-colors-border-color);
340
+
341
+ /* Padding padrão para variant default - Semantic Token */
342
+ padding: var(--spacing-spacing-md);
343
+
344
+ /* Gap entre conteúdo e botões - Semantic Token */
345
+ gap: var(--spacing-spacing-md, 1rem);
346
+ }
347
+
348
+ /* Variante inline: padding e border-radius diferentes */
349
+ voa-alert[variant="inline"]::part(base) {
350
+ /* Padding inline: 20px horizontal, 14px vertical - conforme Figma */
351
+ padding: var(--spacing-spacing-lg, 14px) var(--spacing-spacing-xl, 20px);
352
+ border-radius: var(--radius-md);
353
+ /* Gap entre elementos na variante inline - Figma especifica 10px */
354
+ gap: 10px;
355
+ }
356
+
357
+ /* ============================================
358
+ CORES POR TIPO - Background e Border
359
+ ============================================ */
360
+
361
+ /* Basic */
362
+ voa-alert[type="basic"]::part(base) {
363
+ background-color: var(--structure-colors-bg-container);
364
+ border-color: var(--structure-colors-border-color);
365
+ }
366
+
367
+ /* Success */
368
+ voa-alert[type="success"]::part(base) {
369
+ background-color: var(--palette-green-green-2);
370
+ border-color: var(--palette-green-green-4);
371
+ }
372
+
373
+ /* Info */
374
+ voa-alert[type="info"]::part(base) {
375
+ background-color: var(--palette-blue-blue-2);
376
+ border-color: var(--palette-blue-blue-3);
377
+ }
378
+
379
+ /* Warning */
380
+ voa-alert[type="warning"]::part(base) {
381
+ background-color: var(--palette-yellow-yellow-2);
382
+ border-color: var(--palette-yellow-yellow-4);
383
+ }
384
+
385
+ /* Warning Inline */
386
+ voa-alert[type="warning-inline"]::part(base) {
387
+ background-color: var(--palette-yellow-yellow-1);
388
+ border-color: var(--palette-yellow-yellow-4);
389
+ }
390
+
391
+ /* Error */
392
+ voa-alert[type="error"]::part(base) {
393
+ background-color: var(--palette-red-red-2);
394
+ border-color: var(--palette-red-red-4);
395
+ }
396
+
397
+ /* Variante inline - ajustes de border para alguns tipos */
398
+ voa-alert[variant="inline"][type="info"]::part(base) {
399
+ border-color: var(--palette-blue-blue-4);
400
+ }
401
+
402
+ voa-alert[variant="inline"][type="success"]::part(base) {
403
+ border-color: var(--palette-green-green-3);
404
+ }
405
+
406
+ voa-alert[variant="inline"][type="error"]::part(base) {
407
+ border-color: var(--palette-red-red-5);
408
+ }
409
+
410
+ /* ============================================
411
+ CONTENT-WRAPPER - Wrapper do conteúdo principal
412
+ ============================================ */
413
+ voa-alert::part(content-wrapper) {
414
+ /* Gap entre ícone e conteúdo - Figma especifica 16px (radius-lg) */
415
+ gap: var(--radius-lg, 16px);
416
+ }
417
+
418
+ voa-alert[variant="inline"]::part(content-wrapper) {
419
+ /* Gap entre ícone e conteúdo na variante inline - Figma especifica 10px */
420
+ gap: 10px;
421
+ }
422
+
423
+ /* ============================================
424
+ ICON - Container do ícone
425
+ ============================================ */
426
+ voa-alert::part(icon) {
427
+ /* Tamanho do ícone para variant default */
428
+ width: 24px;
429
+ height: 24px;
430
+ flex-shrink: 0;
431
+
432
+ /* Cor do ícone - será definida por tipo */
433
+ color: currentColor;
434
+ }
435
+
436
+ voa-alert[variant="inline"]::part(icon) {
437
+ /* Tamanho do ícone para variant inline */
438
+ width: 20px;
439
+ height: 20px;
440
+ }
441
+
442
+ /* Cores dos ícones por tipo - Semantic Tokens quando disponíveis */
443
+ voa-alert[type="success"]::part(icon),
444
+ voa-alert[type="success"]::part(icon) svg {
445
+ color: var(--semantic-colors-success);
446
+ }
447
+
448
+ voa-alert[type="info"]::part(icon),
449
+ voa-alert[type="info"]::part(icon) svg {
450
+ color: var(--palette-blue-blue-9);
451
+ }
452
+
453
+ voa-alert[type="warning"]::part(icon),
454
+ voa-alert[type="warning"]::part(icon) svg,
455
+ voa-alert[type="warning-inline"]::part(icon),
456
+ voa-alert[type="warning-inline"]::part(icon) svg {
457
+ color: var(--palette-yellow-yellow-9);
458
+ }
459
+
460
+ voa-alert[type="error"]::part(icon),
461
+ voa-alert[type="error"]::part(icon) svg {
462
+ color: var(--palette-red-red-9);
463
+ }
464
+
465
+ voa-alert[type="basic"]::part(icon),
466
+ voa-alert[type="basic"]::part(icon) svg {
467
+ color: var(--palette-gray-gray-6);
468
+ }
469
+
470
+ /* ============================================
471
+ CONTENT - Container do conteúdo
472
+ ============================================ */
473
+ voa-alert::part(content) {
474
+ /* Flex para layout vertical (default) ou horizontal (inline) */
475
+ flex: 1;
476
+
477
+ /* Tipografia base - Design Token */
478
+ font-family: var(--typography-base-family-sans, 'Lato', sans-serif);
479
+ color: var(--text-primary);
480
+ }
481
+
482
+ /* ============================================
483
+ TITLE - Título do alerta
484
+ ============================================ */
485
+ voa-alert::part(title) {
486
+ /* Tipografia - Design Tokens */
487
+ font-family: var(--typography-base-family-sans, 'Lato', sans-serif);
488
+ font-size: var(--typography-base-type-scale-6, 16px);
489
+ font-weight: var(--typography-base-body-sm-bold-weight, 600);
490
+ line-height: var(--line-height-body-md, 24px);
491
+ color: var(--text-primary);
492
+
493
+ /* Margin */
494
+ margin: 0;
495
+ }
496
+
497
+ voa-alert[variant="inline"]::part(title) {
498
+ /* Tipografia inline - menor */
499
+ font-size: var(--typography-base-type-scale-7, 14px);
500
+ line-height: var(--line-height-body-sm, 16px);
501
+ }
502
+
503
+ /* ============================================
504
+ DESCRIPTION - Descrição do alerta
505
+ ============================================ */
506
+ voa-alert::part(description) {
507
+ /* Tipografia - Design Tokens */
508
+ font-family: var(--typography-base-family-sans, 'Lato', sans-serif);
509
+ font-size: var(--typography-base-body-sm-regular-size, 14px);
510
+ font-weight: var(--typography-base-body-sm-regular-weight, 400);
511
+ line-height: var(--typography-base-body-sm-regular-line-height, 16px);
512
+ color: var(--text-secondary);
513
+
514
+ /* Espaçamento do título - Semantic Token */
515
+ margin-top: var(--spacing-spacing-xs, 4px);
516
+ margin-bottom: 0;
517
+ }
518
+
519
+ /* ============================================
520
+ CONTENT-INNER - Wrapper interno do conteúdo
521
+ ============================================ */
522
+ voa-alert::part(content-inner) {
523
+ /* Layout flex vertical para título e descrição */
524
+ display: flex;
525
+ flex-direction: column;
526
+ gap: 0; /* Gap será controlado via margin-top na descrição */
527
+ }
528
+
529
+ /* ============================================
530
+ CLOSE-BUTTON - Botão de fechar
531
+ ============================================ */
532
+ voa-alert::part(close-button) {
533
+ /* Tamanho do ícone de fechar para variant default */
534
+ width: 16px;
535
+ height: 16px;
536
+ flex-shrink: 0;
537
+
538
+ /* Cor do ícone de fechar - Primitive Token (não há token semântico para isso) */
539
+ color: var(--palette-gray-gray-6);
540
+
541
+ /* Hover */
542
+ transition: opacity 0.2s ease;
543
+ }
544
+
545
+ voa-alert::part(close-button):hover {
546
+ opacity: 0.7;
547
+ }
548
+
549
+ voa-alert::part(close-button):focus-visible {
550
+ outline: 2px solid var(--brand-base);
551
+ outline-offset: 2px;
552
+ border-radius: 2px;
553
+ }
554
+
555
+ voa-alert[variant="inline"]::part(close-button) {
556
+ /* Tamanho do ícone de fechar para variant inline */
557
+ width: 16px;
558
+ height: 16px;
559
+ }
560
+
561
+ /* ============================================
562
+ ACTIONS - Container dos botões de ação
563
+ ============================================ */
564
+ voa-alert::part(actions) {
565
+ /* Layout flex para botões */
566
+ display: flex;
567
+ justify-content: flex-end;
568
+ align-items: center;
569
+
570
+ /* Gap entre botões - Semantic Token */
571
+ gap: var(--spacing-spacing-sm, 0.5rem);
572
+
573
+ /* Padding top para separar do conteúdo - Semantic Token */
574
+ padding-top: var(--spacing-spacing-xs);
575
+ }
576
+
577
+ /* ============================================
578
+ BUTTONS - Estilização via exportparts
579
+ ============================================ */
580
+ /*
581
+ * Os botões são expostos via exportparts no voa-alert:
582
+ * - primary-btn-base: Parte "base" do botão primário
583
+ * - secondary-btn-base: Parte "base" do botão secundário (ghost)
584
+ *
585
+ * Isso permite estilizar os botões de fora do Shadow DOM.
586
+ */
587
+
588
+ /* Base styles for both buttons */
589
+ voa-alert::part(primary-btn-base),
590
+ voa-alert::part(secondary-btn-base) {
591
+ /* Tipografia - Design Tokens */
592
+ font-family: var(--typography-base-family-sans, 'Lato', sans-serif);
593
+ font-size: var(--typography-base-body-sm-regular-size, 14px);
594
+ font-weight: var(--typography-base-body-sm-regular-weight, 400);
595
+ line-height: var(--typography-base-body-sm-regular-line-height, 16px);
596
+ text-align: center;
597
+
598
+ /* Border-radius padrão - Semantic Token */
599
+ border-radius: var(--radius-sm);
600
+
601
+ /* Box-sizing */
602
+ box-sizing: border-box;
603
+
604
+ /* Transição suave para estados hover/active */
605
+ transition: background-color 0.2s ease, border-color 0.2s ease, color 0.2s ease;
606
+
607
+ /* Padding para size="sm" */
608
+ padding-block: var(--spacing-spacing-xs);
609
+ padding-inline: var(--spacing-spacing-xs);
610
+ min-width: 98px;
611
+ gap: var(--spacing-spacing-xs, 0.25rem);
612
+ }
613
+
614
+ /* Primary Button */
615
+ voa-alert::part(primary-btn-base) {
616
+ background-color: var(--brand-base);
617
+ color: var(--text-on-primary);
618
+ border: var(--border-width-thin) solid var(--brand-base-50);
619
+ }
620
+
621
+ voa-alert::part(primary-btn-base):hover {
622
+ background-color: var(--brand-hover);
623
+ border-color: var(--brand-base-50);
624
+ }
625
+
626
+ voa-alert::part(primary-btn-base):active {
627
+ background-color: var(--brand-active);
628
+ border-color: var(--brand-base-50);
629
+ }
630
+
631
+ voa-alert::part(primary-btn-base):focus-visible {
632
+ outline: 2px solid var(--brand-base);
633
+ outline-offset: 2px;
634
+ }
635
+
636
+ /* Secondary/Ghost Button - Com cores de danger */
637
+ voa-alert::part(secondary-btn-base) {
638
+ background-color: transparent;
639
+ color: var(--semantic-colors-danger);
640
+ border: 1px solid transparent;
641
+ }
642
+
643
+ voa-alert::part(secondary-btn-base):hover {
644
+ background-color: var(--semantic-colors-danger);
645
+ color: var(--text-on-primary);
646
+ border-color: var(--semantic-colors-danger);
647
+ }
648
+
649
+ voa-alert::part(secondary-btn-base):active {
650
+ background-color: var(--semantic-colors-danger);
651
+ color: var(--text-on-primary);
652
+ border-color: var(--semantic-colors-danger);
653
+ opacity: 0.9;
654
+ }
655
+
656
+ voa-alert::part(secondary-btn-base):focus-visible {
657
+ outline: 2px solid var(--semantic-colors-danger);
658
+ outline-offset: 2px;
659
+ }
660
+
661
+ /* ============================================
662
+ voa-avatar.external.css
663
+ ============================================ */
664
+
665
+ /**
666
+ * Estilização Externa do VoaAvatar
667
+ *
668
+ * Este arquivo demonstra como estilizar o componente voa-avatar
669
+ * usando CSS Parts API e design tokens semânticos.
670
+ *
671
+ * Baseado no design do Figma:
672
+ * https://www.figma.com/design/wDStUEuqpl7Tu1oHpiAml6/Voa-Design-System?node-id=397-2809&t=eEPGXVkQRijr3FMg-4
673
+ *
674
+ * Para usar, importe este arquivo após os tokens:
675
+ * * */
676
+
677
+ /* ============================================
678
+ BASE - Container principal do avatar
679
+ ============================================ */
680
+ voa-avatar::part(base) {
681
+ /* Background do avatar - Semantic Token (conforme Figma: bg-elevated) */
682
+ background-color: var(--structure-colors-bg-elevated);
683
+
684
+ /* Border-radius circular - Semantic Token (conforme Figma: radius-round) */
685
+ border-radius: var(--radius-round);
686
+
687
+ /* Shadow conforme Figma: 0px 4px 4px 0px rgba(0,0,0,0.25) */
688
+ box-shadow: var(--voa-shadow-avatar);
689
+ }
690
+
691
+ /* ============================================
692
+ INITIALS - Texto de iniciais
693
+ ============================================ */
694
+ voa-avatar::part(initials) {
695
+ /* Cor do texto - Semantic Token (conforme Figma: text-primary) */
696
+ color: var(--text-primary);
697
+
698
+ /* Font-family (Manrope SemiBold conforme Figma) */
699
+ font-family: var(--font-family-sans, 'Manrope', sans-serif);
700
+ font-weight: var(--typography-base-body-sm-bold-weight); /* SemiBold */
701
+ font-style: normal;
702
+
703
+ /* Line-height */
704
+ line-height: 1;
705
+
706
+ /* Text transform já aplicado no CSS estrutural */
707
+ }
708
+
709
+ /* Tamanhos de fonte para iniciais baseados no size do avatar */
710
+ voa-avatar[size="xs"]::part(initials) {
711
+ font-size: var(--avatar-font-size-xs); /* Conforme Figma: 8px para xs */
712
+ }
713
+
714
+ voa-avatar[size="sm"]::part(initials) {
715
+ font-size: var(--avatar-font-size-sm); /* Conforme Figma: 12px para sm */
716
+ }
717
+
718
+ voa-avatar[size="md"]::part(initials) {
719
+ font-size: var(--avatar-font-size-md); /* Conforme Figma: 16px para md */
720
+ }
721
+
722
+ voa-avatar[size="lg"]::part(initials) {
723
+ font-size: var(--avatar-font-size-lg); /* Conforme Figma: 24px para lg */
724
+ }
725
+
726
+ voa-avatar[size="xl"]::part(initials) {
727
+ font-size: var(--avatar-font-size-xl); /* Conforme Figma: 28px para xl */
728
+ }
729
+
730
+ /* ============================================
731
+ ICON - Ícone SVG padrão
732
+ ============================================ */
733
+ voa-avatar::part(icon) {
734
+ /* Cor do ícone - Primitive Token (conforme Figma: rgba(73, 80, 87, 1) = gray-7) */
735
+ /* Nota: Não há token semântico específico para cor de ícone, usando primitivo */
736
+ color: var(--palette-gray-gray-7);
737
+
738
+ /* Fill será aplicado via currentColor */
739
+ fill: currentColor;
740
+ }
741
+
742
+ /* ============================================
743
+ IMAGE - Imagem do avatar
744
+ ============================================ */
745
+ voa-avatar::part(image) {
746
+ /* Estilos estruturais já aplicados no CSS do componente */
747
+ /* Apenas garantir que a imagem preencha o container */
748
+ object-fit: cover;
749
+ object-position: center;
750
+ }
751
+
752
+ /* ============================================
753
+ VARIAÇÕES POR TIPO
754
+ ============================================ */
755
+
756
+ /* Avatar tipo photo - sem background (apenas imagem) */
757
+ voa-avatar[type="photo"]::part(base) {
758
+ background-color: transparent;
759
+ }
760
+
761
+ /* Avatar tipo icon - com background */
762
+ voa-avatar[type="icon"]::part(base) {
763
+ background-color: var(--structure-colors-bg-elevated);
764
+ }
765
+
766
+ /* Avatar tipo initials - com background */
767
+ voa-avatar[type="initials"]::part(base) {
768
+ background-color: var(--structure-colors-bg-elevated);
769
+ }
770
+
771
+ /* ============================================
772
+ ACESSIBILIDADE
773
+ ============================================ */
774
+
775
+ /* Focus visível para navegação por teclado (se o avatar for interativo) */
776
+ voa-avatar::part(base):focus-visible {
777
+ outline: 2px solid var(--brand-base);
778
+ outline-offset: 2px;
779
+ }
780
+
781
+ /* ============================================
782
+ voa-badge.external.css
783
+ ============================================ */
784
+
785
+ /**
786
+ * Estilização Externa do VoaBadge
787
+ *
788
+ * Este arquivo demonstra como estilizar o componente voa-badge
789
+ * usando CSS Parts API e design tokens semânticos.
790
+ *
791
+ * Baseado no design do Figma:
792
+ * https://www.figma.com/design/wDStUEuqpl7Tu1oHpiAml6/Voa-Design-System?node-id=397-3352
793
+ *
794
+ * Para usar, importe este arquivo após os tokens:
795
+ * * *
796
+ * MAPEAMENTO DE TOKENS DO FIGMA PARA STYLE DICTIONARY:
797
+ *
798
+ * Figma Token → Style Dictionary Token
799
+ * --------------------------------------------
800
+ * --structure-colors/bg-container → --structure-colors-bg-container
801
+ * --structure-colors/border-color → --structure-colors-border-color
802
+ * --structure-colors/border-color-secondary → --structure-colors-border-color-secondary
803
+ * --structure-colors/fill-secondary → --structure-colors-fill-secondary
804
+ * --spacing/spacing-xs → --spacing-spacing-xs (4px)
805
+ * --spacing/spacing-sm → --spacing-spacing-sm (8px)
806
+ * --spacing/spacing-md → --spacing-spacing-md (16px)
807
+ * --spacing/spacing-lg → --spacing-spacing-lg (24px)
808
+ * --spacing/spacing-xxs → --spacing-spacing-xxs (2px)
809
+ * --radius/radius-xs → --radius-xs (4px)
810
+ * --radius/radius-round → --radius-round (1024px)
811
+ * --semantic-colors/danger → --semantic-colors-danger
812
+ * --asset-colors/text-primary → --text-primary
813
+ * --base/family/family-sans → --font-family-sans
814
+ */
815
+
816
+ /* ============================================
817
+ BASE - Container principal do badge
818
+ ============================================ */
819
+ voa-badge::part(base) {
820
+ /* Background padrão - Semantic Token (conforme Figma: structure-colors/bg-container) */
821
+ background-color: var(--structure-colors-bg-container, #f1f3f5);
822
+
823
+ /* Border padrão - Figma: 1.5px solid */
824
+ border: 1.5px solid var(--structure-colors-border-color, #adb5bd);
825
+
826
+ /* Border-radius padrão para state="default" - Semantic Token (conforme Figma: radius/radius-xs) */
827
+ border-radius: var(--radius-xs, 4px);
828
+
829
+ /* Box-sizing */
830
+ box-sizing: border-box;
831
+ }
832
+
833
+ /* State: Pill - Border-radius completamente arredondado */
834
+ voa-badge[shape="pill"]::part(base) {
835
+ /* Border-radius pill - Semantic Token (conforme Figma: radius/radius-round = 1024px) */
836
+ border-radius: var(--radius-round, 1024px);
837
+ }
838
+
839
+ /* ============================================
840
+ VARIANTE: ICON-ONLY
841
+ Figma: Type=icon-only
842
+ ============================================ */
843
+
844
+ /* Icon-only - Size: md, State: default */
845
+ voa-badge[variant="icon-only"]::part(base) {
846
+ /* Padding uniforme - Figma: spacing-xs (4px) */
847
+ padding: var(--spacing-spacing-xs, 4px);
848
+ /* Gap entre elementos - Figma: 4px */
849
+ gap: 4px;
850
+ }
851
+
852
+ /* Icon-only - Size: sm */
853
+ voa-badge[variant="icon-only"][size="sm"]::part(base) {
854
+ padding: var(--spacing-spacing-xs, 4px);
855
+ gap: 4px;
856
+ }
857
+
858
+ /* ============================================
859
+ VARIANTE: INDICATOR
860
+ Figma: Type=indicator
861
+ ============================================ */
862
+
863
+ /* Indicator - Size: md, State: default */
864
+ voa-badge[variant="indicator"]::part(base),
865
+ voa-badge[variant="indicator"][size="md"]::part(base) {
866
+ /* Padding - Figma: px=spacing-xs (4px), py=spacing-xxs (2px) */
867
+ padding-block: var(--spacing-spacing-xxs, 2px);
868
+ padding-inline: var(--spacing-spacing-xs, 4px);
869
+ /* Height - Figma: spacing-lg (24px) */
870
+ height: var(--spacing-spacing-lg, 24px);
871
+ /* Max-width - Figma: 24px */
872
+ max-width: 24px;
873
+ /* Gap - Figma: 10px */
874
+ gap: 10px;
875
+ }
876
+
877
+ /* Indicator - Size: sm, State: default */
878
+ voa-badge[variant="indicator"][size="sm"]::part(base) {
879
+ padding-block: var(--spacing-spacing-xxs, 2px);
880
+ padding-inline: var(--spacing-spacing-xs, 4px);
881
+ /* Size - Figma: spacing-md (16px) x spacing-md (16px) */
882
+ width: var(--spacing-spacing-md, 16px);
883
+ height: var(--spacing-spacing-md, 16px);
884
+ max-width: 24px;
885
+ gap: 10px;
886
+ /* Border color secondary para sm - Figma */
887
+ border-color: var(--structure-colors-border-color-secondary, #dee2e6);
888
+ }
889
+
890
+ /* Indicator - Size: md, State: pill */
891
+ voa-badge[variant="indicator"][shape="pill"]::part(base),
892
+ voa-badge[variant="indicator"][shape="pill"][size="md"]::part(base) {
893
+ padding-block: var(--radius-xs, 4px);
894
+ padding-inline: var(--spacing-spacing-xs, 4px);
895
+ height: 24px;
896
+ gap: 10px;
897
+ /* items-start no Figma, portanto align-items: flex-start */
898
+ align-items: flex-start;
899
+ }
900
+
901
+ /* Indicator - Size: sm, State: pill */
902
+ voa-badge[variant="indicator"][shape="pill"][size="sm"]::part(base) {
903
+ padding-block: var(--radius-xs, 4px);
904
+ padding-inline: var(--spacing-spacing-xs, 4px);
905
+ width: var(--spacing-spacing-md, 16px);
906
+ height: var(--spacing-spacing-md, 16px);
907
+ gap: 10px;
908
+ align-items: flex-start;
909
+ border-color: var(--structure-colors-border-color-secondary, #dee2e6);
910
+ }
911
+
912
+ /* ============================================
913
+ VARIANTE: INDICATOR-OVERLAY
914
+ Figma: Type=indicator-overlay (fundo vermelho)
915
+ ============================================ */
916
+
917
+ /* Indicator-overlay - Base styles */
918
+ voa-badge[variant="indicator-overlay"]::part(base) {
919
+ /* Background vermelho - Semantic Token (conforme Figma: semantic-colors/danger) */
920
+ background-color: var(--semantic-colors-danger, #e51937);
921
+ /* Border com fill-secondary - Figma */
922
+ border-color: var(--structure-colors-fill-secondary, rgba(24, 24, 27, 0.06));
923
+ }
924
+
925
+ /* Indicator-overlay - Size: md, State: default */
926
+ voa-badge[variant="indicator-overlay"][size="md"]::part(base) {
927
+ padding-block: var(--spacing-spacing-xxs, 2px);
928
+ padding-inline: var(--spacing-spacing-xs, 4px);
929
+ height: var(--spacing-spacing-lg, 24px);
930
+ max-width: 24px;
931
+ gap: 10px;
932
+ }
933
+
934
+ /* Indicator-overlay - Size: sm, State: default */
935
+ voa-badge[variant="indicator-overlay"][size="sm"]::part(base) {
936
+ padding-block: var(--spacing-spacing-xxs, 2px);
937
+ padding-inline: var(--spacing-spacing-xs, 4px);
938
+ /* Size fixa 16x16 - Figma */
939
+ width: var(--spacing-spacing-md, 16px);
940
+ height: var(--spacing-spacing-md, 16px);
941
+ max-width: 24px;
942
+ gap: 10px;
943
+ }
944
+
945
+ /* Indicator-overlay - Size: md, State: pill */
946
+ voa-badge[variant="indicator-overlay"][shape="pill"]::part(base),
947
+ voa-badge[variant="indicator-overlay"][shape="pill"][size="md"]::part(base) {
948
+ padding-block: var(--radius-xs, 4px);
949
+ padding-inline: var(--spacing-spacing-xs, 4px);
950
+ height: 24px;
951
+ gap: 10px;
952
+ align-items: flex-start;
953
+ }
954
+
955
+ /* Indicator-overlay - Size: sm, State: pill */
956
+ voa-badge[variant="indicator-overlay"][shape="pill"][size="sm"]::part(base) {
957
+ padding-block: var(--radius-xs, 4px);
958
+ padding-inline: var(--spacing-spacing-xs, 4px);
959
+ width: var(--spacing-spacing-md, 16px);
960
+ height: var(--spacing-spacing-md, 16px);
961
+ gap: 10px;
962
+ align-items: flex-start;
963
+ }
964
+
965
+ /* ============================================
966
+ VARIANTE: INDICATOR-ONLY
967
+ Figma: Type=indicator-only (apenas ponto vermelho)
968
+ ============================================ */
969
+
970
+ voa-badge[variant="indicator-only"]::part(base) {
971
+ /* Background vermelho - Figma */
972
+ background-color: var(--semantic-colors-danger, #e51937);
973
+ /* Border-radius - Figma: radius-xs (4px) */
974
+ border-radius: var(--radius-xs, 4px);
975
+ /* Tamanho fixo - Figma: spacing-sm (8px) x spacing-sm (8px) */
976
+ width: var(--spacing-spacing-sm, 8px);
977
+ height: var(--spacing-spacing-sm, 8px);
978
+ /* Sem border - Figma */
979
+ border: none;
980
+ /* Sem padding */
981
+ padding: 0;
982
+ /* Shadow - Figma: 0px 4px 4px 0px rgba(0,0,0,0.25) */
983
+ box-shadow: 0px 4px 4px 0px rgba(0, 0, 0, 0.25);
984
+ }
985
+
986
+ /* ============================================
987
+ VARIANTE: PLAIN (compatibilidade legado)
988
+ Nota: Não existe no Figma atual, mantido para retrocompatibilidade
989
+ ============================================ */
990
+
991
+ voa-badge[variant="plain"]::part(base) {
992
+ padding-block: var(--spacing-spacing-xs, 4px);
993
+ padding-inline: var(--spacing-spacing-sm, 8px);
994
+ gap: var(--spacing-spacing-xs, 4px);
995
+ }
996
+
997
+ voa-badge[variant="plain"][size="sm"]::part(base) {
998
+ padding: var(--spacing-spacing-xs, 4px);
999
+ }
1000
+
1001
+ /* ============================================
1002
+ VARIANTE: ICONS (compatibilidade legado)
1003
+ Nota: Não existe no Figma atual, mantido para retrocompatibilidade
1004
+ ============================================ */
1005
+
1006
+ voa-badge[variant="icons"]::part(base) {
1007
+ padding-block: var(--spacing-spacing-xs, 4px);
1008
+ padding-inline: var(--spacing-spacing-sm, 8px);
1009
+ gap: var(--spacing-spacing-xs, 4px);
1010
+ }
1011
+
1012
+ voa-badge[variant="icons"][size="sm"]::part(base) {
1013
+ padding: var(--spacing-spacing-xs, 4px);
1014
+ }
1015
+
1016
+ /* ============================================
1017
+ LABEL - Texto do badge
1018
+ ============================================ */
1019
+ voa-badge::part(label) {
1020
+ /* Cor do texto - Semantic Token (conforme Figma: asset-colors/text-primary) */
1021
+ color: var(--text-primary, #0b1215);
1022
+
1023
+ /* Font-family - Figma: base/family/family-sans */
1024
+ font-family: var(--font-family-sans, 'Lato', sans-serif);
1025
+
1026
+ /* Font-weight: Regular (400) */
1027
+ font-weight: var(--typography-base-body-sm-regular-weight, 400);
1028
+ font-style: normal;
1029
+
1030
+ /* Line-height e font-size por tamanho */
1031
+ line-height: 16px;
1032
+ font-size: var(--typography-base-body-sm-regular-size, 14px);
1033
+ }
1034
+
1035
+ /* Size: Small - Tipografia menor */
1036
+ voa-badge[size="sm"]::part(label) {
1037
+ font-size: 11px;
1038
+ line-height: 12px;
1039
+ }
1040
+
1041
+ /* ============================================
1042
+ INDICATOR - Contador numérico
1043
+ ============================================ */
1044
+ voa-badge::part(indicator) {
1045
+ /* Cor do texto - Figma: asset-colors/text-primary */
1046
+ color: var(--text-primary, #0b1215);
1047
+
1048
+ /* Font-family - Figma: base/family/family-sans com SemiBold */
1049
+ font-family: var(--font-family-sans, 'Lato', sans-serif);
1050
+
1051
+ /* Font-weight: SemiBold (600) - Figma */
1052
+ font-weight: 600;
1053
+ font-style: normal;
1054
+
1055
+ /* Text alignment */
1056
+ text-align: center;
1057
+ white-space: pre-wrap;
1058
+ }
1059
+
1060
+ /* Indicator - Size: md */
1061
+ voa-badge[size="md"]::part(indicator),
1062
+ voa-badge[variant="indicator"][size="md"]::part(indicator),
1063
+ voa-badge[variant="indicator-overlay"][size="md"]::part(indicator) {
1064
+ /* Figma: 14px, line-height 16px, size 16x16 */
1065
+ font-size: 14px;
1066
+ line-height: 16px;
1067
+ width: 16px;
1068
+ height: 16px;
1069
+ }
1070
+
1071
+ /* Indicator - Size: sm */
1072
+ voa-badge[size="sm"]::part(indicator),
1073
+ voa-badge[variant="indicator"][size="sm"]::part(indicator),
1074
+ voa-badge[variant="indicator-overlay"][size="sm"]::part(indicator) {
1075
+ /* Figma: 10px, line-height 8px, size 8x8 */
1076
+ font-size: 10px;
1077
+ line-height: 8px;
1078
+ width: 8px;
1079
+ height: 8px;
1080
+ }
1081
+
1082
+ /* Variante: Indicator-overlay - Texto branco */
1083
+ voa-badge[variant="indicator-overlay"]::part(indicator) {
1084
+ /* Cor do texto branco - Figma: structure-colors/bg-base */
1085
+ color: var(--structure-colors-bg-base, #ffffff);
1086
+ }
1087
+
1088
+ /* ============================================
1089
+ ICON - Ícone do badge
1090
+ ============================================ */
1091
+ voa-badge::part(icon),
1092
+ voa-badge::part(icon-leading),
1093
+ voa-badge::part(icon-trailing) {
1094
+ /* Cor do ícone - Figma usa cor específica do ícone (ex: rgba(0, 229, 206, 1) para check) */
1095
+ /* Mantemos currentColor para flexibilidade */
1096
+ color: currentColor;
1097
+ fill: currentColor;
1098
+ }
1099
+
1100
+ /* Icon - Size: md */
1101
+ voa-badge[size="md"]::part(icon),
1102
+ voa-badge[size="md"]::part(icon-leading),
1103
+ voa-badge[size="md"]::part(icon-trailing),
1104
+ voa-badge[variant="icon-only"][size="md"]::part(icon) {
1105
+ /* Figma: 16x16 */
1106
+ width: 16px;
1107
+ height: 16px;
1108
+ }
1109
+
1110
+ /* Icon - Size: sm */
1111
+ voa-badge[size="sm"]::part(icon),
1112
+ voa-badge[size="sm"]::part(icon-leading),
1113
+ voa-badge[size="sm"]::part(icon-trailing),
1114
+ voa-badge[variant="icon-only"][size="sm"]::part(icon) {
1115
+ /* Figma: 8x8 para icon-only sm */
1116
+ width: 8px;
1117
+ height: 8px;
1118
+ }
1119
+
1120
+ /* ============================================
1121
+ ACESSIBILIDADE
1122
+ ============================================ */
1123
+
1124
+ /* Focus visível para navegação por teclado (se o badge for interativo) */
1125
+ voa-badge::part(base):focus-visible {
1126
+ outline: 2px solid var(--brand-base, #0064cb);
1127
+ outline-offset: 2px;
1128
+ }
1129
+
1130
+ /* ============================================
1131
+ voa-breadcrumbs.external.css
1132
+ ============================================ */
1133
+
1134
+ /**
1135
+ * Estilização Externa do VoaBreadcrumbs
1136
+ *
1137
+ * Este arquivo demonstra como estilizar o componente voa-breadcrumbs
1138
+ * usando CSS Parts API e design tokens semânticos.
1139
+ *
1140
+ * Baseado no design do Figma:
1141
+ * https://www.figma.com/design/wDStUEuqpl7Tu1oHpiAml6/Voa-Design-System?node-id=443-10022&t=eEPGXVkQRijr3FMg-4
1142
+ *
1143
+ * Para usar, importe este arquivo após os tokens:
1144
+ * * *
1145
+ * MAPEAMENTO DE TOKENS DO FIGMA PARA STYLE DICTIONARY:
1146
+ *
1147
+ * Figma Token → Style Dictionary Token
1148
+ * --------------------------------------------
1149
+ * --structure-colors/bg-base → --structure-colors-bg-base
1150
+ * --structure-colors/fill-15 → --structure-colors-fill-15
1151
+ * --structure-colors/border-color-secondary → --structure-colors-border-color-secondary
1152
+ * --radius/radius-round → --radius-round
1153
+ * --radius/radius-lg → --radius-lg
1154
+ * --spacing/spacing-md → --spacing-spacing-md (16px)
1155
+ * --spacing/spacing-sm → --spacing-spacing-sm (8px)
1156
+ * --spacing/spacing-xs → --spacing-spacing-xs (4px)
1157
+ * --asset-colors/text-secondary → --text-secondary
1158
+ * --asset-colors/text-hover → --text-hover (ou --brand-base)
1159
+ * --base/family/family-sans → --font-family-sans
1160
+ */
1161
+
1162
+ /* ============================================
1163
+ BASE - Container principal do breadcrumb
1164
+ ============================================ */
1165
+ voa-breadcrumbs::part(base) {
1166
+ /* Background padrão (default) - Semantic Token (conforme Figma: structure-colors/bg-base) */
1167
+ background-color: var(--structure-colors-bg-base);
1168
+
1169
+ /* Padding horizontal - Semantic Token (conforme Figma: spacing/spacing-md = 16px) */
1170
+ padding-inline: var(--spacing-spacing-md);
1171
+
1172
+ /* Padding vertical */
1173
+ padding-block: 0;
1174
+
1175
+ /* Box-sizing */
1176
+ box-sizing: border-box;
1177
+
1178
+ /* Gap entre items - Semantic Token (conforme Figma: spacing/spacing-sm = 8px) */
1179
+ /* Note: Gap is handled by separator margin in the items */
1180
+ gap: 0;
1181
+ }
1182
+
1183
+ /* Variante: Round - Estilos específicos */
1184
+ voa-breadcrumbs[type="round"]::part(base) {
1185
+ /* Background round - Semantic Token (conforme Figma: structure-colors/fill-15) */
1186
+ background-color: var(--structure-colors-fill-15);
1187
+
1188
+ /* Border - Semantic Token (conforme Figma: structure-colors/border-color-secondary) */
1189
+ border: var(--border-width-thin) solid var(--structure-colors-border-color-secondary);
1190
+
1191
+ /* Border-radius completamente arredondado - Semantic Token (conforme Figma: radius/radius-round) */
1192
+ border-radius: var(--radius-round);
1193
+
1194
+ /* Padding round - Semantic Token (conforme Figma: radius/radius-lg = 16px) */
1195
+ padding-inline: var(--radius-lg);
1196
+ }
1197
+
1198
+ /* Variante: Outline - Estilos específicos */
1199
+ voa-breadcrumbs[type="outline"]::part(base) {
1200
+ /* Background transparente */
1201
+ background-color: transparent;
1202
+
1203
+ /* Border - Semantic Token */
1204
+ border: var(--border-width-thin) solid var(--structure-colors-border-color-secondary);
1205
+
1206
+ /* Border-radius padrão */
1207
+ border-radius: var(--radius-sm);
1208
+
1209
+ /* Padding similar ao round para compensar a borda */
1210
+ padding-inline: var(--spacing-spacing-md);
1211
+ }
1212
+
1213
+ /* ============================================
1214
+ BREADCRUMBS ITEM - Item do breadcrumb
1215
+ ============================================ */
1216
+
1217
+ /* Base do item (Content) */
1218
+ voa-breadcrumbs-item::part(content) {
1219
+ /* Display flex para alinhamento */
1220
+ display: inline-flex;
1221
+ align-items: center;
1222
+
1223
+ /* Padding vertical - Semantic Token (conforme Figma: spacing/spacing-xs = 4px) */
1224
+ padding-block: var(--spacing-spacing-xs);
1225
+
1226
+ /* Text decoration para links */
1227
+ text-decoration: none;
1228
+
1229
+ /* Box-sizing */
1230
+ box-sizing: border-box;
1231
+
1232
+ /* Cursor pointer para links */
1233
+ cursor: pointer;
1234
+
1235
+ /* --- Text Styles from Figma (component-specific overrides) --- */
1236
+ /* Cor do texto - Figma: asset-colors/text-secondary = #00e5ce (teal) */
1237
+ color: #00e5ce;
1238
+
1239
+ /* Font-family - Semantic Token (conforme Figma: base/family/family-sans) */
1240
+ font-family: var(--font-family-sans, 'Lato', sans-serif);
1241
+
1242
+ /* Font-weight: Regular (400) */
1243
+ font-weight: var(--typography-base-body-sm-regular-weight, 400);
1244
+ font-style: normal;
1245
+
1246
+ /* Font-size: 10px conforme Figma (Legal/Regular) */
1247
+ font-size: 0.625rem; /* 10px */
1248
+ line-height: 16px;
1249
+
1250
+ /* Text alignment right conforme Figma */
1251
+ text-align: right;
1252
+ }
1253
+
1254
+ /* Item ativo (span) - sem cursor pointer */
1255
+ voa-breadcrumbs-item[active]::part(content) {
1256
+ cursor: default;
1257
+
1258
+ /* --- Active Text Styles from Figma --- */
1259
+ /* Cor do texto ativo - Figma: asset-colors/text-hover = #0064cb (blue) */
1260
+ color: #0064cb;
1261
+
1262
+ /* Font-weight: SemiBold (600) conforme Figma (Legal/Bold) */
1263
+ font-weight: var(--typography-base-body-sm-bold-weight, 600);
1264
+ }
1265
+
1266
+ /* Link não ativo - hover effect */
1267
+ voa-breadcrumbs-item::part(content):hover {
1268
+ /* Text decoration underline para links */
1269
+ text-decoration: underline;
1270
+ }
1271
+
1272
+ voa-breadcrumbs-item[active]::part(content):hover {
1273
+ /* Sem underline quando ativo */
1274
+ text-decoration: none;
1275
+ }
1276
+
1277
+ /* ============================================
1278
+ BREADCRUMBS SEPARATOR - Divisor entre items
1279
+ ============================================ */
1280
+
1281
+ /* Base do divisor */
1282
+ voa-breadcrumbs-item::part(separator) {
1283
+ /* Cor do ícone - Figma: rgba(159, 159, 168, 1) = gray separator */
1284
+ color: rgba(159, 159, 168, 1);
1285
+
1286
+ /* Fill será aplicado via currentColor */
1287
+ fill: currentColor;
1288
+
1289
+ /* Margem horizontal - Semantic Token (conforme Figma: spacing/spacing-sm = 8px) */
1290
+ margin-inline: var(--spacing-spacing-sm);
1291
+ }
1292
+
1293
+ /* Tamanho do ícone - 16x16 conforme Figma */
1294
+ voa-breadcrumbs-item::part(separator) svg {
1295
+ width: 16px;
1296
+ height: 16px;
1297
+ }
1298
+
1299
+ /* ============================================
1300
+ ACESSIBILIDADE
1301
+ ============================================ */
1302
+
1303
+ /* Focus visível para navegação por teclado */
1304
+ voa-breadcrumbs-item::part(content):focus-visible {
1305
+ outline: 2px solid var(--brand-base);
1306
+ outline-offset: 2px;
1307
+ border-radius: 2px;
1308
+ }
1309
+
1310
+ /* Link ativo não precisa de focus */
1311
+ voa-breadcrumbs-item[active]::part(content):focus-visible {
1312
+ outline: none;
1313
+ }
1314
+
1315
+ /* ============================================
1316
+ voa-button.external.css
1317
+ ============================================ */
1318
+
1319
+ /**
1320
+ * Estilização Externa do VoaButton
1321
+ *
1322
+ * Este arquivo demonstra como estilizar o componente voa-button
1323
+ * usando CSS Parts API e design tokens semânticos.
1324
+ *
1325
+ * Baseado no design do Figma:
1326
+ * https://www.figma.com/design/wDStUEuqpl7Tu1oHpiAml6/Voa-Design-System?node-id=515-327
1327
+ */
1328
+
1329
+ /* ============================================
1330
+ BASE - Elemento raiz do botão
1331
+ ============================================ */
1332
+
1333
+ voa-button::part(base) {
1334
+ /* Tipografia */
1335
+ font-family: var(--font-family-sans, 'Lato', sans-serif);
1336
+ font-size: var(--typography-base-body-sm-regular-size); /* Desktop/Body-sm/Regular */
1337
+ font-weight: var(--typography-base-body-sm-regular-weight);
1338
+ line-height: var(--line-height-body-sm);
1339
+
1340
+ /* Box-sizing */
1341
+ box-sizing: border-box;
1342
+
1343
+ /* Transição suave */
1344
+ transition: all 0.2s ease;
1345
+ }
1346
+
1347
+ /* ============================================
1348
+ TAMANHOS (Size)
1349
+ ============================================ */
1350
+
1351
+ /* Small (sm) */
1352
+ voa-button[size="sm"]::part(base) {
1353
+ /* Padding: Vertical 4px, Horizontal 16px */
1354
+ padding-block: var(--spacing-spacing-xs, 4px);
1355
+ padding-inline: var(--spacing-spacing-md, 16px);
1356
+
1357
+ border-radius: var(--radius-xs, 4px);
1358
+ gap: 10px;
1359
+ }
1360
+
1361
+ /* Medium (md) */
1362
+ voa-button[size="md"]::part(base) {
1363
+ /* Padding: Vertical 8px, Horizontal 4px */
1364
+ padding-block: var(--spacing-spacing-sm, 8px);
1365
+ padding-inline: var(--spacing-spacing-xs, 4px);
1366
+
1367
+ min-width: 82px;
1368
+ border-radius: var(--radius-sm, 8px);
1369
+ gap: 4px;
1370
+ }
1371
+
1372
+ /* Large (lg) - padrão */
1373
+ voa-button[size="lg"]::part(base) {
1374
+ /* Padding: Vertical 12px, Horizontal 4px */
1375
+ padding-block: var(--spacing-spacing-rg, 12px);
1376
+ padding-inline: var(--spacing-spacing-xs, 4px);
1377
+
1378
+ min-width: 98px;
1379
+ border-radius: var(--radius-sm, 8px);
1380
+ gap: 10px;
1381
+ }
1382
+
1383
+ /* Ajuste de gap para variantes específicas no tamanho LG */
1384
+ voa-button[size="lg"][variant="tonal"]::part(base),
1385
+ voa-button[size="lg"][variant="ghost"]::part(base),
1386
+ voa-button[size="lg"][variant="link"]::part(base) {
1387
+ gap: var(--spacing-spacing-xs, 4px);
1388
+ }
1389
+
1390
+ /* ============================================
1391
+ VARIANTES (Type)
1392
+ ============================================ */
1393
+
1394
+ /* Primary */
1395
+ voa-button[variant="primary"]::part(base) {
1396
+ background-color: var(--brand-base, #0064cb);
1397
+ color: var(--text-on-primary, #f1f1f1);
1398
+ border: var(--border-width-thin) solid var(--structure-colors-fill-secondary, rgba(24, 24, 27, 0.06));
1399
+ }
1400
+
1401
+ voa-button[variant="primary"]:hover::part(base) {
1402
+ background-color: var(--brand-hover, #00398d);
1403
+ border-color: var(--brand-base-50, rgba(0, 100, 203, 0.5));
1404
+ }
1405
+
1406
+ voa-button[variant="primary"]:active::part(base) {
1407
+ background-color: var(--brand-active, #008fff);
1408
+ border-color: var(--structure-colors-fill-secondary, rgba(24, 24, 27, 0.06));
1409
+ }
1410
+
1411
+ /* Secondary */
1412
+ voa-button[variant="secondary"]::part(base) {
1413
+ background-color: var(--brand-secondary, #00e5ce);
1414
+ color: var(--text-primary, #0b1215);
1415
+ border: var(--border-width-thin) solid var(--structure-colors-fill-secondary, rgba(24, 24, 27, 0.06));
1416
+ }
1417
+
1418
+ voa-button[variant="secondary"]:hover::part(base) {
1419
+ /* Figma indica bg-secondary também no hover, talvez mude apenas borda ou sombra?
1420
+ Mantendo conforme token do Figma output */
1421
+ background-color: var(--brand-secondary, #00e5ce);
1422
+ border-color: var(--structure-colors-bg-mask, rgba(0, 0, 0, 0.45));
1423
+ }
1424
+
1425
+ voa-button[variant="secondary"]:active::part(base) {
1426
+ /* Figma indica gradient overlay, simplificado aqui para tokens se possível */
1427
+ background-color: var(--brand-secondary, #00e5ce);
1428
+ border-color: var(--structure-colors-fill-secondary, rgba(24, 24, 27, 0.06));
1429
+ }
1430
+
1431
+ /* Tonal */
1432
+ voa-button[variant="tonal"]::part(base) {
1433
+ background-color: var(--brand-base-25, rgba(0, 100, 203, 0.25));
1434
+ color: var(--text-primary, #0b1215);
1435
+ border: none;
1436
+ /* Nota: Figma não mostra borda explicita no default tonal LG,
1437
+ mas mostra borda transparente/base no disabled/active em alguns casos.
1438
+ Vamos manter sem borda ou borda transparente para evitar pulos de layout. */
1439
+ border: var(--border-width-thin) solid transparent;
1440
+ }
1441
+
1442
+ voa-button[variant="tonal"]:hover::part(base) {
1443
+ background-color: var(--brand-base-50, rgba(0, 100, 203, 0.5));
1444
+ }
1445
+
1446
+ voa-button[variant="tonal"]:active::part(base) {
1447
+ background-color: var(--brand-base-15, rgba(0, 100, 203, 0.15));
1448
+ }
1449
+
1450
+ /* Ghost */
1451
+ voa-button[variant="ghost"]::part(base) {
1452
+ background-color: transparent;
1453
+ color: var(--brand-base, #0064cb);
1454
+ border: var(--border-width-thin) solid var(--brand-base, #0064cb);
1455
+ }
1456
+
1457
+ voa-button[variant="ghost"]:hover::part(base) {
1458
+ border-color: var(--brand-hover, #00398d);
1459
+ color: var(--colors-light-secondary-light, #00e5ce); /* Figma output mostra cor secundária no hover? */
1460
+ }
1461
+
1462
+ voa-button[variant="ghost"]:active::part(base) {
1463
+ background-color: var(--brand-base-15, rgba(0, 100, 203, 0.15));
1464
+ border-color: var(--brand-base, #0064cb);
1465
+ color: var(--colors-light-secondary-light, #00e5ce);
1466
+ }
1467
+
1468
+ /* Link */
1469
+ voa-button[variant="link"]::part(base) {
1470
+ background-color: transparent;
1471
+ color: var(--palette-blue-blue-7, #1c7ed6);
1472
+ border: none;
1473
+ /* Mantendo borda transparente para consistência de box-model se necessário,
1474
+ mas link geralmente não tem borda. Figma não mostra borda. */
1475
+ }
1476
+
1477
+ voa-button[variant="link"]:hover::part(base) {
1478
+ color: var(--palette-blue-blue-9, #1864ab);
1479
+ text-decoration: underline;
1480
+ }
1481
+
1482
+ voa-button[variant="link"]:active::part(base) {
1483
+ color: var(--palette-blue-blue-6, #228be6);
1484
+ }
1485
+
1486
+ /* ============================================
1487
+ ESTADOS DISABLED E LOADING
1488
+ ============================================ */
1489
+
1490
+ /* Disabled state */
1491
+ voa-button[disabled]:not([loading])::part(base) {
1492
+ cursor: not-allowed;
1493
+
1494
+ /* Primary Disabled */
1495
+ background-color: var(--brand-base-15, rgba(0, 100, 203, 0.15));
1496
+ /* Border color fixed: using semantic token with opacity */
1497
+ border-color: var(--colors-structure-fill-secondary, rgba(24, 24, 27, 0.06));
1498
+ /* Text color fixed: using value with opacity (token is opaque) */
1499
+ color: rgba(11, 18, 21, 0.25);
1500
+ }
1501
+
1502
+ voa-button[variant="secondary"][disabled]:not([loading])::part(base) {
1503
+ background-color: var(--brand-secondary-15, rgba(0, 229, 206, 0.15));
1504
+ }
1505
+
1506
+ voa-button[variant="tonal"][disabled]:not([loading])::part(base) {
1507
+ /* Using token with opacity */
1508
+ background-color: var(--colors-structure-fill-15, rgba(24, 24, 27, 0.15));
1509
+ }
1510
+
1511
+ voa-button[variant="ghost"][disabled]:not([loading])::part(base) {
1512
+ background-color: transparent;
1513
+ /* Using token with opacity */
1514
+ border-color: var(--colors-structure-fill-15, rgba(24, 24, 27, 0.15));
1515
+ }
1516
+
1517
+ voa-button[variant="link"][disabled]:not([loading])::part(base) {
1518
+ background-color: transparent;
1519
+ color: var(--palette-blue-blue-2, #a5d8ff);
1520
+ }
1521
+
1522
+ /* Loading state */
1523
+ voa-button[loading]::part(base),
1524
+ voa-button.loading::part(base) {
1525
+ opacity: 0.7;
1526
+ cursor: not-allowed !important;
1527
+ pointer-events: none;
1528
+ }
1529
+
1530
+ /* ============================================
1531
+ FOCUS VISIBLE (Acessibilidade)
1532
+ ============================================ */
1533
+
1534
+ voa-button::part(base):focus-visible {
1535
+ outline: 2px solid var(--brand-base, #0064cb);
1536
+ outline-offset: 2px;
1537
+ }
1538
+
1539
+ /* ============================================
1540
+ ELEMENTOS INTERNOS
1541
+ ============================================ */
1542
+
1543
+ /* Label */
1544
+ voa-button::part(label) {
1545
+ display: inline-block;
1546
+ }
1547
+
1548
+ /* Ícones */
1549
+ voa-button::part(icon-leading),
1550
+ voa-button::part(icon-trailing) {
1551
+ display: inline-flex;
1552
+ width: 16px;
1553
+ height: 16px;
1554
+ }
1555
+
1556
+ voa-button::part(icon-leading) svg,
1557
+ voa-button::part(icon-trailing) svg {
1558
+ width: 100%;
1559
+ height: 100%;
1560
+ fill: currentColor;
1561
+ }
1562
+
1563
+ /* Loader */
1564
+ /* Note: @keyframes and animation are defined inside Shadow DOM (voa-button.css)
1565
+ because CSS Parts API cannot access @keyframes from external scope.
1566
+ Use CSS Custom Properties to customize: --voa-loader-size, --voa-loader-duration */
1567
+
1568
+ voa-button::part(loader) {
1569
+ /* Visual customization - size can override the internal default via CSS var */
1570
+ color: currentColor;
1571
+ }
1572
+
1573
+ voa-button[loading]::part(loader) {
1574
+ margin-right: var(--spacing-spacing-xs, 4px);
1575
+ }
1576
+
1577
+ /* ============================================
1578
+ voa-card.external.css
1579
+ ============================================ */
1580
+
1581
+ /**
1582
+ * External Styling for VoaCard
1583
+ *
1584
+ * Uses CSS Parts API and design tokens.
1585
+ */
1586
+
1587
+ voa-card::part(base) {
1588
+ background-color: var(--colors-structure-bg-base, #ffffff);
1589
+ border: 1px solid var(--colors-structure-border-color, #e5e7eb);
1590
+ border-radius: var(--radius-md, 8px);
1591
+ box-shadow: var(--shadow-sm, 0 1px 2px 0 rgba(0, 0, 0, 0.05));
1592
+ font-family: var(--font-family-sans, 'Lato', sans-serif);
1593
+ color: var(--text-primary, #111827);
1594
+ }
1595
+
1596
+ voa-card::part(header) {
1597
+ padding: var(--spacing-spacing-md, 16px);
1598
+ border-bottom: 1px solid var(--colors-structure-border-color, #e5e7eb);
1599
+ font-weight: 600;
1600
+ }
1601
+
1602
+ voa-card::part(body) {
1603
+ padding: var(--spacing-spacing-md, 16px);
1604
+ }
1605
+
1606
+ voa-card::part(footer) {
1607
+ padding: var(--spacing-spacing-md, 16px);
1608
+ border-top: 1px solid var(--colors-structure-border-color, #e5e7eb);
1609
+ background-color: var(--colors-structure-bg-container, #f9fafb);
1610
+ }
1611
+
1612
+ /* ============================================
1613
+ voa-checkbox.external.css
1614
+ ============================================ */
1615
+
1616
+ /**
1617
+ * Estilização Externa do VoaCheckbox
1618
+ *
1619
+ * Este arquivo demonstra como estilizar o componente voa-checkbox
1620
+ * usando CSS Parts API e design tokens semânticos.
1621
+ *
1622
+ * Baseado no design do Figma:
1623
+ * https://www.figma.com/design/wDStUEuqpl7Tu1oHpiAml6/Voa-Design-System?node-id=429-677
1624
+ *
1625
+ * Para usar, importe este arquivo após os tokens:
1626
+ * * *
1627
+ * MAPEAMENTO DE TOKENS DO FIGMA PARA STYLE DICTIONARY:
1628
+ *
1629
+ * Figma Token → Style Dictionary Token
1630
+ * --------------------------------------------
1631
+ * --structure-colors/bg-base → --structure-colors-bg-base (white)
1632
+ * --palette/blue/blue-6 → --palette-blue-blue-6 (#228be6)
1633
+ * --palette/blue/blue-8 → --palette-blue-blue-8 (#1971c2)
1634
+ * --palette/blue/blue-4 → --palette-blue-blue-4 (#4dabf7)
1635
+ * --structure-colors/border-color → --structure-colors-border-color (#adb5bd)
1636
+ * --asset-colors/brand-base-50 → --brand-base-50 (rgba(0,100,203,0.5))
1637
+ * --asset-colors/text-primary → --text-primary (#0b1215)
1638
+ * --asset-colors/text-hover → --text-hover (#0064cb)
1639
+ * --asset-colors/text-disabled → --text-disabled (rgba(11,18,21,0.25))
1640
+ * --spacing/spacing-sm → --spacing-spacing-sm (8px)
1641
+ * --border-radius/radius-sm → --radius-sm (4px)
1642
+ * --base/family/family-sans → --font-family-sans ('Lato')
1643
+ *
1644
+ * ESTRUTURA DO COMPONENTE INTERNALS (ElementInternals):
1645
+ *
1646
+ * O componente agora usa ElementInternals para sincronizar com o Form API nativo:
1647
+ * - setFormValue(): Define o valor que será submetido pelo formulário
1648
+ * - ariaChecked: Define o estado de acessibilidade ('true' | 'false' | 'mixed')
1649
+ * - ariaDisabled: Define se o componente está desabilitado para leitores de tela
1650
+ *
1651
+ * Estrutura do DOM renderizado:
1652
+ * <voa-checkbox>
1653
+ * <div part="base" class="checkbox-container">
1654
+ * <div part="indicator" class="checkbox-custom">
1655
+ * <!-- ::after renderiza o checkmark ou dash via CSS puro -->
1656
+ * </div>
1657
+ * <span part="label" class="checkbox-label">
1658
+ * <slot /> <!-- Conteúdo do label -->
1659
+ * </span>
1660
+ * </div>
1661
+ * </voa-checkbox>
1662
+ */
1663
+
1664
+ /* ============================================
1665
+ BASE - Container do checkbox
1666
+ ============================================ */
1667
+
1668
+ voa-checkbox::part(base) {
1669
+ /* Gap estrutural - Token semântico conforme Figma */
1670
+ gap: var(--structure-large-spacing-sm);
1671
+
1672
+ /* Tipografia - Semantic Token */
1673
+ font-family: var(--font-family-sans, 'Lato', sans-serif);
1674
+ font-size: var(--typography-base-type-scale-6);
1675
+ line-height: var(--line-height-body-md);
1676
+
1677
+ /* Transição suave para estados hover/active */
1678
+ transition: color 0.2s ease;
1679
+ }
1680
+
1681
+ /* Sem label, sem gap */
1682
+ voa-checkbox[show-label="false"]::part(base) {
1683
+ gap: 0;
1684
+ }
1685
+
1686
+ /* ============================================
1687
+ INDICATOR - Caixa do checkbox
1688
+ ============================================ */
1689
+
1690
+ /* Tamanho padrão (20px conforme Figma) */
1691
+ voa-checkbox::part(indicator) {
1692
+ width: var(--checkbox-indicator-size);
1693
+ height: var(--checkbox-indicator-size);
1694
+ border-radius: var(--structure-large-radius-xs);
1695
+ border: var(--border-width-thin) solid var(--structure-colors-border-color);
1696
+ background-color: var(--structure-colors-bg-base);
1697
+ box-sizing: border-box;
1698
+ transition: background-color 0.2s ease, border-color 0.2s ease, box-shadow 0.2s ease;
1699
+ }
1700
+
1701
+ /* ============================================
1702
+ ESTADOS - INACTIVE (Checkbox não selecionado)
1703
+ ============================================ */
1704
+
1705
+ /* Default - Inactive */
1706
+ voa-checkbox[state="inactive"]:not([disabled])::part(indicator) {
1707
+ background-color: var(--structure-colors-bg-base); /* white */
1708
+ border-color: var(--structure-colors-border-color); /* #adb5bd */
1709
+ }
1710
+
1711
+ voa-checkbox[state="inactive"]:not([disabled])::part(label) {
1712
+ color: var(--text-primary); /* #0b1215 */
1713
+ }
1714
+
1715
+ /* Hover - Inactive */
1716
+ voa-checkbox[state="inactive"]:hover:not([disabled])::part(indicator) {
1717
+ border-color: var(--palette-blue-blue-8); /* #1971c2 */
1718
+ }
1719
+
1720
+ voa-checkbox[state="inactive"]:hover:not([disabled])::part(label) {
1721
+ color: var(--text-hover); /* #0064cb */
1722
+ }
1723
+
1724
+ /* Focused - Inactive */
1725
+ voa-checkbox[state="inactive"]:focus-visible:not([disabled])::part(indicator) {
1726
+ border-color: #196cb8; /* Focused border color do Figma */
1727
+ box-shadow: var(--shadow-focus-primary);
1728
+ }
1729
+
1730
+ /* ============================================
1731
+ ESTADOS - ACTIVE (Checkbox selecionado)
1732
+ ============================================ */
1733
+
1734
+ /* Default - Active */
1735
+ voa-checkbox[state="active"]:not([disabled])::part(indicator) {
1736
+ background-color: var(--palette-blue-blue-6); /* #228be6 */
1737
+ border-color: var(--palette-blue-blue-8); /* #1971c2 */
1738
+ }
1739
+
1740
+ /*
1741
+ * CHECKMARK RENDERING via CSS pseudo-element ::after
1742
+ *
1743
+ * Structure:
1744
+ * - Uses ::after positioned absolutely within .checkbox-custom (part="indicator")
1745
+ * - The structural CSS sets: display: inline-flex; align-items: center; justify-content: center
1746
+ * - This ensures the ::after checkmark is centered perfectly within the 20x20 box
1747
+ *
1748
+ * Transform logic:
1749
+ * - translate(-50%, -50%): Center the element at the box center
1750
+ * - rotate(45deg): Rotate to create the checkmark angle
1751
+ *
1752
+ * Border drawing:
1753
+ * - border-right: 2px solid white (vertical part of checkmark)
1754
+ * - border-bottom: 2px solid white (horizontal part of checkmark)
1755
+ * - Creates an inverted "L" that looks like a checkmark when rotated
1756
+ */
1757
+ voa-checkbox[state="active"]:not([disabled])::part(indicator)::after {
1758
+ content: '';
1759
+ position: absolute;
1760
+ left: 50%;
1761
+ top: 50%;
1762
+ transform: translate(-50%, -50%) rotate(45deg);
1763
+ width: 4px;
1764
+ height: 8px;
1765
+ border-right: 2px solid white;
1766
+ border-bottom: 2px solid white;
1767
+ box-shadow: 0px 0.667px 0.333px 0.033px rgba(24, 24, 24, 0.05);
1768
+ }
1769
+
1770
+ voa-checkbox[state="active"]:not([disabled])::part(label) {
1771
+ color: var(--text-primary); /* #0b1215 */
1772
+ }
1773
+
1774
+ /* Hover - Active */
1775
+ voa-checkbox[state="active"]:hover:not([disabled])::part(indicator) {
1776
+ background-color: var(--palette-blue-blue-4); /* #4dabf7 - mais claro no hover */
1777
+ border-color: var(--palette-blue-blue-8); /* #1971c2 */
1778
+ }
1779
+
1780
+ voa-checkbox[state="active"]:hover:not([disabled])::part(label) {
1781
+ color: var(--text-hover); /* #0064cb */
1782
+ }
1783
+
1784
+ /* Focused - Active */
1785
+ voa-checkbox[state="active"]:focus-visible:not([disabled])::part(indicator) {
1786
+ box-shadow: var(--shadow-focus-primary);
1787
+ }
1788
+
1789
+ /* ============================================
1790
+ ESTADOS - INDETERMINATE (Checkbox indeterminado)
1791
+ ============================================ */
1792
+
1793
+ /* Default - Indeterminate */
1794
+ voa-checkbox[state="indeterminate"]:not([disabled])::part(indicator) {
1795
+ background-color: var(--palette-blue-blue-6); /* #228be6 */
1796
+ border-color: var(--palette-blue-blue-8); /* #1971c2 */
1797
+ }
1798
+
1799
+ /*
1800
+ * INDETERMINATE INDICATOR via CSS pseudo-element ::after
1801
+ *
1802
+ * Structure:
1803
+ * - Uses ::after positioned absolutely within .checkbox-custom (part="indicator")
1804
+ * - The structural CSS sets: display: inline-flex; align-items: center; justify-content: center
1805
+ * - This ensures the ::after dash is centered perfectly within the 20x20 box
1806
+ *
1807
+ * Transform logic:
1808
+ * - translate(-50%, -50%): Center the element at the box center
1809
+ * - Creates a simple horizontal dash
1810
+ */
1811
+ voa-checkbox[state="indeterminate"]:not([disabled])::part(indicator)::after {
1812
+ content: '';
1813
+ position: absolute;
1814
+ left: 50%;
1815
+ top: 50%;
1816
+ transform: translate(-50%, -50%);
1817
+ width: 8px;
1818
+ height: 2px;
1819
+ background-color: white;
1820
+ box-shadow: 0px 0.667px 0.333px 0.033px rgba(24, 24, 24, 0.05);
1821
+ }
1822
+
1823
+ voa-checkbox[state="indeterminate"]:not([disabled])::part(label) {
1824
+ color: var(--text-primary); /* #0b1215 */
1825
+ }
1826
+
1827
+ /* Hover - Indeterminate */
1828
+ voa-checkbox[state="indeterminate"]:hover:not([disabled])::part(indicator) {
1829
+ background-color: var(--palette-blue-blue-4); /* #4dabf7 */
1830
+ border-color: var(--palette-blue-blue-8); /* #1971c2 */
1831
+ }
1832
+
1833
+ voa-checkbox[state="indeterminate"]:hover:not([disabled])::part(label) {
1834
+ color: var(--text-hover); /* #0064cb */
1835
+ }
1836
+
1837
+ /* Focused - Indeterminate */
1838
+ voa-checkbox[state="indeterminate"]:focus-visible:not([disabled])::part(indicator) {
1839
+ box-shadow: var(--shadow-focus-primary);
1840
+ }
1841
+
1842
+ /* ============================================
1843
+ ESTADO - DISABLED
1844
+ ============================================ */
1845
+
1846
+ /* Disabled - Inactive */
1847
+ voa-checkbox[state="inactive"][disabled]::part(indicator) {
1848
+ background-color: rgba(255, 255, 255, 0.25);
1849
+ border-color: rgba(24, 24, 24, 0.06);
1850
+ cursor: not-allowed;
1851
+ }
1852
+
1853
+ voa-checkbox[state="inactive"][disabled]::part(label) {
1854
+ color: var(--text-disabled); /* rgba(11,18,21,0.25) */
1855
+ }
1856
+
1857
+ /* Disabled - Active */
1858
+ voa-checkbox[state="active"][disabled]::part(indicator) {
1859
+ background-color: rgba(255, 255, 255, 0.25);
1860
+ border-color: rgba(24, 24, 24, 0.25);
1861
+ cursor: not-allowed;
1862
+ }
1863
+
1864
+ voa-checkbox[state="active"][disabled]::part(indicator)::after {
1865
+ opacity: 0.5;
1866
+ }
1867
+
1868
+ voa-checkbox[state="active"][disabled]::part(label) {
1869
+ color: var(--text-disabled); /* rgba(11,18,21,0.25) */
1870
+ }
1871
+
1872
+ /* Disabled - Indeterminate */
1873
+ voa-checkbox[state="indeterminate"][disabled]::part(indicator) {
1874
+ background-color: rgba(255, 255, 255, 0.25);
1875
+ border-color: rgba(24, 24, 24, 0.25);
1876
+ cursor: not-allowed;
1877
+ }
1878
+
1879
+ voa-checkbox[state="indeterminate"][disabled]::part(indicator)::after {
1880
+ opacity: 0.5;
1881
+ }
1882
+
1883
+ voa-checkbox[state="indeterminate"][disabled]::part(label) {
1884
+ color: var(--text-disabled); /* rgba(11,18,21,0.25) */
1885
+ }
1886
+
1887
+ /* ============================================
1888
+ LABEL - Texto do label
1889
+ ============================================ */
1890
+
1891
+ voa-checkbox::part(label) {
1892
+ color: var(--text-primary); /* #0b1215 */
1893
+ user-select: none;
1894
+ }
1895
+
1896
+ /* ============================================
1897
+ INPUT - Elemento nativo (visualmente oculto)
1898
+ ============================================ */
1899
+
1900
+ voa-checkbox::part(input) {
1901
+ /* Já está oculto no CSS estrutural, apenas garantir que não interfira */
1902
+ position: absolute;
1903
+ opacity: 0;
1904
+ width: 0;
1905
+ height: 0;
1906
+ }
1907
+
1908
+ /* ============================================
1909
+ FOCUS VISIBLE - Outline para acessibilidade
1910
+ ============================================ */
1911
+
1912
+ voa-checkbox:focus-visible::part(base) {
1913
+ outline: 2px solid var(--brand-base);
1914
+ outline-offset: 2px;
1915
+ border-radius: var(--radius-xs);
1916
+ }
1917
+
1918
+ /* ============================================
1919
+ voa-input-addon.external.css
1920
+ ============================================ */
1921
+
1922
+ /*
1923
+ * VoaInputAddon Component Styles
1924
+ *
1925
+ * Estilos aplicados via CSS Parts API usando design tokens semânticos.
1926
+ * Baseado no design do Figma: https://www.figma.com/design/wDStUEuqpl7Tu1oHpiAml6/Voa-Design-System?node-id=438-2157
1927
+ *
1928
+ * Typography Tokens:
1929
+ * - Desktop/Body-md/Bold: font-family: var(--base/family/family-sans, 'Lato'), font-weight: var(--typography-base-body-sm-bold-weight), font-size: 16px, line-height: 24px
1930
+ * - Desktop/Body-sm/Regular: font-family: var(--base/family/family-sans, 'Lato'), font-weight: var(--typography-base-body-sm-regular-weight), font-size: 14px, line-height: 16px
1931
+ * - Desktop/Body-sm/Bold: font-family: var(--base/family/family-sans, 'Lato'), font-weight: var(--typography-base-body-sm-bold-weight), font-size: 14px, line-height: 16px
1932
+ */
1933
+
1934
+ /* Base */
1935
+ voa-input-addon::part(base) {
1936
+ display: flex;
1937
+ align-items: center;
1938
+ box-sizing: border-box;
1939
+ flex-shrink: 0;
1940
+ flex-grow: 0;
1941
+ height: 46px;
1942
+ }
1943
+
1944
+ voa-input-addon--interactive::part(base) {
1945
+ cursor: pointer;
1946
+ user-select: none;
1947
+ }
1948
+
1949
+ voa-input-addon--interactive::part(base):hover {
1950
+ opacity: 0.8;
1951
+ }
1952
+
1953
+ voa-input-addon--interactive::part(base):focus-visible {
1954
+ outline: 2px solid var(--brand-base);
1955
+ outline-offset: 2px;
1956
+ }
1957
+
1958
+ /* Content */
1959
+ voa-input-addon::part(content) {
1960
+ display: flex;
1961
+ align-items: center;
1962
+ gap: var(--spacing-spacing-xxs, 2px);
1963
+ height: 100%;
1964
+ flex-shrink: 0;
1965
+ }
1966
+
1967
+ /* Text - Desktop/Body-md/Bold */
1968
+ voa-input-addon::part(text) {
1969
+ font-family: var(--typography-base-family-sans, 'Lato', sans-serif);
1970
+ font-size: var(--typography-base-type-scale-6, 16px);
1971
+ font-weight: var(--typography-base-body-sm-bold-weight, 600);
1972
+ line-height: 24px;
1973
+ color: var(--text-placeholder, #9f9fa8);
1974
+ }
1975
+
1976
+ /* Variante: Label */
1977
+ voa-input-addon[variant="label"]::part(base) {
1978
+ background-color: var(--palette-gray-gray-2, #e9ecef);
1979
+ border-right: 1px solid var(--palette-gray-gray-2, #e9ecef);
1980
+ padding: 10px var(--structure-large-spacing-rg, 12px) 10px 10px;
1981
+ }
1982
+
1983
+ voa-input-addon[variant="label"]::part(content) {
1984
+ gap: 10px;
1985
+ }
1986
+
1987
+ /* Variante: Select */
1988
+ voa-input-addon[variant="select"]::part(base) {
1989
+ background-color: var(--palette-gray-gray-2, #e9ecef);
1990
+ border-right: 1px solid var(--palette-gray-gray-2, #e9ecef);
1991
+ padding: 10px var(--spacing-spacing-xxs, 2px) 10px 10px;
1992
+ }
1993
+
1994
+ voa-input-addon[variant="select"]::part(dropdown-icon) {
1995
+ width: 24px;
1996
+ height: 24px;
1997
+ color: var(--text-placeholder, #9f9fa8);
1998
+ }
1999
+
2000
+ /* Variante: Flags */
2001
+ voa-input-addon[variant="flags"]::part(base) {
2002
+ background-color: var(--palette-gray-gray-2, #e9ecef);
2003
+ padding: var(--structure-large-spacing-rg, 12px) 0 var(--structure-large-spacing-rg, 12px) var(--structure-large-spacing-rg, 12px);
2004
+ }
2005
+
2006
+ voa-input-addon[variant="flags"]::part(content) {
2007
+ gap: 0;
2008
+ }
2009
+
2010
+ voa-input-addon[variant="flags"]::part(icon) {
2011
+ width: 24px;
2012
+ height: 24px;
2013
+ background-color: var(--palette-gray-gray-6, #868e96);
2014
+ border-radius: 100px;
2015
+ flex-shrink: 0;
2016
+ }
2017
+
2018
+ voa-input-addon[variant="flags"]::part(text) {
2019
+ padding-left: var(--spacing-spacing-xs, 4px);
2020
+ font-family: var(--typography-base-family-sans, 'Lato', sans-serif);
2021
+ font-size: var(--typography-base-body-sm-regular-size, 14px);
2022
+ font-weight: var(--typography-base-body-sm-regular-weight, 400);
2023
+ line-height: var(--typography-base-body-sm-regular-line-height, 16px);
2024
+ color: var(--palette-gray-gray-6, #868e96);
2025
+ }
2026
+
2027
+ voa-input-addon[variant="flags"]::part(dropdown-icon) {
2028
+ width: 24px;
2029
+ height: 24px;
2030
+ color: var(--text-placeholder, #9f9fa8);
2031
+ }
2032
+
2033
+ /* Variante: Button */
2034
+ voa-input-addon[variant="button"]::part(base) {
2035
+ padding: var(--spacing-spacing-xs, 4px);
2036
+ gap: var(--spacing-spacing-xs, 4px);
2037
+ }
2038
+
2039
+ voa-input-addon[variant="button"]::part(content) {
2040
+ background-color: var(--palette-gray-gray-3, #dee2e6);
2041
+ border: var(--border-width-thin) solid var(--palette-gray-gray-5, #adb5bd);
2042
+ border-radius: var(--structure-large-radius-md, 12px);
2043
+ padding: var(--spacing-spacing-xs, 4px) var(--spacing-spacing-sm, 8px);
2044
+ gap: var(--spacing-spacing-xxs, 2px);
2045
+ justify-content: center;
2046
+ height: 100%;
2047
+ }
2048
+
2049
+ voa-input-addon[variant="button"]::part(text) {
2050
+ font-family: var(--typography-base-family-sans, 'Lato', sans-serif);
2051
+ font-size: var(--typography-base-body-sm-regular-size, 14px);
2052
+ font-weight: var(--typography-base-body-sm-bold-weight, 600);
2053
+ line-height: var(--typography-base-body-sm-regular-line-height, 16px);
2054
+ color: var(--palette-gray-gray-6, #868e96);
2055
+ }
2056
+
2057
+ /* Variante: Clear */
2058
+ voa-input-addon[variant="clear"]::part(base) {
2059
+ padding: 11px var(--structure-large-spacing-rg, 12px);
2060
+ gap: 10px;
2061
+ }
2062
+
2063
+ voa-input-addon[variant="clear"]::part(content) {
2064
+ gap: 10px;
2065
+ }
2066
+
2067
+ voa-input-addon[variant="clear"]::part(icon) {
2068
+ width: 24px;
2069
+ height: 24px;
2070
+ color: #76767f; /* Figma spec: rgba(118, 118, 127, 1) */
2071
+ }
2072
+
2073
+ /* Variante: Shortcut */
2074
+ voa-input-addon[variant="shortcut"]::part(base) {
2075
+ gap: var(--spacing-spacing-xs, 4px);
2076
+ }
2077
+
2078
+ voa-input-addon[variant="shortcut"]::part(content) {
2079
+ gap: var(--spacing-spacing-xs, 4px);
2080
+ }
2081
+
2082
+ /* Note: Shortcut variant uses voa-keybinding component internally */
2083
+ /* Style voa-keybinding separately if needed */
2084
+
2085
+ /* Variante: Currency-pre */
2086
+ voa-input-addon[variant="currency-pre"]::part(base) {
2087
+ padding: 10px;
2088
+ gap: 10px;
2089
+ }
2090
+
2091
+ voa-input-addon[variant="currency-pre"]::part(content) {
2092
+ gap: 10px;
2093
+ }
2094
+
2095
+ voa-input-addon[variant="currency-pre"]::part(text) {
2096
+ font-family: 'Manrope', sans-serif;
2097
+ font-size: var(--typography-base-type-scale-6, 16px);
2098
+ font-weight: var(--typography-base-body-sm-bold-weight, 600);
2099
+ line-height: 24px;
2100
+ color: var(--text-placeholder, #9f9fa8);
2101
+ }
2102
+
2103
+ /* Variante: Currency-post */
2104
+ voa-input-addon[variant="currency-post"]::part(base) {
2105
+ gap: var(--spacing-spacing-sm, 8px);
2106
+ }
2107
+
2108
+ voa-input-addon[variant="currency-post"]::part(content) {
2109
+ gap: var(--spacing-spacing-sm, 8px);
2110
+ }
2111
+
2112
+ voa-input-addon[variant="currency-post"]::part(text) {
2113
+ font-family: var(--typography-base-family-sans, 'Lato', sans-serif);
2114
+ font-size: var(--typography-base-body-sm-regular-size, 14px);
2115
+ font-weight: var(--typography-base-body-sm-bold-weight, 600);
2116
+ line-height: var(--typography-base-body-sm-regular-line-height, 16px);
2117
+ color: var(--palette-gray-gray-6, #868e96);
2118
+ }
2119
+
2120
+ voa-input-addon[variant="currency-post"]::part(dropdown-icon) {
2121
+ width: 24px;
2122
+ height: 24px;
2123
+ color: var(--text-placeholder, #9f9fa8);
2124
+ }
2125
+
2126
+ /* ============================================
2127
+ voa-input.external.css
2128
+ ============================================ */
2129
+
2130
+ /*
2131
+ * VoaInput Component Styles
2132
+ *
2133
+ * Estilos aplicados via CSS Parts API usando design tokens semânticos.
2134
+ * Baseado no design do Figma: https://www.figma.com/design/wDStUEuqpl7Tu1oHpiAml6/Voa-Design-System?node-id=437-2006
2135
+ */
2136
+
2137
+ /* Input Container */
2138
+ voa-input::part(container) {
2139
+ background-color: var(--colors-structure-bg-base, #ffffff);
2140
+ border: var(--border-width-medium) solid var(--structure-colors-border-color, #adb5bd);
2141
+ border-radius: var(--structure-large-radius-lg, 16px);
2142
+ padding: var(--structure-large-spacing-rg, 12px);
2143
+ gap: var(--structure-large-spacing-sm, 8px);
2144
+ transition: border-color 0.2s ease, box-shadow 0.2s ease;
2145
+ box-shadow: var(--voa-shadow-input);
2146
+ }
2147
+
2148
+ /* Quando há prefix ou suffix, remover padding do container mas manter altura */
2149
+ voa-input[data-has-prefix="true"]::part(container),
2150
+ voa-input[data-has-suffix="true"]::part(container) {
2151
+ padding: 0;
2152
+ gap: 0;
2153
+ align-items: stretch;
2154
+ }
2155
+
2156
+ /* Garantir que addons não redimensionem o container */
2157
+ voa-input[data-has-prefix="true"]::part(prefix),
2158
+ voa-input[data-has-suffix="true"]::part(suffix) {
2159
+ align-self: stretch;
2160
+ display: flex;
2161
+ align-items: center;
2162
+ margin: 0;
2163
+ padding: 0;
2164
+ }
2165
+
2166
+ /* Padding do input quando há addons - apenas nas laterais sem addon */
2167
+ voa-input[data-has-prefix="true"]:not([data-has-suffix="true"])::part(input) {
2168
+ padding: 0;
2169
+ padding-right: var(--structure-large-spacing-rg, 12px);
2170
+ }
2171
+
2172
+ voa-input[data-has-suffix="true"]:not([data-has-prefix="true"])::part(input) {
2173
+ padding: 0;
2174
+ padding-left: var(--structure-large-spacing-rg, 12px);
2175
+ }
2176
+
2177
+ voa-input[data-has-prefix="true"][data-has-suffix="true"]::part(input) {
2178
+ padding: 0;
2179
+ }
2180
+
2181
+ /* Padding padrão do input quando não há addons */
2182
+ voa-input:not([data-has-prefix="true"]):not([data-has-suffix="true"])::part(input) {
2183
+ padding: 0 var(--structure-large-spacing-rg, 12px);
2184
+ }
2185
+
2186
+ voa-input[size="sm"]::part(container) {
2187
+ padding: var(--structure-large-spacing-sm, 8px);
2188
+ height: 32px;
2189
+ max-height: 32px;
2190
+ }
2191
+
2192
+ voa-input[size="sm"][data-has-prefix="true"]::part(container),
2193
+ voa-input[size="sm"][data-has-suffix="true"]::part(container) {
2194
+ padding: 0;
2195
+ gap: 0;
2196
+ height: 32px;
2197
+ max-height: 32px;
2198
+ }
2199
+
2200
+ voa-input[size="sm"][data-has-prefix="true"]:not([data-has-suffix="true"])::part(input) {
2201
+ padding: 0;
2202
+ padding-right: var(--structure-large-spacing-sm, 8px);
2203
+ }
2204
+
2205
+ voa-input[size="sm"][data-has-suffix="true"]:not([data-has-prefix="true"])::part(input) {
2206
+ padding: 0;
2207
+ padding-left: var(--structure-large-spacing-sm, 8px);
2208
+ }
2209
+
2210
+ voa-input[size="sm"][data-has-prefix="true"][data-has-suffix="true"]::part(input) {
2211
+ padding: 0;
2212
+ }
2213
+
2214
+ voa-input[size="sm"]:not([data-has-prefix="true"]):not([data-has-suffix="true"])::part(input) {
2215
+ padding: 0 var(--structure-large-spacing-sm, 8px);
2216
+ }
2217
+
2218
+ voa-input[size="md"]::part(container) {
2219
+ padding: var(--structure-large-spacing-rg, 12px);
2220
+ height: 48px;
2221
+ max-height: 48px;
2222
+ }
2223
+
2224
+ voa-input[size="md"][data-has-prefix="true"]::part(container),
2225
+ voa-input[size="md"][data-has-suffix="true"]::part(container) {
2226
+ padding: 0;
2227
+ gap: 0;
2228
+ height: 48px;
2229
+ max-height: 48px;
2230
+ }
2231
+
2232
+ voa-input[size="md"][data-has-prefix="true"]:not([data-has-suffix="true"])::part(input) {
2233
+ padding: 0;
2234
+ padding-right: var(--structure-large-spacing-rg, 12px);
2235
+ }
2236
+
2237
+ voa-input[size="md"][data-has-suffix="true"]:not([data-has-prefix="true"])::part(input) {
2238
+ padding: 0;
2239
+ padding-left: var(--structure-large-spacing-rg, 12px);
2240
+ }
2241
+
2242
+ voa-input[size="md"][data-has-prefix="true"][data-has-suffix="true"]::part(input) {
2243
+ padding: 0;
2244
+ }
2245
+
2246
+ voa-input[size="md"]:not([data-has-prefix="true"]):not([data-has-suffix="true"])::part(input) {
2247
+ padding: 0 var(--structure-large-spacing-rg, 12px);
2248
+ }
2249
+
2250
+ voa-input[size="lg"]::part(container) {
2251
+ padding: var(--structure-large-spacing-rg, 12px);
2252
+ height: 56px;
2253
+ max-height: 56px;
2254
+ }
2255
+
2256
+ voa-input[size="lg"][data-has-prefix="true"]::part(container),
2257
+ voa-input[size="lg"][data-has-suffix="true"]::part(container) {
2258
+ padding: 0;
2259
+ gap: 0;
2260
+ height: 56px;
2261
+ max-height: 56px;
2262
+ }
2263
+
2264
+ voa-input[size="lg"][data-has-prefix="true"]:not([data-has-suffix="true"])::part(input) {
2265
+ padding: 0;
2266
+ padding-right: var(--structure-large-spacing-rg, 12px);
2267
+ }
2268
+
2269
+ voa-input[size="lg"][data-has-suffix="true"]:not([data-has-prefix="true"])::part(input) {
2270
+ padding: 0;
2271
+ padding-left: var(--structure-large-spacing-rg, 12px);
2272
+ }
2273
+
2274
+ voa-input[size="lg"][data-has-prefix="true"][data-has-suffix="true"]::part(input) {
2275
+ padding: 0;
2276
+ }
2277
+
2278
+ voa-input[size="lg"]:not([data-has-prefix="true"]):not([data-has-suffix="true"])::part(input) {
2279
+ padding: 0 var(--structure-large-spacing-rg, 12px);
2280
+ }
2281
+
2282
+ /* Input element */
2283
+ voa-input::part(input) {
2284
+ font-family: var(--typography-base-family-sans, 'Lato', sans-serif);
2285
+ font-size: var(--typography-base-type-scale-6, 16px);
2286
+ line-height: var(--typography-base-type-scale-4, 24px);
2287
+ color: var(--text-primary, #0b1215);
2288
+ background-color: transparent;
2289
+ border: none;
2290
+ outline: none;
2291
+ flex: 1 1 0%;
2292
+ min-width: 0;
2293
+ width: 100%;
2294
+ height: 100%;
2295
+ box-sizing: border-box;
2296
+ padding: 0;
2297
+ }
2298
+
2299
+ voa-input::part(input)::placeholder {
2300
+ color: var(--text-placeholder, #9f9fa8);
2301
+ }
2302
+
2303
+ /* Title Row & Label */
2304
+ voa-input::part(title-row) {
2305
+ margin-bottom: 6px;
2306
+ }
2307
+
2308
+ voa-input::part(label) {
2309
+ font-family: var(--typography-base-family-sans, 'Lato', sans-serif);
2310
+ font-size: var(--typography-base-type-scale-5, 20px);
2311
+ font-weight: var(--typography-base-body-sm-bold-weight);
2312
+ line-height: 32px;
2313
+ color: var(--text-secondary, #495057);
2314
+ display: block;
2315
+ }
2316
+
2317
+ /* Info */
2318
+ voa-input::part(info) {
2319
+ color: var(--text-secondary, #495057);
2320
+ font-family: var(--typography-base-family-sans, 'Lato', sans-serif);
2321
+ font-size: var(--typography-base-type-scale-8, 12px);
2322
+ line-height: var(--typography-base-body-sm-regular-line-height, 16px);
2323
+ padding-bottom: 6px; /* Align with label baseline visually */
2324
+ }
2325
+
2326
+ voa-input::part(info-icon) {
2327
+ color: var(--text-secondary, #495057);
2328
+ }
2329
+
2330
+ voa-input .voa-input__required-indicator {
2331
+ color: var(--semantic-colors-danger, #e51937);
2332
+ margin-left: var(--structure-large-spacing-xxs, 2px);
2333
+ }
2334
+
2335
+ /* Helper text */
2336
+ voa-input::part(helper-text) {
2337
+ font-family: var(--typography-base-family-sans, 'Lato', sans-serif);
2338
+ font-size: var(--typography-base-body-sm-regular-size, 14px);
2339
+ line-height: var(--typography-base-body-sm-regular-line-height, 16px);
2340
+ color: var(--text-secondary, #495057);
2341
+ margin-top: 6px;
2342
+ display: block;
2343
+ }
2344
+
2345
+ voa-input[error]::part(helper-text) {
2346
+ color: var(--semantic-colors-danger, #e51937);
2347
+ }
2348
+
2349
+ voa-input[valid]::part(helper-text) {
2350
+ color: var(--semantic-colors-success, #109e7c);
2351
+ }
2352
+
2353
+ voa-input[warning]::part(helper-text) {
2354
+ color: var(--semantic-colors-warning, #ff9900);
2355
+ }
2356
+
2357
+ /* States - Hover */
2358
+ voa-input:not([disabled]):not([readonly]):hover::part(container) {
2359
+ border-color: var(--input-hover-border-color, var(--brand-base, #0064cb));
2360
+ background-color: var(--palette-gray-gray-1, #f1f3f5);
2361
+ }
2362
+
2363
+ /* States - Focused */
2364
+ voa-input:focus-within::part(container) {
2365
+ border-color: var(--input-focus-border-color, var(--brand-base, #0064cb));
2366
+ box-shadow: var(--input-active-inner-shadow, inset 0px 0px 8px 2px rgba(0, 100, 203, 0.5)),
2367
+ var(--input-active-drop-shadow, 0px 4px 4px rgba(24, 24, 27, 0.15));
2368
+ }
2369
+
2370
+ /* States - Error */
2371
+ voa-input[error]::part(container) {
2372
+ border-color: var(--semantic-colors-danger, #e51937);
2373
+ }
2374
+
2375
+ voa-input[error]:focus-within::part(container) {
2376
+ border-color: var(--semantic-colors-danger, #e51937);
2377
+ box-shadow: inset 0px 0px 8px 2px var(--semantic-colors-danger, #e51937),
2378
+ var(--input-active-drop-shadow, 0px 4px 4px rgba(24, 24, 27, 0.15));
2379
+ }
2380
+
2381
+ /* States - Valid */
2382
+ voa-input[valid]::part(container) {
2383
+ border-color: var(--semantic-colors-success, #109e7c);
2384
+ }
2385
+
2386
+ voa-input[valid]:focus-within::part(container) {
2387
+ border-color: var(--semantic-colors-success, #109e7c);
2388
+ box-shadow: inset 0px 0px 8px 2px var(--semantic-colors-success, #109e7c),
2389
+ var(--input-active-drop-shadow, 0px 4px 4px rgba(24, 24, 27, 0.15));
2390
+ }
2391
+
2392
+ /* States - Warning */
2393
+ voa-input[warning]::part(container) {
2394
+ border-color: var(--semantic-colors-warning, #ff9900);
2395
+ }
2396
+
2397
+ voa-input[warning]:focus-within::part(container) {
2398
+ border-color: var(--semantic-colors-warning, #ff9900);
2399
+ box-shadow: inset 0px 0px 8px 2px var(--semantic-colors-warning, #ff9900),
2400
+ var(--input-active-drop-shadow, 0px 4px 4px rgba(24, 24, 27, 0.15));
2401
+ }
2402
+
2403
+ /* States - Disabled */
2404
+ voa-input[disabled]::part(container) {
2405
+ background-color: var(--colors-structure-bg-base-disabled, rgba(255, 255, 255, 0.25));
2406
+ border-color: var(--structure-colors-border-color-secondary, #dee2e6);
2407
+ opacity: 0.6;
2408
+ cursor: not-allowed;
2409
+ }
2410
+
2411
+ voa-input[disabled]::part(input) {
2412
+ color: var(--text-disabled, #0b1215);
2413
+ cursor: not-allowed;
2414
+ }
2415
+
2416
+ /* States - Readonly */
2417
+ voa-input[readonly]::part(container) {
2418
+ background-color: var(--colors-structure-bg-container, #f1f3f5);
2419
+ }
2420
+
2421
+ /* Prefix/Suffix slots */
2422
+ voa-input::part(prefix),
2423
+ voa-input::part(suffix) {
2424
+ display: flex;
2425
+ align-items: center;
2426
+ flex-shrink: 0;
2427
+ flex-grow: 0;
2428
+ width: auto;
2429
+ min-width: 0;
2430
+ }
2431
+
2432
+ /* Unfilled variant */
2433
+ voa-input[fill="false"]::part(container) {
2434
+ background-color: transparent;
2435
+ box-shadow: none;
2436
+ }
2437
+
2438
+ /* ============================================
2439
+ voa-keybinding.external.css
2440
+ ============================================ */
2441
+
2442
+ /*
2443
+ * VoaKeybinding Component Styles
2444
+ *
2445
+ * Estilos aplicados via CSS Parts API usando design tokens semânticos.
2446
+ * Baseado no design do Figma: https://www.figma.com/design/wDStUEuqpl7Tu1oHpiAml6/Voa-Design-System?node-id=439-2322
2447
+ */
2448
+
2449
+ voa-keybinding::part(base) {
2450
+ display: inline-flex;
2451
+ align-items: center;
2452
+ gap: var(--spacing-spacing-xxs, 2px);
2453
+ border: var(--border-width-thin) solid var(--structure-colors-border-color);
2454
+ border-radius: var(--structure-large-radius-sm);
2455
+ padding: var(--structure-large-radius-xs) var(--structure-large-spacing-xs);
2456
+ background-color: transparent;
2457
+ }
2458
+
2459
+ voa-keybinding::part(key-icon) {
2460
+ display: flex;
2461
+ align-items: center;
2462
+ justify-content: center;
2463
+ width: 16px;
2464
+ height: 16px;
2465
+ color: var(--palette-gray-gray-6, #868e96);
2466
+ }
2467
+
2468
+ voa-keybinding::part(key-text) {
2469
+ font-family: var(--font-family-sans, 'Lato', sans-serif);
2470
+ font-size: var(--typography-base-body-sm-regular-size);
2471
+ font-weight: var(--typography-base-body-sm-bold-weight);
2472
+ line-height: normal;
2473
+ color: var(--palette-gray-gray-6, #868e96);
2474
+ }
2475
+
2476
+ /* ============================================
2477
+ voa-option.external.css
2478
+ ============================================ */
2479
+
2480
+ /**
2481
+ * Estilização Externa do VoaOption
2482
+ *
2483
+ * Este arquivo demonstra como estilizar o componente voa-option
2484
+ * usando CSS Parts API e design tokens semânticos.
2485
+ *
2486
+ * Baseado no design do Figma:
2487
+ * https://www.figma.com/design/wDStUEuqpl7Tu1oHpiAml6/Voa-Design-System?node-id=1182-56
2488
+ *
2489
+ * Para usar, importe este arquivo após os tokens:
2490
+ * * */
2491
+
2492
+ /* ============================================
2493
+ BASE - Container raiz do option
2494
+ ============================================ */
2495
+
2496
+ voa-option::part(base) {
2497
+ /* Gap entre indicator e label - Semantic Token conforme Figma */
2498
+ gap: var(--voa-spacing-sm);
2499
+
2500
+ /* Transição suave para estados */
2501
+ transition: color 0.2s ease;
2502
+ }
2503
+
2504
+ /* Sem label, sem gap */
2505
+ voa-option:not([label])::part(base) {
2506
+ gap: 0;
2507
+ }
2508
+
2509
+ /* ============================================
2510
+ INDICATOR - Componente radio visual
2511
+ ============================================ */
2512
+
2513
+ voa-option::part(indicator) {
2514
+ /* O indicator externo gerencia o espaçamento e layout */
2515
+ flex-shrink: 0;
2516
+
2517
+ /* Border around the radio circle - Default state (unchecked) */
2518
+ border: var(--border-width-thin) solid var(--structure-colors-bg-base, #ffffff);
2519
+ border-radius: 50%;
2520
+ background-color: var(--structure-colors-bg-base, #ffffff);
2521
+ transition: border-color 0.2s ease, background-color 0.2s ease, box-shadow 0.2s ease;
2522
+ box-shadow: inset 0 0 0 1px rgba(24, 24, 27, 0.2);
2523
+ }
2524
+
2525
+ /* Checked indicator - Primary blue state */
2526
+ voa-option[checked]:not([disabled])::part(indicator) {
2527
+ border-color: var(--colors-light-primary-light, #0064cb);
2528
+ background-color: var(--colors-light-primary-light, #0064cb);
2529
+ box-shadow: 0 0 0 3px rgba(0, 100, 203, 0.1);
2530
+ }
2531
+
2532
+ /* Hover indicator - Unchecked */
2533
+ voa-option:not([disabled]):not([checked]):hover::part(indicator) {
2534
+ border-color: rgba(24, 24, 27, 0.3);
2535
+ box-shadow: inset 0 0 0 1px rgba(24, 24, 27, 0.3);
2536
+ }
2537
+
2538
+ /* Hover indicator - Checked */
2539
+ voa-option[checked]:not([disabled]):hover::part(indicator) {
2540
+ border-color: var(--colors-light-primary-light-400, #0071c8);
2541
+ background-color: var(--colors-light-primary-light-400, #0071c8);
2542
+ box-shadow: 0 0 0 3px var(--colors-light-primary-light-opacity-15);
2543
+ }
2544
+
2545
+ /* Focus indicator - Unchecked */
2546
+ voa-option:not([disabled]):not([checked]):focus-visible::part(indicator) {
2547
+ border-color: var(--colors-light-secondary-light, #00e5ce);
2548
+ box-shadow: inset 0 0 0 1px var(--colors-light-secondary-light, #00e5ce), 0 0 0 3px var(--colors-light-secondary-light-100, #b5eee3);
2549
+ }
2550
+
2551
+ /* Focus indicator - Checked */
2552
+ voa-option[checked]:not([disabled]):focus-visible::part(indicator) {
2553
+ border-color: var(--colors-light-secondary-light, #00e5ce);
2554
+ background-color: var(--colors-light-primary-light, #0064cb);
2555
+ box-shadow: 0 0 0 2px var(--structure-colors-bg-base, #ffffff), 0 0 0 4px var(--colors-light-secondary-light, #00e5ce);
2556
+ }
2557
+
2558
+ /* Disabled indicator border */
2559
+ voa-option[disabled]::part(indicator) {
2560
+ border-color: var(--colors-structure-fill-15);
2561
+ background-color: var(--colors-structure-fill-quaternary);
2562
+ opacity: 0.6;
2563
+ box-shadow: inset 0 0 0 1px var(--colors-structure-fill-terciary);
2564
+ }
2565
+
2566
+ /* ============================================
2567
+ INDICATOR-DOT - Ponto interior do radio
2568
+ ============================================ */
2569
+
2570
+ voa-option::part(indicator-dot) {
2571
+ /* Size e visibility são controlados pelos states abaixo */
2572
+ width: 0;
2573
+ height: 0;
2574
+ background-color: var(--structure-colors-bg-base, #ffffff);
2575
+ border-radius: 50%;
2576
+ transition: width 0.2s ease, height 0.2s ease;
2577
+ }
2578
+
2579
+ /* Checked - Dot aparece com cor branca */
2580
+ voa-option[checked]:not([disabled])::part(indicator-dot) {
2581
+ width: var(--option-indicator-dot-size);
2582
+ height: var(--option-indicator-dot-size);
2583
+ background-color: var(--structure-colors-bg-base, #ffffff);
2584
+ }
2585
+
2586
+ /* Disabled checked - Dot com opacidade */
2587
+ voa-option[disabled][checked]::part(indicator-dot) {
2588
+ width: var(--option-indicator-dot-size);
2589
+ height: var(--option-indicator-dot-size);
2590
+ background-color: rgba(255, 255, 255, 0.7);
2591
+ }
2592
+
2593
+ /* ============================================
2594
+ LABEL - Texto da opção
2595
+ ============================================ */
2596
+
2597
+ voa-option::part(label) {
2598
+ /* Tipografia - Semantic Token conforme Figma */
2599
+ font-family: var(--font-family-sans, 'Lato', sans-serif);
2600
+ font-size: var(--typography-base-type-scale-6);
2601
+ line-height: var(--line-height-body-md);
2602
+ font-weight: var(--typography-base-body-sm-regular-weight);
2603
+
2604
+ /* Cor padrão - Texto base */
2605
+ color: rgba(24, 24, 27, 1);
2606
+
2607
+ /* User select desabilitado */
2608
+ user-select: none;
2609
+
2610
+ /* Transição suave para estados hover/focus */
2611
+ transition: color 0.2s ease;
2612
+ }
2613
+
2614
+ /* ============================================
2615
+ ESTADOS - Default
2616
+ ============================================ */
2617
+
2618
+ /* Default - Unchecked */
2619
+ voa-option:not([checked])::part(label) {
2620
+ color: rgba(24, 24, 27, 1);
2621
+ }
2622
+
2623
+ /* Default - Checked */
2624
+ voa-option[checked]::part(label) {
2625
+ color: rgba(24, 24, 27, 1);
2626
+ }
2627
+
2628
+ /* ============================================
2629
+ ESTADOS - Hover
2630
+ ============================================ */
2631
+
2632
+ /* Hover - Unchecked */
2633
+ voa-option:not([checked]):not([disabled]):hover::part(label) {
2634
+ color: rgba(24, 24, 27, 1);
2635
+ }
2636
+
2637
+ /* Hover - Checked */
2638
+ voa-option[checked]:not([disabled]):hover::part(label) {
2639
+ color: rgba(24, 24, 27, 1);
2640
+ }
2641
+
2642
+ /* Hover - Base container cursor */
2643
+ voa-option:not([disabled]):hover {
2644
+ cursor: pointer;
2645
+ }
2646
+
2647
+ /* ============================================
2648
+ ESTADOS - Focus
2649
+ ============================================ */
2650
+
2651
+ /* Focus - Unchecked */
2652
+ voa-option:not([checked]):focus-visible::part(label) {
2653
+ color: rgba(24, 24, 27, 1);
2654
+ }
2655
+
2656
+ /* Focus - Checked */
2657
+ voa-option[checked]:focus-visible::part(label) {
2658
+ color: rgba(24, 24, 27, 1);
2659
+ }
2660
+
2661
+ /* ============================================
2662
+ ESTADO - Disabled
2663
+ ============================================ */
2664
+
2665
+ /* Disabled - Unchecked */
2666
+ voa-option[disabled]:not([checked])::part(label) {
2667
+ color: rgba(24, 24, 27, 0.4);
2668
+ }
2669
+
2670
+ /* Disabled - Checked */
2671
+ voa-option[disabled][checked]::part(label) {
2672
+ color: rgba(24, 24, 27, 0.4);
2673
+ }
2674
+
2675
+ /* ============================================
2676
+ ACESSIBILIDADE - Focus visível
2677
+ ============================================ */
2678
+
2679
+ voa-option:focus-within::part(base) {
2680
+ outline: none;
2681
+ }
2682
+
2683
+ /* Respeitar preferências de movimento reduzido */
2684
+ @media (prefers-reduced-motion: reduce) {
2685
+ voa-option::part(indicator),
2686
+ voa-option::part(indicator-dot),
2687
+ voa-option::part(label) {
2688
+ transition: none;
2689
+ }
2690
+ }
2691
+
2692
+ /* ============================================
2693
+ voa-pagination.external.css
2694
+ ============================================ */
2695
+
2696
+ /* Base styles for all pagination items (buttons) */
2697
+ voa-pagination-item::part(base) {
2698
+ border-radius: var(--voa-radius-md);
2699
+ background-color: var(--voa-bg-base);
2700
+ color: var(--voa-text-secondary);
2701
+ transition: all 0.2s ease;
2702
+ }
2703
+
2704
+ /* Hover state */
2705
+ voa-pagination-item:hover::part(base) {
2706
+ background-color: var(--structure-colors-bg-elevated);
2707
+ }
2708
+
2709
+ /* Active state (current page) - Figma: white bg, blue border, blue inner shadow */
2710
+ voa-pagination-item[active="true"]::part(base) {
2711
+ background-color: var(--voa-bg-base);
2712
+ border: var(--border-width-thin) solid var(--brand-base);
2713
+ color: var(--voa-text-primary);
2714
+ box-shadow: var(--input-active-inner-shadow);
2715
+ }
2716
+
2717
+ /* Disabled state */
2718
+ voa-pagination-item[disabled="true"]::part(base) {
2719
+ opacity: 0.5;
2720
+ cursor: not-allowed;
2721
+ }
2722
+
2723
+ /* Number text styling - Figma: Lato SemiBold, 16px, line-height 24px */
2724
+ voa-pagination-item::part(content) {
2725
+ font-family: var(--voa-font-family-sans);
2726
+ font-weight: var(--typography-base-body-sm-bold-weight);
2727
+ font-size: 1rem;
2728
+ line-height: 24px;
2729
+ color: inherit;
2730
+ text-align: center;
2731
+ }
2732
+
2733
+ /* Ellipsis styling - Figma: Manrope SemiBold, 20px */
2734
+ voa-pagination-item[type="ellipsis"]::part(content) {
2735
+ font-family: 'Manrope', sans-serif;
2736
+ font-weight: var(--typography-base-body-sm-bold-weight);
2737
+ font-size: 1.25rem;
2738
+ line-height: 0;
2739
+ color: var(--voa-text-secondary);
2740
+ }
2741
+
2742
+ /* Icon styling */
2743
+ voa-pagination-item::part(icon) {
2744
+ color: var(--voa-text-secondary);
2745
+ width: 16px;
2746
+ height: 16px;
2747
+ }
2748
+
2749
+ voa-pagination-item::part(icon) svg {
2750
+ width: 16px;
2751
+ height: 16px;
2752
+ stroke: currentColor;
2753
+ fill: none;
2754
+ }
2755
+
2756
+ /* Page Size & Goto Styling - Figma: Lato Regular, 14px, line-height 16px */
2757
+ voa-pagination-item::part(label) {
2758
+ font-family: var(--voa-font-family-sans);
2759
+ font-weight: var(--typography-base-body-sm-regular-weight);
2760
+ font-size: var(--typography-base-body-sm-regular-size);
2761
+ line-height: 16px;
2762
+ color: var(--voa-text-secondary);
2763
+ }
2764
+
2765
+ /* Select box (page-size) - Figma: white bg, border, 32px height */
2766
+ voa-pagination-item::part(select) {
2767
+ height: 32px;
2768
+ padding: 0 var(--voa-spacing-xs);
2769
+ background-color: var(--voa-bg-base);
2770
+ border: var(--border-width-medium) solid var(--voa-border-color);
2771
+ border-radius: var(--voa-radius-md);
2772
+ display: flex;
2773
+ align-items: center;
2774
+ justify-content: center;
2775
+ gap: 4px;
2776
+ cursor: pointer;
2777
+ box-sizing: border-box;
2778
+ }
2779
+
2780
+ /* Input wrapper (goto-page) - Figma: white bg, border, 32px height */
2781
+ voa-pagination-item::part(input-wrapper) {
2782
+ height: 32px;
2783
+ padding: 0 var(--voa-spacing-md);
2784
+ background-color: var(--voa-bg-base);
2785
+ border: var(--border-width-medium) solid var(--voa-border-color);
2786
+ border-radius: var(--voa-radius-md);
2787
+ display: flex;
2788
+ align-items: center;
2789
+ justify-content: center;
2790
+ box-sizing: border-box;
2791
+ }
2792
+
2793
+ /* Input field - Figma: Lato Regular, 16px, line-height 24px */
2794
+ voa-pagination-item::part(input) {
2795
+ width: 20px;
2796
+ text-align: center;
2797
+ font-family: var(--voa-font-family-sans);
2798
+ font-weight: var(--typography-base-body-sm-regular-weight);
2799
+ font-size: 1rem;
2800
+ line-height: 24px;
2801
+ color: var(--voa-text-primary);
2802
+ border: none;
2803
+ background: transparent;
2804
+ padding: 0;
2805
+ }
2806
+
2807
+ voa-pagination-item::part(input):focus {
2808
+ outline: none;
2809
+ }
2810
+
2811
+ /* Value display in select */
2812
+ voa-pagination-item .voa-pagination-item__value {
2813
+ font-family: var(--voa-font-family-sans);
2814
+ font-weight: var(--typography-base-body-sm-regular-weight);
2815
+ font-size: 1rem;
2816
+ line-height: 24px;
2817
+ color: var(--voa-text-primary);
2818
+ }
2819
+
2820
+ /* ============================================
2821
+ voa-radio.external.css
2822
+ ============================================ */
2823
+
2824
+ /**
2825
+ * Estilização Externa do VoaRadio
2826
+ *
2827
+ * Este arquivo demonstra como estilizar o componente voa-radio
2828
+ * usando CSS Parts API e design tokens semânticos.
2829
+ *
2830
+ * Baseado no design do Figma:
2831
+ * https://www.figma.com/design/wDStUEuqpl7Tu1oHpiAml6/Voa-Design-System?node-id=1182-56
2832
+ *
2833
+ * Para usar, importe este arquivo após os tokens:
2834
+ * * *
2835
+ * MAPEAMENTO DE TOKENS DO FIGMA PARA STYLE DICTIONARY:
2836
+ *
2837
+ * Figma Token → Style Dictionary Token
2838
+ * --------------------------------------------
2839
+ * --structure-colors/bg-base → --structure-colors-bg-base
2840
+ * --structure-colors/bg-elevated → --structure-colors-bg-elevated
2841
+ * --structure-colors/bg-base-disabled → --structure-colors-bg-base-disabled
2842
+ * --structure-colors/border-color → --structure-colors-border-color
2843
+ * --structure-colors/fill-secondary → --structure-colors-fill-secondary
2844
+ * --structure-colors/fill-quaternary → --structure-colors-fill-quaternary
2845
+ * --Colors/Light/primary-light-200 → --colors-light-primary-light-200 (#008fff)
2846
+ * --Colors/Light/primary-light-400 → --colors-light-primary-light-400 (#0071c8)
2847
+ * --Colors/Light/secondary-light-100 → --colors-light-secondary-light-100 (#b5eee3) - CYAN
2848
+ * --Colors/Light/secondary-light → --colors-light-secondary-light (#00e5ce) - CYAN
2849
+ * --asset-colors/text-hover → --text-hover (ou --brand-base)
2850
+ * --asset-colors/brand-base-50 → --brand-base-50
2851
+ * --asset-colors/brand-base-25 → --brand-base-25
2852
+ * --asset-colors/brand-hover → --brand-hover
2853
+ * --radius/radius-xxs → --radius-xxs
2854
+ * --radius/radius-round → --radius-round (100%)
2855
+ *
2856
+ * EFEITOS VISUAIS IMPORTANTES DO FIGMA:
2857
+ * - Estado focused checked: fill #008fff, stroke #0071c8, dot fill #b5eee3, dot stroke #00e5ce
2858
+ * - Estado focused unchecked: glow interno com brand-base-50
2859
+ * - Estados checked: sombras internas para efeito de profundidade
2860
+ */
2861
+
2862
+ /* ============================================
2863
+ BASE - Elemento raiz do radio (label)
2864
+ ============================================ */
2865
+
2866
+ voa-radio::part(base) {
2867
+ /* Sem estilos visuais aqui - apenas estrutura */
2868
+ display: inline-flex;
2869
+ align-items: center;
2870
+ gap: 0;
2871
+ }
2872
+
2873
+ /* ============================================
2874
+ INDICATOR - Círculo externo do radio (20px)
2875
+ ============================================ */
2876
+
2877
+ voa-radio::part(indicator) {
2878
+ /* Tamanho fixo conforme Figma */
2879
+ width: var(--radio-indicator-size);
2880
+ height: var(--radio-indicator-size);
2881
+ min-width: var(--radio-indicator-size);
2882
+ min-height: var(--radio-indicator-size);
2883
+
2884
+ /* Border-radius circular */
2885
+ border-radius: var(--radius-round, 50%);
2886
+
2887
+ /* Border padrão - Semantic Token */
2888
+ border: var(--border-width-thick) solid var(--structure-colors-border-color);
2889
+
2890
+ /* Background padrão - Semantic Token */
2891
+ background-color: var(--structure-colors-bg-base);
2892
+
2893
+ /* Transição suave */
2894
+ transition: background-color 0.2s ease, border-color 0.2s ease, box-shadow 0.2s ease;
2895
+ }
2896
+
2897
+ /* ============================================
2898
+ INDICATOR - Estados Unchecked
2899
+ ============================================ */
2900
+
2901
+ /* Default - Unchecked */
2902
+ voa-radio:not([checked])::part(indicator) {
2903
+ background-color: var(--structure-colors-bg-base);
2904
+ border-color: var(--structure-colors-border-color);
2905
+ }
2906
+
2907
+ /* Hover - Unchecked */
2908
+ voa-radio:not([checked]):hover::part(indicator) {
2909
+ background-color: var(--structure-colors-bg-elevated);
2910
+ border-color: var(--structure-colors-border-color);
2911
+ /* Outline externo com brand-secondary-50 conforme Figma */
2912
+ box-shadow: 0 0 0 4px var(--brand-secondary-50, var(--colors-light-secondary-light-opacity-50, rgba(0, 229, 206, 0.5)));
2913
+ }
2914
+
2915
+ /* Focus - Unchecked (COR ESPECIAL: stroke CYAN conforme Figma) */
2916
+ voa-radio:not([checked]):focus-visible::part(indicator) {
2917
+ background-color: var(--structure-colors-bg-base);
2918
+ /* Stroke CYAN (#00e5ce) conforme Figma, não brand-base-50 */
2919
+ border-color: var(--colors-light-secondary-light, var(--brand-secondary, #00e5ce)); /* rgba(0, 229, 206, 1) - CYAN */
2920
+ /* Glow interno conforme Figma - inset shadow com CYAN (brand-secondary-50) */
2921
+ box-shadow: var(--shadow-focus-secondary);
2922
+ }
2923
+
2924
+ /* Disabled - Unchecked */
2925
+ voa-radio[disabled]:not([checked])::part(indicator) {
2926
+ background-color: var(--structure-colors-bg-base-disabled);
2927
+ border-color: var(--structure-colors-fill-secondary);
2928
+ cursor: not-allowed;
2929
+ }
2930
+
2931
+ /* ============================================
2932
+ INDICATOR - Estados Checked
2933
+ ============================================ */
2934
+
2935
+ /* Default - Checked */
2936
+ voa-radio[checked]::part(indicator) {
2937
+ /* Usar primary-light-200 quando disponível (mais claro), fallback para brand-base */
2938
+ background-color: var(--colors-light-primary-light-200, var(--voa-radio-v2-checked-bg, var(--text-hover, var(--brand-base))));
2939
+ border-color: var(--structure-colors-fill-secondary);
2940
+ /* Shadow interna sutil para efeito de profundidade conforme Figma */
2941
+ /* Nota: O Figma usa overlay complexo - replicamos com inset shadow */
2942
+ box-shadow: inset 0 var(--radius-xxs, 2px) 0 0 var(--structure-colors-bg-base-disabled, rgba(255, 255, 255, 0.25));
2943
+ }
2944
+
2945
+ /* Hover - Checked (COR ESPECIAL: brand-base + stroke CYAN conforme Figma) */
2946
+ voa-radio[checked]:hover::part(indicator) {
2947
+ /* Hover checked usa brand-base (#0064cb) e stroke CYAN conforme Figma */
2948
+ background-color: var(--text-hover, var(--brand-base, #0064cb)); /* rgba(0, 100, 203, 1) */
2949
+ border-color: var(--colors-light-secondary-light, var(--brand-secondary, #00e5ce)); /* rgba(0, 229, 206, 1) - CYAN */
2950
+ /* Shadow interna mantida no hover */
2951
+ /* Outline externo com brand-secondary-50 conforme Figma */
2952
+ box-shadow: inset 0 var(--radius-xxs, 2px) 0 0 var(--structure-colors-bg-base-disabled, rgba(255, 255, 255, 0.25)),
2953
+ 0 0 0 4px var(--brand-secondary-50, var(--colors-light-secondary-light-opacity-50, rgba(0, 229, 206, 0.5)));
2954
+ }
2955
+
2956
+ /* Focus - Checked (especial: usa cores diferentes conforme Figma) */
2957
+ voa-radio[checked]:focus-visible::part(indicator) {
2958
+ /* Cores específicas do estado focused checked conforme Figma */
2959
+ /* Fill: rgba(0, 143, 255, 1) - primary-light-200 */
2960
+ background-color: var(--colors-light-primary-light-200, var(--voa-radio-v2-checked-bg, #008fff)); /* Mais claro que brand-base */
2961
+ /* Stroke: rgba(0, 113, 200, 1) - primary-light-400 */
2962
+ border-color: var(--colors-light-primary-light-400, var(--voa-radio-v2-checked-border, #0071c8)); /* Stroke mais escuro */
2963
+ /* Shadow interna para efeito de profundidade conforme Figma */
2964
+ /* Nota: O Figma usa overlay com inset negativo - replicamos com inset shadow */
2965
+ box-shadow: inset 0 var(--radius-xxs, 2px) 0 0 var(--structure-colors-bg-base-disabled, rgba(255, 255, 255, 0.25));
2966
+ }
2967
+
2968
+ /* Disabled - Checked */
2969
+ voa-radio[disabled][checked]::part(indicator) {
2970
+ /* Figma mostra brand-base (#0064cb) mas com opacidade reduzida visualmente (disabled) */
2971
+ /* Usando brand-base-25 para representar estado disabled */
2972
+ background-color: var(--brand-base-25, var(--colors-light-primary-light-opacity-25, rgba(0, 100, 203, 0.25)));
2973
+ /* Stroke também usa brand-base-25 conforme Figma (fill e stroke iguais) */
2974
+ border-color: var(--brand-base-25, var(--colors-light-primary-light-opacity-25, rgba(0, 100, 203, 0.25)));
2975
+ cursor: not-allowed;
2976
+ }
2977
+
2978
+ /* ============================================
2979
+ DOT - Círculo interno quando selecionado (8px)
2980
+ ============================================ */
2981
+
2982
+ voa-radio::part(dot) {
2983
+ /* Tamanho fixo conforme Figma */
2984
+ width: 8px;
2985
+ height: 8px;
2986
+ min-width: 8px;
2987
+ min-height: 8px;
2988
+
2989
+ /* Border-radius circular */
2990
+ border-radius: var(--radius-round, 50%);
2991
+
2992
+ /* Background padrão - Semantic Token */
2993
+ background-color: var(--structure-colors-bg-base);
2994
+
2995
+ /* Border sutil - Semantic Token */
2996
+ border: var(--border-width-thin) solid var(--structure-colors-fill-quaternary);
2997
+
2998
+ /* Posicionamento já definido no CSS estrutural (centralizado perfeitamente) */
2999
+ /* Não sobrescrever left/top aqui para manter centralização do CSS estrutural */
3000
+
3001
+ /* Transição suave para transform, opacity, background-color e border-color */
3002
+ transition: transform 0.2s ease, opacity 0.2s ease, background-color 0.2s ease, border-color 0.2s ease;
3003
+ }
3004
+
3005
+ /* Dot - Checked (visível) */
3006
+ voa-radio[checked]::part(dot) {
3007
+ background-color: var(--structure-colors-bg-base);
3008
+ border-color: var(--structure-colors-fill-quaternary);
3009
+ transform: scale(1);
3010
+ opacity: 1;
3011
+ }
3012
+
3013
+ /* Dot - Focused Checked (COR ESPECIAL: CYAN conforme Figma) */
3014
+ voa-radio[checked]:focus-visible::part(dot) {
3015
+ /* Cores CYAN especiais do estado focused conforme Figma */
3016
+ /* IMPORTANTE: No estado focused, o dot tem cor CYAN, não branco */
3017
+ background-color: var(--colors-light-secondary-light-100, #b5eee3); /* CYAN claro - rgba(181, 238, 227, 1) */
3018
+ border-color: var(--colors-light-secondary-light, #00e5ce); /* CYAN - rgba(0, 229, 206, 1) */
3019
+ }
3020
+
3021
+ /* Dot - Disabled Checked */
3022
+ voa-radio[disabled][checked]::part(dot) {
3023
+ background-color: var(--structure-colors-bg-base-disabled);
3024
+ border-color: var(--structure-colors-fill-quaternary);
3025
+ }
3026
+
3027
+ /* ============================================
3028
+ INPUT - Input nativo (oculto mas acessível)
3029
+ ============================================ */
3030
+
3031
+ voa-radio::part(input) {
3032
+ /* Já oculto no CSS estrutural, mas garantimos acessibilidade */
3033
+ position: absolute;
3034
+ opacity: 0;
3035
+ width: 0;
3036
+ height: 0;
3037
+ margin: 0;
3038
+ padding: 0;
3039
+ pointer-events: none;
3040
+ }
3041
+
3042
+ /* ============================================
3043
+ ACESSIBILIDADE - Focus visível
3044
+ ============================================ */
3045
+
3046
+ voa-radio:focus-within::part(base) {
3047
+ outline: none;
3048
+ }
3049
+
3050
+ /* Respeitar preferências de movimento reduzido */
3051
+ @media (prefers-reduced-motion: reduce) {
3052
+ voa-radio::part(indicator),
3053
+ voa-radio::part(dot) {
3054
+ transition: none;
3055
+ }
3056
+ }
3057
+
3058
+ /* ============================================
3059
+ voa-select.external.css
3060
+ ============================================ */
3061
+
3062
+ /**
3063
+ * External Styling for VoaSelect Component
3064
+ *
3065
+ * This file demonstrates how to style the voa-select component
3066
+ * using CSS Parts API and semantic design tokens.
3067
+ *
3068
+ * Based on Figma design:
3069
+ * https://www.figma.com/design/wDStUEuqpl7Tu1oHpiAml6/Voa-Design-System?node-id=607-1011&m=dev
3070
+ *
3071
+ * Usage:
3072
+ * * *
3073
+ * DESIGN TOKEN MAPPING (Figma → CSS Variables):
3074
+ *
3075
+ * Typography (from Figma):
3076
+ * - Label: family-name:var(--base/family/family-sans,'Lato:SemiBold') 20px / 32px (Desktop/Body-lg/Bold)
3077
+ * - Input: family-name:var(--base/family/family-sans,'Lato:Regular') 16px / 24px (Desktop/Body-md/Regular)
3078
+ * - Info: Lato Regular 14px / 16px
3079
+ * - Error: Lato Regular 12px / 16px
3080
+ *
3081
+ * Colors (from Figma):
3082
+ * - Background: var(--structure-colors/bg-base, #ffffff)
3083
+ * - Border: var(--structure-colors/border-color, #adb5bd)
3084
+ * - Border Active: var(--asset-colors/brand-base, #0064cb)
3085
+ * - Text Primary: var(--asset-colors/text-primary, #0b1215)
3086
+ * - Text Secondary: var(--asset-colors/text-secondary, #495057)
3087
+ * - Text Placeholder: var(--asset-colors/text-placeholder, #9f9fa8)
3088
+ * - Text Disabled: rgba(11, 18, 21, 0.25)
3089
+ * - Background Disabled: rgba(255, 255, 255, 0.25)
3090
+ * - Border Disabled: rgba(24, 24, 27, 0.06)
3091
+ * - Focus Shadow: rgba(0, 100, 203, 0.5) - Input/active effect
3092
+ *
3093
+ * Spacing (from Figma):
3094
+ * - Gap header to input: 6px
3095
+ * - Gap label to info: var(--spacing/spacing-xs, 4px)
3096
+ * - Input padding: 12px
3097
+ * - Input gap: 8px
3098
+ * - Badge gap: var(--spacing/spacing-xs, 4px)
3099
+ *
3100
+ * Border Radius (from Figma):
3101
+ * - Input: 15.75px
3102
+ * - Badge: var(--radius-round, 1024px)
3103
+ *
3104
+ * Border Width (from Figma):
3105
+ * - Input: 1.125px
3106
+ * - Badge: 1px dashed
3107
+ */
3108
+
3109
+ /* ============================================
3110
+ BASE - Container principal do select
3111
+ ============================================ */
3112
+ voa-select::part(base) {
3113
+ /* Estrutura apenas - estilos visuais aplicados via parts específicos */
3114
+ box-sizing: border-box;
3115
+ }
3116
+
3117
+ /* ============================================
3118
+ HEADER - Container do label e info
3119
+ ============================================ */
3120
+ voa-select::part(header) {
3121
+ /* Gap entre header e input - valor específico do Figma (6px) */
3122
+ margin-bottom: var(--structure-slim-spacing-xs);
3123
+
3124
+ /* Gap entre label e info - Figma: spacing/spacing-xs (4px) */
3125
+ gap: var(--structure-large-spacing-xs);
3126
+
3127
+ box-sizing: border-box;
3128
+ }
3129
+
3130
+ /* ============================================
3131
+ LABEL - Label text
3132
+ ============================================ */
3133
+ voa-select::part(label) {
3134
+ /* Typography - Figma: Desktop/Body-lg/Bold (Lato SemiBold 20px / 32px) */
3135
+ font-family: var(--branding-coi-type-family-sans, 'Lato', sans-serif);
3136
+ font-size: 20px;
3137
+ font-weight: var(--typography-base-body-sm-bold-weight);
3138
+ line-height: 32px;
3139
+ font-style: normal;
3140
+
3141
+ /* Color - Figma: asset-colors/text-primary */
3142
+ color: var(--text-primary, #0b1215);
3143
+
3144
+ box-sizing: border-box;
3145
+ }
3146
+
3147
+ /* ============================================
3148
+ INFO - Container de informação
3149
+ ============================================ */
3150
+ voa-select::part(info) {
3151
+ /* Gap entre texto e ícone - Figma: spacing/spacing-xs (4px) */
3152
+ gap: var(--structure-large-spacing-xs, 4px);
3153
+
3154
+ box-sizing: border-box;
3155
+ }
3156
+
3157
+ voa-select::part(info) .voa-select__info-message {
3158
+ /* Typography - Figma: Lato Regular 14px / 16px */
3159
+ font-family: var(--branding-coi-type-family-sans, 'Lato', sans-serif);
3160
+ font-size: var(--typography-base-body-sm-regular-size);
3161
+ font-weight: var(--typography-base-body-sm-regular-weight);
3162
+ line-height: var(--line-height-body-sm);
3163
+ font-style: normal;
3164
+
3165
+ /* Color - Figma: asset-colors/text-secondary */
3166
+ color: var(--text-secondary, #495057);
3167
+ }
3168
+
3169
+ voa-select::part(info) svg {
3170
+ /* Icon size - Figma: 16px */
3171
+ width: 16px;
3172
+ height: 16px;
3173
+
3174
+ /* Color - Figma: asset-colors/text-secondary */
3175
+ color: var(--text-secondary, #495057);
3176
+ }
3177
+
3178
+ /* ============================================
3179
+ INPUT - Input container (with border)
3180
+ ============================================ */
3181
+ voa-select::part(input) {
3182
+ /* Background - Figma: structure-colors/bg-base */
3183
+ background-color: var(--colors-structure-bg-base, #ffffff);
3184
+
3185
+ /* Border - Figma: 1.125px solid border-color */
3186
+ border: var(--border-width-medium) solid var(--colors-structure-border-color, #adb5bd);
3187
+
3188
+ /* Border-radius - Figma: 15.75px */
3189
+ border-radius: var(--structure-large-radius-lg);
3190
+
3191
+ /* Padding - Figma: 12px */
3192
+ padding: 0 var(--structure-large-spacing-rg, 12px);
3193
+
3194
+ /* CSS variable for dropdown positioning (inherited to shadow DOM via scoped: false) */
3195
+ --select-input-padding: 12px;
3196
+
3197
+ /* Allow input to wrap content dynamically (especially for multi-select) */
3198
+ min-height: 48px;
3199
+ height: auto;
3200
+
3201
+ /* Box-sizing */
3202
+ box-sizing: border-box;
3203
+
3204
+ /* Transitions for state changes */
3205
+ transition: border-color 0.2s ease, box-shadow 0.2s ease;
3206
+ }
3207
+
3208
+ /* ============================================
3209
+ INPUT WRAPPER - Container interno com flexbox
3210
+ ============================================ */
3211
+ voa-select::part(input-wrapper) {
3212
+ /* Gap entre ícone e conteúdo - Figma: 8px */
3213
+ gap: var(--structure-large-spacing-sm, 8px);
3214
+
3215
+ box-sizing: border-box;
3216
+ }
3217
+
3218
+ /* ============================================
3219
+ ICON - Left icon slot
3220
+ ============================================ */
3221
+ voa-select::part(icon) {
3222
+ /* Icon size - Figma: 24px */
3223
+ width: 24px;
3224
+ height: 24px;
3225
+ flex-shrink: 0;
3226
+
3227
+ /* Color - Figma: asset-colors/text-secondary */
3228
+ color: var(--text-secondary, #495057);
3229
+
3230
+ box-sizing: border-box;
3231
+ }
3232
+
3233
+ voa-select [slot="icon"],
3234
+ voa-select [slot="prefix"] {
3235
+ width: 100%;
3236
+ height: 100%;
3237
+ display: block;
3238
+ }
3239
+
3240
+ /* ============================================
3241
+ INPUT STATES
3242
+ ============================================ */
3243
+
3244
+ /* State: Default - already applied above */
3245
+
3246
+ /* State: Selected/Filled - Item selected (blue border) */
3247
+ voa-select[data-state="selected"]::part(input),
3248
+ voa-select[data-state="filled"]::part(input) {
3249
+ /* Border-color - Figma: asset-colors/brand-base */
3250
+ border-color: var(--branding-coi-colors-light-primary-light, #0064cb);
3251
+ }
3252
+
3253
+ /* State: Focused - Field in focus (blue border + inner shadow) */
3254
+ voa-select[data-state="focused"]::part(input),
3255
+ voa-select::part(input):focus-within {
3256
+ /* Border-color - Figma: asset-colors/brand-base */
3257
+ border-color: var(--branding-coi-colors-light-primary-light, #0064cb);
3258
+
3259
+ /* Box-shadow - Figma: Input/active effect (inset 0px 0px 8px 2px rgba(0,100,203,0.5)) */
3260
+ box-shadow: inset 0px 0px 8px 2px var(--branding-coi-colors-light-primary-light-opacity-50, rgba(0, 100, 203, 0.5));
3261
+ }
3262
+
3263
+ /* State: Disabled - Field disabled */
3264
+ voa-select[disabled]::part(input),
3265
+ voa-select[data-state="disabled"]::part(input) {
3266
+ /* Background - Figma: structure-colors/bg-base-disabled */
3267
+ background-color: var(--colors-structure-bg-base-disabled, var(--branding-coi-colors-light-primary-light-opacity-15, rgba(255, 255, 255, 0.25)));
3268
+
3269
+ /* Border-color - Figma: structure-colors/fill-secondary */
3270
+ border-color: var(--colors-structure-fill-secondary, var(--colors-structure-fill-15, rgba(24, 24, 27, 0.06)));
3271
+
3272
+ cursor: not-allowed;
3273
+ }
3274
+
3275
+ /* State: Error - Field with error */
3276
+ voa-select[error]::part(input) {
3277
+ /* Border-color - Use danger color or keep brand-base per Figma */
3278
+ border-color: var(--colors-semantic-danger, var(--branding-coi-colors-light-primary-light, #0064cb));
3279
+ }
3280
+
3281
+ /* ============================================
3282
+ SUBCOMPONENT STYLES - voa-select-base
3283
+ ============================================ */
3284
+
3285
+ /* Control button - the clickable trigger */
3286
+ voa-select-base::part(control) {
3287
+ /* Make it fill the container */
3288
+ width: 100%;
3289
+ display: flex;
3290
+ align-items: center;
3291
+ justify-content: space-between;
3292
+
3293
+ /* Remove button styling */
3294
+ background: transparent;
3295
+ border: none;
3296
+ padding: 0;
3297
+ cursor: pointer;
3298
+
3299
+ /* Typography inherited from parent */
3300
+ font-family: inherit;
3301
+ font-size: inherit;
3302
+ color: inherit;
3303
+ text-align: left;
3304
+
3305
+ box-sizing: border-box;
3306
+ }
3307
+
3308
+ /* Placeholder and text inside select-base */
3309
+ voa-select-base::part(value) {
3310
+ /* Typography - Figma: Desktop/Body-md/Regular (Lato Regular 16px / 24px) */
3311
+ font-family: var(--branding-coi-type-family-sans, 'Lato', sans-serif);
3312
+ font-size: var(--typography-base-type-scale-6);
3313
+ font-weight: var(--typography-base-body-sm-regular-weight);
3314
+ line-height: var(--line-height-body-md);
3315
+ font-style: normal;
3316
+
3317
+ /* Color - Figma: asset-colors/text-placeholder */
3318
+ color: var(--text-placeholder, #9f9fa8);
3319
+
3320
+ /* Text alignment */
3321
+ text-align: left;
3322
+
3323
+ box-sizing: border-box;
3324
+ }
3325
+
3326
+ /* When value is selected (filled) */
3327
+ voa-select-base[value]::part(value) {
3328
+ /* Color - Figma: asset-colors/text-primary */
3329
+ color: var(--text-primary, #0b1215);
3330
+ }
3331
+
3332
+ /* Disabled state for label */
3333
+ voa-select[disabled]::part(label),
3334
+ voa-select[data-state="disabled"]::part(label) {
3335
+ /* Color - Figma: text-disabled with opacity */
3336
+ color: var(--text-disabled-with-opacity, rgba(11, 18, 21, 0.25));
3337
+ }
3338
+
3339
+ /* Disabled state for placeholder and content */
3340
+ voa-select[disabled] voa-select-base::part(value),
3341
+ voa-select[data-state="disabled"] voa-select-base::part(value) {
3342
+ /* Color - Figma: text-disabled with opacity */
3343
+ color: var(--text-disabled-with-opacity, rgba(11, 18, 21, 0.25));
3344
+ }
3345
+
3346
+ /* ============================================
3347
+ ERROR MESSAGE - Error message
3348
+ ============================================ */
3349
+ voa-select::part(error-message) {
3350
+ /* Typography - Figma: Lato Regular 12px / 16px */
3351
+ font-family: var(--branding-coi-type-family-sans, 'Lato', sans-serif);
3352
+ font-size: var(--typography-base-type-scale-8);
3353
+ font-weight: var(--typography-base-body-sm-regular-weight);
3354
+ line-height: var(--line-height-body-sm);
3355
+ font-style: normal;
3356
+
3357
+ /* Color - Figma: asset-colors/text-secondary */
3358
+ color: var(--text-secondary, #495057);
3359
+
3360
+ /* Margin-top - Figma: 6px gap after input */
3361
+ margin-top: 6px;
3362
+
3363
+ box-sizing: border-box;
3364
+ }
3365
+
3366
+ /* ============================================
3367
+ MULTI-SELECT STYLES
3368
+ ============================================ */
3369
+
3370
+ /* Remove vertical padding from input when multi-select */
3371
+ voa-select[type="multi"]::part(input) {
3372
+ /* Remove vertical padding (top and bottom), keep only horizontal - Figma: 12px */
3373
+ padding-top: 0;
3374
+ padding-bottom: 0;
3375
+ padding-left: var(--structure-large-spacing-rg, 12px);
3376
+ padding-right: var(--structure-large-spacing-rg, 12px);
3377
+ }
3378
+
3379
+ /* Multi-select container inside input */
3380
+ voa-select .voa-select__content voa-container-multi-select::part(base) {
3381
+ /* Layout adjustments if needed */
3382
+ box-sizing: border-box;
3383
+ }
3384
+
3385
+ /* ============================================
3386
+ BADGES INSIDE MULTI-SELECT - voa-badge styling
3387
+ ============================================ */
3388
+ /*
3389
+ * IMPORTANT: Since badges are inside the Shadow DOM of voa-container-multi-select,
3390
+ * and voa-container-multi-select is inside the Shadow DOM of voa-select,
3391
+ * we need to apply badge styles here as well (external CSS).
3392
+ *
3393
+ * Base badge styles are applied in voa-container-multi-select.css (inside Shadow DOM),
3394
+ * but we apply them here too to ensure they work even when the container CSS
3395
+ * cannot fully penetrate the badge's Shadow DOM.
3396
+ */
3397
+
3398
+ /* Badge base inside multi-select */
3399
+ voa-select voa-container-multi-select .voa-container-multi-select__badge-wrapper voa-badge::part(base) {
3400
+ /* Background - Figma: brand-base with 15% opacity */
3401
+ background-color: var(--branding-coi-colors-light-primary-light-opacity-15, rgba(0, 100, 203, 0.15)) !important;
3402
+
3403
+ /* Border - Figma: 1px dashed brand-base */
3404
+ border: var(--border-width-thin) dashed var(--branding-coi-colors-light-primary-light, #0064cb) !important;
3405
+
3406
+ /* Border-radius - Figma: pill shape (1024px from tokens) */
3407
+ border-radius: var(--structure-large-radius-round) !important;
3408
+
3409
+ /* Padding - Figma: 2px vertical, 4px horizontal */
3410
+ padding-block: var(--structure-large-spacing-xxs) !important;
3411
+ padding-inline: var(--structure-large-spacing-xs) !important;
3412
+
3413
+ /* Typography - Figma: Lato Regular 16px / 24px */
3414
+ font-family: var(--branding-coi-type-family-sans, 'Lato', sans-serif) !important;
3415
+ font-size: var(--typography-base-type-scale-6) !important;
3416
+ font-weight: var(--typography-base-body-sm-regular-weight) !important;
3417
+ line-height: var(--line-height-body-md) !important;
3418
+ font-style: normal !important;
3419
+
3420
+ /* Text color - Figma: brand-base */
3421
+ color: var(--branding-coi-colors-light-primary-light, #0064cb) !important;
3422
+
3423
+ /* Display and layout */
3424
+ display: inline-flex !important;
3425
+ align-items: center !important;
3426
+ gap: var(--structure-large-spacing-xxs, 2px) !important;
3427
+
3428
+ /* Transitions */
3429
+ transition: background-color 0.2s ease, border-color 0.2s ease !important;
3430
+ }
3431
+
3432
+ /* Badge hover state */
3433
+ voa-select voa-container-multi-select .voa-container-multi-select__badge-wrapper:hover voa-badge::part(base) {
3434
+ background-color: var(--branding-coi-colors-light-primary-light-opacity-25, rgba(0, 100, 203, 0.25)) !important;
3435
+ border-color: var(--branding-coi-colors-light-primary-light-400, #0071c8) !important;
3436
+ }
3437
+
3438
+ /* Badge label */
3439
+ voa-select voa-container-multi-select .voa-container-multi-select__badge-wrapper voa-badge::part(label) {
3440
+ color: var(--branding-coi-colors-light-primary-light, #0064cb) !important;
3441
+ white-space: nowrap;
3442
+ }
3443
+
3444
+ /* Leading icon - hide */
3445
+ voa-select voa-container-multi-select .voa-container-multi-select__badge-wrapper voa-badge::part(icon-leading) {
3446
+ display: none !important;
3447
+ }
3448
+
3449
+ /* Trailing icon (close) of badge */
3450
+ voa-select voa-container-multi-select .voa-container-multi-select__badge-wrapper voa-badge::part(icon-trailing) {
3451
+ display: inline-flex !important;
3452
+ align-items: center !important;
3453
+ justify-content: center !important;
3454
+ cursor: pointer !important;
3455
+ color: var(--branding-coi-colors-light-primary-light, #0064cb) !important;
3456
+ flex-shrink: 0;
3457
+ margin-left: var(--structure-large-spacing-xxs, 2px);
3458
+ }
3459
+
3460
+ voa-select voa-container-multi-select .voa-container-multi-select__badge-wrapper voa-badge::part(icon-trailing) svg {
3461
+ width: 12px !important;
3462
+ height: 12px !important;
3463
+ display: block !important;
3464
+ flex-shrink: 0;
3465
+ }
3466
+
3467
+ /* Close icon hover */
3468
+ voa-select voa-container-multi-select .voa-container-multi-select__badge-wrapper:hover voa-badge::part(icon-trailing) {
3469
+ opacity: 0.8;
3470
+ }
3471
+
3472
+ /* Disabled state */
3473
+ voa-select[disabled] voa-container-multi-select .voa-container-multi-select__badge-wrapper voa-badge::part(base) {
3474
+ opacity: 0.5 !important;
3475
+ cursor: not-allowed !important;
3476
+ pointer-events: none !important;
3477
+ }
3478
+
3479
+ /* ============================================
3480
+ DROPDOWN - Options menu
3481
+ ============================================ */
3482
+
3483
+ /* Animation for dropdown entrance and exit */
3484
+ @keyframes dropdownEnter {
3485
+ from {
3486
+ opacity: 0;
3487
+ transform: translateY(-8px);
3488
+ }
3489
+ to {
3490
+ opacity: 1;
3491
+ transform: translateY(0);
3492
+ }
3493
+ }
3494
+
3495
+ @keyframes dropdownExit {
3496
+ from {
3497
+ opacity: 1;
3498
+ transform: translateY(0);
3499
+ }
3500
+ to {
3501
+ opacity: 0;
3502
+ transform: translateY(-8px);
3503
+ }
3504
+ }
3505
+
3506
+ /* Dropdown inside voa-select-base - visual styles only */
3507
+ /* Structural positioning is in voa-select-base.css */
3508
+ /* Listbox container (role="listbox") */
3509
+ voa-select-base::part(dropdown) {
3510
+ /* Visual styles - Figma specs */
3511
+ background-color: var(--colors-structure-bg-base, #ffffff);
3512
+
3513
+ /* Outline - 1.125px border using design token */
3514
+ border: var(--border-width-medium) solid var(--colors-structure-border-color, #adb5bd);
3515
+ border-radius: 15.75px;
3516
+
3517
+ /* Shadow for elevation - Figma: drop shadow effect with enhanced depth */
3518
+ box-shadow: var(--voa-shadow-option, 0px 8px 16px rgba(0, 0, 0, 0.15)),
3519
+ 0px 0px 0px 0.5px var(--colors-structure-border-color, #adb5bd),
3520
+ inset 0px 0px 0px 1px var(--colors-structure-border-color, #adb5bd);
3521
+
3522
+ /* Padding inside dropdown - vertical only */
3523
+ padding: var(--structure-large-spacing-sm, 8px) 0;
3524
+
3525
+ /* Animation - entrance effect */
3526
+ animation: dropdownEnter 0.2s ease-out forwards;
3527
+ opacity: 1;
3528
+ transform: translateY(0);
3529
+
3530
+ /* Box-sizing */
3531
+ box-sizing: border-box;
3532
+
3533
+ /* Ensure proper stacking context */
3534
+ position: relative;
3535
+ z-index: 1000;
3536
+ }
3537
+
3538
+ /* Exit animation state - when dropdown is hidden */
3539
+ voa-select-base::part(dropdown).voa-select__dropdown--hidden {
3540
+ animation: dropdownExit 0.15s ease-in forwards;
3541
+ visibility: hidden;
3542
+ pointer-events: none;
3543
+ }
3544
+
3545
+ /* ============================================
3546
+ DROPDOWN OPTION - Individual option
3547
+ ============================================ */
3548
+
3549
+ voa-select-base::part(option) {
3550
+ /* Padding for options - Figma: 8px vertical, 12px horizontal */
3551
+ padding: 8px 12px;
3552
+
3553
+ /* Typography - Figma: Lato Regular 16px / 24px */
3554
+ font-family: var(--branding-coi-type-family-sans, 'Lato', sans-serif);
3555
+ font-size: 16px;
3556
+ font-weight: var(--typography-base-body-sm-regular-weight);
3557
+ line-height: 24px;
3558
+ font-style: normal;
3559
+
3560
+ /* Color - Figma: text-primary */
3561
+ color: var(--text-primary, #0b1215);
3562
+
3563
+ /* Box-sizing */
3564
+ box-sizing: border-box;
3565
+
3566
+ /* Smooth transitions for all state changes */
3567
+ transition: background-color 0.2s ease, color 0.2s ease;
3568
+ }
3569
+
3570
+ /* Hover state for options */
3571
+ voa-select-base::part(option):hover {
3572
+ background-color: var(--colors-structure-bg-container, #f1f3f5);
3573
+ cursor: pointer;
3574
+ }
3575
+
3576
+ /* Active state for options (keyboard navigation highlight) */
3577
+ voa-select-base .voa-select__option--active {
3578
+ background-color: var(--colors-structure-bg-container, #f1f3f5);
3579
+ }
3580
+
3581
+ /* Selected state for options */
3582
+ voa-select-base .voa-select__option--selected {
3583
+ background-color: var(--branding-coi-colors-light-primary-light-opacity-15, rgba(0, 100, 203, 0.15));
3584
+ color: var(--branding-coi-colors-light-primary-light, #0064cb);
3585
+ }
3586
+
3587
+ /* Disabled state for options */
3588
+ voa-select-base .voa-select__option--disabled {
3589
+ opacity: 0.5;
3590
+ cursor: not-allowed;
3591
+ pointer-events: none;
3592
+ }
3593
+
3594
+ /* ============================================
3595
+ DROPDOWN INDICATOR - Dropdown icon
3596
+ ============================================ */
3597
+
3598
+ /* Dropdown icon is inside voa-select-base */
3599
+ voa-select-base::part(indicator) {
3600
+ /* Icon size - Figma: 24px */
3601
+ width: 24px;
3602
+ height: 24px;
3603
+ flex-shrink: 0;
3604
+
3605
+ /* Color - Figma: text-primary */
3606
+ color: var(--text-primary, #0b1215);
3607
+
3608
+ /* Ensure proper display */
3609
+ display: flex;
3610
+ align-items: center;
3611
+ justify-content: center;
3612
+
3613
+ box-sizing: border-box;
3614
+ }
3615
+
3616
+ voa-select-base::part(indicator) svg {
3617
+ width: 100%;
3618
+ height: 100%;
3619
+ display: block;
3620
+ }
3621
+
3622
+ /* Disabled state for dropdown indicator */
3623
+ voa-select[disabled] voa-select-base::part(indicator),
3624
+ voa-select[data-state="disabled"] voa-select-base::part(indicator) {
3625
+ /* Color - Figma: text-disabled with opacity */
3626
+ color: var(--text-disabled-with-opacity, rgba(11, 18, 21, 0.25));
3627
+ }
3628
+
3629
+ /* ============================================
3630
+ voa-switch.external.css
3631
+ ============================================ */
3632
+
3633
+ /**
3634
+ * Estilização Externa do VoaSwitch
3635
+ *
3636
+ * Este arquivo demonstra como estilizar o componente voa-switch
3637
+ * usando CSS Parts API e design tokens semânticos.
3638
+ *
3639
+ * Baseado no design do Figma:
3640
+ * https://www.figma.com/design/wDStUEuqpl7Tu1oHpiAml6/Voa-Design-System?node-id=443-10259
3641
+ *
3642
+ * Para usar, importe este arquivo após os tokens:
3643
+ * * *
3644
+ * MAPEAMENTO DE TOKENS DO FIGMA PARA STYLE DICTIONARY:
3645
+ *
3646
+ * Figma Token → Style Dictionary Token
3647
+ * --------------------------------------------
3648
+ * --asset-colors/brand-base → --brand-base (#0064cb)
3649
+ * --asset-colors/brand-secondary → --brand-secondary (#00e5ce)
3650
+ * --asset-colors/brand-secondary-50 → --brand-secondary-50 (rgba(0,229,206,0.5)) - Estado OFF default
3651
+ * --asset-colors/brand-secondary-15 → --brand-secondary-15 (rgba(0,229,206,0.15)) - Estado disabled
3652
+ * --structure-colors/fill-secondary → --structure-colors-fill-secondary (rgba(24,24,27,0.06))
3653
+ * --structure-colors/fill-15 → --structure-colors-fill-15 (rgba(24,24,27,0.15))
3654
+ * --structure-colors/fill-terciary → --structure-colors-fill-terciary (rgba(24,24,27,0.04))
3655
+ * --structure-colors/fill-quaternary → --structure-colors-fill-quaternary (rgba(24,24,27,0.02))
3656
+ * --radius/radius-round → --radius-round (1024px)
3657
+ * --spacing/spacing-sm → --spacing-spacing-sm (8px)
3658
+ * --base/family/family-sans → --font-family-sans ('Lato')
3659
+ * --asset-colors/text-primary → --text-primary (#0b1215)
3660
+ */
3661
+
3662
+ /* ============================================
3663
+ BASE - Container do switch
3664
+ ============================================ */
3665
+
3666
+ voa-switch::part(base) {
3667
+ /* Gap estrutural - Token semântico conforme Figma */
3668
+ gap: var(--structure-large-spacing-sm);
3669
+ }
3670
+
3671
+ /* Sem label, sem gap */
3672
+ voa-switch[show-label="false"]::part(base) {
3673
+ gap: 0;
3674
+ }
3675
+
3676
+ /* ============================================
3677
+ TRACK - Container do switch (40px x 20px)
3678
+ ============================================ */
3679
+
3680
+ voa-switch::part(track) {
3681
+ /* Border radius conforme Figma */
3682
+ border-radius: var(--structure-large-radius-round);
3683
+ /* 1024px - completamente arredondado */
3684
+ border: var(--border-width-thin) solid var(--colors-structure-fill-secondary);
3685
+ /* rgba(24,24,27,0.06) */
3686
+ box-sizing: border-box;
3687
+ /* Transições suaves para mudanças de cor */
3688
+ transition: background-color 0.2s cubic-bezier(0.4, 0, 0.2, 1),
3689
+ border-color 0.2s cubic-bezier(0.4, 0, 0.2, 1);
3690
+ }
3691
+
3692
+ /* ============================================
3693
+ THUMB - Elemento circular que se move (16px)
3694
+ ============================================ */
3695
+
3696
+ voa-switch::part(thumb) {
3697
+ /* Border radius conforme Figma */
3698
+ border-radius: var(--structure-large-radius-round);
3699
+ /* 1024px - completamente arredondado */
3700
+ border: var(--border-width-thin) solid;
3701
+ box-sizing: border-box;
3702
+
3703
+ /* Variáveis locais para cálculo de posicionamento robusto */
3704
+ --thumb-size: var(--switch-thumb-size);
3705
+ --track-padding: 2px;
3706
+ --thumb-offset: calc(var(--thumb-size) + var(--track-padding));
3707
+
3708
+ /*
3709
+ * ANIMATION FIX:
3710
+ * Usamos margin-left para animar porque precisamos de referência à largura do PAI (track).
3711
+ * Transform usa % relativo ao próprio elemento, o que não funciona para largura de track variável.
3712
+ * Margin-left com % é relativo à largura do container.
3713
+ */
3714
+ margin-left: 0;
3715
+ transition: margin-left 0.2s cubic-bezier(0.4, 0, 0.2, 1),
3716
+ background-color 0.2s cubic-bezier(0.4, 0, 0.2, 1),
3717
+ border-color 0.2s cubic-bezier(0.4, 0, 0.2, 1);
3718
+ }
3719
+
3720
+ /* Quando checked, move o thumb para a direita */
3721
+ voa-switch[checked]::part(thumb) {
3722
+ /*
3723
+ * CÁLCULO ROBUSTO:
3724
+ * 100% = Largura total do track (variável)
3725
+ * - 16px (thumb)
3726
+ * - 2px (padding direito)
3727
+ * = Posição final correta independente da largura do track
3728
+ */
3729
+ margin-left: calc(100% - var(--thumb-offset));
3730
+ }
3731
+
3732
+ /* ============================================
3733
+ SHADOW - Sombra interna
3734
+ ============================================ */
3735
+
3736
+ voa-switch::part(shadow) {
3737
+ /* Shadow interna conforme Figma: inset 0px 2px 4px 0px rgba(24, 24, 24, 0.25) */
3738
+ box-shadow: var(--shadow-switch-inset);
3739
+ border-radius: inherit;
3740
+ }
3741
+
3742
+ /* ============================================
3743
+ ESTADOS - OFF (default)
3744
+ ============================================ */
3745
+
3746
+ /* Default - Off */
3747
+ voa-switch:not([checked]):not([disabled])::part(track) {
3748
+ background-color: var(--colors-structure-fill-quaternary);
3749
+ /* rgba(24,24,27,0.02) */
3750
+ border-color: var(--colors-structure-fill-secondary);
3751
+ /* rgba(24,24,27,0.06) */
3752
+ }
3753
+
3754
+ voa-switch:not([checked]):not([disabled])::part(thumb) {
3755
+ background-color: var(--brand-secondary-50);
3756
+ /* rgba(0,229,206,0.5) - Atualizado do Figma para melhor contraste */
3757
+ border-color: var(--colors-structure-fill-terciary);
3758
+ /* rgba(24,24,27,0.04) */
3759
+ }
3760
+
3761
+ /* ============================================
3762
+ ESTADOS - ON (checked)
3763
+ ============================================ */
3764
+
3765
+ /* Default - On */
3766
+ voa-switch[checked]:not([disabled])::part(track) {
3767
+ background-color: var(--brand-base);
3768
+ /* #0064cb */
3769
+ border-color: var(--colors-structure-fill-secondary);
3770
+ /* rgba(24,24,27,0.06) */
3771
+ }
3772
+
3773
+ voa-switch[checked]:not([disabled])::part(thumb) {
3774
+ background-color: var(--brand-secondary);
3775
+ /* #00e5ce */
3776
+ border-color: var(--colors-structure-fill-15);
3777
+ /* rgba(24,24,27,0.15) */
3778
+ }
3779
+
3780
+ /* ============================================
3781
+ ESTADO - DISABLED
3782
+ ============================================ */
3783
+
3784
+ /* Disabled - Off */
3785
+ voa-switch:not([checked])[disabled]::part(track) {
3786
+ background-color: var(--colors-structure-fill-quaternary);
3787
+ /* rgba(24,24,27,0.02) */
3788
+ border-color: var(--colors-structure-fill-secondary);
3789
+ /* rgba(24,24,27,0.06) */
3790
+ opacity: 0.5;
3791
+ }
3792
+
3793
+ voa-switch:not([checked])[disabled]::part(thumb) {
3794
+ background-color: var(--brand-secondary-15);
3795
+ /* rgba(0,229,206,0.15) */
3796
+ border-color: var(--colors-structure-fill-terciary);
3797
+ /* rgba(24,24,27,0.04) */
3798
+ opacity: 0.5;
3799
+ }
3800
+
3801
+ /* Disabled - On */
3802
+ voa-switch[checked][disabled]::part(track) {
3803
+ background-color: var(--brand-base);
3804
+ /* #0064cb */
3805
+ border-color: var(--colors-structure-fill-secondary);
3806
+ /* rgba(24,24,27,0.06) */
3807
+ opacity: 0.5;
3808
+ }
3809
+
3810
+ voa-switch[checked][disabled]::part(thumb) {
3811
+ background-color: var(--brand-secondary);
3812
+ /* #00e5ce */
3813
+ border-color: var(--colors-structure-fill-15);
3814
+ /* rgba(24,24,27,0.15) */
3815
+ opacity: 0.5;
3816
+ }
3817
+
3818
+ /* ============================================
3819
+ LABEL - Texto do label
3820
+ ============================================ */
3821
+
3822
+ voa-switch::part(label) {
3823
+ color: var(--text-primary);
3824
+ /* #0b1215 */
3825
+ font-family: var(--font-family-sans, 'Lato', sans-serif);
3826
+ font-size: var(--typography-base-type-scale-6);
3827
+ line-height: var(--line-height-body-md);
3828
+ font-weight: var(--typography-base-body-sm-regular-weight);
3829
+ user-select: none;
3830
+ }
3831
+
3832
+ voa-switch[disabled]::part(label) {
3833
+ color: var(--text-disabled);
3834
+ /* rgba(11,18,21,0.25) */
3835
+ }
3836
+
3837
+ /* ============================================
3838
+ FOCUS VISIBLE - Outline para acessibilidade
3839
+ ============================================ */
3840
+
3841
+ voa-switch:focus-visible::part(base) {
3842
+ outline: var(--border-width-medium) solid var(--brand-base);
3843
+ outline-offset: var(--structure-large-spacing-xs);
3844
+ border-radius: var(--structure-large-radius-xs);
3845
+ }
3846
+
3847
+ /* ============================================
3848
+ voa-tab.external.css
3849
+ ============================================ */
3850
+
3851
+ /**
3852
+ * Estilização Externa do VoaTab e VoaTabItem
3853
+ *
3854
+ * Este arquivo demonstra como estilizar os componentes voa-tab e voa-tab-item
3855
+ * usando CSS Parts API e design tokens semânticos.
3856
+ *
3857
+ * Baseado no design do Figma:
3858
+ * - Tab: https://www.figma.com/design/wDStUEuqpl7Tu1oHpiAml6/Voa-Design-System?node-id=545-553
3859
+ * - Tab Item: https://www.figma.com/design/wDStUEuqpl7Tu1oHpiAml6/Voa-Design-System?node-id=366-1545
3860
+ *
3861
+ * Para usar, importe este arquivo após os tokens:
3862
+ * * *
3863
+ * MAPEAMENTO DE TOKENS DO FIGMA PARA CSS VARIABLES (global.css):
3864
+ *
3865
+ * Figma Token → CSS Variable (from global.css)
3866
+ * -------------------------------------------------------
3867
+ * --asset-colors/brand-base → --brand-base
3868
+ * --asset-colors/text-primary → --text-primary
3869
+ * --asset-colors/text-disabled → --text-disabled (rendered as rgba, ~0.25 opacity)
3870
+ * --spacing/spacing-xs → --spacing-spacing-xs (4px)
3871
+ * --spacing/spacing-sm → --spacing-spacing-sm (8px)
3872
+ * --spacing/spacing-rg → --spacing-spacing-rg (12px)
3873
+ * --spacing/spacing-md → --spacing-spacing-md (16px)
3874
+ * --spacing/spacing-lg → --spacing-spacing-lg (24px)
3875
+ * --spacing/spacing-xxs → --spacing-spacing-xxs (2px)
3876
+ * --radius/radius-md → --radius-md (12px)
3877
+ * --radius/radius-xl → --radius-xl (24px)
3878
+ * --radius/radius-round → --radius-round (1024px)
3879
+ * --base/family/family-sans → --font-family-sans
3880
+ * --semantic-colors/danger → --semantic-colors-danger
3881
+ * --structure-colors/fill-secondary → --structure-colors-fill-secondary
3882
+ * --structure-colors/bg-base → --structure-colors-bg-base
3883
+ */
3884
+
3885
+ /* ============================================
3886
+ VOA-TAB - Container de tabs
3887
+ ============================================ */
3888
+
3889
+ voa-tab::part(base) {
3890
+ /* Border-bottom para separador entre grupos de tabs */
3891
+ border-bottom: var(--border-width-thin) solid var(--text-disabled);
3892
+ box-sizing: border-box;
3893
+ }
3894
+
3895
+ voa-tab::part(list) {
3896
+ /* Gap entre itens conforme direção */
3897
+ box-sizing: border-box;
3898
+ }
3899
+
3900
+ /* Gap horizontal (padrão) */
3901
+ voa-tab[direction="horizontal"]::part(list) {
3902
+ gap: var(--structure-large-spacing-lg);
3903
+ }
3904
+
3905
+ /* Gap vertical */
3906
+ voa-tab[direction="vertical"]::part(list) {
3907
+ gap: var(--structure-large-spacing-md);
3908
+ }
3909
+
3910
+ /* ============================================
3911
+ VOA-TAB-ITEM - Item individual de tab
3912
+ ============================================ */
3913
+
3914
+ /* Base - Tipografia e estrutura */
3915
+ voa-tab-item::part(base) {
3916
+ /* Tipografia - Desktop/Body-sm/Regular */
3917
+ font-family: var(--font-family-sans, 'Lato', sans-serif);
3918
+ font-size: var(--typography-base-body-sm-regular-size);
3919
+ font-weight: var(--typography-base-body-sm-regular-weight);
3920
+ line-height: var(--line-height-body-sm);
3921
+
3922
+ /* Box-sizing */
3923
+ box-sizing: border-box;
3924
+
3925
+ /* Transição suave para estados */
3926
+ /* Transição suave para estados */
3927
+ transition: color 0.2s ease;
3928
+
3929
+ /* Gap entre label e badge */
3930
+ gap: var(--structure-large-spacing-xxs);
3931
+ }
3932
+
3933
+ /* ============================================
3934
+ ESTADOS - Cores por estado
3935
+ ============================================ */
3936
+
3937
+ /* Estado Active - Brand color */
3938
+ voa-tab-item[state="active"]::part(base) {
3939
+ color: var(--brand-base);
3940
+ }
3941
+
3942
+ /* Estado Default - Text primary */
3943
+ voa-tab-item[state="default"]::part(base) {
3944
+ color: var(--text-primary);
3945
+ }
3946
+
3947
+ /* Estado Disabled - Text disabled com opacity */
3948
+ voa-tab-item[state="disabled"]::part(base),
3949
+ voa-tab-item[disabled]::part(base) {
3950
+ color: var(--text-disabled);
3951
+ opacity: 0.4;
3952
+ cursor: not-allowed;
3953
+ pointer-events: none;
3954
+ }
3955
+
3956
+ /* ============================================
3957
+ POSIÇÕES - Padding e borders por posição
3958
+ ============================================ */
3959
+
3960
+ /* Posição Default (bottom border) */
3961
+ voa-tab-item[position="default"]::part(base) {
3962
+ padding-inline: var(--spacing-spacing-xs);
3963
+ padding-block: var(--spacing-spacing-rg);
3964
+ }
3965
+
3966
+ voa-tab-item[position="default"]::part(base)::after {
3967
+ content: '';
3968
+ position: absolute;
3969
+ bottom: 0;
3970
+ left: 0;
3971
+ width: 100%;
3972
+ height: 2px;
3973
+ background-color: var(--brand-base);
3974
+ transform: scaleX(0);
3975
+ transform-origin: center;
3976
+ transition: transform 0.3s ease;
3977
+ }
3978
+
3979
+ voa-tab-item[position="default"][state="active"]::part(base)::after {
3980
+ transform: scaleX(1);
3981
+ }
3982
+
3983
+ /* Posição Top (top border) */
3984
+ voa-tab-item[position="top"]::part(base) {
3985
+ padding-inline: var(--spacing-spacing-xs);
3986
+ padding-block: var(--radius-md);
3987
+ }
3988
+
3989
+ voa-tab-item[position="top"]::part(base)::after {
3990
+ content: '';
3991
+ position: absolute;
3992
+ top: 0;
3993
+ left: 0;
3994
+ width: 100%;
3995
+ height: 2px;
3996
+ background-color: var(--brand-base);
3997
+ transform: scaleX(0);
3998
+ transform-origin: center;
3999
+ transition: transform 0.3s ease;
4000
+ }
4001
+
4002
+ voa-tab-item[position="top"][state="active"]::part(base)::after {
4003
+ transform: scaleX(1);
4004
+ }
4005
+
4006
+ /* Posição Right (right border) */
4007
+ voa-tab-item[position="right"]::part(base) {
4008
+ padding-inline: var(--radius-xl);
4009
+ padding-block: var(--spacing-spacing-sm);
4010
+ }
4011
+
4012
+ voa-tab-item[position="right"]::part(base)::after {
4013
+ content: '';
4014
+ position: absolute;
4015
+ top: 0;
4016
+ right: 0;
4017
+ width: 2px;
4018
+ height: 100%;
4019
+ background-color: var(--brand-base);
4020
+ transform: scaleY(0);
4021
+ transform-origin: center;
4022
+ transition: transform 0.3s ease;
4023
+ }
4024
+
4025
+ voa-tab-item[position="right"][state="active"]::part(base)::after {
4026
+ transform: scaleY(1);
4027
+ }
4028
+
4029
+ /* Posição Left (left border) */
4030
+ voa-tab-item[position="left"]::part(base) {
4031
+ padding-inline: var(--spacing-spacing-lg);
4032
+ padding-block: var(--spacing-spacing-sm);
4033
+ }
4034
+
4035
+ voa-tab-item[position="left"]::part(base)::after {
4036
+ content: '';
4037
+ position: absolute;
4038
+ top: 0;
4039
+ left: 0;
4040
+ width: 2px;
4041
+ height: 100%;
4042
+ background-color: var(--brand-base);
4043
+ transform: scaleY(0);
4044
+ transform-origin: center;
4045
+ transition: transform 0.3s ease;
4046
+ }
4047
+
4048
+ voa-tab-item[position="left"][state="active"]::part(base)::after {
4049
+ transform: scaleY(1);
4050
+ }
4051
+
4052
+ /* ============================================
4053
+ LABEL - Texto do item
4054
+ ============================================ */
4055
+
4056
+ voa-tab-item::part(label) {
4057
+ /* Herda estilos do base, mas pode ser customizado se necessário */
4058
+ display: inline-block;
4059
+ }
4060
+
4061
+ /* ============================================
4062
+ BADGE - Indicador de notificação
4063
+ ============================================ */
4064
+
4065
+ voa-tab-item::part(badge) {
4066
+ /* Estrutura do badge */
4067
+ display: inline-flex;
4068
+ align-items: center;
4069
+ justify-content: center;
4070
+ width: 16px;
4071
+ height: 16px;
4072
+ min-width: 16px;
4073
+ min-height: 16px;
4074
+ box-sizing: border-box;
4075
+
4076
+ /* Cores - Semantic Tokens */
4077
+ background-color: var(--semantic-colors-danger);
4078
+ border: var(--border-width-thick) solid var(--structure-colors-fill-secondary);
4079
+ border-radius: var(--radius-round);
4080
+
4081
+ /* Padding interno */
4082
+ padding: var(--spacing-spacing-xs);
4083
+ }
4084
+
4085
+ voa-tab-item::part(badge) .voa-tab-item__badge-text {
4086
+ /* Tipografia do badge - Typography/Legal-bold */
4087
+ font-family: 'Manrope', sans-serif;
4088
+ font-size: var(--typography-base-legal-bold-size, 10px);
4089
+ font-weight: var(--typography-base-legal-bold-weight, 600);
4090
+ line-height: var(--typography-base-legal-bold-line-height, 16px);
4091
+
4092
+ /* Cores */
4093
+ color: var(--structure-colors-bg-base);
4094
+
4095
+ /* Layout */
4096
+ text-align: center;
4097
+ white-space: nowrap;
4098
+ width: 8px;
4099
+ height: 8px;
4100
+ display: inline-flex;
4101
+ align-items: center;
4102
+ justify-content: center;
4103
+ }
4104
+
4105
+ /* ============================================
4106
+ ESTADOS HOVER/FOCUS
4107
+ ============================================ */
4108
+
4109
+ /* Hover apenas em itens não-disabled */
4110
+ voa-tab-item[state="default"]:hover::part(base),
4111
+ voa-tab-item[state="active"]:hover::part(base) {
4112
+ /* Pode adicionar efeito hover se necessário */
4113
+ opacity: 0.8;
4114
+ }
4115
+
4116
+ voa-tab-item[state="disabled"]:hover::part(base),
4117
+ voa-tab-item[disabled]:hover::part(base) {
4118
+ /* Sem hover em disabled */
4119
+ opacity: 1;
4120
+ }
4121
+
4122
+ /* Focus-visible para acessibilidade WCAG 2.2 AA */
4123
+ voa-tab-item::part(base):focus-visible {
4124
+ outline: 2px solid var(--brand-base);
4125
+ outline-offset: 2px;
4126
+ }
4127
+
4128
+ voa-tab-item[state="disabled"]::part(base):focus-visible,
4129
+ voa-tab-item[disabled]::part(base):focus-visible {
4130
+ /* Sem focus em disabled */
4131
+ outline: none;
4132
+ }
4133
+
4134
+ /* ============================================
4135
+ voa-tag.external.css
4136
+ ============================================ */
4137
+
4138
+ /**
4139
+ * Estilização Externa do VoaTag
4140
+ *
4141
+ * Este arquivo demonstra como estilizar o componente voa-tag
4142
+ * usando CSS Parts API e design tokens semânticos.
4143
+ *
4144
+ * Baseado no design do Figma:
4145
+ * https://www.figma.com/design/wDStUEuqpl7Tu1oHpiAml6/Voa-Design-System?node-id=1436-769
4146
+ *
4147
+ * Para usar, importe este arquivo após os tokens:
4148
+ * * *
4149
+ * MAPEAMENTO DE TOKENS DO FIGMA PARA STYLE DICTIONARY:
4150
+ *
4151
+ * Figma Token → Style Dictionary Token
4152
+ * --------------------------------------------
4153
+ * --structure-colors/bg-container → --structure-colors-bg-container (#f1f3f5)
4154
+ * --structure-colors/border-color → --structure-colors-border-color (#adb5bd)
4155
+ * --spacing/spacing-xs → --spacing-spacing-xs (4px)
4156
+ * --spacing/spacing-sm → --spacing-spacing-sm (8px)
4157
+ * --radius/radius-xs → --radius-xs (4px)
4158
+ * --radius/radius-round → --radius-round (1024px)
4159
+ * --asset-colors/text-primary → --text-primary (#0b1215)
4160
+ * --base/family/family-sans → --typography-base-family-sans ("Lato", sans-serif)
4161
+ *
4162
+ * Tamanhos de fonte do Figma:
4163
+ * - MD: 14px, line-height 16px
4164
+ * - SM: 11px, line-height 12px
4165
+ *
4166
+ * Tamanhos de ícone:
4167
+ * - MD: 16px
4168
+ * - SM: 12px
4169
+ */
4170
+
4171
+ /* ============================================
4172
+ BASE - Container principal do tag
4173
+ ============================================ */
4174
+ voa-tag::part(base) {
4175
+ /* Background padrão - Semantic Token (conforme Figma: structure-colors/bg-container) */
4176
+ background-color: var(--structure-colors-bg-container, #f1f3f5);
4177
+
4178
+ /* Border padrão - 1.5px solid (conforme Figma) */
4179
+ border: var(--border-width-thick, 1.5px) solid var(--structure-colors-border-color, #adb5bd);
4180
+
4181
+ /* Border-radius padrão para shape="default" - Semantic Token (conforme Figma: radius/radius-xs) */
4182
+ border-radius: var(--radius-xs, 4px);
4183
+
4184
+ /* Gap entre elementos - Semantic Token (conforme Figma: spacing/spacing-xs) */
4185
+ gap: var(--spacing-spacing-xs, 4px);
4186
+
4187
+ /* Box-sizing */
4188
+ box-sizing: border-box;
4189
+ }
4190
+
4191
+ /* Shape: Pill - Border-radius completamente arredondado */
4192
+ voa-tag[shape="pill"]::part(base) {
4193
+ /* Border-radius pill - Semantic Token (conforme Figma: radius/radius-round) */
4194
+ border-radius: var(--radius-round, 1024px);
4195
+ }
4196
+
4197
+ /* ============================================
4198
+ PADDING POR TAMANHO
4199
+ ============================================ */
4200
+
4201
+ /* Size: Medium (md) - Padding padrão */
4202
+ voa-tag[size="md"]::part(base) {
4203
+ /* Padding para size md - Semantic Tokens (conforme Figma: spacing/spacing-xs vertical, spacing/spacing-sm horizontal) */
4204
+ padding-block: var(--spacing-spacing-xs, 4px);
4205
+ padding-inline: var(--spacing-spacing-sm, 8px);
4206
+ }
4207
+
4208
+ /* Size: Small (sm) - Padding reduzido */
4209
+ voa-tag[size="sm"]::part(base) {
4210
+ /* Padding menor para size sm - Semantic Token (conforme Figma: spacing/spacing-xs) */
4211
+ padding: var(--spacing-spacing-xs, 4px);
4212
+ }
4213
+
4214
+ /* ============================================
4215
+ LABEL - Texto do tag
4216
+ ============================================ */
4217
+ voa-tag::part(label) {
4218
+ /* Cor do texto - Semantic Token (conforme Figma: asset-colors/text-primary) */
4219
+ color: var(--text-primary, #0b1215);
4220
+
4221
+ /* Família de fonte - Semantic Token (conforme Figma: base/family/family-sans) */
4222
+ font-family: var(--typography-base-family-sans, 'Lato', sans-serif);
4223
+
4224
+ /* Peso da fonte - Regular (400) */
4225
+ font-weight: 400;
4226
+
4227
+ /* Estilo da fonte */
4228
+ font-style: normal;
4229
+ }
4230
+
4231
+ /* Label - Size: Medium (md) */
4232
+ voa-tag[size="md"]::part(label) {
4233
+ /* Tamanho de fonte md - 14px (conforme Figma) */
4234
+ font-size: var(--typography-base-body-sm-regular-size, 14px);
4235
+
4236
+ /* Line-height md - 16px (conforme Figma) */
4237
+ line-height: var(--typography-base-body-sm-regular-line-height, 16px);
4238
+ }
4239
+
4240
+ /* Label - Size: Small (sm) */
4241
+ voa-tag[size="sm"]::part(label) {
4242
+ /* Tamanho de fonte sm - 11px (conforme Figma: Desktop/Body-xs/Regular) */
4243
+ font-size: var(--typography-base-type-scale-9, 11px);
4244
+
4245
+ /* Line-height sm - 12px (conforme Figma) */
4246
+ line-height: 12px;
4247
+ }
4248
+
4249
+ /* ============================================
4250
+ ÍCONES - Containers dos ícones
4251
+ ============================================ */
4252
+ voa-tag::part(icon-start),
4253
+ voa-tag::part(icon-end) {
4254
+ /* Cor dos ícones - usando brand-secondary (conforme Figma: teal/cyan) */
4255
+ color: var(--brand-secondary, #00e5ce);
4256
+
4257
+ /* Alinhamento */
4258
+ display: inline-flex;
4259
+ align-items: center;
4260
+ justify-content: center;
4261
+ }
4262
+
4263
+ /* Ícones - Size: Medium (md) */
4264
+ voa-tag[size="md"]::part(icon-start),
4265
+ voa-tag[size="md"]::part(icon-end) {
4266
+ /* Tamanho do ícone md - 16px (conforme Figma) */
4267
+ width: 16px;
4268
+ height: 16px;
4269
+ }
4270
+
4271
+ /* Ícones - Size: Small (sm) */
4272
+ voa-tag[size="sm"]::part(icon-start),
4273
+ voa-tag[size="sm"]::part(icon-end) {
4274
+ /* Tamanho do ícone sm - 12px (conforme Figma) */
4275
+ width: 12px;
4276
+ height: 12px;
4277
+ }
4278
+
4279
+ /* Estilização de SVGs dentro dos slots de ícone */
4280
+ voa-tag[size="md"] [slot="icon-start"],
4281
+ voa-tag[size="md"] [slot="icon-end"] {
4282
+ width: 16px;
4283
+ height: 16px;
4284
+ fill: var(--brand-secondary, #00e5ce);
4285
+ }
4286
+
4287
+ voa-tag[size="sm"] [slot="icon-start"],
4288
+ voa-tag[size="sm"] [slot="icon-end"] {
4289
+ width: 12px;
4290
+ height: 12px;
4291
+ fill: var(--brand-secondary, #00e5ce);
4292
+ }
4293
+
4294
+ /* ============================================
4295
+ ESTADOS INTERATIVOS (Opcional - para uso futuro)
4296
+ ============================================ */
4297
+
4298
+ /* Hover state */
4299
+ voa-tag:hover::part(base) {
4300
+ /* Sutil destaque no hover */
4301
+ border-color: var(--structure-colors-border-color-secondary, #dee2e6);
4302
+ }
4303
+
4304
+ /* Focus state - Acessibilidade */
4305
+ voa-tag:focus-visible::part(base) {
4306
+ outline: 2px solid var(--brand-base, #0064cb);
4307
+ outline-offset: 2px;
4308
+ }
4309
+
4310
+ /* ============================================
4311
+ DARK THEME SUPPORT
4312
+ ============================================ */
4313
+ [data-theme="dark"] voa-tag::part(base) {
4314
+ /* Background dark - usando tokens dark */
4315
+ background-color: var(--structure-colors-bg-container);
4316
+
4317
+ /* Border dark */
4318
+ border-color: var(--structure-colors-border-color);
4319
+ }
4320
+
4321
+ [data-theme="dark"] voa-tag::part(label) {
4322
+ /* Cor do texto dark - garantir contraste adequado com fallback explícito */
4323
+ color: var(--text-primary, #ffffff);
4324
+ }
4325
+
4326
+ /* Variantes com backgrounds coloridos precisam de texto claro */
4327
+ [data-theme="dark"] voa-tag[variant="solid"]::part(label),
4328
+ [data-theme="dark"] voa-tag[variant="tonal"]::part(label) {
4329
+ color: var(--text-primary, #ffffff);
4330
+ }
4331
+
4332
+ [data-theme="dark"] voa-tag::part(icon-start),
4333
+ [data-theme="dark"] voa-tag::part(icon-end) {
4334
+ /* Cor dos ícones dark - usando brand primary (teal no dark mode) */
4335
+ color: var(--brand-base, #00e5ce);
4336
+ }
4337
+
4338
+ [data-theme="dark"] voa-tag [slot="icon-start"],
4339
+ [data-theme="dark"] voa-tag [slot="icon-end"] {
4340
+ fill: var(--brand-base, #00e5ce);
4341
+ }
4342
+
4343
+ /* ============================================
4344
+ voa-text-area.external.css
4345
+ ============================================ */
4346
+
4347
+ /*
4348
+ * VoaTextArea Component Styles
4349
+ *
4350
+ * Estilos aplicados via CSS Parts API usando design tokens semânticos.
4351
+ * Baseado no design do Figma: https://www.figma.com/design/wDStUEuqpl7Tu1oHpiAml6/Voa-Design-System?node-id=552-1198
4352
+ */
4353
+
4354
+ /* Label Wrapper */
4355
+ voa-text-area::part(label-wrapper) {
4356
+ display: flex;
4357
+ justify-content: space-between;
4358
+ align-items: flex-end;
4359
+ margin-bottom: 6px;
4360
+ gap: var(--spacing-spacing-xs, 4px);
4361
+ }
4362
+
4363
+ /* Label Text */
4364
+ voa-text-area::part(label) {
4365
+ font-family: var(--voa-font-family-sans);
4366
+ font-size: 20px;
4367
+ font-weight: var(--typography-base-body-sm-bold-weight);
4368
+ line-height: 32px;
4369
+ color: var(--text-secondary);
4370
+ flex: 1 0 0;
4371
+ min-width: 0;
4372
+ }
4373
+
4374
+ /* Required Indicator */
4375
+ voa-text-area::part(required-indicator) {
4376
+ color: var(--semantic-colors-danger);
4377
+ margin-left: 2px;
4378
+ }
4379
+
4380
+ /* Label Info Section */
4381
+ voa-text-area::part(label-info) {
4382
+ display: flex;
4383
+ gap: var(--spacing-spacing-xs, 4px);
4384
+ align-items: center;
4385
+ padding-bottom: 6px;
4386
+ }
4387
+
4388
+ /* Label Info Text */
4389
+ voa-text-area::part(label-info-text) {
4390
+ font-family: var(--voa-font-family-sans);
4391
+ font-size: 12px;
4392
+ font-weight: var(--typography-base-body-sm-regular-weight);
4393
+ line-height: 16px;
4394
+ color: var(--text-secondary);
4395
+ }
4396
+
4397
+ /* Label Info Icon */
4398
+ voa-text-area::part(label-info-icon) {
4399
+ width: 16px;
4400
+ height: 16px;
4401
+ color: var(--text-secondary);
4402
+ flex-shrink: 0;
4403
+ }
4404
+
4405
+ /* Textarea Container */
4406
+ voa-text-area::part(container) {
4407
+ background-color: var(--structure-colors-bg-base);
4408
+ border: var(--border-width-medium) solid var(--structure-colors-border-color);
4409
+ border-radius: var(--structure-large-radius-lg);
4410
+ padding: var(--spacing-spacing-sm, 8px);
4411
+ min-height: 120px;
4412
+ position: relative;
4413
+ box-sizing: border-box;
4414
+ transition: border-color 0.2s ease, box-shadow 0.2s ease;
4415
+ display: flex;
4416
+ flex-direction: column;
4417
+ }
4418
+
4419
+ /* Textarea Container - Focused State (Active) */
4420
+ voa-text-area:focus-within::part(container) {
4421
+ border-color: var(--brand-base);
4422
+ box-shadow: inset 0px 0px 8px 2px var(--brand-base-50, rgba(0, 100, 203, 0.5));
4423
+ }
4424
+
4425
+ /* Textarea Container - Error State */
4426
+ voa-text-area[has-error]::part(container) {
4427
+ border-color: var(--semantic-colors-danger);
4428
+ }
4429
+
4430
+ voa-text-area[has-error]:focus-within::part(container) {
4431
+ border-color: var(--semantic-colors-danger);
4432
+ box-shadow: inset 0px 0px 8px 2px var(--semantic-colors-danger);
4433
+ }
4434
+
4435
+ /* Textarea Container - Disabled State */
4436
+ voa-text-area[disabled]::part(container) {
4437
+ background-color: var(--structure-colors-bg-base-disabled);
4438
+ border-color: var(--structure-colors-border-color);
4439
+ opacity: 0.6;
4440
+ cursor: not-allowed;
4441
+ }
4442
+
4443
+ /* Textarea Container - Readonly State */
4444
+ voa-text-area[readonly]::part(container) {
4445
+ background-color: var(--structure-colors-bg-container);
4446
+ }
4447
+
4448
+ /* Textarea Element */
4449
+ voa-text-area::part(textarea) {
4450
+ font-family: var(--voa-font-family-sans);
4451
+ font-size: 16px;
4452
+ font-weight: var(--typography-base-body-sm-regular-weight);
4453
+ line-height: 24px;
4454
+ color: var(--text-primary);
4455
+ background: transparent;
4456
+ border: none;
4457
+ outline: none;
4458
+ resize: none;
4459
+ flex: 1 0 0;
4460
+ min-height: 0;
4461
+ width: 100%;
4462
+ box-sizing: border-box;
4463
+ padding: 0;
4464
+ }
4465
+
4466
+ voa-text-area::part(textarea)::placeholder {
4467
+ color: var(--text-placeholder);
4468
+ }
4469
+
4470
+ /* Textarea - Disabled State */
4471
+ voa-text-area[disabled]::part(textarea) {
4472
+ color: var(--text-disabled);
4473
+ cursor: not-allowed;
4474
+ }
4475
+
4476
+ /* Resize Handle */
4477
+ voa-text-area::part(resize-handle) {
4478
+ position: absolute;
4479
+ bottom: 3px;
4480
+ right: 3px;
4481
+ width: 16px;
4482
+ height: 16px;
4483
+ cursor: nwse-resize;
4484
+ z-index: 10;
4485
+ display: flex;
4486
+ align-items: center;
4487
+ justify-content: center;
4488
+ color: var(--structure-colors-border-color-secondary);
4489
+ box-sizing: border-box;
4490
+ }
4491
+
4492
+ voa-text-area[disabled]::part(resize-handle),
4493
+ voa-text-area[readonly]::part(resize-handle) {
4494
+ display: none;
4495
+ }
4496
+
4497
+ /* Character Counter */
4498
+ voa-text-area::part(character-counter) {
4499
+ font-family: var(--font-family-sans, 'Lato', sans-serif);
4500
+ font-size: 14px;
4501
+ font-weight: var(--typography-base-body-sm-regular-weight);
4502
+ line-height: 16px;
4503
+ color: var(--text-secondary);
4504
+ text-align: right;
4505
+ margin-top: 6px;
4506
+ display: flex;
4507
+ gap: 6px;
4508
+ justify-content: flex-end;
4509
+ align-items: center;
4510
+ }
4511
+
4512
+ /* Error Message */
4513
+ voa-text-area::part(error-message) {
4514
+ font-family: var(--font-family-sans, 'Lato', sans-serif);
4515
+ font-size: 14px;
4516
+ line-height: 16px;
4517
+ color: var(--semantic-colors-danger);
4518
+ margin-top: 6px;
4519
+ display: block;
4520
+ }
4521
+
4522
+ /* ============================================
4523
+ voa-tooltip.external.css
4524
+ ============================================ */
4525
+
4526
+ /**
4527
+ * Estilização Externa do VoaTooltip
4528
+ *
4529
+ * Este arquivo demonstra como estilizar o componente voa-tooltip
4530
+ * usando CSS Parts API e design tokens semânticos.
4531
+ *
4532
+ * Baseado no design do Figma:
4533
+ * https://www.figma.com/design/wDStUEuqpl7Tu1oHpiAml6/Voa-Design-System?node-id=538-2010&t=Kno5mRpQSwBY8jAM-4
4534
+ *
4535
+ * Para usar, importe este arquivo após os tokens:
4536
+ * * *
4537
+ * MAPEAMENTO DE TOKENS DO FIGMA PARA STYLE DICTIONARY:
4538
+ *
4539
+ * Figma Token → Style Dictionary Token
4540
+ * --------------------------------------------
4541
+ * --spacing/spacing-xs → --spacing-spacing-xs (4px)
4542
+ * --spacing/spacing-sm → --spacing-spacing-sm (8px)
4543
+ * --spacing/spacing-rg → --spacing-spacing-rg (12px)
4544
+ * --radius/radius-sm → --radius-sm (8px)
4545
+ * --radius/radius-xxs → --radius-xxs (2px)
4546
+ * --base/family/family-sans → --font-family-sans (Lato)
4547
+ * --structure-colors/bg-elevated → --tooltip-default-bg
4548
+ * --structure-colors/border-color → --tooltip-default-border
4549
+ * --structure-colors/bg-spot → --tooltip-spot-bg
4550
+ * --structure-colors/bg-mask → --tooltip-spot-border
4551
+ * --palette/{color}/{color}-5 → --tooltip-{color}-bg
4552
+ * --palette/{color}/{color}-6 → --tooltip-{color}-border
4553
+ */
4554
+
4555
+ /* ============================================
4556
+ TOOLTIP BODY - Estilos base
4557
+ ============================================ */
4558
+
4559
+ /* Base Tooltip Body - Default Theme */
4560
+ voa-tooltip::part(body) {
4561
+ /* Background - Semantic Token (conforme Figma: structure-colors/bg-elevated) */
4562
+ background-color: var(--structure-colors-bg-elevated);
4563
+
4564
+ /* Border - Semantic Token (conforme Figma: structure-colors/border-color) */
4565
+ border: var(--border-width-thick) solid var(--structure-colors-border-color);
4566
+
4567
+ /* Border-radius - Semantic Token (conforme Figma: radius/radius-sm) */
4568
+ border-radius: var(--structure-large-radius-sm);
4569
+
4570
+ /* Padding - Semantic Tokens (conforme Figma: spacing/spacing-sm e spacing/spacing-rg) */
4571
+ padding: var(--structure-large-spacing-sm) var(--structure-large-spacing-rg);
4572
+
4573
+ /* Gap entre ícone e texto - Semantic Token (conforme Figma: spacing/spacing-xs) */
4574
+ gap: var(--structure-large-spacing-xs);
4575
+
4576
+ /* Inset shadow - Semantic Tokens (conforme Figma: radius/radius-xxs e structure-colors/bg-base-disabled) */
4577
+ box-shadow: inset 0px var(--structure-large-radius-xxs) 0px 0px var(--structure-colors-bg-base-disabled);
4578
+
4579
+ /* Box-sizing */
4580
+ box-sizing: border-box;
4581
+
4582
+ /* Variáveis CSS para estilização do triângulo (definidas no componente, podem ser sobrescritas aqui) */
4583
+ --arrow-color: var(--structure-colors-bg-elevated);
4584
+ --arrow-border-color: var(--structure-colors-border-color);
4585
+ --tooltip-bg: var(--structure-colors-bg-elevated);
4586
+ }
4587
+
4588
+ /* ============================================
4589
+ TOOLTIP CONTENT - Tipografia
4590
+ ============================================ */
4591
+
4592
+ voa-tooltip::part(content) {
4593
+ /* Cor do texto - Semantic Token (conforme Figma: asset-colors/text-primary) */
4594
+ color: var(--text-primary);
4595
+
4596
+ /* Font-family - Semantic Token (conforme Figma: base/family/family-sans) */
4597
+ font-family: var(--font-family-sans);
4598
+
4599
+ /* Font-size e line-height conforme Figma: Body-sm/Regular (14px / 16px) */
4600
+ font-size: var(--typography-base-body-sm-regular-size);
4601
+ line-height: var(--line-height-body-sm);
4602
+
4603
+ /* Text-align conforme design */
4604
+ text-align: center;
4605
+ }
4606
+
4607
+ /* ============================================
4608
+ TOOLTIP ARROW - Criado via ::after do body
4609
+ ============================================ */
4610
+
4611
+ /* As pseudo-elementos ::before e ::after do triângulo são criados no CSS estrutural do componente */
4612
+ /* A estilização (cores) é feita via variáveis CSS definidas aqui */
4613
+
4614
+ /* ============================================
4615
+ TEMA: SPOT (fundo escuro)
4616
+ ============================================ */
4617
+
4618
+ voa-tooltip[theme="spot"]::part(body) {
4619
+ background-color: var(--structure-colors-bg-spot);
4620
+ border-color: var(--structure-colors-bg-mask);
4621
+ }
4622
+
4623
+ voa-tooltip[theme="spot"]::part(content) {
4624
+ color: var(--text-on-primary);
4625
+ }
4626
+
4627
+ voa-tooltip[theme="spot"]::part(body) {
4628
+ --arrow-color: var(--structure-colors-bg-spot);
4629
+ --arrow-border-color: var(--structure-colors-bg-mask);
4630
+ --tooltip-bg: var(--structure-colors-bg-spot);
4631
+ }
4632
+
4633
+ /* ============================================
4634
+ TEMA: PINK
4635
+ ============================================ */
4636
+
4637
+ voa-tooltip[theme="pink"]::part(body) {
4638
+ background-color: var(--palette-pink-pink-5);
4639
+ border-color: var(--palette-pink-pink-6);
4640
+ }
4641
+
4642
+ voa-tooltip[theme="pink"]::part(content) {
4643
+ color: var(--structure-colors-bg-base);
4644
+ }
4645
+
4646
+ voa-tooltip[theme="pink"]::part(body) {
4647
+ --arrow-color: var(--palette-pink-pink-5);
4648
+ --arrow-border-color: var(--palette-pink-pink-6);
4649
+ --tooltip-bg: var(--palette-pink-pink-5);
4650
+ }
4651
+
4652
+ /* ============================================
4653
+ TEMA: GRAPE
4654
+ ============================================ */
4655
+
4656
+ voa-tooltip[theme="grape"]::part(body) {
4657
+ background-color: var(--palette-grape-grape-5);
4658
+ border-color: var(--palette-grape-grape-6);
4659
+ }
4660
+
4661
+ voa-tooltip[theme="grape"]::part(content) {
4662
+ color: var(--structure-colors-bg-base);
4663
+ }
4664
+
4665
+ voa-tooltip[theme="grape"]::part(body) {
4666
+ --arrow-color: var(--palette-grape-grape-5);
4667
+ --arrow-border-color: var(--palette-grape-grape-6);
4668
+ --tooltip-bg: var(--palette-grape-grape-5);
4669
+ }
4670
+
4671
+ /* ============================================
4672
+ TEMA: VIOLET
4673
+ ============================================ */
4674
+
4675
+ voa-tooltip[theme="violet"]::part(body) {
4676
+ background-color: var(--palette-violet-violet-5);
4677
+ border-color: var(--palette-violet-violet-6);
4678
+ }
4679
+
4680
+ voa-tooltip[theme="violet"]::part(content) {
4681
+ color: var(--structure-colors-bg-base);
4682
+ }
4683
+
4684
+ voa-tooltip[theme="violet"]::part(body) {
4685
+ --arrow-color: var(--palette-violet-violet-5);
4686
+ --arrow-border-color: var(--palette-violet-violet-6);
4687
+ --tooltip-bg: var(--palette-violet-violet-5);
4688
+ }
4689
+
4690
+ /* ============================================
4691
+ TEMA: INDIGO
4692
+ ============================================ */
4693
+
4694
+ voa-tooltip[theme="indigo"]::part(body) {
4695
+ background-color: var(--palette-indigo-indigo-5);
4696
+ border-color: var(--palette-indigo-indigo-6);
4697
+ }
4698
+
4699
+ voa-tooltip[theme="indigo"]::part(content) {
4700
+ color: var(--structure-colors-bg-base);
4701
+ }
4702
+
4703
+ voa-tooltip[theme="indigo"]::part(body) {
4704
+ --arrow-color: var(--palette-indigo-indigo-5);
4705
+ --arrow-border-color: var(--palette-indigo-indigo-6);
4706
+ --tooltip-bg: var(--palette-indigo-indigo-5);
4707
+ }
4708
+
4709
+ /* ============================================
4710
+ TEMA: BLUE
4711
+ ============================================ */
4712
+
4713
+ voa-tooltip[theme="blue"]::part(body) {
4714
+ background-color: var(--palette-blue-blue-5);
4715
+ border-color: var(--palette-blue-blue-6);
4716
+ }
4717
+
4718
+ voa-tooltip[theme="blue"]::part(content) {
4719
+ color: var(--structure-colors-bg-base);
4720
+ }
4721
+
4722
+ voa-tooltip[theme="blue"]::part(body) {
4723
+ --arrow-color: var(--palette-blue-blue-5);
4724
+ --arrow-border-color: var(--palette-blue-blue-6);
4725
+ --tooltip-bg: var(--palette-blue-blue-5);
4726
+ }
4727
+
4728
+ /* ============================================
4729
+ TEMA: CYAN
4730
+ ============================================ */
4731
+
4732
+ voa-tooltip[theme="cyan"]::part(body) {
4733
+ background-color: var(--palette-cyan-cyan-5);
4734
+ border-color: var(--palette-cyan-cyan-6);
4735
+ }
4736
+
4737
+ voa-tooltip[theme="cyan"]::part(content) {
4738
+ color: var(--structure-colors-bg-base);
4739
+ }
4740
+
4741
+ voa-tooltip[theme="cyan"]::part(body) {
4742
+ --arrow-color: var(--palette-cyan-cyan-5);
4743
+ --arrow-border-color: var(--palette-cyan-cyan-6);
4744
+ --tooltip-bg: var(--palette-cyan-cyan-5);
4745
+ }
4746
+
4747
+ /* ============================================
4748
+ TEMA: TEAL
4749
+ ============================================ */
4750
+
4751
+ voa-tooltip[theme="teal"]::part(body) {
4752
+ background-color: var(--palette-teal-teal-5);
4753
+ border-color: var(--palette-teal-teal-6);
4754
+ }
4755
+
4756
+ voa-tooltip[theme="teal"]::part(content) {
4757
+ color: var(--structure-colors-bg-base);
4758
+ }
4759
+
4760
+ voa-tooltip[theme="teal"]::part(body) {
4761
+ --arrow-color: var(--palette-teal-teal-5);
4762
+ --arrow-border-color: var(--palette-teal-teal-6);
4763
+ --tooltip-bg: var(--palette-teal-teal-5);
4764
+ }
4765
+
4766
+ /* ============================================
4767
+ TEMA: LIME
4768
+ ============================================ */
4769
+
4770
+ voa-tooltip[theme="lime"]::part(body) {
4771
+ background-color: var(--palette-lime-lime-5);
4772
+ border-color: var(--palette-lime-lime-6);
4773
+ }
4774
+
4775
+ voa-tooltip[theme="lime"]::part(content) {
4776
+ color: var(--structure-colors-bg-base);
4777
+ }
4778
+
4779
+ voa-tooltip[theme="lime"]::part(body) {
4780
+ --arrow-color: var(--palette-lime-lime-5);
4781
+ --arrow-border-color: var(--palette-lime-lime-6);
4782
+ --tooltip-bg: var(--palette-lime-lime-5);
4783
+ }
4784
+
4785
+ /* ============================================
4786
+ TEMA: ORANGE
4787
+ ============================================ */
4788
+
4789
+ voa-tooltip[theme="orange"]::part(body) {
4790
+ background-color: var(--palette-orange-orange-5);
4791
+ border-color: var(--palette-orange-orange-6);
4792
+ }
4793
+
4794
+ voa-tooltip[theme="orange"]::part(content) {
4795
+ color: var(--structure-colors-bg-base);
4796
+ }
4797
+
4798
+ voa-tooltip[theme="orange"]::part(body) {
4799
+ --arrow-color: var(--palette-orange-orange-5);
4800
+ --arrow-border-color: var(--palette-orange-orange-6);
4801
+ --tooltip-bg: var(--palette-orange-orange-5);
4802
+ }
4803
+
4804
+ /* ============================================
4805
+ DARK THEME SUPPORT
4806
+ ============================================ */
4807
+
4808
+ [data-theme="dark"] voa-tooltip::part(body) {
4809
+ /* Background dark - usando tokens dark */
4810
+ background-color: var(--structure-colors-bg-elevated);
4811
+
4812
+ /* Border dark */
4813
+ border-color: var(--structure-colors-border-color);
4814
+
4815
+ /* Arrow colors for dark mode */
4816
+ --arrow-color: var(--structure-colors-bg-elevated);
4817
+ --arrow-border-color: var(--structure-colors-border-color);
4818
+ --tooltip-bg: var(--structure-colors-bg-elevated);
4819
+ }
4820
+
4821
+ [data-theme="dark"] voa-tooltip::part(content) {
4822
+ /* Cor do texto dark - garantir contraste adequado */
4823
+ color: var(--text-primary, #ffffff);
4824
+ }
4825
+
4826
+ /* ============================================
4827
+ ICON SLOT - Estilização do ícone
4828
+ ============================================ */
4829
+
4830
+ voa-tooltip::part(icon-slot) {
4831
+ display: flex;
4832
+ align-items: center;
4833
+ justify-content: center;
4834
+ flex-shrink: 0;
4835
+ }
4836
+
4837
+ voa-tooltip::part(icon-slot) ::slotted(*) {
4838
+ width: 16px;
4839
+ height: 16px;
4840
+ flex-shrink: 0;
4841
+ }