voa-ds-core 1.0.8 → 1.0.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/collection/components/GetStarted/ImportandoEstilos.stories.js +32 -11
- package/dist/collection/components/GetStarted/ImportandoEstilos.stories.js.map +1 -1
- package/dist/collection/styles/external/saas-dashboard.css +566 -0
- package/dist/collection/styles/external/voa-accordion.external.css +295 -0
- package/dist/collection/styles/external/voa-alert.external.css +348 -0
- package/dist/collection/styles/external/voa-avatar.external.css +118 -0
- package/dist/collection/styles/external/voa-badge.external.css +346 -0
- package/dist/collection/styles/external/voa-breadcrumbs.external.css +183 -0
- package/dist/collection/styles/external/voa-button.external.css +257 -0
- package/dist/collection/styles/external/voa-card.external.css +30 -0
- package/dist/collection/styles/external/voa-checkbox.external.css +303 -0
- package/dist/collection/styles/external/voa-input-addon.external.css +204 -0
- package/dist/collection/styles/external/voa-input.external.css +307 -0
- package/dist/collection/styles/external/voa-keybinding.external.css +34 -0
- package/dist/collection/styles/external/voa-option.external.css +213 -0
- package/dist/collection/styles/external/voa-pagination.external.css +125 -0
- package/dist/collection/styles/external/voa-radio.external.css +235 -0
- package/dist/collection/styles/external/voa-radio.styles.ts +155 -0
- package/dist/collection/styles/external/voa-select.external.css +568 -0
- package/dist/collection/styles/external/voa-switch.external.css +215 -0
- package/dist/collection/styles/external/voa-tab.external.css +284 -0
- package/dist/collection/styles/external/voa-tag.external.css +206 -0
- package/dist/collection/styles/external/voa-text-area.external.css +174 -0
- package/dist/collection/styles/external/voa-tooltip.external.css +320 -0
- package/dist/collection/styles/voa-components.css +32 -0
- package/dist/voa/styles/external/saas-dashboard.css +566 -0
- package/dist/voa/styles/external/voa-accordion.external.css +295 -0
- package/dist/voa/styles/external/voa-alert.external.css +348 -0
- package/dist/voa/styles/external/voa-avatar.external.css +118 -0
- package/dist/voa/styles/external/voa-badge.external.css +346 -0
- package/dist/voa/styles/external/voa-breadcrumbs.external.css +183 -0
- package/dist/voa/styles/external/voa-button.external.css +257 -0
- package/dist/voa/styles/external/voa-card.external.css +30 -0
- package/dist/voa/styles/external/voa-checkbox.external.css +303 -0
- package/dist/voa/styles/external/voa-input-addon.external.css +204 -0
- package/dist/voa/styles/external/voa-input.external.css +307 -0
- package/dist/voa/styles/external/voa-keybinding.external.css +34 -0
- package/dist/voa/styles/external/voa-option.external.css +213 -0
- package/dist/voa/styles/external/voa-pagination.external.css +125 -0
- package/dist/voa/styles/external/voa-radio.external.css +235 -0
- package/dist/voa/styles/external/voa-radio.styles.ts +155 -0
- package/dist/voa/styles/external/voa-select.external.css +568 -0
- package/dist/voa/styles/external/voa-switch.external.css +215 -0
- package/dist/voa/styles/external/voa-tab.external.css +284 -0
- package/dist/voa/styles/external/voa-tag.external.css +206 -0
- package/dist/voa/styles/external/voa-text-area.external.css +174 -0
- package/dist/voa/styles/external/voa-tooltip.external.css +320 -0
- package/dist/voa/styles/voa-components.css +32 -0
- package/package.json +3 -1
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Estilização Externa do VoaOption
|
|
3
|
+
*
|
|
4
|
+
* Este arquivo demonstra como estilizar o componente voa-option
|
|
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=1182-56
|
|
9
|
+
*
|
|
10
|
+
* Para usar, importe este arquivo após os tokens:
|
|
11
|
+
* @import '@voa-ds/tokens/global.css';
|
|
12
|
+
* @import '@voa-ds/styles/voa-option.css';
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
/* ============================================
|
|
16
|
+
BASE - Container raiz do option
|
|
17
|
+
============================================ */
|
|
18
|
+
|
|
19
|
+
voa-option::part(base) {
|
|
20
|
+
/* Gap entre indicator e label - Semantic Token conforme Figma */
|
|
21
|
+
gap: var(--voa-spacing-sm);
|
|
22
|
+
|
|
23
|
+
/* Transição suave para estados */
|
|
24
|
+
transition: color 0.2s ease;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/* Sem label, sem gap */
|
|
28
|
+
voa-option:not([label])::part(base) {
|
|
29
|
+
gap: 0;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/* ============================================
|
|
33
|
+
INDICATOR - Componente radio visual
|
|
34
|
+
============================================ */
|
|
35
|
+
|
|
36
|
+
voa-option::part(indicator) {
|
|
37
|
+
/* O indicator externo gerencia o espaçamento e layout */
|
|
38
|
+
flex-shrink: 0;
|
|
39
|
+
|
|
40
|
+
/* Border around the radio circle - Default state (unchecked) */
|
|
41
|
+
border: var(--border-width-thin) solid var(--structure-colors-bg-base, #ffffff);
|
|
42
|
+
border-radius: 50%;
|
|
43
|
+
background-color: var(--structure-colors-bg-base, #ffffff);
|
|
44
|
+
transition: border-color 0.2s ease, background-color 0.2s ease, box-shadow 0.2s ease;
|
|
45
|
+
box-shadow: inset 0 0 0 1px rgba(24, 24, 27, 0.2);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/* Checked indicator - Primary blue state */
|
|
49
|
+
voa-option[checked]:not([disabled])::part(indicator) {
|
|
50
|
+
border-color: var(--colors-light-primary-light, #0064cb);
|
|
51
|
+
background-color: var(--colors-light-primary-light, #0064cb);
|
|
52
|
+
box-shadow: 0 0 0 3px rgba(0, 100, 203, 0.1);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/* Hover indicator - Unchecked */
|
|
56
|
+
voa-option:not([disabled]):not([checked]):hover::part(indicator) {
|
|
57
|
+
border-color: rgba(24, 24, 27, 0.3);
|
|
58
|
+
box-shadow: inset 0 0 0 1px rgba(24, 24, 27, 0.3);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/* Hover indicator - Checked */
|
|
62
|
+
voa-option[checked]:not([disabled]):hover::part(indicator) {
|
|
63
|
+
border-color: var(--colors-light-primary-light-400, #0071c8);
|
|
64
|
+
background-color: var(--colors-light-primary-light-400, #0071c8);
|
|
65
|
+
box-shadow: 0 0 0 3px var(--colors-light-primary-light-opacity-15);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/* Focus indicator - Unchecked */
|
|
69
|
+
voa-option:not([disabled]):not([checked]):focus-visible::part(indicator) {
|
|
70
|
+
border-color: var(--colors-light-secondary-light, #00e5ce);
|
|
71
|
+
box-shadow: inset 0 0 0 1px var(--colors-light-secondary-light, #00e5ce), 0 0 0 3px var(--colors-light-secondary-light-100, #b5eee3);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/* Focus indicator - Checked */
|
|
75
|
+
voa-option[checked]:not([disabled]):focus-visible::part(indicator) {
|
|
76
|
+
border-color: var(--colors-light-secondary-light, #00e5ce);
|
|
77
|
+
background-color: var(--colors-light-primary-light, #0064cb);
|
|
78
|
+
box-shadow: 0 0 0 2px var(--structure-colors-bg-base, #ffffff), 0 0 0 4px var(--colors-light-secondary-light, #00e5ce);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/* Disabled indicator border */
|
|
82
|
+
voa-option[disabled]::part(indicator) {
|
|
83
|
+
border-color: var(--colors-structure-fill-15);
|
|
84
|
+
background-color: var(--colors-structure-fill-quaternary);
|
|
85
|
+
opacity: 0.6;
|
|
86
|
+
box-shadow: inset 0 0 0 1px var(--colors-structure-fill-terciary);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/* ============================================
|
|
90
|
+
INDICATOR-DOT - Ponto interior do radio
|
|
91
|
+
============================================ */
|
|
92
|
+
|
|
93
|
+
voa-option::part(indicator-dot) {
|
|
94
|
+
/* Size e visibility são controlados pelos states abaixo */
|
|
95
|
+
width: 0;
|
|
96
|
+
height: 0;
|
|
97
|
+
background-color: var(--structure-colors-bg-base, #ffffff);
|
|
98
|
+
border-radius: 50%;
|
|
99
|
+
transition: width 0.2s ease, height 0.2s ease;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/* Checked - Dot aparece com cor branca */
|
|
103
|
+
voa-option[checked]:not([disabled])::part(indicator-dot) {
|
|
104
|
+
width: var(--option-indicator-dot-size);
|
|
105
|
+
height: var(--option-indicator-dot-size);
|
|
106
|
+
background-color: var(--structure-colors-bg-base, #ffffff);
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/* Disabled checked - Dot com opacidade */
|
|
110
|
+
voa-option[disabled][checked]::part(indicator-dot) {
|
|
111
|
+
width: var(--option-indicator-dot-size);
|
|
112
|
+
height: var(--option-indicator-dot-size);
|
|
113
|
+
background-color: rgba(255, 255, 255, 0.7);
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/* ============================================
|
|
117
|
+
LABEL - Texto da opção
|
|
118
|
+
============================================ */
|
|
119
|
+
|
|
120
|
+
voa-option::part(label) {
|
|
121
|
+
/* Tipografia - Semantic Token conforme Figma */
|
|
122
|
+
font-family: var(--font-family-sans, 'Lato', sans-serif);
|
|
123
|
+
font-size: var(--typography-base-type-scale-6);
|
|
124
|
+
line-height: var(--line-height-body-md);
|
|
125
|
+
font-weight: var(--typography-base-body-sm-regular-weight);
|
|
126
|
+
|
|
127
|
+
/* Cor padrão - Texto base */
|
|
128
|
+
color: rgba(24, 24, 27, 1);
|
|
129
|
+
|
|
130
|
+
/* User select desabilitado */
|
|
131
|
+
user-select: none;
|
|
132
|
+
|
|
133
|
+
/* Transição suave para estados hover/focus */
|
|
134
|
+
transition: color 0.2s ease;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
/* ============================================
|
|
138
|
+
ESTADOS - Default
|
|
139
|
+
============================================ */
|
|
140
|
+
|
|
141
|
+
/* Default - Unchecked */
|
|
142
|
+
voa-option:not([checked])::part(label) {
|
|
143
|
+
color: rgba(24, 24, 27, 1);
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
/* Default - Checked */
|
|
147
|
+
voa-option[checked]::part(label) {
|
|
148
|
+
color: rgba(24, 24, 27, 1);
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
/* ============================================
|
|
152
|
+
ESTADOS - Hover
|
|
153
|
+
============================================ */
|
|
154
|
+
|
|
155
|
+
/* Hover - Unchecked */
|
|
156
|
+
voa-option:not([checked]):not([disabled]):hover::part(label) {
|
|
157
|
+
color: rgba(24, 24, 27, 1);
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
/* Hover - Checked */
|
|
161
|
+
voa-option[checked]:not([disabled]):hover::part(label) {
|
|
162
|
+
color: rgba(24, 24, 27, 1);
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
/* Hover - Base container cursor */
|
|
166
|
+
voa-option:not([disabled]):hover {
|
|
167
|
+
cursor: pointer;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
/* ============================================
|
|
171
|
+
ESTADOS - Focus
|
|
172
|
+
============================================ */
|
|
173
|
+
|
|
174
|
+
/* Focus - Unchecked */
|
|
175
|
+
voa-option:not([checked]):focus-visible::part(label) {
|
|
176
|
+
color: rgba(24, 24, 27, 1);
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
/* Focus - Checked */
|
|
180
|
+
voa-option[checked]:focus-visible::part(label) {
|
|
181
|
+
color: rgba(24, 24, 27, 1);
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
/* ============================================
|
|
185
|
+
ESTADO - Disabled
|
|
186
|
+
============================================ */
|
|
187
|
+
|
|
188
|
+
/* Disabled - Unchecked */
|
|
189
|
+
voa-option[disabled]:not([checked])::part(label) {
|
|
190
|
+
color: rgba(24, 24, 27, 0.4);
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
/* Disabled - Checked */
|
|
194
|
+
voa-option[disabled][checked]::part(label) {
|
|
195
|
+
color: rgba(24, 24, 27, 0.4);
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
/* ============================================
|
|
199
|
+
ACESSIBILIDADE - Focus visível
|
|
200
|
+
============================================ */
|
|
201
|
+
|
|
202
|
+
voa-option:focus-within::part(base) {
|
|
203
|
+
outline: none;
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
/* Respeitar preferências de movimento reduzido */
|
|
207
|
+
@media (prefers-reduced-motion: reduce) {
|
|
208
|
+
voa-option::part(indicator),
|
|
209
|
+
voa-option::part(indicator-dot),
|
|
210
|
+
voa-option::part(label) {
|
|
211
|
+
transition: none;
|
|
212
|
+
}
|
|
213
|
+
}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
@import '../../tokens/global.css';
|
|
2
|
+
|
|
3
|
+
/* Base styles for all pagination items (buttons) */
|
|
4
|
+
voa-pagination-item::part(base) {
|
|
5
|
+
border-radius: var(--voa-radius-md);
|
|
6
|
+
background-color: var(--voa-bg-base);
|
|
7
|
+
color: var(--voa-text-secondary);
|
|
8
|
+
transition: all 0.2s ease;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
/* Hover state */
|
|
12
|
+
voa-pagination-item:hover::part(base) {
|
|
13
|
+
background-color: var(--structure-colors-bg-elevated);
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/* Active state (current page) - Figma: white bg, blue border, blue inner shadow */
|
|
17
|
+
voa-pagination-item[active="true"]::part(base) {
|
|
18
|
+
background-color: var(--voa-bg-base);
|
|
19
|
+
border: var(--border-width-thin) solid var(--brand-base);
|
|
20
|
+
color: var(--voa-text-primary);
|
|
21
|
+
box-shadow: var(--input-active-inner-shadow);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/* Disabled state */
|
|
25
|
+
voa-pagination-item[disabled="true"]::part(base) {
|
|
26
|
+
opacity: 0.5;
|
|
27
|
+
cursor: not-allowed;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/* Number text styling - Figma: Lato SemiBold, 16px, line-height 24px */
|
|
31
|
+
voa-pagination-item::part(content) {
|
|
32
|
+
font-family: var(--voa-font-family-sans);
|
|
33
|
+
font-weight: var(--typography-base-body-sm-bold-weight);
|
|
34
|
+
font-size: 1rem;
|
|
35
|
+
line-height: 24px;
|
|
36
|
+
color: inherit;
|
|
37
|
+
text-align: center;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/* Ellipsis styling - Figma: Manrope SemiBold, 20px */
|
|
41
|
+
voa-pagination-item[type="ellipsis"]::part(content) {
|
|
42
|
+
font-family: 'Manrope', sans-serif;
|
|
43
|
+
font-weight: var(--typography-base-body-sm-bold-weight);
|
|
44
|
+
font-size: 1.25rem;
|
|
45
|
+
line-height: 0;
|
|
46
|
+
color: var(--voa-text-secondary);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/* Icon styling */
|
|
50
|
+
voa-pagination-item::part(icon) {
|
|
51
|
+
color: var(--voa-text-secondary);
|
|
52
|
+
width: 16px;
|
|
53
|
+
height: 16px;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
voa-pagination-item::part(icon) svg {
|
|
57
|
+
width: 16px;
|
|
58
|
+
height: 16px;
|
|
59
|
+
stroke: currentColor;
|
|
60
|
+
fill: none;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/* Page Size & Goto Styling - Figma: Lato Regular, 14px, line-height 16px */
|
|
64
|
+
voa-pagination-item::part(label) {
|
|
65
|
+
font-family: var(--voa-font-family-sans);
|
|
66
|
+
font-weight: var(--typography-base-body-sm-regular-weight);
|
|
67
|
+
font-size: var(--typography-base-body-sm-regular-size);
|
|
68
|
+
line-height: 16px;
|
|
69
|
+
color: var(--voa-text-secondary);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/* Select box (page-size) - Figma: white bg, border, 32px height */
|
|
73
|
+
voa-pagination-item::part(select) {
|
|
74
|
+
height: 32px;
|
|
75
|
+
padding: 0 var(--voa-spacing-xs);
|
|
76
|
+
background-color: var(--voa-bg-base);
|
|
77
|
+
border: var(--border-width-medium) solid var(--voa-border-color);
|
|
78
|
+
border-radius: var(--voa-radius-md);
|
|
79
|
+
display: flex;
|
|
80
|
+
align-items: center;
|
|
81
|
+
justify-content: center;
|
|
82
|
+
gap: 4px;
|
|
83
|
+
cursor: pointer;
|
|
84
|
+
box-sizing: border-box;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/* Input wrapper (goto-page) - Figma: white bg, border, 32px height */
|
|
88
|
+
voa-pagination-item::part(input-wrapper) {
|
|
89
|
+
height: 32px;
|
|
90
|
+
padding: 0 var(--voa-spacing-md);
|
|
91
|
+
background-color: var(--voa-bg-base);
|
|
92
|
+
border: var(--border-width-medium) solid var(--voa-border-color);
|
|
93
|
+
border-radius: var(--voa-radius-md);
|
|
94
|
+
display: flex;
|
|
95
|
+
align-items: center;
|
|
96
|
+
justify-content: center;
|
|
97
|
+
box-sizing: border-box;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/* Input field - Figma: Lato Regular, 16px, line-height 24px */
|
|
101
|
+
voa-pagination-item::part(input) {
|
|
102
|
+
width: 20px;
|
|
103
|
+
text-align: center;
|
|
104
|
+
font-family: var(--voa-font-family-sans);
|
|
105
|
+
font-weight: var(--typography-base-body-sm-regular-weight);
|
|
106
|
+
font-size: 1rem;
|
|
107
|
+
line-height: 24px;
|
|
108
|
+
color: var(--voa-text-primary);
|
|
109
|
+
border: none;
|
|
110
|
+
background: transparent;
|
|
111
|
+
padding: 0;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
voa-pagination-item::part(input):focus {
|
|
115
|
+
outline: none;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/* Value display in select */
|
|
119
|
+
voa-pagination-item .voa-pagination-item__value {
|
|
120
|
+
font-family: var(--voa-font-family-sans);
|
|
121
|
+
font-weight: var(--typography-base-body-sm-regular-weight);
|
|
122
|
+
font-size: 1rem;
|
|
123
|
+
line-height: 24px;
|
|
124
|
+
color: var(--voa-text-primary);
|
|
125
|
+
}
|
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Estilização Externa do VoaRadio
|
|
3
|
+
*
|
|
4
|
+
* Este arquivo demonstra como estilizar o componente voa-radio
|
|
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=1182-56
|
|
9
|
+
*
|
|
10
|
+
* Para usar, importe este arquivo após os tokens:
|
|
11
|
+
* @import '@voa-ds/tokens/global.css';
|
|
12
|
+
* @import '@voa-ds/styles/voa-radio.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
|
|
19
|
+
* --structure-colors/bg-elevated → --structure-colors-bg-elevated
|
|
20
|
+
* --structure-colors/bg-base-disabled → --structure-colors-bg-base-disabled
|
|
21
|
+
* --structure-colors/border-color → --structure-colors-border-color
|
|
22
|
+
* --structure-colors/fill-secondary → --structure-colors-fill-secondary
|
|
23
|
+
* --structure-colors/fill-quaternary → --structure-colors-fill-quaternary
|
|
24
|
+
* --Colors/Light/primary-light-200 → --colors-light-primary-light-200 (#008fff)
|
|
25
|
+
* --Colors/Light/primary-light-400 → --colors-light-primary-light-400 (#0071c8)
|
|
26
|
+
* --Colors/Light/secondary-light-100 → --colors-light-secondary-light-100 (#b5eee3) - CYAN
|
|
27
|
+
* --Colors/Light/secondary-light → --colors-light-secondary-light (#00e5ce) - CYAN
|
|
28
|
+
* --asset-colors/text-hover → --text-hover (ou --brand-base)
|
|
29
|
+
* --asset-colors/brand-base-50 → --brand-base-50
|
|
30
|
+
* --asset-colors/brand-base-25 → --brand-base-25
|
|
31
|
+
* --asset-colors/brand-hover → --brand-hover
|
|
32
|
+
* --radius/radius-xxs → --radius-xxs
|
|
33
|
+
* --radius/radius-round → --radius-round (100%)
|
|
34
|
+
*
|
|
35
|
+
* EFEITOS VISUAIS IMPORTANTES DO FIGMA:
|
|
36
|
+
* - Estado focused checked: fill #008fff, stroke #0071c8, dot fill #b5eee3, dot stroke #00e5ce
|
|
37
|
+
* - Estado focused unchecked: glow interno com brand-base-50
|
|
38
|
+
* - Estados checked: sombras internas para efeito de profundidade
|
|
39
|
+
*/
|
|
40
|
+
|
|
41
|
+
/* ============================================
|
|
42
|
+
BASE - Elemento raiz do radio (label)
|
|
43
|
+
============================================ */
|
|
44
|
+
|
|
45
|
+
voa-radio::part(base) {
|
|
46
|
+
/* Sem estilos visuais aqui - apenas estrutura */
|
|
47
|
+
display: inline-flex;
|
|
48
|
+
align-items: center;
|
|
49
|
+
gap: 0;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/* ============================================
|
|
53
|
+
INDICATOR - Círculo externo do radio (20px)
|
|
54
|
+
============================================ */
|
|
55
|
+
|
|
56
|
+
voa-radio::part(indicator) {
|
|
57
|
+
/* Tamanho fixo conforme Figma */
|
|
58
|
+
width: var(--radio-indicator-size);
|
|
59
|
+
height: var(--radio-indicator-size);
|
|
60
|
+
min-width: var(--radio-indicator-size);
|
|
61
|
+
min-height: var(--radio-indicator-size);
|
|
62
|
+
|
|
63
|
+
/* Border-radius circular */
|
|
64
|
+
border-radius: var(--radius-round, 50%);
|
|
65
|
+
|
|
66
|
+
/* Border padrão - Semantic Token */
|
|
67
|
+
border: var(--border-width-thick) solid var(--structure-colors-border-color);
|
|
68
|
+
|
|
69
|
+
/* Background padrão - Semantic Token */
|
|
70
|
+
background-color: var(--structure-colors-bg-base);
|
|
71
|
+
|
|
72
|
+
/* Transição suave */
|
|
73
|
+
transition: background-color 0.2s ease, border-color 0.2s ease, box-shadow 0.2s ease;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/* ============================================
|
|
77
|
+
INDICATOR - Estados Unchecked
|
|
78
|
+
============================================ */
|
|
79
|
+
|
|
80
|
+
/* Default - Unchecked */
|
|
81
|
+
voa-radio:not([checked])::part(indicator) {
|
|
82
|
+
background-color: var(--structure-colors-bg-base);
|
|
83
|
+
border-color: var(--structure-colors-border-color);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/* Hover - Unchecked */
|
|
87
|
+
voa-radio:not([checked]):hover::part(indicator) {
|
|
88
|
+
background-color: var(--structure-colors-bg-elevated);
|
|
89
|
+
border-color: var(--structure-colors-border-color);
|
|
90
|
+
/* Outline externo com brand-secondary-50 conforme Figma */
|
|
91
|
+
box-shadow: 0 0 0 4px var(--brand-secondary-50, var(--colors-light-secondary-light-opacity-50, rgba(0, 229, 206, 0.5)));
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/* Focus - Unchecked (COR ESPECIAL: stroke CYAN conforme Figma) */
|
|
95
|
+
voa-radio:not([checked]):focus-visible::part(indicator) {
|
|
96
|
+
background-color: var(--structure-colors-bg-base);
|
|
97
|
+
/* Stroke CYAN (#00e5ce) conforme Figma, não brand-base-50 */
|
|
98
|
+
border-color: var(--colors-light-secondary-light, var(--brand-secondary, #00e5ce)); /* rgba(0, 229, 206, 1) - CYAN */
|
|
99
|
+
/* Glow interno conforme Figma - inset shadow com CYAN (brand-secondary-50) */
|
|
100
|
+
box-shadow: var(--shadow-focus-secondary);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/* Disabled - Unchecked */
|
|
104
|
+
voa-radio[disabled]:not([checked])::part(indicator) {
|
|
105
|
+
background-color: var(--structure-colors-bg-base-disabled);
|
|
106
|
+
border-color: var(--structure-colors-fill-secondary);
|
|
107
|
+
cursor: not-allowed;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/* ============================================
|
|
111
|
+
INDICATOR - Estados Checked
|
|
112
|
+
============================================ */
|
|
113
|
+
|
|
114
|
+
/* Default - Checked */
|
|
115
|
+
voa-radio[checked]::part(indicator) {
|
|
116
|
+
/* Usar primary-light-200 quando disponível (mais claro), fallback para brand-base */
|
|
117
|
+
background-color: var(--colors-light-primary-light-200, var(--voa-radio-v2-checked-bg, var(--text-hover, var(--brand-base))));
|
|
118
|
+
border-color: var(--structure-colors-fill-secondary);
|
|
119
|
+
/* Shadow interna sutil para efeito de profundidade conforme Figma */
|
|
120
|
+
/* Nota: O Figma usa overlay complexo - replicamos com inset shadow */
|
|
121
|
+
box-shadow: inset 0 var(--radius-xxs, 2px) 0 0 var(--structure-colors-bg-base-disabled, rgba(255, 255, 255, 0.25));
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
/* Hover - Checked (COR ESPECIAL: brand-base + stroke CYAN conforme Figma) */
|
|
125
|
+
voa-radio[checked]:hover::part(indicator) {
|
|
126
|
+
/* Hover checked usa brand-base (#0064cb) e stroke CYAN conforme Figma */
|
|
127
|
+
background-color: var(--text-hover, var(--brand-base, #0064cb)); /* rgba(0, 100, 203, 1) */
|
|
128
|
+
border-color: var(--colors-light-secondary-light, var(--brand-secondary, #00e5ce)); /* rgba(0, 229, 206, 1) - CYAN */
|
|
129
|
+
/* Shadow interna mantida no hover */
|
|
130
|
+
/* Outline externo com brand-secondary-50 conforme Figma */
|
|
131
|
+
box-shadow: inset 0 var(--radius-xxs, 2px) 0 0 var(--structure-colors-bg-base-disabled, rgba(255, 255, 255, 0.25)),
|
|
132
|
+
0 0 0 4px var(--brand-secondary-50, var(--colors-light-secondary-light-opacity-50, rgba(0, 229, 206, 0.5)));
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
/* Focus - Checked (especial: usa cores diferentes conforme Figma) */
|
|
136
|
+
voa-radio[checked]:focus-visible::part(indicator) {
|
|
137
|
+
/* Cores específicas do estado focused checked conforme Figma */
|
|
138
|
+
/* Fill: rgba(0, 143, 255, 1) - primary-light-200 */
|
|
139
|
+
background-color: var(--colors-light-primary-light-200, var(--voa-radio-v2-checked-bg, #008fff)); /* Mais claro que brand-base */
|
|
140
|
+
/* Stroke: rgba(0, 113, 200, 1) - primary-light-400 */
|
|
141
|
+
border-color: var(--colors-light-primary-light-400, var(--voa-radio-v2-checked-border, #0071c8)); /* Stroke mais escuro */
|
|
142
|
+
/* Shadow interna para efeito de profundidade conforme Figma */
|
|
143
|
+
/* Nota: O Figma usa overlay com inset negativo - replicamos com inset shadow */
|
|
144
|
+
box-shadow: inset 0 var(--radius-xxs, 2px) 0 0 var(--structure-colors-bg-base-disabled, rgba(255, 255, 255, 0.25));
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
/* Disabled - Checked */
|
|
148
|
+
voa-radio[disabled][checked]::part(indicator) {
|
|
149
|
+
/* Figma mostra brand-base (#0064cb) mas com opacidade reduzida visualmente (disabled) */
|
|
150
|
+
/* Usando brand-base-25 para representar estado disabled */
|
|
151
|
+
background-color: var(--brand-base-25, var(--colors-light-primary-light-opacity-25, rgba(0, 100, 203, 0.25)));
|
|
152
|
+
/* Stroke também usa brand-base-25 conforme Figma (fill e stroke iguais) */
|
|
153
|
+
border-color: var(--brand-base-25, var(--colors-light-primary-light-opacity-25, rgba(0, 100, 203, 0.25)));
|
|
154
|
+
cursor: not-allowed;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
/* ============================================
|
|
158
|
+
DOT - Círculo interno quando selecionado (8px)
|
|
159
|
+
============================================ */
|
|
160
|
+
|
|
161
|
+
voa-radio::part(dot) {
|
|
162
|
+
/* Tamanho fixo conforme Figma */
|
|
163
|
+
width: 8px;
|
|
164
|
+
height: 8px;
|
|
165
|
+
min-width: 8px;
|
|
166
|
+
min-height: 8px;
|
|
167
|
+
|
|
168
|
+
/* Border-radius circular */
|
|
169
|
+
border-radius: var(--radius-round, 50%);
|
|
170
|
+
|
|
171
|
+
/* Background padrão - Semantic Token */
|
|
172
|
+
background-color: var(--structure-colors-bg-base);
|
|
173
|
+
|
|
174
|
+
/* Border sutil - Semantic Token */
|
|
175
|
+
border: var(--border-width-thin) solid var(--structure-colors-fill-quaternary);
|
|
176
|
+
|
|
177
|
+
/* Posicionamento já definido no CSS estrutural (centralizado perfeitamente) */
|
|
178
|
+
/* Não sobrescrever left/top aqui para manter centralização do CSS estrutural */
|
|
179
|
+
|
|
180
|
+
/* Transição suave para transform, opacity, background-color e border-color */
|
|
181
|
+
transition: transform 0.2s ease, opacity 0.2s ease, background-color 0.2s ease, border-color 0.2s ease;
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
/* Dot - Checked (visível) */
|
|
185
|
+
voa-radio[checked]::part(dot) {
|
|
186
|
+
background-color: var(--structure-colors-bg-base);
|
|
187
|
+
border-color: var(--structure-colors-fill-quaternary);
|
|
188
|
+
transform: scale(1);
|
|
189
|
+
opacity: 1;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
/* Dot - Focused Checked (COR ESPECIAL: CYAN conforme Figma) */
|
|
193
|
+
voa-radio[checked]:focus-visible::part(dot) {
|
|
194
|
+
/* Cores CYAN especiais do estado focused conforme Figma */
|
|
195
|
+
/* IMPORTANTE: No estado focused, o dot tem cor CYAN, não branco */
|
|
196
|
+
background-color: var(--colors-light-secondary-light-100, #b5eee3); /* CYAN claro - rgba(181, 238, 227, 1) */
|
|
197
|
+
border-color: var(--colors-light-secondary-light, #00e5ce); /* CYAN - rgba(0, 229, 206, 1) */
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
/* Dot - Disabled Checked */
|
|
201
|
+
voa-radio[disabled][checked]::part(dot) {
|
|
202
|
+
background-color: var(--structure-colors-bg-base-disabled);
|
|
203
|
+
border-color: var(--structure-colors-fill-quaternary);
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
/* ============================================
|
|
207
|
+
INPUT - Input nativo (oculto mas acessível)
|
|
208
|
+
============================================ */
|
|
209
|
+
|
|
210
|
+
voa-radio::part(input) {
|
|
211
|
+
/* Já oculto no CSS estrutural, mas garantimos acessibilidade */
|
|
212
|
+
position: absolute;
|
|
213
|
+
opacity: 0;
|
|
214
|
+
width: 0;
|
|
215
|
+
height: 0;
|
|
216
|
+
margin: 0;
|
|
217
|
+
padding: 0;
|
|
218
|
+
pointer-events: none;
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
/* ============================================
|
|
222
|
+
ACESSIBILIDADE - Focus visível
|
|
223
|
+
============================================ */
|
|
224
|
+
|
|
225
|
+
voa-radio:focus-within::part(base) {
|
|
226
|
+
outline: none;
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
/* Respeitar preferências de movimento reduzido */
|
|
230
|
+
@media (prefers-reduced-motion: reduce) {
|
|
231
|
+
voa-radio::part(indicator),
|
|
232
|
+
voa-radio::part(dot) {
|
|
233
|
+
transition: none;
|
|
234
|
+
}
|
|
235
|
+
}
|