@datametria/vue-components 2.4.1 → 2.4.2

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 (35) hide show
  1. package/README.md +57 -5
  2. package/dist/index.es.js +5812 -2837
  3. package/dist/index.umd.js +670 -10
  4. package/dist/src/components/DatametriaCheckbox.vue.d.ts +2 -0
  5. package/dist/src/components/DatametriaCheckboxGroup.vue.d.ts +6 -0
  6. package/dist/src/components/DatametriaFileUpload.vue.d.ts +5 -0
  7. package/dist/src/components/DatametriaFloatingBar.vue.d.ts +1 -1
  8. package/dist/src/components/DatametriaInput.vue.d.ts +2 -22
  9. package/dist/src/components/DatametriaNavbar.vue.d.ts +1 -1
  10. package/dist/src/components/DatametriaPasswordInput.vue.d.ts +2 -0
  11. package/dist/src/components/DatametriaRadio.vue.d.ts +2 -0
  12. package/dist/src/components/DatametriaRadioGroup.vue.d.ts +6 -0
  13. package/dist/src/components/DatametriaSelect.vue.d.ts +2 -3
  14. package/dist/src/components/DatametriaSidebar.vue.d.ts +1 -1
  15. package/dist/src/components/DatametriaSwitch.vue.d.ts +8 -1
  16. package/dist/src/components/DatametriaTabs.vue.d.ts +2 -2
  17. package/dist/src/components/DatametriaTextarea.vue.d.ts +6 -0
  18. package/dist/src/composables/useAnalytics.d.ts +8 -0
  19. package/dist/src/types/analytics.d.ts +50 -0
  20. package/dist/vue-components.css +1 -1
  21. package/package.json +3 -2
  22. package/src/components/DatametriaButton.vue +196 -195
  23. package/src/components/DatametriaCheckbox.vue +289 -197
  24. package/src/components/DatametriaCheckboxGroup.vue +124 -3
  25. package/src/components/DatametriaFileUpload.vue +493 -414
  26. package/src/components/DatametriaInput.vue +342 -316
  27. package/src/components/DatametriaPasswordInput.vue +433 -446
  28. package/src/components/DatametriaRadio.vue +240 -151
  29. package/src/components/DatametriaRadioGroup.vue +124 -3
  30. package/src/components/DatametriaSelect.vue +409 -313
  31. package/src/components/DatametriaSwitch.vue +319 -146
  32. package/src/components/DatametriaTabs.vue +2 -2
  33. package/src/components/DatametriaTextarea.vue +285 -213
  34. package/src/composables/useAnalytics.ts +70 -0
  35. package/src/types/analytics.ts +59 -0
@@ -1,195 +1,196 @@
1
- <template>
2
- <button
3
- :class="buttonClasses"
4
- :disabled="disabled || loading"
5
- :type="type"
6
- :aria-busy="loading"
7
- :aria-disabled="disabled"
8
- @click="$emit('click', $event)"
9
- >
10
- <span v-if="loading" class="spinner" role="status" aria-label="Carregando"></span>
11
- <slot />
12
- </button>
13
- </template>
14
-
15
- <script setup lang="ts">
16
- import { computed } from 'vue'
17
- import { ButtonVariant, ButtonSize } from '../types'
18
-
19
- interface Props {
20
- variant?: ButtonVariant
21
- size?: ButtonSize
22
- disabled?: boolean
23
- loading?: boolean
24
- fullWidth?: boolean
25
- type?: 'button' | 'submit' | 'reset'
26
- }
27
-
28
- const props = withDefaults(defineProps<Props>(), {
29
- variant: ButtonVariant.PRIMARY,
30
- size: ButtonSize.MD,
31
- disabled: false,
32
- loading: false,
33
- fullWidth: false,
34
- type: 'button'
35
- })
36
-
37
- // Validação em desenvolvimento
38
- if (process.env.NODE_ENV === 'development') {
39
- const validVariants = Object.values(ButtonVariant)
40
- if (!validVariants.includes(props.variant)) {
41
- console.warn(`[DatametriaButton] Invalid variant "${props.variant}". Valid options: ${validVariants.join(', ')}`)
42
- }
43
- }
44
-
45
- defineEmits<{
46
- click: [event: MouseEvent]
47
- }>()
48
-
49
- const buttonClasses = computed(() => {
50
- return [
51
- 'datametria-button',
52
- `datametria-button--${props.variant}`,
53
- `datametria-button--${props.size}`,
54
- {
55
- 'datametria-button--full-width': props.fullWidth,
56
- 'datametria-button--loading': props.loading,
57
- 'datametria-button--disabled': props.disabled
58
- }
59
- ]
60
- })
61
- </script>
62
-
63
- <style scoped>
64
- .datametria-button {
65
- display: inline-flex;
66
- align-items: center;
67
- justify-content: center;
68
- font-weight: var(--dm-font-medium, 500);
69
- border-radius: var(--dm-radius-md, 0.375rem);
70
- transition: var(--dm-transition-base, 200ms);
71
- cursor: pointer;
72
- border: 1px solid transparent;
73
- font-family: var(--dm-font-sans, -apple-system, sans-serif);
74
- touch-action: manipulation;
75
- -webkit-tap-highlight-color: transparent;
76
- }
77
-
78
- .datametria-button--primary {
79
- background: var(--dm-primary, #0072CE);
80
- color: white;
81
- }
82
-
83
- .datametria-button--primary:hover:not(:disabled) {
84
- filter: brightness(0.9);
85
- }
86
-
87
- .datametria-button--primary:focus-visible {
88
- outline: none;
89
- box-shadow: 0 0 0 3px color-mix(in srgb, var(--dm-primary, #0072CE) 20%, transparent);
90
- }
91
-
92
- .datametria-button--secondary {
93
- background: var(--dm-secondary, #4B0078);
94
- color: white;
95
- }
96
-
97
- .datametria-button--secondary:hover:not(:disabled) {
98
- filter: brightness(0.9);
99
- }
100
-
101
- .datametria-button--secondary:focus-visible {
102
- outline: none;
103
- box-shadow: 0 0 0 3px color-mix(in srgb, var(--dm-secondary, #4B0078) 20%, transparent);
104
- }
105
-
106
- .datametria-button--outline {
107
- background: transparent;
108
- border-color: var(--dm-primary, #0072CE);
109
- color: var(--dm-primary, #0072CE);
110
- }
111
-
112
- .datametria-button--outline:hover:not(:disabled) {
113
- background: color-mix(in srgb, var(--dm-primary, #0072CE) 10%, transparent);
114
- }
115
-
116
- .datametria-button--outline:focus-visible {
117
- outline: none;
118
- box-shadow: 0 0 0 3px color-mix(in srgb, var(--dm-primary, #0072CE) 20%, transparent);
119
- }
120
-
121
- .datametria-button--ghost {
122
- background: transparent;
123
- color: var(--dm-primary, #0072CE);
124
- }
125
-
126
- .datametria-button--ghost:hover:not(:disabled) {
127
- background: var(--dm-neutral-100, #f3f4f6);
128
- }
129
-
130
- .datametria-button--sm {
131
- padding: var(--dm-space-2, 0.5rem) var(--dm-space-4, 1rem);
132
- font-size: var(--dm-text-sm, 0.875rem);
133
- min-height: 2rem;
134
- }
135
-
136
- .datametria-button--md {
137
- padding: var(--dm-space-3, 0.75rem) calc(var(--dm-space-4, 1rem) * 1.5);
138
- font-size: var(--dm-text-base, 1rem);
139
- min-height: 2.5rem;
140
- }
141
-
142
- .datametria-button--lg {
143
- padding: var(--dm-space-4, 1rem) calc(var(--dm-space-4, 1rem) * 2);
144
- font-size: var(--dm-text-lg, 1.125rem);
145
- min-height: 3rem;
146
- }
147
-
148
- @media (max-width: 640px) {
149
- .datametria-button--sm { min-height: 2.25rem; }
150
- .datametria-button--md { min-height: 2.75rem; }
151
- .datametria-button--lg { min-height: 3.25rem; }
152
- }
153
-
154
- .datametria-button--full-width {
155
- width: 100%;
156
- }
157
-
158
- .datametria-button--disabled,
159
- .datametria-button:disabled {
160
- opacity: 0.5;
161
- cursor: not-allowed;
162
- }
163
-
164
- .spinner {
165
- width: 1rem;
166
- height: 1rem;
167
- border: 2px solid currentColor;
168
- border-top-color: transparent;
169
- border-radius: 50%;
170
- animation: spin 0.6s linear infinite;
171
- margin-right: 0.5rem;
172
- }
173
-
174
- @keyframes spin {
175
- to { transform: rotate(360deg); }
176
- }
177
-
178
- /* Dark Mode Support - Hybrid Approach */
179
-
180
- /* Fallback automático (sem JS) */
181
- @media (prefers-color-scheme: dark) {
182
- .buttonClasses {
183
- background: var(--dm-bg-color-dark, #1e1e1e);
184
- color: var(--dm-text-primary-dark, #e0e0e0);
185
- border-color: var(--dm-border-color-dark, #404040);
186
- }
187
- }
188
-
189
- /* Controle manual via useTheme() */
190
- [data-theme="dark"] .buttonClasses {
191
- background: var(--dm-bg-color-dark, #1e1e1e);
192
- color: var(--dm-text-primary-dark, #e0e0e0);
193
- border-color: var(--dm-border-color-dark, #404040);
194
- }
195
- </style>
1
+ <template>
2
+ <button
3
+ :class="buttonClasses"
4
+ :disabled="disabled || loading"
5
+ :type="type"
6
+ :aria-busy="loading"
7
+ :aria-disabled="disabled"
8
+ @click="handleClick"
9
+ >
10
+ <span v-if="loading" class="spinner" role="status" aria-label="Carregando"></span>
11
+ <slot />
12
+ </button>
13
+ </template>
14
+
15
+ <script setup lang="ts">
16
+ import { computed } from 'vue'
17
+ import { useAnalytics } from '@/composables/useAnalytics'
18
+ import { ButtonVariant, ButtonSize } from '../types'
19
+
20
+ interface Props {
21
+ variant?: ButtonVariant
22
+ size?: ButtonSize
23
+ disabled?: boolean
24
+ loading?: boolean
25
+ fullWidth?: boolean
26
+ type?: 'button' | 'submit' | 'reset'
27
+ }
28
+
29
+ const props = withDefaults(defineProps<Props>(), {
30
+ variant: ButtonVariant.PRIMARY,
31
+ size: ButtonSize.MD,
32
+ disabled: false,
33
+ loading: false,
34
+ fullWidth: false,
35
+ type: 'button'
36
+ })
37
+
38
+ const emit = defineEmits<{
39
+ click: [event: MouseEvent]
40
+ }>()
41
+
42
+ const { trackEvent } = useAnalytics()
43
+
44
+ const handleClick = (event: MouseEvent) => {
45
+ trackEvent('button_click', {
46
+ component: 'DatametriaButton',
47
+ variant: props.variant,
48
+ size: props.size
49
+ })
50
+ emit('click', event)
51
+ }
52
+
53
+ const buttonClasses = computed(() => {
54
+ return [
55
+ 'datametria-button',
56
+ `datametria-button--${props.variant}`,
57
+ `datametria-button--${props.size}`,
58
+ {
59
+ 'datametria-button--full-width': props.fullWidth,
60
+ 'datametria-button--loading': props.loading,
61
+ 'datametria-button--disabled': props.disabled
62
+ }
63
+ ]
64
+ })
65
+ </script>
66
+
67
+ <style scoped>
68
+ .datametria-button {
69
+ display: inline-flex;
70
+ align-items: center;
71
+ justify-content: center;
72
+ font-weight: 500;
73
+ border-radius: 0.375rem;
74
+ transition: all 0.2s;
75
+ cursor: pointer;
76
+ border: 1px solid transparent;
77
+ font-family: -apple-system, sans-serif;
78
+ touch-action: manipulation;
79
+ -webkit-tap-highlight-color: transparent;
80
+ }
81
+
82
+ .datametria-button--primary {
83
+ background: var(--color-primary, #0072CE);
84
+ color: white;
85
+ }
86
+
87
+ .datametria-button--primary:hover:not(:disabled) {
88
+ filter: brightness(0.9);
89
+ }
90
+
91
+ .datametria-button--primary:focus-visible {
92
+ outline: none;
93
+ box-shadow: 0 0 0 3px var(--color-primary-alpha, rgba(0, 114, 206, 0.2));
94
+ }
95
+
96
+ .datametria-button--secondary {
97
+ background: var(--color-secondary, #4B0078);
98
+ color: white;
99
+ }
100
+
101
+ .datametria-button--secondary:hover:not(:disabled) {
102
+ filter: brightness(0.9);
103
+ }
104
+
105
+ .datametria-button--secondary:focus-visible {
106
+ outline: none;
107
+ box-shadow: 0 0 0 3px var(--color-primary-alpha, rgba(75, 0, 120, 0.2));
108
+ }
109
+
110
+ .datametria-button--outline {
111
+ background: transparent;
112
+ border-color: var(--color-primary, #0072CE);
113
+ color: var(--color-primary, #0072CE);
114
+ }
115
+
116
+ .datametria-button--outline:hover:not(:disabled) {
117
+ background: var(--color-primary-alpha, rgba(0, 114, 206, 0.1));
118
+ }
119
+
120
+ .datametria-button--outline:focus-visible {
121
+ outline: none;
122
+ box-shadow: 0 0 0 3px var(--color-primary-alpha, rgba(0, 114, 206, 0.2));
123
+ }
124
+
125
+ .datametria-button--ghost {
126
+ background: transparent;
127
+ color: var(--color-primary, #0072CE);
128
+ }
129
+
130
+ .datametria-button--ghost:hover:not(:disabled) {
131
+ background: var(--color-background-muted, #f3f4f6);
132
+ }
133
+
134
+ .datametria-button--xs {
135
+ padding: 2px 6px;
136
+ font-size: 11px;
137
+ min-height: 1.75rem;
138
+ }
139
+
140
+ .datametria-button--sm {
141
+ padding: 4px 8px;
142
+ font-size: 12px;
143
+ min-height: 2rem;
144
+ }
145
+
146
+ .datametria-button--md {
147
+ padding: 8px 12px;
148
+ font-size: 14px;
149
+ min-height: 2.5rem;
150
+ }
151
+
152
+ .datametria-button--lg {
153
+ padding: 12px 16px;
154
+ font-size: 16px;
155
+ min-height: 3rem;
156
+ }
157
+
158
+ .datametria-button--xl {
159
+ padding: 16px 20px;
160
+ font-size: 18px;
161
+ min-height: 3.5rem;
162
+ }
163
+
164
+ @media (max-width: 640px) {
165
+ .datametria-button--xs { min-height: 2rem; }
166
+ .datametria-button--sm { min-height: 2.25rem; }
167
+ .datametria-button--md { min-height: 2.75rem; }
168
+ .datametria-button--lg { min-height: 3.25rem; }
169
+ .datametria-button--xl { min-height: 3.75rem; }
170
+ }
171
+
172
+ .datametria-button--full-width {
173
+ width: 100%;
174
+ }
175
+
176
+ .datametria-button--disabled,
177
+ .datametria-button:disabled {
178
+ background: var(--color-background-muted, #f3f4f6);
179
+ cursor: not-allowed;
180
+ opacity: 0.6;
181
+ }
182
+
183
+ .spinner {
184
+ width: 1rem;
185
+ height: 1rem;
186
+ border: 2px solid currentColor;
187
+ border-top-color: transparent;
188
+ border-radius: 50%;
189
+ animation: spin 0.6s linear infinite;
190
+ margin-right: 0.5rem;
191
+ }
192
+
193
+ @keyframes spin {
194
+ to { transform: rotate(360deg); }
195
+ }
196
+ </style>