@datametria/vue-components 2.2.0 → 2.3.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 (78) hide show
  1. package/README.md +25 -7
  2. package/dist/index.es.js +3378 -2148
  3. package/dist/index.umd.js +9 -9
  4. package/dist/src/components/DatametriaAutocomplete.vue.d.ts +14 -17
  5. package/dist/src/components/DatametriaBreadcrumb.vue.d.ts +39 -7
  6. package/dist/src/components/DatametriaCheckbox.vue.d.ts +35 -6
  7. package/dist/src/components/DatametriaCheckboxGroup.vue.d.ts +30 -0
  8. package/dist/src/components/DatametriaDataTable.vue.d.ts +64 -0
  9. package/dist/src/components/DatametriaDatePicker.vue.d.ts +15 -37
  10. package/dist/src/components/DatametriaDialog.vue.d.ts +71 -0
  11. package/dist/src/components/DatametriaEmpty.vue.d.ts +30 -0
  12. package/dist/src/components/DatametriaFloatingBar.vue.d.ts +2 -2
  13. package/dist/src/components/DatametriaForm.vue.d.ts +40 -0
  14. package/dist/src/components/DatametriaFormItem.vue.d.ts +28 -0
  15. package/dist/src/components/DatametriaGrid.vue.d.ts +1 -1
  16. package/dist/src/components/DatametriaInput.vue.d.ts +69 -10
  17. package/dist/src/components/DatametriaMenu.vue.d.ts +3 -3
  18. package/dist/src/components/DatametriaNavbar.vue.d.ts +2 -2
  19. package/dist/src/components/DatametriaPagination.vue.d.ts +29 -0
  20. package/dist/src/components/DatametriaPopconfirm.vue.d.ts +43 -0
  21. package/dist/src/components/DatametriaProgress.vue.d.ts +33 -8
  22. package/dist/src/components/DatametriaRadio.vue.d.ts +25 -6
  23. package/dist/src/components/DatametriaRadioGroup.vue.d.ts +29 -0
  24. package/dist/src/components/DatametriaResult.vue.d.ts +30 -0
  25. package/dist/src/components/DatametriaSelect.vue.d.ts +16 -11
  26. package/dist/src/components/DatametriaSidebar.vue.d.ts +3 -3
  27. package/dist/src/components/DatametriaSlider.vue.d.ts +3 -3
  28. package/dist/src/components/DatametriaSortableTable.vue.d.ts +1 -1
  29. package/dist/src/components/DatametriaSteps.vue.d.ts +45 -0
  30. package/dist/src/components/DatametriaSwitch.vue.d.ts +9 -4
  31. package/dist/src/components/DatametriaTabPane.vue.d.ts +28 -0
  32. package/dist/src/components/DatametriaTextarea.vue.d.ts +27 -8
  33. package/dist/src/components/DatametriaTimePicker.vue.d.ts +17 -25
  34. package/dist/src/components/DatametriaToast.vue.d.ts +1 -1
  35. package/dist/src/components/DatametriaTooltip.vue.d.ts +1 -1
  36. package/dist/src/components/DatametriaTree.vue.d.ts +31 -0
  37. package/dist/src/components/DatametriaTreeNode.vue.d.ts +17 -0
  38. package/dist/src/components/DatametriaUpload.vue.d.ts +64 -0
  39. package/dist/src/index.d.ts +14 -0
  40. package/dist/vue-components.css +1 -1
  41. package/package.json +8 -10
  42. package/src/components/DatametriaAutocomplete.vue +155 -260
  43. package/src/components/DatametriaBreadcrumb.vue +66 -80
  44. package/src/components/DatametriaCheckbox.vue +150 -37
  45. package/src/components/DatametriaCheckboxGroup.vue +43 -0
  46. package/src/components/DatametriaDataTable.vue +304 -0
  47. package/src/components/DatametriaDatePicker.vue +238 -614
  48. package/src/components/DatametriaDialog.vue +295 -0
  49. package/src/components/DatametriaDropdown.vue +352 -0
  50. package/src/components/DatametriaEmpty.vue +153 -0
  51. package/src/components/DatametriaForm.vue +160 -0
  52. package/src/components/DatametriaFormItem.vue +181 -0
  53. package/src/components/DatametriaInput.vue +226 -63
  54. package/src/components/DatametriaPagination.vue +373 -0
  55. package/src/components/DatametriaPopconfirm.vue +236 -0
  56. package/src/components/DatametriaProgress.vue +176 -63
  57. package/src/components/DatametriaRadio.vue +83 -72
  58. package/src/components/DatametriaRadioGroup.vue +42 -0
  59. package/src/components/DatametriaResult.vue +133 -0
  60. package/src/components/DatametriaSelect.vue +172 -67
  61. package/src/components/DatametriaSortableTable.vue +35 -4
  62. package/src/components/DatametriaSteps.vue +314 -0
  63. package/src/components/DatametriaSwitch.vue +86 -80
  64. package/src/components/DatametriaTabPane.vue +82 -0
  65. package/src/components/DatametriaTextarea.vue +140 -100
  66. package/src/components/DatametriaTimePicker.vue +231 -214
  67. package/src/components/DatametriaTree.vue +124 -0
  68. package/src/components/DatametriaTreeNode.vue +174 -0
  69. package/src/components/DatametriaUpload.vue +365 -0
  70. package/src/index.ts +25 -11
  71. package/src/components/__tests__/DatametriaAutocomplete.test.ts +0 -180
  72. package/src/components/__tests__/DatametriaBreadcrumb.test.ts +0 -75
  73. package/src/components/__tests__/DatametriaCheckbox.test.ts +0 -47
  74. package/src/components/__tests__/DatametriaDatePicker.test.ts +0 -234
  75. package/src/components/__tests__/DatametriaProgress.test.ts +0 -90
  76. package/src/components/__tests__/DatametriaRadio.test.ts +0 -77
  77. package/src/components/__tests__/DatametriaSwitch.test.ts +0 -64
  78. package/src/components/__tests__/DatametriaTextarea.test.ts +0 -66
@@ -1,32 +1,27 @@
1
1
  <template>
2
- <nav class="dm-breadcrumb" aria-label="Breadcrumb">
3
- <ol class="dm-breadcrumb__list">
2
+ <nav class="datametria-breadcrumb" aria-label="Breadcrumb">
3
+ <ol class="datametria-breadcrumb__list">
4
4
  <li
5
5
  v-for="(item, index) in items"
6
6
  :key="index"
7
- class="dm-breadcrumb__item"
7
+ class="datametria-breadcrumb__item"
8
+ :class="{ 'is-last': index === items.length - 1 }"
8
9
  >
9
- <a
10
- v-if="item.href && index < items.length - 1"
11
- :href="item.href"
12
- class="dm-breadcrumb__link"
13
- @click="handleClick($event, item, index)"
14
- >
15
- {{ item.label }}
16
- </a>
17
- <span
18
- v-else
19
- class="dm-breadcrumb__current"
10
+ <component
11
+ :is="item.to ? 'router-link' : 'span'"
12
+ :to="item.to"
13
+ class="datametria-breadcrumb__link"
14
+ :class="{ 'is-active': index === items.length - 1 }"
20
15
  :aria-current="index === items.length - 1 ? 'page' : undefined"
21
16
  >
22
17
  {{ item.label }}
23
- </span>
18
+ </component>
24
19
  <span
25
20
  v-if="index < items.length - 1"
26
- class="dm-breadcrumb__separator"
21
+ class="datametria-breadcrumb__separator"
27
22
  aria-hidden="true"
28
23
  >
29
- {{ separator }}
24
+ <slot name="separator">{{ separator }}</slot>
30
25
  </span>
31
26
  </li>
32
27
  </ol>
@@ -34,111 +29,102 @@
34
29
  </template>
35
30
 
36
31
  <script setup lang="ts">
37
- interface BreadcrumbItem {
32
+ import { withDefaults } from 'vue'
33
+
34
+ /**
35
+ * DatametriaBreadcrumb - Componente de navegação breadcrumb
36
+ *
37
+ * @component
38
+ * @example
39
+ * <DatametriaBreadcrumb
40
+ * :items="[
41
+ * { label: 'Home', to: '/' },
42
+ * { label: 'Produtos', to: '/produtos' },
43
+ * { label: 'Detalhes' }
44
+ * ]"
45
+ * separator="/"
46
+ * />
47
+ */
48
+
49
+ export interface BreadcrumbItem {
50
+ /** Label do item */
38
51
  label: string
39
- href?: string
52
+ /** Rota do Vue Router (opcional) */
53
+ to?: string | { name: string; params?: Record<string, any> }
40
54
  }
41
55
 
42
56
  interface Props {
57
+ /** Array de itens do breadcrumb */
43
58
  items: BreadcrumbItem[]
59
+ /** Separador entre itens */
44
60
  separator?: string
45
61
  }
46
62
 
47
- withDefaults(defineProps<Props>(), {
63
+ const props = withDefaults(defineProps<Props>(), {
48
64
  separator: '/'
49
65
  })
50
-
51
- const emit = defineEmits<{
52
- click: [item: BreadcrumbItem, index: number]
53
- }>()
54
-
55
- const handleClick = (_event: Event, item: BreadcrumbItem, index: number) => {
56
- emit('click', item, index)
57
- }
58
66
  </script>
59
67
 
60
68
  <style scoped>
61
- .dm-breadcrumb {
62
- display: block;
69
+ .datametria-breadcrumb {
70
+ font-size: 14px;
71
+ line-height: 1;
63
72
  }
64
73
 
65
- .dm-breadcrumb__list {
74
+ .datametria-breadcrumb__list {
66
75
  display: flex;
67
- flex-wrap: wrap;
68
76
  align-items: center;
69
- gap: var(--dm-spacing-2, 0.5rem);
70
77
  list-style: none;
71
78
  margin: 0;
72
79
  padding: 0;
80
+ flex-wrap: wrap;
73
81
  }
74
82
 
75
- .dm-breadcrumb__item {
83
+ .datametria-breadcrumb__item {
76
84
  display: flex;
77
85
  align-items: center;
78
- gap: var(--dm-spacing-2, 0.5rem);
79
86
  }
80
87
 
81
- .dm-breadcrumb__link {
82
- color: var(--dm-primary, #0072CE);
88
+ .datametria-breadcrumb__link {
89
+ color: var(--datametria-text-secondary, #606266);
83
90
  text-decoration: none;
84
- font-size: var(--dm-font-size-sm, 0.875rem);
85
- transition: all 0.2s;
86
- padding: var(--dm-spacing-1, 0.25rem) var(--dm-spacing-2, 0.5rem);
87
- border-radius: var(--dm-radius-md, 0.375rem);
88
- min-height: 32px;
89
- display: inline-flex;
90
- align-items: center;
91
+ transition: color 0.2s;
92
+ font-weight: 400;
91
93
  }
92
94
 
93
- .dm-breadcrumb__link:hover {
94
- text-decoration: underline;
95
- background: var(--dm-neutral-100, #f3f4f6);
95
+ .datametria-breadcrumb__link:not(.is-active):hover {
96
+ color: var(--datametria-primary, #0072ce);
97
+ cursor: pointer;
96
98
  }
97
99
 
98
- .dm-breadcrumb__link:focus-visible {
99
- outline: 2px solid var(--dm-primary, #0072CE);
100
- outline-offset: 2px;
100
+ .datametria-breadcrumb__link.is-active {
101
+ color: var(--datametria-text-primary, #303133);
102
+ font-weight: 500;
103
+ cursor: default;
101
104
  }
102
105
 
103
- .dm-breadcrumb__current {
104
- color: var(--dm-neutral-900, #111827);
105
- font-size: var(--dm-font-size-sm, 0.875rem);
106
- font-weight: var(--dm-font-weight-medium, 500);
107
- padding: var(--dm-spacing-1, 0.25rem) var(--dm-spacing-2, 0.5rem);
108
- }
109
-
110
- .dm-breadcrumb__separator {
111
- color: var(--dm-neutral-400, #9ca3af);
112
- font-size: var(--dm-font-size-sm, 0.875rem);
106
+ .datametria-breadcrumb__separator {
107
+ margin: 0 8px;
108
+ color: var(--datametria-text-placeholder, #c0c4cc);
113
109
  user-select: none;
114
110
  }
115
111
 
116
- @media (max-width: 640px) {
117
- .dm-breadcrumb__list {
118
- gap: var(--dm-spacing-1, 0.25rem);
119
- }
120
-
121
- .dm-breadcrumb__item {
122
- gap: var(--dm-spacing-1, 0.25rem);
123
- }
124
-
125
- .dm-breadcrumb__link,
126
- .dm-breadcrumb__current {
127
- font-size: var(--dm-font-size-xs, 0.75rem);
112
+ /* Dark mode */
113
+ @media (prefers-color-scheme: dark) {
114
+ .datametria-breadcrumb__link {
115
+ color: var(--datametria-text-secondary-dark, #909399);
128
116
  }
129
- }
130
117
 
131
- @media (prefers-color-scheme: dark) {
132
- .dm-breadcrumb__link:hover {
133
- background: var(--dm-neutral-800, #1f2937);
118
+ .datametria-breadcrumb__link:not(.is-active):hover {
119
+ color: var(--datametria-primary-dark, #409eff);
134
120
  }
135
121
 
136
- .dm-breadcrumb__current {
137
- color: white;
122
+ .datametria-breadcrumb__link.is-active {
123
+ color: var(--datametria-text-primary-dark, #e5eaf3);
138
124
  }
139
125
 
140
- .dm-breadcrumb__separator {
141
- color: var(--dm-neutral-600, #4b5563);
126
+ .datametria-breadcrumb__separator {
127
+ color: var(--datametria-text-placeholder-dark, #606266);
142
128
  }
143
129
  }
144
130
  </style>
@@ -1,82 +1,195 @@
1
1
  <template>
2
- <label class="datametria-checkbox">
3
- <input
4
- type="checkbox"
5
- :checked="modelValue"
6
- :disabled="disabled"
7
- class="datametria-checkbox__input"
8
- @change="$emit('update:modelValue', ($event.target as HTMLInputElement).checked)"
9
- />
10
- <span class="datametria-checkbox__checkmark"></span>
11
- <span v-if="label" class="datametria-checkbox__label">{{ label }}</span>
2
+ <label
3
+ class="datametria-checkbox"
4
+ :class="{
5
+ 'is-checked': isChecked,
6
+ 'is-disabled': disabled,
7
+ 'is-indeterminate': indeterminate
8
+ }"
9
+ >
10
+ <span class="datametria-checkbox__input">
11
+ <input
12
+ ref="inputRef"
13
+ type="checkbox"
14
+ :checked="isChecked"
15
+ :disabled="disabled"
16
+ :indeterminate="indeterminate"
17
+ @change="handleChange"
18
+ />
19
+ <span class="datametria-checkbox__inner"></span>
20
+ </span>
21
+ <span v-if="label || $slots.default" class="datametria-checkbox__label">
22
+ <slot>{{ label }}</slot>
23
+ </span>
12
24
  </label>
13
25
  </template>
14
26
 
15
27
  <script setup lang="ts">
28
+ import { ref, computed, watch, inject } from 'vue'
29
+
16
30
  interface Props {
17
- modelValue?: boolean
31
+ modelValue?: boolean | string | number
18
32
  label?: string
19
33
  disabled?: boolean
34
+ indeterminate?: boolean
35
+ trueValue?: boolean | string | number
36
+ falseValue?: boolean | string | number
20
37
  }
21
38
 
22
- withDefaults(defineProps<Props>(), {
39
+ const props = withDefaults(defineProps<Props>(), {
23
40
  modelValue: false,
24
- disabled: false
41
+ disabled: false,
42
+ indeterminate: false,
43
+ trueValue: true,
44
+ falseValue: false
25
45
  })
26
46
 
27
- defineEmits<{
28
- 'update:modelValue': [value: boolean]
47
+ const emit = defineEmits<{
48
+ 'update:modelValue': [value: boolean | string | number | (string | number)[]]
49
+ change: [value: boolean | string | number | (string | number)[]]
29
50
  }>()
51
+
52
+ const inputRef = ref<HTMLInputElement>()
53
+ const checkboxGroup = inject<any>('checkboxGroup', null)
54
+
55
+ const isChecked = computed(() => {
56
+ if (checkboxGroup) {
57
+ return checkboxGroup.modelValue.value.includes(props.modelValue)
58
+ }
59
+ return props.modelValue === props.trueValue
60
+ })
61
+
62
+ const handleChange = (e: Event) => {
63
+ if (props.disabled) return
64
+
65
+ const target = e.target as HTMLInputElement
66
+ const checked = target.checked
67
+
68
+ if (checkboxGroup) {
69
+ const value = [...checkboxGroup.modelValue.value]
70
+ if (checked) {
71
+ value.push(props.modelValue)
72
+ } else {
73
+ const index = value.indexOf(props.modelValue)
74
+ if (index > -1) value.splice(index, 1)
75
+ }
76
+ checkboxGroup.updateValue(value)
77
+ emit('update:modelValue', value)
78
+ emit('change', value)
79
+ } else {
80
+ const newValue = checked ? props.trueValue : props.falseValue
81
+ emit('update:modelValue', newValue)
82
+ emit('change', newValue)
83
+ }
84
+ }
85
+
86
+ watch(() => props.indeterminate, (val) => {
87
+ if (inputRef.value) {
88
+ inputRef.value.indeterminate = val
89
+ }
90
+ }, { immediate: true })
91
+
92
+ defineExpose({
93
+ inputRef
94
+ })
30
95
  </script>
31
96
 
32
97
  <style scoped>
33
98
  .datametria-checkbox {
34
99
  display: inline-flex;
35
100
  align-items: center;
36
- gap: var(--dm-spacing-2, 0.5rem);
37
101
  cursor: pointer;
38
102
  user-select: none;
103
+ font-size: var(--dm-font-size-base, 14px);
104
+ color: var(--dm-text-primary, #333);
105
+ }
106
+
107
+ .datametria-checkbox.is-disabled {
108
+ cursor: not-allowed;
109
+ opacity: 0.5;
39
110
  }
40
111
 
41
112
  .datametria-checkbox__input {
113
+ position: relative;
114
+ display: inline-block;
115
+ width: 16px;
116
+ height: 16px;
117
+ }
118
+
119
+ .datametria-checkbox__input input {
42
120
  position: absolute;
43
121
  opacity: 0;
122
+ width: 100%;
123
+ height: 100%;
44
124
  cursor: pointer;
125
+ z-index: 1;
45
126
  }
46
127
 
47
- .datametria-checkbox__checkmark {
48
- position: relative;
49
- width: 1.25rem;
50
- height: 1.25rem;
51
- border: 2px solid var(--dm-neutral-300, #d1d5db);
52
- border-radius: var(--dm-radius-sm, 0.25rem);
128
+ .datametria-checkbox__input input:disabled {
129
+ cursor: not-allowed;
130
+ }
131
+
132
+ .datametria-checkbox__inner {
133
+ position: absolute;
134
+ top: 0;
135
+ left: 0;
136
+ width: 16px;
137
+ height: 16px;
138
+ border: 1px solid var(--dm-border-color, #dcdfe6);
139
+ border-radius: var(--dm-border-radius-small, 2px);
140
+ background-color: var(--dm-bg-color, #fff);
53
141
  transition: all 0.2s;
54
142
  }
55
143
 
56
- .datametria-checkbox__input:checked ~ .datametria-checkbox__checkmark {
57
- background: var(--dm-primary, #0072CE);
58
- border-color: var(--dm-primary, #0072CE);
144
+ .datametria-checkbox.is-checked .datametria-checkbox__inner {
145
+ background-color: var(--dm-color-primary, #0072ce);
146
+ border-color: var(--dm-color-primary, #0072ce);
59
147
  }
60
148
 
61
- .datametria-checkbox__input:checked ~ .datametria-checkbox__checkmark::after {
149
+ .datametria-checkbox.is-checked .datametria-checkbox__inner::after {
62
150
  content: '';
63
151
  position: absolute;
64
- left: 0.375rem;
65
- top: 0.125rem;
66
- width: 0.375rem;
67
- height: 0.625rem;
68
- border: solid white;
69
- border-width: 0 2px 2px 0;
152
+ top: 2px;
153
+ left: 5px;
154
+ width: 4px;
155
+ height: 8px;
156
+ border: 2px solid #fff;
157
+ border-top: 0;
158
+ border-left: 0;
70
159
  transform: rotate(45deg);
71
160
  }
72
161
 
73
- .datametria-checkbox__input:disabled ~ .datametria-checkbox__checkmark {
74
- background: var(--dm-neutral-100, #f3f4f6);
75
- cursor: not-allowed;
162
+ .datametria-checkbox.is-indeterminate .datametria-checkbox__inner {
163
+ background-color: var(--dm-color-primary, #0072ce);
164
+ border-color: var(--dm-color-primary, #0072ce);
165
+ }
166
+
167
+ .datametria-checkbox.is-indeterminate .datametria-checkbox__inner::after {
168
+ content: '';
169
+ position: absolute;
170
+ top: 6px;
171
+ left: 3px;
172
+ width: 8px;
173
+ height: 2px;
174
+ background-color: #fff;
175
+ transform: none;
176
+ border: none;
76
177
  }
77
178
 
78
179
  .datametria-checkbox__label {
79
- font-size: var(--dm-font-size-sm, 0.875rem);
80
- color: var(--dm-neutral-700, #374151);
180
+ margin-left: 8px;
181
+ line-height: 1;
182
+ }
183
+
184
+ /* Dark mode */
185
+ @media (prefers-color-scheme: dark) {
186
+ .datametria-checkbox {
187
+ color: var(--dm-text-primary-dark, #e0e0e0);
188
+ }
189
+
190
+ .datametria-checkbox__inner {
191
+ border-color: var(--dm-border-color-dark, #4a4a4a);
192
+ background-color: var(--dm-bg-color-dark, #1e1e1e);
193
+ }
81
194
  }
82
195
  </style>
@@ -0,0 +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
+ }
43
+ </style>