voa-ds-core 1.0.4 → 1.0.5

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