@antify/ui 2.5.7 → 3.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 (44) hide show
  1. package/dist/components/AntAccordion.vue +5 -6
  2. package/dist/components/AntAccordionItem.vue +5 -7
  3. package/dist/components/AntAlert.vue +53 -54
  4. package/dist/components/AntButton.vue +60 -62
  5. package/dist/components/AntCard.vue +10 -11
  6. package/dist/components/AntIcon.vue +8 -8
  7. package/dist/components/AntKeycap.vue +15 -15
  8. package/dist/components/AntListGroup.vue +10 -10
  9. package/dist/components/AntModal.vue +5 -5
  10. package/dist/components/AntPagination.vue +38 -40
  11. package/dist/components/AntSkeleton.vue +5 -25
  12. package/dist/components/AntToast.vue +6 -6
  13. package/dist/components/AntToaster.vue +42 -15
  14. package/dist/components/__stories/AntListGroup.stories.js +6 -9
  15. package/dist/components/__stories/AntListGroup.stories.mjs +6 -9
  16. package/dist/components/__stories/AntListGroupItem.stories.js +1 -1
  17. package/dist/components/__stories/AntListGroupItem.stories.mjs +1 -1
  18. package/dist/components/__stories/AntToaster.stories.js +2 -2
  19. package/dist/components/__stories/AntToaster.stories.mjs +2 -2
  20. package/dist/components/inputs/AntCheckbox.vue +8 -9
  21. package/dist/components/inputs/AntColorInput/AntColorInput.vue +5 -10
  22. package/dist/components/inputs/AntImageInput.vue +34 -36
  23. package/dist/components/inputs/AntRadio.vue +8 -9
  24. package/dist/components/inputs/AntSelect.vue +64 -63
  25. package/dist/components/inputs/AntSwitch.vue +26 -27
  26. package/dist/components/inputs/AntSwitcher.vue +12 -11
  27. package/dist/components/inputs/AntTagInput.vue +6 -10
  28. package/dist/components/inputs/AntTextarea.vue +5 -9
  29. package/dist/components/inputs/Elements/AntBaseInput.vue +60 -60
  30. package/dist/components/inputs/__stories/AntCheckbox.stories.js +41 -14
  31. package/dist/components/inputs/__stories/AntCheckbox.stories.mjs +41 -14
  32. package/dist/components/table/AntTable.vue +11 -7
  33. package/dist/components/table/AntTableSkeleton.vue +5 -1
  34. package/dist/components/tabs/AntTabItem.vue +5 -7
  35. package/dist/composables/index.d.ts +1 -0
  36. package/dist/composables/index.js +11 -0
  37. package/dist/composables/index.mjs +1 -0
  38. package/dist/composables/useFlickerProtection.d.ts +22 -0
  39. package/dist/composables/useFlickerProtection.js +48 -0
  40. package/dist/composables/useFlickerProtection.mjs +48 -0
  41. package/dist/composables/useToaster.d.ts +1 -0
  42. package/dist/composables/useToaster.js +7 -4
  43. package/dist/composables/useToaster.mjs +7 -4
  44. package/package.json +1 -1
@@ -21,6 +21,24 @@ const props = withDefaults(defineProps<{
21
21
  position: CornerPosition.bottomLeft,
22
22
  });
23
23
 
24
+ const _toasts = computed(() => {
25
+ if(props.position === CornerPosition.topLeft || props.position === CornerPosition.topRight) {
26
+ return props.toasts;
27
+ }
28
+
29
+ return [
30
+ ...props.toasts,
31
+ ].reverse();
32
+ });
33
+
34
+ const transitionName = computed(() => {
35
+ if(props.position === CornerPosition.topLeft || props.position === CornerPosition.topRight) {
36
+ return 'list-top';
37
+ }
38
+
39
+ return 'list-bottom';
40
+ });
41
+
24
42
  const classes = computed(() => ({
25
43
  'left-0 top-0 items-start': props.position === CornerPosition.topLeft,
26
44
  'right-0 top-0 items-end': props.position === CornerPosition.topRight,
@@ -35,9 +53,9 @@ const classes = computed(() => ({
35
53
  :class="classes"
36
54
  data-e2e="toaster"
37
55
  >
38
- <TransitionGroup name="list">
56
+ <TransitionGroup :name="transitionName">
39
57
  <AntToast
40
- v-for="toast of toasts"
58
+ v-for="toast of _toasts"
41
59
  :key="`ant-toast-${toast.id}`"
42
60
  :title="toast.title"
43
61
  :state="toast.type"
@@ -56,24 +74,33 @@ const classes = computed(() => ({
56
74
  </template>
57
75
 
58
76
  <style>
59
- .list-move {
60
- transition: all 0.5s ease;
77
+ .list-top-move, .list-bottom-move {
78
+ transition: transform 0.3s ease, opacity 0.3s ease;
79
+ }
80
+ .list-top-enter-active,
81
+ .list-top-leave-active,
82
+ .list-bottom-enter-active,
83
+ .list-bottom-leave-active {
84
+ transition: opacity 0.3s, transform 0.3s;
61
85
  }
62
86
 
63
- .list-enter-active {
64
- animation: fade-in .6s;
87
+ .list-top-enter-from,
88
+ .list-top-leave-to {
89
+ opacity: 0;
90
+ transform: scale(0.8) translateY(-20px);
65
91
  }
66
92
 
67
- .list-leave-active {
68
- animation: fade-in .4s reverse;
93
+ .list-bottom-enter-from,
94
+ .list-bottom-leave-to {
95
+ opacity: 0;
96
+ transform: scale(0.8) translateY(20px);
69
97
  }
70
98
 
71
- @keyframes fade-in {
72
- 0% {
73
- opacity: 0;
74
- }
75
- 100% {
76
- opacity: 1;
77
- }
99
+ .list-top-enter-to,
100
+ .list-top-leave-from,
101
+ .list-bottom-enter-to,
102
+ .list-bottom-leave-from {
103
+ opacity: 1;
104
+ transform: scale(1) translateY(0);
78
105
  }
79
106
  </style>
@@ -35,15 +35,12 @@ const Docs = exports.Docs = {
35
35
  };
36
36
  },
37
37
  template: `
38
- <div class="p-4 bg-base-100">
39
- <AntListGroup v-bind="args">
40
- <AntListGroupItem to="/example" :icon-left="faUser">Profile</AntListGroupItem>
41
- <AntListGroupItem to="/example" :icon-left="faDownload">Downloads</AntListGroupItem>
42
- <AntListGroupItem to="/example" :icon-left="faMessage">Messages</AntListGroupItem>
43
- <AntListGroupItem to="/example" :icon-left="faCog">Settings</AntListGroupItem>
44
- </AntListGroup>
45
- </div>
46
- `
38
+ <AntListGroup v-bind="args">
39
+ <AntListGroupItem to="/example" :icon-left="faUser">Profile</AntListGroupItem>
40
+ <AntListGroupItem to="/example" :icon-left="faDownload">Downloads</AntListGroupItem>
41
+ <AntListGroupItem to="/example" :icon-left="faMessage">Messages</AntListGroupItem>
42
+ <AntListGroupItem to="/example" :icon-left="faCog">Settings</AntListGroupItem>
43
+ </AntListGroup>`
47
44
  }),
48
45
  args: {}
49
46
  };
@@ -33,15 +33,12 @@ export const Docs = {
33
33
  };
34
34
  },
35
35
  template: `
36
- <div class="p-4 bg-base-100">
37
- <AntListGroup v-bind="args">
38
- <AntListGroupItem to="/example" :icon-left="faUser">Profile</AntListGroupItem>
39
- <AntListGroupItem to="/example" :icon-left="faDownload">Downloads</AntListGroupItem>
40
- <AntListGroupItem to="/example" :icon-left="faMessage">Messages</AntListGroupItem>
41
- <AntListGroupItem to="/example" :icon-left="faCog">Settings</AntListGroupItem>
42
- </AntListGroup>
43
- </div>
44
- `
36
+ <AntListGroup v-bind="args">
37
+ <AntListGroupItem to="/example" :icon-left="faUser">Profile</AntListGroupItem>
38
+ <AntListGroupItem to="/example" :icon-left="faDownload">Downloads</AntListGroupItem>
39
+ <AntListGroupItem to="/example" :icon-left="faMessage">Messages</AntListGroupItem>
40
+ <AntListGroupItem to="/example" :icon-left="faCog">Settings</AntListGroupItem>
41
+ </AntListGroup>`
45
42
  }),
46
43
  args: {}
47
44
  };
@@ -48,7 +48,7 @@ const Docs = exports.Docs = {
48
48
  args
49
49
  };
50
50
  },
51
- template: '<div class="p-4 bg-base-100"><AntListGroupItem v-bind="args">Item</AntListGroupItem></div>'
51
+ template: '<div class="dashed"><AntListGroupItem v-bind="args">Item</AntListGroupItem></div>'
52
52
  }),
53
53
  args: {}
54
54
  };
@@ -46,7 +46,7 @@ export const Docs = {
46
46
  args
47
47
  };
48
48
  },
49
- template: '<div class="p-4 bg-base-100"><AntListGroupItem v-bind="args">Item</AntListGroupItem></div>'
49
+ template: '<div class="dashed"><AntListGroupItem v-bind="args">Item</AntListGroupItem></div>'
50
50
  }),
51
51
  args: {}
52
52
  };
@@ -60,7 +60,7 @@ const Docs = exports.Docs = {
60
60
  },
61
61
  template: `
62
62
  <div class="dashed h-60 relative">
63
- <AntToaster v-bind="args"/>
63
+ <AntToaster v-bind="args" />
64
64
  </div>
65
65
  `
66
66
  }),
@@ -122,7 +122,7 @@ const UseToaster = exports.UseToaster = {
122
122
  </AntButton>
123
123
  </AntFormGroup>
124
124
 
125
- <AntToaster v-bind="args" :toasts="toaster.getToasts()"/>
125
+ <AntToaster v-bind="args" :toasts="toaster.getToasts()" />
126
126
  `
127
127
  })
128
128
  };
@@ -60,7 +60,7 @@ export const Docs = {
60
60
  },
61
61
  template: `
62
62
  <div class="dashed h-60 relative">
63
- <AntToaster v-bind="args"/>
63
+ <AntToaster v-bind="args" />
64
64
  </div>
65
65
  `
66
66
  }),
@@ -130,7 +130,7 @@ export const UseToaster = {
130
130
  </AntButton>
131
131
  </AntFormGroup>
132
132
 
133
- <AntToaster v-bind="args" :toasts="toaster.getToasts()"/>
133
+ <AntToaster v-bind="args" :toasts="toaster.getToasts()" />
134
134
  `
135
135
  })
136
136
  };
@@ -197,25 +197,24 @@ onMounted(() => {
197
197
  </div>
198
198
 
199
199
  <AntSkeleton
200
- v-if="skeleton"
200
+ :visible="skeleton"
201
201
  absolute
202
202
  rounded
203
203
  />
204
204
  </div>
205
205
 
206
206
  <div
207
- class="relative flex items-center"
207
+ class="flex items-center"
208
208
  :class="props.size === Size.md ? 'h-5' : 'h-4'"
209
209
  >
210
- <span :class="contentClasses">
211
- <slot />
212
- </span>
213
-
214
210
  <AntSkeleton
215
- v-if="skeleton"
216
- absolute
211
+ :visible="skeleton"
217
212
  rounded
218
- />
213
+ >
214
+ <span :class="contentClasses">
215
+ <slot />
216
+ </span>
217
+ </AntSkeleton>
219
218
  </div>
220
219
  </div>
221
220
  </AntField>
@@ -181,8 +181,10 @@ onMounted(() => {
181
181
  <div
182
182
  :class="containerClasses"
183
183
  >
184
- <div
185
- class="relative"
184
+ <AntSkeleton
185
+ :visible="skeleton"
186
+ :grouped="hasRemoveButton ? Grouped.left : Grouped.none"
187
+ rounded
186
188
  >
187
189
  <div
188
190
  ref="itemRef"
@@ -198,14 +200,7 @@ onMounted(() => {
198
200
  readonly
199
201
  />
200
202
  </div>
201
-
202
- <AntSkeleton
203
- v-if="skeleton"
204
- absolute
205
- :grouped="hasRemoveButton ? Grouped.left : Grouped.none"
206
- rounded
207
- />
208
- </div>
203
+ </AntSkeleton>
209
204
 
210
205
  <AntButton
211
206
  v-if="hasRemoveButton"
@@ -160,36 +160,35 @@ onBeforeUnmount(() => {
160
160
  :class="{'cursor-pointer': !disabled && !skeleton}"
161
161
  >
162
162
  <div>
163
- <div class="h-[70px] w-[70px] bg-gray-100 rounded-full overflow-hidden flex items-center justify-center relative">
164
- <img
165
- v-if="src && !skeleton"
166
- :src="src"
167
- alt="Image"
168
- class="h-full w-full object-cover"
169
- >
170
-
171
- <AntIcon
172
- v-else
173
- class="text-base-300"
174
- :size="IconSize.xl3"
175
- :icon="faImage"
176
- />
163
+ <AntSkeleton
164
+ :visible="skeleton"
165
+ rounded-full
166
+ >
167
+ <div class="h-[70px] w-[70px] bg-gray-100 rounded-full overflow-hidden flex items-center justify-center">
168
+ <img
169
+ v-if="src"
170
+ :src="src"
171
+ alt="Image"
172
+ class="h-full w-full object-cover"
173
+ >
177
174
 
178
- <div
179
- v-if="loading"
180
- class="absolute flex items-center justify-center inset-0 bg-base-600/50 rounded-full"
181
- >
182
- <AntSpinner
183
- :state="State.primary"
175
+ <AntIcon
176
+ v-else
177
+ class="text-base-300"
178
+ :size="IconSize.xl3"
179
+ :icon="faImage"
184
180
  />
185
- </div>
186
181
 
187
- <AntSkeleton
188
- v-if="skeleton"
189
- absolute
190
- rounded-full
191
- />
192
- </div>
182
+ <div
183
+ v-if="loading"
184
+ class="absolute flex items-center justify-center inset-0 bg-base-600/50 rounded-full"
185
+ >
186
+ <AntSpinner
187
+ :state="State.primary"
188
+ />
189
+ </div>
190
+ </div>
191
+ </AntSkeleton>
193
192
  </div>
194
193
 
195
194
  <div class="flex flex-col gap-2.5 w-full">
@@ -204,15 +203,14 @@ onBeforeUnmount(() => {
204
203
  @change="handleFileChange"
205
204
  >
206
205
 
207
- <span class="text-sm text-for-white-bg-font relative">
208
- Upload Image
209
-
210
- <AntSkeleton
211
- v-if="skeleton"
212
- absolute
213
- rounded
214
- />
215
- </span>
206
+ <AntSkeleton
207
+ :visible="skeleton"
208
+ rounded
209
+ >
210
+ <span class="text-sm text-for-white-bg-font">
211
+ Upload Image
212
+ </span>
213
+ </AntSkeleton>
216
214
 
217
215
  <div
218
216
  class="absolute top-0 left-0 w-full h-full border bg-transparent"
@@ -201,25 +201,24 @@ onMounted(() => {
201
201
  >
202
202
 
203
203
  <AntSkeleton
204
- v-if="skeleton"
204
+ :visible="skeleton"
205
205
  absolute
206
206
  rounded-full
207
207
  />
208
208
  </div>
209
209
 
210
210
  <div
211
- class="relative flex items-center"
211
+ class="flex items-center"
212
212
  :class="valueSize"
213
213
  >
214
- <span :class="valueClass">
215
- {{ value.label }}
216
- </span>
217
-
218
214
  <AntSkeleton
219
- v-if="skeleton"
220
- absolute
215
+ :visible="skeleton"
221
216
  rounded
222
- />
217
+ >
218
+ <span :class="valueClass">
219
+ {{ value.label }}
220
+ </span>
221
+ </AntSkeleton>
223
222
  </div>
224
223
  </div>
225
224
  </AntField>
@@ -260,13 +260,6 @@ function onClickRemoveButton() {
260
260
  class="relative w-full"
261
261
  :class="{'cursor-pointer': !skeleton && !readonly}"
262
262
  >
263
- <AntSkeleton
264
- v-if="skeleton"
265
- absolute
266
- rounded
267
- :grouped="skeletonGrouped"
268
- />
269
-
270
263
  <input
271
264
  v-model="_modelValue"
272
265
  type="hidden"
@@ -297,70 +290,78 @@ function onClickRemoveButton() {
297
290
  v-bind="{...props}"
298
291
  />
299
292
  </template>
300
- <!-- Input -->
301
- <div
302
- ref="inputRef"
303
- :class="inputClasses"
304
- :tabindex="disabled || readonly ? -1 : 0"
305
- v-bind="$attrs"
306
- @mousedown="onClickSelectInput"
307
- @click="() => inputRef?.focus()"
308
- @blur="onBlur"
293
+
294
+ <AntSkeleton
295
+ :visible="skeleton"
296
+ rounded
297
+ :grouped="skeletonGrouped"
298
+ class="w-full"
309
299
  >
300
+ <!-- Input -->
310
301
  <div
311
- v-if="_modelValue === null && placeholder !== undefined"
312
- :class="placeholderClasses"
302
+ ref="inputRef"
303
+ :class="inputClasses"
304
+ :tabindex="disabled || readonly ? -1 : 0"
305
+ v-bind="$attrs"
306
+ @mousedown="onClickSelectInput"
307
+ @click="() => inputRef?.focus()"
308
+ @blur="onBlur"
313
309
  >
314
- {{ placeholder }}
315
- </div>
310
+ <div
311
+ v-if="_modelValue === null && placeholder !== undefined"
312
+ :class="placeholderClasses"
313
+ >
314
+ {{ placeholder }}
315
+ </div>
316
316
 
317
- <div
318
- v-else-if="_modelValue === null && label !== undefined"
319
- :class="placeholderClasses"
320
- >
321
- {{ label }}
322
- </div>
317
+ <div
318
+ v-else-if="_modelValue === null && label !== undefined"
319
+ :class="placeholderClasses"
320
+ >
321
+ {{ label }}
322
+ </div>
323
323
 
324
- <div
325
- v-else
326
- class="flex items-center select-none overflow-hidden w-full"
327
- :class="{
328
- 'gap-1': size === Size.xs2,
329
- 'gap1.5': size === Size.xs,
330
- 'gap-1.5': size === Size.sm,
331
- 'gap-2': size === Size.md,
332
- 'gap-2.5': size === Size.lg,
333
- }"
334
- >
335
- <slot
336
- v-if="selectedOption !== null"
337
- name="contentLeft"
338
- v-bind="selectedOption"
339
- />
340
- <div class="text-ellipsis overflow-hidden whitespace-nowrap w-full text-black">
341
- {{ valueLabel }}
324
+ <div
325
+ v-else
326
+ class="flex items-center select-none overflow-hidden w-full"
327
+ :class="{
328
+ 'gap-1': size === Size.xs2,
329
+ 'gap1.5': size === Size.xs,
330
+ 'gap-1.5': size === Size.sm,
331
+ 'gap-2': size === Size.md,
332
+ 'gap-2.5': size === Size.lg,
333
+ }"
334
+ >
335
+ <slot
336
+ v-if="selectedOption !== null"
337
+ name="contentLeft"
338
+ v-bind="selectedOption"
339
+ />
340
+ <div class="text-ellipsis overflow-hidden whitespace-nowrap w-full text-black">
341
+ {{ valueLabel }}
342
+ </div>
343
+ <slot
344
+ v-if="selectedOption !== null"
345
+ name="contentRight"
346
+ v-bind="selectedOption"
347
+ />
342
348
  </div>
343
- <slot
344
- v-if="selectedOption !== null"
345
- name="contentRight"
346
- v-bind="selectedOption"
347
- />
348
- </div>
349
349
 
350
- <AntIcon
351
- v-if="isOpen"
352
- :icon="faChevronUp"
353
- :size="iconSize"
354
- :class="arrowClasses"
355
- />
350
+ <AntIcon
351
+ v-if="isOpen"
352
+ :icon="faChevronUp"
353
+ :size="iconSize"
354
+ :class="arrowClasses"
355
+ />
356
356
 
357
- <AntIcon
358
- v-else
359
- :icon="faChevronDown"
360
- :size="iconSize"
361
- :class="arrowClasses"
362
- />
363
- </div>
357
+ <AntIcon
358
+ v-else
359
+ :icon="faChevronDown"
360
+ :size="iconSize"
361
+ :class="arrowClasses"
362
+ />
363
+ </div>
364
+ </AntSkeleton>
364
365
  </AntSelectMenu>
365
366
  </div>
366
367
 
@@ -157,33 +157,32 @@ function onBlur(e: FocusEvent) {
157
157
  :messages="messages"
158
158
  :expanded="false"
159
159
  >
160
- <div class="relative w-fit flex items-center gap-1.5">
161
- <div class="relative w-fit flex items-center">
162
- <button
163
- v-bind="$attrs"
164
- type="button"
165
- :class="buttonClasses"
166
- role="switch"
167
- :aria-checked="!!_value"
168
- :disabled="disabled"
169
- :tabindex="hasInputState ? -1 : 0"
170
- @click="changeValue"
171
- @blur="onBlur"
172
- >
173
- <span
174
- aria-hidden="true"
175
- :class="ballClasses"
160
+ <div class="w-fit flex items-center gap-1.5">
161
+ <AntSkeleton
162
+ :visible="skeleton"
163
+ rounded-full
164
+ >
165
+ <div class="relative w-fit flex items-center">
166
+ <button
167
+ v-bind="$attrs"
168
+ type="button"
169
+ :class="buttonClasses"
170
+ role="switch"
171
+ :aria-checked="!!_value"
172
+ :disabled="disabled"
173
+ :tabindex="hasInputState ? -1 : 0"
174
+ @click="changeValue"
175
+ @blur="onBlur"
176
176
  >
177
- <slot name="icon" />
178
- </span>
179
- </button>
180
-
181
- <AntSkeleton
182
- v-if="skeleton"
183
- absolute
184
- rounded-full
185
- />
186
- </div>
177
+ <span
178
+ aria-hidden="true"
179
+ :class="ballClasses"
180
+ >
181
+ <slot name="icon" />
182
+ </span>
183
+ </button>
184
+ </div>
185
+ </AntSkeleton>
187
186
 
188
187
  <div
189
188
  v-if="hasSlotContent($slots['default'])"
@@ -195,7 +194,7 @@ function onBlur(e: FocusEvent) {
195
194
  </span>
196
195
 
197
196
  <AntSkeleton
198
- v-if="skeleton"
197
+ :visible="skeleton"
199
198
  absolute
200
199
  rounded
201
200
  class="l-1.5"
@@ -181,18 +181,19 @@ onMounted(() => {
181
181
  @click="prevOption"
182
182
  @blur="onBlur"
183
183
  />
184
- <div class="grow relative">
185
- <div :class="itemClasses">
186
- {{ typeof _value === 'string' ? _value : _value.label }}
187
- </div>
188
184
 
189
- <AntSkeleton
190
- v-if="skeleton"
191
- absolute
192
- :grouped="Grouped.center"
193
- rounded
194
- />
195
- </div>
185
+ <AntSkeleton
186
+ :visible="skeleton"
187
+ :grouped="Grouped.center"
188
+ rounded
189
+ class="grow"
190
+ >
191
+ <div class="grow">
192
+ <div :class="itemClasses">
193
+ {{ typeof _value === 'string' ? _value : _value.label }}
194
+ </div>
195
+ </div>
196
+ </AntSkeleton>
196
197
 
197
198
  <AntButton
198
199
  :icon-left="faChevronRight"
@@ -272,16 +272,12 @@ onMounted(() => {
272
272
  :expanded="expanded"
273
273
  :messages="messages"
274
274
  >
275
- <div
276
- class="relative w-full"
275
+ <AntSkeleton
276
+ :visible="skeleton"
277
+ rounded
278
+ :grouped="skeletonGrouped"
279
+ class="w-full"
277
280
  >
278
- <AntSkeleton
279
- v-if="skeleton"
280
- absolute
281
- rounded
282
- :grouped="skeletonGrouped"
283
- />
284
-
285
281
  <div
286
282
  v-on-click-outside="onClickOutside"
287
283
  :class="inputContainerClasses"
@@ -347,7 +343,7 @@ onMounted(() => {
347
343
  </span>
348
344
  </template>
349
345
  </AntSelectMenu>
350
- </div>
346
+ </AntSkeleton>
351
347
  </AntField>
352
348
  </div>
353
349
  </template>