@datametria/vue-components 1.2.0 → 2.0.1

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 (97) hide show
  1. package/README.md +548 -657
  2. package/dist/index.es.js +2353 -1364
  3. package/dist/index.umd.js +10 -10
  4. package/dist/vue-components.css +1 -1
  5. package/package.json +102 -98
  6. package/src/components/DatametriaAlert.vue +137 -137
  7. package/src/components/DatametriaAutocomplete.vue +184 -138
  8. package/src/components/DatametriaAvatar.vue +177 -33
  9. package/src/components/DatametriaBadge.vue +98 -98
  10. package/src/components/DatametriaBreadcrumb.vue +21 -21
  11. package/src/components/DatametriaButton.vue +177 -165
  12. package/src/components/DatametriaCard.vue +12 -12
  13. package/src/components/DatametriaCheckbox.vue +8 -8
  14. package/src/components/DatametriaChip.vue +145 -149
  15. package/src/components/DatametriaContainer.vue +4 -4
  16. package/src/components/DatametriaDatePicker.vue +686 -68
  17. package/src/components/DatametriaDivider.vue +13 -13
  18. package/src/components/DatametriaFileUpload.vue +272 -140
  19. package/src/components/DatametriaGrid.vue +3 -3
  20. package/src/components/DatametriaInput.vue +15 -15
  21. package/src/components/DatametriaMenu.vue +604 -619
  22. package/src/components/DatametriaModal.vue +16 -16
  23. package/src/components/DatametriaNavbar.vue +230 -252
  24. package/src/components/DatametriaPasswordInput.vue +430 -0
  25. package/src/components/DatametriaProgress.vue +18 -18
  26. package/src/components/DatametriaRadio.vue +20 -20
  27. package/src/components/DatametriaSelect.vue +15 -15
  28. package/src/components/DatametriaSkeleton.vue +243 -239
  29. package/src/components/DatametriaSlider.vue +395 -407
  30. package/src/components/DatametriaSortableTable.vue +585 -0
  31. package/src/components/DatametriaSpinner.vue +7 -7
  32. package/src/components/DatametriaSwitch.vue +16 -16
  33. package/src/components/DatametriaTable.vue +14 -14
  34. package/src/components/DatametriaTextarea.vue +28 -28
  35. package/src/components/DatametriaTimePicker.vue +285 -285
  36. package/src/components/DatametriaToast.vue +176 -176
  37. package/src/components/DatametriaTooltip.vue +408 -408
  38. package/src/components/__tests__/DatametriaAlert.test.js +35 -35
  39. package/src/components/__tests__/DatametriaAlert.test.ts +190 -0
  40. package/src/components/__tests__/DatametriaAutocomplete.test.ts +180 -0
  41. package/src/components/__tests__/DatametriaAvatar.test.ts +152 -0
  42. package/src/components/__tests__/DatametriaBadge.test.js +29 -29
  43. package/src/components/__tests__/DatametriaBadge.test.ts +167 -0
  44. package/src/components/__tests__/DatametriaBreadcrumb.test.ts +75 -0
  45. package/src/components/__tests__/DatametriaButton.test.js +30 -30
  46. package/src/components/__tests__/DatametriaButton.test.ts +283 -0
  47. package/src/components/__tests__/DatametriaCard.test.ts +201 -0
  48. package/src/components/__tests__/DatametriaCheckbox.test.ts +47 -0
  49. package/src/components/__tests__/DatametriaChip.test.js +38 -38
  50. package/src/components/__tests__/DatametriaContainer.test.ts +52 -0
  51. package/src/components/__tests__/DatametriaDatePicker.test.ts +234 -0
  52. package/src/components/__tests__/DatametriaDivider.test.ts +54 -0
  53. package/src/components/__tests__/DatametriaFileUpload.test.ts +291 -0
  54. package/src/components/__tests__/DatametriaGrid.test.ts +31 -0
  55. package/src/components/__tests__/DatametriaInput.test.ts +72 -0
  56. package/src/components/__tests__/DatametriaMenu.test.ts +366 -0
  57. package/src/components/__tests__/DatametriaModal.test.ts +86 -0
  58. package/src/components/__tests__/DatametriaNavbar.test.js +48 -48
  59. package/src/components/__tests__/DatametriaNavbar.test.ts +203 -0
  60. package/src/components/__tests__/DatametriaPasswordInput.test.js +305 -0
  61. package/src/components/__tests__/DatametriaProgress.test.ts +90 -0
  62. package/src/components/__tests__/DatametriaRadio.test.ts +77 -0
  63. package/src/components/__tests__/DatametriaSelect.test.ts +77 -0
  64. package/src/components/__tests__/DatametriaSlider.test.ts +261 -0
  65. package/src/components/__tests__/DatametriaSortableTable.test.js +168 -0
  66. package/src/components/__tests__/DatametriaSpinner.test.ts +156 -0
  67. package/src/components/__tests__/DatametriaSwitch.test.ts +64 -0
  68. package/src/components/__tests__/DatametriaTable.test.ts +97 -0
  69. package/src/components/__tests__/DatametriaTextarea.test.ts +66 -0
  70. package/src/components/__tests__/DatametriaToast.test.js +48 -48
  71. package/src/components/__tests__/DatametriaToast.test.ts +99 -0
  72. package/src/composables/useAccessibilityScale.ts +94 -94
  73. package/src/composables/useBreakpoints.ts +82 -82
  74. package/src/composables/useHapticFeedback.ts +439 -439
  75. package/src/composables/useRipple.ts +218 -218
  76. package/src/index.ts +68 -61
  77. package/src/stories/Variants.stories.js +95 -95
  78. package/src/styles/design-tokens.css +623 -623
  79. package/src/theme/ThemeProvider.vue +96 -0
  80. package/src/theme/__tests__/ThemeProvider.test.ts +208 -0
  81. package/src/theme/__tests__/constants.test.ts +31 -0
  82. package/src/theme/__tests__/presets.test.ts +166 -0
  83. package/src/theme/__tests__/tokens.test.ts +155 -0
  84. package/src/theme/__tests__/types.test.ts +153 -0
  85. package/src/theme/__tests__/useTheme.test.ts +146 -0
  86. package/src/theme/constants.ts +14 -0
  87. package/src/theme/index.ts +12 -0
  88. package/src/theme/presets/datametria.ts +94 -0
  89. package/src/theme/presets/default.ts +94 -0
  90. package/src/theme/presets/index.ts +8 -0
  91. package/src/theme/tokens/colors.ts +28 -0
  92. package/src/theme/tokens/index.ts +47 -0
  93. package/src/theme/tokens/spacing.ts +21 -0
  94. package/src/theme/tokens/typography.ts +35 -0
  95. package/src/theme/types.ts +111 -0
  96. package/src/theme/useTheme.ts +28 -0
  97. package/src/types/index.ts +19 -0
@@ -0,0 +1,430 @@
1
+ <template>
2
+ <div class="datametria-password-input">
3
+ <label v-if="label" :for="inputId" class="datametria-password-input__label">
4
+ {{ label }}
5
+ <span v-if="required" class="datametria-password-input__required">*</span>
6
+ </label>
7
+
8
+ <div class="datametria-password-input__wrapper">
9
+ <input
10
+ :id="inputId"
11
+ :value="modelValue"
12
+ :type="showPassword ? 'text' : 'password'"
13
+ :placeholder="placeholder"
14
+ :disabled="disabled"
15
+ :required="required"
16
+ :autocomplete="autocomplete"
17
+ :class="inputClasses"
18
+ :aria-invalid="!!errorMessage"
19
+ :aria-describedby="ariaDescribedby"
20
+ @input="handleInput"
21
+ @focus="handleFocus"
22
+ @blur="handleBlur"
23
+ @keyup="checkCapsLock"
24
+ />
25
+
26
+ <button
27
+ type="button"
28
+ class="datametria-password-input__toggle"
29
+ :aria-label="showPassword ? 'Ocultar senha' : 'Mostrar senha'"
30
+ @click="toggleVisibility"
31
+ tabindex="-1"
32
+ >
33
+ <svg v-if="showPassword" class="datametria-password-input__icon" fill="none" viewBox="0 0 24 24" stroke="currentColor">
34
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13.875 18.825A10.05 10.05 0 0112 19c-4.478 0-8.268-2.943-9.543-7a9.97 9.97 0 011.563-3.029m5.858.908a3 3 0 114.243 4.243M9.878 9.878l4.242 4.242M9.88 9.88l-3.29-3.29m7.532 7.532l3.29 3.29M3 3l3.59 3.59m0 0A9.953 9.953 0 0112 5c4.478 0 8.268 2.943 9.543 7a10.025 10.025 0 01-4.132 5.411m0 0L21 21" />
35
+ </svg>
36
+ <svg v-else class="datametria-password-input__icon" fill="none" viewBox="0 0 24 24" stroke="currentColor">
37
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 12a3 3 0 11-6 0 3 3 0 016 0z" />
38
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M2.458 12C3.732 7.943 7.523 5 12 5c4.478 0 8.268 2.943 9.542 7-1.274 4.057-5.064 7-9.542 7-4.477 0-8.268-2.943-9.542-7z" />
39
+ </svg>
40
+ </button>
41
+ </div>
42
+
43
+ <!-- Caps Lock Warning -->
44
+ <p v-if="capsLockOn" class="datametria-password-input__warning">
45
+ ⚠️ Caps Lock está ativado
46
+ </p>
47
+
48
+ <!-- Strength Indicator -->
49
+ <div v-if="showStrength && modelValue" class="datametria-password-input__strength">
50
+ <div class="datametria-password-input__strength-bar">
51
+ <div
52
+ :class="strengthBarClasses"
53
+ :style="{ width: `${strengthPercentage}%` }"
54
+ ></div>
55
+ </div>
56
+ <span :class="strengthTextClasses">{{ strengthText }}</span>
57
+ </div>
58
+
59
+ <!-- Requirements -->
60
+ <div v-if="showRequirements && isFocused" :id="`${inputId}-requirements`" class="datametria-password-input__requirements">
61
+ <p class="datametria-password-input__requirements-title">A senha deve conter:</p>
62
+ <ul class="datametria-password-input__requirements-list">
63
+ <li :class="{ 'valid': requirements.minLength }">
64
+ <span class="datametria-password-input__check">{{ requirements.minLength ? '✓' : '○' }}</span>
65
+ Mínimo {{ minLength }} caracteres
66
+ </li>
67
+ <li :class="{ 'valid': requirements.hasUppercase }">
68
+ <span class="datametria-password-input__check">{{ requirements.hasUppercase ? '✓' : '○' }}</span>
69
+ Pelo menos 1 letra maiúscula
70
+ </li>
71
+ <li :class="{ 'valid': requirements.hasLowercase }">
72
+ <span class="datametria-password-input__check">{{ requirements.hasLowercase ? '✓' : '○' }}</span>
73
+ Pelo menos 1 letra minúscula
74
+ </li>
75
+ <li :class="{ 'valid': requirements.hasNumber }">
76
+ <span class="datametria-password-input__check">{{ requirements.hasNumber ? '✓' : '○' }}</span>
77
+ Pelo menos 1 número
78
+ </li>
79
+ <li :class="{ 'valid': requirements.hasSpecial }">
80
+ <span class="datametria-password-input__check">{{ requirements.hasSpecial ? '✓' : '○' }}</span>
81
+ Pelo menos 1 caractere especial
82
+ </li>
83
+ </ul>
84
+ </div>
85
+
86
+ <!-- Error Message -->
87
+ <p v-if="errorMessage" :id="`${inputId}-error`" class="datametria-password-input__error">
88
+ {{ errorMessage }}
89
+ </p>
90
+
91
+ <!-- Help Text -->
92
+ <p v-if="helpText && !errorMessage" :id="`${inputId}-help`" class="datametria-password-input__help">
93
+ {{ helpText }}
94
+ </p>
95
+ </div>
96
+ </template>
97
+
98
+ <script setup lang="ts">
99
+ import { computed, ref, watch } from 'vue'
100
+
101
+ interface Props {
102
+ modelValue?: string
103
+ label?: string
104
+ placeholder?: string
105
+ errorMessage?: string
106
+ helpText?: string
107
+ disabled?: boolean
108
+ required?: boolean
109
+ minLength?: number
110
+ showStrength?: boolean
111
+ showRequirements?: boolean
112
+ autocomplete?: 'current-password' | 'new-password'
113
+ }
114
+
115
+ const props = withDefaults(defineProps<Props>(), {
116
+ modelValue: '',
117
+ disabled: false,
118
+ required: false,
119
+ minLength: 8,
120
+ showStrength: true,
121
+ showRequirements: true,
122
+ autocomplete: 'current-password'
123
+ })
124
+
125
+ const emit = defineEmits<{
126
+ 'update:modelValue': [value: string]
127
+ 'strength-change': [strength: number]
128
+ }>()
129
+
130
+ const inputId = computed(() => `password-${Math.random().toString(36).substr(2, 9)}`)
131
+ const showPassword = ref(false)
132
+ const isFocused = ref(false)
133
+ const capsLockOn = ref(false)
134
+
135
+ // Requirements validation
136
+ const requirements = computed(() => ({
137
+ minLength: props.modelValue.length >= props.minLength,
138
+ hasUppercase: /[A-Z]/.test(props.modelValue),
139
+ hasLowercase: /[a-z]/.test(props.modelValue),
140
+ hasNumber: /\d/.test(props.modelValue),
141
+ hasSpecial: /[!@#$%^&*(),.?":{}|<>]/.test(props.modelValue)
142
+ }))
143
+
144
+ // Password strength calculation
145
+ const strength = computed(() => {
146
+ if (!props.modelValue) return 0
147
+
148
+ let score = 0
149
+ const reqs = requirements.value
150
+
151
+ if (reqs.minLength) score += 20
152
+ if (reqs.hasUppercase) score += 20
153
+ if (reqs.hasLowercase) score += 20
154
+ if (reqs.hasNumber) score += 20
155
+ if (reqs.hasSpecial) score += 20
156
+
157
+ return score
158
+ })
159
+
160
+ const strengthPercentage = computed(() => strength.value)
161
+
162
+ const strengthText = computed(() => {
163
+ const s = strength.value
164
+ if (s === 0) return ''
165
+ if (s <= 40) return 'Fraca'
166
+ if (s <= 60) return 'Média'
167
+ if (s <= 80) return 'Boa'
168
+ return 'Forte'
169
+ })
170
+
171
+ const strengthBarClasses = computed(() => [
172
+ 'datametria-password-input__strength-fill',
173
+ {
174
+ 'datametria-password-input__strength-fill--weak': strength.value <= 40,
175
+ 'datametria-password-input__strength-fill--medium': strength.value > 40 && strength.value <= 60,
176
+ 'datametria-password-input__strength-fill--good': strength.value > 60 && strength.value <= 80,
177
+ 'datametria-password-input__strength-fill--strong': strength.value > 80
178
+ }
179
+ ])
180
+
181
+ const strengthTextClasses = computed(() => [
182
+ 'datametria-password-input__strength-text',
183
+ {
184
+ 'datametria-password-input__strength-text--weak': strength.value <= 40,
185
+ 'datametria-password-input__strength-text--medium': strength.value > 40 && strength.value <= 60,
186
+ 'datametria-password-input__strength-text--good': strength.value > 60 && strength.value <= 80,
187
+ 'datametria-password-input__strength-text--strong': strength.value > 80
188
+ }
189
+ ])
190
+
191
+ const inputClasses = computed(() => [
192
+ 'datametria-password-input__field',
193
+ {
194
+ 'datametria-password-input__field--error': props.errorMessage,
195
+ 'datametria-password-input__field--disabled': props.disabled
196
+ }
197
+ ])
198
+
199
+ const ariaDescribedby = computed(() => {
200
+ const ids = []
201
+ if (props.showRequirements && isFocused.value) ids.push(`${inputId.value}-requirements`)
202
+ if (props.errorMessage) ids.push(`${inputId.value}-error`)
203
+ if (props.helpText && !props.errorMessage) ids.push(`${inputId.value}-help`)
204
+ return ids.length > 0 ? ids.join(' ') : undefined
205
+ })
206
+
207
+ const handleInput = (event: Event) => {
208
+ const value = (event.target as HTMLInputElement).value
209
+ emit('update:modelValue', value)
210
+ }
211
+
212
+ const handleFocus = () => {
213
+ isFocused.value = true
214
+ }
215
+
216
+ const handleBlur = () => {
217
+ isFocused.value = false
218
+ }
219
+
220
+ const toggleVisibility = () => {
221
+ showPassword.value = !showPassword.value
222
+ }
223
+
224
+ const checkCapsLock = (event: KeyboardEvent) => {
225
+ capsLockOn.value = event.getModifierState('CapsLock')
226
+ }
227
+
228
+ // Watch strength changes and emit
229
+ watch(strength, (newStrength) => {
230
+ if (props.modelValue) {
231
+ emit('strength-change', newStrength)
232
+ }
233
+ })
234
+ </script>
235
+
236
+ <style scoped>
237
+ .datametria-password-input {
238
+ display: flex;
239
+ flex-direction: column;
240
+ gap: var(--dm-spacing-2, 0.5rem);
241
+ }
242
+
243
+ .datametria-password-input__label {
244
+ font-size: var(--dm-font-size-sm, 0.875rem);
245
+ font-weight: var(--dm-font-weight-medium, 500);
246
+ color: var(--dm-neutral-700, #374151);
247
+ }
248
+
249
+ .datametria-password-input__required {
250
+ color: var(--dm-error, #ef4444);
251
+ }
252
+
253
+ .datametria-password-input__wrapper {
254
+ position: relative;
255
+ display: flex;
256
+ align-items: center;
257
+ }
258
+
259
+ .datametria-password-input__field {
260
+ width: 100%;
261
+ padding: var(--dm-spacing-3, 0.75rem);
262
+ padding-right: var(--dm-spacing-12, 3rem);
263
+ border: 1px solid var(--dm-neutral-300, #d1d5db);
264
+ border-radius: var(--dm-radius-md, 0.375rem);
265
+ font-size: var(--dm-font-size-base, 1rem);
266
+ transition: all var(--dm-transition-base, 0.2s);
267
+ }
268
+
269
+ .datametria-password-input__field:focus {
270
+ outline: none;
271
+ border-color: var(--dm-primary, #0072CE);
272
+ box-shadow: 0 0 0 3px color-mix(in srgb, var(--dm-primary, #0072CE) 10%, transparent);
273
+ }
274
+
275
+ .datametria-password-input__field--error {
276
+ border-color: var(--dm-error, #ef4444);
277
+ }
278
+
279
+ .datametria-password-input__field--error:focus {
280
+ border-color: var(--dm-error, #ef4444);
281
+ box-shadow: 0 0 0 3px color-mix(in srgb, var(--dm-error, #ef4444) 10%, transparent);
282
+ }
283
+
284
+ .datametria-password-input__field--disabled {
285
+ background: var(--dm-neutral-100, #f3f4f6);
286
+ cursor: not-allowed;
287
+ }
288
+
289
+ .datametria-password-input__toggle {
290
+ position: absolute;
291
+ right: var(--dm-spacing-3, 0.75rem);
292
+ background: none;
293
+ border: none;
294
+ cursor: pointer;
295
+ padding: var(--dm-spacing-1, 0.25rem);
296
+ color: var(--dm-neutral-500, #6b7280);
297
+ transition: color var(--dm-transition-base, 0.2s);
298
+ }
299
+
300
+ .datametria-password-input__toggle:hover {
301
+ color: var(--dm-neutral-700, #374151);
302
+ }
303
+
304
+ .datametria-password-input__toggle:focus {
305
+ outline: 2px solid var(--dm-primary, #0072CE);
306
+ outline-offset: 2px;
307
+ border-radius: var(--dm-radius-sm, 0.25rem);
308
+ }
309
+
310
+ .datametria-password-input__icon {
311
+ width: 1.25rem;
312
+ height: 1.25rem;
313
+ }
314
+
315
+ .datametria-password-input__warning {
316
+ font-size: var(--dm-font-size-sm, 0.875rem);
317
+ color: var(--dm-warning, #f59e0b);
318
+ margin: 0;
319
+ }
320
+
321
+ .datametria-password-input__strength {
322
+ display: flex;
323
+ align-items: center;
324
+ gap: var(--dm-spacing-3, 0.75rem);
325
+ }
326
+
327
+ .datametria-password-input__strength-bar {
328
+ flex: 1;
329
+ height: var(--dm-spacing-2, 0.5rem);
330
+ background: var(--dm-neutral-200, #e5e7eb);
331
+ border-radius: var(--dm-radius-sm, 0.25rem);
332
+ overflow: hidden;
333
+ }
334
+
335
+ .datametria-password-input__strength-fill {
336
+ height: 100%;
337
+ transition: width var(--dm-transition-slow, 0.3s) ease, background-color var(--dm-transition-slow, 0.3s) ease;
338
+ border-radius: var(--dm-radius-sm, 0.25rem);
339
+ }
340
+
341
+ .datametria-password-input__strength-fill--weak {
342
+ background: var(--dm-error, #ef4444);
343
+ }
344
+
345
+ .datametria-password-input__strength-fill--medium {
346
+ background: var(--dm-warning, #f59e0b);
347
+ }
348
+
349
+ .datametria-password-input__strength-fill--good {
350
+ background: var(--dm-info, #3b82f6);
351
+ }
352
+
353
+ .datametria-password-input__strength-fill--strong {
354
+ background: var(--dm-success, #10b981);
355
+ }
356
+
357
+ .datametria-password-input__strength-text {
358
+ font-size: var(--dm-font-size-sm, 0.875rem);
359
+ font-weight: var(--dm-font-weight-medium, 500);
360
+ min-width: 4rem;
361
+ }
362
+
363
+ .datametria-password-input__strength-text--weak {
364
+ color: var(--dm-error, #ef4444);
365
+ }
366
+
367
+ .datametria-password-input__strength-text--medium {
368
+ color: var(--dm-warning, #f59e0b);
369
+ }
370
+
371
+ .datametria-password-input__strength-text--good {
372
+ color: var(--dm-info, #3b82f6);
373
+ }
374
+
375
+ .datametria-password-input__strength-text--strong {
376
+ color: var(--dm-success, #10b981);
377
+ }
378
+
379
+ .datametria-password-input__requirements {
380
+ padding: var(--dm-spacing-3, 0.75rem);
381
+ background: var(--dm-neutral-50, #f9fafb);
382
+ border: 1px solid var(--dm-neutral-200, #e5e7eb);
383
+ border-radius: var(--dm-radius-md, 0.375rem);
384
+ }
385
+
386
+ .datametria-password-input__requirements-title {
387
+ font-size: var(--dm-font-size-sm, 0.875rem);
388
+ font-weight: var(--dm-font-weight-medium, 500);
389
+ color: var(--dm-neutral-700, #374151);
390
+ margin: 0 0 var(--dm-spacing-2, 0.5rem) 0;
391
+ }
392
+
393
+ .datametria-password-input__requirements-list {
394
+ list-style: none;
395
+ padding: 0;
396
+ margin: 0;
397
+ display: flex;
398
+ flex-direction: column;
399
+ gap: var(--dm-spacing-1, 0.25rem);
400
+ }
401
+
402
+ .datametria-password-input__requirements-list li {
403
+ font-size: var(--dm-font-size-sm, 0.875rem);
404
+ color: var(--dm-neutral-500, #6b7280);
405
+ display: flex;
406
+ align-items: center;
407
+ gap: var(--dm-spacing-2, 0.5rem);
408
+ }
409
+
410
+ .datametria-password-input__requirements-list li.valid {
411
+ color: var(--dm-success, #10b981);
412
+ }
413
+
414
+ .datametria-password-input__check {
415
+ font-weight: var(--dm-font-weight-semibold, 600);
416
+ min-width: 1rem;
417
+ }
418
+
419
+ .datametria-password-input__error {
420
+ font-size: var(--dm-font-size-sm, 0.875rem);
421
+ color: var(--dm-error, #ef4444);
422
+ margin: 0;
423
+ }
424
+
425
+ .datametria-password-input__help {
426
+ font-size: var(--dm-font-size-sm, 0.875rem);
427
+ color: var(--dm-neutral-500, #6b7280);
428
+ margin: 0;
429
+ }
430
+ </style>
@@ -46,7 +46,7 @@ const clampedValue = computed(() => {
46
46
  .dm-progress {
47
47
  display: flex;
48
48
  flex-direction: column;
49
- gap: var(--dm-space-2);
49
+ gap: var(--dm-spacing-2, 0.5rem);
50
50
  }
51
51
 
52
52
  .dm-progress__header {
@@ -56,58 +56,58 @@ const clampedValue = computed(() => {
56
56
  }
57
57
 
58
58
  .dm-progress__label {
59
- font-size: var(--dm-text-sm);
60
- font-weight: 500;
61
- color: var(--dm-text-primary);
59
+ font-size: var(--dm-font-size-sm, 0.875rem);
60
+ font-weight: var(--dm-font-weight-medium, 500);
61
+ color: var(--dm-neutral-900, #111827);
62
62
  }
63
63
 
64
64
  .dm-progress__value {
65
- font-size: var(--dm-text-sm);
66
- font-weight: 600;
67
- color: var(--dm-text-secondary);
65
+ font-size: var(--dm-font-size-sm, 0.875rem);
66
+ font-weight: var(--dm-font-weight-semibold, 600);
67
+ color: var(--dm-neutral-600, #4b5563);
68
68
  }
69
69
 
70
70
  .dm-progress__track {
71
71
  width: 100%;
72
72
  height: 8px;
73
- background: var(--dm-gray-200);
74
- border-radius: 4px;
73
+ background: var(--dm-neutral-200, #e5e7eb);
74
+ border-radius: var(--dm-radius-sm, 0.25rem);
75
75
  overflow: hidden;
76
76
  }
77
77
 
78
78
  .dm-progress__bar {
79
79
  height: 100%;
80
- border-radius: 4px;
81
- transition: width 0.3s ease;
80
+ border-radius: var(--dm-radius-sm, 0.25rem);
81
+ transition: width var(--dm-transition-base, 0.3s ease);
82
82
  }
83
83
 
84
84
  .dm-progress__bar--primary {
85
- background: var(--dm-primary);
85
+ background: var(--dm-primary, #0072CE);
86
86
  }
87
87
 
88
88
  .dm-progress__bar--success {
89
- background: var(--dm-success);
89
+ background: var(--dm-success, #10b981);
90
90
  }
91
91
 
92
92
  .dm-progress__bar--warning {
93
- background: var(--dm-warning);
93
+ background: var(--dm-warning, #f59e0b);
94
94
  }
95
95
 
96
96
  .dm-progress__bar--error {
97
- background: var(--dm-error);
97
+ background: var(--dm-error, #ef4444);
98
98
  }
99
99
 
100
100
  @media (prefers-color-scheme: dark) {
101
101
  .dm-progress__track {
102
- background: var(--dm-gray-700);
102
+ background: var(--dm-neutral-700, #374151);
103
103
  }
104
104
 
105
105
  .dm-progress__label {
106
- color: var(--dm-white);
106
+ color: var(--dm-neutral-50, #ffffff);
107
107
  }
108
108
 
109
109
  .dm-progress__value {
110
- color: var(--dm-gray-400);
110
+ color: var(--dm-neutral-400, #9ca3af);
111
111
  }
112
112
  }
113
113
  </style>
@@ -49,16 +49,16 @@ const handleChange = () => {
49
49
  .dm-radio {
50
50
  display: flex;
51
51
  flex-direction: column;
52
- gap: var(--dm-space-1);
52
+ gap: var(--dm-spacing-1, 0.25rem);
53
53
  }
54
54
 
55
55
  .dm-radio__label {
56
56
  display: inline-flex;
57
57
  align-items: center;
58
- gap: var(--dm-space-2);
58
+ gap: var(--dm-spacing-2, 0.5rem);
59
59
  cursor: pointer;
60
60
  min-height: 44px;
61
- padding: var(--dm-space-2);
61
+ padding: var(--dm-spacing-2, 0.5rem);
62
62
  user-select: none;
63
63
  }
64
64
 
@@ -78,16 +78,16 @@ const handleChange = () => {
78
78
  position: relative;
79
79
  width: 20px;
80
80
  height: 20px;
81
- border: 2px solid var(--dm-gray-400);
81
+ border: 2px solid var(--dm-neutral-400, #9ca3af);
82
82
  border-radius: 50%;
83
- background: var(--dm-white);
84
- transition: var(--dm-transition);
83
+ background: white;
84
+ transition: all 0.2s;
85
85
  flex-shrink: 0;
86
86
  }
87
87
 
88
88
  .dm-radio__input:checked + .dm-radio__checkmark {
89
- border-color: var(--dm-primary);
90
- background: var(--dm-primary);
89
+ border-color: var(--dm-primary, #0072CE);
90
+ background: var(--dm-primary, #0072CE);
91
91
  }
92
92
 
93
93
  .dm-radio__input:checked + .dm-radio__checkmark::after {
@@ -99,40 +99,40 @@ const handleChange = () => {
99
99
  width: 8px;
100
100
  height: 8px;
101
101
  border-radius: 50%;
102
- background: var(--dm-white);
102
+ background: white;
103
103
  }
104
104
 
105
105
  .dm-radio__input:focus-visible + .dm-radio__checkmark {
106
- outline: var(--dm-focus-ring);
106
+ outline: 2px solid var(--dm-primary, #0072CE);
107
107
  outline-offset: 2px;
108
108
  }
109
109
 
110
110
  .dm-radio__input:disabled + .dm-radio__checkmark {
111
- background: var(--dm-gray-100);
112
- border-color: var(--dm-gray-300);
111
+ background: var(--dm-neutral-100, #f3f4f6);
112
+ border-color: var(--dm-neutral-300, #d1d5db);
113
113
  }
114
114
 
115
115
  .dm-radio__text {
116
- color: var(--dm-text-primary);
117
- font-size: var(--dm-text-base);
116
+ color: var(--dm-neutral-900, #111827);
117
+ font-size: var(--dm-font-size-base, 1rem);
118
118
  line-height: 1.5;
119
119
  }
120
120
 
121
121
  .dm-radio__error {
122
- color: var(--dm-error);
123
- font-size: var(--dm-text-sm);
122
+ color: var(--dm-error, #ef4444);
123
+ font-size: var(--dm-font-size-sm, 0.875rem);
124
124
  margin: 0;
125
125
  }
126
126
 
127
127
  @media (prefers-color-scheme: dark) {
128
128
  .dm-radio__checkmark {
129
- background: var(--dm-gray-800);
130
- border-color: var(--dm-gray-600);
129
+ background: var(--dm-neutral-800, #1f2937);
130
+ border-color: var(--dm-neutral-600, #4b5563);
131
131
  }
132
132
 
133
133
  .dm-radio__input:disabled + .dm-radio__checkmark {
134
- background: var(--dm-gray-900);
135
- border-color: var(--dm-gray-700);
134
+ background: var(--dm-neutral-900, #111827);
135
+ border-color: var(--dm-neutral-700, #374151);
136
136
  }
137
137
  }
138
138
  </style>
@@ -66,24 +66,24 @@ const selectClasses = computed(() => [
66
66
  .datametria-select {
67
67
  display: flex;
68
68
  flex-direction: column;
69
- gap: 0.5rem;
69
+ gap: var(--dm-spacing-2, 0.5rem);
70
70
  }
71
71
 
72
72
  .datametria-select__label {
73
- font-size: 0.875rem;
74
- font-weight: 500;
75
- color: #374151;
73
+ font-size: var(--dm-font-size-sm, 0.875rem);
74
+ font-weight: var(--dm-font-weight-medium, 500);
75
+ color: var(--dm-neutral-700, #374151);
76
76
  }
77
77
 
78
78
  .datametria-select__required {
79
- color: #ef4444;
79
+ color: var(--dm-error, #ef4444);
80
80
  }
81
81
 
82
82
  .datametria-select__field {
83
- padding: 0.75rem;
84
- border: 1px solid #d1d5db;
85
- border-radius: 0.375rem;
86
- font-size: 1rem;
83
+ padding: var(--dm-spacing-3, 0.75rem);
84
+ border: 1px solid var(--dm-neutral-300, #d1d5db);
85
+ border-radius: var(--dm-radius-md, 0.375rem);
86
+ font-size: var(--dm-font-size-base, 1rem);
87
87
  background: white;
88
88
  cursor: pointer;
89
89
  transition: all 0.2s;
@@ -91,22 +91,22 @@ const selectClasses = computed(() => [
91
91
 
92
92
  .datametria-select__field:focus {
93
93
  outline: none;
94
- border-color: #0072CE;
95
- box-shadow: 0 0 0 3px rgba(0, 114, 206, 0.1);
94
+ border-color: var(--dm-primary, #0072CE);
95
+ box-shadow: 0 0 0 3px color-mix(in srgb, var(--dm-primary, #0072CE) 10%, transparent);
96
96
  }
97
97
 
98
98
  .datametria-select__field--error {
99
- border-color: #ef4444;
99
+ border-color: var(--dm-error, #ef4444);
100
100
  }
101
101
 
102
102
  .datametria-select__field--disabled {
103
- background: #f3f4f6;
103
+ background: var(--dm-neutral-100, #f3f4f6);
104
104
  cursor: not-allowed;
105
105
  }
106
106
 
107
107
  .datametria-select__error {
108
- font-size: 0.875rem;
109
- color: #ef4444;
108
+ font-size: var(--dm-font-size-sm, 0.875rem);
109
+ color: var(--dm-error, #ef4444);
110
110
  margin: 0;
111
111
  }
112
112
  </style>