@datametria/vue-components 1.2.0 → 2.1.0

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 (103) hide show
  1. package/README.md +554 -657
  2. package/dist/index.es.js +2570 -1433
  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/DatametriaFloatingBar.vue +126 -0
  20. package/src/components/DatametriaGrid.vue +3 -3
  21. package/src/components/DatametriaInput.vue +15 -15
  22. package/src/components/DatametriaMenu.vue +604 -619
  23. package/src/components/DatametriaModal.vue +16 -16
  24. package/src/components/DatametriaNavbar.vue +230 -252
  25. package/src/components/DatametriaPasswordInput.vue +430 -0
  26. package/src/components/DatametriaProgress.vue +18 -18
  27. package/src/components/DatametriaRadio.vue +20 -20
  28. package/src/components/DatametriaSelect.vue +15 -15
  29. package/src/components/DatametriaSidebar.vue +230 -0
  30. package/src/components/DatametriaSkeleton.vue +243 -239
  31. package/src/components/DatametriaSlider.vue +395 -407
  32. package/src/components/DatametriaSortableTable.vue +585 -0
  33. package/src/components/DatametriaSpinner.vue +7 -7
  34. package/src/components/DatametriaSwitch.vue +16 -16
  35. package/src/components/DatametriaTable.vue +14 -14
  36. package/src/components/DatametriaTabs.vue +150 -29
  37. package/src/components/DatametriaTextarea.vue +28 -28
  38. package/src/components/DatametriaTimePicker.vue +285 -285
  39. package/src/components/DatametriaToast.vue +176 -176
  40. package/src/components/DatametriaTooltip.vue +408 -408
  41. package/src/components/__tests__/DatametriaAlert.test.js +35 -35
  42. package/src/components/__tests__/DatametriaAlert.test.ts +190 -0
  43. package/src/components/__tests__/DatametriaAutocomplete.test.ts +180 -0
  44. package/src/components/__tests__/DatametriaAvatar.test.ts +152 -0
  45. package/src/components/__tests__/DatametriaBadge.test.js +29 -29
  46. package/src/components/__tests__/DatametriaBadge.test.ts +167 -0
  47. package/src/components/__tests__/DatametriaBreadcrumb.test.ts +75 -0
  48. package/src/components/__tests__/DatametriaButton.test.js +30 -30
  49. package/src/components/__tests__/DatametriaButton.test.ts +283 -0
  50. package/src/components/__tests__/DatametriaCard.test.ts +201 -0
  51. package/src/components/__tests__/DatametriaCheckbox.test.ts +47 -0
  52. package/src/components/__tests__/DatametriaChip.test.js +38 -38
  53. package/src/components/__tests__/DatametriaContainer.test.ts +52 -0
  54. package/src/components/__tests__/DatametriaDatePicker.test.ts +234 -0
  55. package/src/components/__tests__/DatametriaDivider.test.ts +54 -0
  56. package/src/components/__tests__/DatametriaFileUpload.test.ts +291 -0
  57. package/src/components/__tests__/DatametriaFloatingBar.test.ts +137 -0
  58. package/src/components/__tests__/DatametriaGrid.test.ts +31 -0
  59. package/src/components/__tests__/DatametriaInput.test.ts +72 -0
  60. package/src/components/__tests__/DatametriaMenu.test.ts +366 -0
  61. package/src/components/__tests__/DatametriaModal.test.ts +86 -0
  62. package/src/components/__tests__/DatametriaNavbar.test.js +48 -48
  63. package/src/components/__tests__/DatametriaNavbar.test.ts +203 -0
  64. package/src/components/__tests__/DatametriaPasswordInput.test.js +305 -0
  65. package/src/components/__tests__/DatametriaProgress.test.ts +90 -0
  66. package/src/components/__tests__/DatametriaRadio.test.ts +77 -0
  67. package/src/components/__tests__/DatametriaSelect.test.ts +77 -0
  68. package/src/components/__tests__/DatametriaSidebar.test.ts +169 -0
  69. package/src/components/__tests__/DatametriaSlider.test.ts +261 -0
  70. package/src/components/__tests__/DatametriaSortableTable.test.js +168 -0
  71. package/src/components/__tests__/DatametriaSpinner.test.ts +156 -0
  72. package/src/components/__tests__/DatametriaSwitch.test.ts +64 -0
  73. package/src/components/__tests__/DatametriaTable.test.ts +97 -0
  74. package/src/components/__tests__/DatametriaTabs.test.ts +232 -0
  75. package/src/components/__tests__/DatametriaTextarea.test.ts +66 -0
  76. package/src/components/__tests__/DatametriaToast.test.js +48 -48
  77. package/src/components/__tests__/DatametriaToast.test.ts +99 -0
  78. package/src/composables/useAccessibilityScale.ts +94 -94
  79. package/src/composables/useBreakpoints.ts +82 -82
  80. package/src/composables/useHapticFeedback.ts +439 -439
  81. package/src/composables/useRipple.ts +218 -218
  82. package/src/index.ts +70 -61
  83. package/src/stories/Variants.stories.js +95 -95
  84. package/src/styles/design-tokens.css +623 -623
  85. package/src/theme/ThemeProvider.vue +96 -0
  86. package/src/theme/__tests__/ThemeProvider.test.ts +208 -0
  87. package/src/theme/__tests__/constants.test.ts +31 -0
  88. package/src/theme/__tests__/presets.test.ts +166 -0
  89. package/src/theme/__tests__/tokens.test.ts +155 -0
  90. package/src/theme/__tests__/types.test.ts +153 -0
  91. package/src/theme/__tests__/useTheme.test.ts +146 -0
  92. package/src/theme/constants.ts +14 -0
  93. package/src/theme/index.ts +12 -0
  94. package/src/theme/presets/datametria.ts +94 -0
  95. package/src/theme/presets/default.ts +94 -0
  96. package/src/theme/presets/index.ts +8 -0
  97. package/src/theme/tokens/colors.ts +28 -0
  98. package/src/theme/tokens/index.ts +47 -0
  99. package/src/theme/tokens/spacing.ts +21 -0
  100. package/src/theme/tokens/typography.ts +35 -0
  101. package/src/theme/types.ts +111 -0
  102. package/src/theme/useTheme.ts +28 -0
  103. package/src/types/index.ts +19 -0
@@ -0,0 +1,230 @@
1
+ <template>
2
+ <aside
3
+ :class="sidebarClasses"
4
+ role="complementary"
5
+ :aria-label="ariaLabel"
6
+ :aria-expanded="isOpen"
7
+ >
8
+ <div class="dm-sidebar__header" v-if="$slots.header">
9
+ <slot name="header"></slot>
10
+ <button
11
+ v-if="collapsible"
12
+ class="dm-sidebar__toggle"
13
+ @click="toggle"
14
+ :aria-label="isOpen ? 'Fechar sidebar' : 'Abrir sidebar'"
15
+ >
16
+ <span class="dm-sidebar__toggle-icon" :class="{ 'dm-sidebar__toggle-icon--open': isOpen }"></span>
17
+ </button>
18
+ </div>
19
+
20
+ <nav class="dm-sidebar__content">
21
+ <slot></slot>
22
+ </nav>
23
+
24
+ <div class="dm-sidebar__footer" v-if="$slots.footer">
25
+ <slot name="footer"></slot>
26
+ </div>
27
+ </aside>
28
+ </template>
29
+
30
+ <script setup lang="ts">
31
+ import { ref, computed, watch } from 'vue'
32
+
33
+ interface Props {
34
+ position?: 'left' | 'right'
35
+ variant?: 'light' | 'dark' | 'primary'
36
+ width?: string
37
+ collapsible?: boolean
38
+ defaultOpen?: boolean
39
+ ariaLabel?: string
40
+ }
41
+
42
+ const props = withDefaults(defineProps<Props>(), {
43
+ position: 'left',
44
+ variant: 'light',
45
+ width: '280px',
46
+ collapsible: false,
47
+ defaultOpen: true,
48
+ ariaLabel: 'Sidebar navigation'
49
+ })
50
+
51
+ const emit = defineEmits<{
52
+ toggle: [isOpen: boolean]
53
+ open: []
54
+ close: []
55
+ }>()
56
+
57
+ const isOpen = ref(props.defaultOpen)
58
+
59
+ const sidebarClasses = computed(() => [
60
+ 'dm-sidebar',
61
+ `dm-sidebar--${props.position}`,
62
+ `dm-sidebar--${props.variant}`,
63
+ { 'dm-sidebar--collapsed': !isOpen.value && props.collapsible }
64
+ ])
65
+
66
+ const toggle = () => {
67
+ isOpen.value = !isOpen.value
68
+ emit('toggle', isOpen.value)
69
+ if (isOpen.value) {
70
+ emit('open')
71
+ } else {
72
+ emit('close')
73
+ }
74
+ }
75
+
76
+ watch(() => props.defaultOpen, (newVal) => {
77
+ isOpen.value = newVal
78
+ })
79
+
80
+ defineExpose({ isOpen, toggle })
81
+ </script>
82
+
83
+ <style scoped>
84
+ .dm-sidebar {
85
+ height: 100vh;
86
+ background: var(--dm-neutral-50, #ffffff);
87
+ border-right: 1px solid var(--dm-neutral-200, #e5e7eb);
88
+ display: flex;
89
+ flex-direction: column;
90
+ transition: width 0.3s ease;
91
+ width: v-bind(width);
92
+ position: fixed;
93
+ top: 0;
94
+ z-index: 90;
95
+ }
96
+
97
+ .dm-sidebar--left {
98
+ left: 0;
99
+ }
100
+
101
+ .dm-sidebar--right {
102
+ right: 0;
103
+ border-right: none;
104
+ border-left: 1px solid var(--dm-neutral-200, #e5e7eb);
105
+ }
106
+
107
+ .dm-sidebar--dark {
108
+ background: var(--dm-neutral-900, #111827);
109
+ border-color: var(--dm-neutral-800, #1f2937);
110
+ color: var(--dm-neutral-50, #ffffff);
111
+ }
112
+
113
+ .dm-sidebar--primary {
114
+ background: var(--dm-primary, #0072CE);
115
+ border-color: color-mix(in srgb, var(--dm-primary, #0072CE) 90%, black);
116
+ color: var(--dm-neutral-50, #ffffff);
117
+ }
118
+
119
+ .dm-sidebar--collapsed {
120
+ width: 64px;
121
+ }
122
+
123
+ .dm-sidebar__header {
124
+ padding: var(--dm-spacing-4, 1rem);
125
+ border-bottom: 1px solid var(--dm-neutral-200, #e5e7eb);
126
+ display: flex;
127
+ align-items: center;
128
+ justify-content: space-between;
129
+ min-height: 64px;
130
+ }
131
+
132
+ .dm-sidebar--dark .dm-sidebar__header {
133
+ border-color: var(--dm-neutral-800, #1f2937);
134
+ }
135
+
136
+ .dm-sidebar--primary .dm-sidebar__header {
137
+ border-color: color-mix(in srgb, var(--dm-primary, #0072CE) 90%, black);
138
+ }
139
+
140
+ .dm-sidebar__toggle {
141
+ width: 32px;
142
+ height: 32px;
143
+ padding: 0;
144
+ border: none;
145
+ background: transparent;
146
+ cursor: pointer;
147
+ display: flex;
148
+ align-items: center;
149
+ justify-content: center;
150
+ border-radius: var(--dm-radius-md, 0.375rem);
151
+ transition: background 0.2s ease;
152
+ }
153
+
154
+ .dm-sidebar__toggle:hover {
155
+ background: var(--dm-neutral-100, #f3f4f6);
156
+ }
157
+
158
+ .dm-sidebar--dark .dm-sidebar__toggle:hover {
159
+ background: var(--dm-neutral-800, #1f2937);
160
+ }
161
+
162
+ .dm-sidebar__toggle-icon {
163
+ width: 16px;
164
+ height: 2px;
165
+ background: var(--dm-neutral-900, #111827);
166
+ position: relative;
167
+ transition: transform 0.3s ease;
168
+ }
169
+
170
+ .dm-sidebar--dark .dm-sidebar__toggle-icon,
171
+ .dm-sidebar--primary .dm-sidebar__toggle-icon {
172
+ background: var(--dm-neutral-50, #ffffff);
173
+ }
174
+
175
+ .dm-sidebar__toggle-icon::before,
176
+ .dm-sidebar__toggle-icon::after {
177
+ content: '';
178
+ position: absolute;
179
+ width: 16px;
180
+ height: 2px;
181
+ background: inherit;
182
+ transition: transform 0.3s ease;
183
+ }
184
+
185
+ .dm-sidebar__toggle-icon::before {
186
+ top: -5px;
187
+ }
188
+
189
+ .dm-sidebar__toggle-icon::after {
190
+ bottom: -5px;
191
+ }
192
+
193
+ .dm-sidebar__toggle-icon--open {
194
+ transform: rotate(180deg);
195
+ }
196
+
197
+ .dm-sidebar__content {
198
+ flex: 1;
199
+ overflow-y: auto;
200
+ padding: var(--dm-spacing-4, 1rem);
201
+ }
202
+
203
+ .dm-sidebar__footer {
204
+ padding: var(--dm-spacing-4, 1rem);
205
+ border-top: 1px solid var(--dm-neutral-200, #e5e7eb);
206
+ }
207
+
208
+ .dm-sidebar--dark .dm-sidebar__footer {
209
+ border-color: var(--dm-neutral-800, #1f2937);
210
+ }
211
+
212
+ .dm-sidebar--primary .dm-sidebar__footer {
213
+ border-color: color-mix(in srgb, var(--dm-primary, #0072CE) 90%, black);
214
+ }
215
+
216
+ @media (max-width: 768px) {
217
+ .dm-sidebar {
218
+ transform: translateX(0);
219
+ transition: transform 0.3s ease;
220
+ }
221
+
222
+ .dm-sidebar--left.dm-sidebar--collapsed {
223
+ transform: translateX(-100%);
224
+ }
225
+
226
+ .dm-sidebar--right.dm-sidebar--collapsed {
227
+ transform: translateX(100%);
228
+ }
229
+ }
230
+ </style>