@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
@@ -1,240 +1,244 @@
1
- <template>
2
- <div
3
- class="datametria-skeleton"
4
- :class="[
5
- `datametria-skeleton--${variant}`,
6
- { 'datametria-skeleton--animated': animated }
7
- ]"
8
- :style="skeletonStyle"
9
- :aria-label="ariaLabel"
10
- role="status"
11
- aria-live="polite"
12
- >
13
- <div v-if="variant === 'text'" class="datametria-skeleton__text">
14
- <div
15
- v-for="line in lines"
16
- :key="line"
17
- class="datametria-skeleton__line shimmer"
18
- :style="getLineStyle(line)"
19
- ></div>
20
- </div>
21
-
22
- <div v-else-if="variant === 'avatar'" class="datametria-skeleton__avatar shimmer"></div>
23
-
24
- <div v-else-if="variant === 'card'" class="datametria-skeleton__card">
25
- <div class="datametria-skeleton__card-header shimmer"></div>
26
- <div class="datametria-skeleton__card-content">
27
- <div class="datametria-skeleton__line shimmer" style="width:100%"></div>
28
- <div class="datametria-skeleton__line shimmer" style="width:80%"></div>
29
- <div class="datametria-skeleton__line shimmer" style="width:60%"></div>
30
- </div>
31
- </div>
32
-
33
- <div v-else-if="variant === 'button'" class="datametria-skeleton__button shimmer"></div>
34
-
35
- <div v-else class="datametria-skeleton__custom shimmer"></div>
36
- </div>
37
- </template>
38
-
39
- <script setup lang="ts">
40
- import { computed } from 'vue'
41
-
42
- type SkeletonVariant = 'text' | 'avatar' | 'card' | 'button' | 'custom'
43
-
44
- interface Props {
45
- variant?: SkeletonVariant
46
- width?: string | number
47
- height?: string | number
48
- lines?: number
49
- animated?: boolean
50
- ariaLabel?: string
51
- lastLineWidth?: number
52
- }
53
-
54
- const props = withDefaults(defineProps<Props>(), {
55
- variant: 'text',
56
- lines: 3,
57
- animated: true,
58
- ariaLabel: 'Carregando conteúdo...',
59
- lastLineWidth: 75
60
- })
61
-
62
- // Computed
63
- const skeletonStyle = computed(() => {
64
- const style: Record<string, string> = {}
65
-
66
- if (props.width) {
67
- style.width = typeof props.width === 'number' ? `${props.width}px` : props.width
68
- }
69
-
70
- if (props.height) {
71
- style.height = typeof props.height === 'number' ? `${props.height}px` : props.height
72
- }
73
-
74
- return style
75
- })
76
-
77
- const getLineStyle = (lineNumber: number) => {
78
- // Use 100% for all lines except the last one
79
- const isLastLine = lineNumber === props.lines
80
- const width = isLastLine ? `${props.lastLineWidth}%` : '100%'
81
-
82
- return {
83
- width,
84
- marginBottom: lineNumber < props.lines ? '0.5rem' : '0'
85
- }
86
- }
87
- </script>
88
-
89
- <style scoped>
90
- .datametria-skeleton {
91
- @apply bg-gray-200 rounded;
92
- background-color: var(--dm-gray-200, #e5e7eb);
93
- border-radius: var(--dm-radius);
94
- }
95
-
96
- .datametria-skeleton--animated {
97
- background: linear-gradient(90deg,
98
- var(--dm-gray-200, #e5e7eb) 25%,
99
- var(--dm-gray-100, #f3f4f6) 50%,
100
- var(--dm-gray-200, #e5e7eb) 75%
101
- );
102
- background-size: 200% 100%;
103
- animation: shimmer var(--shimmer-duration, 1.5s) ease-in-out infinite;
104
- }
105
-
106
- [data-theme="dark"] .datametria-skeleton {
107
- background-color: var(--dm-gray-700, #374151);
108
- }
109
-
110
- [data-theme="dark"] .datametria-skeleton--animated {
111
- background: linear-gradient(90deg,
112
- var(--dm-gray-700, #374151) 25%,
113
- var(--dm-gray-600, #4b5563) 50%,
114
- var(--dm-gray-700, #374151) 75%
115
- );
116
- background-size: 200% 100%;
117
- }
118
-
119
- /* Shimmer class for individual elements */
120
- .shimmer {
121
- background: inherit;
122
- animation: inherit;
123
- }
124
-
125
- /* Text variant */
126
- .datametria-skeleton--text {
127
- @apply w-full;
128
- }
129
-
130
- .datametria-skeleton__text {
131
- @apply space-y-2;
132
- }
133
-
134
- .datametria-skeleton__line {
135
- @apply h-4 rounded;
136
- background: inherit;
137
- border-radius: var(--dm-radius);
138
- }
139
-
140
- /* Avatar variant */
141
- .datametria-skeleton--avatar {
142
- @apply w-12 h-12 rounded-full;
143
- }
144
-
145
- .datametria-skeleton__avatar {
146
- @apply w-full h-full rounded-full;
147
- background: inherit;
148
- }
149
-
150
- /* Card variant */
151
- .datametria-skeleton--card {
152
- @apply w-full p-4;
153
- }
154
-
155
- .datametria-skeleton__card-header {
156
- @apply h-6 w-3/4 mb-4 rounded;
157
- background: inherit;
158
- border-radius: var(--dm-radius);
159
- }
160
-
161
- .datametria-skeleton__card-content {
162
- @apply space-y-2;
163
- }
164
-
165
- .datametria-skeleton__card-content .datametria-skeleton__line {
166
- background: inherit;
167
- }
168
-
169
- /* Button variant */
170
- .datametria-skeleton--button {
171
- @apply h-10 w-24 rounded;
172
- }
173
-
174
- .datametria-skeleton__button {
175
- @apply w-full h-full rounded;
176
- background: inherit;
177
- border-radius: var(--dm-radius);
178
- }
179
-
180
- /* Custom variant */
181
- .datametria-skeleton--custom {
182
- @apply w-full h-4;
183
- }
184
-
185
- .datametria-skeleton__custom {
186
- @apply w-full h-full rounded;
187
- background: inherit;
188
- border-radius: var(--dm-radius);
189
- }
190
-
191
- /* Shimmer animation */
192
- @keyframes shimmer {
193
- 0% {
194
- background-position: -200% 0;
195
- }
196
- 100% {
197
- background-position: 200% 0;
198
- }
199
- }
200
-
201
- /* Reduced motion support */
202
- @media (prefers-reduced-motion: reduce) {
203
- .datametria-skeleton--animated {
204
- animation: none;
205
- background: var(--dm-gray-200, #e5e7eb);
206
- }
207
-
208
- [data-theme="dark"] .datametria-skeleton--animated {
209
- background: var(--dm-gray-700, #374151);
210
- }
211
- }
212
-
213
- /* High contrast mode support */
214
- @media (prefers-contrast: high) {
215
- .datametria-skeleton {
216
- @apply border border-gray-400;
217
- }
218
-
219
- [data-theme="dark"] .datametria-skeleton {
220
- @apply border-gray-500;
221
- }
222
- }
223
-
224
- /* Size variants */
225
- .datametria-skeleton--sm .datametria-skeleton__line {
226
- @apply h-3;
227
- }
228
-
229
- .datametria-skeleton--lg .datametria-skeleton__line {
230
- @apply h-5;
231
- }
232
-
233
- .datametria-skeleton--sm.datametria-skeleton--avatar {
234
- @apply w-8 h-8;
235
- }
236
-
237
- .datametria-skeleton--lg.datametria-skeleton--avatar {
238
- @apply w-16 h-16;
239
- }
1
+ <template>
2
+ <div
3
+ class="datametria-skeleton"
4
+ :class="[
5
+ `datametria-skeleton--${variant}`,
6
+ { 'datametria-skeleton--animated': animated }
7
+ ]"
8
+ :style="skeletonStyle"
9
+ :aria-label="ariaLabel"
10
+ role="status"
11
+ aria-live="polite"
12
+ >
13
+ <div v-if="variant === 'text'" class="datametria-skeleton__text">
14
+ <div
15
+ v-for="line in lines"
16
+ :key="line"
17
+ class="datametria-skeleton__line shimmer"
18
+ :style="getLineStyle(line)"
19
+ ></div>
20
+ </div>
21
+
22
+ <div v-else-if="variant === 'avatar'" class="datametria-skeleton__avatar shimmer"></div>
23
+
24
+ <div v-else-if="variant === 'card'" class="datametria-skeleton__card">
25
+ <div class="datametria-skeleton__card-header shimmer"></div>
26
+ <div class="datametria-skeleton__card-content">
27
+ <div class="datametria-skeleton__line shimmer" style="width:100%"></div>
28
+ <div class="datametria-skeleton__line shimmer" style="width:80%"></div>
29
+ <div class="datametria-skeleton__line shimmer" style="width:60%"></div>
30
+ </div>
31
+ </div>
32
+
33
+ <div v-else-if="variant === 'button'" class="datametria-skeleton__button shimmer"></div>
34
+
35
+ <div v-else class="datametria-skeleton__custom shimmer"></div>
36
+ </div>
37
+ </template>
38
+
39
+ <script setup lang="ts">
40
+ import { computed } from 'vue'
41
+
42
+ type SkeletonVariant = 'text' | 'avatar' | 'card' | 'button' | 'custom'
43
+
44
+ interface Props {
45
+ variant?: SkeletonVariant
46
+ width?: string | number
47
+ height?: string | number
48
+ lines?: number
49
+ animated?: boolean
50
+ ariaLabel?: string
51
+ lastLineWidth?: number
52
+ }
53
+
54
+ const props = withDefaults(defineProps<Props>(), {
55
+ variant: 'text',
56
+ lines: 3,
57
+ animated: true,
58
+ ariaLabel: 'Carregando conteúdo...',
59
+ lastLineWidth: 75
60
+ })
61
+
62
+ // Computed
63
+ const skeletonStyle = computed(() => {
64
+ const style: Record<string, string> = {}
65
+
66
+ if (props.width) {
67
+ style.width = typeof props.width === 'number' ? `${props.width}px` : props.width
68
+ }
69
+
70
+ if (props.height) {
71
+ style.height = typeof props.height === 'number' ? `${props.height}px` : props.height
72
+ }
73
+
74
+ return style
75
+ })
76
+
77
+ const getLineStyle = (lineNumber: number) => {
78
+ // Use 100% for all lines except the last one
79
+ const isLastLine = lineNumber === props.lines
80
+ const width = isLastLine ? `${props.lastLineWidth}%` : '100%'
81
+
82
+ return {
83
+ width,
84
+ marginBottom: lineNumber < props.lines ? '0.5rem' : '0'
85
+ }
86
+ }
87
+ </script>
88
+
89
+ <style scoped>
90
+ .datametria-skeleton {
91
+ background-color: var(--dm-neutral-200, #e5e7eb);
92
+ border-radius: var(--dm-radius-md, 0.375rem);
93
+ }
94
+
95
+ .datametria-skeleton--animated {
96
+ background: linear-gradient(90deg,
97
+ var(--dm-neutral-200, #e5e7eb) 25%,
98
+ var(--dm-neutral-100, #f3f4f6) 50%,
99
+ var(--dm-neutral-200, #e5e7eb) 75%
100
+ );
101
+ background-size: 200% 100%;
102
+ animation: shimmer 1.5s ease-in-out infinite;
103
+ }
104
+
105
+ [data-theme="dark"] .datametria-skeleton {
106
+ background-color: var(--dm-neutral-700, #374151);
107
+ }
108
+
109
+ [data-theme="dark"] .datametria-skeleton--animated {
110
+ background: linear-gradient(90deg,
111
+ var(--dm-neutral-700, #374151) 25%,
112
+ var(--dm-neutral-600, #4b5563) 50%,
113
+ var(--dm-neutral-700, #374151) 75%
114
+ );
115
+ background-size: 200% 100%;
116
+ }
117
+
118
+ /* Shimmer class for individual elements */
119
+ .shimmer {
120
+ background: inherit;
121
+ animation: inherit;
122
+ }
123
+
124
+ /* Text variant */
125
+ .datametria-skeleton--text {
126
+ @apply w-full;
127
+ }
128
+
129
+ .datametria-skeleton__text {
130
+ @apply space-y-2;
131
+ }
132
+
133
+ .datametria-skeleton__line {
134
+ height: 1rem;
135
+ background: inherit;
136
+ border-radius: var(--dm-radius-md, 0.375rem);
137
+ }
138
+
139
+ /* Avatar variant */
140
+ .datametria-skeleton--avatar {
141
+ @apply w-12 h-12 rounded-full;
142
+ }
143
+
144
+ .datametria-skeleton__avatar {
145
+ @apply w-full h-full rounded-full;
146
+ background: inherit;
147
+ }
148
+
149
+ /* Card variant */
150
+ .datametria-skeleton--card {
151
+ @apply w-full p-4;
152
+ }
153
+
154
+ .datametria-skeleton__card-header {
155
+ height: 1.5rem;
156
+ width: 75%;
157
+ margin-bottom: 1rem;
158
+ background: inherit;
159
+ border-radius: var(--dm-radius-md, 0.375rem);
160
+ }
161
+
162
+ .datametria-skeleton__card-content {
163
+ @apply space-y-2;
164
+ }
165
+
166
+ .datametria-skeleton__card-content .datametria-skeleton__line {
167
+ background: inherit;
168
+ }
169
+
170
+ /* Button variant */
171
+ .datametria-skeleton--button {
172
+ @apply h-10 w-24 rounded;
173
+ }
174
+
175
+ .datametria-skeleton__button {
176
+ width: 100%;
177
+ height: 100%;
178
+ background: inherit;
179
+ border-radius: var(--dm-radius-md, 0.375rem);
180
+ }
181
+
182
+ /* Custom variant */
183
+ .datametria-skeleton--custom {
184
+ width: 100%;
185
+ height: 1rem;
186
+ }
187
+
188
+ .datametria-skeleton__custom {
189
+ width: 100%;
190
+ height: 100%;
191
+ background: inherit;
192
+ border-radius: var(--dm-radius-md, 0.375rem);
193
+ }
194
+
195
+ /* Shimmer animation */
196
+ @keyframes shimmer {
197
+ 0% {
198
+ background-position: -200% 0;
199
+ }
200
+ 100% {
201
+ background-position: 200% 0;
202
+ }
203
+ }
204
+
205
+ /* Reduced motion support */
206
+ @media (prefers-reduced-motion: reduce) {
207
+ .datametria-skeleton--animated {
208
+ animation: none;
209
+ background: var(--dm-neutral-200, #e5e7eb);
210
+ }
211
+
212
+ [data-theme="dark"] .datametria-skeleton--animated {
213
+ background: var(--dm-neutral-700, #374151);
214
+ }
215
+ }
216
+
217
+ /* High contrast mode support */
218
+ @media (prefers-contrast: high) {
219
+ .datametria-skeleton {
220
+ @apply border border-gray-400;
221
+ }
222
+
223
+ [data-theme="dark"] .datametria-skeleton {
224
+ @apply border-gray-500;
225
+ }
226
+ }
227
+
228
+ /* Size variants */
229
+ .datametria-skeleton--sm .datametria-skeleton__line {
230
+ @apply h-3;
231
+ }
232
+
233
+ .datametria-skeleton--lg .datametria-skeleton__line {
234
+ @apply h-5;
235
+ }
236
+
237
+ .datametria-skeleton--sm.datametria-skeleton--avatar {
238
+ @apply w-8 h-8;
239
+ }
240
+
241
+ .datametria-skeleton--lg.datametria-skeleton--avatar {
242
+ @apply w-16 h-16;
243
+ }
240
244
  </style>