pxd 0.0.61 → 0.0.62
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.
- package/LICENSE +21 -0
- package/dist/components/_internal/dismiss-container.d.vue.ts +28 -0
- package/dist/components/_internal/dismiss-container.vue +162 -0
- package/dist/components/_internal/popover-arrow.d.vue.ts +9 -0
- package/dist/components/_internal/popover-arrow.vue +38 -0
- package/dist/components/active-graph/index.vue +4 -4
- package/dist/components/avatar/index.vue +5 -7
- package/dist/components/avatar-group/index.d.vue.ts +0 -1
- package/dist/components/avatar-group/index.vue +1 -1
- package/dist/components/backtop/index.vue +1 -1
- package/dist/components/badge/index.d.vue.ts +6 -2
- package/dist/components/badge/index.vue +18 -4
- package/dist/components/badge/types.d.ts +5 -0
- package/dist/components/book/index.vue +1 -1
- package/dist/components/browser/index.vue +1 -1
- package/dist/components/bubble/index.d.vue.ts +22 -0
- package/dist/components/bubble/index.vue +59 -0
- package/dist/components/bubble/types.d.ts +6 -0
- package/dist/components/button/index.d.vue.ts +0 -2
- package/dist/components/button/index.vue +30 -21
- package/dist/components/button/types.d.ts +3 -2
- package/dist/components/button-group/index.d.vue.ts +14 -0
- package/dist/components/button-group/index.vue +26 -0
- package/dist/components/button-group/types.d.ts +9 -0
- package/dist/components/carousel/index.d.vue.ts +3 -3
- package/dist/components/carousel/index.vue +146 -113
- package/dist/components/carousel/types.d.ts +1 -1
- package/dist/components/carousel-item/index.vue +22 -17
- package/dist/components/checkbox/index.vue +6 -6
- package/dist/components/checkbox-group/index.d.vue.ts +1 -1
- package/dist/components/chip/index.d.vue.ts +1 -5
- package/dist/components/chip/index.vue +4 -4
- package/dist/components/color-selector/index.d.vue.ts +12 -0
- package/dist/components/color-selector/index.vue +64 -0
- package/dist/components/color-selector/types.d.ts +12 -0
- package/dist/components/command-menu/index.d.vue.ts +6 -6
- package/dist/components/command-menu/index.vue +23 -32
- package/dist/components/command-menu/types.d.ts +1 -1
- package/dist/components/command-menu-group/index.vue +15 -6
- package/dist/components/command-menu-group/types.d.ts +1 -1
- package/dist/components/countdown/index.d.vue.ts +11 -11
- package/dist/components/drawer/index.d.vue.ts +8 -8
- package/dist/components/drawer/index.vue +13 -10
- package/dist/components/drawer/types.d.ts +4 -3
- package/dist/components/ellipsis-text/index.d.vue.ts +4 -1
- package/dist/components/ellipsis-text/index.vue +84 -107
- package/dist/components/ellipsis-text/types.d.ts +2 -1
- package/dist/components/error/index.vue +1 -1
- package/dist/components/fader/index.vue +5 -9
- package/dist/components/gauge/index.vue +34 -29
- package/dist/components/grid/index.vue +1 -1
- package/dist/components/grid-item/index.vue +1 -1
- package/dist/components/hold-button/index.d.vue.ts +8 -10
- package/dist/components/hold-button/index.vue +20 -29
- package/dist/components/hold-button/types.d.ts +5 -6
- package/dist/components/index.d.ts +7 -0
- package/dist/components/index.js +7 -0
- package/dist/components/input/index.d.vue.ts +8 -8
- package/dist/components/input/index.vue +5 -4
- package/dist/components/intersection-observer/index.vue +4 -4
- package/dist/components/kbd/index.vue +1 -1
- package/dist/components/link-button/index.d.vue.ts +4 -4
- package/dist/components/link-button/index.vue +9 -8
- package/dist/components/link-button/types.d.ts +0 -3
- package/dist/components/list/index.d.vue.ts +10 -15
- package/dist/components/list/index.vue +58 -131
- package/dist/components/list/types.d.ts +4 -4
- package/dist/components/list-item/index.d.vue.ts +2 -2
- package/dist/components/list-item/index.vue +44 -39
- package/dist/components/loading-bar/index.vue +8 -7
- package/dist/components/material/index.vue +24 -46
- package/dist/components/menu/index.d.vue.ts +6 -8
- package/dist/components/menu/index.vue +18 -24
- package/dist/components/menu/types.d.ts +1 -2
- package/dist/components/message/composables/use-group-expand.d.ts +13 -0
- package/dist/components/message/composables/use-group-expand.js +50 -0
- package/dist/components/message/composables/use-message-timer.d.ts +9 -0
- package/dist/components/message/composables/use-message-timer.js +61 -0
- package/dist/components/message/composables/use-promise-message.d.ts +4 -0
- package/dist/components/message/composables/use-promise-message.js +49 -0
- package/dist/components/message/index.d.vue.ts +6 -33
- package/dist/components/message/index.vue +33 -185
- package/dist/components/message/types.d.ts +2 -2
- package/dist/components/message-item/index.vue +26 -2
- package/dist/components/modal/index.d.vue.ts +7 -7
- package/dist/components/modal/index.vue +7 -3
- package/dist/components/modal/types.d.ts +7 -3
- package/dist/components/note/index.vue +2 -2
- package/dist/components/number-input/index.d.vue.ts +5 -4
- package/dist/components/number-input/index.vue +3 -0
- package/dist/components/number-input/types.d.ts +1 -0
- package/dist/components/overlay/index.d.vue.ts +6 -3
- package/dist/components/overlay/index.vue +63 -68
- package/dist/components/overlay/types.d.ts +5 -4
- package/dist/components/pagination/index.vue +2 -2
- package/dist/components/pin-input/index.d.vue.ts +1 -1
- package/dist/components/pin-input/index.vue +7 -6
- package/dist/components/placeholder/index.vue +1 -1
- package/dist/components/popover/index.d.vue.ts +7 -8
- package/dist/components/popover/index.vue +149 -239
- package/dist/components/popover/types.d.ts +5 -5
- package/dist/components/progress/index.vue +1 -1
- package/dist/components/radio/index.vue +2 -2
- package/dist/components/resizable/index.vue +43 -51
- package/dist/components/resizable/types.d.ts +1 -1
- package/dist/components/resizable-handle/index.d.vue.ts +4 -1
- package/dist/components/resizable-handle/index.vue +29 -3
- package/dist/components/resizable-panel/index.vue +3 -7
- package/dist/components/scalable-text/index.d.vue.ts +9 -0
- package/dist/components/scalable-text/index.vue +147 -0
- package/dist/components/scalable-text/types.d.ts +12 -0
- package/dist/components/scrollable/index.d.vue.ts +2 -2
- package/dist/components/scrollable/index.vue +4 -3
- package/dist/components/separator/index.d.vue.ts +6 -0
- package/dist/components/separator/index.vue +18 -0
- package/dist/components/separator/types.d.ts +5 -0
- package/dist/components/skeleton/index.d.vue.ts +1 -1
- package/dist/components/slider/index.d.vue.ts +1 -1
- package/dist/components/slider/index.vue +39 -7
- package/dist/components/snippet/index.vue +16 -13
- package/dist/components/spinner/index.vue +3 -1
- package/dist/components/stack/index.d.vue.ts +1 -1
- package/dist/components/stack/index.vue +1 -1
- package/dist/components/switch/index.d.vue.ts +1 -1
- package/dist/components/switch/index.vue +4 -3
- package/dist/components/switch-item/index.vue +1 -1
- package/dist/components/tabs/index.d.vue.ts +12 -0
- package/dist/components/tabs/index.vue +270 -0
- package/dist/components/tabs/types.d.ts +12 -0
- package/dist/components/tabs-item/index.d.vue.ts +4 -0
- package/dist/components/tabs-item/index.vue +16 -0
- package/dist/components/tabs-item/types.d.ts +10 -0
- package/dist/components/text/index.vue +1 -1
- package/dist/components/textarea/index.d.vue.ts +2 -2
- package/dist/components/textarea/index.vue +1 -1
- package/dist/components/time-picker/index.d.vue.ts +3 -5
- package/dist/components/time-picker/index.vue +53 -45
- package/dist/components/time-picker/types.d.ts +1 -2
- package/dist/components/toggle/index.d.vue.ts +0 -2
- package/dist/components/toggle/index.vue +6 -6
- package/dist/components/toggle-button/index.vue +8 -6
- package/dist/components/tooltip/index.d.vue.ts +1 -1
- package/dist/components/tooltip/index.vue +19 -11
- package/dist/components/tooltip/types.d.ts +2 -2
- package/dist/components/virtual-list/index.d.vue.ts +8 -8
- package/dist/components/virtual-list/index.vue +27 -5
- package/dist/components/virtual-list/types.d.ts +3 -0
- package/dist/composables/index.d.ts +4 -1
- package/dist/composables/index.js +4 -1
- package/dist/composables/use-browser-observer.js +2 -2
- package/dist/composables/use-client-online.js +2 -2
- package/dist/composables/use-color-scheme.js +2 -2
- package/dist/composables/use-countdown.js +3 -2
- package/dist/composables/use-deferred-value.js +2 -2
- package/dist/composables/use-delay-destroy.js +11 -6
- package/dist/composables/use-document-hidden.js +2 -2
- package/dist/composables/use-focus-trap.js +2 -2
- package/dist/composables/use-list-filter.d.ts +11 -0
- package/dist/composables/use-list-filter.js +56 -0
- package/dist/composables/use-list-navigation.d.ts +27 -0
- package/dist/composables/use-list-navigation.js +159 -0
- package/dist/composables/use-lock-scroll.js +12 -12
- package/dist/composables/use-media-query.js +2 -2
- package/dist/composables/use-outside-click.d.ts +1 -1
- package/dist/composables/use-outside-click.js +8 -11
- package/dist/composables/use-overlay-manager.d.ts +18 -0
- package/dist/composables/use-overlay-manager.js +80 -0
- package/dist/composables/use-popover-responsive.d.ts +6 -8
- package/dist/composables/use-popover-responsive.js +9 -12
- package/dist/composables/use-repeat-action.js +2 -2
- package/dist/composables/use-swipe-gesture.d.ts +65 -0
- package/dist/composables/use-swipe-gesture.js +99 -0
- package/dist/composables/use-virtual-list.d.ts +5 -3
- package/dist/composables/use-virtual-list.js +25 -14
- package/dist/composables/use-window-size.js +2 -2
- package/dist/constants/size.d.ts +12 -0
- package/dist/constants/size.js +12 -0
- package/dist/contexts/button.d.ts +5 -0
- package/dist/contexts/button.js +5 -0
- package/dist/contexts/carousel.d.ts +2 -1
- package/dist/contexts/list.d.ts +23 -3
- package/dist/contexts/list.js +6 -2
- package/dist/contexts/resizable.d.ts +3 -11
- package/dist/contexts/tabs.d.ts +15 -0
- package/dist/contexts/tabs.js +2 -0
- package/dist/locales/en-us.d.ts +4 -4
- package/dist/locales/en-us.js +4 -4
- package/dist/locales/zh-cn.d.ts +4 -4
- package/dist/locales/zh-cn.js +4 -4
- package/dist/plugins/dayjs-millisecond-token.js +1 -1
- package/dist/styles/source.css +133 -128
- package/dist/styles/styles.css +2 -2
- package/dist/styles/tw.css +133 -128
- package/dist/types/shared/props.d.ts +1 -0
- package/dist/types/shared/utils.d.ts +1 -4
- package/dist/utils/date.d.ts +3 -3
- package/dist/utils/dom.d.ts +1 -0
- package/dist/utils/dom.js +4 -0
- package/dist/utils/event.d.ts +2 -1
- package/dist/utils/event.js +7 -1
- package/dist/utils/format.d.ts +3 -3
- package/dist/utils/format.js +5 -4
- package/dist/utils/fuzzy-search.d.ts +7 -0
- package/dist/utils/fuzzy-search.js +61 -0
- package/dist/utils/get.d.ts +2 -0
- package/dist/utils/get.js +15 -1
- package/dist/utils/index.d.ts +10 -11
- package/dist/utils/index.js +2 -3
- package/dist/utils/ref.d.ts +2 -2
- package/dist/utils/{throttle.d.ts → timing.d.ts} +1 -0
- package/dist/utils/{throttle.js → timing.js} +4 -2
- package/package.json +67 -63
- package/volar.d.ts +7 -0
- package/dist/components/overlay/overlay-stack.d.ts +0 -3
- package/dist/components/overlay/overlay-stack.js +0 -17
- package/dist/composables/use-pointer-gesture.d.ts +0 -180
- package/dist/composables/use-pointer-gesture.js +0 -406
- package/dist/utils/debounce.d.ts +0 -1
- package/dist/utils/debounce.js +0 -1
- package/dist/utils/regexp.d.ts +0 -8
- package/dist/utils/regexp.js +0 -8
- package/dist/utils/responsive.d.ts +0 -3
- 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-
|
|
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:
|
|
26
|
-
md:
|
|
27
|
-
lg:
|
|
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
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
<
|
|
85
|
-
|
|
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
|
-
|
|
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/
|
|
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:
|
|
27
|
-
md:
|
|
28
|
-
lg:
|
|
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
|
|
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,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>
|
|
@@ -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/
|
|
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-
|
|
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
|
-
|
|
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
|
-
|
|
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;
|