voa-ds-core 1.0.8 → 1.0.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. package/dist/collection/components/GetStarted/ImportandoEstilos.stories.js +32 -11
  2. package/dist/collection/components/GetStarted/ImportandoEstilos.stories.js.map +1 -1
  3. package/dist/collection/styles/external/saas-dashboard.css +566 -0
  4. package/dist/collection/styles/external/voa-accordion.external.css +295 -0
  5. package/dist/collection/styles/external/voa-alert.external.css +348 -0
  6. package/dist/collection/styles/external/voa-avatar.external.css +118 -0
  7. package/dist/collection/styles/external/voa-badge.external.css +346 -0
  8. package/dist/collection/styles/external/voa-breadcrumbs.external.css +183 -0
  9. package/dist/collection/styles/external/voa-button.external.css +257 -0
  10. package/dist/collection/styles/external/voa-card.external.css +30 -0
  11. package/dist/collection/styles/external/voa-checkbox.external.css +303 -0
  12. package/dist/collection/styles/external/voa-input-addon.external.css +204 -0
  13. package/dist/collection/styles/external/voa-input.external.css +307 -0
  14. package/dist/collection/styles/external/voa-keybinding.external.css +34 -0
  15. package/dist/collection/styles/external/voa-option.external.css +213 -0
  16. package/dist/collection/styles/external/voa-pagination.external.css +125 -0
  17. package/dist/collection/styles/external/voa-radio.external.css +235 -0
  18. package/dist/collection/styles/external/voa-radio.styles.ts +155 -0
  19. package/dist/collection/styles/external/voa-select.external.css +568 -0
  20. package/dist/collection/styles/external/voa-switch.external.css +215 -0
  21. package/dist/collection/styles/external/voa-tab.external.css +284 -0
  22. package/dist/collection/styles/external/voa-tag.external.css +206 -0
  23. package/dist/collection/styles/external/voa-text-area.external.css +174 -0
  24. package/dist/collection/styles/external/voa-tooltip.external.css +320 -0
  25. package/dist/collection/styles/voa-components.css +32 -0
  26. package/dist/voa/styles/external/saas-dashboard.css +566 -0
  27. package/dist/voa/styles/external/voa-accordion.external.css +295 -0
  28. package/dist/voa/styles/external/voa-alert.external.css +348 -0
  29. package/dist/voa/styles/external/voa-avatar.external.css +118 -0
  30. package/dist/voa/styles/external/voa-badge.external.css +346 -0
  31. package/dist/voa/styles/external/voa-breadcrumbs.external.css +183 -0
  32. package/dist/voa/styles/external/voa-button.external.css +257 -0
  33. package/dist/voa/styles/external/voa-card.external.css +30 -0
  34. package/dist/voa/styles/external/voa-checkbox.external.css +303 -0
  35. package/dist/voa/styles/external/voa-input-addon.external.css +204 -0
  36. package/dist/voa/styles/external/voa-input.external.css +307 -0
  37. package/dist/voa/styles/external/voa-keybinding.external.css +34 -0
  38. package/dist/voa/styles/external/voa-option.external.css +213 -0
  39. package/dist/voa/styles/external/voa-pagination.external.css +125 -0
  40. package/dist/voa/styles/external/voa-radio.external.css +235 -0
  41. package/dist/voa/styles/external/voa-radio.styles.ts +155 -0
  42. package/dist/voa/styles/external/voa-select.external.css +568 -0
  43. package/dist/voa/styles/external/voa-switch.external.css +215 -0
  44. package/dist/voa/styles/external/voa-tab.external.css +284 -0
  45. package/dist/voa/styles/external/voa-tag.external.css +206 -0
  46. package/dist/voa/styles/external/voa-text-area.external.css +174 -0
  47. package/dist/voa/styles/external/voa-tooltip.external.css +320 -0
  48. package/dist/voa/styles/voa-components.css +32 -0
  49. package/package.json +3 -1
@@ -0,0 +1,257 @@
1
+ /**
2
+ * Estilização Externa do VoaButton
3
+ *
4
+ * Este arquivo demonstra como estilizar o componente voa-button
5
+ * usando CSS Parts API e design tokens semânticos.
6
+ *
7
+ * Baseado no design do Figma:
8
+ * https://www.figma.com/design/wDStUEuqpl7Tu1oHpiAml6/Voa-Design-System?node-id=515-327
9
+ */
10
+
11
+ /* ============================================
12
+ BASE - Elemento raiz do botão
13
+ ============================================ */
14
+
15
+ voa-button::part(base) {
16
+ /* Tipografia */
17
+ font-family: var(--font-family-sans, 'Lato', sans-serif);
18
+ font-size: var(--typography-base-body-sm-regular-size); /* Desktop/Body-sm/Regular */
19
+ font-weight: var(--typography-base-body-sm-regular-weight);
20
+ line-height: var(--line-height-body-sm);
21
+
22
+ /* Box-sizing */
23
+ box-sizing: border-box;
24
+
25
+ /* Transição suave */
26
+ transition: all 0.2s ease;
27
+ }
28
+
29
+ /* ============================================
30
+ TAMANHOS (Size)
31
+ ============================================ */
32
+
33
+ /* Small (sm) */
34
+ voa-button[size="sm"]::part(base) {
35
+ /* Padding: Vertical 4px, Horizontal 16px */
36
+ padding-block: var(--spacing-spacing-xs, 4px);
37
+ padding-inline: var(--spacing-spacing-md, 16px);
38
+
39
+ border-radius: var(--radius-xs, 4px);
40
+ gap: 10px;
41
+ }
42
+
43
+ /* Medium (md) */
44
+ voa-button[size="md"]::part(base) {
45
+ /* Padding: Vertical 8px, Horizontal 4px */
46
+ padding-block: var(--spacing-spacing-sm, 8px);
47
+ padding-inline: var(--spacing-spacing-xs, 4px);
48
+
49
+ min-width: 82px;
50
+ border-radius: var(--radius-sm, 8px);
51
+ gap: 4px;
52
+ }
53
+
54
+ /* Large (lg) - padrão */
55
+ voa-button[size="lg"]::part(base) {
56
+ /* Padding: Vertical 12px, Horizontal 4px */
57
+ padding-block: var(--spacing-spacing-rg, 12px);
58
+ padding-inline: var(--spacing-spacing-xs, 4px);
59
+
60
+ min-width: 98px;
61
+ border-radius: var(--radius-sm, 8px);
62
+ gap: 10px;
63
+ }
64
+
65
+ /* Ajuste de gap para variantes específicas no tamanho LG */
66
+ voa-button[size="lg"][variant="tonal"]::part(base),
67
+ voa-button[size="lg"][variant="ghost"]::part(base),
68
+ voa-button[size="lg"][variant="link"]::part(base) {
69
+ gap: var(--spacing-spacing-xs, 4px);
70
+ }
71
+
72
+ /* ============================================
73
+ VARIANTES (Type)
74
+ ============================================ */
75
+
76
+ /* Primary */
77
+ voa-button[variant="primary"]::part(base) {
78
+ background-color: var(--brand-base, #0064cb);
79
+ color: var(--text-on-primary, #f1f1f1);
80
+ border: var(--border-width-thin) solid var(--structure-colors-fill-secondary, rgba(24, 24, 27, 0.06));
81
+ }
82
+
83
+ voa-button[variant="primary"]:hover::part(base) {
84
+ background-color: var(--brand-hover, #00398d);
85
+ border-color: var(--brand-base-50, rgba(0, 100, 203, 0.5));
86
+ }
87
+
88
+ voa-button[variant="primary"]:active::part(base) {
89
+ background-color: var(--brand-active, #008fff);
90
+ border-color: var(--structure-colors-fill-secondary, rgba(24, 24, 27, 0.06));
91
+ }
92
+
93
+ /* Secondary */
94
+ voa-button[variant="secondary"]::part(base) {
95
+ background-color: var(--brand-secondary, #00e5ce);
96
+ color: var(--text-primary, #0b1215);
97
+ border: var(--border-width-thin) solid var(--structure-colors-fill-secondary, rgba(24, 24, 27, 0.06));
98
+ }
99
+
100
+ voa-button[variant="secondary"]:hover::part(base) {
101
+ /* Figma indica bg-secondary também no hover, talvez mude apenas borda ou sombra?
102
+ Mantendo conforme token do Figma output */
103
+ background-color: var(--brand-secondary, #00e5ce);
104
+ border-color: var(--structure-colors-bg-mask, rgba(0, 0, 0, 0.45));
105
+ }
106
+
107
+ voa-button[variant="secondary"]:active::part(base) {
108
+ /* Figma indica gradient overlay, simplificado aqui para tokens se possível */
109
+ background-color: var(--brand-secondary, #00e5ce);
110
+ border-color: var(--structure-colors-fill-secondary, rgba(24, 24, 27, 0.06));
111
+ }
112
+
113
+ /* Tonal */
114
+ voa-button[variant="tonal"]::part(base) {
115
+ background-color: var(--brand-base-25, rgba(0, 100, 203, 0.25));
116
+ color: var(--text-primary, #0b1215);
117
+ border: none;
118
+ /* Nota: Figma não mostra borda explicita no default tonal LG,
119
+ mas mostra borda transparente/base no disabled/active em alguns casos.
120
+ Vamos manter sem borda ou borda transparente para evitar pulos de layout. */
121
+ border: var(--border-width-thin) solid transparent;
122
+ }
123
+
124
+ voa-button[variant="tonal"]:hover::part(base) {
125
+ background-color: var(--brand-base-50, rgba(0, 100, 203, 0.5));
126
+ }
127
+
128
+ voa-button[variant="tonal"]:active::part(base) {
129
+ background-color: var(--brand-base-15, rgba(0, 100, 203, 0.15));
130
+ }
131
+
132
+ /* Ghost */
133
+ voa-button[variant="ghost"]::part(base) {
134
+ background-color: transparent;
135
+ color: var(--brand-base, #0064cb);
136
+ border: var(--border-width-thin) solid var(--brand-base, #0064cb);
137
+ }
138
+
139
+ voa-button[variant="ghost"]:hover::part(base) {
140
+ border-color: var(--brand-hover, #00398d);
141
+ color: var(--colors-light-secondary-light, #00e5ce); /* Figma output mostra cor secundária no hover? */
142
+ }
143
+
144
+ voa-button[variant="ghost"]:active::part(base) {
145
+ background-color: var(--brand-base-15, rgba(0, 100, 203, 0.15));
146
+ border-color: var(--brand-base, #0064cb);
147
+ color: var(--colors-light-secondary-light, #00e5ce);
148
+ }
149
+
150
+ /* Link */
151
+ voa-button[variant="link"]::part(base) {
152
+ background-color: transparent;
153
+ color: var(--palette-blue-blue-7, #1c7ed6);
154
+ border: none;
155
+ /* Mantendo borda transparente para consistência de box-model se necessário,
156
+ mas link geralmente não tem borda. Figma não mostra borda. */
157
+ }
158
+
159
+ voa-button[variant="link"]:hover::part(base) {
160
+ color: var(--palette-blue-blue-9, #1864ab);
161
+ text-decoration: underline;
162
+ }
163
+
164
+ voa-button[variant="link"]:active::part(base) {
165
+ color: var(--palette-blue-blue-6, #228be6);
166
+ }
167
+
168
+ /* ============================================
169
+ ESTADOS DISABLED E LOADING
170
+ ============================================ */
171
+
172
+ /* Disabled state */
173
+ voa-button[disabled]:not([loading])::part(base) {
174
+ cursor: not-allowed;
175
+
176
+ /* Primary Disabled */
177
+ background-color: var(--brand-base-15, rgba(0, 100, 203, 0.15));
178
+ /* Border color fixed: using semantic token with opacity */
179
+ border-color: var(--colors-structure-fill-secondary, rgba(24, 24, 27, 0.06));
180
+ /* Text color fixed: using value with opacity (token is opaque) */
181
+ color: rgba(11, 18, 21, 0.25);
182
+ }
183
+
184
+ voa-button[variant="secondary"][disabled]:not([loading])::part(base) {
185
+ background-color: var(--brand-secondary-15, rgba(0, 229, 206, 0.15));
186
+ }
187
+
188
+ voa-button[variant="tonal"][disabled]:not([loading])::part(base) {
189
+ /* Using token with opacity */
190
+ background-color: var(--colors-structure-fill-15, rgba(24, 24, 27, 0.15));
191
+ }
192
+
193
+ voa-button[variant="ghost"][disabled]:not([loading])::part(base) {
194
+ background-color: transparent;
195
+ /* Using token with opacity */
196
+ border-color: var(--colors-structure-fill-15, rgba(24, 24, 27, 0.15));
197
+ }
198
+
199
+ voa-button[variant="link"][disabled]:not([loading])::part(base) {
200
+ background-color: transparent;
201
+ color: var(--palette-blue-blue-2, #a5d8ff);
202
+ }
203
+
204
+ /* Loading state */
205
+ voa-button[loading]::part(base),
206
+ voa-button.loading::part(base) {
207
+ opacity: 0.7;
208
+ cursor: not-allowed !important;
209
+ pointer-events: none;
210
+ }
211
+
212
+ /* ============================================
213
+ FOCUS VISIBLE (Acessibilidade)
214
+ ============================================ */
215
+
216
+ voa-button::part(base):focus-visible {
217
+ outline: 2px solid var(--brand-base, #0064cb);
218
+ outline-offset: 2px;
219
+ }
220
+
221
+ /* ============================================
222
+ ELEMENTOS INTERNOS
223
+ ============================================ */
224
+
225
+ /* Label */
226
+ voa-button::part(label) {
227
+ display: inline-block;
228
+ }
229
+
230
+ /* Ícones */
231
+ voa-button::part(icon-leading),
232
+ voa-button::part(icon-trailing) {
233
+ display: inline-flex;
234
+ width: 16px;
235
+ height: 16px;
236
+ }
237
+
238
+ voa-button::part(icon-leading) svg,
239
+ voa-button::part(icon-trailing) svg {
240
+ width: 100%;
241
+ height: 100%;
242
+ fill: currentColor;
243
+ }
244
+
245
+ /* Loader */
246
+ /* Note: @keyframes and animation are defined inside Shadow DOM (voa-button.css)
247
+ because CSS Parts API cannot access @keyframes from external scope.
248
+ Use CSS Custom Properties to customize: --voa-loader-size, --voa-loader-duration */
249
+
250
+ voa-button::part(loader) {
251
+ /* Visual customization - size can override the internal default via CSS var */
252
+ color: currentColor;
253
+ }
254
+
255
+ voa-button[loading]::part(loader) {
256
+ margin-right: var(--spacing-spacing-xs, 4px);
257
+ }
@@ -0,0 +1,30 @@
1
+ /**
2
+ * External Styling for VoaCard
3
+ *
4
+ * Uses CSS Parts API and design tokens.
5
+ */
6
+
7
+ voa-card::part(base) {
8
+ background-color: var(--colors-structure-bg-base, #ffffff);
9
+ border: 1px solid var(--colors-structure-border-color, #e5e7eb);
10
+ border-radius: var(--radius-md, 8px);
11
+ box-shadow: var(--shadow-sm, 0 1px 2px 0 rgba(0, 0, 0, 0.05));
12
+ font-family: var(--font-family-sans, 'Lato', sans-serif);
13
+ color: var(--text-primary, #111827);
14
+ }
15
+
16
+ voa-card::part(header) {
17
+ padding: var(--spacing-spacing-md, 16px);
18
+ border-bottom: 1px solid var(--colors-structure-border-color, #e5e7eb);
19
+ font-weight: 600;
20
+ }
21
+
22
+ voa-card::part(body) {
23
+ padding: var(--spacing-spacing-md, 16px);
24
+ }
25
+
26
+ voa-card::part(footer) {
27
+ padding: var(--spacing-spacing-md, 16px);
28
+ border-top: 1px solid var(--colors-structure-border-color, #e5e7eb);
29
+ background-color: var(--colors-structure-bg-container, #f9fafb);
30
+ }
@@ -0,0 +1,303 @@
1
+ /**
2
+ * Estilização Externa do VoaCheckbox
3
+ *
4
+ * Este arquivo demonstra como estilizar o componente voa-checkbox
5
+ * usando CSS Parts API e design tokens semânticos.
6
+ *
7
+ * Baseado no design do Figma:
8
+ * https://www.figma.com/design/wDStUEuqpl7Tu1oHpiAml6/Voa-Design-System?node-id=429-677
9
+ *
10
+ * Para usar, importe este arquivo após os tokens:
11
+ * @import '@voa-ds/tokens/global.css';
12
+ * @import '@voa-ds/styles/voa-checkbox.css';
13
+ *
14
+ * MAPEAMENTO DE TOKENS DO FIGMA PARA STYLE DICTIONARY:
15
+ *
16
+ * Figma Token → Style Dictionary Token
17
+ * --------------------------------------------
18
+ * --structure-colors/bg-base → --structure-colors-bg-base (white)
19
+ * --palette/blue/blue-6 → --palette-blue-blue-6 (#228be6)
20
+ * --palette/blue/blue-8 → --palette-blue-blue-8 (#1971c2)
21
+ * --palette/blue/blue-4 → --palette-blue-blue-4 (#4dabf7)
22
+ * --structure-colors/border-color → --structure-colors-border-color (#adb5bd)
23
+ * --asset-colors/brand-base-50 → --brand-base-50 (rgba(0,100,203,0.5))
24
+ * --asset-colors/text-primary → --text-primary (#0b1215)
25
+ * --asset-colors/text-hover → --text-hover (#0064cb)
26
+ * --asset-colors/text-disabled → --text-disabled (rgba(11,18,21,0.25))
27
+ * --spacing/spacing-sm → --spacing-spacing-sm (8px)
28
+ * --border-radius/radius-sm → --radius-sm (4px)
29
+ * --base/family/family-sans → --font-family-sans ('Lato')
30
+ *
31
+ * ESTRUTURA DO COMPONENTE INTERNALS (ElementInternals):
32
+ *
33
+ * O componente agora usa ElementInternals para sincronizar com o Form API nativo:
34
+ * - setFormValue(): Define o valor que será submetido pelo formulário
35
+ * - ariaChecked: Define o estado de acessibilidade ('true' | 'false' | 'mixed')
36
+ * - ariaDisabled: Define se o componente está desabilitado para leitores de tela
37
+ *
38
+ * Estrutura do DOM renderizado:
39
+ * <voa-checkbox>
40
+ * <div part="base" class="checkbox-container">
41
+ * <div part="indicator" class="checkbox-custom">
42
+ * <!-- ::after renderiza o checkmark ou dash via CSS puro -->
43
+ * </div>
44
+ * <span part="label" class="checkbox-label">
45
+ * <slot /> <!-- Conteúdo do label -->
46
+ * </span>
47
+ * </div>
48
+ * </voa-checkbox>
49
+ */
50
+
51
+ /* ============================================
52
+ BASE - Container do checkbox
53
+ ============================================ */
54
+
55
+ voa-checkbox::part(base) {
56
+ /* Gap estrutural - Token semântico conforme Figma */
57
+ gap: var(--structure-large-spacing-sm);
58
+
59
+ /* Tipografia - Semantic Token */
60
+ font-family: var(--font-family-sans, 'Lato', sans-serif);
61
+ font-size: var(--typography-base-type-scale-6);
62
+ line-height: var(--line-height-body-md);
63
+
64
+ /* Transição suave para estados hover/active */
65
+ transition: color 0.2s ease;
66
+ }
67
+
68
+ /* Sem label, sem gap */
69
+ voa-checkbox[show-label="false"]::part(base) {
70
+ gap: 0;
71
+ }
72
+
73
+ /* ============================================
74
+ INDICATOR - Caixa do checkbox
75
+ ============================================ */
76
+
77
+ /* Tamanho padrão (20px conforme Figma) */
78
+ voa-checkbox::part(indicator) {
79
+ width: var(--checkbox-indicator-size);
80
+ height: var(--checkbox-indicator-size);
81
+ border-radius: var(--structure-large-radius-xs);
82
+ border: var(--border-width-thin) solid var(--structure-colors-border-color);
83
+ background-color: var(--structure-colors-bg-base);
84
+ box-sizing: border-box;
85
+ transition: background-color 0.2s ease, border-color 0.2s ease, box-shadow 0.2s ease;
86
+ }
87
+
88
+ /* ============================================
89
+ ESTADOS - INACTIVE (Checkbox não selecionado)
90
+ ============================================ */
91
+
92
+ /* Default - Inactive */
93
+ voa-checkbox[state="inactive"]:not([disabled])::part(indicator) {
94
+ background-color: var(--structure-colors-bg-base); /* white */
95
+ border-color: var(--structure-colors-border-color); /* #adb5bd */
96
+ }
97
+
98
+ voa-checkbox[state="inactive"]:not([disabled])::part(label) {
99
+ color: var(--text-primary); /* #0b1215 */
100
+ }
101
+
102
+ /* Hover - Inactive */
103
+ voa-checkbox[state="inactive"]:hover:not([disabled])::part(indicator) {
104
+ border-color: var(--palette-blue-blue-8); /* #1971c2 */
105
+ }
106
+
107
+ voa-checkbox[state="inactive"]:hover:not([disabled])::part(label) {
108
+ color: var(--text-hover); /* #0064cb */
109
+ }
110
+
111
+ /* Focused - Inactive */
112
+ voa-checkbox[state="inactive"]:focus-visible:not([disabled])::part(indicator) {
113
+ border-color: #196cb8; /* Focused border color do Figma */
114
+ box-shadow: var(--shadow-focus-primary);
115
+ }
116
+
117
+ /* ============================================
118
+ ESTADOS - ACTIVE (Checkbox selecionado)
119
+ ============================================ */
120
+
121
+ /* Default - Active */
122
+ voa-checkbox[state="active"]:not([disabled])::part(indicator) {
123
+ background-color: var(--palette-blue-blue-6); /* #228be6 */
124
+ border-color: var(--palette-blue-blue-8); /* #1971c2 */
125
+ }
126
+
127
+ /*
128
+ * CHECKMARK RENDERING via CSS pseudo-element ::after
129
+ *
130
+ * Structure:
131
+ * - Uses ::after positioned absolutely within .checkbox-custom (part="indicator")
132
+ * - The structural CSS sets: display: inline-flex; align-items: center; justify-content: center
133
+ * - This ensures the ::after checkmark is centered perfectly within the 20x20 box
134
+ *
135
+ * Transform logic:
136
+ * - translate(-50%, -50%): Center the element at the box center
137
+ * - rotate(45deg): Rotate to create the checkmark angle
138
+ *
139
+ * Border drawing:
140
+ * - border-right: 2px solid white (vertical part of checkmark)
141
+ * - border-bottom: 2px solid white (horizontal part of checkmark)
142
+ * - Creates an inverted "L" that looks like a checkmark when rotated
143
+ */
144
+ voa-checkbox[state="active"]:not([disabled])::part(indicator)::after {
145
+ content: '';
146
+ position: absolute;
147
+ left: 50%;
148
+ top: 50%;
149
+ transform: translate(-50%, -50%) rotate(45deg);
150
+ width: 4px;
151
+ height: 8px;
152
+ border-right: 2px solid white;
153
+ border-bottom: 2px solid white;
154
+ box-shadow: 0px 0.667px 0.333px 0.033px rgba(24, 24, 24, 0.05);
155
+ }
156
+
157
+ voa-checkbox[state="active"]:not([disabled])::part(label) {
158
+ color: var(--text-primary); /* #0b1215 */
159
+ }
160
+
161
+ /* Hover - Active */
162
+ voa-checkbox[state="active"]:hover:not([disabled])::part(indicator) {
163
+ background-color: var(--palette-blue-blue-4); /* #4dabf7 - mais claro no hover */
164
+ border-color: var(--palette-blue-blue-8); /* #1971c2 */
165
+ }
166
+
167
+ voa-checkbox[state="active"]:hover:not([disabled])::part(label) {
168
+ color: var(--text-hover); /* #0064cb */
169
+ }
170
+
171
+ /* Focused - Active */
172
+ voa-checkbox[state="active"]:focus-visible:not([disabled])::part(indicator) {
173
+ box-shadow: var(--shadow-focus-primary);
174
+ }
175
+
176
+ /* ============================================
177
+ ESTADOS - INDETERMINATE (Checkbox indeterminado)
178
+ ============================================ */
179
+
180
+ /* Default - Indeterminate */
181
+ voa-checkbox[state="indeterminate"]:not([disabled])::part(indicator) {
182
+ background-color: var(--palette-blue-blue-6); /* #228be6 */
183
+ border-color: var(--palette-blue-blue-8); /* #1971c2 */
184
+ }
185
+
186
+ /*
187
+ * INDETERMINATE INDICATOR via CSS pseudo-element ::after
188
+ *
189
+ * Structure:
190
+ * - Uses ::after positioned absolutely within .checkbox-custom (part="indicator")
191
+ * - The structural CSS sets: display: inline-flex; align-items: center; justify-content: center
192
+ * - This ensures the ::after dash is centered perfectly within the 20x20 box
193
+ *
194
+ * Transform logic:
195
+ * - translate(-50%, -50%): Center the element at the box center
196
+ * - Creates a simple horizontal dash
197
+ */
198
+ voa-checkbox[state="indeterminate"]:not([disabled])::part(indicator)::after {
199
+ content: '';
200
+ position: absolute;
201
+ left: 50%;
202
+ top: 50%;
203
+ transform: translate(-50%, -50%);
204
+ width: 8px;
205
+ height: 2px;
206
+ background-color: white;
207
+ box-shadow: 0px 0.667px 0.333px 0.033px rgba(24, 24, 24, 0.05);
208
+ }
209
+
210
+ voa-checkbox[state="indeterminate"]:not([disabled])::part(label) {
211
+ color: var(--text-primary); /* #0b1215 */
212
+ }
213
+
214
+ /* Hover - Indeterminate */
215
+ voa-checkbox[state="indeterminate"]:hover:not([disabled])::part(indicator) {
216
+ background-color: var(--palette-blue-blue-4); /* #4dabf7 */
217
+ border-color: var(--palette-blue-blue-8); /* #1971c2 */
218
+ }
219
+
220
+ voa-checkbox[state="indeterminate"]:hover:not([disabled])::part(label) {
221
+ color: var(--text-hover); /* #0064cb */
222
+ }
223
+
224
+ /* Focused - Indeterminate */
225
+ voa-checkbox[state="indeterminate"]:focus-visible:not([disabled])::part(indicator) {
226
+ box-shadow: var(--shadow-focus-primary);
227
+ }
228
+
229
+ /* ============================================
230
+ ESTADO - DISABLED
231
+ ============================================ */
232
+
233
+ /* Disabled - Inactive */
234
+ voa-checkbox[state="inactive"][disabled]::part(indicator) {
235
+ background-color: rgba(255, 255, 255, 0.25);
236
+ border-color: rgba(24, 24, 24, 0.06);
237
+ cursor: not-allowed;
238
+ }
239
+
240
+ voa-checkbox[state="inactive"][disabled]::part(label) {
241
+ color: var(--text-disabled); /* rgba(11,18,21,0.25) */
242
+ }
243
+
244
+ /* Disabled - Active */
245
+ voa-checkbox[state="active"][disabled]::part(indicator) {
246
+ background-color: rgba(255, 255, 255, 0.25);
247
+ border-color: rgba(24, 24, 24, 0.25);
248
+ cursor: not-allowed;
249
+ }
250
+
251
+ voa-checkbox[state="active"][disabled]::part(indicator)::after {
252
+ opacity: 0.5;
253
+ }
254
+
255
+ voa-checkbox[state="active"][disabled]::part(label) {
256
+ color: var(--text-disabled); /* rgba(11,18,21,0.25) */
257
+ }
258
+
259
+ /* Disabled - Indeterminate */
260
+ voa-checkbox[state="indeterminate"][disabled]::part(indicator) {
261
+ background-color: rgba(255, 255, 255, 0.25);
262
+ border-color: rgba(24, 24, 24, 0.25);
263
+ cursor: not-allowed;
264
+ }
265
+
266
+ voa-checkbox[state="indeterminate"][disabled]::part(indicator)::after {
267
+ opacity: 0.5;
268
+ }
269
+
270
+ voa-checkbox[state="indeterminate"][disabled]::part(label) {
271
+ color: var(--text-disabled); /* rgba(11,18,21,0.25) */
272
+ }
273
+
274
+ /* ============================================
275
+ LABEL - Texto do label
276
+ ============================================ */
277
+
278
+ voa-checkbox::part(label) {
279
+ color: var(--text-primary); /* #0b1215 */
280
+ user-select: none;
281
+ }
282
+
283
+ /* ============================================
284
+ INPUT - Elemento nativo (visualmente oculto)
285
+ ============================================ */
286
+
287
+ voa-checkbox::part(input) {
288
+ /* Já está oculto no CSS estrutural, apenas garantir que não interfira */
289
+ position: absolute;
290
+ opacity: 0;
291
+ width: 0;
292
+ height: 0;
293
+ }
294
+
295
+ /* ============================================
296
+ FOCUS VISIBLE - Outline para acessibilidade
297
+ ============================================ */
298
+
299
+ voa-checkbox:focus-visible::part(base) {
300
+ outline: 2px solid var(--brand-base);
301
+ outline-offset: 2px;
302
+ border-radius: var(--radius-xs);
303
+ }