pxd 0.0.55 → 0.0.61
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/README.md +18 -4
- package/dist/components/_internal/fragment-container.vue +3 -2
- package/dist/components/active-graph/index.d.vue.ts +2 -3
- package/dist/components/active-graph/index.vue +23 -16
- package/dist/components/active-graph/types.d.ts +4 -3
- package/dist/components/avatar/index.vue +19 -10
- package/dist/components/avatar/types.d.ts +0 -12
- package/dist/components/avatar-group/index.d.vue.ts +2 -2
- package/dist/components/avatar-group/index.vue +4 -3
- package/dist/components/avatar-group/types.d.ts +11 -0
- package/dist/components/badge/index.d.vue.ts +1 -1
- package/dist/components/badge/index.vue +47 -3
- package/dist/components/badge/types.d.ts +24 -1
- package/dist/components/book/index.vue +3 -2
- package/dist/components/browser/index.vue +6 -2
- package/dist/components/button/index.d.vue.ts +1 -1
- package/dist/components/button/index.vue +60 -12
- package/dist/components/carousel/index.d.vue.ts +24 -2
- package/dist/components/carousel/index.vue +341 -28
- package/dist/components/carousel/types.d.ts +2 -2
- package/dist/components/carousel-item/index.d.vue.ts +13 -0
- package/dist/components/carousel-item/index.vue +49 -0
- package/dist/components/checkbox/index.d.vue.ts +1 -5
- package/dist/components/checkbox/index.vue +66 -31
- package/dist/components/checkbox/types.d.ts +2 -14
- package/dist/components/checkbox-group/index.d.vue.ts +2 -7
- package/dist/components/checkbox-group/index.vue +11 -29
- package/dist/components/checkbox-group/types.d.ts +12 -0
- package/dist/components/chip/index.d.vue.ts +1 -1
- package/dist/components/chip/index.vue +31 -2
- package/dist/components/choicebox/index.d.vue.ts +11 -5
- package/dist/components/choicebox/index.vue +36 -54
- package/dist/components/choicebox/types.d.ts +11 -18
- package/dist/components/choicebox-item/index.d.vue.ts +16 -0
- package/dist/components/choicebox-item/index.vue +67 -0
- package/dist/components/choicebox-item/types.d.ts +12 -0
- package/dist/components/collapse/index.d.vue.ts +5 -4
- package/dist/components/collapse/index.vue +47 -30
- package/dist/components/collapse/types.d.ts +2 -5
- package/dist/components/collapse-group/index.d.vue.ts +2 -4
- package/dist/components/collapse-group/index.vue +8 -20
- package/dist/components/collapse-group/types.d.ts +6 -0
- package/dist/components/command-menu/index.vue +6 -7
- package/dist/components/command-menu/types.d.ts +0 -5
- package/dist/components/command-menu-group/index.d.vue.ts +1 -1
- package/dist/components/command-menu-group/index.vue +3 -2
- package/dist/components/command-menu-group/types.d.ts +5 -0
- package/dist/components/config-provider/index.d.vue.ts +3 -3
- package/dist/components/config-provider/index.vue +6 -4
- package/dist/components/countdown/index.vue +3 -2
- package/dist/components/countdown/types.d.ts +2 -2
- package/dist/components/dash-line/index.vue +3 -1
- package/dist/components/description/index.d.vue.ts +1 -1
- package/dist/components/description/index.vue +8 -7
- package/dist/components/description/types.d.ts +1 -1
- package/dist/components/drawer/index.d.vue.ts +3 -2
- package/dist/components/drawer/index.vue +20 -15
- package/dist/components/drawer/types.d.ts +3 -3
- package/dist/components/ellipsis-text/index.d.vue.ts +14 -0
- package/dist/components/ellipsis-text/index.vue +242 -0
- package/dist/components/ellipsis-text/types.d.ts +14 -0
- package/dist/components/empty-state/index.vue +6 -2
- package/dist/components/error/index.d.vue.ts +1 -3
- package/dist/components/error/index.vue +21 -6
- package/dist/components/error/types.d.ts +7 -1
- package/dist/components/fader/index.vue +30 -11
- package/dist/components/fader/types.d.ts +2 -2
- package/dist/components/gauge/index.vue +7 -2
- package/dist/components/grid/index.vue +9 -4
- package/dist/components/grid/types.d.ts +0 -5
- package/dist/components/grid-item/index.d.vue.ts +1 -1
- package/dist/components/grid-item/index.vue +16 -8
- package/dist/components/grid-item/types.d.ts +6 -0
- package/dist/components/hold-button/index.d.vue.ts +2 -2
- package/dist/components/hold-button/index.vue +1 -1
- package/dist/components/index.d.ts +7 -3
- package/dist/components/index.js +7 -3
- package/dist/components/input/index.d.vue.ts +8 -8
- package/dist/components/input/index.vue +54 -21
- package/dist/components/input/types.d.ts +7 -10
- package/dist/components/intersection-observer/index.d.vue.ts +0 -1
- package/dist/components/intersection-observer/index.vue +12 -3
- package/dist/components/kbd/index.vue +1 -1
- package/dist/components/link-button/index.d.vue.ts +1 -1
- package/dist/components/link-button/index.vue +4 -6
- package/dist/components/link-button/types.d.ts +1 -1
- package/dist/components/list/index.d.vue.ts +8 -5
- package/dist/components/list/index.vue +50 -54
- package/dist/components/list/types.d.ts +3 -20
- package/dist/components/list-item/index.d.vue.ts +3 -2
- package/dist/components/list-item/index.vue +44 -18
- package/dist/components/list-item/types.d.ts +15 -0
- package/dist/components/loading-bar/index.vue +33 -2
- package/dist/components/loading-bar/types.d.ts +1 -1
- package/dist/components/loading-dots/index.vue +3 -2
- package/dist/components/menu/index.d.vue.ts +5 -2
- package/dist/components/menu/index.vue +4 -1
- package/dist/components/menu/types.d.ts +5 -0
- package/dist/components/message/index.d.vue.ts +11 -8
- package/dist/components/message/index.vue +4 -12
- package/dist/components/message/types.d.ts +1 -12
- package/dist/components/message-item/index.d.vue.ts +1 -3
- package/dist/components/message-item/index.vue +13 -7
- package/dist/components/message-item/types.d.ts +11 -0
- package/dist/components/modal/index.d.vue.ts +3 -2
- package/dist/components/modal/index.vue +17 -13
- package/dist/components/modal/types.d.ts +3 -3
- package/dist/components/noise-background/index.vue +4 -3
- package/dist/components/note/index.d.vue.ts +1 -2
- package/dist/components/note/index.vue +81 -29
- package/dist/components/note/types.d.ts +10 -2
- package/dist/components/number-input/index.d.vue.ts +5 -4
- package/dist/components/number-input/index.vue +36 -6
- package/dist/components/number-input/types.d.ts +2 -0
- package/dist/components/overlay/index.vue +1 -1
- package/dist/components/overlay/types.d.ts +1 -1
- package/dist/components/pagination/index.vue +5 -3
- package/dist/components/pin-input/index.d.vue.ts +6 -1
- package/dist/components/pin-input/index.vue +60 -23
- package/dist/components/pin-input/types.d.ts +0 -4
- package/dist/components/placeholder/index.vue +14 -11
- package/dist/components/popover/index.vue +116 -78
- package/dist/components/popover/types.d.ts +1 -0
- package/dist/components/progress/index.d.vue.ts +1 -1
- package/dist/components/progress/index.vue +15 -2
- package/dist/components/project-banner/index.d.vue.ts +18 -0
- package/dist/components/project-banner/index.vue +59 -0
- package/dist/components/project-banner/types.d.ts +8 -0
- package/dist/components/radio/index.vue +62 -20
- package/dist/components/radio/types.d.ts +1 -14
- package/dist/components/radio-group/index.d.vue.ts +2 -4
- package/dist/components/radio-group/index.vue +11 -16
- package/dist/components/radio-group/types.d.ts +12 -0
- package/dist/components/resizable/types.d.ts +5 -10
- package/dist/components/resizable-handle/index.vue +1 -1
- package/dist/components/resizable-panel/index.d.vue.ts +1 -1
- package/dist/components/resizable-panel/index.vue +7 -2
- package/dist/components/resizable-panel/types.d.ts +4 -0
- package/dist/components/scrollable/index.d.vue.ts +29 -0
- package/dist/components/scrollable/index.vue +98 -83
- package/dist/components/scrollable/types.d.ts +19 -6
- package/dist/components/skeleton/index.vue +24 -1
- package/dist/components/slider/index.d.vue.ts +6 -6
- package/dist/components/slider/index.vue +86 -44
- package/dist/components/slider/types.d.ts +1 -1
- package/dist/components/snippet/index.vue +28 -2
- package/dist/components/spinner/index.vue +4 -2
- package/dist/components/stack/index.d.vue.ts +2 -2
- package/dist/components/stack/index.vue +35 -3
- package/dist/components/stack/types.d.ts +1 -1
- package/dist/components/status-dot/index.vue +5 -1
- package/dist/components/switch/index.d.vue.ts +10 -1
- package/dist/components/switch/index.vue +35 -44
- package/dist/components/switch/types.d.ts +4 -12
- package/dist/components/switch-item/index.d.vue.ts +14 -0
- package/dist/components/switch-item/index.vue +79 -0
- package/dist/components/switch-item/types.d.ts +9 -0
- package/dist/components/teleport/index.d.vue.ts +1 -1
- package/dist/components/teleport/index.vue +1 -1
- package/dist/components/teleport/types.d.ts +1 -1
- package/dist/components/text/index.d.vue.ts +1 -2
- package/dist/components/text/index.vue +36 -22
- package/dist/components/text/types.d.ts +1 -1
- package/dist/components/textarea/index.d.vue.ts +4 -4
- package/dist/components/textarea/index.vue +33 -4
- package/dist/components/textarea/types.d.ts +0 -1
- package/dist/components/time-picker/index.d.vue.ts +1 -2
- package/dist/components/time-picker/index.vue +43 -9
- package/dist/components/time-picker/types.d.ts +1 -2
- package/dist/components/toggle/index.vue +11 -10
- package/dist/components/toggle-button/index.d.vue.ts +22 -0
- package/dist/components/toggle-button/index.vue +110 -0
- package/dist/components/toggle-button/types.d.ts +16 -0
- package/dist/components/{choicebox-group → toggle-button-group}/index.d.vue.ts +5 -5
- package/dist/components/toggle-button-group/index.vue +68 -0
- package/dist/components/toggle-button-group/types.d.ts +22 -0
- package/dist/components/tooltip/index.d.vue.ts +2 -0
- package/dist/components/tooltip/index.vue +9 -3
- package/dist/components/tooltip/types.d.ts +3 -2
- package/dist/components/virtual-list/index.d.vue.ts +25 -4
- package/dist/components/virtual-list/index.vue +66 -10
- package/dist/components/virtual-list/types.d.ts +9 -4
- package/dist/composables/index.d.ts +2 -2
- package/dist/composables/index.js +2 -2
- package/dist/composables/use-browser-observer.d.ts +5 -5
- package/dist/composables/use-browser-observer.js +23 -20
- package/dist/composables/use-copy-click.js +4 -0
- package/dist/composables/use-countdown.d.ts +2 -2
- package/dist/composables/use-delay-destroy.d.ts +1 -1
- package/dist/composables/use-focus-trap.d.ts +7 -3
- package/dist/composables/use-focus-trap.js +19 -7
- package/dist/composables/use-forward-ref-expose.d.ts +2 -0
- package/dist/composables/use-forward-ref-expose.js +41 -0
- package/dist/composables/use-message.d.ts +4 -7
- package/dist/composables/use-model-value.d.ts +9 -8
- package/dist/composables/use-popover-responsive.d.ts +2 -2
- package/dist/composables/use-popover-responsive.js +3 -3
- package/dist/composables/use-repeat-action.d.ts +1 -1
- package/dist/composables/use-repeat-action.js +2 -2
- package/dist/composables/use-virtual-list.d.ts +21 -12
- package/dist/composables/use-virtual-list.js +90 -158
- package/dist/composables/use-window-size.d.ts +4 -0
- package/dist/composables/use-window-size.js +27 -0
- package/dist/contexts/avatar.d.ts +5 -2
- package/dist/contexts/carousel.d.ts +4 -4
- package/dist/contexts/carousel.js +1 -1
- package/dist/contexts/checkbox.d.ts +7 -2
- package/dist/contexts/choicebox.d.ts +8 -4
- package/dist/contexts/choicebox.js +1 -4
- package/dist/contexts/collapse.d.ts +5 -6
- package/dist/contexts/collapse.js +1 -1
- package/dist/contexts/config-provider.d.ts +5 -0
- package/dist/{composables/use-config-provider-context.js → contexts/config-provider.js} +8 -5
- package/dist/contexts/list.d.ts +1 -1
- package/dist/contexts/radio.d.ts +8 -2
- package/dist/contexts/resizable.d.ts +1 -1
- package/dist/contexts/switch.d.ts +8 -4
- package/dist/contexts/switch.js +1 -2
- package/dist/contexts/toggle-button.d.ts +7 -0
- package/dist/contexts/toggle-button.js +2 -0
- package/dist/styles/source.css +14 -2
- package/dist/styles/styles.css +2 -2
- package/dist/styles/tw.css +14 -2
- package/dist/types/shared/props.d.ts +1 -3
- package/dist/types/shared/utils.d.ts +0 -3
- package/dist/utils/context.d.ts +1 -0
- package/dist/utils/get.d.ts +1 -0
- package/dist/utils/get.js +14 -0
- package/dist/utils/ref.d.ts +1 -1
- package/dist/utils/responsive.js +2 -1
- package/dist/utils/throttle.js +9 -7
- package/dist/utils/uid.d.ts +1 -1
- package/dist/utils/uid.js +2 -2
- package/package.json +23 -21
- package/volar.d.ts +7 -3
- package/dist/components/badge/cn.d.ts +0 -90
- package/dist/components/badge/cn.js +0 -44
- package/dist/components/button/cn.d.ts +0 -121
- package/dist/components/button/cn.js +0 -55
- package/dist/components/carousel-group/index.d.vue.ts +0 -35
- package/dist/components/carousel-group/index.vue +0 -368
- package/dist/components/checkbox/cn.d.ts +0 -67
- package/dist/components/checkbox/cn.js +0 -31
- package/dist/components/chip/cn.d.ts +0 -49
- package/dist/components/chip/cn.js +0 -26
- package/dist/components/choicebox-group/index.vue +0 -65
- package/dist/components/error/cn.d.ts +0 -22
- package/dist/components/error/cn.js +0 -15
- package/dist/components/input/cn.d.ts +0 -73
- package/dist/components/input/cn.js +0 -36
- package/dist/components/list-item/cn.d.ts +0 -22
- package/dist/components/list-item/cn.js +0 -15
- package/dist/components/loading-bar/cn.d.ts +0 -70
- package/dist/components/loading-bar/cn.js +0 -32
- package/dist/components/note/cn.d.ts +0 -121
- package/dist/components/note/cn.js +0 -66
- package/dist/components/pin-input/cn.d.ts +0 -46
- package/dist/components/pin-input/cn.js +0 -25
- package/dist/components/progress/cn.d.ts +0 -19
- package/dist/components/progress/cn.js +0 -14
- package/dist/components/radio/cn.d.ts +0 -46
- package/dist/components/radio/cn.js +0 -42
- package/dist/components/skeleton/cn.d.ts +0 -43
- package/dist/components/skeleton/cn.js +0 -24
- package/dist/components/snippet/cn.d.ts +0 -52
- package/dist/components/snippet/cn.js +0 -27
- package/dist/components/stack/cn.d.ts +0 -70
- package/dist/components/stack/cn.js +0 -33
- package/dist/components/switch/cn.d.ts +0 -16
- package/dist/components/switch/cn.js +0 -13
- package/dist/components/switch-group/index.d.vue.ts +0 -23
- package/dist/components/switch-group/index.vue +0 -54
- package/dist/components/text/cn.d.ts +0 -67
- package/dist/components/text/cn.js +0 -34
- package/dist/components/textarea/cn.d.ts +0 -58
- package/dist/components/textarea/cn.js +0 -30
- package/dist/composables/use-config-provider-context.d.ts +0 -3
- package/dist/composables/use-unique-id-context.d.ts +0 -2
- package/dist/composables/use-unique-id-context.js +0 -11
|
@@ -1,7 +1,12 @@
|
|
|
1
|
+
import type { ComponentPosition } from '../../types/shared'
|
|
2
|
+
import type { ListOption, ListOptionSelected } from '../list/types'
|
|
3
|
+
|
|
1
4
|
export interface MenuProps {
|
|
2
5
|
width?: string | number
|
|
3
6
|
options?: ListOption[]
|
|
4
7
|
position?: ComponentPosition
|
|
8
|
+
showDelay?: number
|
|
9
|
+
hideDelay?: number
|
|
5
10
|
closeOnPressEscape?: boolean
|
|
6
11
|
}
|
|
7
12
|
|
|
@@ -1,11 +1,12 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { MessageItemConfig } from '../../composables/use-message';
|
|
2
2
|
import type { MessageProps } from './types';
|
|
3
|
-
declare function getMessageById(id:
|
|
3
|
+
declare function getMessageById(id: MessageItemConfig['id']): {
|
|
4
4
|
index: number;
|
|
5
5
|
message: null;
|
|
6
6
|
} | {
|
|
7
7
|
index: number;
|
|
8
8
|
message: {
|
|
9
|
+
height?: number | undefined;
|
|
9
10
|
_timerId?: {
|
|
10
11
|
close: () => NodeJS.Timeout;
|
|
11
12
|
hasRef: () => boolean;
|
|
@@ -53,12 +54,13 @@ declare function getMessageById(id: MessageItemType['id']): {
|
|
|
53
54
|
}>)) | undefined;
|
|
54
55
|
};
|
|
55
56
|
};
|
|
56
|
-
declare function pauseMessageById(id:
|
|
57
|
-
declare function resumeMessageById(id:
|
|
58
|
-
declare function closeMessageById(id:
|
|
57
|
+
declare function pauseMessageById(id: MessageItemConfig['id']): void;
|
|
58
|
+
declare function resumeMessageById(id: MessageItemConfig['id']): void;
|
|
59
|
+
declare function closeMessageById(id: MessageItemConfig['id']): void;
|
|
59
60
|
declare function clearMessage(): void;
|
|
60
61
|
declare const __VLS_export: import("vue").DefineComponent<MessageProps, {
|
|
61
62
|
messages: import("vue").Ref<{
|
|
63
|
+
height?: number | undefined;
|
|
62
64
|
_timerId?: {
|
|
63
65
|
close: () => NodeJS.Timeout;
|
|
64
66
|
hasRef: () => boolean;
|
|
@@ -104,7 +106,8 @@ declare const __VLS_export: import("vue").DefineComponent<MessageProps, {
|
|
|
104
106
|
}>) | ((data: unknown) => string | import("vue").VNode<import("vue").RendererNode, import("vue").RendererElement, {
|
|
105
107
|
[key: string]: any;
|
|
106
108
|
}>)) | undefined;
|
|
107
|
-
}[],
|
|
109
|
+
}[], MessageItemConfig[] | {
|
|
110
|
+
height?: number | undefined;
|
|
108
111
|
_timerId?: {
|
|
109
112
|
close: () => NodeJS.Timeout;
|
|
110
113
|
hasRef: () => boolean;
|
|
@@ -157,9 +160,9 @@ declare const __VLS_export: import("vue").DefineComponent<MessageProps, {
|
|
|
157
160
|
close: typeof closeMessageById;
|
|
158
161
|
clear: typeof clearMessage;
|
|
159
162
|
}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
|
|
160
|
-
close: (id:
|
|
163
|
+
close: (id: MessageItemType) => any;
|
|
161
164
|
}, string, import("vue").PublicProps, Readonly<MessageProps> & Readonly<{
|
|
162
|
-
onClose?: ((id:
|
|
165
|
+
onClose?: ((id: MessageItemType) => any) | undefined;
|
|
163
166
|
}>, {
|
|
164
167
|
max: number;
|
|
165
168
|
group: string;
|
|
@@ -8,7 +8,8 @@ import { isServer } from "../../utils/is";
|
|
|
8
8
|
import PMessageItem from "../message-item/index.vue";
|
|
9
9
|
import PTeleport from "../teleport/index.vue";
|
|
10
10
|
defineOptions({
|
|
11
|
-
name: "PMessage"
|
|
11
|
+
name: "PMessage",
|
|
12
|
+
inheritAttrs: false
|
|
12
13
|
});
|
|
13
14
|
const props = defineProps({
|
|
14
15
|
max: { type: Number, required: false, default: 3 },
|
|
@@ -27,9 +28,8 @@ useDocumentHidden((isHidden) => {
|
|
|
27
28
|
});
|
|
28
29
|
const groupExpand = ref(props.expand);
|
|
29
30
|
const groupMessages = ref([]);
|
|
30
|
-
const messageItemsHeight = ref([]);
|
|
31
31
|
const messageGroupStyle = computed(() => {
|
|
32
|
-
const frontHeight =
|
|
32
|
+
const frontHeight = groupMessages.value[0]?.height || 0;
|
|
33
33
|
const visibleItemCounts = Math.min(props.max, groupMessages.value.length);
|
|
34
34
|
return {
|
|
35
35
|
"--message-width": getCssUnitValue(props.width),
|
|
@@ -116,18 +116,11 @@ function closeMessageById(id) {
|
|
|
116
116
|
message._timerId = void 0;
|
|
117
117
|
}
|
|
118
118
|
groupMessages.value.splice(index, 1);
|
|
119
|
-
const heightIndex = messageItemsHeight.value.findIndex((h) => h.id === id);
|
|
120
|
-
if (heightIndex !== -1) {
|
|
121
|
-
messageItemsHeight.value.splice(heightIndex, 1);
|
|
122
|
-
}
|
|
123
119
|
if (!props.expand && groupMessages.value.length === 0) {
|
|
124
120
|
groupExpand.value = false;
|
|
125
121
|
}
|
|
126
122
|
emits("close", id);
|
|
127
123
|
}
|
|
128
|
-
function setItemHeight(info) {
|
|
129
|
-
messageItemsHeight.value.unshift(info);
|
|
130
|
-
}
|
|
131
124
|
function clearMessage() {
|
|
132
125
|
groupMessages.value.forEach((m) => {
|
|
133
126
|
if (m._timerId) {
|
|
@@ -136,7 +129,6 @@ function clearMessage() {
|
|
|
136
129
|
}
|
|
137
130
|
});
|
|
138
131
|
groupMessages.value = [];
|
|
139
|
-
messageItemsHeight.value = [];
|
|
140
132
|
}
|
|
141
133
|
function resolvePromiseMessage(handler, data) {
|
|
142
134
|
if (!handler) {
|
|
@@ -299,6 +291,7 @@ defineExpose({
|
|
|
299
291
|
:data-expand="groupExpand"
|
|
300
292
|
:data-position="position"
|
|
301
293
|
:style="messageGroupStyle"
|
|
294
|
+
v-bind="$attrs"
|
|
302
295
|
>
|
|
303
296
|
<TransitionGroup
|
|
304
297
|
appear
|
|
@@ -316,7 +309,6 @@ defineExpose({
|
|
|
316
309
|
:index="index"
|
|
317
310
|
:item-data="item"
|
|
318
311
|
@close="closeMessageById"
|
|
319
|
-
@set-height="setItemHeight"
|
|
320
312
|
/>
|
|
321
313
|
</TransitionGroup>
|
|
322
314
|
</section>
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { MessageItemType } from '../../composables/use-message'
|
|
2
|
-
import type { ComponentPosition } from '../../types/shared
|
|
2
|
+
import type { ComponentPosition } from '../../types/shared'
|
|
3
3
|
|
|
4
4
|
export interface MessageProps {
|
|
5
5
|
max?: number
|
|
@@ -12,14 +12,3 @@ export interface MessageProps {
|
|
|
12
12
|
export interface MessageEmits {
|
|
13
13
|
close: [id: MessageItemType['id']]
|
|
14
14
|
}
|
|
15
|
-
|
|
16
|
-
export interface MessageItemProps {
|
|
17
|
-
max: number
|
|
18
|
-
index: number
|
|
19
|
-
itemData: MessageItemType
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
export interface MessageItemEmits {
|
|
23
|
-
close: [key: MessageItemType['id']]
|
|
24
|
-
'set-height': [info: MessageItemHeightType]
|
|
25
|
-
}
|
|
@@ -1,10 +1,8 @@
|
|
|
1
|
-
import type { MessageItemProps } from '
|
|
1
|
+
import type { MessageItemProps } from './types';
|
|
2
2
|
declare const __VLS_export: import("vue").DefineComponent<MessageItemProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
|
|
3
3
|
close: (key: string | number | undefined) => any;
|
|
4
|
-
"set-height": (info: MessageItemHeightType) => any;
|
|
5
4
|
}, string, import("vue").PublicProps, Readonly<MessageItemProps> & Readonly<{
|
|
6
5
|
onClose?: ((key: string | number | undefined) => any) | undefined;
|
|
7
|
-
"onSet-height"?: ((info: MessageItemHeightType) => any) | undefined;
|
|
8
6
|
}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
9
7
|
declare const _default: typeof __VLS_export;
|
|
10
8
|
export default _default;
|
|
@@ -5,7 +5,7 @@ import ErrorFillIcon from "@gdsicon/vue/cross-circle-fill";
|
|
|
5
5
|
import InformationFillIcon from "@gdsicon/vue/information-fill";
|
|
6
6
|
import LoadingIcon from "@gdsicon/vue/loader-circle";
|
|
7
7
|
import WarningFillIcon from "@gdsicon/vue/warning-fill";
|
|
8
|
-
import { computed, onMounted, shallowRef } from "vue";
|
|
8
|
+
import { computed, onMounted, shallowRef, watch } from "vue";
|
|
9
9
|
import PButton from "../button/index.vue";
|
|
10
10
|
defineOptions({
|
|
11
11
|
name: "PMessageItem",
|
|
@@ -16,7 +16,7 @@ const props = defineProps({
|
|
|
16
16
|
index: { type: Number, required: true },
|
|
17
17
|
itemData: { type: Object, required: true }
|
|
18
18
|
});
|
|
19
|
-
const emits = defineEmits(["close"
|
|
19
|
+
const emits = defineEmits(["close"]);
|
|
20
20
|
const TYPE_ICONS = {
|
|
21
21
|
info: InformationFillIcon,
|
|
22
22
|
success: SuccessFillIcon,
|
|
@@ -46,12 +46,17 @@ function setItemHeightInfo() {
|
|
|
46
46
|
return;
|
|
47
47
|
}
|
|
48
48
|
const rect = itemRef.value.getBoundingClientRect();
|
|
49
|
-
|
|
50
|
-
id: props.itemData.id,
|
|
51
|
-
height: rect.height
|
|
52
|
-
};
|
|
53
|
-
emits("set-height", info);
|
|
49
|
+
props.itemData.height = rect.height;
|
|
54
50
|
}
|
|
51
|
+
watch(
|
|
52
|
+
() => props.itemData.message,
|
|
53
|
+
() => {
|
|
54
|
+
if (!itemRef.value) {
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
setItemHeightInfo();
|
|
58
|
+
}
|
|
59
|
+
);
|
|
55
60
|
onMounted(() => {
|
|
56
61
|
setItemHeightInfo();
|
|
57
62
|
});
|
|
@@ -66,6 +71,7 @@ onMounted(() => {
|
|
|
66
71
|
:style="computedStyle"
|
|
67
72
|
class="pxd-message--item px-3 py-2 text-sm flex w-full max-w-full shrink-0 transform-(--message-item-transform) rounded-lg bg-background-100 break-all whitespace-pre-wrap shadow-border-modal outline-none motion-safe:transition-(--message-item-transition)"
|
|
68
73
|
:class="[itemData.class, { 'pr-9': itemData.closeable }]"
|
|
74
|
+
v-bind="$attrs"
|
|
69
75
|
>
|
|
70
76
|
<Component
|
|
71
77
|
:is="TYPE_ICONS[itemData.type]"
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { MessageItemConfig } from '../../composables/use-message'
|
|
2
|
+
|
|
3
|
+
export interface MessageItemProps {
|
|
4
|
+
max: number
|
|
5
|
+
index: number
|
|
6
|
+
itemData: MessageItemConfig
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export interface MessageItemEmits {
|
|
10
|
+
close: [key: MessageItemConfig['id']]
|
|
11
|
+
}
|
|
@@ -28,10 +28,11 @@ declare const __VLS_base: import("vue").DefineComponent<ModalProps, {}, {}, {},
|
|
|
28
28
|
}>, {
|
|
29
29
|
modelValue: boolean;
|
|
30
30
|
closeOnPressEscape: boolean;
|
|
31
|
+
autoFocusElement: string | boolean;
|
|
31
32
|
appendToBody: boolean;
|
|
32
33
|
closeOnClickOverlay: boolean;
|
|
33
|
-
|
|
34
|
-
|
|
34
|
+
defaultHeaderStyle: boolean;
|
|
35
|
+
defaultFooterStyle: boolean;
|
|
35
36
|
}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
36
37
|
declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
|
|
37
38
|
declare const _default: typeof __VLS_export;
|
|
@@ -19,13 +19,13 @@ const props = defineProps({
|
|
|
19
19
|
loading: { type: Boolean, required: false },
|
|
20
20
|
modelValue: { type: Boolean, required: false, default: false },
|
|
21
21
|
appendToBody: { type: Boolean, required: false, default: true },
|
|
22
|
-
headerStylize: { type: Boolean, required: false, default: false },
|
|
23
|
-
footerStylize: { type: Boolean, required: false, default: true },
|
|
24
22
|
wrapperClass: { type: [String, Array, Object], required: false },
|
|
25
23
|
contentClass: { type: [String, Array, Object], required: false },
|
|
24
|
+
autoFocusElement: { type: [String, Boolean], required: false, default: false },
|
|
25
|
+
defaultHeaderStyle: { type: Boolean, required: false, default: false },
|
|
26
|
+
defaultFooterStyle: { type: Boolean, required: false, default: true },
|
|
26
27
|
closeOnPressEscape: { type: Boolean, required: false, default: false },
|
|
27
|
-
closeOnClickOverlay: { type: Boolean, required: false, default: false }
|
|
28
|
-
initialFocus: { type: [String, Boolean], required: false }
|
|
28
|
+
closeOnClickOverlay: { type: Boolean, required: false, default: false }
|
|
29
29
|
});
|
|
30
30
|
const emits = defineEmits(["show", "hide", "change", "visible-change", "outside-click", "update:modelValue"]);
|
|
31
31
|
const modalRef = shallowRef();
|
|
@@ -33,11 +33,16 @@ const isVisible = useModelValue(props, emits);
|
|
|
33
33
|
const computedStyle = computed(() => {
|
|
34
34
|
return { "--modal-width": getCssUnitValue(props.width) };
|
|
35
35
|
});
|
|
36
|
-
|
|
37
|
-
|
|
36
|
+
const defaultStyles = computed(() => ({
|
|
37
|
+
headerClass: props.defaultHeaderStyle ? "pb-4 sm:pb-6 border-b bg-background-200 dark:bg-background-100" : "",
|
|
38
|
+
footerClass: props.defaultFooterStyle ? "border-t pt-4 bg-background-200 dark:bg-background-100" : ""
|
|
39
|
+
}));
|
|
40
|
+
const focusTrapOptions = computed(() => ({
|
|
41
|
+
autoFocusElement: props.autoFocusElement,
|
|
38
42
|
escapeDeactivates: props.closeOnPressEscape,
|
|
39
43
|
clickOutsideDeactivates: props.closeOnClickOverlay
|
|
40
|
-
});
|
|
44
|
+
}));
|
|
45
|
+
useFocusTrap(modalRef, focusTrapOptions);
|
|
41
46
|
function closeOverlayIfNeed() {
|
|
42
47
|
if (isTruthyProp(props.loading)) {
|
|
43
48
|
return;
|
|
@@ -76,9 +81,10 @@ watch(
|
|
|
76
81
|
<div
|
|
77
82
|
v-if="isVisible"
|
|
78
83
|
ref="modalRef"
|
|
79
|
-
aria-modal="true"
|
|
80
84
|
role="dialog"
|
|
81
85
|
tabindex="-1"
|
|
86
|
+
aria-modal="true"
|
|
87
|
+
:aria-expanded="isVisible"
|
|
82
88
|
class="pxd-modal group/modal left-0 translate-z-0 sm:top-1/2 sm:left-1/2 sm:-translate-x-1/2 sm:-translate-y-1/2 sm:rounded-xl sm:[--o:0] sm:[--t:scale(0.98)] sm:w-[var(--modal-width,540px)] max-sm:bottom-0 pointer-events-auto fixed z-10 flex w-full max-w-full flex-col overflow-hidden rounded-t-lg bg-background-100 shadow-border-modal outline-none motion-safe:transition-all dark:bg-background-200"
|
|
83
89
|
:class="wrapperClass"
|
|
84
90
|
:style="computedStyle"
|
|
@@ -86,9 +92,7 @@ watch(
|
|
|
86
92
|
>
|
|
87
93
|
<header
|
|
88
94
|
class="pxd-modal--header px-6 pt-4 sm:pt-6 empty:py-3 relative shrink-0"
|
|
89
|
-
:class="
|
|
90
|
-
'pb-4 sm:pb-6 border-b bg-background-200 dark:bg-background-100': headerStylize
|
|
91
|
-
}"
|
|
95
|
+
:class="defaultStyles.headerClass"
|
|
92
96
|
>
|
|
93
97
|
<slot name="header">
|
|
94
98
|
<h3
|
|
@@ -117,8 +121,8 @@ watch(
|
|
|
117
121
|
|
|
118
122
|
<footer
|
|
119
123
|
v-if="$slots.footer"
|
|
120
|
-
class="pxd-modal--footer
|
|
121
|
-
:class="
|
|
124
|
+
class="pxd-modal--footer px-4 pb-4 gap-2 relative flex shrink-0 items-center justify-between"
|
|
125
|
+
:class="defaultStyles.footerClass"
|
|
122
126
|
>
|
|
123
127
|
<slot name="footer" />
|
|
124
128
|
</footer>
|
|
@@ -7,13 +7,13 @@ export interface ModalProps {
|
|
|
7
7
|
loading?: boolean
|
|
8
8
|
modelValue?: boolean
|
|
9
9
|
appendToBody?: boolean
|
|
10
|
-
headerStylize?: boolean
|
|
11
|
-
footerStylize?: boolean
|
|
12
10
|
wrapperClass?: ComponentClass
|
|
13
11
|
contentClass?: ComponentClass
|
|
12
|
+
autoFocusElement?: string | boolean
|
|
13
|
+
defaultHeaderStyle?: boolean
|
|
14
|
+
defaultFooterStyle?: boolean
|
|
14
15
|
closeOnPressEscape?: boolean
|
|
15
16
|
closeOnClickOverlay?: boolean
|
|
16
|
-
initialFocus?: string | false
|
|
17
17
|
}
|
|
18
18
|
|
|
19
19
|
export interface ModalEmits {
|
|
@@ -1,14 +1,15 @@
|
|
|
1
1
|
<script setup>
|
|
2
2
|
defineOptions({
|
|
3
|
-
name: "PNoiseBackground"
|
|
3
|
+
name: "PNoiseBackground",
|
|
4
|
+
inheritAttrs: false
|
|
4
5
|
});
|
|
5
6
|
defineProps({
|
|
6
|
-
as: { type:
|
|
7
|
+
as: { type: [String, Object], required: false, default: "div" }
|
|
7
8
|
});
|
|
8
9
|
</script>
|
|
9
10
|
|
|
10
11
|
<template>
|
|
11
|
-
<Component :is="as" class="pxd-noise-background relative">
|
|
12
|
+
<Component :is="as" class="pxd-noise-background relative" v-bind="$attrs">
|
|
12
13
|
<slot />
|
|
13
14
|
</Component>
|
|
14
15
|
</template>
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { noteVariant } from './cn';
|
|
2
1
|
import type { NoteProps } from './types';
|
|
3
2
|
declare var __VLS_1: {}, __VLS_8: {}, __VLS_10: {};
|
|
4
3
|
type __VLS_Slots = {} & {
|
|
@@ -10,7 +9,7 @@ type __VLS_Slots = {} & {
|
|
|
10
9
|
};
|
|
11
10
|
declare const __VLS_base: import("vue").DefineComponent<NoteProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<NoteProps> & Readonly<{}>, {
|
|
12
11
|
label: boolean | import("../../types/shared").ComponentLabel;
|
|
13
|
-
variant:
|
|
12
|
+
variant: import("./types").NoteVariant;
|
|
14
13
|
}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
15
14
|
declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
|
|
16
15
|
declare const _default: typeof __VLS_export;
|
|
@@ -3,47 +3,99 @@ import CheckCircleIcon from "@gdsicon/vue/check-circle";
|
|
|
3
3
|
import InformationIcon from "@gdsicon/vue/information";
|
|
4
4
|
import StopIcon from "@gdsicon/vue/stop";
|
|
5
5
|
import WarningIcon from "@gdsicon/vue/warning";
|
|
6
|
+
import { tv } from "tailwind-variants";
|
|
6
7
|
import { computed, h } from "vue";
|
|
7
|
-
import { useConfigProvider } from "../../
|
|
8
|
+
import { useConfigProvider } from "../../contexts/config-provider";
|
|
8
9
|
import { isTruthyProp } from "../../utils/format";
|
|
9
|
-
import { noteVariant } from "./cn";
|
|
10
10
|
defineOptions({
|
|
11
|
-
name: "PNote"
|
|
11
|
+
name: "PNote",
|
|
12
|
+
inheritAttrs: false
|
|
12
13
|
});
|
|
13
14
|
const props = defineProps({
|
|
14
|
-
variant: { type:
|
|
15
|
+
variant: { type: String, required: false, default: "default" },
|
|
15
16
|
size: { type: String, required: false },
|
|
16
17
|
fill: { type: Boolean, required: false },
|
|
17
18
|
label: { type: [Boolean, String, Number, Array, null], required: false, default: true }
|
|
18
19
|
});
|
|
19
|
-
const
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
20
|
+
const noteVariant = tv({
|
|
21
|
+
base: "pxd-note gap-2 sm:items-center max-sm:flex-col flex max-w-full rounded-md border",
|
|
22
|
+
variants: {
|
|
23
|
+
size: {
|
|
24
|
+
sm: "px-2 py-1.5 text-xs",
|
|
25
|
+
md: "px-3 py-2 text-sm",
|
|
26
|
+
lg: "px-4 py-2.5 text-base"
|
|
27
|
+
},
|
|
28
|
+
variant: {
|
|
29
|
+
success: {
|
|
30
|
+
base: "border-blue-500 text-blue-900",
|
|
31
|
+
fill: "border-blue-100 bg-blue-200 text-blue-900"
|
|
32
|
+
},
|
|
33
|
+
error: {
|
|
34
|
+
base: "border-red-500 text-red-900",
|
|
35
|
+
fill: "border-red-100 bg-red-200 text-red-900"
|
|
36
|
+
},
|
|
37
|
+
warning: {
|
|
38
|
+
base: "border-amber-500 text-amber-900",
|
|
39
|
+
fill: "border-amber-100 bg-amber-200 text-amber-900"
|
|
40
|
+
},
|
|
41
|
+
default: {
|
|
42
|
+
base: "border-input text-gray-900",
|
|
43
|
+
fill: "border-gray-100 bg-gray-200 text-gray-900"
|
|
44
|
+
},
|
|
45
|
+
primary: {
|
|
46
|
+
base: "border-gray-alpha-400 text-primary",
|
|
47
|
+
fill: "border-gray-100 bg-primary text-gray-100"
|
|
48
|
+
},
|
|
49
|
+
violet: {
|
|
50
|
+
base: "text-violet-900 border-violet-400",
|
|
51
|
+
fill: "text-violet-900 bg-violet-200 border-violet-100"
|
|
52
|
+
},
|
|
53
|
+
cyan: {
|
|
54
|
+
base: "border-teal-400 text-teal-900",
|
|
55
|
+
fill: "border-teal-100 bg-teal-200 text-teal-900"
|
|
56
|
+
}
|
|
57
|
+
},
|
|
58
|
+
fill: {
|
|
59
|
+
true: {},
|
|
60
|
+
false: {}
|
|
61
|
+
}
|
|
32
62
|
},
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
63
|
+
compoundVariants: [
|
|
64
|
+
{ variant: "success", fill: true, class: "border-blue-100 bg-blue-200 text-blue-900" },
|
|
65
|
+
{ variant: "success", fill: false, class: "border-blue-500 text-blue-900" },
|
|
66
|
+
{ variant: "error", fill: true, class: "border-red-100 bg-red-200 text-red-900" },
|
|
67
|
+
{ variant: "error", fill: false, class: "border-red-500 text-red-900" },
|
|
68
|
+
{ variant: "warning", fill: true, class: "border-amber-100 bg-amber-200 text-amber-900" },
|
|
69
|
+
{ variant: "warning", fill: false, class: "border-amber-500 text-amber-900" },
|
|
70
|
+
{ variant: "default", fill: true, class: "border-gray-100 bg-gray-200 text-gray-900" },
|
|
71
|
+
{ variant: "default", fill: false, class: "border-input text-gray-900" },
|
|
72
|
+
{ variant: "primary", fill: true, class: "border-gray-100 bg-primary text-gray-100" },
|
|
73
|
+
{ variant: "primary", fill: false, class: "border-gray-alpha-400 text-primary" },
|
|
74
|
+
{ variant: "violet", fill: true, class: "text-violet-900 bg-violet-200 border-violet-100" },
|
|
75
|
+
{ variant: "violet", fill: false, class: "text-violet-900 border-violet-400" },
|
|
76
|
+
{ variant: "cyan", fill: true, class: "border-teal-100 bg-teal-200 text-teal-900" },
|
|
77
|
+
{ variant: "cyan", fill: false, class: "border-teal-400 text-teal-900" }
|
|
78
|
+
],
|
|
79
|
+
defaultVariants: {
|
|
80
|
+
size: "md",
|
|
81
|
+
variant: "default",
|
|
82
|
+
fill: false
|
|
41
83
|
}
|
|
84
|
+
});
|
|
85
|
+
const configProvider = useConfigProvider();
|
|
86
|
+
const VARIANTS_ICON = {
|
|
87
|
+
success: CheckCircleIcon,
|
|
88
|
+
error: StopIcon,
|
|
89
|
+
warning: WarningIcon,
|
|
90
|
+
default: InformationIcon,
|
|
91
|
+
primary: InformationIcon,
|
|
92
|
+
violet: InformationIcon,
|
|
93
|
+
cyan: InformationIcon
|
|
42
94
|
};
|
|
43
95
|
const computedLabel = computed(() => {
|
|
44
96
|
const { label } = props;
|
|
45
97
|
if (isTruthyProp(label)) {
|
|
46
|
-
return
|
|
98
|
+
return VARIANTS_ICON[props.variant] || InformationIcon;
|
|
47
99
|
}
|
|
48
100
|
if (typeof label === "string" && label) {
|
|
49
101
|
return h("span", null, label);
|
|
@@ -60,8 +112,8 @@ const computedClasses = computed(() => {
|
|
|
60
112
|
</script>
|
|
61
113
|
|
|
62
114
|
<template>
|
|
63
|
-
<div :class="computedClasses">
|
|
64
|
-
<div class="gap-3 flex flex-1">
|
|
115
|
+
<div :class="computedClasses" v-bind="$attrs">
|
|
116
|
+
<div class="gap-3 flex flex-1 shrink-0">
|
|
65
117
|
<slot v-if="computedLabel" name="label">
|
|
66
118
|
<Component :is="computedLabel" class="size-4 font-medium h-lh shrink-0" />
|
|
67
119
|
</slot>
|
|
@@ -71,7 +123,7 @@ const computedClasses = computed(() => {
|
|
|
71
123
|
</span>
|
|
72
124
|
</div>
|
|
73
125
|
|
|
74
|
-
<div v-if="$slots.action" class="pxd-note--action">
|
|
126
|
+
<div v-if="$slots.action" class="pxd-note--action max-sm:pl-7 shrink-0">
|
|
75
127
|
<slot name="action" />
|
|
76
128
|
</div>
|
|
77
129
|
</div>
|
|
@@ -1,8 +1,16 @@
|
|
|
1
1
|
import type { ComponentLabel, ComponentSize } from '../../types/shared'
|
|
2
|
-
|
|
2
|
+
|
|
3
|
+
export type NoteVariant =
|
|
4
|
+
| 'success'
|
|
5
|
+
| 'error'
|
|
6
|
+
| 'warning'
|
|
7
|
+
| 'default'
|
|
8
|
+
| 'primary'
|
|
9
|
+
| 'violet'
|
|
10
|
+
| 'cyan'
|
|
3
11
|
|
|
4
12
|
export interface NoteProps {
|
|
5
|
-
variant?:
|
|
13
|
+
variant?: NoteVariant
|
|
6
14
|
size?: ComponentSize
|
|
7
15
|
fill?: boolean
|
|
8
16
|
label?: boolean | ComponentLabel
|
|
@@ -11,21 +11,22 @@ type __VLS_Slots = {} & {
|
|
|
11
11
|
};
|
|
12
12
|
declare const __VLS_base: import("vue").DefineComponent<NumberInputProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
|
|
13
13
|
input: (args_0: number | null | undefined) => any;
|
|
14
|
-
blur: (args_0: FocusEvent) => any;
|
|
15
14
|
change: (args_0: number | null | undefined, args_1: Event) => any;
|
|
16
|
-
focus: (args_0: FocusEvent) => any;
|
|
17
15
|
"update:modelValue": (args_0: number | null | undefined) => any;
|
|
16
|
+
blur: (args_0: FocusEvent) => any;
|
|
17
|
+
focus: (args_0: FocusEvent) => any;
|
|
18
18
|
}, string, import("vue").PublicProps, Readonly<NumberInputProps> & Readonly<{
|
|
19
19
|
onInput?: ((args_0: number | null | undefined) => any) | undefined;
|
|
20
|
-
onBlur?: ((args_0: FocusEvent) => any) | undefined;
|
|
21
20
|
onChange?: ((args_0: number | null | undefined, args_1: Event) => any) | undefined;
|
|
22
|
-
onFocus?: ((args_0: FocusEvent) => any) | undefined;
|
|
23
21
|
"onUpdate:modelValue"?: ((args_0: number | null | undefined) => any) | undefined;
|
|
22
|
+
onBlur?: ((args_0: FocusEvent) => any) | undefined;
|
|
23
|
+
onFocus?: ((args_0: FocusEvent) => any) | undefined;
|
|
24
24
|
}>, {
|
|
25
25
|
max: number;
|
|
26
26
|
min: number;
|
|
27
27
|
clearValue: number | null;
|
|
28
28
|
step: number;
|
|
29
|
+
thousandsSeparator: string;
|
|
29
30
|
scientific: boolean;
|
|
30
31
|
}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
31
32
|
declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import MinusIcon from "@gdsicon/vue/minus";
|
|
3
3
|
import PlusIcon from "@gdsicon/vue/plus";
|
|
4
4
|
import { isNil, isNumber, isUndefined } from "es-toolkit";
|
|
5
|
-
import { computed, reactive, watch } from "vue";
|
|
5
|
+
import { computed, reactive, shallowRef, watch } from "vue";
|
|
6
6
|
import { useRepeatAction } from "../../composables/use-repeat-action";
|
|
7
7
|
import { NOOP } from "../../utils/event";
|
|
8
8
|
import PInput from "../input/index.vue";
|
|
@@ -21,6 +21,8 @@ const props = defineProps({
|
|
|
21
21
|
readonly: { type: Boolean, required: false },
|
|
22
22
|
disabled: { type: Boolean, required: false },
|
|
23
23
|
precision: { type: Number, required: false },
|
|
24
|
+
thousands: { type: Boolean, required: false },
|
|
25
|
+
thousandsSeparator: { type: String, required: false, default: "," },
|
|
24
26
|
scientific: { type: Boolean, required: false, default: true },
|
|
25
27
|
clearValue: { type: [Number, null], required: false, default: null },
|
|
26
28
|
modelValue: { type: [Number, null], required: false }
|
|
@@ -35,10 +37,22 @@ const modelValue = computed({
|
|
|
35
37
|
emits("update:modelValue", value);
|
|
36
38
|
}
|
|
37
39
|
});
|
|
40
|
+
const REGEXPS = {
|
|
41
|
+
"remove-leading-zeros": /^(-?)0+(?=\d)/,
|
|
42
|
+
"thousands-separator": /\B(?=(\d{3})+(?!\d))/g
|
|
43
|
+
};
|
|
44
|
+
const isFocused = shallowRef(false);
|
|
38
45
|
const inputData = reactive({
|
|
39
46
|
currentValue: props.modelValue,
|
|
40
47
|
userInput: null
|
|
41
48
|
});
|
|
49
|
+
function formatWithThousands(value) {
|
|
50
|
+
const str = String(value);
|
|
51
|
+
const dotIndex = str.indexOf(".");
|
|
52
|
+
const intPart = dotIndex === -1 ? str : str.slice(0, dotIndex);
|
|
53
|
+
const decPart = dotIndex === -1 ? "" : str.slice(dotIndex);
|
|
54
|
+
return intPart.replace(REGEXPS["thousands-separator"], props.thousandsSeparator) + decPart;
|
|
55
|
+
}
|
|
42
56
|
const inputValue = computed(() => {
|
|
43
57
|
if (inputData.userInput !== null) {
|
|
44
58
|
return inputData.userInput;
|
|
@@ -55,6 +69,9 @@ const inputValue = computed(() => {
|
|
|
55
69
|
currentValue = currentValue.toFixed(props.precision);
|
|
56
70
|
}
|
|
57
71
|
}
|
|
72
|
+
if (props.thousands && !isFocused.value) {
|
|
73
|
+
return formatWithThousands(currentValue);
|
|
74
|
+
}
|
|
58
75
|
return currentValue;
|
|
59
76
|
});
|
|
60
77
|
const decreaseDisabled = computed(
|
|
@@ -138,10 +155,19 @@ function onInputKeydown(ev) {
|
|
|
138
155
|
}
|
|
139
156
|
}
|
|
140
157
|
function onInputFocus(event) {
|
|
158
|
+
isFocused.value = true;
|
|
141
159
|
emits("focus", event);
|
|
142
160
|
}
|
|
143
161
|
function onInputBlur(event) {
|
|
162
|
+
isFocused.value = false;
|
|
144
163
|
inputData.userInput = null;
|
|
164
|
+
if (isNumber(inputData.currentValue)) {
|
|
165
|
+
const clamped = clampToRange(inputData.currentValue);
|
|
166
|
+
if (clamped !== inputData.currentValue) {
|
|
167
|
+
inputData.currentValue = clamped;
|
|
168
|
+
modelValue.value = clamped;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
145
171
|
if (inputData.currentValue === null) {
|
|
146
172
|
;
|
|
147
173
|
event.target.value = "";
|
|
@@ -149,13 +175,17 @@ function onInputBlur(event) {
|
|
|
149
175
|
emits("blur", event);
|
|
150
176
|
}
|
|
151
177
|
function onInputInput(value) {
|
|
152
|
-
|
|
153
|
-
|
|
178
|
+
const normalized = value.replace(REGEXPS["remove-leading-zeros"], "$1");
|
|
179
|
+
inputData.userInput = normalized;
|
|
180
|
+
const newValue = normalized === "" ? null : Number.parseFloat(normalized);
|
|
154
181
|
inputData.currentValue = toPrecision(newValue ?? 0);
|
|
155
182
|
modelValue.value = inputData.currentValue;
|
|
156
183
|
}
|
|
157
184
|
function onInputChange(value, event) {
|
|
158
|
-
|
|
185
|
+
let newValue = toPrecision(value === "" ? null : Number.parseFloat(value));
|
|
186
|
+
if (isNumber(newValue)) {
|
|
187
|
+
newValue = clampToRange(newValue);
|
|
188
|
+
}
|
|
159
189
|
emits("change", newValue, event);
|
|
160
190
|
}
|
|
161
191
|
watch(
|
|
@@ -179,10 +209,10 @@ watch(
|
|
|
179
209
|
input-type="number"
|
|
180
210
|
:disabled="disabled"
|
|
181
211
|
:readonly="readonly"
|
|
182
|
-
:prefix-style="false"
|
|
183
|
-
:suffix-style="false"
|
|
184
212
|
:clear-value="clearValue"
|
|
185
213
|
:model-value="inputValue"
|
|
214
|
+
:default-prefix-style="false"
|
|
215
|
+
:default-suffix-style="false"
|
|
186
216
|
@blur="onInputBlur"
|
|
187
217
|
@focus="onInputFocus"
|
|
188
218
|
@input="onInputInput"
|