@datametria/vue-components 2.3.1 → 2.4.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 (126) hide show
  1. package/README.md +625 -594
  2. package/dist/index.es.js +1962 -1887
  3. package/dist/index.umd.js +6 -6
  4. package/dist/src/components/DatametriaForm.vue.d.ts +1 -1
  5. package/dist/src/components/DatametriaInput.vue.d.ts +9 -1
  6. package/dist/src/components/DatametriaSelect.vue.d.ts +10 -1
  7. package/dist/vue-components.css +1 -1
  8. package/package.json +103 -102
  9. package/src/components/DatametriaAlert.vue +151 -133
  10. package/src/components/DatametriaAutocomplete.vue +250 -229
  11. package/src/components/DatametriaAvatar.vue +256 -238
  12. package/src/components/DatametriaBadge.vue +101 -96
  13. package/src/components/DatametriaBreadcrumb.vue +132 -128
  14. package/src/components/DatametriaButton.vue +191 -173
  15. package/src/components/DatametriaCard.vue +84 -66
  16. package/src/components/DatametriaCheckbox.vue +197 -193
  17. package/src/components/DatametriaChip.vue +159 -141
  18. package/src/components/DatametriaContainer.vue +70 -52
  19. package/src/components/DatametriaDataTable.vue +318 -300
  20. package/src/components/DatametriaDatePicker.vue +396 -378
  21. package/src/components/DatametriaDialog.vue +297 -293
  22. package/src/components/DatametriaDivider.vue +105 -98
  23. package/src/components/DatametriaDropdown.vue +356 -350
  24. package/src/components/DatametriaEmpty.vue +155 -151
  25. package/src/components/DatametriaFileUpload.vue +413 -395
  26. package/src/components/DatametriaFloatingBar.vue +144 -126
  27. package/src/components/DatametriaForm.vue +174 -156
  28. package/src/components/DatametriaFormItem.vue +183 -179
  29. package/src/components/DatametriaGrid.vue +55 -37
  30. package/src/components/DatametriaInput.vue +314 -263
  31. package/src/components/DatametriaMenu.vue +618 -600
  32. package/src/components/DatametriaModal.vue +147 -129
  33. package/src/components/DatametriaNavbar.vue +277 -223
  34. package/src/components/DatametriaPagination.vue +375 -371
  35. package/src/components/DatametriaPasswordInput.vue +446 -426
  36. package/src/components/DatametriaPopconfirm.vue +240 -234
  37. package/src/components/DatametriaProgress.vue +228 -224
  38. package/src/components/DatametriaRadio.vue +151 -147
  39. package/src/components/DatametriaResult.vue +135 -131
  40. package/src/components/DatametriaSelect.vue +311 -211
  41. package/src/components/DatametriaSidebar.vue +294 -222
  42. package/src/components/DatametriaSkeleton.vue +257 -234
  43. package/src/components/DatametriaSlider.vue +409 -391
  44. package/src/components/DatametriaSortableTable.vue +826 -802
  45. package/src/components/DatametriaSpinner.vue +114 -110
  46. package/src/components/DatametriaSteps.vue +318 -312
  47. package/src/components/DatametriaSwitch.vue +146 -142
  48. package/src/components/DatametriaTabPane.vue +94 -76
  49. package/src/components/DatametriaTable.vue +118 -100
  50. package/src/components/DatametriaTabs.vue +315 -297
  51. package/src/components/DatametriaTextarea.vue +213 -195
  52. package/src/components/DatametriaTimePicker.vue +317 -299
  53. package/src/components/DatametriaToast.vue +176 -176
  54. package/src/components/DatametriaTooltip.vue +421 -400
  55. package/src/components/DatametriaTree.vue +126 -122
  56. package/src/components/DatametriaTreeNode.vue +176 -172
  57. package/src/components/DatametriaUpload.vue +379 -361
  58. package/src/components/__tests__/DatametriaAlert.test.js +35 -35
  59. package/src/components/__tests__/DatametriaAlert.test.ts +190 -190
  60. package/src/components/__tests__/DatametriaAvatar.test.ts +151 -151
  61. package/src/components/__tests__/DatametriaBadge.test.js +29 -29
  62. package/src/components/__tests__/DatametriaBadge.test.ts +167 -167
  63. package/src/components/__tests__/DatametriaBreadcrumb.test.ts +187 -0
  64. package/src/components/__tests__/DatametriaButton.test.js +30 -30
  65. package/src/components/__tests__/DatametriaButton.test.ts +283 -283
  66. package/src/components/__tests__/DatametriaCard.test.ts +201 -201
  67. package/src/components/__tests__/DatametriaCheckbox.test.ts +204 -0
  68. package/src/components/__tests__/DatametriaChip.test.js +38 -38
  69. package/src/components/__tests__/DatametriaContainer.test.ts +52 -52
  70. package/src/components/__tests__/DatametriaDialog.test.ts +338 -0
  71. package/src/components/__tests__/DatametriaDivider.test.ts +54 -54
  72. package/src/components/__tests__/DatametriaDropdown.test.ts +357 -0
  73. package/src/components/__tests__/DatametriaEmpty.test.ts +261 -0
  74. package/src/components/__tests__/DatametriaFileUpload.test.ts +290 -290
  75. package/src/components/__tests__/DatametriaFloatingBar.test.ts +137 -137
  76. package/src/components/__tests__/DatametriaForm.test.ts +96 -0
  77. package/src/components/__tests__/DatametriaFormItem.test.ts +58 -0
  78. package/src/components/__tests__/DatametriaGrid.test.ts +31 -31
  79. package/src/components/__tests__/DatametriaInput.test.ts +72 -72
  80. package/src/components/__tests__/DatametriaMenu.test.ts +366 -366
  81. package/src/components/__tests__/DatametriaModal.test.ts +86 -86
  82. package/src/components/__tests__/DatametriaNavbar.test.js +48 -48
  83. package/src/components/__tests__/DatametriaNavbar.test.ts +203 -203
  84. package/src/components/__tests__/DatametriaPasswordInput.test.js +305 -305
  85. package/src/components/__tests__/DatametriaRadio.test.ts +195 -0
  86. package/src/components/__tests__/DatametriaSelect.test.ts +77 -77
  87. package/src/components/__tests__/DatametriaSidebar.test.ts +169 -169
  88. package/src/components/__tests__/DatametriaSlider.test.ts +261 -261
  89. package/src/components/__tests__/DatametriaSortableTable.test.js +168 -168
  90. package/src/components/__tests__/DatametriaSpinner.test.ts +156 -156
  91. package/src/components/__tests__/DatametriaSteps.test.ts +211 -0
  92. package/src/components/__tests__/DatametriaSwitch.test.ts +129 -0
  93. package/src/components/__tests__/DatametriaTabPane.test.ts +205 -0
  94. package/src/components/__tests__/DatametriaTable.test.ts +97 -97
  95. package/src/components/__tests__/DatametriaTabs.test.ts +232 -232
  96. package/src/components/__tests__/DatametriaToast.test.js +48 -48
  97. package/src/components/__tests__/DatametriaToast.test.ts +99 -99
  98. package/src/components/__tests__/DatametriaTree.test.ts +376 -0
  99. package/src/components/__tests__/index.test.ts +48 -0
  100. package/src/composables/useAccessibilityScale.ts +94 -94
  101. package/src/composables/useBreakpoints.ts +82 -82
  102. package/src/composables/useHapticFeedback.ts +439 -439
  103. package/src/composables/useRipple.ts +218 -218
  104. package/src/composables/useTheme.ts +5 -1
  105. package/src/index.ts +84 -84
  106. package/src/stories/Variants.stories.js +95 -95
  107. package/src/styles/design-tokens.css +623 -623
  108. package/src/theme/ThemeProvider.vue +96 -96
  109. package/src/theme/__tests__/ThemeProvider.test.ts +208 -208
  110. package/src/theme/__tests__/constants.test.ts +31 -31
  111. package/src/theme/__tests__/presets.test.ts +166 -166
  112. package/src/theme/__tests__/tokens.test.ts +155 -155
  113. package/src/theme/__tests__/types.test.ts +153 -153
  114. package/src/theme/__tests__/useTheme.test.ts +146 -146
  115. package/src/theme/constants.ts +14 -14
  116. package/src/theme/index.ts +12 -12
  117. package/src/theme/presets/datametria.ts +94 -94
  118. package/src/theme/presets/default.ts +94 -94
  119. package/src/theme/presets/index.ts +8 -8
  120. package/src/theme/tokens/colors.ts +28 -28
  121. package/src/theme/tokens/index.ts +47 -47
  122. package/src/theme/tokens/spacing.ts +21 -21
  123. package/src/theme/tokens/typography.ts +35 -35
  124. package/src/theme/types.ts +111 -111
  125. package/src/theme/useTheme.ts +28 -28
  126. package/src/types/index.ts +55 -55
@@ -1,373 +1,377 @@
1
- <template>
2
- <div class="datametria-pagination" :class="classes">
3
- <template v-for="item in layoutItems" :key="item">
4
- <!-- Total -->
5
- <span v-if="item === 'total'" class="datametria-pagination__total">
6
- Total: {{ total }}
7
- </span>
8
-
9
- <!-- Sizes -->
10
- <select
11
- v-if="item === 'sizes'"
12
- v-model="currentPageSize"
13
- class="datametria-pagination__sizes"
14
- :disabled="disabled"
15
- @change="handleSizeChange"
16
- >
17
- <option v-for="size in pageSizes" :key="size" :value="size">
18
- {{ size }} / página
19
- </option>
20
- </select>
21
-
22
- <!-- Prev -->
23
- <button
24
- v-if="item === 'prev'"
25
- class="datametria-pagination__btn"
26
- :disabled="currentPage === 1 || disabled"
27
- @click="handlePrev"
28
- >
29
- <span class="datametria-pagination__icon">‹</span>
30
- </button>
31
-
32
- <!-- Pager -->
33
- <ul v-if="item === 'pager'" class="datametria-pagination__pager">
34
- <li
35
- v-for="page in pagerList"
36
- :key="page"
37
- class="datametria-pagination__number"
38
- :class="{
39
- 'is-active': page === currentPage,
40
- 'is-disabled': disabled
41
- }"
42
- @click="handlePageClick(page)"
43
- >
44
- {{ page === '...' ? '•••' : page }}
45
- </li>
46
- </ul>
47
-
48
- <!-- Next -->
49
- <button
50
- v-if="item === 'next'"
51
- class="datametria-pagination__btn"
52
- :disabled="currentPage === totalPages || disabled"
53
- @click="handleNext"
54
- >
55
- <span class="datametria-pagination__icon">›</span>
56
- </button>
57
-
58
- <!-- Jumper -->
59
- <span v-if="item === 'jumper'" class="datametria-pagination__jumper">
60
- Ir para
61
- <input
62
- v-model.number="jumpPage"
63
- type="number"
64
- min="1"
65
- :max="totalPages"
66
- :disabled="disabled"
67
- @keyup.enter="handleJump"
68
- />
69
- </span>
70
- </template>
71
- </div>
72
- </template>
73
-
74
- <script setup lang="ts">
75
- import { ref, computed, watch } from 'vue'
76
-
77
- interface Props {
78
- modelValue?: number
79
- total?: number
80
- pageSize?: number
81
- pageSizes?: number[]
82
- layout?: string
83
- pagerCount?: number
84
- disabled?: boolean
85
- small?: boolean
86
- }
87
-
88
- const props = withDefaults(defineProps<Props>(), {
89
- modelValue: 1,
90
- total: 0,
91
- pageSize: 10,
92
- pageSizes: () => [10, 20, 30, 50, 100],
93
- layout: 'prev, pager, next',
94
- pagerCount: 7,
95
- disabled: false,
96
- small: false
97
- })
98
-
99
- const emit = defineEmits<{
100
- 'update:modelValue': [value: number]
101
- 'size-change': [size: number]
102
- 'current-change': [page: number]
103
- }>()
104
-
105
- const currentPage = ref(props.modelValue)
106
- const currentPageSize = ref(props.pageSize)
107
- const jumpPage = ref<number | ''>('')
108
-
109
- const totalPages = computed(() => Math.ceil(props.total / currentPageSize.value) || 1)
110
-
111
- const layoutItems = computed(() => {
112
- return props.layout.split(',').map(item => item.trim())
113
- })
114
-
115
- const pagerList = computed(() => {
116
- const pages: (number | string)[] = []
117
- const count = props.pagerCount
118
- const half = Math.floor(count / 2)
119
-
120
- if (totalPages.value <= count) {
121
- for (let i = 1; i <= totalPages.value; i++) {
122
- pages.push(i)
123
- }
124
- } else {
125
- if (currentPage.value <= half + 1) {
126
- for (let i = 1; i <= count - 2; i++) {
127
- pages.push(i)
128
- }
129
- pages.push('...')
130
- pages.push(totalPages.value)
131
- } else if (currentPage.value >= totalPages.value - half) {
132
- pages.push(1)
133
- pages.push('...')
134
- for (let i = totalPages.value - count + 3; i <= totalPages.value; i++) {
135
- pages.push(i)
136
- }
137
- } else {
138
- pages.push(1)
139
- pages.push('...')
140
- for (let i = currentPage.value - half + 2; i <= currentPage.value + half - 2; i++) {
141
- pages.push(i)
142
- }
143
- pages.push('...')
144
- pages.push(totalPages.value)
145
- }
1
+ <template>
2
+ <div class="datametria-pagination" :class="classes">
3
+ <template v-for="item in layoutItems" :key="item">
4
+ <!-- Total -->
5
+ <span v-if="item === 'total'" class="datametria-pagination__total">
6
+ Total: {{ total }}
7
+ </span>
8
+
9
+ <!-- Sizes -->
10
+ <select
11
+ v-if="item === 'sizes'"
12
+ v-model="currentPageSize"
13
+ class="datametria-pagination__sizes"
14
+ :disabled="disabled"
15
+ @change="handleSizeChange"
16
+ >
17
+ <option v-for="size in pageSizes" :key="size" :value="size">
18
+ {{ size }} / página
19
+ </option>
20
+ </select>
21
+
22
+ <!-- Prev -->
23
+ <button
24
+ v-if="item === 'prev'"
25
+ class="datametria-pagination__btn"
26
+ :disabled="currentPage === 1 || disabled"
27
+ @click="handlePrev"
28
+ >
29
+ <span class="datametria-pagination__icon">‹</span>
30
+ </button>
31
+
32
+ <!-- Pager -->
33
+ <ul v-if="item === 'pager'" class="datametria-pagination__pager">
34
+ <li
35
+ v-for="page in pagerList"
36
+ :key="page"
37
+ class="datametria-pagination__number"
38
+ :class="{
39
+ 'is-active': page === currentPage,
40
+ 'is-disabled': disabled
41
+ }"
42
+ @click="handlePageClick(page)"
43
+ >
44
+ {{ page === '...' ? '•••' : page }}
45
+ </li>
46
+ </ul>
47
+
48
+ <!-- Next -->
49
+ <button
50
+ v-if="item === 'next'"
51
+ class="datametria-pagination__btn"
52
+ :disabled="currentPage === totalPages || disabled"
53
+ @click="handleNext"
54
+ >
55
+ <span class="datametria-pagination__icon">›</span>
56
+ </button>
57
+
58
+ <!-- Jumper -->
59
+ <span v-if="item === 'jumper'" class="datametria-pagination__jumper">
60
+ Ir para
61
+ <input
62
+ v-model.number="jumpPage"
63
+ type="number"
64
+ min="1"
65
+ :max="totalPages"
66
+ :disabled="disabled"
67
+ @keyup.enter="handleJump"
68
+ />
69
+ </span>
70
+ </template>
71
+ </div>
72
+ </template>
73
+
74
+ <script setup lang="ts">
75
+ import { ref, computed, watch } from 'vue'
76
+
77
+ interface Props {
78
+ modelValue?: number
79
+ total?: number
80
+ pageSize?: number
81
+ pageSizes?: number[]
82
+ layout?: string
83
+ pagerCount?: number
84
+ disabled?: boolean
85
+ small?: boolean
86
+ }
87
+
88
+ const props = withDefaults(defineProps<Props>(), {
89
+ modelValue: 1,
90
+ total: 0,
91
+ pageSize: 10,
92
+ pageSizes: () => [10, 20, 30, 50, 100],
93
+ layout: 'prev, pager, next',
94
+ pagerCount: 7,
95
+ disabled: false,
96
+ small: false
97
+ })
98
+
99
+ const emit = defineEmits<{
100
+ 'update:modelValue': [value: number]
101
+ 'size-change': [size: number]
102
+ 'current-change': [page: number]
103
+ }>()
104
+
105
+ const currentPage = ref(props.modelValue)
106
+ const currentPageSize = ref(props.pageSize)
107
+ const jumpPage = ref<number | ''>('')
108
+
109
+ const totalPages = computed(() => Math.ceil(props.total / currentPageSize.value) || 1)
110
+
111
+ const layoutItems = computed(() => {
112
+ return props.layout.split(',').map(item => item.trim())
113
+ })
114
+
115
+ const pagerList = computed(() => {
116
+ const pages: (number | string)[] = []
117
+ const count = props.pagerCount
118
+ const half = Math.floor(count / 2)
119
+
120
+ if (totalPages.value <= count) {
121
+ for (let i = 1; i <= totalPages.value; i++) {
122
+ pages.push(i)
123
+ }
124
+ } else {
125
+ if (currentPage.value <= half + 1) {
126
+ for (let i = 1; i <= count - 2; i++) {
127
+ pages.push(i)
128
+ }
129
+ pages.push('...')
130
+ pages.push(totalPages.value)
131
+ } else if (currentPage.value >= totalPages.value - half) {
132
+ pages.push(1)
133
+ pages.push('...')
134
+ for (let i = totalPages.value - count + 3; i <= totalPages.value; i++) {
135
+ pages.push(i)
136
+ }
137
+ } else {
138
+ pages.push(1)
139
+ pages.push('...')
140
+ for (let i = currentPage.value - half + 2; i <= currentPage.value + half - 2; i++) {
141
+ pages.push(i)
142
+ }
143
+ pages.push('...')
144
+ pages.push(totalPages.value)
145
+ }
146
+ }
147
+
148
+ return pages
149
+ })
150
+
151
+ const classes = computed(() => ({
152
+ 'is-small': props.small,
153
+ 'is-disabled': props.disabled
154
+ }))
155
+
156
+ watch(() => props.modelValue, (val) => {
157
+ currentPage.value = val
158
+ })
159
+
160
+ watch(() => props.pageSize, (val) => {
161
+ currentPageSize.value = val
162
+ })
163
+
164
+ const handlePrev = () => {
165
+ if (currentPage.value > 1) {
166
+ changePage(currentPage.value - 1)
167
+ }
168
+ }
169
+
170
+ const handleNext = () => {
171
+ if (currentPage.value < totalPages.value) {
172
+ changePage(currentPage.value + 1)
173
+ }
174
+ }
175
+
176
+ const handlePageClick = (page: number | string) => {
177
+ if (page === '...' || props.disabled) return
178
+ changePage(page as number)
179
+ }
180
+
181
+ const handleSizeChange = () => {
182
+ const newPage = Math.min(currentPage.value, Math.ceil(props.total / currentPageSize.value))
183
+ changePage(newPage)
184
+ emit('size-change', currentPageSize.value)
185
+ }
186
+
187
+ const handleJump = () => {
188
+ if (jumpPage.value && jumpPage.value >= 1 && jumpPage.value <= totalPages.value) {
189
+ changePage(jumpPage.value)
190
+ jumpPage.value = ''
191
+ }
192
+ }
193
+
194
+ const changePage = (page: number) => {
195
+ if (page === currentPage.value) return
196
+ currentPage.value = page
197
+ emit('update:modelValue', page)
198
+ emit('current-change', page)
199
+ }
200
+ </script>
201
+
202
+ <style scoped>
203
+ .datametria-pagination {
204
+ display: flex;
205
+ align-items: center;
206
+ gap: 8px;
207
+ font-size: 14px;
208
+ color: var(--datametria-text-primary, #303133);
209
+ }
210
+
211
+ .datametria-pagination.is-small {
212
+ font-size: 12px;
213
+ }
214
+
215
+ .datametria-pagination.is-disabled {
216
+ opacity: 0.5;
217
+ pointer-events: none;
218
+ }
219
+
220
+ .datametria-pagination__total {
221
+ color: var(--datametria-text-secondary, #606266);
222
+ }
223
+
224
+ .datametria-pagination__sizes {
225
+ width: 120px;
226
+ height: 32px;
227
+ padding: 0 8px;
228
+ border: 1px solid var(--datametria-border-color, #dcdfe6);
229
+ border-radius: 4px;
230
+ background: var(--datametria-bg-color, #ffffff);
231
+ color: var(--datametria-text-primary, #303133);
232
+ font-size: 14px;
233
+ cursor: pointer;
234
+ transition: all 0.2s;
235
+ }
236
+
237
+ .datametria-pagination__sizes:hover:not(:disabled) {
238
+ border-color: var(--datametria-primary-color, #0072ce);
239
+ }
240
+
241
+ .datametria-pagination__sizes:focus {
242
+ outline: none;
243
+ border-color: var(--datametria-primary-color, #0072ce);
244
+ }
245
+
246
+ .datametria-pagination__sizes:disabled {
247
+ cursor: not-allowed;
248
+ opacity: 0.5;
249
+ }
250
+
251
+ .datametria-pagination__btn {
252
+ min-width: 32px;
253
+ height: 32px;
254
+ padding: 0 8px;
255
+ border: 1px solid var(--datametria-border-color, #dcdfe6);
256
+ border-radius: 4px;
257
+ background: var(--datametria-bg-color, #ffffff);
258
+ color: var(--datametria-text-primary, #303133);
259
+ cursor: pointer;
260
+ transition: all 0.2s;
261
+ }
262
+
263
+ .datametria-pagination__btn:hover:not(:disabled) {
264
+ color: var(--datametria-primary-color, #0072ce);
265
+ border-color: var(--datametria-primary-color, #0072ce);
266
+ }
267
+
268
+ .datametria-pagination__btn:disabled {
269
+ cursor: not-allowed;
270
+ opacity: 0.5;
271
+ }
272
+
273
+ .datametria-pagination__icon {
274
+ font-size: 18px;
275
+ font-weight: bold;
276
+ }
277
+
278
+ .datametria-pagination__pager {
279
+ display: flex;
280
+ gap: 4px;
281
+ margin: 0;
282
+ padding: 0;
283
+ list-style: none;
284
+ }
285
+
286
+ .datametria-pagination__number {
287
+ min-width: 32px;
288
+ height: 32px;
289
+ padding: 0 8px;
290
+ display: flex;
291
+ align-items: center;
292
+ justify-content: center;
293
+ border: 1px solid var(--datametria-border-color, #dcdfe6);
294
+ border-radius: 4px;
295
+ background: var(--datametria-bg-color, #ffffff);
296
+ cursor: pointer;
297
+ transition: all 0.2s;
298
+ }
299
+
300
+ .datametria-pagination__number:hover:not(.is-active):not(.is-disabled) {
301
+ color: var(--datametria-primary-color, #0072ce);
302
+ border-color: var(--datametria-primary-color, #0072ce);
303
+ }
304
+
305
+ .datametria-pagination__number.is-active {
306
+ color: #ffffff;
307
+ background: var(--datametria-primary-color, #0072ce);
308
+ border-color: var(--datametria-primary-color, #0072ce);
309
+ }
310
+
311
+ .datametria-pagination__number.is-disabled {
312
+ cursor: not-allowed;
313
+ opacity: 0.5;
314
+ }
315
+
316
+ .datametria-pagination__jumper {
317
+ display: flex;
318
+ align-items: center;
319
+ gap: 8px;
320
+ color: var(--datametria-text-secondary, #606266);
321
+ }
322
+
323
+ .datametria-pagination__jumper input {
324
+ width: 60px;
325
+ height: 32px;
326
+ padding: 0 8px;
327
+ border: 1px solid var(--datametria-border-color, #dcdfe6);
328
+ border-radius: 4px;
329
+ text-align: center;
330
+ font-size: 14px;
331
+ }
332
+
333
+ .datametria-pagination__jumper input:focus {
334
+ outline: none;
335
+ border-color: var(--datametria-primary-color, #0072ce);
336
+ }
337
+
338
+ .datametria-pagination__jumper input:disabled {
339
+ cursor: not-allowed;
340
+ opacity: 0.5;
341
+ }
342
+
343
+ /* Dark mode */
344
+ @media (prefers-color-scheme: dark) {
345
+ .datametria-pagination {
346
+ color: var(--datametria-text-primary, #e5eaf3);
146
347
  }
147
348
 
148
- return pages
149
- })
150
-
151
- const classes = computed(() => ({
152
- 'is-small': props.small,
153
- 'is-disabled': props.disabled
154
- }))
155
-
156
- watch(() => props.modelValue, (val) => {
157
- currentPage.value = val
158
- })
159
-
160
- watch(() => props.pageSize, (val) => {
161
- currentPageSize.value = val
162
- })
163
-
164
- const handlePrev = () => {
165
- if (currentPage.value > 1) {
166
- changePage(currentPage.value - 1)
167
- }
168
- }
169
-
170
- const handleNext = () => {
171
- if (currentPage.value < totalPages.value) {
172
- changePage(currentPage.value + 1)
173
- }
174
- }
175
-
176
- const handlePageClick = (page: number | string) => {
177
- if (page === '...' || props.disabled) return
178
- changePage(page as number)
179
- }
180
-
181
- const handleSizeChange = () => {
182
- const newPage = Math.min(currentPage.value, Math.ceil(props.total / currentPageSize.value))
183
- changePage(newPage)
184
- emit('size-change', currentPageSize.value)
185
- }
186
-
187
- const handleJump = () => {
188
- if (jumpPage.value && jumpPage.value >= 1 && jumpPage.value <= totalPages.value) {
189
- changePage(jumpPage.value)
190
- jumpPage.value = ''
191
- }
192
- }
193
-
194
- const changePage = (page: number) => {
195
- if (page === currentPage.value) return
196
- currentPage.value = page
197
- emit('update:modelValue', page)
198
- emit('current-change', page)
199
- }
200
- </script>
201
-
202
- <style scoped>
203
- .datametria-pagination {
204
- display: flex;
205
- align-items: center;
206
- gap: 8px;
207
- font-size: 14px;
208
- color: var(--datametria-text-primary, #303133);
209
- }
210
-
211
- .datametria-pagination.is-small {
212
- font-size: 12px;
213
- }
214
-
215
- .datametria-pagination.is-disabled {
216
- opacity: 0.5;
217
- pointer-events: none;
218
- }
219
-
220
- .datametria-pagination__total {
221
- color: var(--datametria-text-secondary, #606266);
222
- }
223
-
224
- .datametria-pagination__sizes {
225
- width: 120px;
226
- height: 32px;
227
- padding: 0 8px;
228
- border: 1px solid var(--datametria-border-color, #dcdfe6);
229
- border-radius: 4px;
230
- background: var(--datametria-bg-color, #ffffff);
231
- color: var(--datametria-text-primary, #303133);
232
- font-size: 14px;
233
- cursor: pointer;
234
- transition: all 0.2s;
235
- }
236
-
237
- .datametria-pagination__sizes:hover:not(:disabled) {
238
- border-color: var(--datametria-primary-color, #0072ce);
239
- }
240
-
241
- .datametria-pagination__sizes:focus {
242
- outline: none;
243
- border-color: var(--datametria-primary-color, #0072ce);
244
- }
245
-
246
- .datametria-pagination__sizes:disabled {
247
- cursor: not-allowed;
248
- opacity: 0.5;
249
- }
250
-
251
- .datametria-pagination__btn {
252
- min-width: 32px;
253
- height: 32px;
254
- padding: 0 8px;
255
- border: 1px solid var(--datametria-border-color, #dcdfe6);
256
- border-radius: 4px;
257
- background: var(--datametria-bg-color, #ffffff);
258
- color: var(--datametria-text-primary, #303133);
259
- cursor: pointer;
260
- transition: all 0.2s;
261
- }
262
-
263
- .datametria-pagination__btn:hover:not(:disabled) {
264
- color: var(--datametria-primary-color, #0072ce);
265
- border-color: var(--datametria-primary-color, #0072ce);
266
- }
267
-
268
- .datametria-pagination__btn:disabled {
269
- cursor: not-allowed;
270
- opacity: 0.5;
271
- }
272
-
273
- .datametria-pagination__icon {
274
- font-size: 18px;
275
- font-weight: bold;
276
- }
277
-
278
- .datametria-pagination__pager {
279
- display: flex;
280
- gap: 4px;
281
- margin: 0;
282
- padding: 0;
283
- list-style: none;
284
- }
285
-
286
- .datametria-pagination__number {
287
- min-width: 32px;
288
- height: 32px;
289
- padding: 0 8px;
290
- display: flex;
291
- align-items: center;
292
- justify-content: center;
293
- border: 1px solid var(--datametria-border-color, #dcdfe6);
294
- border-radius: 4px;
295
- background: var(--datametria-bg-color, #ffffff);
296
- cursor: pointer;
297
- transition: all 0.2s;
298
- }
299
-
300
- .datametria-pagination__number:hover:not(.is-active):not(.is-disabled) {
301
- color: var(--datametria-primary-color, #0072ce);
302
- border-color: var(--datametria-primary-color, #0072ce);
303
- }
304
-
305
- .datametria-pagination__number.is-active {
306
- color: #ffffff;
307
- background: var(--datametria-primary-color, #0072ce);
308
- border-color: var(--datametria-primary-color, #0072ce);
309
- }
310
-
311
- .datametria-pagination__number.is-disabled {
312
- cursor: not-allowed;
313
- opacity: 0.5;
314
- }
315
-
316
- .datametria-pagination__jumper {
317
- display: flex;
318
- align-items: center;
319
- gap: 8px;
320
- color: var(--datametria-text-secondary, #606266);
321
- }
322
-
323
- .datametria-pagination__jumper input {
324
- width: 60px;
325
- height: 32px;
326
- padding: 0 8px;
327
- border: 1px solid var(--datametria-border-color, #dcdfe6);
328
- border-radius: 4px;
329
- text-align: center;
330
- font-size: 14px;
331
- }
332
-
333
- .datametria-pagination__jumper input:focus {
334
- outline: none;
335
- border-color: var(--datametria-primary-color, #0072ce);
336
- }
337
-
338
- .datametria-pagination__jumper input:disabled {
339
- cursor: not-allowed;
340
- opacity: 0.5;
341
- }
342
-
343
- /* Dark mode */
344
- @media (prefers-color-scheme: dark) {
345
- .datametria-pagination {
346
- color: var(--datametria-text-primary, #e5eaf3);
347
- }
348
-
349
- .datametria-pagination__total,
350
- .datametria-pagination__jumper {
351
- color: var(--datametria-text-secondary, #a3a6ad);
352
- }
353
-
354
- .datametria-pagination__btn,
355
- .datametria-pagination__number {
356
- border-color: var(--datametria-border-color, #4c4d4f);
357
- background: var(--datametria-bg-color, #1d1e1f);
358
- color: var(--datametria-text-primary, #e5eaf3);
359
- }
360
-
361
- .datametria-pagination__jumper input {
362
- border-color: var(--datametria-border-color, #4c4d4f);
363
- background: var(--datametria-bg-color, #1d1e1f);
364
- color: var(--datametria-text-primary, #e5eaf3);
365
- }
366
-
367
- .datametria-pagination__sizes {
368
- border-color: var(--datametria-border-color, #4c4d4f);
369
- background: var(--datametria-bg-color, #1d1e1f);
370
- color: var(--datametria-text-primary, #e5eaf3);
371
- }
372
- }
373
- </style>
349
+ [data-theme="dark"] .datametria-pagination {
350
+ color: var(--datametria-text-primary, #e5eaf3);
351
+ }
352
+
353
+ .datametria-pagination__total,
354
+ .datametria-pagination__jumper {
355
+ color: var(--datametria-text-secondary, #a3a6ad);
356
+ }
357
+
358
+ .datametria-pagination__btn,
359
+ .datametria-pagination__number {
360
+ border-color: var(--datametria-border-color, #4c4d4f);
361
+ background: var(--datametria-bg-color, #1d1e1f);
362
+ color: var(--datametria-text-primary, #e5eaf3);
363
+ }
364
+
365
+ .datametria-pagination__jumper input {
366
+ border-color: var(--datametria-border-color, #4c4d4f);
367
+ background: var(--datametria-bg-color, #1d1e1f);
368
+ color: var(--datametria-text-primary, #e5eaf3);
369
+ }
370
+
371
+ .datametria-pagination__sizes {
372
+ border-color: var(--datametria-border-color, #4c4d4f);
373
+ background: var(--datametria-bg-color, #1d1e1f);
374
+ color: var(--datametria-text-primary, #e5eaf3);
375
+ }
376
+ }
377
+ </style>