ds-tis 1.0.0-beta.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (79) hide show
  1. package/LICENSE +49 -0
  2. package/README.md +125 -0
  3. package/css/base/forced-colors.css +62 -0
  4. package/css/base/icons.css +73 -0
  5. package/css/base/index.css +4 -0
  6. package/css/base/reset.css +80 -0
  7. package/css/base/typography.css +211 -0
  8. package/css/components/accordion.css +153 -0
  9. package/css/components/alert.css +161 -0
  10. package/css/components/avatar.css +76 -0
  11. package/css/components/badge.css +83 -0
  12. package/css/components/breadcrumb.css +58 -0
  13. package/css/components/button.css +364 -0
  14. package/css/components/card.css +159 -0
  15. package/css/components/checkbox.css +296 -0
  16. package/css/components/combobox.css +330 -0
  17. package/css/components/divider.css +20 -0
  18. package/css/components/form-field.css +137 -0
  19. package/css/components/index.css +28 -0
  20. package/css/components/input.css +356 -0
  21. package/css/components/link.css +67 -0
  22. package/css/components/menu.css +246 -0
  23. package/css/components/modal.css +236 -0
  24. package/css/components/pagination.css +132 -0
  25. package/css/components/radio.css +280 -0
  26. package/css/components/select.css +399 -0
  27. package/css/components/skeleton.css +52 -0
  28. package/css/components/spinner.css +59 -0
  29. package/css/components/tabs.css +79 -0
  30. package/css/components/textarea.css +218 -0
  31. package/css/components/toggle.css +202 -0
  32. package/css/components/tooltip.css +116 -0
  33. package/css/design-system.css +13 -0
  34. package/css/tokens/generated/component.css +720 -0
  35. package/css/tokens/generated/foundation.css +282 -0
  36. package/css/tokens/generated/index.css +5 -0
  37. package/css/tokens/generated/theme-dark.css +243 -0
  38. package/css/tokens/generated/theme-light.css +244 -0
  39. package/css/tokens/index.css +6 -0
  40. package/css/utilities/elevation.css +24 -0
  41. package/css/utilities/index.css +2 -0
  42. package/css/utilities/layout.css +132 -0
  43. package/docs/agent-consumer-usage.en.md +322 -0
  44. package/docs/agent-consumer-usage.md +294 -0
  45. package/docs/api/adrs.json +186 -0
  46. package/docs/api/components.json +2071 -0
  47. package/docs/api/consumer-context.json +66 -0
  48. package/docs/api/foundations.json +94 -0
  49. package/docs/api/tokens.json +6839 -0
  50. package/docs/llms-full.txt +23699 -0
  51. package/docs/llms.txt +109 -0
  52. package/docs/templates/contact.html +364 -0
  53. package/docs/templates/dashboard.html +318 -0
  54. package/docs/templates/index.html +232 -0
  55. package/docs/templates/login.html +286 -0
  56. package/docs/templates/settings.html +365 -0
  57. package/docs/templates/signup.html +350 -0
  58. package/js/accordion.js +192 -0
  59. package/js/combobox.js +263 -0
  60. package/js/menu.js +301 -0
  61. package/js/modal.js +256 -0
  62. package/js/package.json +3 -0
  63. package/js/tabs.js +200 -0
  64. package/js/theme/apply.js +75 -0
  65. package/js/theme/brand-contrast-audit.js +133 -0
  66. package/js/theme/color.js +149 -0
  67. package/js/theme/config-schema.js +40 -0
  68. package/js/theme/contrast.js +76 -0
  69. package/js/theme/export.js +118 -0
  70. package/js/theme/index.js +21 -0
  71. package/js/theme/overlay.js +29 -0
  72. package/js/theme/package.json +3 -0
  73. package/js/theme/palette.js +103 -0
  74. package/js/theme/radius.js +76 -0
  75. package/js/theme/semantic-mapper.js +138 -0
  76. package/js/theme/typography.js +33 -0
  77. package/js/theme/url-state.js +52 -0
  78. package/js/tooltip.js +227 -0
  79. package/package.json +139 -0
@@ -0,0 +1,296 @@
1
+ /* ============================================================
2
+ COMPONENT: Checkbox
3
+ ============================================================ */
4
+
5
+ /* Item wrapper — agrupa checkbox label + description + helper text
6
+ verticalmente. Use quando precisar de Description/Helper opt-in
7
+ (matches Figma "Show Description"/"Show Helper Text" booleans). */
8
+ .ds-checkbox-item {
9
+ display: flex;
10
+ flex-direction: column;
11
+ gap: var(--ds-checkbox-content-gap-default);
12
+ }
13
+
14
+ /* Description text — abaixo do label, mesmo size, regular weight (Figma) */
15
+ .ds-checkbox-description {
16
+ font-size: var(--ds-body-font-size-sm);
17
+ font-weight: var(--ds-body-font-weight-regular);
18
+ line-height: var(--ds-body-line-height-sm);
19
+ color: var(--ds-form-field-description-color-default);
20
+ /* indent pra alinhar com label, passando o checkbox + gap */
21
+ padding-left: calc(var(--ds-size-sm) + var(--ds-space-sm) + var(--ds-space-xs));
22
+ }
23
+
24
+ /* Helper text — menor + mais sutil que description (Figma) */
25
+ .ds-checkbox-helper {
26
+ font-size: var(--ds-body-font-size-xs);
27
+ font-weight: var(--ds-body-font-weight-regular);
28
+ line-height: var(--ds-body-line-height-xs);
29
+ color: var(--ds-form-field-helper-color-default);
30
+ padding-left: calc(var(--ds-size-sm) + var(--ds-space-sm) + var(--ds-space-xs));
31
+ }
32
+
33
+ /* Checkbox label wrapper */
34
+ .ds-checkbox-label {
35
+ --checkbox-target-height: var(--ds-checkbox-target-height-md);
36
+ --checkbox-box-size: var(--ds-checkbox-box-size-md);
37
+
38
+ display: inline-flex;
39
+ align-items: center;
40
+ gap: var(--ds-checkbox-target-gap-default);
41
+ cursor: pointer;
42
+ padding: var(--ds-space-xs) var(--ds-space-xs);
43
+ min-height: var(--checkbox-target-height);
44
+ font-size: var(--ds-form-field-label-font-size-default);
45
+ color: var(--ds-form-field-label-color-default);
46
+ }
47
+
48
+ /* Custom checkbox */
49
+ .ds-checkbox {
50
+ appearance: none;
51
+ -webkit-appearance: none;
52
+ width: var(--checkbox-box-size);
53
+ height: var(--checkbox-box-size);
54
+ border: var(--ds-checkbox-box-border-width-default) solid var(--ds-checkbox-box-border-color-unchecked-default);
55
+ border-radius: var(--ds-checkbox-box-radius-default);
56
+ background-color: var(--ds-checkbox-box-fill-unchecked-default);
57
+ cursor: pointer;
58
+ position: relative;
59
+ flex-shrink: 0;
60
+ transition: border-color var(--ds-motion-duration-fast) var(--ds-motion-ease-default),
61
+ background-color var(--ds-motion-duration-fast) var(--ds-motion-ease-default);
62
+ }
63
+
64
+ /* Checkmark (checked state) */
65
+ .ds-checkbox::after {
66
+ content: '';
67
+ position: absolute;
68
+ top: 50%;
69
+ left: 50%;
70
+ width: var(--checkbox-box-size);
71
+ height: var(--checkbox-box-size);
72
+ background-color: var(--ds-checkbox-mark-fill-checked-default);
73
+ -webkit-mask: url("data:image/svg+xml,%3Csvg viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M7.72408 12.4323L13.8699 6.28643C14.0609 6.09546 14.3039 5.99997 14.5991 5.99997C14.8942 5.99997 15.1373 6.09546 15.3282 6.28643C15.5192 6.47741 15.6147 6.72046 15.6147 7.0156C15.6147 7.31074 15.5192 7.55379 15.3282 7.74477L8.45325 14.6198C8.24491 14.8281 8.00186 14.9323 7.72408 14.9323C7.4463 14.9323 7.20325 14.8281 6.99491 14.6198L4.28658 11.9114C4.09561 11.7205 4.00012 11.4774 4.00012 11.1823C4.00012 10.8871 4.09561 10.6441 4.28658 10.4531C4.47755 10.2621 4.72061 10.1666 5.01575 10.1666C5.31089 10.1666 5.55394 10.2621 5.74491 10.4531L7.72408 12.4323Z'/%3E%3C/svg%3E") center / 100% 100% no-repeat;
74
+ mask: url("data:image/svg+xml,%3Csvg viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M7.72408 12.4323L13.8699 6.28643C14.0609 6.09546 14.3039 5.99997 14.5991 5.99997C14.8942 5.99997 15.1373 6.09546 15.3282 6.28643C15.5192 6.47741 15.6147 6.72046 15.6147 7.0156C15.6147 7.31074 15.5192 7.55379 15.3282 7.74477L8.45325 14.6198C8.24491 14.8281 8.00186 14.9323 7.72408 14.9323C7.4463 14.9323 7.20325 14.8281 6.99491 14.6198L4.28658 11.9114C4.09561 11.7205 4.00012 11.4774 4.00012 11.1823C4.00012 10.8871 4.09561 10.6441 4.28658 10.4531C4.47755 10.2621 4.72061 10.1666 5.01575 10.1666C5.31089 10.1666 5.55394 10.2621 5.74491 10.4531L7.72408 12.4323Z'/%3E%3C/svg%3E") center / 100% 100% no-repeat;
75
+ transform: translate(-50%, -50%) scale(0);
76
+ transition: transform var(--ds-motion-duration-fast) var(--ds-motion-ease-default);
77
+ }
78
+
79
+ /* Checked */
80
+ .ds-checkbox:checked {
81
+ background-color: var(--ds-checkbox-box-fill-checked-default);
82
+ border-width: 0;
83
+ }
84
+
85
+ .ds-checkbox:checked::after {
86
+ transform: translate(-50%, -50%) scale(1);
87
+ }
88
+
89
+ /* Indeterminate */
90
+ .ds-checkbox:indeterminate {
91
+ background-color: var(--ds-checkbox-box-fill-indeterminate-default);
92
+ border-width: 0;
93
+ }
94
+
95
+ .ds-checkbox:indeterminate::after {
96
+ top: 50%;
97
+ left: 50%;
98
+ width: calc(var(--ds-checkbox-box-size-md) * 0.625);
99
+ height: max(var(--ds-space-hairline), calc(var(--ds-checkbox-box-size-md) * 0.125));
100
+ background-color: var(--ds-checkbox-mark-fill-indeterminate-default);
101
+ -webkit-mask: none;
102
+ mask: none;
103
+ transform: translate(-50%, -50%) scale(1);
104
+ border-radius: var(--ds-space-hairline);
105
+ }
106
+
107
+ /* Hover */
108
+ .ds-checkbox:hover:not(:disabled) {
109
+ background-color: var(--ds-checkbox-box-fill-unchecked-hover);
110
+ border-color: var(--ds-checkbox-box-border-color-unchecked-hover);
111
+ }
112
+
113
+ .ds-checkbox:checked:hover:not(:disabled) {
114
+ background-color: var(--ds-checkbox-box-fill-checked-hover);
115
+ }
116
+
117
+ .ds-checkbox:checked:hover:not(:disabled)::after {
118
+ background-color: var(--ds-checkbox-mark-fill-checked-hover);
119
+ }
120
+
121
+ .ds-checkbox:indeterminate:hover:not(:disabled) {
122
+ background-color: var(--ds-checkbox-box-fill-indeterminate-hover);
123
+ }
124
+
125
+ .ds-checkbox:indeterminate:hover:not(:disabled)::after {
126
+ background-color: var(--ds-checkbox-mark-fill-indeterminate-hover);
127
+ }
128
+
129
+ /* Focus */
130
+ .ds-checkbox:focus-visible {
131
+ outline: var(--ds-focus-ring-width) solid var(--ds-focus-ring-color-default);
132
+ outline-offset: var(--ds-focus-ring-width);
133
+ }
134
+
135
+ /* Disabled */
136
+ .ds-checkbox:disabled {
137
+ background-color: var(--ds-checkbox-box-fill-unchecked-disabled);
138
+ border-color: var(--ds-checkbox-box-border-color-unchecked-disabled);
139
+ cursor: not-allowed;
140
+ }
141
+
142
+ .ds-checkbox:checked:disabled {
143
+ background-color: var(--ds-checkbox-box-fill-checked-disabled);
144
+ border-width: 0;
145
+ }
146
+
147
+ .ds-checkbox:checked:disabled::after {
148
+ background-color: var(--ds-checkbox-mark-fill-checked-disabled);
149
+ }
150
+
151
+ .ds-checkbox:indeterminate:disabled {
152
+ background-color: var(--ds-checkbox-box-fill-indeterminate-disabled);
153
+ border-width: 0;
154
+ }
155
+
156
+ .ds-checkbox:indeterminate:disabled::after {
157
+ background-color: var(--ds-checkbox-mark-fill-indeterminate-disabled);
158
+ }
159
+
160
+ .ds-checkbox-label:has(.ds-checkbox:disabled) {
161
+ cursor: not-allowed;
162
+ color: var(--ds-form-field-label-color-disabled);
163
+ }
164
+
165
+ /* Error state */
166
+ .ds-checkbox-group--error .ds-checkbox {
167
+ border-color: var(--ds-checkbox-box-border-color-unchecked-error);
168
+ }
169
+
170
+ .ds-checkbox-group__error {
171
+ font-size: var(--ds-form-field-error-font-size-default);
172
+ font-weight: var(--ds-form-field-error-font-weight-default);
173
+ line-height: var(--ds-form-field-error-line-height-default);
174
+ color: var(--ds-form-field-error-color-default);
175
+ margin-top: var(--ds-space-xs);
176
+ display: none;
177
+ }
178
+
179
+ .ds-checkbox-group--error .ds-checkbox-group__error {
180
+ display: block;
181
+ }
182
+
183
+ /* ---------------------------------------------------------
184
+ Sizes
185
+ --------------------------------------------------------- */
186
+
187
+ /* Small */
188
+ .ds-checkbox-label:has(.ds-checkbox--sm) {
189
+ --checkbox-target-height: var(--ds-checkbox-target-height-sm);
190
+ --checkbox-box-size: var(--ds-checkbox-box-size-sm);
191
+ }
192
+
193
+ .ds-checkbox--sm {
194
+ width: var(--ds-checkbox-box-size-sm);
195
+ height: var(--ds-checkbox-box-size-sm);
196
+ }
197
+
198
+ .ds-checkbox--sm::after {
199
+ -webkit-mask-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 16 16' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M6.17926 9.94581L11.0959 5.02914C11.2487 4.87636 11.4432 4.79998 11.6793 4.79998C11.9154 4.79998 12.1098 4.87636 12.2626 5.02914C12.4154 5.18192 12.4918 5.37636 12.4918 5.61248C12.4918 5.84859 12.4154 6.04303 12.2626 6.19581L6.7626 11.6958C6.59593 11.8625 6.40149 11.9458 6.17926 11.9458C5.95704 11.9458 5.7626 11.8625 5.59593 11.6958L3.42926 9.52914C3.27649 9.37636 3.2001 9.18192 3.2001 8.94581C3.2001 8.7097 3.27649 8.51525 3.42926 8.36248C3.58204 8.2097 3.77649 8.13331 4.0126 8.13331C4.24871 8.13331 4.44315 8.2097 4.59593 8.36248L6.17926 9.94581Z'/%3E%3C/svg%3E");
200
+ mask-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 16 16' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M6.17926 9.94581L11.0959 5.02914C11.2487 4.87636 11.4432 4.79998 11.6793 4.79998C11.9154 4.79998 12.1098 4.87636 12.2626 5.02914C12.4154 5.18192 12.4918 5.37636 12.4918 5.61248C12.4918 5.84859 12.4154 6.04303 12.2626 6.19581L6.7626 11.6958C6.59593 11.8625 6.40149 11.9458 6.17926 11.9458C5.95704 11.9458 5.7626 11.8625 5.59593 11.6958L3.42926 9.52914C3.27649 9.37636 3.2001 9.18192 3.2001 8.94581C3.2001 8.7097 3.27649 8.51525 3.42926 8.36248C3.58204 8.2097 3.77649 8.13331 4.0126 8.13331C4.24871 8.13331 4.44315 8.2097 4.59593 8.36248L6.17926 9.94581Z'/%3E%3C/svg%3E");
201
+ }
202
+
203
+ .ds-checkbox--sm:indeterminate::after {
204
+ width: calc(var(--ds-checkbox-box-size-sm) * 0.5);
205
+ height: calc(var(--ds-checkbox-box-size-sm) * 0.09375);
206
+ }
207
+
208
+ /* Large */
209
+ .ds-checkbox-label:has(.ds-checkbox--lg) {
210
+ --checkbox-target-height: var(--ds-checkbox-target-height-lg);
211
+ --checkbox-box-size: var(--ds-checkbox-box-size-lg);
212
+ }
213
+
214
+ .ds-checkbox--lg {
215
+ width: var(--ds-checkbox-box-size-lg);
216
+ height: var(--ds-checkbox-box-size-lg);
217
+ }
218
+
219
+ .ds-checkbox--lg::after {
220
+ -webkit-mask-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M9.2689 14.9188L16.6439 7.54375C16.8731 7.31458 17.1647 7.2 17.5189 7.2C17.8731 7.2 18.1647 7.31458 18.3939 7.54375C18.6231 7.77292 18.7376 8.06458 18.7376 8.41875C18.7376 8.77292 18.6231 9.06458 18.3939 9.29375L10.1439 17.5438C9.8939 17.7938 9.60223 17.9187 9.2689 17.9187C8.93556 17.9187 8.6439 17.7938 8.3939 17.5438L5.1439 14.2938C4.91473 14.0646 4.80015 13.7729 4.80015 13.4187C4.80015 13.0646 4.91473 12.7729 5.1439 12.5437C5.37306 12.3146 5.66473 12.2 6.0189 12.2C6.37306 12.2 6.66473 12.3146 6.8939 12.5437L9.2689 14.9188Z'/%3E%3C/svg%3E");
221
+ mask-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M9.2689 14.9188L16.6439 7.54375C16.8731 7.31458 17.1647 7.2 17.5189 7.2C17.8731 7.2 18.1647 7.31458 18.3939 7.54375C18.6231 7.77292 18.7376 8.06458 18.7376 8.41875C18.7376 8.77292 18.6231 9.06458 18.3939 9.29375L10.1439 17.5438C9.8939 17.7938 9.60223 17.9187 9.2689 17.9187C8.93556 17.9187 8.6439 17.7938 8.3939 17.5438L5.1439 14.2938C4.91473 14.0646 4.80015 13.7729 4.80015 13.4187C4.80015 13.0646 4.91473 12.7729 5.1439 12.5437C5.37306 12.3146 5.66473 12.2 6.0189 12.2C6.37306 12.2 6.66473 12.3146 6.8939 12.5437L9.2689 14.9188Z'/%3E%3C/svg%3E");
222
+ }
223
+
224
+ .ds-checkbox--lg:indeterminate::after {
225
+ width: calc(var(--ds-checkbox-box-size-lg) * 0.5);
226
+ height: calc(var(--ds-checkbox-box-size-lg) * 0.1041666667);
227
+ }
228
+
229
+ /* ---------------------------------------------------------
230
+ Field anatomy — Content frame, Description, Helper Text
231
+ --------------------------------------------------------- */
232
+
233
+ /*
234
+ HTML structure:
235
+ <label class="ds-checkbox-label">
236
+ <input type="checkbox" class="ds-checkbox">
237
+ <span class="ds-checkbox__content">
238
+ <span class="ds-checkbox__label">Rótulo</span> <!-- Show Label boolean -->
239
+ <span class="ds-checkbox__description">Descrição</span> <!-- Show Description boolean -->
240
+ <span class="ds-checkbox__helper">Texto auxiliar</span> <!-- Show Helper Text boolean -->
241
+ </span>
242
+ </label>
243
+
244
+ Accessibility:
245
+ - Label hidden + Description visible → add id to .ds-checkbox__description
246
+ and aria-labelledby="[id]" to <input>
247
+ - Both hidden → add explicit aria-label to <input>
248
+ - Helper Text → add id to .ds-checkbox__helper and aria-describedby="[id]" to <input>
249
+ */
250
+
251
+ /* Vertical stack: Label → Description → Helper Text */
252
+ .ds-checkbox__content {
253
+ display: flex;
254
+ flex-direction: column;
255
+ gap: var(--ds-checkbox-content-gap-default);
256
+ min-width: 0;
257
+ }
258
+
259
+ /* Label text (label/md: 14px medium / 20px) */
260
+ .ds-checkbox__label {
261
+ font-family: var(--ds-form-field-label-font-family-default);
262
+ font-size: var(--ds-form-field-label-font-size-default);
263
+ font-weight: var(--ds-body-font-weight-bold);
264
+ line-height: var(--ds-form-field-label-line-height-default);
265
+ color: var(--ds-form-field-label-color-default);
266
+ }
267
+
268
+ /* Description (body/sm: 14px regular / 20px) */
269
+ .ds-checkbox__description {
270
+ font-size: var(--ds-body-font-size-sm);
271
+ font-weight: var(--ds-body-font-weight-regular);
272
+ line-height: var(--ds-body-line-height-sm);
273
+ color: var(--ds-form-field-description-color-default);
274
+ white-space: pre-wrap;
275
+ }
276
+
277
+ /* Helper text (caption/sm: 11px regular / 18px) */
278
+ .ds-checkbox__helper {
279
+ font-size: var(--ds-body-font-size-xs);
280
+ font-weight: var(--ds-body-font-weight-regular);
281
+ line-height: var(--ds-body-line-height-xs);
282
+ color: var(--ds-form-field-helper-color-default);
283
+ }
284
+
285
+ .ds-checkbox-label:has(.ds-checkbox:disabled) .ds-checkbox__label {
286
+ color: var(--ds-form-field-label-color-disabled);
287
+ }
288
+
289
+ /* ---------------------------------------------------------
290
+ Reduced motion
291
+ --------------------------------------------------------- */
292
+ @media (prefers-reduced-motion: reduce) {
293
+ .ds-checkbox-label,
294
+ .ds-checkbox,
295
+ .ds-checkbox::after { transition: none; }
296
+ }
@@ -0,0 +1,330 @@
1
+ /* ==========================================================================
2
+ Combobox — .ds-combobox
3
+ Form control editável com listbox popup. Sizes: sm=32px, md=40px, lg=48px
4
+ Field gap/text/icon: tokens Select (anatomia compartilhada, ADR-019).
5
+ ========================================================================== */
6
+
7
+ .ds-combobox {
8
+ --combobox-padding-x: var(--ds-combobox-padding-x-md);
9
+ --combobox-padding-y: var(--ds-field-padding-y-md);
10
+ --combobox-gap: var(--ds-select-gap-md);
11
+ --combobox-icon-frame-size: var(--ds-select-icon-size-md);
12
+ --combobox-border-width: var(--ds-field-border-width);
13
+
14
+ position: relative;
15
+ display: flex;
16
+ align-items: center;
17
+ gap: var(--ds-select-gap-md);
18
+ box-sizing: border-box;
19
+ height: var(--ds-combobox-height-md);
20
+ padding: var(--ds-field-padding-y-md) var(--ds-combobox-padding-x-md);
21
+ border: var(--ds-field-border-width) solid var(--ds-field-border-color-default);
22
+ border-radius: var(--ds-field-radius);
23
+ background: var(--ds-field-bg-default);
24
+ color: var(--ds-field-value-color-default);
25
+ font-family: var(--ds-select-text-font-family-default);
26
+ font-size: var(--ds-select-text-font-size-md);
27
+ font-weight: var(--ds-select-text-font-weight-default);
28
+ letter-spacing: var(--ds-select-text-letter-spacing-default);
29
+ line-height: var(--ds-select-text-line-height-md);
30
+ transition:
31
+ border-color var(--ds-motion-duration-fast) var(--ds-motion-ease-default),
32
+ box-shadow var(--ds-motion-duration-fast) var(--ds-motion-ease-default);
33
+ }
34
+
35
+ .ds-combobox,
36
+ .ds-combobox--md {
37
+ height: var(--ds-combobox-height-md);
38
+ gap: var(--ds-select-gap-md);
39
+ padding: var(--ds-field-padding-y-md) var(--ds-combobox-padding-x-md);
40
+ font-size: var(--ds-select-text-font-size-md);
41
+ line-height: var(--ds-select-text-line-height-md);
42
+ }
43
+
44
+ .ds-combobox--sm {
45
+ --combobox-padding-x: var(--ds-combobox-padding-x-sm);
46
+ --combobox-padding-y: var(--ds-field-padding-y-sm);
47
+ --combobox-gap: var(--ds-select-gap-sm);
48
+ --combobox-icon-frame-size: var(--ds-select-icon-size-sm);
49
+
50
+ height: var(--ds-combobox-height-sm);
51
+ gap: var(--ds-select-gap-sm);
52
+ padding: var(--ds-field-padding-y-sm) var(--ds-combobox-padding-x-sm);
53
+ font-size: var(--ds-select-text-font-size-sm);
54
+ line-height: var(--ds-select-text-line-height-sm);
55
+ }
56
+
57
+ .ds-combobox--lg {
58
+ --combobox-padding-x: var(--ds-combobox-padding-x-lg);
59
+ --combobox-padding-y: var(--ds-field-padding-y-lg);
60
+ --combobox-gap: var(--ds-select-gap-lg);
61
+ --combobox-icon-frame-size: var(--ds-select-icon-size-lg);
62
+
63
+ height: var(--ds-combobox-height-lg);
64
+ gap: var(--ds-select-gap-lg);
65
+ padding: var(--ds-field-padding-y-lg) var(--ds-combobox-padding-x-lg);
66
+ font-size: var(--ds-select-text-font-size-lg);
67
+ line-height: var(--ds-select-text-line-height-lg);
68
+ }
69
+
70
+ /* Input
71
+ ========================================================================== */
72
+
73
+ .ds-combobox__input {
74
+ flex: 1;
75
+ min-width: 0;
76
+ border: none;
77
+ background: transparent;
78
+ outline: none;
79
+ color: inherit;
80
+ font: inherit;
81
+ letter-spacing: inherit;
82
+ line-height: inherit;
83
+ }
84
+
85
+ .ds-combobox__input::placeholder {
86
+ color: var(--ds-field-placeholder-color-default);
87
+ }
88
+
89
+ /* Icons / adornments
90
+ ========================================================================== */
91
+
92
+ .ds-combobox__icon {
93
+ flex-shrink: 0;
94
+ display: inline-flex;
95
+ align-items: center;
96
+ justify-content: center;
97
+ box-sizing: content-box;
98
+ width: var(--ds-select-icon-size-md);
99
+ height: var(--ds-select-icon-size-md);
100
+ padding-left: var(--ds-select-icon-frame-padding-x-default);
101
+ padding-right: var(--ds-select-icon-frame-padding-x-default);
102
+ color: var(--ds-select-icon-color-default);
103
+ fill: none;
104
+ stroke: currentColor;
105
+ stroke-width: var(--ds-select-icon-stroke-width-md);
106
+ font-size: var(--ds-select-icon-size-md);
107
+ line-height: 1;
108
+ pointer-events: none;
109
+ }
110
+
111
+ .ds-combobox__chevron,
112
+ .ds-combobox__clear {
113
+ flex-shrink: 0;
114
+ display: inline-flex;
115
+ align-items: center;
116
+ justify-content: center;
117
+ box-sizing: content-box;
118
+ width: var(--ds-select-chevron-size-md);
119
+ height: var(--ds-select-chevron-size-md);
120
+ padding-left: var(--ds-select-chevron-frame-padding-x-default);
121
+ padding-right: var(--ds-select-chevron-frame-padding-x-default);
122
+ color: var(--ds-select-chevron-color-default);
123
+ fill: none;
124
+ stroke: currentColor;
125
+ stroke-width: var(--ds-select-chevron-stroke-width-md);
126
+ font-size: var(--ds-select-chevron-size-md);
127
+ line-height: 1;
128
+ }
129
+
130
+ .ds-combobox__chevron {
131
+ pointer-events: none;
132
+ transition: transform var(--ds-motion-duration-fast) var(--ds-motion-ease-default);
133
+ }
134
+
135
+ .ds-combobox--open .ds-combobox__chevron {
136
+ transform: rotate(180deg);
137
+ }
138
+
139
+ .ds-combobox--sm .ds-combobox__icon {
140
+ width: var(--ds-select-icon-size-sm);
141
+ height: var(--ds-select-icon-size-sm);
142
+ font-size: var(--ds-select-icon-size-sm);
143
+ stroke-width: var(--ds-select-icon-stroke-width-sm);
144
+ }
145
+
146
+ .ds-combobox--sm .ds-combobox__chevron,
147
+ .ds-combobox--sm .ds-combobox__clear {
148
+ width: var(--ds-select-chevron-size-sm);
149
+ height: var(--ds-select-chevron-size-sm);
150
+ font-size: var(--ds-select-chevron-size-sm);
151
+ stroke-width: var(--ds-select-chevron-stroke-width-sm);
152
+ }
153
+
154
+ .ds-combobox--lg .ds-combobox__icon {
155
+ width: var(--ds-select-icon-size-lg);
156
+ height: var(--ds-select-icon-size-lg);
157
+ font-size: var(--ds-select-icon-size-lg);
158
+ stroke-width: var(--ds-select-icon-stroke-width-lg);
159
+ }
160
+
161
+ .ds-combobox--lg .ds-combobox__chevron,
162
+ .ds-combobox--lg .ds-combobox__clear {
163
+ width: var(--ds-select-chevron-size-lg);
164
+ height: var(--ds-select-chevron-size-lg);
165
+ font-size: var(--ds-select-chevron-size-lg);
166
+ stroke-width: var(--ds-select-chevron-stroke-width-lg);
167
+ }
168
+
169
+ .ds-combobox__clear {
170
+ border: 0;
171
+ background: transparent;
172
+ cursor: pointer;
173
+ }
174
+
175
+ /* Listbox
176
+ ========================================================================== */
177
+
178
+ /* Ancora o popup abaixo do field (.ds-combobox), não abaixo do label */
179
+ .ds-combobox-anchor {
180
+ position: relative;
181
+ }
182
+
183
+ .ds-combobox-anchor > .ds-combobox__listbox,
184
+ .ds-field > .ds-combobox__listbox {
185
+ position: absolute;
186
+ z-index: var(--ds-z-tooltip);
187
+ inset-inline: 0;
188
+ top: calc(100% + var(--ds-space-2xs));
189
+ display: flex;
190
+ flex-direction: column;
191
+ gap: var(--ds-combobox-listbox-container-gap-default);
192
+ margin: 0;
193
+ padding: var(--ds-combobox-listbox-container-padding-default);
194
+ list-style: none;
195
+ background: var(--ds-combobox-listbox-container-bg-default);
196
+ border: var(--ds-border-width-default) solid var(--ds-combobox-listbox-container-border-color-default);
197
+ border-radius: var(--ds-combobox-listbox-container-radius-default);
198
+ box-shadow: var(--ds-shadow-overlay);
199
+ max-block-size: calc(var(--ds-size-5xl) * 2);
200
+ overflow: auto;
201
+ }
202
+
203
+ .ds-combobox__listbox[hidden] {
204
+ display: none !important;
205
+ }
206
+
207
+ .ds-combobox__option {
208
+ display: flex;
209
+ align-items: center;
210
+ gap: var(--ds-combobox-option-gap-default);
211
+ min-block-size: var(--ds-menu-item-height-md);
212
+ padding: 0 var(--ds-menu-item-padding-x-md);
213
+ margin: 0;
214
+ border: 0;
215
+ border-radius: var(--ds-combobox-option-radius-default);
216
+ background: var(--ds-menu-item-bg-default);
217
+ color: var(--ds-menu-item-content-color-default);
218
+ font: inherit;
219
+ text-align: start;
220
+ list-style: none;
221
+ cursor: pointer;
222
+ transition:
223
+ background-color var(--ds-motion-duration-fast) var(--ds-motion-ease-default),
224
+ color var(--ds-motion-duration-fast) var(--ds-motion-ease-default);
225
+ }
226
+
227
+ .ds-combobox--sm .ds-combobox__option {
228
+ min-block-size: var(--ds-menu-item-height-sm);
229
+ padding-inline: var(--ds-menu-item-padding-x-sm);
230
+ }
231
+
232
+ .ds-combobox--lg .ds-combobox__option {
233
+ min-block-size: var(--ds-menu-item-height-lg);
234
+ padding-inline: var(--ds-menu-item-padding-x-lg);
235
+ }
236
+
237
+ .ds-combobox__option:focus-visible {
238
+ outline: var(--ds-focus-ring-width) solid var(--ds-focus-ring-color-default);
239
+ outline-offset: calc(var(--ds-focus-ring-width) * -1);
240
+ }
241
+
242
+ .ds-combobox__option:hover:not([aria-disabled="true"]),
243
+ .ds-combobox__option[data-active="true"] {
244
+ background: var(--ds-menu-item-bg-hover-default);
245
+ color: var(--ds-menu-item-content-color-hover);
246
+ }
247
+
248
+ .ds-combobox__option[aria-selected="true"] {
249
+ background: var(--ds-combobox-option-bg-selected);
250
+ color: var(--ds-combobox-option-content-color-selected);
251
+ }
252
+
253
+ .ds-combobox__option[aria-disabled="true"] {
254
+ background: var(--ds-menu-item-bg-disabled);
255
+ color: var(--ds-menu-item-content-color-disabled);
256
+ cursor: not-allowed;
257
+ }
258
+
259
+ /* States
260
+ ========================================================================== */
261
+
262
+ .ds-combobox:hover:not(.ds-combobox--disabled):not(:focus-within) {
263
+ border-color: var(--ds-field-border-color-hover);
264
+ }
265
+
266
+ .ds-combobox:focus-within {
267
+ background: var(--ds-field-bg-default);
268
+ border-color: var(--ds-field-border-color-focus);
269
+ border-radius: var(--ds-field-radius);
270
+ outline: var(--ds-focus-ring-width) solid var(--ds-focus-ring-color-default);
271
+ outline-offset: var(--ds-focus-ring-width);
272
+ }
273
+
274
+ .ds-combobox--error,
275
+ .ds-field--error .ds-combobox {
276
+ border-color: var(--ds-field-border-color-error);
277
+ }
278
+
279
+ .ds-combobox--error:hover:not(.ds-combobox--disabled):not(:focus-within),
280
+ .ds-field--error .ds-combobox:hover:not(.ds-combobox--disabled):not(:focus-within) {
281
+ border-color: var(--ds-field-border-color-error-hover);
282
+ }
283
+
284
+ .ds-combobox--error:focus-within,
285
+ .ds-field--error .ds-combobox:focus-within {
286
+ border-color: var(--ds-field-border-color-error);
287
+ outline-color: var(--ds-focus-ring-color-error);
288
+ }
289
+
290
+ .ds-combobox--filled {
291
+ border-color: var(--ds-field-border-color-filled);
292
+ }
293
+
294
+ .ds-combobox--disabled,
295
+ .ds-combobox--disabled .ds-combobox__input {
296
+ background: var(--ds-field-bg-disabled);
297
+ border-color: var(--ds-field-border-color-disabled);
298
+ color: var(--ds-field-value-color-disabled);
299
+ cursor: not-allowed;
300
+ }
301
+
302
+ .ds-combobox--disabled .ds-combobox__input::placeholder {
303
+ color: var(--ds-field-placeholder-color-disabled);
304
+ }
305
+
306
+ .ds-combobox--disabled .ds-combobox__icon {
307
+ color: var(--ds-select-icon-color-disabled);
308
+ }
309
+
310
+ .ds-combobox--disabled .ds-combobox__chevron,
311
+ .ds-combobox--disabled .ds-combobox__clear {
312
+ color: var(--ds-select-chevron-color-disabled);
313
+ }
314
+
315
+ .ds-combobox--readonly,
316
+ .ds-combobox--readonly .ds-combobox__input {
317
+ background: var(--ds-field-bg-readonly);
318
+ border-color: var(--ds-field-border-color-readonly);
319
+ color: var(--ds-field-value-color-readonly);
320
+ }
321
+
322
+ .ds-combobox--readonly:focus-within {
323
+ outline-color: var(--ds-focus-ring-color-readonly);
324
+ }
325
+
326
+ @media (prefers-reduced-motion: reduce) {
327
+ .ds-combobox {
328
+ transition: none;
329
+ }
330
+ }
@@ -0,0 +1,20 @@
1
+ /* ============================================================
2
+ COMPONENT: Divider
3
+ ============================================================ */
4
+
5
+ /* Horizontal divider (default) — Figma: fill border/subtle, radius/md */
6
+ .ds-divider {
7
+ border: none;
8
+ height: var(--ds-divider-line-thickness-default);
9
+ width: 100%;
10
+ background-color: var(--ds-divider-line-color-default);
11
+ border-radius: var(--ds-divider-line-radius-default);
12
+ margin: var(--ds-space-md) 0;
13
+ }
14
+
15
+ /* Vertical divider */
16
+ .ds-divider--vertical {
17
+ width: var(--ds-divider-line-thickness-default);
18
+ height: 100%;
19
+ margin: 0 var(--ds-space-md);
20
+ }