pxd 0.0.55 → 0.0.60

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 (275) 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 +2 -2
  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 +7 -4
  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 +5 -4
  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 +4 -3
  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 +7 -2
  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 +2 -1
  122. package/dist/components/popover/index.d.vue.ts +1 -1
  123. package/dist/components/popover/index.vue +116 -78
  124. package/dist/components/popover/types.d.ts +2 -0
  125. package/dist/components/progress/index.d.vue.ts +1 -1
  126. package/dist/components/progress/index.vue +15 -2
  127. package/dist/components/project-banner/index.d.vue.ts +18 -0
  128. package/dist/components/project-banner/index.vue +59 -0
  129. package/dist/components/project-banner/types.d.ts +8 -0
  130. package/dist/components/radio/index.vue +62 -20
  131. package/dist/components/radio/types.d.ts +1 -14
  132. package/dist/components/radio-group/index.d.vue.ts +2 -4
  133. package/dist/components/radio-group/index.vue +11 -16
  134. package/dist/components/radio-group/types.d.ts +12 -0
  135. package/dist/components/resizable/types.d.ts +5 -10
  136. package/dist/components/resizable-handle/index.vue +1 -1
  137. package/dist/components/resizable-panel/index.d.vue.ts +1 -1
  138. package/dist/components/resizable-panel/index.vue +7 -2
  139. package/dist/components/resizable-panel/types.d.ts +4 -0
  140. package/dist/components/scrollable/index.d.vue.ts +29 -0
  141. package/dist/components/scrollable/index.vue +98 -83
  142. package/dist/components/scrollable/types.d.ts +19 -5
  143. package/dist/components/skeleton/index.vue +24 -1
  144. package/dist/components/slider/index.d.vue.ts +6 -6
  145. package/dist/components/slider/index.vue +86 -44
  146. package/dist/components/slider/types.d.ts +1 -1
  147. package/dist/components/snippet/index.vue +28 -2
  148. package/dist/components/spinner/index.vue +4 -2
  149. package/dist/components/stack/index.d.vue.ts +2 -2
  150. package/dist/components/stack/index.vue +35 -3
  151. package/dist/components/stack/types.d.ts +1 -1
  152. package/dist/components/status-dot/index.vue +5 -1
  153. package/dist/components/switch/index.d.vue.ts +10 -1
  154. package/dist/components/switch/index.vue +35 -44
  155. package/dist/components/switch/types.d.ts +4 -12
  156. package/dist/components/switch-item/index.d.vue.ts +14 -0
  157. package/dist/components/switch-item/index.vue +79 -0
  158. package/dist/components/switch-item/types.d.ts +9 -0
  159. package/dist/components/teleport/index.d.vue.ts +1 -1
  160. package/dist/components/teleport/index.vue +1 -1
  161. package/dist/components/teleport/types.d.ts +1 -1
  162. package/dist/components/text/index.d.vue.ts +1 -2
  163. package/dist/components/text/index.vue +36 -22
  164. package/dist/components/text/types.d.ts +1 -1
  165. package/dist/components/textarea/index.d.vue.ts +4 -4
  166. package/dist/components/textarea/index.vue +33 -4
  167. package/dist/components/textarea/types.d.ts +0 -1
  168. package/dist/components/time-picker/index.d.vue.ts +1 -2
  169. package/dist/components/time-picker/index.vue +43 -9
  170. package/dist/components/time-picker/types.d.ts +1 -2
  171. package/dist/components/toggle/index.vue +11 -10
  172. package/dist/components/toggle-button/index.d.vue.ts +22 -0
  173. package/dist/components/toggle-button/index.vue +110 -0
  174. package/dist/components/toggle-button/types.d.ts +16 -0
  175. package/dist/components/{choicebox-group → toggle-button-group}/index.d.vue.ts +5 -5
  176. package/dist/components/toggle-button-group/index.vue +68 -0
  177. package/dist/components/toggle-button-group/types.d.ts +22 -0
  178. package/dist/components/tooltip/index.d.vue.ts +2 -0
  179. package/dist/components/tooltip/index.vue +9 -3
  180. package/dist/components/tooltip/types.d.ts +2 -0
  181. package/dist/components/virtual-list/index.d.vue.ts +25 -4
  182. package/dist/components/virtual-list/index.vue +66 -10
  183. package/dist/components/virtual-list/types.d.ts +9 -4
  184. package/dist/composables/index.d.ts +2 -2
  185. package/dist/composables/index.js +2 -2
  186. package/dist/composables/use-browser-observer.d.ts +5 -5
  187. package/dist/composables/use-browser-observer.js +23 -20
  188. package/dist/composables/use-copy-click.js +4 -0
  189. package/dist/composables/use-countdown.d.ts +2 -2
  190. package/dist/composables/use-focus-trap.d.ts +6 -2
  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 +3 -6
  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.js +2 -2
  199. package/dist/composables/use-virtual-list.d.ts +21 -12
  200. package/dist/composables/use-virtual-list.js +90 -158
  201. package/dist/composables/use-window-size.d.ts +4 -0
  202. package/dist/composables/use-window-size.js +27 -0
  203. package/dist/contexts/avatar.d.ts +5 -2
  204. package/dist/contexts/carousel.d.ts +4 -4
  205. package/dist/contexts/carousel.js +1 -1
  206. package/dist/contexts/checkbox.d.ts +7 -2
  207. package/dist/contexts/choicebox.d.ts +8 -4
  208. package/dist/contexts/choicebox.js +1 -4
  209. package/dist/contexts/collapse.d.ts +5 -6
  210. package/dist/contexts/collapse.js +1 -1
  211. package/dist/contexts/config-provider.d.ts +5 -0
  212. package/dist/{composables/use-config-provider-context.js → contexts/config-provider.js} +8 -5
  213. package/dist/contexts/radio.d.ts +8 -2
  214. package/dist/contexts/switch.d.ts +8 -4
  215. package/dist/contexts/switch.js +1 -2
  216. package/dist/contexts/toggle-button.d.ts +7 -0
  217. package/dist/contexts/toggle-button.js +2 -0
  218. package/dist/styles/source.css +14 -2
  219. package/dist/styles/styles.css +2 -2
  220. package/dist/styles/tw.css +14 -2
  221. package/dist/types/shared/props.d.ts +1 -3
  222. package/dist/types/shared/utils.d.ts +0 -3
  223. package/dist/utils/context.d.ts +1 -0
  224. package/dist/utils/get.d.ts +1 -0
  225. package/dist/utils/get.js +14 -0
  226. package/dist/utils/responsive.js +2 -1
  227. package/dist/utils/throttle.js +9 -7
  228. package/dist/utils/uid.d.ts +1 -1
  229. package/dist/utils/uid.js +2 -2
  230. package/package.json +23 -21
  231. package/volar.d.ts +7 -3
  232. package/dist/components/badge/cn.d.ts +0 -90
  233. package/dist/components/badge/cn.js +0 -44
  234. package/dist/components/button/cn.d.ts +0 -121
  235. package/dist/components/button/cn.js +0 -55
  236. package/dist/components/carousel-group/index.d.vue.ts +0 -35
  237. package/dist/components/carousel-group/index.vue +0 -368
  238. package/dist/components/checkbox/cn.d.ts +0 -67
  239. package/dist/components/checkbox/cn.js +0 -31
  240. package/dist/components/chip/cn.d.ts +0 -49
  241. package/dist/components/chip/cn.js +0 -26
  242. package/dist/components/choicebox-group/index.vue +0 -65
  243. package/dist/components/error/cn.d.ts +0 -22
  244. package/dist/components/error/cn.js +0 -15
  245. package/dist/components/input/cn.d.ts +0 -73
  246. package/dist/components/input/cn.js +0 -36
  247. package/dist/components/list-item/cn.d.ts +0 -22
  248. package/dist/components/list-item/cn.js +0 -15
  249. package/dist/components/loading-bar/cn.d.ts +0 -70
  250. package/dist/components/loading-bar/cn.js +0 -32
  251. package/dist/components/note/cn.d.ts +0 -121
  252. package/dist/components/note/cn.js +0 -66
  253. package/dist/components/pin-input/cn.d.ts +0 -46
  254. package/dist/components/pin-input/cn.js +0 -25
  255. package/dist/components/progress/cn.d.ts +0 -19
  256. package/dist/components/progress/cn.js +0 -14
  257. package/dist/components/radio/cn.d.ts +0 -46
  258. package/dist/components/radio/cn.js +0 -42
  259. package/dist/components/skeleton/cn.d.ts +0 -43
  260. package/dist/components/skeleton/cn.js +0 -24
  261. package/dist/components/snippet/cn.d.ts +0 -52
  262. package/dist/components/snippet/cn.js +0 -27
  263. package/dist/components/stack/cn.d.ts +0 -70
  264. package/dist/components/stack/cn.js +0 -33
  265. package/dist/components/switch/cn.d.ts +0 -16
  266. package/dist/components/switch/cn.js +0 -13
  267. package/dist/components/switch-group/index.d.vue.ts +0 -23
  268. package/dist/components/switch-group/index.vue +0 -54
  269. package/dist/components/text/cn.d.ts +0 -67
  270. package/dist/components/text/cn.js +0 -34
  271. package/dist/components/textarea/cn.d.ts +0 -58
  272. package/dist/components/textarea/cn.js +0 -30
  273. package/dist/composables/use-config-provider-context.d.ts +0 -3
  274. package/dist/composables/use-unique-id-context.d.ts +0 -2
  275. package/dist/composables/use-unique-id-context.js +0 -11
@@ -0,0 +1,68 @@
1
+ <script setup>
2
+ import { useConfigProvider } from "../../contexts/config-provider";
3
+ import PStack from "../stack/index.vue";
4
+ import PToggleButton from "../toggle-button/index.vue";
5
+ import { computed } from "vue";
6
+ import { tv } from "tailwind-variants";
7
+ import { provideToggleButtonGroupContext } from "../../contexts/toggle-button";
8
+ defineOptions({
9
+ name: "PToggleButtonGroup",
10
+ inheritAttrs: false,
11
+ model: {
12
+ prop: "modelValue",
13
+ event: "update:modelValue"
14
+ }
15
+ });
16
+ const props = defineProps({
17
+ gap: { type: [String, Number, Object], required: false, default: 0 },
18
+ size: { type: String, required: false },
19
+ disabled: { type: Boolean, required: false },
20
+ multiple: { type: Boolean, required: false, default: true },
21
+ options: { type: Array, required: false },
22
+ variant: { type: String, required: false },
23
+ modelValue: { type: [String, Number, Boolean, Array], required: false, default: () => [] }
24
+ });
25
+ const emits = defineEmits(["change", "update:modelValue"]);
26
+ const configProvider = useConfigProvider();
27
+ const toggleButtonGroupVariant = tv({
28
+ base: "pxd-toggle-button-group group/toggle-button-group w-max overflow-hidden",
29
+ variants: {
30
+ size: {
31
+ sm: "rounded-md",
32
+ md: "rounded-md",
33
+ lg: "rounded-lg"
34
+ },
35
+ variant: {
36
+ outline: "",
37
+ ghost: ""
38
+ }
39
+ },
40
+ defaultVariants: {
41
+ size: "md"
42
+ }
43
+ });
44
+ const computedSize = computed(() => props.size || configProvider.size);
45
+ const computedClasses = computed(
46
+ () => toggleButtonGroupVariant({
47
+ size: computedSize.value,
48
+ variant: props.variant
49
+ })
50
+ );
51
+ provideToggleButtonGroupContext({ props, emits });
52
+ </script>
53
+
54
+ <template>
55
+ <PStack
56
+ role="group"
57
+ :class="computedClasses"
58
+ aria-label="Toggle Button Group"
59
+ align="center"
60
+ :gap="gap"
61
+ :data-gap="gap"
62
+ v-bind="$attrs"
63
+ >
64
+ <slot>
65
+ <PToggleButton v-for="option in options" :key="option.value" v-bind="option" />
66
+ </slot>
67
+ </PStack>
68
+ </template>
@@ -0,0 +1,22 @@
1
+ import type {
2
+ ComponentSize,
3
+ ComponentValue,
4
+ ComponentOption,
5
+ ResponsiveValue,
6
+ } from '../../types/shared'
7
+ import type { CheckboxProps } from '../checkbox/types'
8
+
9
+ export interface ToggleButtonGroupProps {
10
+ gap?: ResponsiveValue<string | number>
11
+ size?: ComponentSize
12
+ disabled?: boolean
13
+ multiple?: boolean
14
+ options?: ComponentOption[]
15
+ variant?: 'ghost' | 'outline'
16
+ modelValue?: ComponentValue | ComponentValue[]
17
+ }
18
+
19
+ export interface ToggleButtonGroupEmits {
20
+ change: [NonNullable<CheckboxProps['modelValue']>]
21
+ 'update:modelValue': [NonNullable<CheckboxProps['modelValue']>]
22
+ }
@@ -8,6 +8,8 @@ type __VLS_Slots = {} & {
8
8
  declare const __VLS_base: import("vue").DefineComponent<TooltipProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<TooltipProps> & Readonly<{}>, {
9
9
  variant: import("../../types/shared").ComponentVariant;
10
10
  position: import("../../types/shared").ComponentPosition;
11
+ showDelay: number;
12
+ hideDelay: number;
11
13
  showArrow: boolean;
12
14
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
13
15
  declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
@@ -13,6 +13,8 @@ const props = defineProps({
13
13
  variant: { type: String, required: false, default: "primary" },
14
14
  position: { type: null, required: false, default: "top" },
15
15
  disabled: { type: Boolean, required: false },
16
+ showDelay: { type: Number, required: false, default: 300 },
17
+ hideDelay: { type: Number, required: false, default: 100 },
16
18
  showArrow: { type: Boolean, required: false, default: true },
17
19
  desktopOnly: { type: Boolean, required: false },
18
20
  contentClass: { type: [String, Array, Object], required: false },
@@ -37,12 +39,12 @@ const VARIANTS = {
37
39
  }
38
40
  };
39
41
  const computedVariant = computed(() => getFallbackValue(props.variant, VARIANTS, "primary"));
40
- const computedDisabled = computed(() => {
42
+ const isDisabled = computed(() => {
41
43
  return props.disabled || props.desktopOnly && isTouchDevice();
42
44
  });
43
45
  const computedClasses = computed(() => {
44
46
  return [
45
- "px-2 py-2 rounded-md text-sm break-words whitespace-pre-line shadow-border-tooltip bg-(--popover-arrow-bg)",
47
+ "px-3 py-2 rounded-md text-sm break-words whitespace-pre-line bg-(--popover-arrow-bg)",
46
48
  computedVariant.value.text,
47
49
  props.contentClass
48
50
  ].join(" ");
@@ -51,10 +53,14 @@ const computedClasses = computed(() => {
51
53
 
52
54
  <template>
53
55
  <PPopover
56
+ role="tooltip"
54
57
  class="pxd-tooltip"
55
58
  :position="position"
56
- :disabled="computedDisabled"
59
+ :disabled="isDisabled"
57
60
  :show-arrow="showArrow"
61
+ :show-delay="showDelay"
62
+ :hide-delay="hideDelay"
63
+ wrapper-class="max-sm:data-[position^=top]:px-1 max-sm:data-[position^=bottom]:px-1 max-sm:data-[position^=left]:pl-1 max-sm:data-[position^=right]:pr-1"
58
64
  :arrow-color="computedVariant.bg"
59
65
  :content-class="computedClasses"
60
66
  :content-style="contentStyle"
@@ -8,6 +8,8 @@ export interface TooltipProps {
8
8
  variant?: ComponentVariant
9
9
  position?: ComponentPosition
10
10
  disabled?: boolean
11
+ showDelay?: number
12
+ hideDelay?: number
11
13
  showArrow?: boolean
12
14
  desktopOnly?: boolean
13
15
  contentClass?: ComponentClass
@@ -1,14 +1,35 @@
1
1
  import type { VirtualListProps } from './types';
2
2
  declare var __VLS_1: {
3
3
  item: any;
4
- };
4
+ virtualItem: import("../../composables/use-virtual-list").VirtualListItem;
5
+ }, __VLS_3: {};
5
6
  type __VLS_Slots = {} & {
6
- default?: (props: typeof __VLS_1) => any;
7
+ item?: (props: typeof __VLS_1) => any;
8
+ } & {
9
+ message?: (props: typeof __VLS_3) => any;
7
10
  };
8
- declare const __VLS_base: import("vue").DefineComponent<VirtualListProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<VirtualListProps> & Readonly<{}>, {
9
- dataKey: string;
11
+ declare const __VLS_base: import("vue").DefineComponent<VirtualListProps, {
12
+ totalSize: import("vue").ComputedRef<number>;
13
+ virtualItems: import("vue").ComputedRef<import("../../composables/use-virtual-list").VirtualListItem[]>;
14
+ getVirtualizer: () => import("@tanstack/virtual-core").Virtualizer<HTMLElement, HTMLElement>;
15
+ scrollToIndex: any;
16
+ scrollToOffset: any;
17
+ scrollBy: any;
18
+ }, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
19
+ bottom: () => any;
20
+ retry: () => any;
21
+ }, string, import("vue").PublicProps, Readonly<VirtualListProps> & Readonly<{
22
+ onBottom?: (() => any) | undefined;
23
+ onRetry?: (() => any) | undefined;
24
+ }>, {
25
+ bottomThreshold: number;
10
26
  listData: any[];
11
27
  itemSize: number;
28
+ errorText: string;
29
+ loadingText: string;
30
+ finishedText: string;
31
+ dataKey: string;
32
+ overScan: number;
12
33
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
13
34
  declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
14
35
  declare const _default: typeof __VLS_export;
@@ -1,26 +1,82 @@
1
1
  <script setup>
2
2
  import { useVirtualList } from "../../composables/use-virtual-list";
3
+ import { shallowRef } from "vue";
4
+ import LoaderCircleIcon from "@gdsicon/vue/loader-circle";
5
+ defineOptions({
6
+ name: "PVirtualList",
7
+ inheritAttrs: false
8
+ });
3
9
  const props = defineProps({
10
+ errorText: { type: String, required: false, default: "Request failed. Click to reload" },
11
+ loadingText: { type: String, required: false, default: "Loading..." },
12
+ finishedText: { type: String, required: false, default: "Finished" },
13
+ status: { type: String, required: false },
4
14
  dataKey: { type: String, required: false, default: "id" },
5
15
  listData: { type: Array, required: false, default: () => [] },
6
- itemSize: { type: Number, required: false, default: 50 }
16
+ itemSize: { type: Number, required: false, default: 50 },
17
+ overScan: { type: Number, required: false, default: 2 },
18
+ onBottom: { type: Function, required: false },
19
+ bottomThreshold: { type: Number, required: false, default: 50 }
20
+ });
21
+ const emits = defineEmits(["retry", "bottom"]);
22
+ const containerRef = shallowRef();
23
+ const {
24
+ totalSize,
25
+ virtualItems,
26
+ measureElement,
27
+ getVirtualizer,
28
+ scrollToIndex,
29
+ scrollToOffset,
30
+ scrollBy
31
+ } = useVirtualList(containerRef, props);
32
+ function onRetryClick() {
33
+ if (props.status !== "error") {
34
+ return;
35
+ }
36
+ emits("retry");
37
+ }
38
+ defineExpose({
39
+ totalSize,
40
+ virtualItems,
41
+ getVirtualizer,
42
+ scrollToIndex,
43
+ scrollToOffset,
44
+ scrollBy
7
45
  });
8
- const { containerRef, renderList, listHeight, listStyle, setItemRef } = useVirtualList(props);
9
46
  </script>
10
47
 
11
48
  <template>
12
- <div ref="containerRef" class="pxd-virtual-list relative overflow-auto">
13
- <div class="pxd-virtual-list--content top-0 absolute z-0 w-full" :style="listStyle">
49
+ <div ref="containerRef" class="pxd-virtual-list relative overflow-auto" v-bind="$attrs">
50
+ <div
51
+ class="pxd-virtual-list--content relative w-full content-visibility-auto"
52
+ :style="{ height: `${totalSize}px`, containIntrinsicSize: `auto ${totalSize}px` }"
53
+ >
14
54
  <div
15
- v-for="item in renderList"
16
- :key="item[dataKey]"
17
- :ref="(el) => setItemRef(el, item[dataKey])"
18
- class="pxd-virtual-list--item w-full"
55
+ v-for="virtualItem in virtualItems"
56
+ :key="virtualItem.key"
57
+ :ref="(el) => measureElement(el)"
58
+ :data-index="virtualItem.index"
59
+ class="pxd-virtual-list--item left-0 top-0 absolute w-full"
60
+ :style="{ transform: `translateY(${virtualItem.start}px)` }"
19
61
  >
20
- <slot :item="item" />
62
+ <slot name="item" :item="listData[virtualItem.index]" :virtual-item="virtualItem" />
21
63
  </div>
22
64
  </div>
23
65
 
24
- <div class="pxd-virtual-list--placeholder" :style="`height:${listHeight}px`" />
66
+ <div
67
+ v-if="status"
68
+ class="pxd-virtual-list--message py-4 text-sm left-0 right-0 flex items-center justify-center text-gray-600 empty:hidden motion-safe:transition-colors"
69
+ :class="{ 'cursor-pointer hover:text-gray-900': status === 'error' }"
70
+ @click="onRetryClick"
71
+ >
72
+ <slot name="message">
73
+ <span v-if="status === 'error'">{{ errorText }}</span>
74
+ <span v-else-if="status === 'finished'">{{ finishedText }}</span>
75
+ <template v-else-if="status === 'loading'">
76
+ <LoaderCircleIcon class="mr-1.5 motion-safe:animate-spin" />
77
+ <span>{{ loadingText }}</span>
78
+ </template>
79
+ </slot>
80
+ </div>
25
81
  </div>
26
82
  </template>
@@ -1,5 +1,10 @@
1
- export interface VirtualListProps {
2
- dataKey?: string;
3
- listData?: any[];
4
- itemSize?: number;
1
+ import type { VirtualListOptions } from '../../composables/use-virtual-list';
2
+ export interface VirtualListProps extends VirtualListOptions {
3
+ errorText?: string;
4
+ loadingText?: string;
5
+ finishedText?: string;
6
+ }
7
+ export interface VirtualListEmits {
8
+ retry: [];
9
+ bottom: [];
5
10
  }
@@ -1,7 +1,6 @@
1
1
  export * from './use-browser-observer.js';
2
2
  export * from './use-client-online.js';
3
3
  export * from './use-color-scheme.js';
4
- export * from './use-config-provider-context.js';
5
4
  export * from './use-copy-click.js';
6
5
  export * from './use-countdown.js';
7
6
  export * from './use-deferred-value.js';
@@ -9,6 +8,7 @@ export * from './use-delay-change.js';
9
8
  export * from './use-delay-destroy.js';
10
9
  export * from './use-document-hidden.js';
11
10
  export * from './use-focus-trap.js';
11
+ export * from './use-forward-ref-expose.js';
12
12
  export * from './use-loading-bar.js';
13
13
  export * from './use-lock-scroll.js';
14
14
  export * from './use-media-query.js';
@@ -19,5 +19,5 @@ export * from './use-pointer-gesture.js';
19
19
  export * from './use-popover-responsive.js';
20
20
  export * from './use-repeat-action.js';
21
21
  export * from './use-toggle-value.js';
22
- export * from './use-unique-id-context.js';
23
22
  export * from './use-virtual-list.js';
23
+ export * from './use-window-size.js';
@@ -1,7 +1,6 @@
1
1
  export * from "./use-browser-observer.js";
2
2
  export * from "./use-client-online.js";
3
3
  export * from "./use-color-scheme.js";
4
- export * from "./use-config-provider-context.js";
5
4
  export * from "./use-copy-click.js";
6
5
  export * from "./use-countdown.js";
7
6
  export * from "./use-deferred-value.js";
@@ -9,6 +8,7 @@ export * from "./use-delay-change.js";
9
8
  export * from "./use-delay-destroy.js";
10
9
  export * from "./use-document-hidden.js";
11
10
  export * from "./use-focus-trap.js";
11
+ export * from "./use-forward-ref-expose.js";
12
12
  export * from "./use-loading-bar.js";
13
13
  export * from "./use-lock-scroll.js";
14
14
  export * from "./use-media-query.js";
@@ -19,5 +19,5 @@ export * from "./use-pointer-gesture.js";
19
19
  export * from "./use-popover-responsive.js";
20
20
  export * from "./use-repeat-action.js";
21
21
  export * from "./use-toggle-value.js";
22
- export * from "./use-unique-id-context.js";
23
22
  export * from "./use-virtual-list.js";
23
+ export * from "./use-window-size.js";
@@ -1,12 +1,12 @@
1
- import type { MaybeRefOrGetter } from 'vue';
1
+ import type { MaybeRefOrGetter, Ref } from 'vue';
2
2
  import type { Nullable } from '../types/shared/utils';
3
- export declare const useIntersectionObserver: (target: TargetRef, callback: IntersectionObserverCallback, options?: MaybeRefOrGetter<IntersectionObserverInit>) => ObserverResults<IntersectionObserver>;
4
- export declare const useMutationObserver: (target: TargetRef, callback: MutationCallback, options?: MaybeRefOrGetter<MutationObserverInit>) => ObserverResults<MutationObserver>;
5
- export declare const useResizeObserver: (target: TargetRef, callback: ResizeObserverCallback, options?: MaybeRefOrGetter<ResizeObserverOptions>) => ObserverResults<ResizeObserver>;
3
+ export declare const useIntersectionObserver: (target: TargetRef, callback: IntersectionObserverCallback, options?: IntersectionObserverInit) => ObserverResults<IntersectionObserver>;
4
+ export declare const useMutationObserver: (target: TargetRef, callback: MutationCallback, options?: MutationObserverInit) => ObserverResults<MutationObserver>;
5
+ export declare const useResizeObserver: (target: TargetRef, callback: ResizeObserverCallback, options?: ResizeObserverOptions) => ObserverResults<ResizeObserver>;
6
6
  type Observers = IntersectionObserver | ResizeObserver | MutationObserver;
7
7
  type TargetRef = MaybeRefOrGetter<Nullable<HTMLElement>> | MaybeRefOrGetter<Nullable<HTMLElement>>[] | MaybeRefOrGetter<Nullable<HTMLElement>[]>;
8
8
  interface ObserverResults<T extends Observers> {
9
- observer: T | undefined;
9
+ observer: Ref<T | undefined>;
10
10
  stop: () => void;
11
11
  }
12
12
  export {};
@@ -1,19 +1,22 @@
1
1
  import { isNotNil } from "es-toolkit";
2
- import { computed, onBeforeUnmount, watch } from "vue";
2
+ import { computed, onBeforeUnmount, watch, shallowRef } from "vue";
3
3
  import { toArray } from "../utils/format.js";
4
4
  import { toValue, unrefElement } from "../utils/ref.js";
5
- export const useIntersectionObserver = createObserver(globalThis.IntersectionObserver);
6
- export const useMutationObserver = createObserver(globalThis.MutationObserver);
7
- export const useResizeObserver = createObserver(globalThis.ResizeObserver);
8
- function createObserver(ObserverConstructor) {
5
+ export const useIntersectionObserver = createObserver(
6
+ globalThis.IntersectionObserver,
7
+ "IntersectionObserver"
8
+ );
9
+ export const useMutationObserver = createObserver(globalThis.MutationObserver, "MutationObserver");
10
+ export const useResizeObserver = createObserver(globalThis.ResizeObserver, "ResizeObserver");
11
+ function createObserver(ObserverConstructor, type) {
9
12
  function observerWrapper(target, callback, options) {
10
- let observer;
13
+ const observer = shallowRef();
11
14
  const targets = computed(
12
15
  () => toArray(toValue(target)).map(unrefElement).filter(isNotNil)
13
16
  );
14
17
  const unwatch = watch(
15
- () => [targets.value],
16
- ([newTargets]) => {
18
+ targets,
19
+ (newTargets) => {
17
20
  if (typeof window === "undefined" || typeof ObserverConstructor === "undefined") {
18
21
  return;
19
22
  }
@@ -21,25 +24,25 @@ function createObserver(ObserverConstructor) {
21
24
  if (!newTargets?.length) {
22
25
  return;
23
26
  }
24
- if (ObserverConstructor.name === "IntersectionObserver") {
25
- observer = new ObserverConstructor(
27
+ if (type === "IntersectionObserver") {
28
+ observer.value = new ObserverConstructor(
26
29
  callback,
27
30
  options
28
31
  );
29
- newTargets.forEach((el) => observer.observe(el));
30
- } else if (ObserverConstructor.name === "MutationObserver") {
31
- observer = new ObserverConstructor(
32
+ newTargets.forEach((el) => observer.value.observe(el));
33
+ } else if (type === "MutationObserver") {
34
+ observer.value = new ObserverConstructor(
32
35
  callback
33
36
  );
34
37
  newTargets.forEach(
35
- (el) => observer.observe(el, options)
38
+ (el) => observer.value.observe(el, options)
36
39
  );
37
- } else {
38
- observer = new ObserverConstructor(
40
+ } else if (type === "ResizeObserver") {
41
+ observer.value = new ObserverConstructor(
39
42
  callback
40
43
  );
41
44
  newTargets.forEach(
42
- (el) => observer.observe(el, options)
45
+ (el) => observer.value.observe(el, options)
43
46
  );
44
47
  }
45
48
  },
@@ -49,11 +52,11 @@ function createObserver(ObserverConstructor) {
49
52
  }
50
53
  );
51
54
  function cleanup() {
52
- if (!observer) {
55
+ if (!observer.value) {
53
56
  return;
54
57
  }
55
- observer.disconnect();
56
- observer = void 0;
58
+ observer.value.disconnect();
59
+ observer.value = void 0;
57
60
  }
58
61
  function stop() {
59
62
  cleanup();
@@ -1,9 +1,13 @@
1
1
  import { shallowRef } from "vue";
2
+ import { isServer } from "../utils/is.js";
2
3
  export function useCopyClick() {
3
4
  let copiedTimer;
4
5
  let copyPromise = null;
5
6
  const isCopied = shallowRef(false);
6
7
  async function copyText(text = "") {
8
+ if (isServer()) {
9
+ return;
10
+ }
7
11
  if (copyPromise) {
8
12
  return copyPromise;
9
13
  }
@@ -1,5 +1,5 @@
1
1
  import type { EmitFn, Ref } from 'vue';
2
- export interface UseCountdownOptions {
2
+ export interface CountdownOptions {
3
3
  /**
4
4
  * 是否启用正计时
5
5
  * Whether to enable count up mode.
@@ -58,5 +58,5 @@ interface Results {
58
58
  reset: () => void;
59
59
  timestamp: Ref<number>;
60
60
  }
61
- export declare function useCountdown<T extends Record<string, any>>(props: UseCountdownOptions, emits: EmitFn<T>): Results;
61
+ export declare function useCountdown<T extends Record<string, any>>(props: CountdownOptions, emits: EmitFn<T>): Results;
62
62
  export {};
@@ -1,12 +1,16 @@
1
1
  import type { Options as FocusTrapOptions } from 'focus-trap';
2
+ import { type MaybeRefOrGetter } from 'vue';
2
3
  import type { MaybeElementRef } from '../types/shared/utils';
4
+ export interface UseFocusTrapOptions extends FocusTrapOptions {
5
+ autoFocusElement?: string | boolean;
6
+ }
3
7
  /**
4
- * Best-practice defaults for dialogs (Modal/Drawer):
8
+ * Best-practice defaults for dialogs (Modal/Drawer/Popover):
5
9
  * - Keep trap active unless component decides to close (avoid implicit deactivation).
6
10
  * - Always provide a fallback focus target to avoid runtime errors when no tabbables exist.
7
11
  * - Prevent scroll jumps caused by focusing.
8
12
  * - Share a trap stack among PXD traps so nested dialogs coordinate pause/unpause.
9
13
  */
10
- export declare function useFocusTrap(container: MaybeElementRef<HTMLElement>, userOptions?: FocusTrapOptions): {
14
+ export declare function useFocusTrap(container: MaybeElementRef<HTMLElement>, userOptions?: MaybeRefOrGetter<UseFocusTrapOptions>): {
11
15
  stop: import("vue").WatchHandle;
12
16
  };
@@ -1,7 +1,14 @@
1
1
  import { createFocusTrap } from "focus-trap";
2
2
  import { onBeforeUnmount, watch } from "vue";
3
3
  import { toValue } from "../utils/ref.js";
4
- const pxdFocusTrapStack = [];
4
+ const focusTrapStack = [];
5
+ const AUTO_FOCUS_FIRST_SELECTOR = [
6
+ 'input:not([type="hidden"]):not(:disabled)',
7
+ "button:not(:disabled)",
8
+ "select:not(:disabled)",
9
+ "textarea:not(:disabled)",
10
+ '[tabindex]:not([tabindex="-1"])'
11
+ ].join(",");
5
12
  export function useFocusTrap(container, userOptions = {}) {
6
13
  let trapper = null;
7
14
  const unwatch = watch(
@@ -10,6 +17,7 @@ export function useFocusTrap(container, userOptions = {}) {
10
17
  if (!target) {
11
18
  return;
12
19
  }
20
+ const { autoFocusElement, ...restOptions } = toValue(userOptions);
13
21
  const defaultOptions = {
14
22
  allowOutsideClick: true,
15
23
  escapeDeactivates: false,
@@ -18,20 +26,24 @@ export function useFocusTrap(container, userOptions = {}) {
18
26
  returnFocusOnDeactivate: true,
19
27
  preventScroll: true,
20
28
  fallbackFocus: () => target,
21
- initialFocus: () => target,
29
+ initialFocus: () => {
30
+ if (autoFocusElement) {
31
+ const elSelector = typeof autoFocusElement === "boolean" ? AUTO_FOCUS_FIRST_SELECTOR : autoFocusElement;
32
+ return target.querySelector(elSelector) ?? target;
33
+ }
34
+ return target;
35
+ },
22
36
  // Coordinate nested PXD dialogs
23
- trapStack: pxdFocusTrapStack
37
+ trapStack: focusTrapStack
24
38
  };
25
- trapper = createFocusTrap(target, { ...defaultOptions, ...userOptions });
39
+ trapper = createFocusTrap(target, { ...defaultOptions, ...restOptions });
26
40
  trapper.activate();
27
41
  onCleanup(() => {
28
42
  trapper.deactivate();
29
43
  trapper = null;
30
44
  });
31
45
  },
32
- {
33
- flush: "post"
34
- }
46
+ { flush: "post" }
35
47
  );
36
48
  onBeforeUnmount(() => {
37
49
  unwatch();
@@ -0,0 +1,2 @@
1
+ import type { MaybeRefOrGetter } from 'vue';
2
+ export declare function useForwardRefExpose<T extends object>(refEl: MaybeRefOrGetter<T | null | undefined>): T;
@@ -0,0 +1,41 @@
1
+ import { toValue } from "../utils/ref.js";
2
+ export function useForwardRefExpose(refEl) {
3
+ return new Proxy({}, {
4
+ get(_, prop) {
5
+ const target = toValue(refEl);
6
+ if (!target) {
7
+ return void 0;
8
+ }
9
+ const value = Reflect.get(target, prop, target);
10
+ return typeof value === "function" ? value.bind(target) : value;
11
+ },
12
+ set(_, prop, value) {
13
+ const target = toValue(refEl);
14
+ if (!target) {
15
+ return false;
16
+ }
17
+ return Reflect.set(target, prop, value, target);
18
+ },
19
+ has(_, prop) {
20
+ const target = toValue(refEl);
21
+ if (!target) {
22
+ return false;
23
+ }
24
+ return prop in target;
25
+ },
26
+ ownKeys() {
27
+ const target = toValue(refEl);
28
+ if (!target) {
29
+ return [];
30
+ }
31
+ return Reflect.ownKeys(target);
32
+ },
33
+ getOwnPropertyDescriptor(_, prop) {
34
+ const target = toValue(refEl);
35
+ if (!target) {
36
+ return void 0;
37
+ }
38
+ return Reflect.getOwnPropertyDescriptor(target, prop);
39
+ }
40
+ });
41
+ }
@@ -22,15 +22,12 @@ interface Options {
22
22
  success?: PromiseMessageHandler;
23
23
  finally?: PromiseMessageHandler;
24
24
  }
25
- export interface MessageItemType extends Options {
25
+ export interface MessageItemConfig extends Options {
26
+ height?: number;
26
27
  _timerId?: ReturnType<typeof setTimeout>;
27
28
  _remainingMs?: number;
28
29
  _startedAtMs?: number;
29
30
  }
30
- export interface MessageItemHeightType {
31
- id: MessageItemType['id'];
32
- height: number;
33
- }
34
31
  interface UseMessage {
35
32
  (msg: MessageContent, options?: Options): void;
36
33
  info: (msg: MessageContent, options?: Options) => void;
@@ -44,7 +41,7 @@ export type MessageActionType = 'create' | 'remove' | 'clear';
44
41
  export interface MessageUpdateParams {
45
42
  type: MessageActionType;
46
43
  group: string;
47
- data?: MessageItemType | {
44
+ data?: MessageItemConfig | {
48
45
  id: Options['id'];
49
46
  };
50
47
  }
@@ -1,14 +1,15 @@
1
1
  import type { WritableComputedRef } from 'vue';
2
- interface Options {
3
- get?: (value: any) => any;
4
- set?: (value: any) => void;
5
- withChange?: boolean;
2
+ interface BaseProps {
3
+ modelValue?: any;
6
4
  }
7
- interface BaseEmit {
5
+ interface BaseEmits {
8
6
  (event: 'change', ...args: any[]): void;
9
7
  (event: 'update:modelValue', ...args: any[]): void;
10
8
  }
11
- export declare function useModelValue<P extends {
12
- modelValue: any;
13
- }, E extends BaseEmit>(props: P, emits: E, options?: Options): WritableComputedRef<NonNullable<P['modelValue']>>;
9
+ interface ModelValueOptions {
10
+ get?: (value: any) => any;
11
+ set?: (value: any) => void;
12
+ withChange?: boolean;
13
+ }
14
+ export declare function useModelValue<P extends BaseProps, E extends BaseEmits>(props: P, emits: E, options?: ModelValueOptions): WritableComputedRef<NonNullable<P['modelValue']>>;
14
15
  export {};