@datametria/vue-components 2.4.0 → 2.4.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.
@@ -1,61 +1,43 @@
1
- <template>
2
- <div class="datametria-checkbox-group" role="group">
3
- <slot></slot>
4
- </div>
5
- </template>
6
-
7
- <script setup lang="ts">
8
- import { provide, computed } from 'vue'
9
-
10
- interface Props {
11
- modelValue?: (string | number)[]
12
- disabled?: boolean
13
- }
14
-
15
- const props = withDefaults(defineProps<Props>(), {
16
- modelValue: () => [],
17
- disabled: false
18
- })
19
-
20
- const emit = defineEmits<{
21
- 'update:modelValue': [value: (string | number)[]]
22
- change: [value: (string | number)[]]
23
- }>()
24
-
25
- const updateValue = (value: (string | number)[]) => {
26
- emit('update:modelValue', value)
27
- emit('change', value)
28
- }
29
-
30
- provide('checkboxGroup', {
31
- modelValue: computed(() => props.modelValue),
32
- disabled: computed(() => props.disabled),
33
- updateValue
34
- })
35
- </script>
36
-
37
- <style scoped>
38
- .datametria-checkbox-group {
39
- display: inline-flex;
40
- flex-wrap: wrap;
41
- gap: 12px;
42
- }
1
+ <template>
2
+ <div class="datametria-checkbox-group" role="group">
3
+ <slot></slot>
4
+ </div>
5
+ </template>
43
6
 
44
- /* Dark Mode Support - Hybrid Approach */
7
+ <script setup lang="ts">
8
+ import { provide, computed } from 'vue'
45
9
 
46
- /* Fallback automático (sem JS) */
47
- @media (prefers-color-scheme: dark) {
48
- .datametria-checkbox-group {
49
- background: var(--dm-bg-color-dark, #1e1e1e);
50
- color: var(--dm-text-primary-dark, #e0e0e0);
51
- border-color: var(--dm-border-color-dark, #404040);
52
- }
10
+ interface Props {
11
+ modelValue?: (string | number)[]
12
+ disabled?: boolean
53
13
  }
54
14
 
55
- /* Controle manual via useTheme() */
56
- [data-theme="dark"] .datametria-checkbox-group {
57
- background: var(--dm-bg-color-dark, #1e1e1e);
58
- color: var(--dm-text-primary-dark, #e0e0e0);
59
- border-color: var(--dm-border-color-dark, #404040);
15
+ const props = withDefaults(defineProps<Props>(), {
16
+ modelValue: () => [],
17
+ disabled: false
18
+ })
19
+
20
+ const emit = defineEmits<{
21
+ 'update:modelValue': [value: (string | number)[]]
22
+ change: [value: (string | number)[]]
23
+ }>()
24
+
25
+ const updateValue = (value: (string | number)[]) => {
26
+ emit('update:modelValue', value)
27
+ emit('change', value)
28
+ }
29
+
30
+ provide('checkboxGroup', {
31
+ modelValue: computed(() => props.modelValue),
32
+ disabled: computed(() => props.disabled),
33
+ updateValue
34
+ })
35
+ </script>
36
+
37
+ <style scoped>
38
+ .datametria-checkbox-group {
39
+ display: inline-flex;
40
+ flex-wrap: wrap;
41
+ gap: 12px;
60
42
  }
61
- </style>
43
+ </style>
@@ -244,18 +244,18 @@ const formatFileSize = (bytes: number): string => {
244
244
  }
245
245
 
246
246
  .dm-file-upload__area {
247
- border: 2px dashed var(--dm-neutral-300, #d1d5db);
247
+ border: 2px dashed var(--dm-border-color, #d1d5db);
248
248
  border-radius: var(--dm-radius-lg, 0.5rem);
249
249
  padding: 2rem;
250
250
  text-align: center;
251
251
  cursor: pointer;
252
252
  transition: all 0.2s;
253
- background-color: var(--dm-neutral-50, #f9fafb);
253
+ background-color: var(--dm-bg-secondary, #f9fafb);
254
254
  }
255
255
 
256
256
  .dm-file-upload__area:hover {
257
257
  border-color: var(--dm-primary, #0072ce);
258
- background-color: var(--dm-neutral-100, #f3f4f6);
258
+ background-color: var(--dm-bg-hover, #f3f4f6);
259
259
  }
260
260
 
261
261
  .dm-file-upload__area--dragover {
@@ -277,7 +277,7 @@ const formatFileSize = (bytes: number): string => {
277
277
  .dm-file-upload__icon {
278
278
  width: 3rem;
279
279
  height: 3rem;
280
- color: var(--dm-neutral-400, #9ca3af);
280
+ color: var(--dm-text-secondary, #9ca3af);
281
281
  }
282
282
 
283
283
  .dm-file-upload__icon svg {
@@ -292,20 +292,20 @@ const formatFileSize = (bytes: number): string => {
292
292
  .dm-file-upload__primary-text {
293
293
  font-size: 1.125rem;
294
294
  font-weight: 500;
295
- color: var(--dm-neutral-700, #374151);
295
+ color: var(--dm-text-primary, #374151);
296
296
  margin: 0 0 0.5rem 0;
297
297
  }
298
298
 
299
299
  .dm-file-upload__secondary-text {
300
300
  font-size: 0.875rem;
301
- color: var(--dm-neutral-500, #6b7280);
301
+ color: var(--dm-text-secondary, #6b7280);
302
302
  margin: 0;
303
303
  }
304
304
 
305
305
  .dm-file-upload__spinner {
306
306
  width: 2rem;
307
307
  height: 2rem;
308
- border: 3px solid var(--dm-neutral-300, #d1d5db);
308
+ border: 3px solid var(--dm-border-color, #d1d5db);
309
309
  border-top: 3px solid var(--dm-primary, #0072ce);
310
310
  border-radius: 50%;
311
311
  animation: spin 1s linear infinite;
@@ -326,7 +326,7 @@ const formatFileSize = (bytes: number): string => {
326
326
  .dm-file-upload__progress-track {
327
327
  flex: 1;
328
328
  height: 0.5rem;
329
- background-color: var(--dm-neutral-200, #e5e7eb);
329
+ background-color: var(--dm-bg-secondary, #e5e7eb);
330
330
  border-radius: var(--dm-radius-full, 9999px);
331
331
  overflow: hidden;
332
332
  }
@@ -340,7 +340,7 @@ const formatFileSize = (bytes: number): string => {
340
340
  .dm-file-upload__progress-text {
341
341
  font-size: 0.875rem;
342
342
  font-weight: 500;
343
- color: var(--dm-neutral-600, #4b5563);
343
+ color: var(--dm-text-secondary, #4b5563);
344
344
  min-width: 3rem;
345
345
  }
346
346
 
@@ -354,8 +354,8 @@ const formatFileSize = (bytes: number): string => {
354
354
  align-items: center;
355
355
  justify-content: space-between;
356
356
  padding: 0.75rem;
357
- background-color: var(--dm-neutral-50, #f9fafb);
358
- border: 1px solid var(--dm-neutral-200, #e5e7eb);
357
+ background-color: var(--dm-bg-secondary, #f9fafb);
358
+ border: 1px solid var(--dm-border-color, #e5e7eb);
359
359
  border-radius: var(--dm-radius-md, 0.375rem);
360
360
  margin-bottom: 0.5rem;
361
361
  }
@@ -368,12 +368,12 @@ const formatFileSize = (bytes: number): string => {
368
368
 
369
369
  .dm-file-upload__file-name {
370
370
  font-weight: 500;
371
- color: var(--dm-neutral-700, #374151);
371
+ color: var(--dm-text-primary, #374151);
372
372
  }
373
373
 
374
374
  .dm-file-upload__file-size {
375
375
  font-size: 0.875rem;
376
- color: var(--dm-neutral-500, #6b7280);
376
+ color: var(--dm-text-secondary, #6b7280);
377
377
  }
378
378
 
379
379
  .dm-file-upload__remove {
@@ -179,22 +179,22 @@ defineExpose({
179
179
  margin-bottom: 4px;
180
180
  font-size: 14px;
181
181
  font-weight: 500;
182
- color: var(--color-text-primary, #1f2937);
182
+ color: var(--dm-text-primary, #1f2937);
183
183
  }
184
184
 
185
185
  .datametria-input__required {
186
- color: var(--color-error, #ef4444);
186
+ color: var(--dm-error, #ef4444);
187
187
  margin-left: 2px;
188
188
  }
189
189
 
190
190
  .datametria-input__error {
191
191
  margin-top: 4px;
192
192
  font-size: 12px;
193
- color: var(--color-error, #ef4444);
193
+ color: var(--dm-error, #ef4444);
194
194
  }
195
195
 
196
196
  .datametria-input__field--error {
197
- border-color: var(--color-error, #ef4444) !important;
197
+ border-color: var(--dm-error, #ef4444) !important;
198
198
  }
199
199
 
200
200
  .datametria-input {
@@ -209,23 +209,23 @@ defineExpose({
209
209
  display: inline-flex;
210
210
  align-items: center;
211
211
  width: 100%;
212
- background: var(--color-background, #ffffff);
213
- border: 1px solid var(--color-border, #d1d5db);
212
+ background: var(--dm-bg-color, #ffffff);
213
+ border: 1px solid var(--dm-border-color, #d1d5db);
214
214
  border-radius: 6px;
215
215
  transition: all 0.2s;
216
216
  }
217
217
 
218
218
  .datametria-input__inner:hover {
219
- border-color: var(--color-primary, #3b82f6);
219
+ border-color: var(--dm-primary, #3b82f6);
220
220
  }
221
221
 
222
222
  .datametria-input--focused .datametria-input__inner {
223
- border-color: var(--color-primary, #3b82f6);
223
+ border-color: var(--dm-primary, #3b82f6);
224
224
  box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1);
225
225
  }
226
226
 
227
227
  .datametria-input--disabled .datametria-input__inner {
228
- background: var(--color-background-disabled, #f3f4f6);
228
+ background: var(--dm-bg-disabled, #f3f4f6);
229
229
  cursor: not-allowed;
230
230
  opacity: 0.6;
231
231
  }
@@ -237,7 +237,7 @@ defineExpose({
237
237
  border: none;
238
238
  outline: none;
239
239
  background: transparent;
240
- color: var(--color-text-primary, #1f2937);
240
+ color: var(--dm-text-primary, #1f2937);
241
241
  font-size: inherit;
242
242
  }
243
243
 
@@ -250,7 +250,7 @@ defineExpose({
250
250
  display: inline-flex;
251
251
  align-items: center;
252
252
  padding: 0 8px;
253
- color: var(--color-text-secondary, #6b7280);
253
+ color: var(--dm-text-secondary, #6b7280);
254
254
  }
255
255
 
256
256
  .datametria-input__clear {
@@ -258,14 +258,14 @@ defineExpose({
258
258
  border: none;
259
259
  font-size: 18px;
260
260
  line-height: 1;
261
- color: var(--color-text-secondary, #6b7280);
261
+ color: var(--dm-text-secondary, #6b7280);
262
262
  cursor: pointer;
263
263
  padding: 0 4px;
264
264
  transition: color 0.2s;
265
265
  }
266
266
 
267
267
  .datametria-input__clear:hover {
268
- color: var(--color-text-primary, #1f2937);
268
+ color: var(--dm-text-primary, #1f2937);
269
269
  }
270
270
 
271
271
  .datametria-input__prepend,
@@ -273,8 +273,8 @@ defineExpose({
273
273
  display: inline-flex;
274
274
  align-items: center;
275
275
  padding: 0 12px;
276
- background: var(--color-background-secondary, #f9fafb);
277
- border: 1px solid var(--color-border, #d1d5db);
276
+ background: var(--dm-bg-secondary, #f9fafb);
277
+ border: 1px solid var(--dm-border-color, #d1d5db);
278
278
  white-space: nowrap;
279
279
  }
280
280
 
@@ -243,7 +243,7 @@ watch(strength, (newStrength) => {
243
243
  .datametria-password-input__label {
244
244
  font-size: var(--dm-font-size-sm, 0.875rem);
245
245
  font-weight: var(--dm-font-weight-medium, 500);
246
- color: var(--dm-neutral-700, #374151);
246
+ color: var(--dm-text-primary, #374151);
247
247
  }
248
248
 
249
249
  .datametria-password-input__required {
@@ -260,9 +260,11 @@ watch(strength, (newStrength) => {
260
260
  width: 100%;
261
261
  padding: var(--dm-spacing-3, 0.75rem);
262
262
  padding-right: var(--dm-spacing-12, 3rem);
263
- border: 1px solid var(--dm-neutral-300, #d1d5db);
263
+ border: 1px solid var(--dm-border-color, #d1d5db);
264
264
  border-radius: var(--dm-radius-md, 0.375rem);
265
265
  font-size: var(--dm-font-size-base, 1rem);
266
+ background: var(--dm-bg-color, #ffffff);
267
+ color: var(--dm-text-primary, #111827);
266
268
  transition: all var(--dm-transition-base, 0.2s);
267
269
  }
268
270
 
@@ -282,7 +284,7 @@ watch(strength, (newStrength) => {
282
284
  }
283
285
 
284
286
  .datametria-password-input__field--disabled {
285
- background: var(--dm-neutral-100, #f3f4f6);
287
+ background: var(--dm-bg-disabled, #f3f4f6);
286
288
  cursor: not-allowed;
287
289
  }
288
290
 
@@ -293,12 +295,12 @@ watch(strength, (newStrength) => {
293
295
  border: none;
294
296
  cursor: pointer;
295
297
  padding: var(--dm-spacing-1, 0.25rem);
296
- color: var(--dm-neutral-500, #6b7280);
298
+ color: var(--dm-text-secondary, #6b7280);
297
299
  transition: color var(--dm-transition-base, 0.2s);
298
300
  }
299
301
 
300
302
  .datametria-password-input__toggle:hover {
301
- color: var(--dm-neutral-700, #374151);
303
+ color: var(--dm-text-primary, #374151);
302
304
  }
303
305
 
304
306
  .datametria-password-input__toggle:focus {
@@ -327,7 +329,7 @@ watch(strength, (newStrength) => {
327
329
  .datametria-password-input__strength-bar {
328
330
  flex: 1;
329
331
  height: var(--dm-spacing-2, 0.5rem);
330
- background: var(--dm-neutral-200, #e5e7eb);
332
+ background: var(--dm-bg-secondary, #e5e7eb);
331
333
  border-radius: var(--dm-radius-sm, 0.25rem);
332
334
  overflow: hidden;
333
335
  }
@@ -378,15 +380,15 @@ watch(strength, (newStrength) => {
378
380
 
379
381
  .datametria-password-input__requirements {
380
382
  padding: var(--dm-spacing-3, 0.75rem);
381
- background: var(--dm-neutral-50, #f9fafb);
382
- border: 1px solid var(--dm-neutral-200, #e5e7eb);
383
+ background: var(--dm-bg-secondary, #f9fafb);
384
+ border: 1px solid var(--dm-border-color, #e5e7eb);
383
385
  border-radius: var(--dm-radius-md, 0.375rem);
384
386
  }
385
387
 
386
388
  .datametria-password-input__requirements-title {
387
389
  font-size: var(--dm-font-size-sm, 0.875rem);
388
390
  font-weight: var(--dm-font-weight-medium, 500);
389
- color: var(--dm-neutral-700, #374151);
391
+ color: var(--dm-text-primary, #374151);
390
392
  margin: 0 0 var(--dm-spacing-2, 0.5rem) 0;
391
393
  }
392
394
 
@@ -401,7 +403,7 @@ watch(strength, (newStrength) => {
401
403
 
402
404
  .datametria-password-input__requirements-list li {
403
405
  font-size: var(--dm-font-size-sm, 0.875rem);
404
- color: var(--dm-neutral-500, #6b7280);
406
+ color: var(--dm-text-secondary, #6b7280);
405
407
  display: flex;
406
408
  align-items: center;
407
409
  gap: var(--dm-spacing-2, 0.5rem);
@@ -424,7 +426,7 @@ watch(strength, (newStrength) => {
424
426
 
425
427
  .datametria-password-input__help {
426
428
  font-size: var(--dm-font-size-sm, 0.875rem);
427
- color: var(--dm-neutral-500, #6b7280);
429
+ color: var(--dm-text-secondary, #6b7280);
428
430
  margin: 0;
429
431
  }
430
432
 
@@ -115,7 +115,7 @@ defineExpose({
115
115
  }
116
116
 
117
117
  .datametria-radio.is-checked .datametria-radio__inner {
118
- border-color: var(--dm-color-primary, #0072ce);
118
+ border-color: var(--dm-primary, #0072ce);
119
119
  }
120
120
 
121
121
  .datametria-radio.is-checked .datametria-radio__inner::after {
@@ -126,7 +126,7 @@ defineExpose({
126
126
  width: 8px;
127
127
  height: 8px;
128
128
  border-radius: 50%;
129
- background-color: var(--dm-color-primary, #0072ce);
129
+ background-color: var(--dm-primary, #0072ce);
130
130
  transform: translate(-50%, -50%);
131
131
  }
132
132
 
@@ -1,60 +1,42 @@
1
- <template>
2
- <div class="datametria-radio-group" role="radiogroup">
3
- <slot></slot>
4
- </div>
5
- </template>
6
-
7
- <script setup lang="ts">
8
- import { provide, computed } from 'vue'
9
-
10
- interface Props {
11
- modelValue?: string | number | boolean
12
- disabled?: boolean
13
- }
14
-
15
- const props = withDefaults(defineProps<Props>(), {
16
- disabled: false
17
- })
18
-
19
- const emit = defineEmits<{
20
- 'update:modelValue': [value: string | number | boolean]
21
- change: [value: string | number | boolean]
22
- }>()
23
-
24
- const updateValue = (value: string | number | boolean) => {
25
- emit('update:modelValue', value)
26
- emit('change', value)
27
- }
28
-
29
- provide('radioGroup', {
30
- modelValue: computed(() => props.modelValue),
31
- disabled: computed(() => props.disabled),
32
- updateValue
33
- })
34
- </script>
35
-
36
- <style scoped>
37
- .datametria-radio-group {
38
- display: inline-flex;
39
- flex-wrap: wrap;
40
- gap: 12px;
41
- }
1
+ <template>
2
+ <div class="datametria-radio-group" role="radiogroup">
3
+ <slot></slot>
4
+ </div>
5
+ </template>
42
6
 
43
- /* Dark Mode Support - Hybrid Approach */
7
+ <script setup lang="ts">
8
+ import { provide, computed } from 'vue'
44
9
 
45
- /* Fallback automático (sem JS) */
46
- @media (prefers-color-scheme: dark) {
47
- .datametria-radio-group {
48
- background: var(--dm-bg-color-dark, #1e1e1e);
49
- color: var(--dm-text-primary-dark, #e0e0e0);
50
- border-color: var(--dm-border-color-dark, #404040);
51
- }
10
+ interface Props {
11
+ modelValue?: string | number | boolean
12
+ disabled?: boolean
52
13
  }
53
14
 
54
- /* Controle manual via useTheme() */
55
- [data-theme="dark"] .datametria-radio-group {
56
- background: var(--dm-bg-color-dark, #1e1e1e);
57
- color: var(--dm-text-primary-dark, #e0e0e0);
58
- border-color: var(--dm-border-color-dark, #404040);
15
+ const props = withDefaults(defineProps<Props>(), {
16
+ disabled: false
17
+ })
18
+
19
+ const emit = defineEmits<{
20
+ 'update:modelValue': [value: string | number | boolean]
21
+ change: [value: string | number | boolean]
22
+ }>()
23
+
24
+ const updateValue = (value: string | number | boolean) => {
25
+ emit('update:modelValue', value)
26
+ emit('change', value)
27
+ }
28
+
29
+ provide('radioGroup', {
30
+ modelValue: computed(() => props.modelValue),
31
+ disabled: computed(() => props.disabled),
32
+ updateValue
33
+ })
34
+ </script>
35
+
36
+ <style scoped>
37
+ .datametria-radio-group {
38
+ display: inline-flex;
39
+ flex-wrap: wrap;
40
+ gap: 12px;
59
41
  }
60
- </style>
42
+ </style>
@@ -6,7 +6,7 @@
6
6
  <span v-if="required" class="datametria-select__required">*</span>
7
7
  </label>
8
8
 
9
- <div ref="triggerRef" class="datametria-select__trigger" @click="toggleDropdown">
9
+ <div ref="triggerRef" class="datametria-select__trigger" @click.stop="toggleDropdown">
10
10
  <span v-if="displayValue" class="datametria-select__value">{{ displayValue }}</span>
11
11
  <span v-else class="datametria-select__placeholder">{{ placeholder }}</span>
12
12
  <span class="datametria-select__arrow">▼</span>
@@ -203,18 +203,18 @@ onUnmounted(() => {
203
203
  margin-bottom: 4px;
204
204
  font-size: 14px;
205
205
  font-weight: 500;
206
- color: var(--color-text-primary, #1f2937);
206
+ color: var(--dm-text-primary, #1f2937);
207
207
  }
208
208
 
209
209
  .datametria-select__required {
210
- color: var(--color-error, #ef4444);
210
+ color: var(--dm-error, #ef4444);
211
211
  margin-left: 2px;
212
212
  }
213
213
 
214
214
  .datametria-select__error {
215
215
  margin-top: 4px;
216
216
  font-size: 12px;
217
- color: var(--color-error, #ef4444);
217
+ color: var(--dm-error, #ef4444);
218
218
  }
219
219
 
220
220
  .datametria-select {
@@ -227,15 +227,15 @@ onUnmounted(() => {
227
227
  align-items: center;
228
228
  justify-content: space-between;
229
229
  padding: 8px 12px;
230
- border: 1px solid var(--color-border, #d1d5db);
230
+ border: 1px solid var(--dm-border-color, #d1d5db);
231
231
  border-radius: 6px;
232
- background: var(--color-background, #fff);
232
+ background: var(--dm-bg-color, #fff);
233
233
  cursor: pointer;
234
234
  transition: all 0.2s;
235
235
  }
236
236
 
237
237
  .datametria-select__trigger:hover {
238
- border-color: var(--color-primary, #3b82f6);
238
+ border-color: var(--dm-primary, #3b82f6);
239
239
  }
240
240
 
241
241
  .is-disabled .datametria-select__trigger {
@@ -244,7 +244,7 @@ onUnmounted(() => {
244
244
  }
245
245
 
246
246
  .datametria-select__placeholder {
247
- color: var(--color-text-secondary, #9ca3af);
247
+ color: var(--dm-text-secondary, #9ca3af);
248
248
  }
249
249
 
250
250
  .datametria-select__arrow {
@@ -255,8 +255,8 @@ onUnmounted(() => {
255
255
  .datametria-select__dropdown {
256
256
  position: fixed;
257
257
  z-index: 2000;
258
- background: var(--color-background, #fff);
259
- border: 1px solid var(--color-border, #d1d5db);
258
+ background: var(--dm-bg-color, #fff);
259
+ border: 1px solid var(--dm-border-color, #d1d5db);
260
260
  border-radius: 6px;
261
261
  box-shadow: 0 4px 12px rgba(0,0,0,0.15);
262
262
  max-height: 300px;
@@ -267,7 +267,7 @@ onUnmounted(() => {
267
267
  width: 100%;
268
268
  padding: 8px 12px;
269
269
  border: none;
270
- border-bottom: 1px solid var(--color-border, #d1d5db);
270
+ border-bottom: 1px solid var(--dm-border-color, #d1d5db);
271
271
  outline: none;
272
272
  }
273
273
 
@@ -283,18 +283,18 @@ onUnmounted(() => {
283
283
  }
284
284
 
285
285
  .datametria-select__option:hover {
286
- background: var(--color-background-hover, #f3f4f6);
286
+ background: var(--dm-bg-hover, #f3f4f6);
287
287
  }
288
288
 
289
289
  .datametria-select__option.is-selected {
290
- background: var(--color-primary-light, #dbeafe);
291
- color: var(--color-primary, #3b82f6);
290
+ background: var(--dm-primary-light, #dbeafe);
291
+ color: var(--dm-primary, #3b82f6);
292
292
  }
293
293
 
294
294
  .datametria-select__empty {
295
295
  padding: 16px;
296
296
  text-align: center;
297
- color: var(--color-text-secondary, #9ca3af);
297
+ color: var(--dm-text-secondary, #9ca3af);
298
298
  }
299
299
 
300
300
  /* Dark Mode Support - Hybrid Approach */