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,6 +1,6 @@
1
1
  <script setup>
2
- import { computed, nextTick, shallowRef } from "vue";
3
- import { useConfigProvider } from "../../composables/use-config-provider-context";
2
+ import { nextTick, shallowRef } from "vue";
3
+ import { useConfigProvider } from "../../contexts/config-provider";
4
4
  import { useDeferredValue } from "../../composables/use-deferred-value";
5
5
  import { PRESET_MEDIA_QUERIES, useMediaQuery } from "../../composables/use-media-query";
6
6
  import { useModelValue } from "../../composables/use-model-value";
@@ -30,7 +30,6 @@ const uniqueId = getUniqueId();
30
30
  const configProvider = useConfigProvider();
31
31
  const modelValue = useModelValue(props, emits);
32
32
  const isDesktop = useMediaQuery(PRESET_MEDIA_QUERIES.SM_UP);
33
- const modalInitialFocus = computed(() => isDesktop.value ? `#${uniqueId}` : false);
34
33
  const listRef = shallowRef();
35
34
  const isEmptyResult = shallowRef(false);
36
35
  const { value: filterKeyword, deferred: deferredFilterKeyword } = useDeferredValue("", {
@@ -40,7 +39,7 @@ const { value: filterKeyword, deferred: deferredFilterKeyword } = useDeferredVal
40
39
  }
41
40
  await nextTick();
42
41
  listRef.value.updateListItem();
43
- listRef.value.setActiveValueToFirst();
42
+ listRef.value.setFirstAsActive();
44
43
  isEmptyResult.value = listRef.value.isNoVisibleItem();
45
44
  }
46
45
  });
@@ -70,9 +69,10 @@ provideListFilterValue(deferredFilterKeyword);
70
69
  class="pxd-command-menu max-sm:dvh-80"
71
70
  content-class="!p-0 overflow-hidden"
72
71
  wrapper-class="sm:top-1/8 sm:translate-y-0"
73
- :initial-focus="modalInitialFocus"
72
+ :auto-focus-element="isDesktop"
74
73
  :close-on-press-escape="closeOnPressEscape"
75
74
  :close-on-click-overlay="closeOnClickOverlay"
75
+ v-bind="$attrs"
76
76
  @show="showModal"
77
77
  @hide="hideModal"
78
78
  >
@@ -113,8 +113,7 @@ provideListFilterValue(deferredFilterKeyword);
113
113
  ref="listRef"
114
114
  :loop="false"
115
115
  class="sm:max-h-110 h-full"
116
- :item-transition="false"
117
- :key-listener="modelValue"
116
+ :toggle-on-key-press="modelValue"
118
117
  @select="onListItemSelect"
119
118
  >
120
119
  <slot />
@@ -1,4 +1,3 @@
1
- import type { ComponentLabel } from '../../types/shared'
2
1
  import type { ListOptionSelected } from '../list/types'
3
2
 
4
3
  export interface CommandMenuProps {
@@ -17,7 +16,3 @@ export interface CommandMenuEmits {
17
16
  show: []
18
17
  hide: []
19
18
  }
20
-
21
- export interface CommandMenuGroupProps {
22
- label?: ComponentLabel
23
- }
@@ -1,4 +1,4 @@
1
- import type { CommandMenuGroupProps } from '../command-menu/types';
1
+ import type { CommandMenuGroupProps } from './types';
2
2
  declare var __VLS_1: {};
3
3
  type __VLS_Slots = {} & {
4
4
  default?: (props: typeof __VLS_1) => any;
@@ -1,6 +1,7 @@
1
1
  <script setup>
2
2
  defineOptions({
3
- name: "PCommandMenuGroup"
3
+ name: "PCommandMenuGroup",
4
+ inheritAttrs: false
4
5
  });
5
6
  defineProps({
6
7
  label: { type: [String, Number, Array, null], required: false }
@@ -8,7 +9,7 @@ defineProps({
8
9
  </script>
9
10
 
10
11
  <template>
11
- <div class="pxd-command-menu-group" role="presentation">
12
+ <div class="pxd-command-menu-group" role="presentation" v-bind="$attrs">
12
13
  <div
13
14
  aria-hidden="true"
14
15
  class="h-10 px-2 flex items-center text-13px text-foreground-secondary only:hidden empty:hidden"
@@ -0,0 +1,5 @@
1
+ import type { ComponentLabel } from '../../types/shared'
2
+
3
+ export interface CommandMenuGroupProps {
4
+ label?: ComponentLabel
5
+ }
@@ -3,9 +3,9 @@ import type { ComponentAs } from '../../types/shared';
3
3
  interface Props extends ConfigProviderProps {
4
4
  as?: ComponentAs;
5
5
  }
6
- declare var __VLS_8: {};
6
+ declare var __VLS_10: {};
7
7
  type __VLS_Slots = {} & {
8
- default?: (props: typeof __VLS_8) => any;
8
+ default?: (props: typeof __VLS_10) => any;
9
9
  };
10
10
  declare const __VLS_base: import("vue").DefineComponent<Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<Props> & Readonly<{}>, {
11
11
  size: import("../../types/shared").ComponentSize;
@@ -1,11 +1,13 @@
1
1
  <script setup>
2
- import { provideConfigProvider } from "../../composables/use-config-provider-context";
2
+ import { provideConfigProvider } from "../../contexts/config-provider";
3
3
  import enUS from "../../locales/en-us";
4
+ import { NOOP } from "../../utils/event";
4
5
  defineOptions({
5
- name: "PConfigProvider"
6
+ name: "PConfigProvider",
7
+ inheritAttrs: false
6
8
  });
7
9
  const props = defineProps({
8
- as: { type: null, required: false, default: "div" },
10
+ as: { type: [String, Object], required: false, default: "div" },
9
11
  size: { type: String, required: false, default: "md" },
10
12
  locale: { type: Object, required: false, default: () => enUS },
11
13
  popoverShowTransition: { type: Boolean, required: false, default: true }
@@ -14,7 +16,7 @@ provideConfigProvider(props);
14
16
  </script>
15
17
 
16
18
  <template>
17
- <Component :is="as" class="pxd-config-provider h-inherit">
19
+ <Component :is="as" class="pxd-config-provider h-inherit" @touchstart="NOOP" v-bind="$attrs">
18
20
  <slot />
19
21
  </Component>
20
22
  </template>
@@ -3,7 +3,8 @@ import { computed, onBeforeUnmount } from "vue";
3
3
  import { useCountdown } from "../../composables/use-countdown";
4
4
  import { dayjs, dayjsDurationPlugin, dayjsMillisecondTokenPlugin } from "../../utils/date";
5
5
  defineOptions({
6
- name: "PCountDown"
6
+ name: "PCountDown",
7
+ inheritAttrs: false
7
8
  });
8
9
  const props = defineProps({
9
10
  format: { type: String, required: false, default: "HH:mm:ss" },
@@ -45,7 +46,7 @@ defineExpose({
45
46
  </script>
46
47
 
47
48
  <template>
48
- <div class="pxd-countdown relative w-max max-w-full leading-none tabular-nums">
49
+ <div class="pxd-countdown relative w-max max-w-full leading-none tabular-nums" v-bind="$attrs">
49
50
  <slot :active="active" :times="times">
50
51
  {{ displayTimes }}
51
52
  </slot>
@@ -1,6 +1,6 @@
1
- import type { UseCountdownOptions } from '../../composables/use-countdown'
1
+ import type { CountdownOptions } from '../../composables/use-countdown'
2
2
 
3
- export interface CountdownProps extends UseCountdownOptions {
3
+ export interface CountdownProps extends CountdownOptions {
4
4
  format?: string
5
5
  }
6
6
 
@@ -2,7 +2,8 @@
2
2
  import { computed } from "vue";
3
3
  import { getCssUnitValue } from "../../utils/format";
4
4
  defineOptions({
5
- name: "PDashLine"
5
+ name: "PDashLine",
6
+ inheritAttrs: false
6
7
  });
7
8
  const props = defineProps({
8
9
  position: { type: [String, Array], required: false, default: () => ["top"] },
@@ -22,6 +23,7 @@ const computedStyle = computed(() => ({
22
23
  <template>
23
24
  <div
24
25
  class="pxd-dash-line relative max-w-full min-w-full"
26
+ v-bind="$attrs"
25
27
  :data-position="position"
26
28
  :style="computedStyle"
27
29
  />
@@ -3,7 +3,7 @@ declare var __VLS_1: {}, __VLS_14: {};
3
3
  type __VLS_Slots = {} & {
4
4
  title?: (props: typeof __VLS_1) => any;
5
5
  } & {
6
- content?: (props: typeof __VLS_14) => any;
6
+ description?: (props: typeof __VLS_14) => any;
7
7
  };
8
8
  declare const __VLS_base: import("vue").DefineComponent<DescriptionProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<DescriptionProps> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
9
9
  declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
@@ -2,17 +2,18 @@
2
2
  import InformationIcon from "@gdsicon/vue/information-fill-small";
3
3
  import PTooltip from "../tooltip/index.vue";
4
4
  defineOptions({
5
- name: "PDescription"
5
+ name: "PDescription",
6
+ inheritAttrs: false
6
7
  });
7
8
  defineProps({
8
9
  title: { type: String, required: false },
9
- content: { type: String, required: false },
10
- tooltip: { type: String, required: false }
10
+ tooltip: { type: String, required: false },
11
+ description: { type: String, required: false }
11
12
  });
12
13
  </script>
13
14
 
14
15
  <template>
15
- <dl class="pxd-description">
16
+ <dl class="pxd-description" v-bind="$attrs">
16
17
  <dt
17
18
  class="pxd-description--title gap-1 text-sm mb-2 min-h-3.5 flex items-center leading-none text-nowrap text-foreground-secondary capitalize"
18
19
  >
@@ -24,9 +25,9 @@ defineProps({
24
25
  <InformationIcon class="text-base scale-125" />
25
26
  </PTooltip>
26
27
  </dt>
27
- <dd class="pxd-description--content text-sm font-medium leading-4 text-foreground">
28
- <slot name="content">
29
- {{ content }}
28
+ <dd class="pxd-description--description text-sm font-medium leading-4 text-foreground">
29
+ <slot name="description">
30
+ {{ description }}
30
31
  </slot>
31
32
  </dd>
32
33
  </dl>
@@ -1,5 +1,5 @@
1
1
  export interface DescriptionProps {
2
2
  title?: string
3
- content?: string
4
3
  tooltip?: string
4
+ description?: string
5
5
  }
@@ -28,10 +28,11 @@ declare const __VLS_base: import("vue").DefineComponent<DrawerProps, {}, {}, {},
28
28
  }>, {
29
29
  modelValue: boolean;
30
30
  closeOnPressEscape: boolean;
31
+ autoFocusElement: string | boolean;
31
32
  appendToBody: boolean;
32
33
  closeOnClickOverlay: boolean;
33
- headerStylize: boolean;
34
- footerStylize: boolean;
34
+ defaultHeaderStyle: boolean;
35
+ defaultFooterStyle: boolean;
35
36
  position: import("../../types/shared").BasePosition;
36
37
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
37
38
  declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
@@ -20,22 +20,17 @@ const props = defineProps({
20
20
  position: { type: String, required: false, default: "right" },
21
21
  modelValue: { type: Boolean, required: false, default: false },
22
22
  appendToBody: { type: Boolean, required: false, default: true },
23
- headerStylize: { type: Boolean, required: false, default: false },
24
- footerStylize: { type: Boolean, required: false, default: true },
25
23
  wrapperClass: { type: [String, Array, Object], required: false },
26
24
  contentClass: { type: [String, Array, Object], required: false },
25
+ autoFocusElement: { type: [String, Boolean], required: false, default: false },
26
+ defaultHeaderStyle: { type: Boolean, required: false, default: false },
27
+ defaultFooterStyle: { type: Boolean, required: false, default: true },
27
28
  closeOnPressEscape: { type: Boolean, required: false, default: true },
28
- closeOnClickOverlay: { type: Boolean, required: false, default: true },
29
- initialFocus: { type: [String, Boolean], required: false }
29
+ closeOnClickOverlay: { type: Boolean, required: false, default: true }
30
30
  });
31
31
  const emits = defineEmits(["show", "hide", "change", "outside-click", "visible-change", "update:modelValue"]);
32
32
  const drawerRef = shallowRef();
33
33
  const isVisible = useModelValue(props, emits);
34
- useFocusTrap(drawerRef, {
35
- initialFocus: props.initialFocus,
36
- escapeDeactivates: props.closeOnPressEscape,
37
- clickOutsideDeactivates: props.closeOnClickOverlay
38
- });
39
34
  const ensurePosition = computed(() => {
40
35
  const { position } = props;
41
36
  if (["top", "bottom", "left", "right"].includes(position)) {
@@ -43,6 +38,10 @@ const ensurePosition = computed(() => {
43
38
  }
44
39
  return "right";
45
40
  });
41
+ const defaultStyles = computed(() => ({
42
+ headerClass: props.defaultHeaderStyle ? "pb-4 sm:pb-6 border-b bg-background-200 dark:bg-background-100" : "",
43
+ footerClass: props.defaultFooterStyle ? "border-t pt-4 bg-background-200 dark:bg-background-100" : ""
44
+ }));
46
45
  const transitionName = computed(() => `pxd-transition--drawer-${ensurePosition.value}`);
47
46
  const computedStyle = computed(() => {
48
47
  const styles = {};
@@ -51,6 +50,12 @@ const computedStyle = computed(() => {
51
50
  }
52
51
  return styles;
53
52
  });
53
+ const focusTrapOptions = computed(() => ({
54
+ autoFocusElement: props.autoFocusElement,
55
+ escapeDeactivates: props.closeOnPressEscape,
56
+ clickOutsideDeactivates: props.closeOnClickOverlay
57
+ }));
58
+ useFocusTrap(drawerRef, focusTrapOptions);
54
59
  function closeOverlayIfNeed() {
55
60
  if (isTruthyProp(props.loading)) {
56
61
  return;
@@ -89,19 +94,19 @@ watch(
89
94
  <div
90
95
  v-if="isVisible"
91
96
  ref="drawerRef"
92
- aria-modal="true"
93
97
  role="dialog"
94
98
  tabindex="-1"
99
+ aria-modal="true"
100
+ :aria-expanded="isVisible"
95
101
  class="pxd-drawer group/drawer translate-z-0 sm:[--drawer-width:30vw] sm:[--drawer-height:30vw] pointer-events-auto fixed z-10 flex max-h-full max-w-full flex-col bg-background-100 shadow-border-modal outline-none"
96
102
  :class="wrapperClass"
97
103
  :style="computedStyle"
98
104
  :data-position="ensurePosition"
105
+ v-bind="$attrs"
99
106
  >
100
107
  <header
101
108
  class="pxd-drawer--header px-6 pt-4 sm:pt-6 empty:py-3 relative shrink-0"
102
- :class="{
103
- 'pb-4 sm:pb-6 border-b bg-background-200 dark:bg-background-100': headerStylize
104
- }"
109
+ :class="defaultStyles.headerClass"
105
110
  >
106
111
  <slot name="header">
107
112
  <h3
@@ -130,8 +135,8 @@ watch(
130
135
 
131
136
  <footer
132
137
  v-if="$slots.footer"
133
- class="pxd-drawer--footer p-4 gap-2 relative flex shrink-0 items-center justify-between"
134
- :class="{ 'border-t bg-background-200 dark:bg-background-100': footerStylize }"
138
+ class="pxd-drawer--footer px-4 pb-4 gap-2 relative flex shrink-0 items-center justify-between"
139
+ :class="defaultStyles.footerClass"
135
140
  >
136
141
  <slot name="footer" />
137
142
  </footer>
@@ -8,13 +8,13 @@ export interface DrawerProps {
8
8
  position?: BasePosition
9
9
  modelValue?: boolean
10
10
  appendToBody?: boolean
11
- headerStylize?: boolean
12
- footerStylize?: boolean
13
11
  wrapperClass?: ComponentClass
14
12
  contentClass?: ComponentClass
13
+ autoFocusElement?: string | boolean
14
+ defaultHeaderStyle?: boolean
15
+ defaultFooterStyle?: boolean
15
16
  closeOnPressEscape?: boolean
16
17
  closeOnClickOverlay?: boolean
17
- initialFocus?: string | false
18
18
  }
19
19
 
20
20
  export interface DrawerEmits {
@@ -0,0 +1,14 @@
1
+ import type { EllipsisTextProps } from './types';
2
+ declare const __VLS_export: import("vue").DefineComponent<EllipsisTextProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
3
+ toggle: (expanded: boolean) => any;
4
+ }, string, import("vue").PublicProps, Readonly<EllipsisTextProps> & Readonly<{
5
+ onToggle?: ((expanded: boolean) => any) | undefined;
6
+ }>, {
7
+ position: "start" | "middle" | "end";
8
+ dots: string;
9
+ rows: number;
10
+ moreText: string;
11
+ lessText: string;
12
+ }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
13
+ declare const _default: typeof __VLS_export;
14
+ export default _default;
@@ -0,0 +1,242 @@
1
+ <script setup>
2
+ import { shallowRef, computed, nextTick, watch } from "vue";
3
+ import { useResizeObserver } from "../../composables/use-browser-observer";
4
+ import { isServer } from "../../utils/is";
5
+ import { getStyle } from "../../utils/dom";
6
+ import { twMerge } from "tailwind-merge";
7
+ defineOptions({
8
+ name: "PEllipsisText",
9
+ inheritAttrs: false
10
+ });
11
+ const props = defineProps({
12
+ text: { type: String, required: true },
13
+ dots: { type: String, required: false, default: "..." },
14
+ rows: { type: Number, required: false, default: 1 },
15
+ action: { type: Boolean, required: false },
16
+ position: { type: String, required: false, default: "end" },
17
+ moreText: { type: String, required: false, default: "Expand" },
18
+ lessText: { type: String, required: false, default: "Collapse" },
19
+ actionClass: { type: String, required: false }
20
+ });
21
+ const emits = defineEmits(["toggle"]);
22
+ const isExpanded = shallowRef(false);
23
+ const isTruncated = shallowRef(false);
24
+ const ellipsisText = shallowRef(props.text);
25
+ const containerRef = shallowRef();
26
+ const textRef = shallowRef();
27
+ const actionRef = shallowRef();
28
+ const maxRows = computed(() => {
29
+ const rows = Number(props.rows ?? 1);
30
+ return Number.isFinite(rows) && rows > 0 ? Math.floor(rows) : 1;
31
+ });
32
+ const computedActionClass = computed(() => {
33
+ return twMerge(
34
+ "pxd-ellipsis-text--action cursor-pointer whitespace-nowrap text-blue-900",
35
+ props.actionClass
36
+ );
37
+ });
38
+ const displayText = computed(() => {
39
+ if (isExpanded.value) {
40
+ return {
41
+ content: props.text,
42
+ action: props.lessText
43
+ };
44
+ }
45
+ return {
46
+ content: ellipsisText.value,
47
+ action: props.moreText
48
+ };
49
+ });
50
+ function toggleAction() {
51
+ if (!props.action) {
52
+ return;
53
+ }
54
+ isExpanded.value = !isExpanded.value;
55
+ emits("toggle", isExpanded.value);
56
+ updateEllipsis();
57
+ }
58
+ const TEXT_STYLE_KEYS = [
59
+ "fontFamily",
60
+ "fontSize",
61
+ "fontWeight",
62
+ "fontStyle",
63
+ "fontVariant",
64
+ "letterSpacing",
65
+ "lineHeight",
66
+ "textTransform",
67
+ "textRendering",
68
+ "wordSpacing"
69
+ ];
70
+ function parseSize(value) {
71
+ const parsed = Number.parseFloat(value);
72
+ return Number.isFinite(parsed) ? parsed : 0;
73
+ }
74
+ function getLineHeightPx(style) {
75
+ const lineHeight = style.lineHeight;
76
+ const fontSize = parseSize(style.fontSize);
77
+ if (!lineHeight || lineHeight === "normal") {
78
+ return fontSize > 0 ? fontSize * 1.2 : 19.2;
79
+ }
80
+ const parsed = parseSize(lineHeight);
81
+ if (parsed <= 0) {
82
+ return fontSize > 0 ? fontSize * 1.2 : 19.2;
83
+ }
84
+ return parsed;
85
+ }
86
+ function applyTextStyles(style, target) {
87
+ TEXT_STYLE_KEYS.forEach((key) => {
88
+ target.style.setProperty(
89
+ key.replace(/[A-Z]/g, (m) => `-${m.toLowerCase()}`),
90
+ style[key]
91
+ );
92
+ });
93
+ target.style.display = "inline";
94
+ target.style.whiteSpace = "pre-wrap";
95
+ target.style.wordBreak = "break-word";
96
+ }
97
+ function buildCandidate(chars, keep, dots, position) {
98
+ if (keep <= 0) {
99
+ return dots;
100
+ }
101
+ if (position === "start") {
102
+ return `${dots}${chars.slice(chars.length - keep).join("")}`;
103
+ }
104
+ if (position === "middle") {
105
+ const headLen = Math.ceil(keep / 2);
106
+ const tailLen = keep - headLen;
107
+ const head = chars.slice(0, headLen).join("");
108
+ const tail = chars.slice(chars.length - tailLen).join("");
109
+ return `${head}${dots}${tail}`;
110
+ }
111
+ return `${chars.slice(0, keep).join("")}${dots}`;
112
+ }
113
+ function createMeasureElements(parent) {
114
+ const mc = document.createElement("span");
115
+ const mt = document.createElement("span");
116
+ const ma = document.createElement("span");
117
+ mc.append(mt, ma);
118
+ mc.style.position = "absolute";
119
+ mc.style.visibility = "hidden";
120
+ mc.style.pointerEvents = "none";
121
+ mc.style.zIndex = "-1";
122
+ mc.style.left = "0";
123
+ mc.style.top = "0";
124
+ mc.style.overflow = "visible";
125
+ mc.style.whiteSpace = "pre-wrap";
126
+ mc.style.wordBreak = "break-word";
127
+ mc.style.display = "block";
128
+ mc.style.boxSizing = "border-box";
129
+ parent.appendChild(mc);
130
+ return { container: mc, text: mt, action: ma };
131
+ }
132
+ function syncMeasureStyles(elements, container, textEl, actionEl) {
133
+ const containerStyle = getStyle(container);
134
+ const paddingLeft = parseSize(containerStyle.paddingLeft);
135
+ const paddingRight = parseSize(containerStyle.paddingRight);
136
+ const availableWidth = Math.max(0, container.clientWidth - paddingLeft - paddingRight);
137
+ elements.container.style.width = `${availableWidth}px`;
138
+ const textStyle = getStyle(textEl ?? container);
139
+ applyTextStyles(textStyle, elements.text);
140
+ const actionStyle = actionEl ? getStyle(actionEl) : textStyle;
141
+ applyTextStyles(actionStyle, elements.action);
142
+ }
143
+ function fits(elements, text, actionText, maxHeight) {
144
+ elements.text.textContent = text;
145
+ if (actionText) {
146
+ elements.action.textContent = actionText;
147
+ elements.action.style.display = "inline";
148
+ } else {
149
+ elements.action.textContent = "";
150
+ elements.action.style.display = "none";
151
+ }
152
+ const height = elements.container.getBoundingClientRect().height;
153
+ return height <= maxHeight + 0.5;
154
+ }
155
+ async function updateEllipsis() {
156
+ if (isServer()) {
157
+ return;
158
+ }
159
+ const container = containerRef.value;
160
+ if (!container || !container.isConnected) {
161
+ return;
162
+ }
163
+ await nextTick();
164
+ const sourceText = props.text ?? "";
165
+ if (container.clientWidth <= 0) {
166
+ ellipsisText.value = sourceText;
167
+ isTruncated.value = false;
168
+ return;
169
+ }
170
+ if (isExpanded.value || !sourceText) {
171
+ ellipsisText.value = sourceText;
172
+ return;
173
+ }
174
+ const style = getStyle(textRef.value ?? container);
175
+ const lineHeight = getLineHeightPx(style);
176
+ const maxHeight = lineHeight * maxRows.value;
177
+ if (maxHeight <= 0) {
178
+ ellipsisText.value = sourceText;
179
+ isTruncated.value = false;
180
+ return;
181
+ }
182
+ const elements = createMeasureElements(container);
183
+ try {
184
+ syncMeasureStyles(elements, container, textRef.value, actionRef.value);
185
+ if (fits(elements, sourceText, "", maxHeight)) {
186
+ ellipsisText.value = sourceText;
187
+ isTruncated.value = false;
188
+ return;
189
+ }
190
+ isTruncated.value = true;
191
+ const actionText = props.action ? props.moreText : "";
192
+ const chars = [...sourceText];
193
+ const dots = props.dots ?? "";
194
+ let low = 0;
195
+ let high = chars.length;
196
+ let best = "";
197
+ while (low <= high) {
198
+ const mid = Math.floor((low + high) / 2);
199
+ const candidate = buildCandidate(chars, mid, dots, props.position);
200
+ if (fits(elements, candidate, actionText, maxHeight)) {
201
+ best = candidate;
202
+ low = mid + 1;
203
+ } else {
204
+ high = mid - 1;
205
+ }
206
+ }
207
+ ellipsisText.value = best || dots;
208
+ } finally {
209
+ elements.container.remove();
210
+ }
211
+ }
212
+ watch(
213
+ () => props,
214
+ () => {
215
+ if (!props.action && isExpanded.value) {
216
+ isExpanded.value = false;
217
+ }
218
+ updateEllipsis();
219
+ },
220
+ {
221
+ immediate: true,
222
+ flush: "post",
223
+ deep: true
224
+ }
225
+ );
226
+ useResizeObserver(containerRef, updateEllipsis);
227
+ </script>
228
+
229
+ <template>
230
+ <div class="pxd-ellipsis-text" ref="containerRef" v-bind="$attrs">
231
+ <span ref="textRef" class="pxd-ellipsis-text--text">{{ displayText.content }}</span>
232
+
233
+ <span
234
+ v-if="action && (isTruncated || isExpanded)"
235
+ ref="actionRef"
236
+ :class="computedActionClass"
237
+ @click="toggleAction"
238
+ >
239
+ {{ displayText.action }}
240
+ </span>
241
+ </div>
242
+ </template>
@@ -0,0 +1,14 @@
1
+ export interface EllipsisTextProps {
2
+ text: string
3
+ dots?: string
4
+ rows?: number
5
+ action?: boolean
6
+ position?: 'start' | 'middle' | 'end'
7
+ moreText?: string
8
+ lessText?: string
9
+ actionClass?: string
10
+ }
11
+
12
+ export interface EllipsisTextEmits {
13
+ toggle: [expanded: boolean]
14
+ }
@@ -1,6 +1,7 @@
1
1
  <script setup>
2
2
  defineOptions({
3
- name: "PEmptyState"
3
+ name: "PEmptyState",
4
+ inheritAttrs: false
4
5
  });
5
6
  defineProps({
6
7
  title: { type: String, required: false },
@@ -9,7 +10,10 @@ defineProps({
9
10
  </script>
10
11
 
11
12
  <template>
12
- <div class="pxd-empty-state py-12 px-18 w-full rounded-lg border bg-background-100">
13
+ <div
14
+ class="pxd-empty-state py-12 px-18 w-full rounded-lg border bg-background-100"
15
+ v-bind="$attrs"
16
+ >
13
17
  <div class="max-w-sm space-y-6 mx-auto flex flex-col">
14
18
  <template v-if="$slots.icon">
15
19
  <div
@@ -3,9 +3,7 @@ declare var __VLS_6: {};
3
3
  type __VLS_Slots = {} & {
4
4
  default?: (props: typeof __VLS_6) => any;
5
5
  };
6
- declare const __VLS_base: import("vue").DefineComponent<ErrorProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<ErrorProps> & Readonly<{}>, {
7
- size: import("../../types/shared").ComponentSizeWithXs;
8
- }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
6
+ declare const __VLS_base: import("vue").DefineComponent<ErrorProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<ErrorProps> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
9
7
  declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
10
8
  declare const _default: typeof __VLS_export;
11
9
  export default _default;