@datametria/vue-components 1.1.2 → 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.
Files changed (32) hide show
  1. package/README.md +657 -472
  2. package/dist/index.es.js +1916 -675
  3. package/dist/index.umd.js +74 -1
  4. package/dist/vue-components.css +1 -1
  5. package/package.json +98 -98
  6. package/src/components/DatametriaAlert.vue +137 -123
  7. package/src/components/DatametriaBadge.vue +98 -90
  8. package/src/components/DatametriaButton.vue +165 -157
  9. package/src/components/DatametriaChip.vue +149 -149
  10. package/src/components/DatametriaMenu.vue +620 -0
  11. package/src/components/DatametriaNavbar.vue +252 -227
  12. package/src/components/DatametriaSkeleton.vue +240 -0
  13. package/src/components/DatametriaSlider.vue +408 -0
  14. package/src/components/DatametriaTimePicker.vue +286 -0
  15. package/src/components/DatametriaToast.vue +176 -163
  16. package/src/components/DatametriaTooltip.vue +409 -0
  17. package/src/components/__tests__/DatametriaAlert.test.js +36 -0
  18. package/src/components/__tests__/DatametriaBadge.test.js +30 -0
  19. package/src/components/__tests__/DatametriaButton.test.js +31 -0
  20. package/src/components/__tests__/DatametriaChip.test.js +39 -0
  21. package/src/components/__tests__/DatametriaNavbar.test.js +49 -0
  22. package/src/components/__tests__/DatametriaToast.test.js +49 -0
  23. package/src/composables/useAccessibilityScale.ts +95 -0
  24. package/src/composables/useBreakpoints.ts +83 -0
  25. package/src/composables/useHapticFeedback.ts +440 -0
  26. package/src/composables/useRipple.ts +219 -0
  27. package/src/index.ts +61 -52
  28. package/src/stories/Variants.stories.js +96 -0
  29. package/src/styles/design-tokens.css +623 -31
  30. package/ACCESSIBILITY.md +0 -78
  31. package/DESIGN-SYSTEM.md +0 -70
  32. package/PROGRESS.md +0 -327
package/package.json CHANGED
@@ -1,98 +1,98 @@
1
- {
2
- "name": "@datametria/vue-components",
3
- "version": "1.1.2",
4
- "description": "DATAMETRIA Vue.js 3 Component Library with Design System - 56 components enterprise-ready",
5
- "type": "module",
6
- "main": "./dist/index.umd.js",
7
- "module": "./dist/index.es.js",
8
- "types": "./dist/index.d.ts",
9
- "exports": {
10
- ".": {
11
- "import": "./dist/index.es.js",
12
- "require": "./dist/index.umd.js",
13
- "types": "./dist/index.d.ts"
14
- },
15
- "./style.css": "./dist/style.css"
16
- },
17
- "files": [
18
- "dist",
19
- "src",
20
- "README.md",
21
- "ACCESSIBILITY.md",
22
- "DESIGN-SYSTEM.md",
23
- "PROGRESS.md"
24
- ],
25
- "sideEffects": [
26
- "*.css",
27
- "*.vue"
28
- ],
29
- "scripts": {
30
- "dev": "vite",
31
- "build": "vue-tsc && vite build",
32
- "preview": "vite preview",
33
- "test": "vitest",
34
- "test:ui": "vitest --ui",
35
- "test:coverage": "vitest --coverage",
36
- "lint": "eslint . --ext .vue,.js,.jsx,.cjs,.mjs,.ts,.tsx,.cts,.mts --fix",
37
- "type-check": "vue-tsc --noEmit",
38
- "prepublishOnly": "npm run build"
39
- },
40
- "dependencies": {
41
- "axios": "^1.12.2",
42
- "vue": "^3.4.0"
43
- },
44
- "devDependencies": {
45
- "@eslint/config-array": "^0.19.0",
46
- "@eslint/object-schema": "^2.1.4",
47
- "@testing-library/jest-dom": "^6.1.5",
48
- "@testing-library/vue": "^8.0.1",
49
- "@types/node": "^22.0.0",
50
- "@vitejs/plugin-vue": "^5.0.0",
51
- "@vitest/coverage-v8": "^2.1.0",
52
- "@vue/eslint-config-prettier": "^10.0.0",
53
- "@vue/eslint-config-typescript": "^14.0.0",
54
- "@vue/test-utils": "^2.4.0",
55
- "@vue/tsconfig": "^0.5.0",
56
- "eslint": "^9.17.0",
57
- "eslint-plugin-vue": "^9.31.0",
58
- "jsdom": "^25.0.0",
59
- "prettier": "^3.4.0",
60
- "typescript": "~5.7.0",
61
- "vite": "^6.0.0",
62
- "vitest": "^2.1.0",
63
- "vue-tsc": "^2.2.0"
64
- },
65
- "peerDependencies": {
66
- "vue": "^3.4.0"
67
- },
68
- "keywords": [
69
- "vue",
70
- "vue3",
71
- "vuejs",
72
- "components",
73
- "design-system",
74
- "datametria",
75
- "typescript",
76
- "enterprise",
77
- "ui-library",
78
- "component-library",
79
- "composition-api",
80
- "wcag",
81
- "accessibility",
82
- "a11y",
83
- "responsive",
84
- "mobile-first",
85
- "dark-mode"
86
- ],
87
- "author": "DATAMETRIA Team <dev@datametria.io>",
88
- "license": "MIT",
89
- "repository": {
90
- "type": "git",
91
- "url": "https://github.com/datametria/DATAMETRIA-common-libraries",
92
- "directory": "packages/vue-components"
93
- },
94
- "bugs": {
95
- "url": "https://github.com/datametria/DATAMETRIA-common-libraries/issues"
96
- },
97
- "homepage": "https://github.com/datametria/DATAMETRIA-common-libraries#readme"
98
- }
1
+ {
2
+ "name": "@datametria/vue-components",
3
+ "version": "1.2.0",
4
+ "description": "DATAMETRIA Vue.js 3 Component Library - 41 modules (31 components + 10 composables) with 100% UX/UI compliance, WCAG 2.1 AA, dark mode, responsive system, micro-interactions",
5
+ "type": "module",
6
+ "main": "./dist/index.umd.js",
7
+ "module": "./dist/index.es.js",
8
+ "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "import": "./dist/index.es.js",
12
+ "require": "./dist/index.umd.js",
13
+ "types": "./dist/index.d.ts"
14
+ },
15
+ "./style.css": "./dist/style.css"
16
+ },
17
+ "files": [
18
+ "dist",
19
+ "src",
20
+ "README.md",
21
+ "ACCESSIBILITY.md",
22
+ "DESIGN-SYSTEM.md",
23
+ "PROGRESS.md"
24
+ ],
25
+ "sideEffects": [
26
+ "*.css",
27
+ "*.vue"
28
+ ],
29
+ "scripts": {
30
+ "dev": "vite",
31
+ "build": "vue-tsc && vite build",
32
+ "preview": "vite preview",
33
+ "test": "vitest",
34
+ "test:ui": "vitest --ui",
35
+ "test:coverage": "vitest --coverage",
36
+ "lint": "eslint . --ext .vue,.js,.jsx,.cjs,.mjs,.ts,.tsx,.cts,.mts --fix",
37
+ "type-check": "vue-tsc --noEmit",
38
+ "prepublishOnly": "npm run build"
39
+ },
40
+ "dependencies": {
41
+ "axios": "^1.12.2",
42
+ "vue": "^3.4.0"
43
+ },
44
+ "devDependencies": {
45
+ "@eslint/config-array": "^0.19.0",
46
+ "@eslint/object-schema": "^2.1.4",
47
+ "@testing-library/jest-dom": "^6.1.5",
48
+ "@testing-library/vue": "^8.0.1",
49
+ "@types/node": "^22.19.0",
50
+ "@vitejs/plugin-vue": "^5.0.0",
51
+ "@vitest/coverage-v8": "^2.1.0",
52
+ "@vue/eslint-config-prettier": "^10.0.0",
53
+ "@vue/eslint-config-typescript": "^14.0.0",
54
+ "@vue/test-utils": "^2.4.0",
55
+ "@vue/tsconfig": "^0.5.0",
56
+ "eslint": "^9.17.0",
57
+ "eslint-plugin-vue": "^9.31.0",
58
+ "jsdom": "^25.0.0",
59
+ "prettier": "^3.4.0",
60
+ "typescript": "~5.7.0",
61
+ "vite": "^6.0.0",
62
+ "vitest": "^2.1.0",
63
+ "vue-tsc": "^2.2.0"
64
+ },
65
+ "peerDependencies": {
66
+ "vue": "^3.4.0"
67
+ },
68
+ "keywords": [
69
+ "vue",
70
+ "vue3",
71
+ "vuejs",
72
+ "components",
73
+ "design-system",
74
+ "datametria",
75
+ "typescript",
76
+ "enterprise",
77
+ "ui-library",
78
+ "component-library",
79
+ "composition-api",
80
+ "wcag",
81
+ "accessibility",
82
+ "a11y",
83
+ "responsive",
84
+ "mobile-first",
85
+ "dark-mode"
86
+ ],
87
+ "author": "DATAMETRIA Team <dev@datametria.io>",
88
+ "license": "MIT",
89
+ "repository": {
90
+ "type": "git",
91
+ "url": "https://github.com/datametria/DATAMETRIA-common-libraries",
92
+ "directory": "packages/vue-components"
93
+ },
94
+ "bugs": {
95
+ "url": "https://github.com/datametria/DATAMETRIA-common-libraries/issues"
96
+ },
97
+ "homepage": "https://github.com/datametria/DATAMETRIA-common-libraries#readme"
98
+ }
@@ -1,123 +1,137 @@
1
- <template>
2
- <div v-if="modelValue" :class="alertClasses">
3
- <div class="datametria-alert__icon">
4
- <span v-if="variant === 'success'">✓</span>
5
- <span v-else-if="variant === 'error'">✕</span>
6
- <span v-else-if="variant === 'warning'">⚠</span>
7
- <span v-else>ℹ</span>
8
- </div>
9
-
10
- <div class="datametria-alert__content">
11
- <h4 v-if="title" class="datametria-alert__title">{{ title }}</h4>
12
- <p class="datametria-alert__message">
13
- <slot>{{ message }}</slot>
14
- </p>
15
- </div>
16
-
17
- <button
18
- v-if="closable"
19
- class="datametria-alert__close"
20
- @click="$emit('update:modelValue', false)"
21
- >
22
- ×
23
- </button>
24
- </div>
25
- </template>
26
-
27
- <script setup lang="ts">
28
- import { computed } from 'vue'
29
-
30
- type AlertVariant = 'success' | 'error' | 'warning' | 'info'
31
-
32
- interface Props {
33
- modelValue?: boolean
34
- variant?: AlertVariant
35
- title?: string
36
- message?: string
37
- closable?: boolean
38
- }
39
-
40
- const props = withDefaults(defineProps<Props>(), {
41
- modelValue: true,
42
- variant: 'info',
43
- closable: true
44
- })
45
-
46
- defineEmits<{
47
- 'update:modelValue': [value: boolean]
48
- }>()
49
-
50
- const alertClasses = computed(() => [
51
- 'datametria-alert',
52
- `datametria-alert--${props.variant}`
53
- ])
54
- </script>
55
-
56
- <style scoped>
57
- .datametria-alert {
58
- display: flex;
59
- gap: 0.75rem;
60
- padding: 1rem;
61
- border-radius: 0.5rem;
62
- border-left: 4px solid;
63
- }
64
-
65
- .datametria-alert--success {
66
- background: #f0fdf4;
67
- border-color: #10b981;
68
- color: #065f46;
69
- }
70
-
71
- .datametria-alert--error {
72
- background: #fef2f2;
73
- border-color: #ef4444;
74
- color: #991b1b;
75
- }
76
-
77
- .datametria-alert--warning {
78
- background: #fffbeb;
79
- border-color: #f59e0b;
80
- color: #92400e;
81
- }
82
-
83
- .datametria-alert--info {
84
- background: #eff6ff;
85
- border-color: #0072CE;
86
- color: #1e3a8a;
87
- }
88
-
89
- .datametria-alert__icon {
90
- font-size: 1.25rem;
91
- font-weight: bold;
92
- }
93
-
94
- .datametria-alert__content {
95
- flex: 1;
96
- }
97
-
98
- .datametria-alert__title {
99
- margin: 0 0 0.25rem 0;
100
- font-size: 0.875rem;
101
- font-weight: 600;
102
- }
103
-
104
- .datametria-alert__message {
105
- margin: 0;
106
- font-size: 0.875rem;
107
- }
108
-
109
- .datametria-alert__close {
110
- background: none;
111
- border: none;
112
- font-size: 1.5rem;
113
- line-height: 1;
114
- cursor: pointer;
115
- padding: 0;
116
- opacity: 0.5;
117
- transition: opacity 0.2s;
118
- }
119
-
120
- .datametria-alert__close:hover {
121
- opacity: 1;
122
- }
123
- </style>
1
+ <template>
2
+ <div v-if="modelValue" :class="alertClasses">
3
+ <div class="datametria-alert__icon">
4
+ <span v-if="variant === 'success'">✓</span>
5
+ <span v-else-if="variant === 'error'">✕</span>
6
+ <span v-else-if="variant === 'warning'">⚠</span>
7
+ <span v-else>ℹ</span>
8
+ </div>
9
+
10
+ <div class="datametria-alert__content">
11
+ <h4 v-if="title" class="datametria-alert__title">{{ title }}</h4>
12
+ <p class="datametria-alert__message">
13
+ <slot>{{ message }}</slot>
14
+ </p>
15
+ </div>
16
+
17
+ <button
18
+ v-if="closable"
19
+ class="datametria-alert__close"
20
+ @click="$emit('update:modelValue', false)"
21
+ >
22
+ ×
23
+ </button>
24
+ </div>
25
+ </template>
26
+
27
+ <script setup lang="ts">
28
+ import { computed } from 'vue'
29
+
30
+ type AlertVariant = 'success' | 'error' | 'warning' | 'info' | 'primary'
31
+
32
+ interface Props {
33
+ modelValue?: boolean
34
+ variant?: AlertVariant
35
+ title?: string
36
+ message?: string
37
+ closable?: boolean
38
+ }
39
+
40
+ const props = withDefaults(defineProps<Props>(), {
41
+ modelValue: true,
42
+ variant: 'info',
43
+ closable: true
44
+ })
45
+
46
+ // Validação em desenvolvimento
47
+ if (process.env.NODE_ENV === 'development') {
48
+ const validVariants: AlertVariant[] = ['success', 'error', 'warning', 'info', 'primary']
49
+ if (!validVariants.includes(props.variant)) {
50
+ console.warn(`[DatametriaAlert] Invalid variant "${props.variant}". Valid options: ${validVariants.join(', ')}`)
51
+ }
52
+ }
53
+
54
+ defineEmits<{
55
+ 'update:modelValue': [value: boolean]
56
+ }>()
57
+
58
+ const alertClasses = computed(() => [
59
+ 'datametria-alert',
60
+ `datametria-alert--${props.variant}`
61
+ ])
62
+ </script>
63
+
64
+ <style scoped>
65
+ .datametria-alert {
66
+ display: flex;
67
+ gap: 0.75rem;
68
+ padding: 1rem;
69
+ border-radius: 0.5rem;
70
+ border-left: 4px solid;
71
+ }
72
+
73
+ .datametria-alert--success {
74
+ background: #f0fdf4;
75
+ border-color: #10b981;
76
+ color: #065f46;
77
+ }
78
+
79
+ .datametria-alert--error {
80
+ background: #fef2f2;
81
+ border-color: #ef4444;
82
+ color: #991b1b;
83
+ }
84
+
85
+ .datametria-alert--warning {
86
+ background: #fffbeb;
87
+ border-color: #f59e0b;
88
+ color: #92400e;
89
+ }
90
+
91
+ .datametria-alert--primary {
92
+ background: #eff6ff;
93
+ border-color: #0072CE;
94
+ color: #1e3a8a;
95
+ }
96
+
97
+ .datametria-alert--info {
98
+ background: #f9fafb;
99
+ border-color: #6b7280;
100
+ color: #374151;
101
+ }
102
+
103
+ .datametria-alert__icon {
104
+ font-size: 1.25rem;
105
+ font-weight: bold;
106
+ }
107
+
108
+ .datametria-alert__content {
109
+ flex: 1;
110
+ }
111
+
112
+ .datametria-alert__title {
113
+ margin: 0 0 0.25rem 0;
114
+ font-size: 0.875rem;
115
+ font-weight: 600;
116
+ }
117
+
118
+ .datametria-alert__message {
119
+ margin: 0;
120
+ font-size: 0.875rem;
121
+ }
122
+
123
+ .datametria-alert__close {
124
+ background: none;
125
+ border: none;
126
+ font-size: 1.5rem;
127
+ line-height: 1;
128
+ cursor: pointer;
129
+ padding: 0;
130
+ opacity: 0.5;
131
+ transition: opacity 0.2s;
132
+ }
133
+
134
+ .datametria-alert__close:hover {
135
+ opacity: 1;
136
+ }
137
+ </style>
@@ -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>