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
@@ -1,9 +1,8 @@
1
1
  <script setup>
2
- import { useModelValue } from "../../composables/use-model-value";
3
- import { provideUniqueId } from "../../composables/use-unique-id-context";
4
2
  import { provideRadioGroupContext } from "../../contexts/radio";
5
3
  import PRadio from "../radio/index.vue";
6
4
  import PStack from "../stack/index.vue";
5
+ import { getUniqueId } from "../../utils/uid";
7
6
  defineOptions({
8
7
  name: "PRadioGroup",
9
8
  inheritAttrs: false,
@@ -14,27 +13,23 @@ defineOptions({
14
13
  });
15
14
  const props = defineProps({
16
15
  disabled: { type: Boolean, required: false },
17
- required: { type: Boolean, required: false },
18
16
  modelValue: { type: [String, Number, Boolean], required: false },
19
- options: { type: Array, required: false, default: () => [] }
17
+ options: { type: Array, required: false }
20
18
  });
21
19
  const emits = defineEmits(["change", "update:modelValue"]);
22
- const modelValue = useModelValue(props, emits);
23
- provideUniqueId("RadioGroupName");
24
- provideRadioGroupContext(props);
20
+ provideRadioGroupContext({ props, emits, name: getUniqueId() });
25
21
  </script>
26
22
 
27
23
  <template>
28
- <PStack class="pxd-radio-group" role="radiogroup" aria-label="Radio Group" v-bind="$attrs">
24
+ <PStack
25
+ class="pxd-radio-group"
26
+ role="radiogroup"
27
+ aria-label="Radio Group"
28
+ aria-multiselectable="false"
29
+ v-bind="$attrs"
30
+ >
29
31
  <slot>
30
- <PRadio
31
- v-for="option in options"
32
- :key="option.value"
33
- v-model="modelValue"
34
- :label="option.label"
35
- :value="option.value"
36
- :disabled="option.disabled"
37
- />
32
+ <PRadio v-for="option in options" :key="option.value" v-bind="option" />
38
33
  </slot>
39
34
  </PStack>
40
35
  </template>
@@ -0,0 +1,12 @@
1
+ import type { ComponentOption, ComponentValue } from '../../types/shared'
2
+
3
+ export interface RadioGroupProps {
4
+ disabled?: boolean
5
+ modelValue?: ComponentValue
6
+ options?: ComponentOption[]
7
+ }
8
+
9
+ export interface RadioGroupEmits {
10
+ change: [NonNullable<RadioGroupProps['modelValue']>]
11
+ 'update:modelValue': [NonNullable<RadioGroupProps['modelValue']>]
12
+ }
@@ -1,13 +1,4 @@
1
- import type { ComponentDirection } from '../../types/shared/props'
2
-
3
- export interface ResizableProps {
4
- direction?: ComponentDirection
5
- }
6
-
7
- export interface ResizablePanelProps {
8
- size?: number | null
9
- minSize?: number
10
- }
1
+ import type { ComponentDirection } from '../../types/shared'
11
2
 
12
3
  export interface PanelConfig {
13
4
  id: string
@@ -21,3 +12,7 @@ export interface HandleConfig {
21
12
  order: number
22
13
  onDrag: (delta: { deltaX: number; deltaY: number }) => void
23
14
  }
15
+
16
+ export interface ResizableProps {
17
+ direction?: ComponentDirection
18
+ }
@@ -6,8 +6,8 @@ defineOptions({
6
6
  name: "PResizableHandle",
7
7
  inheritAttrs: false
8
8
  });
9
- const resizableContext = useResizableContext();
10
9
  const uniqueId = getUniqueId();
10
+ const resizableContext = useResizableContext();
11
11
  let isDragging = false;
12
12
  let startPosition = { x: 0, y: 0 };
13
13
  function onDrag(delta) {
@@ -1,4 +1,4 @@
1
- import type { ResizablePanelProps } from '../resizable/types';
1
+ import type { ResizablePanelProps } from './types';
2
2
  declare var __VLS_1: {};
3
3
  type __VLS_Slots = {} & {
4
4
  default?: (props: typeof __VLS_1) => any;
@@ -3,7 +3,8 @@ import { computed, onBeforeUnmount, onMounted, watch } from "vue";
3
3
  import { useResizableContext } from "../../contexts/resizable";
4
4
  import { getUniqueId } from "../../utils/uid";
5
5
  defineOptions({
6
- name: "PResizablePanel"
6
+ name: "PResizablePanel",
7
+ inheritAttrs: false
7
8
  });
8
9
  const props = defineProps({
9
10
  size: { type: [Number, null], required: false, default: null },
@@ -50,7 +51,11 @@ watch(
50
51
  </script>
51
52
 
52
53
  <template>
53
- <div class="pxd-resizable-panel min-w-0 min-h-0 overflow-hidden" :style="computedStyle">
54
+ <div
55
+ class="pxd-resizable-panel min-w-0 min-h-0 overflow-hidden"
56
+ :style="computedStyle"
57
+ v-bind="$attrs"
58
+ >
54
59
  <slot />
55
60
  </div>
56
61
  </template>
@@ -0,0 +1,4 @@
1
+ export interface ResizablePanelProps {
2
+ size?: number | null
3
+ minSize?: number
4
+ }
@@ -0,0 +1,29 @@
1
+ import type { ScrollableProps } from './types';
2
+ declare function scrollTo(top: number, left: number): void;
3
+ declare function forceUpdate(): void;
4
+ declare var __VLS_1: {};
5
+ type __VLS_Slots = {} & {
6
+ default?: (props: typeof __VLS_1) => any;
7
+ };
8
+ declare const __VLS_base: import("vue").DefineComponent<ScrollableProps, {
9
+ scrollTo: typeof scrollTo;
10
+ forceUpdate: typeof forceUpdate;
11
+ }, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
12
+ scroll: (args_0: Event) => any;
13
+ bottom: (args_0: import("../../types/shared").ComponentDirection, args_1: Event) => any;
14
+ }, string, import("vue").PublicProps, Readonly<ScrollableProps> & Readonly<{
15
+ onScroll?: ((args_0: Event) => any) | undefined;
16
+ onBottom?: ((args_0: import("../../types/shared").ComponentDirection, args_1: Event) => any) | undefined;
17
+ }>, {
18
+ fader: boolean;
19
+ scrollbar: boolean;
20
+ bottomThreshold: number;
21
+ }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
22
+ declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
23
+ declare const _default: typeof __VLS_export;
24
+ export default _default;
25
+ type __VLS_WithSlots<T, S> = T & {
26
+ new (): {
27
+ $slots: S;
28
+ };
29
+ };
@@ -1,8 +1,8 @@
1
1
  <script setup>
2
- import { computed, onBeforeUnmount, onMounted, ref, shallowRef } from "vue";
3
- import { useResizeObserver } from "../../composables/use-browser-observer";
2
+ import { computed, onBeforeUnmount, onMounted, shallowRef } from "vue";
3
+ import { useMutationObserver, useResizeObserver } from "../../composables/use-browser-observer";
4
4
  import { getStyle } from "../../utils/dom";
5
- import { cachedOff, cachedOn, once } from "../../utils/event";
5
+ import { cachedOff, cachedOn, off, once } from "../../utils/event";
6
6
  import { isServer } from "../../utils/is";
7
7
  import { throttleByRaf } from "../../utils/throttle";
8
8
  import PFader from "../fader/index.vue";
@@ -12,37 +12,43 @@ defineOptions({
12
12
  });
13
13
  const props = defineProps({
14
14
  fader: { type: Boolean, required: false, default: true },
15
+ loading: { type: Boolean, required: false },
16
+ scrollbar: { type: Boolean, required: false, default: true },
15
17
  faderSize: { type: Number, required: false },
16
18
  faderColor: { type: String, required: false },
17
19
  faderDirection: { type: String, required: false },
18
- scrollbar: { type: Boolean, required: false, default: true },
19
20
  wrapperClass: { type: [String, Array, Object], required: false },
20
21
  contentClass: { type: [String, Array, Object], required: false },
21
22
  contentStyle: { type: [Object, String], required: false },
22
23
  scrollbarSize: { type: Number, required: false },
23
24
  scrollbarColor: { type: String, required: false },
24
25
  scrollbarHoverColor: { type: String, required: false },
25
- loading: { type: Boolean, required: false },
26
- endThreshold: { type: Number, required: false, default: 10 }
26
+ bottomThreshold: { type: Number, required: false, default: 10 }
27
27
  });
28
- const emits = defineEmits(["scroll", "end"]);
28
+ const emits = defineEmits(["scroll", "bottom"]);
29
29
  const wrapperRef = shallowRef();
30
30
  const contentRef = shallowRef();
31
+ const isScrollableX = shallowRef(false);
32
+ const isScrollableY = shallowRef(false);
33
+ const verticalThumbTop = shallowRef(0);
34
+ const horizontalThumbLeft = shallowRef(0);
35
+ const verticalThumbHeight = shallowRef(0);
36
+ const horizontalThumbWidth = shallowRef(0);
31
37
  const MIN_THUMB = 30;
38
+ let triggerRightFired = false;
39
+ let triggerBottomFired = false;
32
40
  let dragState = {
33
41
  isDragging: false,
34
42
  direction: null,
35
43
  startClientPos: 0,
36
44
  startThumbPos: 0
37
45
  };
38
- const scrollInfo = ref({
39
- isScrollableX: false,
40
- isScrollableY: false,
41
- verticalThumbHeight: 0,
42
- horizontalThumbWidth: 0,
43
- verticalThumbTop: 0,
44
- horizontalThumbLeft: 0
45
- });
46
+ let cachedPadding = {
47
+ top: 0,
48
+ bottom: 0,
49
+ left: 0,
50
+ right: 0
51
+ };
46
52
  const computedStyle = computed(() => {
47
53
  return {
48
54
  "--scrollbar-size": props.scrollbarSize,
@@ -51,23 +57,22 @@ const computedStyle = computed(() => {
51
57
  };
52
58
  });
53
59
  const verticalThumbStyle = computed(() => ({
54
- height: `${scrollInfo.value.verticalThumbHeight}px`,
55
- transform: `translateY(${scrollInfo.value.verticalThumbTop}px)`
60
+ height: `${verticalThumbHeight.value}px`,
61
+ transform: `translateY(${verticalThumbTop.value}px)`
56
62
  }));
57
63
  const horizontalThumbStyle = computed(() => ({
58
- width: `${scrollInfo.value.horizontalThumbWidth}px`,
59
- transform: `translateX(${scrollInfo.value.horizontalThumbLeft}px)`
64
+ width: `${horizontalThumbWidth.value}px`,
65
+ transform: `translateX(${horizontalThumbLeft.value}px)`
60
66
  }));
61
67
  function updateScrollbarMetrics() {
68
+ if (!props.scrollbar) {
69
+ return;
70
+ }
62
71
  const contentEl = contentRef.value;
63
- if (!contentEl || !props.scrollbar) {
72
+ if (!contentEl || !contentEl.isConnected) {
64
73
  return;
65
74
  }
66
- const { paddingTop, paddingRight, paddingBottom, paddingLeft } = getStyle(contentEl);
67
- const pt = Number.parseFloat(paddingTop) || 0;
68
- const pb = Number.parseFloat(paddingBottom) || 0;
69
- const pl = Number.parseFloat(paddingLeft) || 0;
70
- const pr = Number.parseFloat(paddingRight) || 0;
75
+ const { top: pt, bottom: pb, left: pl, right: pr } = cachedPadding;
71
76
  const {
72
77
  clientWidth: clientW,
73
78
  clientHeight: clientH,
@@ -80,28 +85,26 @@ function updateScrollbarMetrics() {
80
85
  const effClientH = Math.max(0, clientH - pt - pb);
81
86
  const effScrollW = Math.max(effClientW, scrollW - pl - pr);
82
87
  const effScrollH = Math.max(effClientH, scrollH - pt - pb);
83
- const isScrollableX = effScrollW > effClientW;
84
- const isScrollableY = effScrollH > effClientH;
88
+ const _isScrollableX = effScrollW > effClientW;
89
+ const _isScrollableY = effScrollH > effClientH;
85
90
  const verticalRatio = effScrollH > 0 ? effClientH / effScrollH : 0;
86
91
  const horizontalRatio = effScrollW > 0 ? effClientW / effScrollW : 0;
87
- const verticalThumbHeight = Math.max(Math.round(trackH * verticalRatio), MIN_THUMB);
88
- const horizontalThumbWidth = Math.max(Math.round(trackW * horizontalRatio), MIN_THUMB);
89
- const scrollableWidth = Math.max(0, trackW - horizontalThumbWidth);
90
- const scrollableHeight = Math.max(0, trackH - verticalThumbHeight);
92
+ const _verticalThumbHeight = Math.max(Math.round(trackH * verticalRatio), MIN_THUMB);
93
+ const _horizontalThumbWidth = Math.max(Math.round(trackW * horizontalRatio), MIN_THUMB);
94
+ const scrollableWidth = Math.max(0, trackW - _horizontalThumbWidth);
95
+ const scrollableHeight = Math.max(0, trackH - _verticalThumbHeight);
91
96
  const maxScrollX = Math.max(1, scrollW - clientW);
92
97
  const maxScrollY = Math.max(1, scrollH - clientH);
93
98
  const verticalScrollPercentage = Math.min(1, Math.max(0, contentEl.scrollTop / maxScrollY));
94
99
  const horizontalScrollPercentage = Math.min(1, Math.max(0, contentEl.scrollLeft / maxScrollX));
95
- const verticalThumbTop = verticalScrollPercentage * scrollableHeight;
96
- const horizontalThumbLeft = horizontalScrollPercentage * scrollableWidth;
97
- scrollInfo.value = {
98
- isScrollableX,
99
- isScrollableY,
100
- verticalThumbHeight,
101
- horizontalThumbWidth,
102
- verticalThumbTop,
103
- horizontalThumbLeft
104
- };
100
+ const _verticalThumbTop = verticalScrollPercentage * scrollableHeight;
101
+ const _horizontalThumbLeft = horizontalScrollPercentage * scrollableWidth;
102
+ isScrollableX.value = _isScrollableX;
103
+ isScrollableY.value = _isScrollableY;
104
+ verticalThumbHeight.value = _verticalThumbHeight;
105
+ horizontalThumbWidth.value = _horizontalThumbWidth;
106
+ verticalThumbTop.value = _verticalThumbTop;
107
+ horizontalThumbLeft.value = _horizontalThumbLeft;
105
108
  }
106
109
  const throttledUpdate = throttleByRaf(updateScrollbarMetrics);
107
110
  let lastScrollTop = 0;
@@ -134,17 +137,26 @@ function onContainerScroll(ev) {
134
137
  movedY = currTop !== lastScrollTop;
135
138
  movedX = currLeft !== lastScrollLeft;
136
139
  }
137
- const endDistance = props.endThreshold ?? 0;
140
+ const threshold = props.bottomThreshold ?? 0;
138
141
  if (movedY) {
139
- const distanceToBottom = el.scrollHeight - (currTop + el.clientHeight);
140
- if (distanceToBottom <= endDistance) {
141
- emits("end", ev, "vertical");
142
+ const scrollBottom = Math.floor(currTop + el.clientHeight);
143
+ if (scrollBottom >= el.scrollHeight - threshold) {
144
+ if (!triggerBottomFired) {
145
+ triggerBottomFired = true;
146
+ emits("bottom", "vertical", ev);
147
+ }
148
+ } else {
149
+ triggerBottomFired = false;
142
150
  }
143
- }
144
- if (movedX) {
145
- const distanceToRight = el.scrollWidth - (currLeft + el.clientWidth);
146
- if (distanceToRight <= endDistance) {
147
- emits("end", ev, "horizontal");
151
+ } else if (movedX) {
152
+ const scrollRight = Math.floor(currLeft + el.clientWidth);
153
+ if (scrollRight >= el.scrollWidth - threshold) {
154
+ if (!triggerRightFired) {
155
+ triggerRightFired = true;
156
+ emits("bottom", "horizontal", ev);
157
+ }
158
+ } else {
159
+ triggerRightFired = false;
148
160
  }
149
161
  }
150
162
  lastScrollTop = currTop;
@@ -160,7 +172,7 @@ function startDragVertical(e) {
160
172
  isDragging: true,
161
173
  direction: "vertical",
162
174
  startClientPos: e.clientY,
163
- startThumbPos: scrollInfo.value.verticalThumbTop
175
+ startThumbPos: verticalThumbTop.value
164
176
  };
165
177
  cachedOn(document, "mousemove", onDragMove);
166
178
  once(document, "mouseup", onEndDrag);
@@ -175,7 +187,7 @@ function startDragHorizontal(e) {
175
187
  isDragging: true,
176
188
  direction: "horizontal",
177
189
  startClientPos: e.clientX,
178
- startThumbPos: scrollInfo.value.horizontalThumbLeft
190
+ startThumbPos: horizontalThumbLeft.value
179
191
  };
180
192
  cachedOn(document, "mousemove", onDragMove);
181
193
  once(document, "mouseup", onEndDrag);
@@ -190,23 +202,23 @@ function onDragMove(e) {
190
202
  }
191
203
  if (dragState.direction === "vertical") {
192
204
  const trackH = wrapperRef.value.clientHeight ?? contentEl.clientHeight;
193
- const thumbH = scrollInfo.value.verticalThumbHeight;
205
+ const thumbH = verticalThumbHeight.value;
194
206
  const scrollableH = Math.max(0, trackH - thumbH);
195
207
  const delta2 = e.clientY - dragState.startClientPos;
196
208
  const newThumbTop = Math.max(0, Math.min(scrollableH, dragState.startThumbPos + delta2));
197
209
  const maxScroll2 = Math.max(0, contentEl.scrollHeight - contentEl.clientHeight);
198
210
  contentEl.scrollTop = scrollableH > 0 ? newThumbTop / scrollableH * maxScroll2 : 0;
199
- scrollInfo.value.verticalThumbTop = newThumbTop;
211
+ verticalThumbTop.value = newThumbTop;
200
212
  return;
201
213
  }
202
214
  const trackW = wrapperRef.value.clientWidth ?? contentEl.clientWidth;
203
- const thumbW = scrollInfo.value.horizontalThumbWidth;
215
+ const thumbW = horizontalThumbWidth.value;
204
216
  const scrollableW = Math.max(0, trackW - thumbW);
205
217
  const delta = e.clientX - dragState.startClientPos;
206
218
  const newThumbLeft = Math.max(0, Math.min(scrollableW, dragState.startThumbPos + delta));
207
219
  const maxScroll = Math.max(0, contentEl.scrollWidth - contentEl.clientWidth);
208
220
  contentEl.scrollLeft = scrollableW > 0 ? newThumbLeft / scrollableW * maxScroll : 0;
209
- scrollInfo.value.horizontalThumbLeft = newThumbLeft;
221
+ horizontalThumbLeft.value = newThumbLeft;
210
222
  }
211
223
  function onEndDrag(ev) {
212
224
  ev.stopPropagation();
@@ -223,7 +235,26 @@ function scrollTo(top, left) {
223
235
  contentRef.value.scrollTo({ top, left });
224
236
  }
225
237
  if (props.scrollbar) {
226
- useResizeObserver(contentRef, throttledUpdate);
238
+ useResizeObserver(wrapperRef, throttledUpdate);
239
+ useMutationObserver(contentRef, throttledUpdate, { childList: true, subtree: true });
240
+ }
241
+ function getContainerPadding() {
242
+ const contentEl = contentRef.value;
243
+ if (!contentEl) {
244
+ return;
245
+ }
246
+ const { paddingTop, paddingRight, paddingBottom, paddingLeft } = getStyle(contentEl);
247
+ cachedPadding = {
248
+ top: Number.parseFloat(paddingTop) || 0,
249
+ bottom: Number.parseFloat(paddingBottom) || 0,
250
+ left: Number.parseFloat(paddingLeft) || 0,
251
+ right: Number.parseFloat(paddingRight) || 0
252
+ };
253
+ }
254
+ function forceUpdate() {
255
+ throttledUpdate.cancel();
256
+ getContainerPadding();
257
+ updateScrollbarMetrics();
227
258
  }
228
259
  onMounted(async () => {
229
260
  if (isServer()) {
@@ -232,25 +263,24 @@ onMounted(async () => {
232
263
  if (!props.scrollbar && !props.fader) {
233
264
  return;
234
265
  }
235
- cachedOn(window, "resize", updateScrollbarMetrics, { passive: true });
266
+ getContainerPadding();
236
267
  requestAnimationFrame(updateScrollbarMetrics);
237
268
  });
238
269
  onBeforeUnmount(() => {
239
- cachedOff(window, "resize", updateScrollbarMetrics);
240
- cachedOff(document, "mousemove", onDragMove);
241
- cachedOff(document, "mouseup", onEndDrag);
242
270
  throttledUpdate.cancel();
271
+ cachedOff(document, "mousemove", onDragMove);
272
+ off(document, "mouseup", onEndDrag);
243
273
  });
244
274
  defineExpose({
245
275
  scrollTo,
246
- forceUpdate: throttledUpdate
276
+ forceUpdate
247
277
  });
248
278
  </script>
249
279
 
250
280
  <template>
251
281
  <div
252
282
  ref="wrapperRef"
253
- class="pxd-scrollable group/scrollable relative flex overflow-hidden hover:[--o:1] pointer-fine:[--o:0]"
283
+ class="pxd-scrollable group/scrollable relative flex flex-col overflow-hidden hover:[--o:1] pointer-fine:[--o:0]"
254
284
  :class="wrapperClass"
255
285
  :style="computedStyle"
256
286
  v-bind="$attrs"
@@ -259,7 +289,7 @@ defineExpose({
259
289
  ref="contentRef"
260
290
  :class="contentClass"
261
291
  :style="contentStyle"
262
- class="pxd-scrollable--content relative scrollbar-hidden max-h-full flex-1 shrink-0 overflow-scroll"
292
+ class="pxd-scrollable--content relative scrollbar-none h-full max-h-inherit max-w-full flex-1 shrink-0 overflow-scroll intrinsic-size-auto"
263
293
  @scroll.passive="onContainerScroll"
264
294
  >
265
295
  <slot />
@@ -275,7 +305,7 @@ defineExpose({
275
305
 
276
306
  <template v-if="scrollbar">
277
307
  <div
278
- v-if="scrollInfo.isScrollableX"
308
+ v-if="isScrollableX"
279
309
  aria-hidden="true"
280
310
  class="pxd-scrollable--scrollbar-x left-0 right-0 bottom-0 absolute touch-none opacity-(--o) delay-1000 select-none group-hover/scrollable:delay-0 active:opacity-100 motion-safe:transition-opacity"
281
311
  >
@@ -287,7 +317,7 @@ defineExpose({
287
317
  </div>
288
318
 
289
319
  <div
290
- v-if="scrollInfo.isScrollableY"
320
+ v-if="isScrollableY"
291
321
  aria-hidden="true"
292
322
  class="pxd-scrollable--scrollbar-y top-0 right-0 bottom-0 absolute touch-none opacity-(--o) delay-1000 select-none group-hover/scrollable:delay-0 active:opacity-100 motion-safe:transition-opacity"
293
323
  >
@@ -301,21 +331,6 @@ defineExpose({
301
331
  </div>
302
332
  </template>
303
333
 
304
- <style lang="postcss">
305
- .pxd-scrollable--scrollbar-x {
306
- height: calc(var(--scrollbar-size, 6) * 1px);
307
- }
308
-
309
- .pxd-scrollable--scrollbar-y {
310
- width: calc(var(--scrollbar-size, 6) * 1px);
311
- }
312
-
313
- .pxd-scrollable--thumb {
314
- background-color: var(--scrollbar-color, var(--color-gray-alpha-300));
315
-
316
- &:hover,
317
- &:active {
318
- background-color: var(--scrollbar-hover-color, var(--color-gray-alpha-500));
319
- }
320
- }
334
+ <style>
335
+ .pxd-scrollable--scrollbar-x{height:calc(var(--scrollbar-size, 6)*1px)}.pxd-scrollable--scrollbar-y{width:calc(var(--scrollbar-size, 6)*1px)}.pxd-scrollable--thumb{background-color:var(--scrollbar-color,var(--color-gray-alpha-300))}.pxd-scrollable--thumb:active,.pxd-scrollable--thumb:hover{background-color:var(--scrollbar-hover-color,var(--color-gray-alpha-500))}
321
336
  </style>
@@ -1,24 +1,38 @@
1
1
  import type { CSSProperties } from 'vue'
2
2
 
3
- import type { ComponentClass, ComponentDirection } from '../../types/shared'
3
+ import type { ComponentClass, ComponentDirection, Nullable } from '../../types/shared'
4
4
 
5
5
  export interface ScrollableProps {
6
6
  fader?: boolean
7
+ loading?: boolean
8
+ scrollbar?: boolean
7
9
  faderSize?: number
8
10
  faderColor?: string
9
11
  faderDirection?: ComponentDirection | 'both'
10
- scrollbar?: boolean
11
12
  wrapperClass?: ComponentClass
12
13
  contentClass?: ComponentClass
13
14
  contentStyle?: CSSProperties | string
14
15
  scrollbarSize?: number
15
16
  scrollbarColor?: string
16
17
  scrollbarHoverColor?: string
17
- loading?: boolean
18
- endThreshold?: number
18
+ bottomThreshold?: number
19
19
  }
20
20
 
21
21
  export interface ScrollableEmits {
22
22
  scroll: [Event]
23
- end: [Event, ComponentDirection]
23
+ bottom: [ComponentDirection, Event]
24
+ }
25
+
26
+ export interface ScrollableDragState {
27
+ isDragging: boolean
28
+ direction: Nullable<ComponentDirection>
29
+ startClientPos: number
30
+ startThumbPos: number
31
+ }
32
+
33
+ export interface ScrollableCachedPadding {
34
+ top: number
35
+ bottom: number
36
+ left: number
37
+ right: number
24
38
  }
@@ -1,7 +1,7 @@
1
1
  <script setup>
2
2
  import { computed } from "vue";
3
3
  import { getCssUnitValue, increaseWithUnit } from "../../utils/format";
4
- import { skeletonVariant } from "./cn";
4
+ import { tv } from "tailwind-variants";
5
5
  defineOptions({
6
6
  name: "PSkeleton",
7
7
  inheritAttrs: false
@@ -14,6 +14,29 @@ const props = defineProps({
14
14
  boxHeight: { type: [String, Number], required: false },
15
15
  shape: { type: String, required: false, default: "default" }
16
16
  });
17
+ const skeletonVariant = tv({
18
+ base: "pxd-skeleton relative block shrink-0 overflow-hidden",
19
+ variants: {
20
+ loading: {
21
+ true: "loading invisible content-visibility-auto intrinsic-size-auto",
22
+ false: ""
23
+ },
24
+ shape: {
25
+ default: "rounded-md",
26
+ square: "rounded-none",
27
+ rounded: "rounded-full"
28
+ },
29
+ animated: {
30
+ true: "animated after:default-animation-timing-function!",
31
+ false: ""
32
+ }
33
+ },
34
+ defaultVariants: {
35
+ loading: true,
36
+ shape: "default",
37
+ animated: true
38
+ }
39
+ });
17
40
  const computedStyle = computed(() => {
18
41
  const { width, height, boxHeight } = props;
19
42
  const styles = {
@@ -1,14 +1,14 @@
1
1
  import type { SliderProps } from './types';
2
2
  declare const __VLS_export: import("vue").DefineComponent<SliderProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
3
- change: (args_0: NonNullable<number | [number, number] | null | undefined>) => any;
4
- "update:modelValue": (args_0: NonNullable<number | [number, number] | null | undefined>) => any;
3
+ change: (args_0: NonNullable<number | number[] | null | undefined>) => any;
4
+ "update:modelValue": (args_0: NonNullable<number | number[] | null | undefined>) => any;
5
5
  }, string, import("vue").PublicProps, Readonly<SliderProps> & Readonly<{
6
- onChange?: ((args_0: NonNullable<number | [number, number] | null | undefined>) => any) | undefined;
7
- "onUpdate:modelValue"?: ((args_0: NonNullable<number | [number, number] | null | undefined>) => any) | undefined;
6
+ onChange?: ((args_0: NonNullable<number | number[] | null | undefined>) => any) | undefined;
7
+ "onUpdate:modelValue"?: ((args_0: NonNullable<number | number[] | null | undefined>) => any) | undefined;
8
8
  }>, {
9
- variant: import("../../types/shared").ComponentVariant | "secondary";
10
9
  max: number;
11
- modelValue: number | [number, number] | null;
10
+ variant: import("../../types/shared").ComponentVariant | "secondary";
11
+ modelValue: number | number[] | null;
12
12
  min: number;
13
13
  step: number;
14
14
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;