pxd 0.0.61 → 0.0.63

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 (223) hide show
  1. package/LICENSE +21 -0
  2. package/dist/components/_internal/dismiss-container.d.vue.ts +28 -0
  3. package/dist/components/_internal/dismiss-container.vue +162 -0
  4. package/dist/components/_internal/popover-arrow.d.vue.ts +9 -0
  5. package/dist/components/_internal/popover-arrow.vue +38 -0
  6. package/dist/components/active-graph/index.vue +4 -4
  7. package/dist/components/avatar/index.vue +5 -7
  8. package/dist/components/avatar-group/index.d.vue.ts +0 -1
  9. package/dist/components/avatar-group/index.vue +1 -1
  10. package/dist/components/backtop/index.vue +1 -1
  11. package/dist/components/badge/index.d.vue.ts +5 -1
  12. package/dist/components/badge/index.vue +18 -4
  13. package/dist/components/badge/types.d.ts +5 -0
  14. package/dist/components/book/index.vue +1 -1
  15. package/dist/components/browser/index.vue +1 -1
  16. package/dist/components/bubble/index.d.vue.ts +22 -0
  17. package/dist/components/bubble/index.vue +59 -0
  18. package/dist/components/bubble/types.d.ts +6 -0
  19. package/dist/components/button/index.d.vue.ts +0 -2
  20. package/dist/components/button/index.vue +30 -21
  21. package/dist/components/button/types.d.ts +3 -2
  22. package/dist/components/button-group/index.d.vue.ts +14 -0
  23. package/dist/components/button-group/index.vue +26 -0
  24. package/dist/components/button-group/types.d.ts +9 -0
  25. package/dist/components/carousel/index.d.vue.ts +3 -3
  26. package/dist/components/carousel/index.vue +146 -113
  27. package/dist/components/carousel/types.d.ts +1 -1
  28. package/dist/components/carousel-item/index.vue +22 -17
  29. package/dist/components/checkbox/index.vue +6 -6
  30. package/dist/components/checkbox-group/index.d.vue.ts +1 -1
  31. package/dist/components/chip/index.d.vue.ts +1 -5
  32. package/dist/components/chip/index.vue +4 -4
  33. package/dist/components/color-selector/index.d.vue.ts +12 -0
  34. package/dist/components/color-selector/index.vue +64 -0
  35. package/dist/components/color-selector/types.d.ts +12 -0
  36. package/dist/components/command-menu/index.d.vue.ts +6 -6
  37. package/dist/components/command-menu/index.vue +23 -32
  38. package/dist/components/command-menu/types.d.ts +1 -1
  39. package/dist/components/command-menu-group/index.vue +15 -6
  40. package/dist/components/command-menu-group/types.d.ts +1 -1
  41. package/dist/components/countdown/index.d.vue.ts +11 -11
  42. package/dist/components/drawer/index.d.vue.ts +8 -8
  43. package/dist/components/drawer/index.vue +13 -10
  44. package/dist/components/drawer/types.d.ts +4 -3
  45. package/dist/components/ellipsis-text/index.d.vue.ts +4 -1
  46. package/dist/components/ellipsis-text/index.vue +84 -107
  47. package/dist/components/ellipsis-text/types.d.ts +2 -1
  48. package/dist/components/error/index.vue +1 -1
  49. package/dist/components/fader/index.vue +5 -9
  50. package/dist/components/gauge/index.vue +34 -29
  51. package/dist/components/grid/index.vue +1 -1
  52. package/dist/components/grid-item/index.vue +1 -1
  53. package/dist/components/hold-button/index.d.vue.ts +8 -10
  54. package/dist/components/hold-button/index.vue +20 -29
  55. package/dist/components/hold-button/types.d.ts +5 -6
  56. package/dist/components/index.d.ts +7 -0
  57. package/dist/components/index.js +7 -0
  58. package/dist/components/input/index.d.vue.ts +8 -8
  59. package/dist/components/input/index.vue +5 -4
  60. package/dist/components/intersection-observer/index.vue +4 -4
  61. package/dist/components/kbd/index.vue +1 -1
  62. package/dist/components/link-button/index.d.vue.ts +4 -4
  63. package/dist/components/link-button/index.vue +9 -8
  64. package/dist/components/link-button/types.d.ts +0 -3
  65. package/dist/components/list/index.d.vue.ts +10 -15
  66. package/dist/components/list/index.vue +58 -131
  67. package/dist/components/list/types.d.ts +4 -4
  68. package/dist/components/list-item/index.d.vue.ts +2 -2
  69. package/dist/components/list-item/index.vue +44 -39
  70. package/dist/components/loading-bar/index.vue +8 -7
  71. package/dist/components/material/index.vue +24 -46
  72. package/dist/components/menu/index.d.vue.ts +6 -8
  73. package/dist/components/menu/index.vue +18 -24
  74. package/dist/components/menu/types.d.ts +1 -2
  75. package/dist/components/message/composables/use-group-expand.d.ts +13 -0
  76. package/dist/components/message/composables/use-group-expand.js +50 -0
  77. package/dist/components/message/composables/use-message-timer.d.ts +9 -0
  78. package/dist/components/message/composables/use-message-timer.js +61 -0
  79. package/dist/components/message/composables/use-promise-message.d.ts +4 -0
  80. package/dist/components/message/composables/use-promise-message.js +49 -0
  81. package/dist/components/message/index.d.vue.ts +6 -33
  82. package/dist/components/message/index.vue +33 -185
  83. package/dist/components/message/types.d.ts +2 -2
  84. package/dist/components/message-item/index.vue +26 -2
  85. package/dist/components/modal/index.d.vue.ts +7 -7
  86. package/dist/components/modal/index.vue +7 -3
  87. package/dist/components/modal/types.d.ts +7 -3
  88. package/dist/components/note/index.vue +2 -2
  89. package/dist/components/number-input/index.d.vue.ts +5 -4
  90. package/dist/components/number-input/index.vue +3 -0
  91. package/dist/components/number-input/types.d.ts +1 -0
  92. package/dist/components/overlay/index.d.vue.ts +6 -3
  93. package/dist/components/overlay/index.vue +63 -68
  94. package/dist/components/overlay/types.d.ts +5 -4
  95. package/dist/components/pagination/index.vue +2 -2
  96. package/dist/components/pin-input/index.d.vue.ts +1 -1
  97. package/dist/components/pin-input/index.vue +7 -6
  98. package/dist/components/placeholder/index.vue +1 -1
  99. package/dist/components/popover/index.d.vue.ts +7 -8
  100. package/dist/components/popover/index.vue +149 -239
  101. package/dist/components/popover/types.d.ts +5 -5
  102. package/dist/components/progress/index.vue +1 -1
  103. package/dist/components/radio/index.vue +2 -2
  104. package/dist/components/resizable/index.vue +43 -51
  105. package/dist/components/resizable/types.d.ts +1 -1
  106. package/dist/components/resizable-handle/index.d.vue.ts +4 -1
  107. package/dist/components/resizable-handle/index.vue +29 -3
  108. package/dist/components/resizable-panel/index.vue +3 -7
  109. package/dist/components/scalable-text/index.d.vue.ts +9 -0
  110. package/dist/components/scalable-text/index.vue +147 -0
  111. package/dist/components/scalable-text/types.d.ts +12 -0
  112. package/dist/components/scrollable/index.d.vue.ts +2 -2
  113. package/dist/components/scrollable/index.vue +4 -3
  114. package/dist/components/separator/index.d.vue.ts +6 -0
  115. package/dist/components/separator/index.vue +18 -0
  116. package/dist/components/separator/types.d.ts +5 -0
  117. package/dist/components/skeleton/index.d.vue.ts +1 -1
  118. package/dist/components/slider/index.d.vue.ts +1 -1
  119. package/dist/components/slider/index.vue +39 -7
  120. package/dist/components/snippet/index.vue +16 -13
  121. package/dist/components/spinner/index.vue +3 -1
  122. package/dist/components/stack/index.d.vue.ts +1 -1
  123. package/dist/components/stack/index.vue +1 -1
  124. package/dist/components/switch/index.d.vue.ts +1 -1
  125. package/dist/components/switch/index.vue +4 -3
  126. package/dist/components/switch-item/index.vue +1 -1
  127. package/dist/components/tabs/index.d.vue.ts +12 -0
  128. package/dist/components/tabs/index.vue +270 -0
  129. package/dist/components/tabs/types.d.ts +12 -0
  130. package/dist/components/tabs-item/index.d.vue.ts +4 -0
  131. package/dist/components/tabs-item/index.vue +16 -0
  132. package/dist/components/tabs-item/types.d.ts +10 -0
  133. package/dist/components/text/index.vue +1 -1
  134. package/dist/components/textarea/index.d.vue.ts +2 -2
  135. package/dist/components/textarea/index.vue +1 -1
  136. package/dist/components/time-picker/index.d.vue.ts +3 -5
  137. package/dist/components/time-picker/index.vue +53 -45
  138. package/dist/components/time-picker/types.d.ts +1 -2
  139. package/dist/components/toggle/index.d.vue.ts +0 -2
  140. package/dist/components/toggle/index.vue +6 -6
  141. package/dist/components/toggle-button/index.vue +8 -6
  142. package/dist/components/tooltip/index.d.vue.ts +1 -1
  143. package/dist/components/tooltip/index.vue +19 -11
  144. package/dist/components/tooltip/types.d.ts +2 -2
  145. package/dist/components/virtual-list/index.d.vue.ts +8 -8
  146. package/dist/components/virtual-list/index.vue +27 -5
  147. package/dist/components/virtual-list/types.d.ts +3 -0
  148. package/dist/composables/index.d.ts +4 -1
  149. package/dist/composables/index.js +4 -1
  150. package/dist/composables/use-browser-observer.js +2 -2
  151. package/dist/composables/use-client-online.js +2 -2
  152. package/dist/composables/use-color-scheme.js +2 -2
  153. package/dist/composables/use-countdown.js +3 -2
  154. package/dist/composables/use-deferred-value.js +2 -2
  155. package/dist/composables/use-delay-destroy.js +11 -6
  156. package/dist/composables/use-document-hidden.js +2 -2
  157. package/dist/composables/use-focus-trap.js +2 -2
  158. package/dist/composables/use-list-filter.d.ts +11 -0
  159. package/dist/composables/use-list-filter.js +56 -0
  160. package/dist/composables/use-list-navigation.d.ts +27 -0
  161. package/dist/composables/use-list-navigation.js +159 -0
  162. package/dist/composables/use-lock-scroll.js +12 -12
  163. package/dist/composables/use-media-query.js +2 -2
  164. package/dist/composables/use-outside-click.d.ts +1 -1
  165. package/dist/composables/use-outside-click.js +8 -11
  166. package/dist/composables/use-overlay-manager.d.ts +18 -0
  167. package/dist/composables/use-overlay-manager.js +80 -0
  168. package/dist/composables/use-popover-responsive.d.ts +6 -8
  169. package/dist/composables/use-popover-responsive.js +9 -12
  170. package/dist/composables/use-repeat-action.js +2 -2
  171. package/dist/composables/use-swipe-gesture.d.ts +65 -0
  172. package/dist/composables/use-swipe-gesture.js +99 -0
  173. package/dist/composables/use-virtual-list.d.ts +5 -3
  174. package/dist/composables/use-virtual-list.js +25 -14
  175. package/dist/composables/use-window-size.js +2 -2
  176. package/dist/constants/size.d.ts +12 -0
  177. package/dist/constants/size.js +12 -0
  178. package/dist/contexts/button.d.ts +5 -0
  179. package/dist/contexts/button.js +5 -0
  180. package/dist/contexts/carousel.d.ts +2 -1
  181. package/dist/contexts/list.d.ts +23 -3
  182. package/dist/contexts/list.js +6 -2
  183. package/dist/contexts/resizable.d.ts +3 -11
  184. package/dist/contexts/tabs.d.ts +15 -0
  185. package/dist/contexts/tabs.js +2 -0
  186. package/dist/locales/en-us.d.ts +4 -4
  187. package/dist/locales/en-us.js +4 -4
  188. package/dist/locales/zh-cn.d.ts +4 -4
  189. package/dist/locales/zh-cn.js +4 -4
  190. package/dist/plugins/dayjs-millisecond-token.js +1 -1
  191. package/dist/styles/source.css +133 -128
  192. package/dist/styles/styles.css +2 -2
  193. package/dist/styles/tw.css +133 -128
  194. package/dist/types/shared/props.d.ts +1 -0
  195. package/dist/types/shared/utils.d.ts +1 -4
  196. package/dist/utils/date.d.ts +3 -3
  197. package/dist/utils/dom.d.ts +1 -0
  198. package/dist/utils/dom.js +4 -0
  199. package/dist/utils/event.d.ts +2 -1
  200. package/dist/utils/event.js +7 -1
  201. package/dist/utils/format.d.ts +3 -3
  202. package/dist/utils/format.js +5 -4
  203. package/dist/utils/fuzzy-search.d.ts +7 -0
  204. package/dist/utils/fuzzy-search.js +61 -0
  205. package/dist/utils/get.d.ts +2 -0
  206. package/dist/utils/get.js +15 -1
  207. package/dist/utils/index.d.ts +10 -11
  208. package/dist/utils/index.js +2 -3
  209. package/dist/utils/ref.d.ts +2 -2
  210. package/dist/utils/{throttle.d.ts → timing.d.ts} +1 -0
  211. package/dist/utils/{throttle.js → timing.js} +4 -2
  212. package/package.json +40 -37
  213. package/volar.d.ts +7 -0
  214. package/dist/components/overlay/overlay-stack.d.ts +0 -3
  215. package/dist/components/overlay/overlay-stack.js +0 -17
  216. package/dist/composables/use-pointer-gesture.d.ts +0 -180
  217. package/dist/composables/use-pointer-gesture.js +0 -406
  218. package/dist/utils/debounce.d.ts +0 -1
  219. package/dist/utils/debounce.js +0 -1
  220. package/dist/utils/regexp.d.ts +0 -8
  221. package/dist/utils/regexp.js +0 -8
  222. package/dist/utils/responsive.d.ts +0 -3
  223. package/dist/utils/responsive.js +0 -14
@@ -4,6 +4,7 @@ import CopyIcon from "@gdsicon/vue/copy";
4
4
  import { tv } from "tailwind-variants";
5
5
  import { computed } from "vue";
6
6
  import { useCopyClick } from "../../composables/use-copy-click";
7
+ import { BASIC_MIN_HEIGHTS } from "../../constants/size";
7
8
  import { useConfigProvider } from "../../contexts/config-provider";
8
9
  import { getCssUnitValue, isTruthyProp, toArray } from "../../utils/format";
9
10
  defineOptions({
@@ -19,12 +20,12 @@ const props = defineProps({
19
20
  });
20
21
  const emits = defineEmits(["copy"]);
21
22
  const snippetVariant = tv({
22
- base: "pxd-snippet pr-12 relative flex items-center rounded-lg border motion-safe:transition-all",
23
+ base: "pxd-snippet pl-3 pr-1.5 gap-4 relative flex items-center rounded-lg border tabular-nums motion-safe:transition-appearance",
23
24
  variants: {
24
25
  size: {
25
- sm: "min-h-7.5 pl-3.5 pr-1.5 py-2 text-sm",
26
- md: "min-h-9 pl-3.5 pr-2.5 py-2.5 text-sm",
27
- lg: "min-h-10 pl-3.5 pr-3.5 py-3 text-base"
26
+ sm: `${BASIC_MIN_HEIGHTS.sm} py-2 text-sm`,
27
+ md: `${BASIC_MIN_HEIGHTS.md} py-2.5 text-sm`,
28
+ lg: `${BASIC_MIN_HEIGHTS.lg} py-3 text-base`
28
29
  },
29
30
  variant: {
30
31
  default: "border-gray-alpha-300 bg-background-100",
@@ -64,7 +65,7 @@ async function onCopyButtonClick() {
64
65
 
65
66
  <template>
66
67
  <div :class="computedClasses" :style="{ width: getCssUnitValue(props.width) }" v-bind="$attrs">
67
- <div class="pxd-snippet--container">
68
+ <div class="pxd-snippet--container flex-1">
68
69
  <pre
69
70
  v-for="(t, i) of computedTextArray"
70
71
  :key="i"
@@ -75,14 +76,16 @@ async function onCopyButtonClick() {
75
76
  >
76
77
  </div>
77
78
 
78
- <div
79
- class="right-1 p-2 absolute top-1/2 -translate-y-1/2 cursor-pointer rounded-md select-none hover:bg-background-hover active:bg-background-active"
80
- :class="{ copied: isCopied }"
81
- @click="onCopyButtonClick"
82
- >
83
- <Transition name="pxd-transition--fade-scale" mode="out-in">
84
- <Component :is="renderIcon" class="text-sm" />
85
- </Transition>
79
+ <div class="min-w-5 relative shrink-0">
80
+ <button
81
+ class="right-0 p-1.5 absolute top-1/2 -translate-y-1/2 cursor-pointer appearance-none rounded-sm self-focus-ring outline-none select-none hover:bg-background-hover hover:shadow-border-base active:bg-background-active motion-safe:transition-appearance"
82
+ :class="{ copied: isCopied }"
83
+ @click="onCopyButtonClick"
84
+ >
85
+ <Transition name="pxd-transition--fade-scale" mode="out-in">
86
+ <Component :is="renderIcon" class="text-sm pointer-events-none" />
87
+ </Transition>
88
+ </button>
86
89
  </div>
87
90
  </div>
88
91
  </template>
@@ -10,7 +10,9 @@ const OPACITY_STEP = 1 / ITEMS_COUNT;
10
10
 
11
11
  <template>
12
12
  <div
13
- class="pxd-spinner transform-origin-center motion-safe:animate-spin pointer-events-none relative size-em overflow-hidden text-gray-700 content-visibility-auto intrinsic-size-auto"
13
+ aria-hidden="true"
14
+ aria-label="Loading"
15
+ class="pxd-spinner leading-0 transform-origin-center motion-safe:animate-spin pointer-events-none relative inline-block size-em overflow-hidden text-gray-700 content-visibility-auto intrinsic-size-auto"
14
16
  v-bind="$attrs"
15
17
  >
16
18
  <div class="pxd-spinner-container top-0 left-0 absolute size-full">
@@ -4,10 +4,10 @@ type __VLS_Slots = {} & {
4
4
  default?: (props: typeof __VLS_8) => any;
5
5
  };
6
6
  declare const __VLS_base: import("vue").DefineComponent<StackProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<StackProps> & Readonly<{}>, {
7
+ scale: number;
7
8
  as: import("../../types/shared").ComponentAs;
8
9
  align: import("./types").Align;
9
10
  wrap: boolean;
10
- scale: number;
11
11
  justify: import("./types").Align;
12
12
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
13
13
  declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
@@ -1,7 +1,7 @@
1
1
  <script setup>
2
2
  import { tv } from "tailwind-variants";
3
3
  import { computed } from "vue";
4
- import { getResponsiveValue } from "../../utils/responsive";
4
+ import { getResponsiveValue } from "../../utils/get";
5
5
  defineOptions({
6
6
  name: "PStack",
7
7
  inheritAttrs: false
@@ -10,8 +10,8 @@ declare const __VLS_base: import("vue").DefineComponent<SwitchProps, {}, {}, {},
10
10
  onChange?: ((args_0: NonNullable<string | number | undefined>) => any) | undefined;
11
11
  "onUpdate:modelValue"?: ((args_0: NonNullable<string | number | undefined>) => any) | undefined;
12
12
  }>, {
13
- options: import("../../types/shared").ComponentOption[];
14
13
  modelValue: string | number;
14
+ options: import("../../types/shared").ComponentOption[];
15
15
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
16
16
  declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
17
17
  declare const _default: typeof __VLS_export;
@@ -1,6 +1,7 @@
1
1
  <script setup>
2
2
  import { computed } from "vue";
3
3
  import { useModelValue } from "../../composables/use-model-value";
4
+ import { BASIC_HEIGHTS } from "../../constants/size";
4
5
  import { useConfigProvider } from "../../contexts/config-provider";
5
6
  import { provideSwitchContext } from "../../contexts/switch";
6
7
  import { getFallbackValue } from "../../utils/get";
@@ -23,9 +24,9 @@ const props = defineProps({
23
24
  });
24
25
  const emits = defineEmits(["change", "update:modelValue"]);
25
26
  const SIZES = {
26
- sm: "h-7.5",
27
- md: "h-9",
28
- lg: "h-10"
27
+ sm: `${BASIC_HEIGHTS.sm} text-13`,
28
+ md: `${BASIC_HEIGHTS.md} text-sm`,
29
+ lg: `${BASIC_HEIGHTS.lg} text-base`
29
30
  };
30
31
  const configProvider = useConfigProvider();
31
32
  const modelValue = useModelValue(props, emits);
@@ -19,7 +19,7 @@ const props = defineProps({
19
19
  });
20
20
  const emits = defineEmits([]);
21
21
  const switchVariant = tv({
22
- base: "pxd-switch-item--label px-2.5 text-sm font-medium flex size-full items-center justify-center truncate rounded-sm text-foreground-secondary peer-focus-ring select-none peer-checked:bg-gray-100 peer-disabled:cursor-not-allowed peer-disabled:text-gray-800 empty:hidden hover:text-foreground motion-safe:transition-all",
22
+ base: "pxd-switch-item--label px-2.5 font-medium flex size-full items-center justify-center truncate rounded-sm text-foreground-secondary peer-focus-ring outline-none select-none peer-checked:bg-gray-100 peer-disabled:cursor-not-allowed peer-disabled:text-gray-800 empty:hidden hover:text-foreground motion-safe:transition-appearance",
23
23
  variants: {
24
24
  disabled: {
25
25
  true: "",
@@ -0,0 +1,12 @@
1
+ import type { TabsProps } from './types';
2
+ declare const __VLS_export: import("vue").DefineComponent<TabsProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
3
+ change: (args_0: import("./types").TabsValue) => any;
4
+ "update:modelValue": (args_0: import("./types").TabsValue) => any;
5
+ }, string, import("vue").PublicProps, Readonly<TabsProps> & Readonly<{
6
+ onChange?: ((args_0: import("./types").TabsValue) => any) | undefined;
7
+ "onUpdate:modelValue"?: ((args_0: import("./types").TabsValue) => any) | undefined;
8
+ }>, {
9
+ variant: "default" | "secondary";
10
+ }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
11
+ declare const _default: typeof __VLS_export;
12
+ export default _default;
@@ -0,0 +1,270 @@
1
+ <script setup>
2
+ import ChevronRightIcon from "@gdsicon/vue/chevron-right";
3
+ import { computed, nextTick, onBeforeUnmount, onMounted, shallowRef, useSlots, watch } from "vue";
4
+ import { useModelValue } from "../../composables/use-model-value";
5
+ import { toArray } from "../../utils/format";
6
+ defineOptions({
7
+ name: "PTabs",
8
+ inheritAttrs: false,
9
+ model: {
10
+ prop: "modelValue",
11
+ event: "update:modelValue"
12
+ }
13
+ });
14
+ const props = defineProps({
15
+ variant: { type: String, required: false, default: "default" },
16
+ keepAlive: { type: Boolean, required: false },
17
+ modelValue: { type: [String, Number], required: false }
18
+ });
19
+ const emits = defineEmits(["change", "update:modelValue"]);
20
+ const slots = useSlots();
21
+ const modelValue = useModelValue(props, emits);
22
+ const scrollRef = shallowRef();
23
+ const innerNavRef = shallowRef();
24
+ const overflowing = shallowRef(false);
25
+ const canScrollLeft = shallowRef(false);
26
+ const canScrollRight = shallowRef(false);
27
+ let resizeObserver = null;
28
+ const renderSlots = computed(() => {
29
+ const renders = slots.default?.();
30
+ return toArray(renders);
31
+ });
32
+ function isActiveTab(value) {
33
+ return modelValue.value === value;
34
+ }
35
+ function updateScrollState() {
36
+ const el = scrollRef.value;
37
+ if (!el) {
38
+ overflowing.value = false;
39
+ canScrollLeft.value = false;
40
+ canScrollRight.value = false;
41
+ return;
42
+ }
43
+ const { scrollLeft, scrollWidth, clientWidth } = el;
44
+ const edge = 2;
45
+ overflowing.value = scrollWidth > clientWidth + edge;
46
+ canScrollLeft.value = scrollLeft > edge;
47
+ canScrollRight.value = scrollLeft + clientWidth < scrollWidth - edge;
48
+ }
49
+ function scrollTabs(direction) {
50
+ const el = scrollRef.value;
51
+ if (!el) {
52
+ return;
53
+ }
54
+ const delta = Math.max(Math.floor(el.clientWidth * 0.65), 96);
55
+ el.scrollBy({
56
+ left: direction === "next" ? delta : -delta,
57
+ behavior: "smooth"
58
+ });
59
+ }
60
+ function scrollActiveTabIntoView() {
61
+ const wrap = scrollRef.value;
62
+ const nav = innerNavRef.value;
63
+ if (!wrap || !nav || !overflowing.value) {
64
+ return;
65
+ }
66
+ const active = nav.querySelector('[role="tab"][aria-selected="true"]');
67
+ if (!active) {
68
+ return;
69
+ }
70
+ const tabLeft = active.offsetLeft;
71
+ const tabRight = tabLeft + active.offsetWidth;
72
+ const viewLeft = wrap.scrollLeft;
73
+ const viewRight = viewLeft + wrap.clientWidth;
74
+ if (tabLeft < viewLeft) {
75
+ wrap.scrollTo({ left: tabLeft, behavior: "smooth" });
76
+ } else if (tabRight > viewRight) {
77
+ wrap.scrollTo({ left: tabRight - wrap.clientWidth, behavior: "smooth" });
78
+ }
79
+ }
80
+ function teardownScrollObservers() {
81
+ resizeObserver?.disconnect();
82
+ resizeObserver = null;
83
+ }
84
+ function setupScrollObservers() {
85
+ teardownScrollObservers();
86
+ const scrollEl = scrollRef.value;
87
+ const navEl = innerNavRef.value;
88
+ if (typeof ResizeObserver === "undefined" || !scrollEl) {
89
+ updateScrollState();
90
+ return;
91
+ }
92
+ resizeObserver = new ResizeObserver(() => {
93
+ updateScrollState();
94
+ });
95
+ resizeObserver.observe(scrollEl);
96
+ if (navEl) {
97
+ resizeObserver.observe(navEl);
98
+ }
99
+ updateScrollState();
100
+ }
101
+ function onTabClick(ev) {
102
+ const target = ev.currentTarget;
103
+ if (target.disabled) {
104
+ return;
105
+ }
106
+ modelValue.value = target.value;
107
+ }
108
+ onMounted(() => {
109
+ nextTick(setupScrollObservers);
110
+ });
111
+ onBeforeUnmount(() => {
112
+ teardownScrollObservers();
113
+ });
114
+ watch(
115
+ renderSlots,
116
+ () => {
117
+ nextTick(() => {
118
+ setupScrollObservers();
119
+ });
120
+ },
121
+ { flush: "post" }
122
+ );
123
+ watch(
124
+ modelValue,
125
+ () => {
126
+ nextTick(() => {
127
+ updateScrollState();
128
+ scrollActiveTabIntoView();
129
+ });
130
+ },
131
+ { flush: "post" }
132
+ );
133
+ </script>
134
+
135
+ <template>
136
+ <div class="pxd-tabs" v-bind="$attrs">
137
+ <div
138
+ class="pxd-tabs--header min-w-0 text-sm relative flex items-stretch"
139
+ :data-variant="variant"
140
+ >
141
+ <button
142
+ v-if="overflowing"
143
+ type="button"
144
+ class="pxd-tabs--arrow px-1.5 inline-flex shrink-0 items-center justify-center self-stretch border-r border-border text-foreground-secondary self-focus-ring outline-none hover:text-foreground enabled:cursor-pointer disabled:pointer-events-none disabled:border-transparent disabled:opacity-35 motion-safe:transition-colors"
145
+ :disabled="!canScrollLeft"
146
+ aria-label="Scroll tabs left"
147
+ @click="scrollTabs('prev')"
148
+ >
149
+ <ChevronRightIcon class="size-4 rotate-180" aria-hidden="true" />
150
+ </button>
151
+
152
+ <div
153
+ ref="scrollRef"
154
+ class="pxd-tabs--scroll min-h-0 min-w-0 scrollbar-none flex-1 overflow-x-auto overscroll-x-contain has-focus-visible:overflow-x-visible"
155
+ @scroll.passive="updateScrollState"
156
+ >
157
+ <div ref="innerNavRef" role="tablist" class="pxd-tabs--nav inline-flex flex-nowrap">
158
+ <template v-for="(slot, index) in renderSlots" :key="slot.props.value ?? index">
159
+ <button
160
+ role="tab"
161
+ :id="`tab-${slot.props.value}`"
162
+ :value="slot.props.value"
163
+ :disabled="slot.props.disabled"
164
+ :tabindex="isActiveTab(slot.props.value) ? 0 : -1"
165
+ :aria-controls="`tab-panel-${slot.props.value}`"
166
+ :aria-selected="isActiveTab(slot.props.value)"
167
+ class="pxd-tabs--nav-item flex cursor-pointer items-center justify-center self-focus-ring outline-none enabled:hover:text-foreground disabled:cursor-not-allowed disabled:text-foreground-secondary motion-safe:transition-colors"
168
+ @click="onTabClick"
169
+ >
170
+ <template v-if="slot.children?.label">
171
+ <Component :is="slot.children.label" />
172
+ </template>
173
+ <template v-else>
174
+ {{ slot.props.label }}
175
+ </template>
176
+ </button>
177
+ </template>
178
+ </div>
179
+ </div>
180
+
181
+ <button
182
+ v-if="overflowing"
183
+ type="button"
184
+ class="pxd-tabs--arrow px-1.5 inline-flex shrink-0 items-center justify-center self-stretch border-l border-border text-foreground-secondary self-focus-ring outline-none hover:text-foreground enabled:cursor-pointer disabled:pointer-events-none disabled:border-transparent disabled:opacity-35 motion-safe:transition-colors"
185
+ :disabled="!canScrollRight"
186
+ aria-label="Scroll tabs right"
187
+ @click="scrollTabs('next')"
188
+ >
189
+ <ChevronRightIcon class="size-4" aria-hidden="true" />
190
+ </button>
191
+ </div>
192
+
193
+ <div role="tabpanel" class="pxd-tabs--content">
194
+ <template v-for="(slot, index) in renderSlots" :key="slot.props.value ?? index">
195
+ <div
196
+ class="pxd-tabs--panel"
197
+ :id="`tab-panel-${slot.props.value}`"
198
+ :aria-labelledby="`tab-${slot.props.value}`"
199
+ >
200
+ <KeepAlive v-if="keepAlive">
201
+ <Component v-if="isActiveTab(slot.props.value)" :is="slot.children?.default" />
202
+ </KeepAlive>
203
+ <Component :is="slot.children?.default" v-else-if="isActiveTab(slot.props.value)" />
204
+ </div>
205
+ </template>
206
+ </div>
207
+ </div>
208
+ </template>
209
+
210
+ <style lang="postcss">
211
+ .pxd-tabs--header {
212
+ &[data-variant='default'] {
213
+ padding-bottom: 1px;
214
+ box-shadow: 0 -1px 0 0 var(--color-border) inset;
215
+
216
+ & + .pxd-tabs--content {
217
+ padding-top: 0.75rem;
218
+ }
219
+
220
+ .pxd-tabs--scroll {
221
+ margin-bottom: -1px;
222
+ }
223
+
224
+ .pxd-tabs--nav {
225
+ gap: 1.5rem;
226
+ }
227
+
228
+ .pxd-tabs--nav-item {
229
+ border-bottom: 2px solid transparent;
230
+ padding: 0.875rem 0.375rem;
231
+
232
+ &:not(:disabled) {
233
+ color: var(--color-gray-900);
234
+ }
235
+
236
+ &[aria-selected='true'] {
237
+ border-color: currentColor;
238
+ color: var(--color-primary);
239
+ }
240
+ }
241
+ }
242
+
243
+ &[data-variant='secondary'] {
244
+ & + .pxd-tabs--content {
245
+ padding-top: 0.5rem;
246
+ }
247
+
248
+ .pxd-tabs--nav {
249
+ gap: 0.5rem;
250
+ }
251
+
252
+ .pxd-tabs--nav-item {
253
+ height: 1.5rem;
254
+ padding: 0 0.375rem;
255
+ border-radius: var(--radius-md);
256
+ font-size: var(--text-13);
257
+ background-color: var(--color-gray-alpha-200);
258
+
259
+ &:disabled {
260
+ background-color: var(--color-gray-100);
261
+ }
262
+
263
+ &[aria-selected='true'] {
264
+ background-color: var(--color-primary);
265
+ color: var(--color-gray-100);
266
+ }
267
+ }
268
+ }
269
+ }
270
+ </style>
@@ -0,0 +1,12 @@
1
+ export type TabsValue = string | number
2
+
3
+ export interface TabsProps {
4
+ variant?: 'default' | 'secondary'
5
+ keepAlive?: boolean
6
+ modelValue?: TabsValue
7
+ }
8
+
9
+ export interface TabsEmits {
10
+ change: [TabsValue]
11
+ 'update:modelValue': [TabsValue]
12
+ }
@@ -0,0 +1,4 @@
1
+ import type { TabsItemProps } from './types';
2
+ declare const __VLS_export: import("vue").DefineComponent<TabsItemProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<TabsItemProps> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
3
+ declare const _default: typeof __VLS_export;
4
+ export default _default;
@@ -0,0 +1,16 @@
1
+ <script setup>
2
+ defineOptions({
3
+ name: "PTabsItem",
4
+ inheritAttrs: false
5
+ });
6
+ const props = defineProps({
7
+ label: { type: [String, Number, Array, null], required: false },
8
+ value: { type: [String, Number], required: true },
9
+ disabled: { type: Boolean, required: false }
10
+ });
11
+ defineEmits([]);
12
+ </script>
13
+
14
+ <template>
15
+
16
+ </template>
@@ -0,0 +1,10 @@
1
+ import type { ComponentLabel } from '../../types/shared'
2
+ import type { TabsValue } from '../tabs/types'
3
+
4
+ export interface TabsItemProps {
5
+ label?: ComponentLabel
6
+ value: TabsValue
7
+ disabled?: boolean
8
+ }
9
+
10
+ export interface TabsItemEmits {}
@@ -2,7 +2,7 @@
2
2
  import { tv } from "tailwind-variants";
3
3
  import { computed } from "vue";
4
4
  import { getCssUnitValue } from "../../utils/format";
5
- import { getResponsiveValue } from "../../utils/responsive";
5
+ import { getResponsiveValue } from "../../utils/get";
6
6
  defineOptions({
7
7
  name: "PText",
8
8
  inheritAttrs: false
@@ -2,13 +2,13 @@ import type { TextareaProps } from './types';
2
2
  declare const __VLS_export: import("vue").DefineComponent<TextareaProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
3
3
  change: (args_0: NonNullable<import("../../types/shared").ComponentLabel | undefined>) => any;
4
4
  "update:modelValue": (args_0: NonNullable<import("../../types/shared").ComponentLabel | undefined>) => any;
5
- blur: (args_0: FocusEvent) => any;
6
5
  focus: (args_0: FocusEvent) => any;
6
+ blur: (args_0: FocusEvent) => any;
7
7
  }, string, import("vue").PublicProps, Readonly<TextareaProps> & Readonly<{
8
8
  onChange?: ((args_0: NonNullable<import("../../types/shared").ComponentLabel | undefined>) => any) | undefined;
9
9
  "onUpdate:modelValue"?: ((args_0: NonNullable<import("../../types/shared").ComponentLabel | undefined>) => any) | undefined;
10
- onBlur?: ((args_0: FocusEvent) => any) | undefined;
11
10
  onFocus?: ((args_0: FocusEvent) => any) | undefined;
11
+ onBlur?: ((args_0: FocusEvent) => any) | undefined;
12
12
  }>, {
13
13
  modelValue: import("../../types/shared").ComponentLabel;
14
14
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
@@ -81,7 +81,7 @@ function onInputChange(event) {
81
81
  <template>
82
82
  <label
83
83
  :for="uniqueId"
84
- class="pxd-textarea pxd-input--border flex size-full min-h-inherit max-w-full items-center justify-center overflow-hidden rounded-md bg-background-100 motion-safe:transition-all"
84
+ class="pxd-textarea pxd-input--border flex size-full min-h-inherit max-w-full items-center justify-center overflow-hidden rounded-md bg-background-100 motion-safe:transition-appearance"
85
85
  :class="computedClasses"
86
86
  v-bind="$attrs"
87
87
  >
@@ -1,15 +1,13 @@
1
1
  import type { TimePickerProps } from './types';
2
2
  declare const __VLS_export: import("vue").DefineComponent<TimePickerProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
3
- select: (args_0: MouseEvent) => any;
4
- change: (args_0: boolean) => any;
3
+ change: (args_0: string) => any;
5
4
  "update:modelValue": (args_0: string) => any;
6
5
  }, string, import("vue").PublicProps, Readonly<TimePickerProps> & Readonly<{
7
- onSelect?: ((args_0: MouseEvent) => any) | undefined;
8
- onChange?: ((args_0: boolean) => any) | undefined;
6
+ onChange?: ((args_0: string) => any) | undefined;
9
7
  "onUpdate:modelValue"?: ((args_0: string) => any) | undefined;
10
8
  }>, {
11
- format: string;
12
9
  modelValue: Date | string | number | null;
10
+ format: string;
13
11
  closeOnPressEscape: boolean;
14
12
  presets: import("./types").DateTimePreset[];
15
13
  prefixIcon: boolean;