pxd 0.0.55 → 0.0.61

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 (279) hide show
  1. package/README.md +18 -4
  2. package/dist/components/_internal/fragment-container.vue +3 -2
  3. package/dist/components/active-graph/index.d.vue.ts +2 -3
  4. package/dist/components/active-graph/index.vue +23 -16
  5. package/dist/components/active-graph/types.d.ts +4 -3
  6. package/dist/components/avatar/index.vue +19 -10
  7. package/dist/components/avatar/types.d.ts +0 -12
  8. package/dist/components/avatar-group/index.d.vue.ts +2 -2
  9. package/dist/components/avatar-group/index.vue +4 -3
  10. package/dist/components/avatar-group/types.d.ts +11 -0
  11. package/dist/components/badge/index.d.vue.ts +1 -1
  12. package/dist/components/badge/index.vue +47 -3
  13. package/dist/components/badge/types.d.ts +24 -1
  14. package/dist/components/book/index.vue +3 -2
  15. package/dist/components/browser/index.vue +6 -2
  16. package/dist/components/button/index.d.vue.ts +1 -1
  17. package/dist/components/button/index.vue +60 -12
  18. package/dist/components/carousel/index.d.vue.ts +24 -2
  19. package/dist/components/carousel/index.vue +341 -28
  20. package/dist/components/carousel/types.d.ts +2 -2
  21. package/dist/components/carousel-item/index.d.vue.ts +13 -0
  22. package/dist/components/carousel-item/index.vue +49 -0
  23. package/dist/components/checkbox/index.d.vue.ts +1 -5
  24. package/dist/components/checkbox/index.vue +66 -31
  25. package/dist/components/checkbox/types.d.ts +2 -14
  26. package/dist/components/checkbox-group/index.d.vue.ts +2 -7
  27. package/dist/components/checkbox-group/index.vue +11 -29
  28. package/dist/components/checkbox-group/types.d.ts +12 -0
  29. package/dist/components/chip/index.d.vue.ts +1 -1
  30. package/dist/components/chip/index.vue +31 -2
  31. package/dist/components/choicebox/index.d.vue.ts +11 -5
  32. package/dist/components/choicebox/index.vue +36 -54
  33. package/dist/components/choicebox/types.d.ts +11 -18
  34. package/dist/components/choicebox-item/index.d.vue.ts +16 -0
  35. package/dist/components/choicebox-item/index.vue +67 -0
  36. package/dist/components/choicebox-item/types.d.ts +12 -0
  37. package/dist/components/collapse/index.d.vue.ts +5 -4
  38. package/dist/components/collapse/index.vue +47 -30
  39. package/dist/components/collapse/types.d.ts +2 -5
  40. package/dist/components/collapse-group/index.d.vue.ts +2 -4
  41. package/dist/components/collapse-group/index.vue +8 -20
  42. package/dist/components/collapse-group/types.d.ts +6 -0
  43. package/dist/components/command-menu/index.vue +6 -7
  44. package/dist/components/command-menu/types.d.ts +0 -5
  45. package/dist/components/command-menu-group/index.d.vue.ts +1 -1
  46. package/dist/components/command-menu-group/index.vue +3 -2
  47. package/dist/components/command-menu-group/types.d.ts +5 -0
  48. package/dist/components/config-provider/index.d.vue.ts +3 -3
  49. package/dist/components/config-provider/index.vue +6 -4
  50. package/dist/components/countdown/index.vue +3 -2
  51. package/dist/components/countdown/types.d.ts +2 -2
  52. package/dist/components/dash-line/index.vue +3 -1
  53. package/dist/components/description/index.d.vue.ts +1 -1
  54. package/dist/components/description/index.vue +8 -7
  55. package/dist/components/description/types.d.ts +1 -1
  56. package/dist/components/drawer/index.d.vue.ts +3 -2
  57. package/dist/components/drawer/index.vue +20 -15
  58. package/dist/components/drawer/types.d.ts +3 -3
  59. package/dist/components/ellipsis-text/index.d.vue.ts +14 -0
  60. package/dist/components/ellipsis-text/index.vue +242 -0
  61. package/dist/components/ellipsis-text/types.d.ts +14 -0
  62. package/dist/components/empty-state/index.vue +6 -2
  63. package/dist/components/error/index.d.vue.ts +1 -3
  64. package/dist/components/error/index.vue +21 -6
  65. package/dist/components/error/types.d.ts +7 -1
  66. package/dist/components/fader/index.vue +30 -11
  67. package/dist/components/fader/types.d.ts +2 -2
  68. package/dist/components/gauge/index.vue +7 -2
  69. package/dist/components/grid/index.vue +9 -4
  70. package/dist/components/grid/types.d.ts +0 -5
  71. package/dist/components/grid-item/index.d.vue.ts +1 -1
  72. package/dist/components/grid-item/index.vue +16 -8
  73. package/dist/components/grid-item/types.d.ts +6 -0
  74. package/dist/components/hold-button/index.d.vue.ts +2 -2
  75. package/dist/components/hold-button/index.vue +1 -1
  76. package/dist/components/index.d.ts +7 -3
  77. package/dist/components/index.js +7 -3
  78. package/dist/components/input/index.d.vue.ts +8 -8
  79. package/dist/components/input/index.vue +54 -21
  80. package/dist/components/input/types.d.ts +7 -10
  81. package/dist/components/intersection-observer/index.d.vue.ts +0 -1
  82. package/dist/components/intersection-observer/index.vue +12 -3
  83. package/dist/components/kbd/index.vue +1 -1
  84. package/dist/components/link-button/index.d.vue.ts +1 -1
  85. package/dist/components/link-button/index.vue +4 -6
  86. package/dist/components/link-button/types.d.ts +1 -1
  87. package/dist/components/list/index.d.vue.ts +8 -5
  88. package/dist/components/list/index.vue +50 -54
  89. package/dist/components/list/types.d.ts +3 -20
  90. package/dist/components/list-item/index.d.vue.ts +3 -2
  91. package/dist/components/list-item/index.vue +44 -18
  92. package/dist/components/list-item/types.d.ts +15 -0
  93. package/dist/components/loading-bar/index.vue +33 -2
  94. package/dist/components/loading-bar/types.d.ts +1 -1
  95. package/dist/components/loading-dots/index.vue +3 -2
  96. package/dist/components/menu/index.d.vue.ts +5 -2
  97. package/dist/components/menu/index.vue +4 -1
  98. package/dist/components/menu/types.d.ts +5 -0
  99. package/dist/components/message/index.d.vue.ts +11 -8
  100. package/dist/components/message/index.vue +4 -12
  101. package/dist/components/message/types.d.ts +1 -12
  102. package/dist/components/message-item/index.d.vue.ts +1 -3
  103. package/dist/components/message-item/index.vue +13 -7
  104. package/dist/components/message-item/types.d.ts +11 -0
  105. package/dist/components/modal/index.d.vue.ts +3 -2
  106. package/dist/components/modal/index.vue +17 -13
  107. package/dist/components/modal/types.d.ts +3 -3
  108. package/dist/components/noise-background/index.vue +4 -3
  109. package/dist/components/note/index.d.vue.ts +1 -2
  110. package/dist/components/note/index.vue +81 -29
  111. package/dist/components/note/types.d.ts +10 -2
  112. package/dist/components/number-input/index.d.vue.ts +5 -4
  113. package/dist/components/number-input/index.vue +36 -6
  114. package/dist/components/number-input/types.d.ts +2 -0
  115. package/dist/components/overlay/index.vue +1 -1
  116. package/dist/components/overlay/types.d.ts +1 -1
  117. package/dist/components/pagination/index.vue +5 -3
  118. package/dist/components/pin-input/index.d.vue.ts +6 -1
  119. package/dist/components/pin-input/index.vue +60 -23
  120. package/dist/components/pin-input/types.d.ts +0 -4
  121. package/dist/components/placeholder/index.vue +14 -11
  122. package/dist/components/popover/index.vue +116 -78
  123. package/dist/components/popover/types.d.ts +1 -0
  124. package/dist/components/progress/index.d.vue.ts +1 -1
  125. package/dist/components/progress/index.vue +15 -2
  126. package/dist/components/project-banner/index.d.vue.ts +18 -0
  127. package/dist/components/project-banner/index.vue +59 -0
  128. package/dist/components/project-banner/types.d.ts +8 -0
  129. package/dist/components/radio/index.vue +62 -20
  130. package/dist/components/radio/types.d.ts +1 -14
  131. package/dist/components/radio-group/index.d.vue.ts +2 -4
  132. package/dist/components/radio-group/index.vue +11 -16
  133. package/dist/components/radio-group/types.d.ts +12 -0
  134. package/dist/components/resizable/types.d.ts +5 -10
  135. package/dist/components/resizable-handle/index.vue +1 -1
  136. package/dist/components/resizable-panel/index.d.vue.ts +1 -1
  137. package/dist/components/resizable-panel/index.vue +7 -2
  138. package/dist/components/resizable-panel/types.d.ts +4 -0
  139. package/dist/components/scrollable/index.d.vue.ts +29 -0
  140. package/dist/components/scrollable/index.vue +98 -83
  141. package/dist/components/scrollable/types.d.ts +19 -6
  142. package/dist/components/skeleton/index.vue +24 -1
  143. package/dist/components/slider/index.d.vue.ts +6 -6
  144. package/dist/components/slider/index.vue +86 -44
  145. package/dist/components/slider/types.d.ts +1 -1
  146. package/dist/components/snippet/index.vue +28 -2
  147. package/dist/components/spinner/index.vue +4 -2
  148. package/dist/components/stack/index.d.vue.ts +2 -2
  149. package/dist/components/stack/index.vue +35 -3
  150. package/dist/components/stack/types.d.ts +1 -1
  151. package/dist/components/status-dot/index.vue +5 -1
  152. package/dist/components/switch/index.d.vue.ts +10 -1
  153. package/dist/components/switch/index.vue +35 -44
  154. package/dist/components/switch/types.d.ts +4 -12
  155. package/dist/components/switch-item/index.d.vue.ts +14 -0
  156. package/dist/components/switch-item/index.vue +79 -0
  157. package/dist/components/switch-item/types.d.ts +9 -0
  158. package/dist/components/teleport/index.d.vue.ts +1 -1
  159. package/dist/components/teleport/index.vue +1 -1
  160. package/dist/components/teleport/types.d.ts +1 -1
  161. package/dist/components/text/index.d.vue.ts +1 -2
  162. package/dist/components/text/index.vue +36 -22
  163. package/dist/components/text/types.d.ts +1 -1
  164. package/dist/components/textarea/index.d.vue.ts +4 -4
  165. package/dist/components/textarea/index.vue +33 -4
  166. package/dist/components/textarea/types.d.ts +0 -1
  167. package/dist/components/time-picker/index.d.vue.ts +1 -2
  168. package/dist/components/time-picker/index.vue +43 -9
  169. package/dist/components/time-picker/types.d.ts +1 -2
  170. package/dist/components/toggle/index.vue +11 -10
  171. package/dist/components/toggle-button/index.d.vue.ts +22 -0
  172. package/dist/components/toggle-button/index.vue +110 -0
  173. package/dist/components/toggle-button/types.d.ts +16 -0
  174. package/dist/components/{choicebox-group → toggle-button-group}/index.d.vue.ts +5 -5
  175. package/dist/components/toggle-button-group/index.vue +68 -0
  176. package/dist/components/toggle-button-group/types.d.ts +22 -0
  177. package/dist/components/tooltip/index.d.vue.ts +2 -0
  178. package/dist/components/tooltip/index.vue +9 -3
  179. package/dist/components/tooltip/types.d.ts +3 -2
  180. package/dist/components/virtual-list/index.d.vue.ts +25 -4
  181. package/dist/components/virtual-list/index.vue +66 -10
  182. package/dist/components/virtual-list/types.d.ts +9 -4
  183. package/dist/composables/index.d.ts +2 -2
  184. package/dist/composables/index.js +2 -2
  185. package/dist/composables/use-browser-observer.d.ts +5 -5
  186. package/dist/composables/use-browser-observer.js +23 -20
  187. package/dist/composables/use-copy-click.js +4 -0
  188. package/dist/composables/use-countdown.d.ts +2 -2
  189. package/dist/composables/use-delay-destroy.d.ts +1 -1
  190. package/dist/composables/use-focus-trap.d.ts +7 -3
  191. package/dist/composables/use-focus-trap.js +19 -7
  192. package/dist/composables/use-forward-ref-expose.d.ts +2 -0
  193. package/dist/composables/use-forward-ref-expose.js +41 -0
  194. package/dist/composables/use-message.d.ts +4 -7
  195. package/dist/composables/use-model-value.d.ts +9 -8
  196. package/dist/composables/use-popover-responsive.d.ts +2 -2
  197. package/dist/composables/use-popover-responsive.js +3 -3
  198. package/dist/composables/use-repeat-action.d.ts +1 -1
  199. package/dist/composables/use-repeat-action.js +2 -2
  200. package/dist/composables/use-virtual-list.d.ts +21 -12
  201. package/dist/composables/use-virtual-list.js +90 -158
  202. package/dist/composables/use-window-size.d.ts +4 -0
  203. package/dist/composables/use-window-size.js +27 -0
  204. package/dist/contexts/avatar.d.ts +5 -2
  205. package/dist/contexts/carousel.d.ts +4 -4
  206. package/dist/contexts/carousel.js +1 -1
  207. package/dist/contexts/checkbox.d.ts +7 -2
  208. package/dist/contexts/choicebox.d.ts +8 -4
  209. package/dist/contexts/choicebox.js +1 -4
  210. package/dist/contexts/collapse.d.ts +5 -6
  211. package/dist/contexts/collapse.js +1 -1
  212. package/dist/contexts/config-provider.d.ts +5 -0
  213. package/dist/{composables/use-config-provider-context.js → contexts/config-provider.js} +8 -5
  214. package/dist/contexts/list.d.ts +1 -1
  215. package/dist/contexts/radio.d.ts +8 -2
  216. package/dist/contexts/resizable.d.ts +1 -1
  217. package/dist/contexts/switch.d.ts +8 -4
  218. package/dist/contexts/switch.js +1 -2
  219. package/dist/contexts/toggle-button.d.ts +7 -0
  220. package/dist/contexts/toggle-button.js +2 -0
  221. package/dist/styles/source.css +14 -2
  222. package/dist/styles/styles.css +2 -2
  223. package/dist/styles/tw.css +14 -2
  224. package/dist/types/shared/props.d.ts +1 -3
  225. package/dist/types/shared/utils.d.ts +0 -3
  226. package/dist/utils/context.d.ts +1 -0
  227. package/dist/utils/get.d.ts +1 -0
  228. package/dist/utils/get.js +14 -0
  229. package/dist/utils/ref.d.ts +1 -1
  230. package/dist/utils/responsive.js +2 -1
  231. package/dist/utils/throttle.js +9 -7
  232. package/dist/utils/uid.d.ts +1 -1
  233. package/dist/utils/uid.js +2 -2
  234. package/package.json +23 -21
  235. package/volar.d.ts +7 -3
  236. package/dist/components/badge/cn.d.ts +0 -90
  237. package/dist/components/badge/cn.js +0 -44
  238. package/dist/components/button/cn.d.ts +0 -121
  239. package/dist/components/button/cn.js +0 -55
  240. package/dist/components/carousel-group/index.d.vue.ts +0 -35
  241. package/dist/components/carousel-group/index.vue +0 -368
  242. package/dist/components/checkbox/cn.d.ts +0 -67
  243. package/dist/components/checkbox/cn.js +0 -31
  244. package/dist/components/chip/cn.d.ts +0 -49
  245. package/dist/components/chip/cn.js +0 -26
  246. package/dist/components/choicebox-group/index.vue +0 -65
  247. package/dist/components/error/cn.d.ts +0 -22
  248. package/dist/components/error/cn.js +0 -15
  249. package/dist/components/input/cn.d.ts +0 -73
  250. package/dist/components/input/cn.js +0 -36
  251. package/dist/components/list-item/cn.d.ts +0 -22
  252. package/dist/components/list-item/cn.js +0 -15
  253. package/dist/components/loading-bar/cn.d.ts +0 -70
  254. package/dist/components/loading-bar/cn.js +0 -32
  255. package/dist/components/note/cn.d.ts +0 -121
  256. package/dist/components/note/cn.js +0 -66
  257. package/dist/components/pin-input/cn.d.ts +0 -46
  258. package/dist/components/pin-input/cn.js +0 -25
  259. package/dist/components/progress/cn.d.ts +0 -19
  260. package/dist/components/progress/cn.js +0 -14
  261. package/dist/components/radio/cn.d.ts +0 -46
  262. package/dist/components/radio/cn.js +0 -42
  263. package/dist/components/skeleton/cn.d.ts +0 -43
  264. package/dist/components/skeleton/cn.js +0 -24
  265. package/dist/components/snippet/cn.d.ts +0 -52
  266. package/dist/components/snippet/cn.js +0 -27
  267. package/dist/components/stack/cn.d.ts +0 -70
  268. package/dist/components/stack/cn.js +0 -33
  269. package/dist/components/switch/cn.d.ts +0 -16
  270. package/dist/components/switch/cn.js +0 -13
  271. package/dist/components/switch-group/index.d.vue.ts +0 -23
  272. package/dist/components/switch-group/index.vue +0 -54
  273. package/dist/components/text/cn.d.ts +0 -67
  274. package/dist/components/text/cn.js +0 -34
  275. package/dist/components/textarea/cn.d.ts +0 -58
  276. package/dist/components/textarea/cn.js +0 -30
  277. package/dist/composables/use-config-provider-context.d.ts +0 -3
  278. package/dist/composables/use-unique-id-context.d.ts +0 -2
  279. package/dist/composables/use-unique-id-context.js +0 -11
@@ -1,43 +1,356 @@
1
1
  <script setup>
2
- import { onBeforeUnmount, onMounted, shallowRef } from "vue";
3
- import { useCarouselGroupContext } from "../../contexts/carousel";
4
- import { getUniqueId } from "../../utils/uid";
2
+ import ChevronRightIcon from "@gdsicon/vue/chevron-right";
3
+ import { computed, nextTick, onBeforeUnmount, onMounted, ref, shallowRef } from "vue";
4
+ import { provideCarouselContext } from "../../contexts/carousel";
5
+ import { getCssUnitValue } from "../../utils/format";
5
6
  defineOptions({
6
- name: "PCarousel"
7
+ name: "PCarousel",
8
+ inheritAttrs: false
7
9
  });
8
- const carouselGroupContext = useCarouselGroupContext();
9
- const uniqueId = getUniqueId();
10
- const transformStyle = shallowRef("");
11
- function resetPosition() {
12
- transformStyle.value = "";
13
- }
14
- function getTranslateStyle(translate) {
15
- return carouselGroupContext.props.direction === "horizontal" ? `translateX(${translate}%)` : `translateY(${translate}%)`;
16
- }
17
- function translateItem(index, activeIndex) {
18
- const maxLength = carouselGroupContext.carousels.value.length;
19
- const lastIndex = maxLength - 1;
20
- if (index === 0 && activeIndex === maxLength) {
21
- transformStyle.value = getTranslateStyle(maxLength * 100);
22
- } else if (index === lastIndex && activeIndex <= 0) {
23
- transformStyle.value = getTranslateStyle(-maxLength * 100);
10
+ const props = defineProps({
11
+ index: { type: Number, required: false, default: 0 },
12
+ loop: { type: Boolean, required: false, default: true },
13
+ arrow: { type: Boolean, required: false, default: true },
14
+ height: { type: [Number, String], required: false, default: 180 },
15
+ autoplay: { type: Boolean, required: false, default: true },
16
+ interval: { type: Number, required: false, default: 3e3 },
17
+ indicator: { type: Boolean, required: false, default: true },
18
+ direction: { type: String, required: false, default: "horizontal" },
19
+ indicatorType: { type: String, required: false, default: "line" },
20
+ indicatorPosition: { type: String, required: false, default: "bottom" },
21
+ pauseOnHover: { type: Boolean, required: false, default: true },
22
+ toggleOnWheel: { type: Boolean, required: false }
23
+ });
24
+ const emits = defineEmits(["change"]);
25
+ const TRANSITION_CLASSES = ["transition-transform", "duration-[calc(var(--duration,200ms)+100ms)]"];
26
+ let autoPlayRafId = null;
27
+ let autoPlaySession = 0;
28
+ let isPointerEntering = false;
29
+ let toggleQueue = Promise.resolve();
30
+ const carousels = ref([]);
31
+ const sliderRef = shallowRef();
32
+ const virtualIndex = shallowRef(props.index);
33
+ const correctIndex = computed(() => {
34
+ const index = virtualIndex.value;
35
+ if (index >= carousels.value.length) {
36
+ return 0;
37
+ }
38
+ if (index <= -1) {
39
+ return carousels.value.length - 1;
40
+ }
41
+ return index;
42
+ });
43
+ const computedStyle = computed(() => {
44
+ const translateValue = virtualIndex.value * -100;
45
+ const styles = {
46
+ transform: props.direction === "horizontal" ? `translateX(${translateValue}%)` : `translateY(${translateValue}%)`
47
+ };
48
+ return styles;
49
+ });
50
+ function translateItems() {
51
+ carousels.value.forEach((carousel, index) => {
52
+ carousel.translateItem(index, virtualIndex.value);
53
+ });
54
+ }
55
+ async function awaitAnimationEnd() {
56
+ const animations = sliderRef.value?.getAnimations() ?? [];
57
+ await Promise.allSettled(animations.map((a) => a.finished));
58
+ }
59
+ async function performToggle(delta) {
60
+ const length = carousels.value.length;
61
+ if (length === 0) {
62
+ return;
63
+ }
64
+ await awaitAnimationEnd();
65
+ if (props.loop) {
66
+ virtualIndex.value += delta;
67
+ translateItems();
24
68
  } else {
25
- resetPosition();
69
+ virtualIndex.value = Math.max(0, Math.min(virtualIndex.value + delta, length - 1));
26
70
  }
71
+ emits("change", correctIndex.value);
72
+ nextTick(onPointerLeave);
27
73
  }
28
- onMounted(() => {
29
- carouselGroupContext?.registerCarousel({
30
- uid: uniqueId,
31
- translateItem
74
+ function onToggleClick(delta) {
75
+ toggleQueue = toggleQueue.catch(() => {
76
+ }).then(async () => {
77
+ await performToggle(delta);
32
78
  });
79
+ return toggleQueue;
80
+ }
81
+ function onWheelToggle(ev) {
82
+ if (!props.toggleOnWheel) {
83
+ return;
84
+ }
85
+ const length = carousels.value.length;
86
+ if (length <= 1) {
87
+ return;
88
+ }
89
+ const delta = ev.deltaY > 0 ? 1 : -1;
90
+ const indexBefore = virtualIndex.value;
91
+ const lastIndex = length - 1;
92
+ if (!props.loop) {
93
+ const isAtFirstAndGoPrev = indexBefore <= 0 && delta < 0;
94
+ const isAtLastAndGoNext = indexBefore >= lastIndex && delta > 0;
95
+ if (isAtFirstAndGoPrev || isAtLastAndGoNext) {
96
+ return;
97
+ }
98
+ }
99
+ if (ev.cancelable) {
100
+ ev.preventDefault();
101
+ }
102
+ onToggleClick(delta);
103
+ }
104
+ function resetContainerPosition(resetIndex) {
105
+ const containerClassList = sliderRef.value.classList;
106
+ containerClassList.remove(...TRANSITION_CLASSES);
107
+ virtualIndex.value = resetIndex;
108
+ translateItems();
109
+ setTimeout(() => {
110
+ containerClassList.add(...TRANSITION_CLASSES);
111
+ }, 0);
112
+ }
113
+ function onTransitionsEnd(ev) {
114
+ if (ev.propertyName !== "transform" || ev.target !== sliderRef.value) {
115
+ return;
116
+ }
117
+ if (!props.loop) {
118
+ return;
119
+ }
120
+ if (virtualIndex.value >= carousels.value.length) {
121
+ resetContainerPosition(0);
122
+ } else if (virtualIndex.value <= -1) {
123
+ resetContainerPosition(carousels.value.length - 1);
124
+ }
125
+ }
126
+ function clearAutoPlayTimer() {
127
+ autoPlaySession++;
128
+ if (autoPlayRafId != null) {
129
+ cancelAnimationFrame(autoPlayRafId);
130
+ autoPlayRafId = null;
131
+ }
132
+ }
133
+ function setAutoPlayTimer() {
134
+ const mySession = autoPlaySession;
135
+ const startTime = performance.now();
136
+ const onAnimationFrame = () => {
137
+ if (mySession !== autoPlaySession || isPointerEntering) {
138
+ return;
139
+ }
140
+ const currentTime = performance.now();
141
+ const elapsedTime = currentTime - startTime;
142
+ if (elapsedTime >= props.interval) {
143
+ onToggleClick(1);
144
+ return;
145
+ }
146
+ autoPlayRafId = requestAnimationFrame(onAnimationFrame);
147
+ };
148
+ autoPlayRafId = requestAnimationFrame(onAnimationFrame);
149
+ }
150
+ function onPointerEnter() {
151
+ if (props.pauseOnHover) {
152
+ isPointerEntering = true;
153
+ clearAutoPlayTimer();
154
+ }
155
+ }
156
+ function onPointerLeave() {
157
+ isPointerEntering = false;
158
+ if (!props.autoplay) {
159
+ return;
160
+ }
161
+ clearAutoPlayTimer();
162
+ setAutoPlayTimer();
163
+ }
164
+ function onIndicatorClick(ev) {
165
+ clearAutoPlayTimer();
166
+ const targetEl = ev.target.closest("[data-index]");
167
+ const targetIndex = Number(targetEl?.dataset.index);
168
+ if (Number.isNaN(targetIndex)) {
169
+ return;
170
+ }
171
+ const deltaIndex = targetIndex - virtualIndex.value;
172
+ if (deltaIndex !== 0) {
173
+ onToggleClick(deltaIndex);
174
+ }
175
+ nextTick(onPointerLeave);
176
+ }
177
+ function registerCarousel(state) {
178
+ carousels.value.push(state);
179
+ }
180
+ function unregisterCarousel(id) {
181
+ carousels.value = carousels.value.filter(({ uid }) => uid !== id);
182
+ }
183
+ provideCarouselContext({
184
+ props,
185
+ carousels,
186
+ registerCarousel,
187
+ unregisterCarousel
188
+ });
189
+ onMounted(async () => {
190
+ onPointerLeave();
191
+ await nextTick();
192
+ translateItems();
33
193
  });
34
194
  onBeforeUnmount(() => {
35
- carouselGroupContext?.unregisterCarousel(uniqueId);
195
+ clearAutoPlayTimer();
196
+ carousels.value = [];
36
197
  });
37
198
  </script>
38
199
 
39
200
  <template>
40
- <div class="pxd-carousel size-full shrink-0" :style="{ transform: transformStyle }">
41
- <slot />
201
+ <div
202
+ v-bind="$attrs"
203
+ :data-direction="direction"
204
+ :data-indicator-type="indicatorType"
205
+ :data-indicator-position="indicatorPosition"
206
+ class="pxd-carousel group relative w-full touch-none overflow-hidden"
207
+ :style="{ height: getCssUnitValue(height) }"
208
+ @pointerenter="onPointerEnter"
209
+ @pointerleave="onPointerLeave"
210
+ @wheel="onWheelToggle"
211
+ >
212
+ <div class="pxd-carousel--container size-full">
213
+ <div
214
+ ref="sliderRef"
215
+ class="pxd-carousel--slider translate-z-0 size-full"
216
+ :style="computedStyle"
217
+ :class="TRANSITION_CLASSES"
218
+ @transitionend="onTransitionsEnd"
219
+ >
220
+ <slot />
221
+ </div>
222
+ </div>
223
+
224
+ <div
225
+ v-if="indicator"
226
+ class="pxd-carousel--indicator gap-2 absolute flex w-max items-center"
227
+ @click="onIndicatorClick"
228
+ >
229
+ <slot name="indicator" :current="correctIndex + 1" :total="carousels.length">
230
+ <button
231
+ v-for="(_, i) in carousels.length"
232
+ :key="i"
233
+ :data-index="i"
234
+ class="pxd-carousel--indicator-item relative h-(--carousel-dot-height) w-(--carousel-dot-width) cursor-pointer appearance-none rounded-full bg-gray-alpha-200 font-inherit self-focus-ring outline-none hover:bg-gray-alpha-400 motion-safe:transition-colors"
235
+ :class="{ 'bg-primary!': i === correctIndex }"
236
+ />
237
+ </slot>
238
+ </div>
239
+
240
+ <div v-if="arrow" class="pxd-carousel--toggler gap-2 absolute flex">
241
+ <button
242
+ type="button"
243
+ aria-label="Carousel arrow left"
244
+ class="pxd-carousel--prev-btn p-1.5 cursor-pointer appearance-none rounded-md bg-gray-alpha-100 font-inherit text-foreground-secondary self-focus-ring outline-none hover:bg-background-hover active:bg-background-active disabled:pointer-events-none motion-safe:transition-colors"
245
+ @click="onToggleClick(-1)"
246
+ >
247
+ <ChevronRightIcon class="rotate-180" />
248
+ </button>
249
+
250
+ <button
251
+ type="button"
252
+ aria-label="Carousel arrow right"
253
+ class="pxd-carousel--next-btn p-1.5 cursor-pointer appearance-none rounded-md bg-gray-alpha-100 font-inherit text-foreground-secondary self-focus-ring outline-none hover:bg-background-hover active:bg-background-active disabled:pointer-events-none motion-safe:transition-colors"
254
+ @click="onToggleClick(1)"
255
+ >
256
+ <ChevronRightIcon />
257
+ </button>
258
+ </div>
42
259
  </div>
43
260
  </template>
261
+
262
+ <style lang="postcss">
263
+ .pxd-carousel {
264
+ &[data-indicator-type='dot'] {
265
+ --carousel-dot-width: 0.5rem;
266
+ --carousel-dot-height: 0.5rem;
267
+ }
268
+
269
+ &[data-indicator-type='line'] {
270
+ &[data-indicator-position='top'],
271
+ &[data-indicator-position='bottom'] {
272
+ --carousel-dot-width: 1rem;
273
+ --carousel-dot-height: 0.25rem;
274
+ }
275
+
276
+ &[data-indicator-position='left'],
277
+ &[data-indicator-position='right'] {
278
+ --carousel-dot-width: 0.25rem;
279
+ --carousel-dot-height: 1rem;
280
+ }
281
+ }
282
+
283
+ &[data-indicator-position='top'] {
284
+ .pxd-carousel--indicator {
285
+ left: 12px;
286
+ top: 0.5rem;
287
+ }
288
+
289
+ .pxd-carousel--toggler {
290
+ right: 0.5rem;
291
+ top: 0.5rem;
292
+ }
293
+ }
294
+
295
+ &[data-indicator-position='bottom'] {
296
+ .pxd-carousel--indicator {
297
+ left: 12px;
298
+ bottom: 0.5rem;
299
+ }
300
+
301
+ .pxd-carousel--toggler {
302
+ right: 0.5rem;
303
+ bottom: 0.5rem;
304
+ }
305
+ }
306
+
307
+ &[data-indicator-position='left'] {
308
+ .pxd-carousel--indicator {
309
+ left: 0.5rem;
310
+ top: 12px;
311
+ }
312
+
313
+ .pxd-carousel--toggler {
314
+ left: 0.5rem;
315
+ bottom: 0.5rem;
316
+ }
317
+ }
318
+
319
+ &[data-indicator-position='right'] {
320
+ .pxd-carousel--indicator {
321
+ right: 0.5rem;
322
+ top: 12px;
323
+ }
324
+
325
+ .pxd-carousel--toggler {
326
+ right: 0.5rem;
327
+ bottom: 0.5rem;
328
+ }
329
+ }
330
+
331
+ &[data-direction='horizontal'] .pxd-carousel--slider {
332
+ display: flex;
333
+ }
334
+
335
+ &[data-direction='vertical'] {
336
+ .pxd-carousel--prev-btn,
337
+ .pxd-carousel--next-btn {
338
+ transform: rotate(90deg);
339
+ }
340
+ }
341
+
342
+ &[data-indicator-position='left'],
343
+ &[data-indicator-position='right'] {
344
+ .pxd-carousel--indicator,
345
+ .pxd-carousel--toggler {
346
+ flex-direction: column;
347
+ }
348
+ }
349
+ }
350
+
351
+ .pxd-carousel--indicator-item::before {
352
+ content: '';
353
+ position: absolute;
354
+ inset: -0.25rem;
355
+ }
356
+ </style>
@@ -1,6 +1,6 @@
1
1
  import type { BasePosition, ComponentDirection } from '../../types/shared'
2
2
 
3
- export interface CarouselGroupProps {
3
+ export interface CarouselProps {
4
4
  index?: number
5
5
  loop?: boolean
6
6
  arrow?: boolean
@@ -15,6 +15,6 @@ export interface CarouselGroupProps {
15
15
  toggleOnWheel?: boolean
16
16
  }
17
17
 
18
- export interface CarouselGroupEmits {
18
+ export interface CarouselEmits {
19
19
  change: [index: number]
20
20
  }
@@ -0,0 +1,13 @@
1
+ declare var __VLS_1: {};
2
+ type __VLS_Slots = {} & {
3
+ default?: (props: typeof __VLS_1) => any;
4
+ };
5
+ declare const __VLS_base: import("vue").DefineComponent<{}, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
6
+ declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
7
+ declare const _default: typeof __VLS_export;
8
+ export default _default;
9
+ type __VLS_WithSlots<T, S> = T & {
10
+ new (): {
11
+ $slots: S;
12
+ };
13
+ };
@@ -0,0 +1,49 @@
1
+ <script setup>
2
+ import { onBeforeUnmount, onMounted, shallowRef } from "vue";
3
+ import { useCarouselContext } from "../../contexts/carousel";
4
+ import { getUniqueId } from "../../utils/uid";
5
+ defineOptions({
6
+ name: "PCarouselItem",
7
+ inheritAttrs: false
8
+ });
9
+ const uniqueId = getUniqueId();
10
+ const transformStyle = shallowRef("");
11
+ const carouselContext = useCarouselContext();
12
+ function resetPosition() {
13
+ transformStyle.value = "";
14
+ }
15
+ function getTranslateStyle(translate) {
16
+ const isHorizontal = carouselContext.props.direction === "horizontal";
17
+ return `translate${isHorizontal ? "X" : "Y"}(${translate}%)`;
18
+ }
19
+ function translateItem(index, activeIndex) {
20
+ const maxLength = carouselContext.carousels.value.length;
21
+ const lastIndex = maxLength - 1;
22
+ if (index === 0 && activeIndex === maxLength) {
23
+ transformStyle.value = getTranslateStyle(maxLength * 100);
24
+ } else if (index === lastIndex && activeIndex <= 0) {
25
+ transformStyle.value = getTranslateStyle(-maxLength * 100);
26
+ } else {
27
+ resetPosition();
28
+ }
29
+ }
30
+ onMounted(() => {
31
+ carouselContext?.registerCarousel({
32
+ uid: uniqueId,
33
+ translateItem
34
+ });
35
+ });
36
+ onBeforeUnmount(() => {
37
+ carouselContext?.unregisterCarousel(uniqueId);
38
+ });
39
+ </script>
40
+
41
+ <template>
42
+ <div
43
+ class="pxd-carousel-item size-full shrink-0 content-visibility-auto intrinsic-size-auto"
44
+ :style="{ transform: transformStyle }"
45
+ v-bind="$attrs"
46
+ >
47
+ <slot />
48
+ </div>
49
+ </template>
@@ -1,12 +1,9 @@
1
1
  import type { CheckboxProps } from './types';
2
- declare function getCheckedState(): "indeterminate" | "checked" | "unchecked";
3
2
  declare var __VLS_11: {};
4
3
  type __VLS_Slots = {} & {
5
4
  default?: (props: typeof __VLS_11) => any;
6
5
  };
7
- declare const __VLS_base: import("vue").DefineComponent<CheckboxProps, {
8
- getCheckedState: typeof getCheckedState;
9
- }, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
6
+ declare const __VLS_base: import("vue").DefineComponent<CheckboxProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
10
7
  change: (args_0: NonNullable<import("../../types/shared").ComponentValue | import("../../types/shared").ComponentValue[] | undefined>) => any;
11
8
  "update:modelValue": (args_0: NonNullable<import("../../types/shared").ComponentValue | import("../../types/shared").ComponentValue[] | undefined>) => any;
12
9
  }, string, import("vue").PublicProps, Readonly<CheckboxProps> & Readonly<{
@@ -14,7 +11,6 @@ declare const __VLS_base: import("vue").DefineComponent<CheckboxProps, {
14
11
  "onUpdate:modelValue"?: ((args_0: NonNullable<import("../../types/shared").ComponentValue | import("../../types/shared").ComponentValue[] | undefined>) => any) | undefined;
15
12
  }>, {
16
13
  value: import("../../types/shared").ComponentValue;
17
- modelValue: import("../../types/shared").ComponentValue | import("../../types/shared").ComponentValue[];
18
14
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
19
15
  declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
20
16
  declare const _default: typeof __VLS_export;
@@ -1,11 +1,11 @@
1
1
  <script setup>
2
2
  import CheckIcon from "@gdsicon/vue/check";
3
3
  import MinusIcon from "@gdsicon/vue/minus";
4
+ import { tv } from "tailwind-variants";
4
5
  import { computed } from "vue";
5
6
  import { useModelValue } from "../../composables/use-model-value";
6
7
  import { useCheckboxGroupContext } from "../../contexts/checkbox";
7
8
  import { getUniqueId } from "../../utils/uid";
8
- import { checkboxVariant } from "./cn";
9
9
  defineOptions({
10
10
  name: "PCheckbox",
11
11
  inheritAttrs: false,
@@ -17,15 +17,63 @@ defineOptions({
17
17
  const props = defineProps({
18
18
  label: { type: [String, Number, Array, null], required: false },
19
19
  value: { type: [String, Number, Boolean], required: false, default: true },
20
+ shape: { type: String, required: false },
20
21
  disabled: { type: Boolean, required: false },
21
- required: { type: Boolean, required: false },
22
- modelValue: { type: [String, Number, Boolean, Array], required: false, default: () => [] },
22
+ modelValue: { type: [String, Number, Boolean, Array], required: false },
23
23
  indeterminate: { type: Boolean, required: false }
24
24
  });
25
25
  const emits = defineEmits(["change", "update:modelValue"]);
26
+ const checkboxVariant = tv({
27
+ base: "pxd-checkbox--inner size-4 p-0.5 inline-flex shrink-0 transform-gpu items-center justify-center overflow-hidden border peer-focus-ring motion-safe:transition-colors",
28
+ variants: {
29
+ checked: {
30
+ true: "",
31
+ false: ""
32
+ },
33
+ disabled: {
34
+ true: "",
35
+ false: ""
36
+ },
37
+ shape: {
38
+ default: "rounded-sm",
39
+ square: "rounded-none",
40
+ rounded: "rounded-full"
41
+ }
42
+ },
43
+ compoundVariants: [
44
+ {
45
+ checked: true,
46
+ disabled: false,
47
+ class: "border-primary bg-primary"
48
+ },
49
+ {
50
+ checked: true,
51
+ disabled: true,
52
+ class: "border-gray-500 bg-gray-500"
53
+ },
54
+ {
55
+ checked: false,
56
+ disabled: false,
57
+ class: "border-gray-alpha-400 bg-background-100 group-hover/checkbox:bg-gray-200"
58
+ },
59
+ {
60
+ checked: false,
61
+ disabled: true,
62
+ class: "border-gray-500 bg-gray-100"
63
+ }
64
+ ],
65
+ defaultVariants: {
66
+ shape: "default",
67
+ checked: false,
68
+ disabled: false
69
+ }
70
+ });
26
71
  const uniqueId = getUniqueId();
27
- const modelValue = useModelValue(props, emits);
28
72
  const checkboxGroupContext = useCheckboxGroupContext();
73
+ const modelValue = useModelValue(
74
+ checkboxGroupContext?.props ?? props,
75
+ checkboxGroupContext?.emits ?? emits
76
+ );
29
77
  const isChecked = computed(() => {
30
78
  if (Array.isArray(modelValue.value)) {
31
79
  return modelValue.value.includes(props.value);
@@ -35,42 +83,30 @@ const isChecked = computed(() => {
35
83
  }
36
84
  return modelValue.value === props.value;
37
85
  });
38
- const computedDisabled = computed(() => props.disabled || checkboxGroupContext?.disabled);
39
- const computedRequired = computed(() => props.required || checkboxGroupContext?.required);
86
+ const isDisabled = computed(() => props.disabled || checkboxGroupContext?.props.disabled);
40
87
  const computedClasses = computed(() => {
41
88
  return checkboxVariant({
89
+ shape: props.shape,
42
90
  checked: isChecked.value,
43
- disabled: computedDisabled.value
91
+ disabled: isDisabled.value
44
92
  });
45
93
  });
46
- function toggleChecked(isChecked2) {
94
+ function onInputChange(event) {
95
+ const isChecked2 = event.target.checked;
47
96
  if (Array.isArray(modelValue.value)) {
48
97
  modelValue.value = isChecked2 ? [...modelValue.value, props.value] : modelValue.value.filter((v) => v !== props.value);
49
98
  return;
50
99
  }
51
100
  modelValue.value = isChecked2;
52
101
  }
53
- function onInputChange(event) {
54
- const isInputChecked = event.target.checked;
55
- toggleChecked(isInputChecked);
56
- }
57
- function getCheckedState() {
58
- if (props.indeterminate) {
59
- return "indeterminate";
60
- }
61
- return isChecked.value ? "checked" : "unchecked";
62
- }
63
- defineExpose({
64
- getCheckedState
65
- });
66
102
  </script>
67
103
 
68
104
  <template>
69
105
  <label
70
106
  role="checkbox"
71
- :aria-checked="isChecked"
72
- :data-disabled="computedDisabled"
73
- :class="computedClasses.wrapper()"
107
+ :aria-selected="isChecked"
108
+ :data-disabled="isDisabled"
109
+ class="pxd-checkbox group/checkbox gap-2 inline-flex max-w-full cursor-pointer touch-manipulation items-center data-[disabled=true]:cursor-not-allowed data-[disabled=true]:text-gray-500"
74
110
  :for="uniqueId"
75
111
  v-bind="$attrs"
76
112
  >
@@ -78,17 +114,16 @@ defineExpose({
78
114
  :id="uniqueId"
79
115
  :value="value"
80
116
  type="checkbox"
81
- class="peer smallest"
117
+ class="peer visually-hidden"
82
118
  :checked="isChecked"
83
- :required="computedRequired"
84
- :disabled="computedDisabled"
119
+ :disabled="isDisabled"
85
120
  @change="onInputChange"
86
121
  />
87
122
 
88
- <span aria-hidden="true" :class="computedClasses.inner()">
89
- <CheckIcon v-if="isChecked" class="size-3 text-gray-100" />
90
- <MinusIcon v-else-if="indeterminate" class="size-3" />
91
- <span v-else class="size-3" />
123
+ <span aria-hidden="true" :class="computedClasses">
124
+ <CheckIcon v-if="isChecked" class="size-3 pointer-events-none text-gray-100" />
125
+ <MinusIcon v-else-if="indeterminate" class="size-3 pointer-events-none" />
126
+ <span v-else class="size-3 pointer-events-none" />
92
127
  </span>
93
128
 
94
129
  <span class="text-sm flex-1 shrink-0 empty:hidden">
@@ -1,10 +1,10 @@
1
- import type { ComponentLabel, ComponentOption, ComponentValue } from '../../types/shared'
1
+ import type { ComponentLabel, ComponentValue, ComponentShape } from '../../types/shared'
2
2
 
3
3
  export interface CheckboxProps {
4
4
  label?: ComponentLabel
5
5
  value?: ComponentValue
6
+ shape?: ComponentShape
6
7
  disabled?: boolean
7
- required?: boolean
8
8
  modelValue?: ComponentValue | ComponentValue[]
9
9
  indeterminate?: boolean
10
10
  }
@@ -13,15 +13,3 @@ export interface CheckboxEmits {
13
13
  change: [NonNullable<CheckboxProps['modelValue']>]
14
14
  'update:modelValue': [NonNullable<CheckboxProps['modelValue']>]
15
15
  }
16
-
17
- export interface CheckboxGroupProps {
18
- disabled?: boolean
19
- required?: boolean
20
- modelValue?: ComponentValue[]
21
- options?: ComponentOption[]
22
- }
23
-
24
- export interface CheckboxGroupEmits {
25
- change: [NonNullable<CheckboxGroupProps['modelValue']>]
26
- 'update:modelValue': [NonNullable<CheckboxGroupProps['modelValue']>]
27
- }
@@ -1,14 +1,9 @@
1
- import type { CheckboxGroupProps } from '../checkbox/types';
2
- declare function isCheckedAll(): boolean;
3
- declare function isCheckedPartial(): boolean;
1
+ import type { CheckboxGroupProps } from './types';
4
2
  declare var __VLS_8: {};
5
3
  type __VLS_Slots = {} & {
6
4
  default?: (props: typeof __VLS_8) => any;
7
5
  };
8
- declare const __VLS_base: import("vue").DefineComponent<CheckboxGroupProps, {
9
- isCheckedAll: typeof isCheckedAll;
10
- isCheckedPartial: typeof isCheckedPartial;
11
- }, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
6
+ declare const __VLS_base: import("vue").DefineComponent<CheckboxGroupProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
12
7
  change: (args_0: import("../../types/shared").ComponentValue[]) => any;
13
8
  "update:modelValue": (args_0: import("../../types/shared").ComponentValue[]) => any;
14
9
  }, string, import("vue").PublicProps, Readonly<CheckboxGroupProps> & Readonly<{