ads-nuxt 0.1.0 → 0.1.2

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 (74) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +567 -1
  3. package/app/app.config.ts +25 -25
  4. package/app/assets/ads/checkbox-check.svg +5 -5
  5. package/app/assets/ads/checkbox-minus.svg +5 -5
  6. package/app/assets/brand/farmarcas.svg +6 -6
  7. package/app/assets/brand/radar.svg +9 -9
  8. package/app/assets/css/component-tokens.css +403 -403
  9. package/app/assets/css/main.css +617 -617
  10. package/app/components/AdsBadge.vue +48 -48
  11. package/app/components/AdsBroadcast.vue +45 -45
  12. package/app/components/AdsButton.vue +569 -569
  13. package/app/components/AdsButtonGroup.vue +39 -39
  14. package/app/components/AdsButtonMenu.vue +48 -48
  15. package/app/components/AdsCard.vue +117 -117
  16. package/app/components/AdsCharttip.vue +78 -78
  17. package/app/components/AdsCheckbox.vue +77 -77
  18. package/app/components/AdsDatePicker.vue +473 -473
  19. package/app/components/AdsDropdownMenu.vue +19 -19
  20. package/app/components/AdsEmptyState.vue +58 -58
  21. package/app/components/AdsFarmarcasPill.vue +74 -74
  22. package/app/components/AdsFeatureCard.vue +217 -217
  23. package/app/components/AdsFileCard.vue +101 -101
  24. package/app/components/AdsFilterDropdown.vue +174 -174
  25. package/app/components/AdsFilterOption.vue +72 -72
  26. package/app/components/AdsFilterSelect.vue +202 -202
  27. package/app/components/AdsFooter.vue +25 -25
  28. package/app/components/AdsInput.vue +143 -143
  29. package/app/components/AdsListDropdown.vue +44 -44
  30. package/app/components/AdsLoading.vue +109 -109
  31. package/app/components/AdsMenuBar.vue +103 -103
  32. package/app/components/AdsMetricCard.vue +119 -119
  33. package/app/components/AdsMiniPill.vue +40 -40
  34. package/app/components/AdsModal.vue +157 -157
  35. package/app/components/AdsMonthPicker.vue +80 -80
  36. package/app/components/AdsNavbarApp.vue +67 -67
  37. package/app/components/AdsNavbarDesk.vue +62 -62
  38. package/app/components/AdsNotabilityPill.vue +27 -27
  39. package/app/components/AdsNumberInput.vue +166 -166
  40. package/app/components/AdsPagination.vue +91 -91
  41. package/app/components/AdsProductTag.vue +61 -61
  42. package/app/components/AdsRadio.vue +70 -70
  43. package/app/components/AdsSearchInput.vue +113 -113
  44. package/app/components/AdsSegmentedTabs.vue +28 -28
  45. package/app/components/AdsSideMenu.vue +101 -101
  46. package/app/components/AdsSmalltip.vue +44 -44
  47. package/app/components/AdsSteptip.vue +101 -101
  48. package/app/components/AdsSwitch.vue +59 -59
  49. package/app/components/AdsTable.vue +100 -100
  50. package/app/components/AdsTableToolbar.vue +44 -44
  51. package/app/components/AdsTabs.vue +51 -51
  52. package/app/components/AdsTextarea.vue +109 -109
  53. package/app/components/AdsToast.vue +181 -181
  54. package/app/components/AdsTooltip.vue +66 -66
  55. package/app/components/InvertedTooltip.vue +40 -40
  56. package/app/components/OverlayLoading.vue +173 -173
  57. package/app/components/ProgressBarLoading.vue +256 -256
  58. package/app/composables/useOverlayLoading.ts +66 -66
  59. package/app/locale/pt-br.ts +6 -6
  60. package/app/plugins/ads-toast.client.ts +24 -24
  61. package/app/theme/ads-theme.ts +370 -370
  62. package/app/theme/component-tokens.json +402 -402
  63. package/app/theme/component-tokens.ts +815 -815
  64. package/app/types/overlay-loading.types.ts +26 -26
  65. package/app/utils/ads-filter-select.ts +172 -172
  66. package/app/utils/ads-table.ts +204 -204
  67. package/app/utils/calendar-date.ts +128 -128
  68. package/app/utils/category-role.ts +45 -45
  69. package/app/utils/money.ts +77 -77
  70. package/app/utils/notability.ts +8 -8
  71. package/app/utils/parser.ts +134 -134
  72. package/app/utils/percentage.ts +54 -54
  73. package/nuxt.config.ts +31 -32
  74. package/package.json +48 -46
@@ -1,815 +1,815 @@
1
- export type TokenKind = "color" | "length" | "weight" | "line";
2
-
3
- export type TokenField = {
4
- name: string;
5
- label: string;
6
- kind: TokenKind;
7
- group: string;
8
- fallback: string;
9
- };
10
-
11
- export type TokenComponent = {
12
- id: string;
13
- /** Id da seção na página de tokens e no menu. */
14
- section: string;
15
- label: string;
16
- note?: string;
17
- fields: readonly TokenField[];
18
- };
19
-
20
- const length = (name: string, label: string, group: string, fallback: string): TokenField => ({
21
- name,
22
- label,
23
- kind: "length",
24
- group,
25
- fallback,
26
- });
27
-
28
- const color = (name: string, label: string, group: string, fallback: string): TokenField => ({
29
- name,
30
- label,
31
- kind: "color",
32
- group,
33
- fallback,
34
- });
35
-
36
- const weight = (name: string, label: string, group: string, fallback: string): TokenField => ({
37
- name,
38
- label,
39
- kind: "weight",
40
- group,
41
- fallback,
42
- });
43
-
44
- const line = (name: string, label: string, group: string, fallback: string): TokenField => ({
45
- name,
46
- label,
47
- kind: "line",
48
- group,
49
- fallback,
50
- });
51
-
52
- export const componentTokenCatalog: readonly TokenComponent[] = [
53
- {
54
- id: "button",
55
- section: "botao",
56
- label: "Botão",
57
- note: "Outline, unfilled e as cores de status continuam nos tokens semânticos. O tipo IA usa fundo, borda e brilho próprios; o texto é innovation 300.",
58
- fields: [
59
- length("--ads-button-radius", "Raio", "Forma", "8px"),
60
- weight("--ads-button-weight", "Peso", "Forma", "700"),
61
- length("--ads-button-sm-height", "Altura", "Tamanho SM", "32px"),
62
- length("--ads-button-sm-padding-x", "Padding horizontal", "Tamanho SM", "12px"),
63
- length("--ads-button-sm-gap", "Espaço do ícone", "Tamanho SM", "8px"),
64
- length("--ads-button-sm-font-size", "Fonte", "Tamanho SM", "12px"),
65
- line("--ads-button-sm-line-height", "Altura de linha", "Tamanho SM", "1.2"),
66
- length("--ads-button-sm-icon", "Ícone", "Tamanho SM", "16px"),
67
- length("--ads-button-sm-icon-box", "Caixa do ícone", "Tamanho SM", "32px"),
68
- length("--ads-button-md-padding-x", "Padding horizontal", "Tamanho MD", "16px"),
69
- length("--ads-button-md-padding-y", "Padding vertical", "Tamanho MD", "12px"),
70
- length("--ads-button-md-gap", "Espaço do ícone", "Tamanho MD", "8px"),
71
- length("--ads-button-md-font-size", "Fonte", "Tamanho MD", "14px"),
72
- line("--ads-button-md-line-height", "Altura de linha", "Tamanho MD", "1.3"),
73
- length("--ads-button-md-icon", "Ícone", "Tamanho MD", "18px"),
74
- length("--ads-button-md-icon-box", "Caixa do ícone", "Tamanho MD", "40px"),
75
- color("--ads-button-primary", "Fundo", "Primário preenchido", "#006ff7"),
76
- color("--ads-button-primary-hover", "Fundo no hover", "Primário preenchido", "#074ac6"),
77
- color("--ads-button-primary-pressed", "Fundo no pressed", "Primário preenchido", "#00389e"),
78
- color("--ads-button-primary-disabled", "Fundo desabilitado", "Primário preenchido", "#89c9ff"),
79
- color("--ads-button-primary-text", "Texto", "Primário preenchido", "#ffffff"),
80
- color("--ads-button-secondary", "Fundo", "Secundário", "#e4f2ff"),
81
- color("--ads-button-secondary-hover", "Fundo no hover", "Secundário", "#c7e4ff"),
82
- color("--ads-button-secondary-pressed", "Fundo no pressed", "Secundário", "#89c9ff"),
83
- color("--ads-button-secondary-disabled", "Fundo desabilitado", "Secundário", "#d3d8dd"),
84
- color("--ads-button-secondary-text", "Texto", "Secundário", "#006ff7"),
85
- color("--ads-button-secondary-disabled-text", "Texto desabilitado", "Secundário", "#ffffff"),
86
- color("--ads-button-ia-background", "Fundo", "IA", "#f3f0ff"),
87
- color("--ads-button-ia-border", "Borda", "IA", "#7358cc"),
88
- color("--ads-button-ia-glow", "Brilho", "IA", "#ae96ff"),
89
- length("--ads-button-ia-radius", "Raio", "IA", "4px"),
90
- length("--ads-button-ia-line-height", "Altura de linha", "IA", "24px"),
91
- ],
92
- },
93
- {
94
- id: "input",
95
- section: "campo",
96
- label: "Campo",
97
- note: "Vale para o AdsInput. O estado de IA continua com a cor própria.",
98
- fields: [
99
- length("--ads-input-height", "Altura", "Medida", "40px"),
100
- length("--ads-input-padding-x", "Padding horizontal", "Medida", "12px"),
101
- length("--ads-input-gap", "Espaço interno", "Medida", "8px"),
102
- length("--ads-input-radius", "Raio", "Medida", "8px"),
103
- length("--ads-input-font-size", "Fonte", "Medida", "14px"),
104
- length("--ads-input-label-size", "Fonte do rótulo", "Medida", "12px"),
105
- color("--ads-input-border", "Borda", "Cores", "#c1c7d0"),
106
- color("--ads-input-background", "Fundo", "Cores", "#ffffff"),
107
- color("--ads-input-text", "Texto", "Cores", "#505f79"),
108
- color("--ads-input-focus-border", "Borda em foco", "Cores", "#0091ff"),
109
- color("--ads-input-hover-border", "Borda no hover", "Cores", "#006ff7"),
110
- color("--ads-input-error-border", "Borda de erro", "Cores", "#ff507a"),
111
- color("--ads-input-disabled-border", "Borda desabilitada", "Cores", "#a5adba"),
112
- color("--ads-input-disabled-background", "Fundo desabilitado", "Cores", "#f0f3f6"),
113
- color("--ads-input-disabled-text", "Texto desabilitado", "Cores", "#a5adba"),
114
- ],
115
- },
116
- {
117
- id: "number",
118
- section: "numero",
119
- label: "Número",
120
- fields: [
121
- length("--ads-number-height", "Altura", "Medida", "40px"),
122
- length("--ads-number-padding-x", "Padding horizontal", "Medida", "12px"),
123
- length("--ads-number-gap", "Espaço interno", "Medida", "8px"),
124
- length("--ads-number-radius", "Raio", "Medida", "8px"),
125
- length("--ads-number-font-size", "Fonte", "Medida", "14px"),
126
- length("--ads-number-label-size", "Fonte do rótulo", "Medida", "12px"),
127
- color("--ads-number-border", "Borda", "Cores", "#e5e8eb"),
128
- color("--ads-number-background", "Fundo", "Cores", "#ffffff"),
129
- color("--ads-number-text", "Texto", "Cores", "#505f79"),
130
- color("--ads-number-focus-border", "Borda em foco", "Cores", "#0091ff"),
131
- color("--ads-number-hover-border", "Borda no hover", "Cores", "#006ff7"),
132
- color("--ads-number-error-border", "Borda de erro", "Cores", "#ff507a"),
133
- color("--ads-number-disabled-border", "Borda desabilitada", "Cores", "#a5adba"),
134
- color("--ads-number-disabled-background", "Fundo desabilitado", "Cores", "#f0f3f6"),
135
- color("--ads-number-disabled-text", "Texto desabilitado", "Cores", "#a5adba"),
136
- ],
137
- },
138
- {
139
- id: "search",
140
- section: "busca",
141
- label: "Busca",
142
- fields: [
143
- length("--ads-search-sm-height", "Altura SM", "Medida", "40px"),
144
- length("--ads-search-md-height", "Altura MD", "Medida", "45px"),
145
- length("--ads-search-padding-x", "Padding horizontal", "Medida", "12px"),
146
- length("--ads-search-radius", "Raio", "Medida", "500px"),
147
- length("--ads-search-sm-font-size", "Fonte SM", "Medida", "14px"),
148
- length("--ads-search-md-font-size", "Fonte MD", "Medida", "16px"),
149
- color("--ads-search-border", "Borda", "Cores", "#c1c7d0"),
150
- color("--ads-search-background", "Fundo", "Cores", "#ffffff"),
151
- color("--ads-search-text", "Texto", "Cores", "#505f79"),
152
- color("--ads-search-placeholder", "Placeholder", "Cores", "#a5adba"),
153
- color("--ads-search-focus-border", "Borda em foco", "Cores", "#006ff7"),
154
- color("--ads-search-hover-border", "Borda no hover", "Cores", "#006ff7"),
155
- color("--ads-search-disabled-border", "Borda desabilitada", "Cores", "#a5adba"),
156
- color("--ads-search-disabled-background", "Fundo desabilitado", "Cores", "#f0f3f6"),
157
- ],
158
- },
159
- {
160
- id: "textarea",
161
- section: "texto",
162
- label: "Texto longo",
163
- fields: [
164
- length("--ads-textarea-min-height", "Altura mínima", "Medida", "153px"),
165
- length("--ads-textarea-padding", "Padding", "Medida", "12px"),
166
- length("--ads-textarea-radius", "Raio", "Medida", "8px"),
167
- length("--ads-textarea-font-size", "Fonte", "Medida", "16px"),
168
- length("--ads-textarea-label-size", "Fonte do rótulo", "Medida", "12px"),
169
- color("--ads-textarea-border", "Borda", "Cores", "#c1c7d0"),
170
- color("--ads-textarea-background", "Fundo", "Cores", "#ffffff"),
171
- color("--ads-textarea-text", "Texto", "Cores", "#505f79"),
172
- color("--ads-textarea-placeholder", "Placeholder", "Cores", "#a5adba"),
173
- color("--ads-textarea-focus-border", "Borda em foco", "Cores", "#0091ff"),
174
- color("--ads-textarea-hover-border", "Borda no hover", "Cores", "#006ff7"),
175
- color("--ads-textarea-error-border", "Borda de erro", "Cores", "#ff507a"),
176
- color("--ads-textarea-disabled-border", "Borda desabilitada", "Cores", "#c1c7d0"),
177
- color("--ads-textarea-disabled-background", "Fundo desabilitado", "Cores", "#f0f3f6"),
178
- ],
179
- },
180
- {
181
- id: "date",
182
- section: "data",
183
- label: "Data",
184
- fields: [
185
- length("--ads-date-height", "Altura", "Medida", "40px"),
186
- length("--ads-date-padding-x", "Padding horizontal", "Medida", "12px"),
187
- length("--ads-date-radius", "Raio", "Medida", "8px"),
188
- length("--ads-date-font-size", "Fonte", "Fonte", "14px"),
189
- weight("--ads-date-weight", "Peso", "Fonte", "400"),
190
- line("--ads-date-line-height", "Altura de linha", "Fonte", "1.429"),
191
- color("--ads-date-border", "Borda", "Cores", "#cad5e2"),
192
- color("--ads-date-background", "Fundo", "Cores", "#ffffff"),
193
- color("--ads-date-text", "Texto", "Cores", "#0f172b"),
194
- color("--ads-date-placeholder", "Placeholder", "Cores", "#90a1b9"),
195
- color("--ads-date-separator", "Separador", "Cores", "#62748e"),
196
- color("--ads-date-focus-border", "Borda em foco", "Cores", "#006ff7"),
197
- color("--ads-date-hover-border", "Borda no hover", "Cores", "#006ff7"),
198
- /* Mesmo azul do hover do dia no calendário (--color-ads-radar-pricing-25). O editor só aceita #rrggbb, então vai o hex. */
199
- color("--ads-month-hover-bg", "Fundo no hover", "Mês", "#e4f2ff"),
200
- ],
201
- },
202
- {
203
- id: "filter",
204
- section: "filtro",
205
- label: "Filtro",
206
- fields: [
207
- length("--ads-filter-height", "Altura", "Medida", "40px"),
208
- length("--ads-filter-padding-x", "Padding horizontal", "Medida", "12px"),
209
- length("--ads-filter-radius", "Raio", "Medida", "8px"),
210
- length("--ads-filter-font-size", "Fonte", "Medida", "14px"),
211
- length("--ads-filter-label-size", "Fonte do rótulo", "Medida", "12px"),
212
- color("--ads-filter-border", "Borda", "Cores", "#505f79"),
213
- color("--ads-filter-background", "Fundo", "Cores", "#ffffff"),
214
- color("--ads-filter-text", "Texto", "Cores", "#505f79"),
215
- color("--ads-filter-focus-border", "Borda em foco", "Cores", "#006ff7"),
216
- color("--ads-filter-hover-border", "Borda no hover", "Cores", "#006ff7"),
217
- color("--ads-filter-error-border", "Borda de erro", "Cores", "#ff6783"),
218
- color("--ads-filter-disabled-border", "Borda desabilitada", "Cores", "#b3bac5"),
219
- color("--ads-filter-disabled-background", "Fundo desabilitado", "Cores", "#f0f3f6"),
220
- color("--ads-filter-disabled-text", "Texto desabilitado", "Cores", "#a5adba"),
221
- ],
222
- },
223
- {
224
- id: "tabs",
225
- section: "abas",
226
- label: "Abas",
227
- fields: [
228
- length("--ads-tabs-height", "Altura", "Medida", "39px"),
229
- length("--ads-tabs-padding-x", "Padding horizontal", "Medida", "12px"),
230
- length("--ads-tabs-font-size", "Fonte", "Medida", "14px"),
231
- length("--ads-tabs-indicator", "Indicador", "Medida", "4px"),
232
- weight("--ads-tabs-weight", "Peso inativo", "Medida", "500"),
233
- color("--ads-tabs-inactive", "Texto inativo", "Cores", "#505f79"),
234
- color("--ads-tabs-active", "Texto ativo", "Cores", "#061938"),
235
- color("--ads-tabs-indicator-color", "Indicador", "Cores", "#006ff7"),
236
- color("--ads-tabs-border", "Linha", "Cores", "#c1c7d0"),
237
- ],
238
- },
239
- {
240
- id: "segmented",
241
- section: "segmentadas",
242
- label: "Abas segmentadas",
243
- fields: [
244
- length("--ads-segmented-height", "Altura da trilha", "Medida", "37px"),
245
- length("--ads-segmented-item-height", "Altura do item", "Medida", "30px"),
246
- length("--ads-segmented-padding-x", "Padding horizontal", "Medida", "16px"),
247
- length("--ads-segmented-radius", "Raio", "Medida", "4px"),
248
- length("--ads-segmented-font-size", "Fonte", "Medida", "12px"),
249
- color("--ads-segmented-track", "Fundo da trilha", "Cores", "#f0f3f6"),
250
- color("--ads-segmented-active-bg", "Fundo ativo", "Cores", "#ffffff"),
251
- color("--ads-segmented-text", "Texto", "Cores", "#061938"),
252
- color("--ads-segmented-active-text", "Texto ativo", "Cores", "#000000"),
253
- ],
254
- },
255
- {
256
- id: "toast",
257
- section: "aviso",
258
- label: "Aviso",
259
- fields: [
260
- length("--ads-toast-radius", "Raio", "Medida", "8px"),
261
- length("--ads-toast-padding", "Padding", "Medida", "12px"),
262
- length("--ads-toast-gap", "Espaço", "Medida", "12px"),
263
- length("--ads-toast-icon", "Ícone", "Medida", "18px"),
264
- length("--ads-toast-font-size", "Fonte", "Medida", "14px"),
265
- weight("--ads-toast-weight", "Peso", "Medida", "500"),
266
- color("--ads-toast-text", "Texto", "Cores", "#061938"),
267
- color("--ads-toast-primary-bg", "Fundo primário", "Cores", "#e4f2ff"),
268
- color("--ads-toast-error-bg", "Fundo de erro", "Cores", "#ffbdcd"),
269
- color("--ads-toast-warning-bg", "Fundo de alerta", "Cores", "#ffe7b9"),
270
- color("--ads-toast-neutral-bg", "Fundo neutro", "Cores", "#e4f2ff"),
271
- color("--ads-toast-primary-icon", "Ícone primário", "Cores", "#006ff7"),
272
- color("--ads-toast-success-icon", "Ícone de sucesso", "Cores", "#0e5a3b"),
273
- color("--ads-toast-error-icon", "Ícone de erro", "Cores", "#840221"),
274
- color("--ads-toast-warning-icon", "Ícone de alerta", "Cores", "#8f6600"),
275
- color("--ads-toast-neutral-icon", "Ícone neutro", "Cores", "#505f79"),
276
- length("--ads-toast-status-width", "Largura", "Reporte", "331px"),
277
- length("--ads-toast-status-icon", "Ícone", "Reporte", "24px"),
278
- length("--ads-toast-status-title-size", "Fonte do título", "Reporte", "14px"),
279
- length("--ads-toast-status-subtitle-size", "Fonte do subtítulo", "Reporte", "10px"),
280
- color("--ads-toast-status-bg", "Fundo", "Reporte", "#061938"),
281
- color("--ads-toast-status-text", "Texto", "Reporte", "#ffffff"),
282
- color("--ads-toast-status-success", "Ícone de sucesso", "Reporte", "#06eb8f"),
283
- color("--ads-toast-status-error", "Ícone de erro", "Reporte", "#ef164a"),
284
- color("--ads-toast-status-warning", "Ícone de atenção", "Reporte", "#ffb905"),
285
- color("--ads-toast-status-loading", "Ícone de carga", "Reporte", "#49d8f4"),
286
- ],
287
- },
288
- {
289
- id: "file",
290
- section: "arquivo",
291
- label: "Arquivo",
292
- fields: [
293
- length("--ads-file-min-height", "Altura mínima", "Medida", "64px"),
294
- length("--ads-file-radius", "Raio", "Medida", "8px"),
295
- length("--ads-file-padding-x", "Padding horizontal", "Medida", "16px"),
296
- length("--ads-file-padding-y", "Padding vertical", "Medida", "12px"),
297
- length("--ads-file-title-size", "Fonte do nome", "Medida", "14px"),
298
- length("--ads-file-detail-size", "Fonte do detalhe", "Medida", "12px"),
299
- length("--ads-file-icon-box", "Caixa do ícone", "Medida", "32px"),
300
- ],
301
- },
302
- {
303
- id: "tooltip",
304
- section: "tooltip",
305
- label: "Tooltip",
306
- fields: [
307
- length("--ads-tooltip-radius", "Raio", "Medida", "12px"),
308
- length("--ads-tooltip-padding-x", "Padding horizontal", "Medida", "16px"),
309
- length("--ads-tooltip-padding-y", "Padding vertical", "Medida", "12px"),
310
- length("--ads-tooltip-font-size", "Fonte", "Medida", "14px"),
311
- color("--ads-tooltip-bg", "Fundo", "Cores", "#061938"),
312
- color("--ads-tooltip-text", "Texto", "Cores", "#c1c7d0"),
313
- color("--ads-tooltip-title", "Título", "Cores", "#ffffff"),
314
- length("--ads-tooltip-title-size", "Fonte do título", "Medida", "16px"),
315
- length("--ads-tooltip-small-font-size", "Fonte do smalltip", "Smalltip", "10px"),
316
- length("--ads-tooltip-small-padding", "Padding do smalltip", "Smalltip", "8px"),
317
- length("--ads-steptip-width", "Largura do steptip", "Steptip", "328px"),
318
- color("--ads-steptip-skip", "Texto pular", "Steptip", "#b3bac5"),
319
- length("--ads-charttip-min-width", "Largura mínima", "Charttip", "180px"),
320
- length("--ads-charttip-swatch", "Amostra", "Charttip", "16px"),
321
- ],
322
- },
323
- {
324
- id: "loading",
325
- section: "carregando",
326
- label: "Carregando",
327
- fields: [
328
- length("--ads-loading-radius", "Raio do skeleton", "Medida", "4px"),
329
- length("--ads-loading-bar", "Altura da linha", "Medida", "16px"),
330
- length("--ads-loading-spinner", "Spinner", "Medida", "32px"),
331
- length("--ads-loading-label-size", "Fonte do rótulo", "Medida", "14px"),
332
- color("--ads-loading-skeleton", "Skeleton", "Cores", "#e5e8eb"),
333
- color("--ads-loading-spinner-color", "Spinner", "Cores", "#006ff7"),
334
- ],
335
- },
336
- {
337
- id: "progress",
338
- section: "progresso",
339
- label: "Progresso",
340
- fields: [
341
- length("--ads-progress-height", "Altura", "Medida", "8px"),
342
- length("--ads-progress-radius", "Raio", "Medida", "500px"),
343
- color("--ads-progress-track", "Trilha", "Cores", "#e5e8eb"),
344
- color("--ads-progress-fill", "Preenchimento", "Cores", "#006ff7"),
345
- ],
346
- },
347
- {
348
- id: "badge",
349
- section: "badge",
350
- label: "Badge",
351
- note: "O fundo de cada cor continua na escala de status. Aqui ficam a medida e o texto.",
352
- fields: [
353
- length("--ads-badge-size", "Tamanho", "Medida", "24px"),
354
- length("--ads-badge-dot", "Ponto", "Medida", "8px"),
355
- length("--ads-badge-font-size", "Fonte", "Medida", "12px"),
356
- weight("--ads-badge-weight", "Peso", "Medida", "700"),
357
- color("--ads-badge-text", "Texto", "Cores", "#ffffff"),
358
- ],
359
- },
360
- {
361
- id: "broadcast",
362
- section: "broadcast",
363
- label: "Broadcast",
364
- fields: [
365
- length("--ads-broadcast-height", "Altura", "Medida", "24px"),
366
- length("--ads-broadcast-padding-x", "Padding horizontal", "Medida", "8px"),
367
- length("--ads-broadcast-font-size", "Fonte", "Medida", "12px"),
368
- length("--ads-broadcast-mark", "Marca", "Medida", "8px"),
369
- color("--ads-broadcast-warning-bg", "Fundo de alerta", "Cores", "#ffbdcd"),
370
- color("--ads-broadcast-warning", "Alerta", "Cores", "#dc0034"),
371
- color("--ads-broadcast-success-bg", "Fundo de sucesso", "Cores", "#c3ffe6"),
372
- color("--ads-broadcast-success", "Sucesso", "Cores", "#15c57e"),
373
- ],
374
- },
375
- {
376
- id: "pill",
377
- section: "pill",
378
- label: "Pill",
379
- note: "Os outros status continuam no mapa de cor da pill. O editor muda a medida e o primário.",
380
- fields: [
381
- length("--ads-pill-height", "Altura", "Medida", "24px"),
382
- length("--ads-pill-min-width", "Largura mínima", "Medida", "100px"),
383
- length("--ads-pill-padding-x", "Padding horizontal", "Medida", "8px"),
384
- length("--ads-pill-font-size", "Fonte", "Medida", "12px"),
385
- weight("--ads-pill-weight", "Peso", "Medida", "700"),
386
- color("--ads-pill-primary-bg", "Fundo primário", "Cores", "#006ff7"),
387
- color("--ads-pill-primary-text", "Texto primário", "Cores", "#ffffff"),
388
- ],
389
- },
390
- {
391
- id: "notability",
392
- section: "notabilidade",
393
- label: "Notabilidade",
394
- note: "As cores seguem o status. Aqui ficam a medida e o tipo.",
395
- fields: [
396
- length("--ads-notability-height", "Altura", "Medida", "24px"),
397
- length("--ads-notability-min-width", "Largura mínima", "Medida", "100px"),
398
- length("--ads-notability-padding-x", "Padding horizontal", "Medida", "8px"),
399
- length("--ads-notability-font-size", "Fonte", "Medida", "12px"),
400
- weight("--ads-notability-weight", "Peso", "Medida", "700"),
401
- ],
402
- },
403
- {
404
- id: "mini",
405
- section: "mini",
406
- label: "Mini pill",
407
- fields: [
408
- length("--ads-mini-height", "Altura", "Medida", "18px"),
409
- length("--ads-mini-padding-x", "Padding horizontal", "Medida", "8px"),
410
- length("--ads-mini-font-size", "Fonte", "Medida", "10px"),
411
- weight("--ads-mini-weight", "Peso", "Medida", "700"),
412
- color("--ads-mini-idle-bg", "Fundo não iniciado", "Cores", "#d1d9ed"),
413
- color("--ads-mini-idle-text", "Texto não iniciado", "Cores", "#18224b"),
414
- color("--ads-mini-paused-bg", "Fundo pausado", "Cores", "#ffe7b9"),
415
- color("--ads-mini-paused-text", "Texto pausado", "Cores", "#8f6600"),
416
- color("--ads-mini-new-bg", "Fundo novo", "Cores", "#79e9ff"),
417
- color("--ads-mini-new-text", "Texto novo", "Cores", "#006478"),
418
- ],
419
- },
420
- {
421
- id: "switch",
422
- section: "switch",
423
- label: "Switch",
424
- fields: [
425
- length("--ads-switch-width", "Largura", "Medida", "32px"),
426
- length("--ads-switch-height", "Altura", "Medida", "18px"),
427
- length("--ads-switch-thumb", "Botão", "Medida", "12px"),
428
- length("--ads-switch-inset", "Respiro", "Medida", "3px"),
429
- length("--ads-switch-radius", "Raio", "Medida", "9px"),
430
- length("--ads-switch-label-size", "Fonte do rótulo", "Medida", "14px"),
431
- length("--ads-switch-gap", "Espaço", "Medida", "8px"),
432
- color("--ads-switch-off", "Desligado", "Cores", "#c1c7d0"),
433
- color("--ads-switch-on", "Ligado", "Cores", "#006ff7"),
434
- color("--ads-switch-disabled", "Desabilitado", "Cores", "#e5e8eb"),
435
- color("--ads-switch-disabled-on", "Ligado desabilitado", "Cores", "#89c9ff"),
436
- color("--ads-switch-thumb-color", "Botão", "Cores", "#ffffff"),
437
- color("--ads-switch-label", "Rótulo", "Cores", "#505f79"),
438
- ],
439
- },
440
- {
441
- id: "checkbox",
442
- section: "checkbox",
443
- label: "Checkbox",
444
- fields: [
445
- length("--ads-checkbox-size", "Tamanho", "Medida", "16px"),
446
- length("--ads-checkbox-radius", "Raio", "Medida", "4px"),
447
- length("--ads-checkbox-border-width", "Borda", "Medida", "2px"),
448
- length("--ads-checkbox-label-size", "Fonte do rótulo", "Medida", "14px"),
449
- length("--ads-checkbox-gap", "Espaço", "Medida", "8px"),
450
- color("--ads-checkbox-border", "Borda", "Cores", "#006ff7"),
451
- color("--ads-checkbox-checked", "Marcado", "Cores", "#006ff7"),
452
- color("--ads-checkbox-disabled", "Desabilitado", "Cores", "#89c9ff"),
453
- color("--ads-checkbox-background", "Fundo", "Cores", "#ffffff"),
454
- color("--ads-checkbox-label", "Rótulo", "Cores", "#505f79"),
455
- ],
456
- },
457
- {
458
- id: "radio",
459
- section: "radio",
460
- label: "Radio",
461
- fields: [
462
- length("--ads-radio-size", "Tamanho", "Medida", "16px"),
463
- length("--ads-radio-dot", "Miolo", "Medida", "8px"),
464
- length("--ads-radio-border-width", "Borda", "Medida", "2px"),
465
- length("--ads-radio-label-size", "Fonte do rótulo", "Medida", "14px"),
466
- length("--ads-radio-gap", "Espaço", "Medida", "8px"),
467
- color("--ads-radio-border", "Borda", "Cores", "#006ff7"),
468
- color("--ads-radio-disabled", "Desabilitado", "Cores", "#89c9ff"),
469
- color("--ads-radio-background", "Fundo", "Cores", "#ffffff"),
470
- color("--ads-radio-dot-color", "Miolo", "Cores", "#ffffff"),
471
- color("--ads-radio-label", "Rótulo", "Cores", "#505f79"),
472
- ],
473
- },
474
- {
475
- id: "modal",
476
- section: "modal",
477
- label: "Modal",
478
- fields: [
479
- length("--ads-modal-radius", "Raio", "Medida", "8px"),
480
- length("--ads-modal-padding", "Padding", "Medida", "24px"),
481
- length("--ads-modal-title-size", "Fonte do título", "Medida", "20px"),
482
- length("--ads-modal-body-size", "Fonte do texto", "Medida", "14px"),
483
- color("--ads-modal-background", "Fundo", "Cores", "#ffffff"),
484
- color("--ads-modal-border", "Borda", "Cores", "#c1c7d0"),
485
- color("--ads-modal-title", "Título", "Cores", "#061938"),
486
- color("--ads-modal-body", "Texto", "Cores", "#505f79"),
487
- ],
488
- },
489
- {
490
- id: "feature",
491
- section: "feature",
492
- label: "Feature card",
493
- fields: [
494
- length("--ads-feature-width", "Largura", "Medida", "396px"),
495
- length("--ads-feature-radius", "Raio", "Medida", "12px"),
496
- length("--ads-feature-padding", "Padding", "Medida", "16px"),
497
- length("--ads-feature-gap", "Espaço", "Medida", "16px"),
498
- length("--ads-feature-icon-box", "Caixa do ícone", "Medida", "48px"),
499
- length("--ads-feature-title-size", "Fonte do título", "Medida", "16px"),
500
- length("--ads-feature-body-size", "Fonte do texto", "Medida", "14px"),
501
- color("--ads-feature-border", "Borda", "Cores", "#e5e8eb"),
502
- color("--ads-feature-background", "Fundo", "Cores", "#ffffff"),
503
- color("--ads-feature-hover-border", "Borda no hover", "Cores", "#006ff7"),
504
- color("--ads-feature-title", "Título", "Cores", "#061938"),
505
- color("--ads-feature-body", "Texto", "Cores", "#505f79"),
506
- ],
507
- },
508
- {
509
- id: "card",
510
- section: "card",
511
- label: "Card",
512
- fields: [
513
- length("--ads-card-padding", "Padding", "Medida", "16px"),
514
- length("--ads-card-radius", "Raio", "Medida", "12px"),
515
- length("--ads-card-radius-sm", "Raio pequeno", "Medida", "8px"),
516
- length("--ads-card-body-size", "Fonte do texto", "Medida", "14px"),
517
- color("--ads-card-border", "Borda", "Cores", "#e5e8eb"),
518
- color("--ads-card-background", "Fundo", "Cores", "#ffffff"),
519
- color("--ads-card-selected-border", "Borda selecionada", "Cores", "#c1c7d0"),
520
- color("--ads-card-selected-background", "Fundo selecionado", "Cores", "#f0f3f6"),
521
- color("--ads-card-title", "Título", "Cores", "#061938"),
522
- color("--ads-card-body", "Texto", "Cores", "#505f79"),
523
- ],
524
- },
525
- {
526
- id: "metric",
527
- section: "metric",
528
- label: "Métrica",
529
- fields: [
530
- length("--ads-metric-padding", "Padding", "Medida", "16px"),
531
- length("--ads-metric-radius", "Raio", "Medida", "12px"),
532
- length("--ads-metric-gap", "Espaço", "Medida", "8px"),
533
- length("--ads-metric-label-size", "Fonte do rótulo", "Medida", "14px"),
534
- length("--ads-metric-value-size", "Fonte do valor", "Medida", "20px"),
535
- length("--ads-metric-caption-size", "Fonte da legenda", "Medida", "12px"),
536
- color("--ads-metric-border", "Borda", "Cores", "#e5e8eb"),
537
- color("--ads-metric-background", "Fundo", "Cores", "#ffffff"),
538
- color("--ads-metric-label", "Rótulo", "Cores", "#505f79"),
539
- color("--ads-metric-value", "Valor", "Cores", "#061938"),
540
- ],
541
- },
542
- {
543
- id: "menu",
544
- section: "menu",
545
- label: "Menu bar",
546
- fields: [
547
- length("--ads-menu-width", "Largura", "Medida", "100px"),
548
- length("--ads-menu-padding-y", "Padding vertical", "Medida", "16px"),
549
- length("--ads-menu-gap", "Espaço", "Medida", "16px"),
550
- length("--ads-menu-icon", "Ícone", "Medida", "18px"),
551
- length("--ads-menu-icon-box", "Caixa do ícone", "Medida", "40px"),
552
- length("--ads-menu-label-size", "Fonte", "Medida", "12px"),
553
- color("--ads-menu-divider", "Divisor", "Cores", "#e5e8eb"),
554
- ],
555
- },
556
- {
557
- id: "navbar-app",
558
- section: "navbar-app",
559
- label: "Navbar app",
560
- fields: [
561
- length("--ads-navbar-app-height", "Altura", "Medida", "88px"),
562
- length("--ads-navbar-app-gap", "Espaço", "Medida", "33px"),
563
- length("--ads-navbar-app-item-width", "Largura do item", "Medida", "39px"),
564
- length("--ads-navbar-app-well", "Caixa do ícone", "Medida", "28px"),
565
- length("--ads-navbar-app-font-size", "Fonte", "Medida", "10px"),
566
- color("--ads-navbar-app-active", "Ativo", "Cores", "#344563"),
567
- ],
568
- },
569
- {
570
- id: "navbar-desk",
571
- section: "navbar-desk",
572
- label: "Navbar desk",
573
- fields: [
574
- length("--ads-navbar-desk-height", "Altura", "Medida", "64px"),
575
- length("--ads-navbar-desk-padding-x", "Padding horizontal", "Medida", "44px"),
576
- length("--ads-navbar-desk-action", "Botão", "Medida", "40px"),
577
- length("--ads-navbar-desk-avatar", "Avatar", "Medida", "32px"),
578
- color("--ads-navbar-desk-border", "Borda", "Cores", "#d3d8dd"),
579
- ],
580
- },
581
- {
582
- id: "side",
583
- section: "menu-lateral",
584
- label: "Menu lateral",
585
- fields: [
586
- length("--ads-side-width", "Largura", "Medida", "224px"),
587
- length("--ads-side-row-height", "Altura da linha", "Medida", "48px"),
588
- length("--ads-side-badge", "Badge", "Medida", "8px"),
589
- color("--ads-side-border", "Borda", "Cores", "#c1c7d0"),
590
- color("--ads-side-open-bg", "Mãe aberta", "Cores", "#e5e8eb"),
591
- color("--ads-side-child-bg", "Filho", "Cores", "#f0f3f6"),
592
- ],
593
- },
594
- {
595
- id: "footer",
596
- section: "footer",
597
- label: "Footer",
598
- fields: [
599
- length("--ads-footer-min-height", "Altura mínima", "Medida", "32px"),
600
- length("--ads-footer-logo-height", "Logo", "Medida", "12px"),
601
- color("--ads-footer-text", "Texto", "Cores", "#7a869a"),
602
- ],
603
- },
604
- {
605
- id: "product-tag",
606
- section: "product-tag",
607
- label: "Tag de produto",
608
- fields: [
609
- length("--ads-product-tag-height", "Altura", "Medida", "16px"),
610
- length("--ads-product-tag-font-size", "Fonte", "Medida", "11px"),
611
- ],
612
- },
613
- {
614
- id: "button-group",
615
- section: "grupo",
616
- label: "Grupo de botões",
617
- fields: [
618
- length("--ads-button-group-height", "Altura", "Medida", "30px"),
619
- length("--ads-button-group-font-size", "Fonte", "Medida", "12px"),
620
- color("--ads-button-group-border", "Borda", "Cores", "#c1c7d0"),
621
- color("--ads-button-group-selected", "Selecionado", "Cores", "#e5e8eb"),
622
- ],
623
- },
624
- {
625
- id: "button-menu",
626
- section: "menu-botao",
627
- label: "Menu do botão",
628
- fields: [
629
- length("--ads-button-menu-width", "Largura", "Medida", "264px"),
630
- length("--ads-button-menu-title-size", "Fonte do título", "Medida", "16px"),
631
- length("--ads-button-menu-subtitle-size", "Fonte do subtítulo", "Medida", "12px"),
632
- color("--ads-button-menu-title", "Título", "Cores", "#42526e"),
633
- color("--ads-button-menu-subtitle", "Subtítulo", "Cores", "#5e6c84"),
634
- color("--ads-button-menu-border", "Borda", "Cores", "#c1c7d0"),
635
- ],
636
- },
637
- {
638
- id: "list",
639
- section: "lista",
640
- label: "Lista",
641
- fields: [length("--ads-list-min-width", "Largura mínima", "Medida", "260px")],
642
- },
643
- {
644
- id: "pagination",
645
- section: "paginacao",
646
- label: "Paginação",
647
- fields: [
648
- length("--ads-pagination-cell", "Célula", "Medida", "24px"),
649
- length("--ads-pagination-gap", "Espaço", "Medida", "12px"),
650
- length("--ads-pagination-number-gap", "Espaço dos números", "Medida", "4px"),
651
- color("--ads-pagination-selected", "Selecionada", "Cores", "#006ff7"),
652
- color("--ads-pagination-number", "Número", "Cores", "#344563"),
653
- ],
654
- },
655
- {
656
- id: "empty",
657
- section: "vazio",
658
- label: "Empty state",
659
- fields: [
660
- length("--ads-empty-icon", "Ícone", "Medida", "90px"),
661
- length("--ads-empty-icon-sm", "Ícone pequeno", "Medida", "60px"),
662
- length("--ads-empty-title-size", "Fonte do título", "Medida", "18px"),
663
- length("--ads-empty-title-size-sm", "Fonte do título pequeno", "Medida", "16px"),
664
- length("--ads-empty-subtitle-size", "Fonte do apoio", "Medida", "12px"),
665
- length("--ads-empty-gap", "Espaço", "Medida", "24px"),
666
- length("--ads-empty-gap-sm", "Espaço pequeno", "Medida", "32px"),
667
- length("--ads-empty-text-gap", "Espaço do texto", "Medida", "32px"),
668
- color("--ads-empty-icon-color", "Ícone", "Cores", "#c1c7d0"),
669
- ],
670
- },
671
- {
672
- id: "funcional",
673
- section: "funcional",
674
- label: "Funcional",
675
- note: "Cores do arquivo de componentes sem degrau na escala publicada. O badge do menu lateral usa opportunity 200. A borda de erro do filtro repete warning 200.",
676
- fields: [
677
- color("--ads-funcional-warning-200", "Warning 200", "Cores", "#ff6783"),
678
- color("--ads-funcional-opportunity-200", "Opportunity 200", "Cores", "#0ebbda"),
679
- ],
680
- },
681
- {
682
- id: "farmarcas",
683
- section: "farmarcas",
684
- label: "Farmarcas",
685
- note: "Cada departamento tem fundo e texto. Não há token semântico equivalente.",
686
- fields: [
687
- length("--ads-farmarcas-height", "Altura", "Medida", "24px"),
688
- length("--ads-farmarcas-min-width", "Largura mínima", "Medida", "100px"),
689
- length("--ads-farmarcas-font-size", "Fonte", "Medida", "12px"),
690
- color("--ads-farmarcas-expansao-bg", "Fundo", "Expansão", "#d8bbd8"),
691
- color("--ads-farmarcas-expansao-text", "Texto", "Expansão", "#700e84"),
692
- color("--ads-farmarcas-eventos-bg", "Fundo", "Eventos", "#fce083"),
693
- color("--ads-farmarcas-eventos-text", "Texto", "Eventos", "#bb6a00"),
694
- color("--ads-farmarcas-adm-digital-bg", "Fundo", "ADM digital", "#eef2c1"),
695
- color("--ads-farmarcas-adm-digital-text", "Texto", "ADM digital", "#555931"),
696
- color("--ads-farmarcas-sucesso-bg", "Fundo", "Sucesso", "#e4f3c1"),
697
- color("--ads-farmarcas-sucesso-text", "Texto", "Sucesso", "#6b7300"),
698
- color("--ads-farmarcas-trade-bg", "Fundo", "Trade", "#b3cfe4"),
699
- color("--ads-farmarcas-trade-text", "Texto", "Trade", "#194464"),
700
- color("--ads-farmarcas-dev-bg", "Fundo", "Dev", "#ffbbe4"),
701
- color("--ads-farmarcas-dev-text", "Texto", "Dev", "#8b2d65"),
702
- color("--ads-farmarcas-ti-bg", "Fundo", "TI", "#d2c5ee"),
703
- color("--ads-farmarcas-ti-text", "Texto", "TI", "#2b209c"),
704
- color("--ads-farmarcas-padronizacao-bg", "Fundo", "Padronização", "#c4cdea"),
705
- color("--ads-farmarcas-padronizacao-text", "Texto", "Padronização", "#062c80"),
706
- color("--ads-farmarcas-diretoria-bg", "Fundo", "Diretoria", "#c9c9c9"),
707
- color("--ads-farmarcas-diretoria-text", "Texto", "Diretoria", "#000000"),
708
- color("--ads-farmarcas-comercial-bg", "Fundo", "Comercial", "#c0c7d9"),
709
- color("--ads-farmarcas-comercial-text", "Texto", "Comercial", "#18224b"),
710
- color("--ads-farmarcas-inovacao-bg", "Fundo", "Inovação", "#b6bdff"),
711
- color("--ads-farmarcas-inovacao-text", "Texto", "Inovação", "#393f73"),
712
- color("--ads-farmarcas-patrimonio-bg", "Fundo", "Patrimônio", "#d9b6c5"),
713
- color("--ads-farmarcas-patrimonio-text", "Texto", "Patrimônio", "#7f3454"),
714
- color("--ads-farmarcas-presidencia-bg", "Fundo", "Presidência", "#c9c9c9"),
715
- color("--ads-farmarcas-presidencia-text", "Texto", "Presidência", "#000000"),
716
- color("--ads-farmarcas-marketing-bg", "Fundo", "Marketing", "#b2e9e8"),
717
- color("--ads-farmarcas-marketing-text", "Texto", "Marketing", "#1b5955"),
718
- color("--ads-farmarcas-gg-bg", "Fundo", "G&G", "#ffdfb5"),
719
- color("--ads-farmarcas-gg-text", "Texto", "G&G", "#e0521f"),
720
- color("--ads-farmarcas-bi-bg", "Fundo", "BI", "#f8c09f"),
721
- color("--ads-farmarcas-bi-text", "Texto", "BI", "#4e1400"),
722
- color("--ads-farmarcas-financeiro-bg", "Fundo", "Financeiro", "#c5ddc3"),
723
- color("--ads-farmarcas-financeiro-text", "Texto", "Financeiro", "#05750a"),
724
- color("--ads-farmarcas-juridico-bg", "Fundo", "Jurídico", "#d9d8c0"),
725
- color("--ads-farmarcas-juridico-text", "Texto", "Jurídico", "#464535"),
726
- color("--ads-farmarcas-capacitacao-bg", "Fundo", "Capacitação", "#e5c1fe"),
727
- color("--ads-farmarcas-capacitacao-text", "Texto", "Capacitação", "#360ea7"),
728
- color("--ads-farmarcas-produto-bg", "Fundo", "produto", "#f0ed9a"),
729
- color("--ads-farmarcas-produto-text", "Texto", "produto", "#655200"),
730
- ],
731
- },
732
- ];
733
-
734
- export const allTokenFields = () => componentTokenCatalog.flatMap((component) => component.fields);
735
-
736
- export const componentTokenDefaults = (): Record<string, string> =>
737
- Object.fromEntries(allTokenFields().map((field) => [field.name, field.fallback]));
738
-
739
- export const tokenGroups = (component: TokenComponent) => {
740
- const groups: { label: string; fields: TokenField[] }[] = [];
741
- for (const field of component.fields) {
742
- const current = groups.find((group) => group.label === field.group);
743
- if (current) current.fields.push(field);
744
- else groups.push({ label: field.group, fields: [field] });
745
- }
746
- return groups;
747
- };
748
-
749
- const lengthPattern = /^(?:\d{1,4})(?:\.\d+)?(?:px|rem)$/;
750
- const colorPattern = /^#[0-9a-f]{6}$/;
751
- const weightPattern = /^(?:300|400|500|700|800)$/;
752
-
753
- export const tokenValueValid = (kind: TokenKind, value: string) => {
754
- if (kind === "color") return colorPattern.test(value);
755
- if (kind === "length") return lengthPattern.test(value);
756
- if (kind === "weight") return weightPattern.test(value);
757
- if (!/^\d(?:\.\d{1,3})?$/.test(value)) return false;
758
- const line = Number(value);
759
- return line >= 1 && line <= 2;
760
- };
761
-
762
- const normalizeValue = (field: TokenField, value: string) =>
763
- field.kind === "color" ? value.toLowerCase() : value;
764
-
765
- export const normalizeStoredTokens = (input: unknown): Record<string, string> => {
766
- const tokens = componentTokenDefaults();
767
- if (!input || typeof input !== "object" || Array.isArray(input)) return tokens;
768
- const record = input as Record<string, unknown>;
769
- for (const field of allTokenFields()) {
770
- const value = record[field.name];
771
- if (typeof value !== "string") continue;
772
- const normalized = normalizeValue(field, value.trim());
773
- if (tokenValueValid(field.kind, normalized)) tokens[field.name] = normalized;
774
- }
775
- return tokens;
776
- };
777
-
778
- export const assertComponentTokens = (input: unknown): Record<string, string> => {
779
- if (!input || typeof input !== "object" || Array.isArray(input)) {
780
- throw new Error("O corpo precisa ser o mapa de tokens.");
781
- }
782
- const record = input as Record<string, unknown>;
783
- const tokens: Record<string, string> = {};
784
- const invalid: string[] = [];
785
- for (const field of allTokenFields()) {
786
- const value = record[field.name];
787
- if (typeof value !== "string") {
788
- invalid.push(field.label);
789
- continue;
790
- }
791
- const normalized = normalizeValue(field, value.trim());
792
- if (!tokenValueValid(field.kind, normalized)) {
793
- invalid.push(field.label);
794
- continue;
795
- }
796
- tokens[field.name] = normalized;
797
- }
798
- if (invalid.length) {
799
- throw new Error(`Valores inválidos: ${invalid.join(", ")}.`);
800
- }
801
- return tokens;
802
- };
803
-
804
- export const componentTokensCss = (tokens: Record<string, string>) => {
805
- const lines = allTokenFields().map((field) => ` ${field.name}: ${tokens[field.name]};`);
806
- return [
807
- "/* Gerado pela tela /design-system/tokens. Fonte: app/theme/component-tokens.json */",
808
- ":root {",
809
- ...lines,
810
- "}",
811
- "",
812
- ].join("\n");
813
- };
814
-
815
- export const PREVIEW_STYLE_ID = "ads-component-token-preview";
1
+ export type TokenKind = "color" | "length" | "weight" | "line";
2
+
3
+ export type TokenField = {
4
+ name: string;
5
+ label: string;
6
+ kind: TokenKind;
7
+ group: string;
8
+ fallback: string;
9
+ };
10
+
11
+ export type TokenComponent = {
12
+ id: string;
13
+ /** Id da seção na página de tokens e no menu. */
14
+ section: string;
15
+ label: string;
16
+ note?: string;
17
+ fields: readonly TokenField[];
18
+ };
19
+
20
+ const length = (name: string, label: string, group: string, fallback: string): TokenField => ({
21
+ name,
22
+ label,
23
+ kind: "length",
24
+ group,
25
+ fallback,
26
+ });
27
+
28
+ const color = (name: string, label: string, group: string, fallback: string): TokenField => ({
29
+ name,
30
+ label,
31
+ kind: "color",
32
+ group,
33
+ fallback,
34
+ });
35
+
36
+ const weight = (name: string, label: string, group: string, fallback: string): TokenField => ({
37
+ name,
38
+ label,
39
+ kind: "weight",
40
+ group,
41
+ fallback,
42
+ });
43
+
44
+ const line = (name: string, label: string, group: string, fallback: string): TokenField => ({
45
+ name,
46
+ label,
47
+ kind: "line",
48
+ group,
49
+ fallback,
50
+ });
51
+
52
+ export const componentTokenCatalog: readonly TokenComponent[] = [
53
+ {
54
+ id: "button",
55
+ section: "botao",
56
+ label: "Botão",
57
+ note: "Outline, unfilled e as cores de status continuam nos tokens semânticos. O tipo IA usa fundo, borda e brilho próprios; o texto é innovation 300.",
58
+ fields: [
59
+ length("--ads-button-radius", "Raio", "Forma", "8px"),
60
+ weight("--ads-button-weight", "Peso", "Forma", "700"),
61
+ length("--ads-button-sm-height", "Altura", "Tamanho SM", "32px"),
62
+ length("--ads-button-sm-padding-x", "Padding horizontal", "Tamanho SM", "12px"),
63
+ length("--ads-button-sm-gap", "Espaço do ícone", "Tamanho SM", "8px"),
64
+ length("--ads-button-sm-font-size", "Fonte", "Tamanho SM", "12px"),
65
+ line("--ads-button-sm-line-height", "Altura de linha", "Tamanho SM", "1.2"),
66
+ length("--ads-button-sm-icon", "Ícone", "Tamanho SM", "16px"),
67
+ length("--ads-button-sm-icon-box", "Caixa do ícone", "Tamanho SM", "32px"),
68
+ length("--ads-button-md-padding-x", "Padding horizontal", "Tamanho MD", "16px"),
69
+ length("--ads-button-md-padding-y", "Padding vertical", "Tamanho MD", "12px"),
70
+ length("--ads-button-md-gap", "Espaço do ícone", "Tamanho MD", "8px"),
71
+ length("--ads-button-md-font-size", "Fonte", "Tamanho MD", "14px"),
72
+ line("--ads-button-md-line-height", "Altura de linha", "Tamanho MD", "1.3"),
73
+ length("--ads-button-md-icon", "Ícone", "Tamanho MD", "18px"),
74
+ length("--ads-button-md-icon-box", "Caixa do ícone", "Tamanho MD", "40px"),
75
+ color("--ads-button-primary", "Fundo", "Primário preenchido", "#006ff7"),
76
+ color("--ads-button-primary-hover", "Fundo no hover", "Primário preenchido", "#074ac6"),
77
+ color("--ads-button-primary-pressed", "Fundo no pressed", "Primário preenchido", "#00389e"),
78
+ color("--ads-button-primary-disabled", "Fundo desabilitado", "Primário preenchido", "#89c9ff"),
79
+ color("--ads-button-primary-text", "Texto", "Primário preenchido", "#ffffff"),
80
+ color("--ads-button-secondary", "Fundo", "Secundário", "#e4f2ff"),
81
+ color("--ads-button-secondary-hover", "Fundo no hover", "Secundário", "#c7e4ff"),
82
+ color("--ads-button-secondary-pressed", "Fundo no pressed", "Secundário", "#89c9ff"),
83
+ color("--ads-button-secondary-disabled", "Fundo desabilitado", "Secundário", "#d3d8dd"),
84
+ color("--ads-button-secondary-text", "Texto", "Secundário", "#006ff7"),
85
+ color("--ads-button-secondary-disabled-text", "Texto desabilitado", "Secundário", "#ffffff"),
86
+ color("--ads-button-ia-background", "Fundo", "IA", "#f3f0ff"),
87
+ color("--ads-button-ia-border", "Borda", "IA", "#7358cc"),
88
+ color("--ads-button-ia-glow", "Brilho", "IA", "#ae96ff"),
89
+ length("--ads-button-ia-radius", "Raio", "IA", "4px"),
90
+ length("--ads-button-ia-line-height", "Altura de linha", "IA", "24px"),
91
+ ],
92
+ },
93
+ {
94
+ id: "input",
95
+ section: "campo",
96
+ label: "Campo",
97
+ note: "Vale para o AdsInput. O estado de IA continua com a cor própria.",
98
+ fields: [
99
+ length("--ads-input-height", "Altura", "Medida", "40px"),
100
+ length("--ads-input-padding-x", "Padding horizontal", "Medida", "12px"),
101
+ length("--ads-input-gap", "Espaço interno", "Medida", "8px"),
102
+ length("--ads-input-radius", "Raio", "Medida", "8px"),
103
+ length("--ads-input-font-size", "Fonte", "Medida", "14px"),
104
+ length("--ads-input-label-size", "Fonte do rótulo", "Medida", "12px"),
105
+ color("--ads-input-border", "Borda", "Cores", "#c1c7d0"),
106
+ color("--ads-input-background", "Fundo", "Cores", "#ffffff"),
107
+ color("--ads-input-text", "Texto", "Cores", "#505f79"),
108
+ color("--ads-input-focus-border", "Borda em foco", "Cores", "#0091ff"),
109
+ color("--ads-input-hover-border", "Borda no hover", "Cores", "#006ff7"),
110
+ color("--ads-input-error-border", "Borda de erro", "Cores", "#ff507a"),
111
+ color("--ads-input-disabled-border", "Borda desabilitada", "Cores", "#a5adba"),
112
+ color("--ads-input-disabled-background", "Fundo desabilitado", "Cores", "#f0f3f6"),
113
+ color("--ads-input-disabled-text", "Texto desabilitado", "Cores", "#a5adba"),
114
+ ],
115
+ },
116
+ {
117
+ id: "number",
118
+ section: "numero",
119
+ label: "Número",
120
+ fields: [
121
+ length("--ads-number-height", "Altura", "Medida", "40px"),
122
+ length("--ads-number-padding-x", "Padding horizontal", "Medida", "12px"),
123
+ length("--ads-number-gap", "Espaço interno", "Medida", "8px"),
124
+ length("--ads-number-radius", "Raio", "Medida", "8px"),
125
+ length("--ads-number-font-size", "Fonte", "Medida", "14px"),
126
+ length("--ads-number-label-size", "Fonte do rótulo", "Medida", "12px"),
127
+ color("--ads-number-border", "Borda", "Cores", "#e5e8eb"),
128
+ color("--ads-number-background", "Fundo", "Cores", "#ffffff"),
129
+ color("--ads-number-text", "Texto", "Cores", "#505f79"),
130
+ color("--ads-number-focus-border", "Borda em foco", "Cores", "#0091ff"),
131
+ color("--ads-number-hover-border", "Borda no hover", "Cores", "#006ff7"),
132
+ color("--ads-number-error-border", "Borda de erro", "Cores", "#ff507a"),
133
+ color("--ads-number-disabled-border", "Borda desabilitada", "Cores", "#a5adba"),
134
+ color("--ads-number-disabled-background", "Fundo desabilitado", "Cores", "#f0f3f6"),
135
+ color("--ads-number-disabled-text", "Texto desabilitado", "Cores", "#a5adba"),
136
+ ],
137
+ },
138
+ {
139
+ id: "search",
140
+ section: "busca",
141
+ label: "Busca",
142
+ fields: [
143
+ length("--ads-search-sm-height", "Altura SM", "Medida", "40px"),
144
+ length("--ads-search-md-height", "Altura MD", "Medida", "45px"),
145
+ length("--ads-search-padding-x", "Padding horizontal", "Medida", "12px"),
146
+ length("--ads-search-radius", "Raio", "Medida", "500px"),
147
+ length("--ads-search-sm-font-size", "Fonte SM", "Medida", "14px"),
148
+ length("--ads-search-md-font-size", "Fonte MD", "Medida", "16px"),
149
+ color("--ads-search-border", "Borda", "Cores", "#c1c7d0"),
150
+ color("--ads-search-background", "Fundo", "Cores", "#ffffff"),
151
+ color("--ads-search-text", "Texto", "Cores", "#505f79"),
152
+ color("--ads-search-placeholder", "Placeholder", "Cores", "#a5adba"),
153
+ color("--ads-search-focus-border", "Borda em foco", "Cores", "#006ff7"),
154
+ color("--ads-search-hover-border", "Borda no hover", "Cores", "#006ff7"),
155
+ color("--ads-search-disabled-border", "Borda desabilitada", "Cores", "#a5adba"),
156
+ color("--ads-search-disabled-background", "Fundo desabilitado", "Cores", "#f0f3f6"),
157
+ ],
158
+ },
159
+ {
160
+ id: "textarea",
161
+ section: "texto",
162
+ label: "Texto longo",
163
+ fields: [
164
+ length("--ads-textarea-min-height", "Altura mínima", "Medida", "153px"),
165
+ length("--ads-textarea-padding", "Padding", "Medida", "12px"),
166
+ length("--ads-textarea-radius", "Raio", "Medida", "8px"),
167
+ length("--ads-textarea-font-size", "Fonte", "Medida", "16px"),
168
+ length("--ads-textarea-label-size", "Fonte do rótulo", "Medida", "12px"),
169
+ color("--ads-textarea-border", "Borda", "Cores", "#c1c7d0"),
170
+ color("--ads-textarea-background", "Fundo", "Cores", "#ffffff"),
171
+ color("--ads-textarea-text", "Texto", "Cores", "#505f79"),
172
+ color("--ads-textarea-placeholder", "Placeholder", "Cores", "#a5adba"),
173
+ color("--ads-textarea-focus-border", "Borda em foco", "Cores", "#0091ff"),
174
+ color("--ads-textarea-hover-border", "Borda no hover", "Cores", "#006ff7"),
175
+ color("--ads-textarea-error-border", "Borda de erro", "Cores", "#ff507a"),
176
+ color("--ads-textarea-disabled-border", "Borda desabilitada", "Cores", "#c1c7d0"),
177
+ color("--ads-textarea-disabled-background", "Fundo desabilitado", "Cores", "#f0f3f6"),
178
+ ],
179
+ },
180
+ {
181
+ id: "date",
182
+ section: "data",
183
+ label: "Data",
184
+ fields: [
185
+ length("--ads-date-height", "Altura", "Medida", "40px"),
186
+ length("--ads-date-padding-x", "Padding horizontal", "Medida", "12px"),
187
+ length("--ads-date-radius", "Raio", "Medida", "8px"),
188
+ length("--ads-date-font-size", "Fonte", "Fonte", "14px"),
189
+ weight("--ads-date-weight", "Peso", "Fonte", "400"),
190
+ line("--ads-date-line-height", "Altura de linha", "Fonte", "1.429"),
191
+ color("--ads-date-border", "Borda", "Cores", "#cad5e2"),
192
+ color("--ads-date-background", "Fundo", "Cores", "#ffffff"),
193
+ color("--ads-date-text", "Texto", "Cores", "#0f172b"),
194
+ color("--ads-date-placeholder", "Placeholder", "Cores", "#90a1b9"),
195
+ color("--ads-date-separator", "Separador", "Cores", "#62748e"),
196
+ color("--ads-date-focus-border", "Borda em foco", "Cores", "#006ff7"),
197
+ color("--ads-date-hover-border", "Borda no hover", "Cores", "#006ff7"),
198
+ /* Mesmo azul do hover do dia no calendário (--color-ads-radar-pricing-25). O editor só aceita #rrggbb, então vai o hex. */
199
+ color("--ads-month-hover-bg", "Fundo no hover", "Mês", "#e4f2ff"),
200
+ ],
201
+ },
202
+ {
203
+ id: "filter",
204
+ section: "filtro",
205
+ label: "Filtro",
206
+ fields: [
207
+ length("--ads-filter-height", "Altura", "Medida", "40px"),
208
+ length("--ads-filter-padding-x", "Padding horizontal", "Medida", "12px"),
209
+ length("--ads-filter-radius", "Raio", "Medida", "8px"),
210
+ length("--ads-filter-font-size", "Fonte", "Medida", "14px"),
211
+ length("--ads-filter-label-size", "Fonte do rótulo", "Medida", "12px"),
212
+ color("--ads-filter-border", "Borda", "Cores", "#505f79"),
213
+ color("--ads-filter-background", "Fundo", "Cores", "#ffffff"),
214
+ color("--ads-filter-text", "Texto", "Cores", "#505f79"),
215
+ color("--ads-filter-focus-border", "Borda em foco", "Cores", "#006ff7"),
216
+ color("--ads-filter-hover-border", "Borda no hover", "Cores", "#006ff7"),
217
+ color("--ads-filter-error-border", "Borda de erro", "Cores", "#ff6783"),
218
+ color("--ads-filter-disabled-border", "Borda desabilitada", "Cores", "#b3bac5"),
219
+ color("--ads-filter-disabled-background", "Fundo desabilitado", "Cores", "#f0f3f6"),
220
+ color("--ads-filter-disabled-text", "Texto desabilitado", "Cores", "#a5adba"),
221
+ ],
222
+ },
223
+ {
224
+ id: "tabs",
225
+ section: "abas",
226
+ label: "Abas",
227
+ fields: [
228
+ length("--ads-tabs-height", "Altura", "Medida", "39px"),
229
+ length("--ads-tabs-padding-x", "Padding horizontal", "Medida", "12px"),
230
+ length("--ads-tabs-font-size", "Fonte", "Medida", "14px"),
231
+ length("--ads-tabs-indicator", "Indicador", "Medida", "4px"),
232
+ weight("--ads-tabs-weight", "Peso inativo", "Medida", "500"),
233
+ color("--ads-tabs-inactive", "Texto inativo", "Cores", "#505f79"),
234
+ color("--ads-tabs-active", "Texto ativo", "Cores", "#061938"),
235
+ color("--ads-tabs-indicator-color", "Indicador", "Cores", "#006ff7"),
236
+ color("--ads-tabs-border", "Linha", "Cores", "#c1c7d0"),
237
+ ],
238
+ },
239
+ {
240
+ id: "segmented",
241
+ section: "segmentadas",
242
+ label: "Abas segmentadas",
243
+ fields: [
244
+ length("--ads-segmented-height", "Altura da trilha", "Medida", "37px"),
245
+ length("--ads-segmented-item-height", "Altura do item", "Medida", "30px"),
246
+ length("--ads-segmented-padding-x", "Padding horizontal", "Medida", "16px"),
247
+ length("--ads-segmented-radius", "Raio", "Medida", "4px"),
248
+ length("--ads-segmented-font-size", "Fonte", "Medida", "12px"),
249
+ color("--ads-segmented-track", "Fundo da trilha", "Cores", "#f0f3f6"),
250
+ color("--ads-segmented-active-bg", "Fundo ativo", "Cores", "#ffffff"),
251
+ color("--ads-segmented-text", "Texto", "Cores", "#061938"),
252
+ color("--ads-segmented-active-text", "Texto ativo", "Cores", "#000000"),
253
+ ],
254
+ },
255
+ {
256
+ id: "toast",
257
+ section: "aviso",
258
+ label: "Aviso",
259
+ fields: [
260
+ length("--ads-toast-radius", "Raio", "Medida", "8px"),
261
+ length("--ads-toast-padding", "Padding", "Medida", "12px"),
262
+ length("--ads-toast-gap", "Espaço", "Medida", "12px"),
263
+ length("--ads-toast-icon", "Ícone", "Medida", "18px"),
264
+ length("--ads-toast-font-size", "Fonte", "Medida", "14px"),
265
+ weight("--ads-toast-weight", "Peso", "Medida", "500"),
266
+ color("--ads-toast-text", "Texto", "Cores", "#061938"),
267
+ color("--ads-toast-primary-bg", "Fundo primário", "Cores", "#e4f2ff"),
268
+ color("--ads-toast-error-bg", "Fundo de erro", "Cores", "#ffbdcd"),
269
+ color("--ads-toast-warning-bg", "Fundo de alerta", "Cores", "#ffe7b9"),
270
+ color("--ads-toast-neutral-bg", "Fundo neutro", "Cores", "#e4f2ff"),
271
+ color("--ads-toast-primary-icon", "Ícone primário", "Cores", "#006ff7"),
272
+ color("--ads-toast-success-icon", "Ícone de sucesso", "Cores", "#0e5a3b"),
273
+ color("--ads-toast-error-icon", "Ícone de erro", "Cores", "#840221"),
274
+ color("--ads-toast-warning-icon", "Ícone de alerta", "Cores", "#8f6600"),
275
+ color("--ads-toast-neutral-icon", "Ícone neutro", "Cores", "#505f79"),
276
+ length("--ads-toast-status-width", "Largura", "Reporte", "331px"),
277
+ length("--ads-toast-status-icon", "Ícone", "Reporte", "24px"),
278
+ length("--ads-toast-status-title-size", "Fonte do título", "Reporte", "14px"),
279
+ length("--ads-toast-status-subtitle-size", "Fonte do subtítulo", "Reporte", "10px"),
280
+ color("--ads-toast-status-bg", "Fundo", "Reporte", "#061938"),
281
+ color("--ads-toast-status-text", "Texto", "Reporte", "#ffffff"),
282
+ color("--ads-toast-status-success", "Ícone de sucesso", "Reporte", "#06eb8f"),
283
+ color("--ads-toast-status-error", "Ícone de erro", "Reporte", "#ef164a"),
284
+ color("--ads-toast-status-warning", "Ícone de atenção", "Reporte", "#ffb905"),
285
+ color("--ads-toast-status-loading", "Ícone de carga", "Reporte", "#49d8f4"),
286
+ ],
287
+ },
288
+ {
289
+ id: "file",
290
+ section: "arquivo",
291
+ label: "Arquivo",
292
+ fields: [
293
+ length("--ads-file-min-height", "Altura mínima", "Medida", "64px"),
294
+ length("--ads-file-radius", "Raio", "Medida", "8px"),
295
+ length("--ads-file-padding-x", "Padding horizontal", "Medida", "16px"),
296
+ length("--ads-file-padding-y", "Padding vertical", "Medida", "12px"),
297
+ length("--ads-file-title-size", "Fonte do nome", "Medida", "14px"),
298
+ length("--ads-file-detail-size", "Fonte do detalhe", "Medida", "12px"),
299
+ length("--ads-file-icon-box", "Caixa do ícone", "Medida", "32px"),
300
+ ],
301
+ },
302
+ {
303
+ id: "tooltip",
304
+ section: "tooltip",
305
+ label: "Tooltip",
306
+ fields: [
307
+ length("--ads-tooltip-radius", "Raio", "Medida", "12px"),
308
+ length("--ads-tooltip-padding-x", "Padding horizontal", "Medida", "16px"),
309
+ length("--ads-tooltip-padding-y", "Padding vertical", "Medida", "12px"),
310
+ length("--ads-tooltip-font-size", "Fonte", "Medida", "14px"),
311
+ color("--ads-tooltip-bg", "Fundo", "Cores", "#061938"),
312
+ color("--ads-tooltip-text", "Texto", "Cores", "#c1c7d0"),
313
+ color("--ads-tooltip-title", "Título", "Cores", "#ffffff"),
314
+ length("--ads-tooltip-title-size", "Fonte do título", "Medida", "16px"),
315
+ length("--ads-tooltip-small-font-size", "Fonte do smalltip", "Smalltip", "10px"),
316
+ length("--ads-tooltip-small-padding", "Padding do smalltip", "Smalltip", "8px"),
317
+ length("--ads-steptip-width", "Largura do steptip", "Steptip", "328px"),
318
+ color("--ads-steptip-skip", "Texto pular", "Steptip", "#b3bac5"),
319
+ length("--ads-charttip-min-width", "Largura mínima", "Charttip", "180px"),
320
+ length("--ads-charttip-swatch", "Amostra", "Charttip", "16px"),
321
+ ],
322
+ },
323
+ {
324
+ id: "loading",
325
+ section: "carregando",
326
+ label: "Carregando",
327
+ fields: [
328
+ length("--ads-loading-radius", "Raio do skeleton", "Medida", "4px"),
329
+ length("--ads-loading-bar", "Altura da linha", "Medida", "16px"),
330
+ length("--ads-loading-spinner", "Spinner", "Medida", "32px"),
331
+ length("--ads-loading-label-size", "Fonte do rótulo", "Medida", "14px"),
332
+ color("--ads-loading-skeleton", "Skeleton", "Cores", "#e5e8eb"),
333
+ color("--ads-loading-spinner-color", "Spinner", "Cores", "#006ff7"),
334
+ ],
335
+ },
336
+ {
337
+ id: "progress",
338
+ section: "progresso",
339
+ label: "Progresso",
340
+ fields: [
341
+ length("--ads-progress-height", "Altura", "Medida", "8px"),
342
+ length("--ads-progress-radius", "Raio", "Medida", "500px"),
343
+ color("--ads-progress-track", "Trilha", "Cores", "#e5e8eb"),
344
+ color("--ads-progress-fill", "Preenchimento", "Cores", "#006ff7"),
345
+ ],
346
+ },
347
+ {
348
+ id: "badge",
349
+ section: "badge",
350
+ label: "Badge",
351
+ note: "O fundo de cada cor continua na escala de status. Aqui ficam a medida e o texto.",
352
+ fields: [
353
+ length("--ads-badge-size", "Tamanho", "Medida", "24px"),
354
+ length("--ads-badge-dot", "Ponto", "Medida", "8px"),
355
+ length("--ads-badge-font-size", "Fonte", "Medida", "12px"),
356
+ weight("--ads-badge-weight", "Peso", "Medida", "700"),
357
+ color("--ads-badge-text", "Texto", "Cores", "#ffffff"),
358
+ ],
359
+ },
360
+ {
361
+ id: "broadcast",
362
+ section: "broadcast",
363
+ label: "Broadcast",
364
+ fields: [
365
+ length("--ads-broadcast-height", "Altura", "Medida", "24px"),
366
+ length("--ads-broadcast-padding-x", "Padding horizontal", "Medida", "8px"),
367
+ length("--ads-broadcast-font-size", "Fonte", "Medida", "12px"),
368
+ length("--ads-broadcast-mark", "Marca", "Medida", "8px"),
369
+ color("--ads-broadcast-warning-bg", "Fundo de alerta", "Cores", "#ffbdcd"),
370
+ color("--ads-broadcast-warning", "Alerta", "Cores", "#dc0034"),
371
+ color("--ads-broadcast-success-bg", "Fundo de sucesso", "Cores", "#c3ffe6"),
372
+ color("--ads-broadcast-success", "Sucesso", "Cores", "#15c57e"),
373
+ ],
374
+ },
375
+ {
376
+ id: "pill",
377
+ section: "pill",
378
+ label: "Pill",
379
+ note: "Os outros status continuam no mapa de cor da pill. O editor muda a medida e o primário.",
380
+ fields: [
381
+ length("--ads-pill-height", "Altura", "Medida", "24px"),
382
+ length("--ads-pill-min-width", "Largura mínima", "Medida", "100px"),
383
+ length("--ads-pill-padding-x", "Padding horizontal", "Medida", "8px"),
384
+ length("--ads-pill-font-size", "Fonte", "Medida", "12px"),
385
+ weight("--ads-pill-weight", "Peso", "Medida", "700"),
386
+ color("--ads-pill-primary-bg", "Fundo primário", "Cores", "#006ff7"),
387
+ color("--ads-pill-primary-text", "Texto primário", "Cores", "#ffffff"),
388
+ ],
389
+ },
390
+ {
391
+ id: "notability",
392
+ section: "notabilidade",
393
+ label: "Notabilidade",
394
+ note: "As cores seguem o status. Aqui ficam a medida e o tipo.",
395
+ fields: [
396
+ length("--ads-notability-height", "Altura", "Medida", "24px"),
397
+ length("--ads-notability-min-width", "Largura mínima", "Medida", "100px"),
398
+ length("--ads-notability-padding-x", "Padding horizontal", "Medida", "8px"),
399
+ length("--ads-notability-font-size", "Fonte", "Medida", "12px"),
400
+ weight("--ads-notability-weight", "Peso", "Medida", "700"),
401
+ ],
402
+ },
403
+ {
404
+ id: "mini",
405
+ section: "mini",
406
+ label: "Mini pill",
407
+ fields: [
408
+ length("--ads-mini-height", "Altura", "Medida", "18px"),
409
+ length("--ads-mini-padding-x", "Padding horizontal", "Medida", "8px"),
410
+ length("--ads-mini-font-size", "Fonte", "Medida", "10px"),
411
+ weight("--ads-mini-weight", "Peso", "Medida", "700"),
412
+ color("--ads-mini-idle-bg", "Fundo não iniciado", "Cores", "#d1d9ed"),
413
+ color("--ads-mini-idle-text", "Texto não iniciado", "Cores", "#18224b"),
414
+ color("--ads-mini-paused-bg", "Fundo pausado", "Cores", "#ffe7b9"),
415
+ color("--ads-mini-paused-text", "Texto pausado", "Cores", "#8f6600"),
416
+ color("--ads-mini-new-bg", "Fundo novo", "Cores", "#79e9ff"),
417
+ color("--ads-mini-new-text", "Texto novo", "Cores", "#006478"),
418
+ ],
419
+ },
420
+ {
421
+ id: "switch",
422
+ section: "switch",
423
+ label: "Switch",
424
+ fields: [
425
+ length("--ads-switch-width", "Largura", "Medida", "32px"),
426
+ length("--ads-switch-height", "Altura", "Medida", "18px"),
427
+ length("--ads-switch-thumb", "Botão", "Medida", "12px"),
428
+ length("--ads-switch-inset", "Respiro", "Medida", "3px"),
429
+ length("--ads-switch-radius", "Raio", "Medida", "9px"),
430
+ length("--ads-switch-label-size", "Fonte do rótulo", "Medida", "14px"),
431
+ length("--ads-switch-gap", "Espaço", "Medida", "8px"),
432
+ color("--ads-switch-off", "Desligado", "Cores", "#c1c7d0"),
433
+ color("--ads-switch-on", "Ligado", "Cores", "#006ff7"),
434
+ color("--ads-switch-disabled", "Desabilitado", "Cores", "#e5e8eb"),
435
+ color("--ads-switch-disabled-on", "Ligado desabilitado", "Cores", "#89c9ff"),
436
+ color("--ads-switch-thumb-color", "Botão", "Cores", "#ffffff"),
437
+ color("--ads-switch-label", "Rótulo", "Cores", "#505f79"),
438
+ ],
439
+ },
440
+ {
441
+ id: "checkbox",
442
+ section: "checkbox",
443
+ label: "Checkbox",
444
+ fields: [
445
+ length("--ads-checkbox-size", "Tamanho", "Medida", "16px"),
446
+ length("--ads-checkbox-radius", "Raio", "Medida", "4px"),
447
+ length("--ads-checkbox-border-width", "Borda", "Medida", "2px"),
448
+ length("--ads-checkbox-label-size", "Fonte do rótulo", "Medida", "14px"),
449
+ length("--ads-checkbox-gap", "Espaço", "Medida", "8px"),
450
+ color("--ads-checkbox-border", "Borda", "Cores", "#006ff7"),
451
+ color("--ads-checkbox-checked", "Marcado", "Cores", "#006ff7"),
452
+ color("--ads-checkbox-disabled", "Desabilitado", "Cores", "#89c9ff"),
453
+ color("--ads-checkbox-background", "Fundo", "Cores", "#ffffff"),
454
+ color("--ads-checkbox-label", "Rótulo", "Cores", "#505f79"),
455
+ ],
456
+ },
457
+ {
458
+ id: "radio",
459
+ section: "radio",
460
+ label: "Radio",
461
+ fields: [
462
+ length("--ads-radio-size", "Tamanho", "Medida", "16px"),
463
+ length("--ads-radio-dot", "Miolo", "Medida", "8px"),
464
+ length("--ads-radio-border-width", "Borda", "Medida", "2px"),
465
+ length("--ads-radio-label-size", "Fonte do rótulo", "Medida", "14px"),
466
+ length("--ads-radio-gap", "Espaço", "Medida", "8px"),
467
+ color("--ads-radio-border", "Borda", "Cores", "#006ff7"),
468
+ color("--ads-radio-disabled", "Desabilitado", "Cores", "#89c9ff"),
469
+ color("--ads-radio-background", "Fundo", "Cores", "#ffffff"),
470
+ color("--ads-radio-dot-color", "Miolo", "Cores", "#ffffff"),
471
+ color("--ads-radio-label", "Rótulo", "Cores", "#505f79"),
472
+ ],
473
+ },
474
+ {
475
+ id: "modal",
476
+ section: "modal",
477
+ label: "Modal",
478
+ fields: [
479
+ length("--ads-modal-radius", "Raio", "Medida", "8px"),
480
+ length("--ads-modal-padding", "Padding", "Medida", "24px"),
481
+ length("--ads-modal-title-size", "Fonte do título", "Medida", "20px"),
482
+ length("--ads-modal-body-size", "Fonte do texto", "Medida", "14px"),
483
+ color("--ads-modal-background", "Fundo", "Cores", "#ffffff"),
484
+ color("--ads-modal-border", "Borda", "Cores", "#c1c7d0"),
485
+ color("--ads-modal-title", "Título", "Cores", "#061938"),
486
+ color("--ads-modal-body", "Texto", "Cores", "#505f79"),
487
+ ],
488
+ },
489
+ {
490
+ id: "feature",
491
+ section: "feature",
492
+ label: "Feature card",
493
+ fields: [
494
+ length("--ads-feature-width", "Largura", "Medida", "396px"),
495
+ length("--ads-feature-radius", "Raio", "Medida", "12px"),
496
+ length("--ads-feature-padding", "Padding", "Medida", "16px"),
497
+ length("--ads-feature-gap", "Espaço", "Medida", "16px"),
498
+ length("--ads-feature-icon-box", "Caixa do ícone", "Medida", "48px"),
499
+ length("--ads-feature-title-size", "Fonte do título", "Medida", "16px"),
500
+ length("--ads-feature-body-size", "Fonte do texto", "Medida", "14px"),
501
+ color("--ads-feature-border", "Borda", "Cores", "#e5e8eb"),
502
+ color("--ads-feature-background", "Fundo", "Cores", "#ffffff"),
503
+ color("--ads-feature-hover-border", "Borda no hover", "Cores", "#006ff7"),
504
+ color("--ads-feature-title", "Título", "Cores", "#061938"),
505
+ color("--ads-feature-body", "Texto", "Cores", "#505f79"),
506
+ ],
507
+ },
508
+ {
509
+ id: "card",
510
+ section: "card",
511
+ label: "Card",
512
+ fields: [
513
+ length("--ads-card-padding", "Padding", "Medida", "16px"),
514
+ length("--ads-card-radius", "Raio", "Medida", "12px"),
515
+ length("--ads-card-radius-sm", "Raio pequeno", "Medida", "8px"),
516
+ length("--ads-card-body-size", "Fonte do texto", "Medida", "14px"),
517
+ color("--ads-card-border", "Borda", "Cores", "#e5e8eb"),
518
+ color("--ads-card-background", "Fundo", "Cores", "#ffffff"),
519
+ color("--ads-card-selected-border", "Borda selecionada", "Cores", "#c1c7d0"),
520
+ color("--ads-card-selected-background", "Fundo selecionado", "Cores", "#f0f3f6"),
521
+ color("--ads-card-title", "Título", "Cores", "#061938"),
522
+ color("--ads-card-body", "Texto", "Cores", "#505f79"),
523
+ ],
524
+ },
525
+ {
526
+ id: "metric",
527
+ section: "metric",
528
+ label: "Métrica",
529
+ fields: [
530
+ length("--ads-metric-padding", "Padding", "Medida", "16px"),
531
+ length("--ads-metric-radius", "Raio", "Medida", "12px"),
532
+ length("--ads-metric-gap", "Espaço", "Medida", "8px"),
533
+ length("--ads-metric-label-size", "Fonte do rótulo", "Medida", "14px"),
534
+ length("--ads-metric-value-size", "Fonte do valor", "Medida", "20px"),
535
+ length("--ads-metric-caption-size", "Fonte da legenda", "Medida", "12px"),
536
+ color("--ads-metric-border", "Borda", "Cores", "#e5e8eb"),
537
+ color("--ads-metric-background", "Fundo", "Cores", "#ffffff"),
538
+ color("--ads-metric-label", "Rótulo", "Cores", "#505f79"),
539
+ color("--ads-metric-value", "Valor", "Cores", "#061938"),
540
+ ],
541
+ },
542
+ {
543
+ id: "menu",
544
+ section: "menu",
545
+ label: "Menu bar",
546
+ fields: [
547
+ length("--ads-menu-width", "Largura", "Medida", "100px"),
548
+ length("--ads-menu-padding-y", "Padding vertical", "Medida", "16px"),
549
+ length("--ads-menu-gap", "Espaço", "Medida", "16px"),
550
+ length("--ads-menu-icon", "Ícone", "Medida", "18px"),
551
+ length("--ads-menu-icon-box", "Caixa do ícone", "Medida", "40px"),
552
+ length("--ads-menu-label-size", "Fonte", "Medida", "12px"),
553
+ color("--ads-menu-divider", "Divisor", "Cores", "#e5e8eb"),
554
+ ],
555
+ },
556
+ {
557
+ id: "navbar-app",
558
+ section: "navbar-app",
559
+ label: "Navbar app",
560
+ fields: [
561
+ length("--ads-navbar-app-height", "Altura", "Medida", "88px"),
562
+ length("--ads-navbar-app-gap", "Espaço", "Medida", "33px"),
563
+ length("--ads-navbar-app-item-width", "Largura do item", "Medida", "39px"),
564
+ length("--ads-navbar-app-well", "Caixa do ícone", "Medida", "28px"),
565
+ length("--ads-navbar-app-font-size", "Fonte", "Medida", "10px"),
566
+ color("--ads-navbar-app-active", "Ativo", "Cores", "#344563"),
567
+ ],
568
+ },
569
+ {
570
+ id: "navbar-desk",
571
+ section: "navbar-desk",
572
+ label: "Navbar desk",
573
+ fields: [
574
+ length("--ads-navbar-desk-height", "Altura", "Medida", "64px"),
575
+ length("--ads-navbar-desk-padding-x", "Padding horizontal", "Medida", "44px"),
576
+ length("--ads-navbar-desk-action", "Botão", "Medida", "40px"),
577
+ length("--ads-navbar-desk-avatar", "Avatar", "Medida", "32px"),
578
+ color("--ads-navbar-desk-border", "Borda", "Cores", "#d3d8dd"),
579
+ ],
580
+ },
581
+ {
582
+ id: "side",
583
+ section: "menu-lateral",
584
+ label: "Menu lateral",
585
+ fields: [
586
+ length("--ads-side-width", "Largura", "Medida", "224px"),
587
+ length("--ads-side-row-height", "Altura da linha", "Medida", "48px"),
588
+ length("--ads-side-badge", "Badge", "Medida", "8px"),
589
+ color("--ads-side-border", "Borda", "Cores", "#c1c7d0"),
590
+ color("--ads-side-open-bg", "Mãe aberta", "Cores", "#e5e8eb"),
591
+ color("--ads-side-child-bg", "Filho", "Cores", "#f0f3f6"),
592
+ ],
593
+ },
594
+ {
595
+ id: "footer",
596
+ section: "footer",
597
+ label: "Footer",
598
+ fields: [
599
+ length("--ads-footer-min-height", "Altura mínima", "Medida", "32px"),
600
+ length("--ads-footer-logo-height", "Logo", "Medida", "12px"),
601
+ color("--ads-footer-text", "Texto", "Cores", "#7a869a"),
602
+ ],
603
+ },
604
+ {
605
+ id: "product-tag",
606
+ section: "product-tag",
607
+ label: "Tag de produto",
608
+ fields: [
609
+ length("--ads-product-tag-height", "Altura", "Medida", "16px"),
610
+ length("--ads-product-tag-font-size", "Fonte", "Medida", "11px"),
611
+ ],
612
+ },
613
+ {
614
+ id: "button-group",
615
+ section: "grupo",
616
+ label: "Grupo de botões",
617
+ fields: [
618
+ length("--ads-button-group-height", "Altura", "Medida", "30px"),
619
+ length("--ads-button-group-font-size", "Fonte", "Medida", "12px"),
620
+ color("--ads-button-group-border", "Borda", "Cores", "#c1c7d0"),
621
+ color("--ads-button-group-selected", "Selecionado", "Cores", "#e5e8eb"),
622
+ ],
623
+ },
624
+ {
625
+ id: "button-menu",
626
+ section: "menu-botao",
627
+ label: "Menu do botão",
628
+ fields: [
629
+ length("--ads-button-menu-width", "Largura", "Medida", "264px"),
630
+ length("--ads-button-menu-title-size", "Fonte do título", "Medida", "16px"),
631
+ length("--ads-button-menu-subtitle-size", "Fonte do subtítulo", "Medida", "12px"),
632
+ color("--ads-button-menu-title", "Título", "Cores", "#42526e"),
633
+ color("--ads-button-menu-subtitle", "Subtítulo", "Cores", "#5e6c84"),
634
+ color("--ads-button-menu-border", "Borda", "Cores", "#c1c7d0"),
635
+ ],
636
+ },
637
+ {
638
+ id: "list",
639
+ section: "lista",
640
+ label: "Lista",
641
+ fields: [length("--ads-list-min-width", "Largura mínima", "Medida", "260px")],
642
+ },
643
+ {
644
+ id: "pagination",
645
+ section: "paginacao",
646
+ label: "Paginação",
647
+ fields: [
648
+ length("--ads-pagination-cell", "Célula", "Medida", "24px"),
649
+ length("--ads-pagination-gap", "Espaço", "Medida", "12px"),
650
+ length("--ads-pagination-number-gap", "Espaço dos números", "Medida", "4px"),
651
+ color("--ads-pagination-selected", "Selecionada", "Cores", "#006ff7"),
652
+ color("--ads-pagination-number", "Número", "Cores", "#344563"),
653
+ ],
654
+ },
655
+ {
656
+ id: "empty",
657
+ section: "vazio",
658
+ label: "Empty state",
659
+ fields: [
660
+ length("--ads-empty-icon", "Ícone", "Medida", "90px"),
661
+ length("--ads-empty-icon-sm", "Ícone pequeno", "Medida", "60px"),
662
+ length("--ads-empty-title-size", "Fonte do título", "Medida", "18px"),
663
+ length("--ads-empty-title-size-sm", "Fonte do título pequeno", "Medida", "16px"),
664
+ length("--ads-empty-subtitle-size", "Fonte do apoio", "Medida", "12px"),
665
+ length("--ads-empty-gap", "Espaço", "Medida", "24px"),
666
+ length("--ads-empty-gap-sm", "Espaço pequeno", "Medida", "32px"),
667
+ length("--ads-empty-text-gap", "Espaço do texto", "Medida", "32px"),
668
+ color("--ads-empty-icon-color", "Ícone", "Cores", "#c1c7d0"),
669
+ ],
670
+ },
671
+ {
672
+ id: "funcional",
673
+ section: "funcional",
674
+ label: "Funcional",
675
+ note: "Cores do arquivo de componentes sem degrau na escala publicada. O badge do menu lateral usa opportunity 200. A borda de erro do filtro repete warning 200.",
676
+ fields: [
677
+ color("--ads-funcional-warning-200", "Warning 200", "Cores", "#ff6783"),
678
+ color("--ads-funcional-opportunity-200", "Opportunity 200", "Cores", "#0ebbda"),
679
+ ],
680
+ },
681
+ {
682
+ id: "farmarcas",
683
+ section: "farmarcas",
684
+ label: "Farmarcas",
685
+ note: "Cada departamento tem fundo e texto. Não há token semântico equivalente.",
686
+ fields: [
687
+ length("--ads-farmarcas-height", "Altura", "Medida", "24px"),
688
+ length("--ads-farmarcas-min-width", "Largura mínima", "Medida", "100px"),
689
+ length("--ads-farmarcas-font-size", "Fonte", "Medida", "12px"),
690
+ color("--ads-farmarcas-expansao-bg", "Fundo", "Expansão", "#d8bbd8"),
691
+ color("--ads-farmarcas-expansao-text", "Texto", "Expansão", "#700e84"),
692
+ color("--ads-farmarcas-eventos-bg", "Fundo", "Eventos", "#fce083"),
693
+ color("--ads-farmarcas-eventos-text", "Texto", "Eventos", "#bb6a00"),
694
+ color("--ads-farmarcas-adm-digital-bg", "Fundo", "ADM digital", "#eef2c1"),
695
+ color("--ads-farmarcas-adm-digital-text", "Texto", "ADM digital", "#555931"),
696
+ color("--ads-farmarcas-sucesso-bg", "Fundo", "Sucesso", "#e4f3c1"),
697
+ color("--ads-farmarcas-sucesso-text", "Texto", "Sucesso", "#6b7300"),
698
+ color("--ads-farmarcas-trade-bg", "Fundo", "Trade", "#b3cfe4"),
699
+ color("--ads-farmarcas-trade-text", "Texto", "Trade", "#194464"),
700
+ color("--ads-farmarcas-dev-bg", "Fundo", "Dev", "#ffbbe4"),
701
+ color("--ads-farmarcas-dev-text", "Texto", "Dev", "#8b2d65"),
702
+ color("--ads-farmarcas-ti-bg", "Fundo", "TI", "#d2c5ee"),
703
+ color("--ads-farmarcas-ti-text", "Texto", "TI", "#2b209c"),
704
+ color("--ads-farmarcas-padronizacao-bg", "Fundo", "Padronização", "#c4cdea"),
705
+ color("--ads-farmarcas-padronizacao-text", "Texto", "Padronização", "#062c80"),
706
+ color("--ads-farmarcas-diretoria-bg", "Fundo", "Diretoria", "#c9c9c9"),
707
+ color("--ads-farmarcas-diretoria-text", "Texto", "Diretoria", "#000000"),
708
+ color("--ads-farmarcas-comercial-bg", "Fundo", "Comercial", "#c0c7d9"),
709
+ color("--ads-farmarcas-comercial-text", "Texto", "Comercial", "#18224b"),
710
+ color("--ads-farmarcas-inovacao-bg", "Fundo", "Inovação", "#b6bdff"),
711
+ color("--ads-farmarcas-inovacao-text", "Texto", "Inovação", "#393f73"),
712
+ color("--ads-farmarcas-patrimonio-bg", "Fundo", "Patrimônio", "#d9b6c5"),
713
+ color("--ads-farmarcas-patrimonio-text", "Texto", "Patrimônio", "#7f3454"),
714
+ color("--ads-farmarcas-presidencia-bg", "Fundo", "Presidência", "#c9c9c9"),
715
+ color("--ads-farmarcas-presidencia-text", "Texto", "Presidência", "#000000"),
716
+ color("--ads-farmarcas-marketing-bg", "Fundo", "Marketing", "#b2e9e8"),
717
+ color("--ads-farmarcas-marketing-text", "Texto", "Marketing", "#1b5955"),
718
+ color("--ads-farmarcas-gg-bg", "Fundo", "G&G", "#ffdfb5"),
719
+ color("--ads-farmarcas-gg-text", "Texto", "G&G", "#e0521f"),
720
+ color("--ads-farmarcas-bi-bg", "Fundo", "BI", "#f8c09f"),
721
+ color("--ads-farmarcas-bi-text", "Texto", "BI", "#4e1400"),
722
+ color("--ads-farmarcas-financeiro-bg", "Fundo", "Financeiro", "#c5ddc3"),
723
+ color("--ads-farmarcas-financeiro-text", "Texto", "Financeiro", "#05750a"),
724
+ color("--ads-farmarcas-juridico-bg", "Fundo", "Jurídico", "#d9d8c0"),
725
+ color("--ads-farmarcas-juridico-text", "Texto", "Jurídico", "#464535"),
726
+ color("--ads-farmarcas-capacitacao-bg", "Fundo", "Capacitação", "#e5c1fe"),
727
+ color("--ads-farmarcas-capacitacao-text", "Texto", "Capacitação", "#360ea7"),
728
+ color("--ads-farmarcas-produto-bg", "Fundo", "produto", "#f0ed9a"),
729
+ color("--ads-farmarcas-produto-text", "Texto", "produto", "#655200"),
730
+ ],
731
+ },
732
+ ];
733
+
734
+ export const allTokenFields = () => componentTokenCatalog.flatMap((component) => component.fields);
735
+
736
+ export const componentTokenDefaults = (): Record<string, string> =>
737
+ Object.fromEntries(allTokenFields().map((field) => [field.name, field.fallback]));
738
+
739
+ export const tokenGroups = (component: TokenComponent) => {
740
+ const groups: { label: string; fields: TokenField[] }[] = [];
741
+ for (const field of component.fields) {
742
+ const current = groups.find((group) => group.label === field.group);
743
+ if (current) current.fields.push(field);
744
+ else groups.push({ label: field.group, fields: [field] });
745
+ }
746
+ return groups;
747
+ };
748
+
749
+ const lengthPattern = /^(?:\d{1,4})(?:\.\d+)?(?:px|rem)$/;
750
+ const colorPattern = /^#[0-9a-f]{6}$/;
751
+ const weightPattern = /^(?:300|400|500|700|800)$/;
752
+
753
+ export const tokenValueValid = (kind: TokenKind, value: string) => {
754
+ if (kind === "color") return colorPattern.test(value);
755
+ if (kind === "length") return lengthPattern.test(value);
756
+ if (kind === "weight") return weightPattern.test(value);
757
+ if (!/^\d(?:\.\d{1,3})?$/.test(value)) return false;
758
+ const line = Number(value);
759
+ return line >= 1 && line <= 2;
760
+ };
761
+
762
+ const normalizeValue = (field: TokenField, value: string) =>
763
+ field.kind === "color" ? value.toLowerCase() : value;
764
+
765
+ export const normalizeStoredTokens = (input: unknown): Record<string, string> => {
766
+ const tokens = componentTokenDefaults();
767
+ if (!input || typeof input !== "object" || Array.isArray(input)) return tokens;
768
+ const record = input as Record<string, unknown>;
769
+ for (const field of allTokenFields()) {
770
+ const value = record[field.name];
771
+ if (typeof value !== "string") continue;
772
+ const normalized = normalizeValue(field, value.trim());
773
+ if (tokenValueValid(field.kind, normalized)) tokens[field.name] = normalized;
774
+ }
775
+ return tokens;
776
+ };
777
+
778
+ export const assertComponentTokens = (input: unknown): Record<string, string> => {
779
+ if (!input || typeof input !== "object" || Array.isArray(input)) {
780
+ throw new Error("O corpo precisa ser o mapa de tokens.");
781
+ }
782
+ const record = input as Record<string, unknown>;
783
+ const tokens: Record<string, string> = {};
784
+ const invalid: string[] = [];
785
+ for (const field of allTokenFields()) {
786
+ const value = record[field.name];
787
+ if (typeof value !== "string") {
788
+ invalid.push(field.label);
789
+ continue;
790
+ }
791
+ const normalized = normalizeValue(field, value.trim());
792
+ if (!tokenValueValid(field.kind, normalized)) {
793
+ invalid.push(field.label);
794
+ continue;
795
+ }
796
+ tokens[field.name] = normalized;
797
+ }
798
+ if (invalid.length) {
799
+ throw new Error(`Valores inválidos: ${invalid.join(", ")}.`);
800
+ }
801
+ return tokens;
802
+ };
803
+
804
+ export const componentTokensCss = (tokens: Record<string, string>) => {
805
+ const lines = allTokenFields().map((field) => ` ${field.name}: ${tokens[field.name]};`);
806
+ return [
807
+ "/* Gerado pela tela /design-system/tokens. Fonte: app/theme/component-tokens.json */",
808
+ ":root {",
809
+ ...lines,
810
+ "}",
811
+ "",
812
+ ].join("\n");
813
+ };
814
+
815
+ export const PREVIEW_STYLE_ID = "ads-component-token-preview";