@datametria/vue-components 1.1.3 → 1.2.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.
@@ -1,90 +1,98 @@
1
- <template>
2
- <span
3
- class="dm-badge"
4
- :class="[`dm-badge--${variant}`, `dm-badge--${size}`]"
5
- :aria-label="ariaLabel"
6
- >
7
- <slot>{{ label }}</slot>
8
- </span>
9
- </template>
10
-
11
- <script setup lang="ts">
12
- interface Props {
13
- label?: string
14
- variant?: 'primary' | 'secondary' | 'success' | 'warning' | 'error' | 'info'
15
- size?: 'sm' | 'md' | 'lg'
16
- ariaLabel?: string
17
- }
18
-
19
- withDefaults(defineProps<Props>(), {
20
- variant: 'primary',
21
- size: 'md'
22
- })
23
- </script>
24
-
25
- <style scoped>
26
- .dm-badge {
27
- display: inline-flex;
28
- align-items: center;
29
- justify-content: center;
30
- font-weight: 600;
31
- border-radius: 12px;
32
- white-space: nowrap;
33
- user-select: none;
34
- }
35
-
36
- .dm-badge--sm {
37
- padding: 2px 8px;
38
- font-size: var(--dm-text-xs);
39
- min-height: 20px;
40
- }
41
-
42
- .dm-badge--md {
43
- padding: 4px 12px;
44
- font-size: var(--dm-text-sm);
45
- min-height: 24px;
46
- }
47
-
48
- .dm-badge--lg {
49
- padding: 6px 16px;
50
- font-size: var(--dm-text-base);
51
- min-height: 32px;
52
- }
53
-
54
- .dm-badge--primary {
55
- background: var(--dm-primary);
56
- color: var(--dm-white);
57
- }
58
-
59
- .dm-badge--secondary {
60
- background: var(--dm-secondary);
61
- color: var(--dm-white);
62
- }
63
-
64
- .dm-badge--success {
65
- background: var(--dm-success);
66
- color: var(--dm-white);
67
- }
68
-
69
- .dm-badge--warning {
70
- background: var(--dm-warning);
71
- color: var(--dm-gray-900);
72
- }
73
-
74
- .dm-badge--error {
75
- background: var(--dm-error);
76
- color: var(--dm-white);
77
- }
78
-
79
- .dm-badge--info {
80
- background: var(--dm-gray-200);
81
- color: var(--dm-gray-900);
82
- }
83
-
84
- @media (prefers-color-scheme: dark) {
85
- .dm-badge--info {
86
- background: var(--dm-gray-700);
87
- color: var(--dm-white);
88
- }
89
- }
90
- </style>
1
+ <template>
2
+ <span
3
+ class="dm-badge"
4
+ :class="[`dm-badge--${variant}`, `dm-badge--${size}`]"
5
+ :aria-label="ariaLabel"
6
+ >
7
+ <slot>{{ label }}</slot>
8
+ </span>
9
+ </template>
10
+
11
+ <script setup lang="ts">
12
+ interface Props {
13
+ label?: string
14
+ variant?: 'primary' | 'secondary' | 'success' | 'warning' | 'error' | 'info'
15
+ size?: 'sm' | 'md' | 'lg'
16
+ ariaLabel?: string
17
+ }
18
+
19
+ const props = withDefaults(defineProps<Props>(), {
20
+ variant: 'primary',
21
+ size: 'md'
22
+ })
23
+
24
+ // Validação em desenvolvimento
25
+ if (process.env.NODE_ENV === 'development') {
26
+ const validVariants = ['primary', 'secondary', 'success', 'warning', 'error', 'info']
27
+ if (!validVariants.includes(props.variant)) {
28
+ console.warn(`[DatametriaBadge] Invalid variant "${props.variant}". Valid options: ${validVariants.join(', ')}`)
29
+ }
30
+ }
31
+ </script>
32
+
33
+ <style scoped>
34
+ .dm-badge {
35
+ display: inline-flex;
36
+ align-items: center;
37
+ justify-content: center;
38
+ font-weight: 600;
39
+ border-radius: 12px;
40
+ white-space: nowrap;
41
+ user-select: none;
42
+ }
43
+
44
+ .dm-badge--sm {
45
+ padding: 2px 8px;
46
+ font-size: var(--dm-text-xs);
47
+ min-height: 20px;
48
+ }
49
+
50
+ .dm-badge--md {
51
+ padding: 4px 12px;
52
+ font-size: var(--dm-text-sm);
53
+ min-height: 24px;
54
+ }
55
+
56
+ .dm-badge--lg {
57
+ padding: 6px 16px;
58
+ font-size: var(--dm-text-base);
59
+ min-height: 32px;
60
+ }
61
+
62
+ .dm-badge--primary {
63
+ background: var(--dm-primary);
64
+ color: var(--dm-white);
65
+ }
66
+
67
+ .dm-badge--secondary {
68
+ background: var(--dm-secondary);
69
+ color: var(--dm-white);
70
+ }
71
+
72
+ .dm-badge--success {
73
+ background: var(--dm-success);
74
+ color: var(--dm-white);
75
+ }
76
+
77
+ .dm-badge--warning {
78
+ background: var(--dm-warning);
79
+ color: var(--dm-gray-900);
80
+ }
81
+
82
+ .dm-badge--error {
83
+ background: var(--dm-error);
84
+ color: var(--dm-white);
85
+ }
86
+
87
+ .dm-badge--info {
88
+ background: var(--dm-gray-200);
89
+ color: var(--dm-gray-900);
90
+ }
91
+
92
+ @media (prefers-color-scheme: dark) {
93
+ .dm-badge--info {
94
+ background: var(--dm-gray-700);
95
+ color: var(--dm-white);
96
+ }
97
+ }
98
+ </style>
@@ -1,157 +1,165 @@
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
- defineEmits<{
38
- click: [event: MouseEvent]
39
- }>()
40
-
41
- const buttonClasses = computed(() => {
42
- return [
43
- 'datametria-button',
44
- `datametria-button--${props.variant}`,
45
- `datametria-button--${props.size}`,
46
- {
47
- 'datametria-button--full-width': props.fullWidth,
48
- 'datametria-button--loading': props.loading,
49
- 'datametria-button--disabled': props.disabled
50
- }
51
- ]
52
- })
53
- </script>
54
-
55
- <style scoped>
56
- .datametria-button {
57
- display: inline-flex;
58
- align-items: center;
59
- justify-content: center;
60
- font-weight: 500;
61
- border-radius: var(--dm-radius);
62
- transition: var(--dm-transition);
63
- cursor: pointer;
64
- border: 1px solid transparent;
65
- font-family: var(--dm-font-sans, -apple-system, sans-serif);
66
- touch-action: manipulation;
67
- -webkit-tap-highlight-color: transparent;
68
- }
69
-
70
- .datametria-button--primary {
71
- background: var(--dm-primary);
72
- color: white;
73
- }
74
-
75
- .datametria-button--primary:hover:not(:disabled) {
76
- background: #005ba3;
77
- }
78
-
79
- .datametria-button--primary:focus-visible {
80
- outline: none;
81
- box-shadow: var(--dm-focus-ring);
82
- }
83
-
84
- .datametria-button--secondary {
85
- background: var(--dm-secondary);
86
- color: white;
87
- }
88
-
89
- .datametria-button--secondary:focus-visible {
90
- outline: none;
91
- box-shadow: 0 0 0 3px rgba(75, 0, 120, 0.1);
92
- }
93
-
94
- .datametria-button--outline {
95
- background: transparent;
96
- border-color: var(--dm-primary);
97
- color: var(--dm-primary);
98
- }
99
-
100
- .datametria-button--outline:focus-visible {
101
- outline: none;
102
- box-shadow: var(--dm-focus-ring);
103
- }
104
-
105
- .datametria-button--ghost {
106
- background: transparent;
107
- color: #0072CE;
108
- }
109
-
110
- .datametria-button--sm {
111
- padding: var(--dm-space-2) var(--dm-space-4);
112
- font-size: var(--dm-text-sm);
113
- min-height: 2rem;
114
- }
115
-
116
- .datametria-button--md {
117
- padding: var(--dm-space-3) calc(var(--dm-space-4) * 1.5);
118
- font-size: var(--dm-text-base);
119
- min-height: 2.5rem;
120
- }
121
-
122
- .datametria-button--lg {
123
- padding: var(--dm-space-4) calc(var(--dm-space-4) * 2);
124
- font-size: var(--dm-text-lg);
125
- min-height: 3rem;
126
- }
127
-
128
- @media (max-width: 640px) {
129
- .datametria-button--sm { min-height: 2.25rem; }
130
- .datametria-button--md { min-height: 2.75rem; }
131
- .datametria-button--lg { min-height: 3.25rem; }
132
- }
133
-
134
- .datametria-button--full-width {
135
- width: 100%;
136
- }
137
-
138
- .datametria-button--disabled,
139
- .datametria-button:disabled {
140
- opacity: 0.5;
141
- cursor: not-allowed;
142
- }
143
-
144
- .spinner {
145
- width: 1rem;
146
- height: 1rem;
147
- border: 2px solid currentColor;
148
- border-top-color: transparent;
149
- border-radius: 50%;
150
- animation: spin 0.6s linear infinite;
151
- margin-right: 0.5rem;
152
- }
153
-
154
- @keyframes spin {
155
- to { transform: rotate(360deg); }
156
- }
157
- </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="$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: 500;
69
+ border-radius: var(--dm-radius);
70
+ transition: var(--dm-transition);
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);
80
+ color: white;
81
+ }
82
+
83
+ .datametria-button--primary:hover:not(:disabled) {
84
+ background: #005ba3;
85
+ }
86
+
87
+ .datametria-button--primary:focus-visible {
88
+ outline: none;
89
+ box-shadow: var(--dm-focus-ring);
90
+ }
91
+
92
+ .datametria-button--secondary {
93
+ background: var(--dm-secondary);
94
+ color: white;
95
+ }
96
+
97
+ .datametria-button--secondary:focus-visible {
98
+ outline: none;
99
+ box-shadow: 0 0 0 3px rgba(75, 0, 120, 0.1);
100
+ }
101
+
102
+ .datametria-button--outline {
103
+ background: transparent;
104
+ border-color: var(--dm-primary);
105
+ color: var(--dm-primary);
106
+ }
107
+
108
+ .datametria-button--outline:focus-visible {
109
+ outline: none;
110
+ box-shadow: var(--dm-focus-ring);
111
+ }
112
+
113
+ .datametria-button--ghost {
114
+ background: transparent;
115
+ color: #0072CE;
116
+ }
117
+
118
+ .datametria-button--sm {
119
+ padding: var(--dm-space-2) var(--dm-space-4);
120
+ font-size: var(--dm-text-sm);
121
+ min-height: 2rem;
122
+ }
123
+
124
+ .datametria-button--md {
125
+ padding: var(--dm-space-3) calc(var(--dm-space-4) * 1.5);
126
+ font-size: var(--dm-text-base);
127
+ min-height: 2.5rem;
128
+ }
129
+
130
+ .datametria-button--lg {
131
+ padding: var(--dm-space-4) calc(var(--dm-space-4) * 2);
132
+ font-size: var(--dm-text-lg);
133
+ min-height: 3rem;
134
+ }
135
+
136
+ @media (max-width: 640px) {
137
+ .datametria-button--sm { min-height: 2.25rem; }
138
+ .datametria-button--md { min-height: 2.75rem; }
139
+ .datametria-button--lg { min-height: 3.25rem; }
140
+ }
141
+
142
+ .datametria-button--full-width {
143
+ width: 100%;
144
+ }
145
+
146
+ .datametria-button--disabled,
147
+ .datametria-button:disabled {
148
+ opacity: 0.5;
149
+ cursor: not-allowed;
150
+ }
151
+
152
+ .spinner {
153
+ width: 1rem;
154
+ height: 1rem;
155
+ border: 2px solid currentColor;
156
+ border-top-color: transparent;
157
+ border-radius: 50%;
158
+ animation: spin 0.6s linear infinite;
159
+ margin-right: 0.5rem;
160
+ }
161
+
162
+ @keyframes spin {
163
+ to { transform: rotate(360deg); }
164
+ }
165
+ </style>