pxd 0.0.52 → 0.0.53
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 +6 -3
- package/dist/components/active-graph/index.d.vue.ts +0 -2
- package/dist/components/active-graph/index.vue +35 -37
- package/dist/components/avatar/index.d.vue.ts +2 -2
- package/dist/components/avatar/index.vue +17 -16
- package/dist/components/avatar-group/index.d.vue.ts +1 -1
- package/dist/components/avatar-group/index.vue +4 -1
- package/dist/components/badge/cn.d.ts +90 -0
- package/dist/components/badge/cn.js +44 -0
- package/dist/components/badge/index.d.vue.ts +5 -33
- package/dist/components/badge/index.vue +10 -56
- package/dist/components/book/index.vue +90 -17
- package/dist/components/browser/index.vue +21 -6
- package/dist/components/button/cn.d.ts +121 -0
- package/dist/components/button/cn.js +55 -0
- package/dist/components/button/index.d.vue.ts +8 -14
- package/dist/components/button/index.vue +22 -74
- package/dist/components/carousel-group/index.d.vue.ts +1 -1
- package/dist/components/carousel-group/index.vue +32 -28
- package/dist/components/checkbox/cn.d.ts +67 -0
- package/dist/components/checkbox/cn.js +31 -0
- package/dist/components/checkbox/index.vue +9 -19
- package/dist/components/chip/cn.d.ts +49 -0
- package/dist/components/chip/cn.js +26 -0
- package/dist/components/chip/index.vue +13 -21
- package/dist/components/choicebox/index.vue +1 -1
- package/dist/components/choicebox-group/index.vue +6 -3
- package/dist/components/collapse/index.vue +7 -1
- package/dist/components/collapse-group/index.vue +7 -7
- package/dist/components/command-menu/index.vue +9 -8
- package/dist/components/command-menu-group/index.vue +4 -1
- package/dist/components/config-provider/index.d.vue.ts +1 -0
- package/dist/components/config-provider/index.vue +2 -1
- package/dist/components/countdown/index.vue +2 -10
- package/dist/components/dash-line/index.vue +22 -16
- package/dist/components/description/index.vue +4 -2
- package/dist/components/drawer/index.vue +19 -11
- package/dist/components/empty-state/index.vue +3 -1
- package/dist/components/error/cn.d.ts +22 -0
- package/dist/components/error/cn.js +15 -0
- package/dist/components/error/index.vue +13 -14
- package/dist/components/fader/index.vue +30 -14
- package/dist/components/gauge/index.vue +6 -6
- package/dist/components/grid/index.vue +16 -12
- package/dist/components/grid-item/index.vue +4 -4
- package/dist/components/hold-button/index.vue +19 -13
- package/dist/components/input/cn.d.ts +73 -0
- package/dist/components/input/cn.js +36 -0
- package/dist/components/input/index.d.vue.ts +14 -16
- package/dist/components/input/index.vue +74 -101
- package/dist/components/intersection-observer/index.vue +7 -3
- package/dist/components/kbd/index.vue +2 -2
- package/dist/components/link-button/index.d.vue.ts +8 -8
- package/dist/components/link-button/index.vue +17 -25
- package/dist/components/list/index.d.vue.ts +0 -1
- package/dist/components/list/index.vue +58 -57
- package/dist/components/list-item/cn.d.ts +22 -0
- package/dist/components/list-item/cn.js +15 -0
- package/dist/components/list-item/index.d.vue.ts +3 -3
- package/dist/components/list-item/index.vue +14 -25
- package/dist/components/loading-bar/cn.d.ts +70 -0
- package/dist/components/loading-bar/cn.js +32 -0
- package/dist/components/loading-bar/index.d.vue.ts +2 -0
- package/dist/components/loading-bar/index.vue +68 -61
- package/dist/components/loading-dots/index.vue +12 -4
- package/dist/components/menu/index.d.vue.ts +2 -2
- package/dist/components/menu/index.vue +4 -4
- package/dist/components/message/index.vue +82 -48
- package/dist/components/message-item/index.vue +7 -2
- package/dist/components/modal/index.vue +20 -12
- package/dist/components/more-button/index.d.vue.ts +1 -3
- package/dist/components/more-button/index.vue +7 -17
- package/dist/components/note/cn.d.ts +121 -0
- package/dist/components/note/cn.js +66 -0
- package/dist/components/note/index.d.vue.ts +3 -39
- package/dist/components/note/index.vue +18 -37
- package/dist/components/number-input/index.d.vue.ts +19 -10
- package/dist/components/number-input/index.vue +121 -75
- package/dist/components/overlay/index.vue +4 -20
- package/dist/components/pagination/index.vue +25 -8
- package/dist/components/pin-input/cn.d.ts +46 -0
- package/dist/components/pin-input/cn.js +25 -0
- package/dist/components/pin-input/index.vue +11 -20
- package/dist/components/placeholder/index.vue +11 -4
- package/dist/components/popover/index.d.vue.ts +4 -3
- package/dist/components/popover/index.vue +107 -54
- package/dist/components/progress/cn.d.ts +19 -0
- package/dist/components/progress/cn.js +14 -0
- package/dist/components/progress/index.d.vue.ts +1 -1
- package/dist/components/progress/index.vue +21 -14
- package/dist/components/radio/cn.d.ts +46 -0
- package/dist/components/radio/cn.js +42 -0
- package/dist/components/radio/index.vue +11 -18
- package/dist/components/resizable/index.vue +8 -2
- package/dist/components/resizable-handle/index.vue +1 -0
- package/dist/components/resizable-panel/index.vue +12 -11
- package/dist/components/skeleton/cn.d.ts +43 -0
- package/dist/components/skeleton/cn.js +24 -0
- package/dist/components/skeleton/index.d.vue.ts +4 -3
- package/dist/components/skeleton/index.vue +11 -20
- package/dist/components/slider/index.d.vue.ts +1 -1
- package/dist/components/slider/index.vue +14 -12
- package/dist/components/snippet/cn.d.ts +52 -0
- package/dist/components/snippet/cn.js +27 -0
- package/dist/components/snippet/index.vue +21 -29
- package/dist/components/spinner/index.vue +3 -1
- package/dist/components/stack/cn.d.ts +70 -0
- package/dist/components/stack/cn.js +33 -0
- package/dist/components/stack/index.d.vue.ts +2 -2
- package/dist/components/stack/index.vue +16 -31
- package/dist/components/status-dot/index.vue +5 -1
- package/dist/components/switch/cn.d.ts +16 -0
- package/dist/components/switch/cn.js +13 -0
- package/dist/components/switch/index.vue +5 -11
- package/dist/components/switch-group/index.vue +7 -4
- package/dist/components/text/cn.d.ts +67 -0
- package/dist/components/text/cn.js +34 -0
- package/dist/components/text/index.d.vue.ts +1 -1
- package/dist/components/text/index.vue +16 -25
- package/dist/components/textarea/cn.d.ts +58 -0
- package/dist/components/textarea/cn.js +30 -0
- package/dist/components/textarea/index.d.vue.ts +2 -0
- package/dist/components/textarea/index.vue +17 -24
- package/dist/components/theme-switcher/index.vue +6 -3
- package/dist/components/time-picker/index.d.vue.ts +2 -2
- package/dist/components/time-picker/index.vue +45 -25
- package/dist/components/toggle/index.vue +10 -6
- package/dist/components/tooltip/index.vue +3 -3
- package/dist/components/virtual-list/index.vue +1 -7
- package/dist/composables/use-browser-observer.d.ts +1 -1
- package/dist/composables/use-browser-observer.js +19 -15
- package/dist/composables/use-config-provider-context.d.ts +1 -0
- package/dist/composables/use-config-provider-context.js +5 -10
- package/dist/composables/use-countdown.js +1 -3
- package/dist/composables/use-deferred-value.js +1 -5
- package/dist/composables/use-delay-change.js +1 -4
- package/dist/composables/use-delay-destroy.js +1 -5
- package/dist/composables/use-loading-bar.d.ts +6 -14
- package/dist/composables/use-loading-bar.js +3 -14
- package/dist/composables/use-message.d.ts +9 -3
- package/dist/composables/use-message.js +9 -9
- package/dist/composables/use-model-value.d.ts +1 -0
- package/dist/composables/use-model-value.js +4 -2
- package/dist/composables/use-outside-click.js +12 -8
- package/dist/composables/use-pointer-gesture.js +5 -1
- package/dist/composables/use-toggle-value.js +1 -4
- package/dist/composables/use-virtual-list.js +14 -7
- package/dist/contexts/avatar.js +4 -4
- package/dist/contexts/carousel.js +1 -4
- package/dist/contexts/checkbox.js +1 -4
- package/dist/contexts/choicebox.js +2 -8
- package/dist/contexts/collapse.js +1 -4
- package/dist/contexts/list.js +5 -8
- package/dist/contexts/radio.js +4 -4
- package/dist/contexts/resizable.js +1 -4
- package/dist/contexts/switch.js +2 -8
- package/dist/index.d.ts +1 -0
- package/dist/styles/source.css +106 -59
- package/dist/styles/styles.css +1 -1
- package/dist/styles/tw.css +106 -59
- package/dist/types/components/avatar.d.ts +2 -2
- package/dist/types/components/button.d.ts +11 -4
- package/dist/types/components/index.d.ts +12 -0
- package/dist/types/components/input.d.ts +4 -5
- package/dist/types/components/list.d.ts +1 -1
- package/dist/types/components/switch.d.ts +1 -1
- package/dist/types/shared/props.d.ts +6 -4
- package/dist/types/shared/utils.d.ts +3 -1
- package/dist/utils/context.d.ts +2 -8
- package/dist/utils/date.d.ts +1 -1
- package/dist/utils/date.js +1 -5
- package/dist/utils/event.js +6 -18
- package/dist/utils/format.d.ts +1 -1
- package/dist/utils/format.js +1 -1
- package/dist/utils/is.d.ts +0 -1
- package/dist/utils/is.js +3 -2
- package/dist/utils/responsive.js +7 -4
- package/dist/utils/throttle.js +4 -2
- package/package.json +45 -43
- package/dist/components/_internal/fragment-container.vue.d.ts +0 -13
- package/dist/components/active-graph/index.vue.d.ts +0 -51
- package/dist/components/avatar/index.vue.d.ts +0 -34
- package/dist/components/avatar-group/index.vue.d.ts +0 -8
- package/dist/components/backtop/index.vue.d.ts +0 -21
- package/dist/components/badge/index.vue.d.ts +0 -52
- package/dist/components/book/index.vue.d.ts +0 -28
- package/dist/components/browser/index.vue.d.ts +0 -16
- package/dist/components/button/index.vue.d.ts +0 -29
- package/dist/components/carousel/index.vue.d.ts +0 -13
- package/dist/components/carousel-group/index.vue.d.ts +0 -35
- package/dist/components/checkbox/index.vue.d.ts +0 -26
- package/dist/components/checkbox-group/index.vue.d.ts +0 -28
- package/dist/components/chip/index.vue.d.ts +0 -24
- package/dist/components/choicebox/index.vue.d.ts +0 -16
- package/dist/components/choicebox-group/index.vue.d.ts +0 -24
- package/dist/components/collapse/index.vue.d.ts +0 -22
- package/dist/components/collapse-group/index.vue.d.ts +0 -20
- package/dist/components/command-menu/index.vue.d.ts +0 -42
- package/dist/components/command-menu-group/index.vue.d.ts +0 -17
- package/dist/components/command-menu-item/index.vue.d.ts +0 -13
- package/dist/components/config-provider/index.vue.d.ts +0 -22
- package/dist/components/countdown/index.vue.d.ts +0 -51
- package/dist/components/dash-line/index.vue.d.ts +0 -13
- package/dist/components/description/index.vue.d.ts +0 -20
- package/dist/components/drawer/index.vue.d.ts +0 -60
- package/dist/components/empty-state/index.vue.d.ts +0 -23
- package/dist/components/error/index.vue.d.ts +0 -22
- package/dist/components/fader/index.vue.d.ts +0 -12
- package/dist/components/gauge/index.vue.d.ts +0 -14
- package/dist/components/grid/index.vue.d.ts +0 -19
- package/dist/components/grid-item/index.vue.d.ts +0 -18
- package/dist/components/hold-button/index.vue.d.ts +0 -42
- package/dist/components/input/index.vue.d.ts +0 -55
- package/dist/components/intersection-observer/index.vue.d.ts +0 -39
- package/dist/components/kbd/index.vue.d.ts +0 -24
- package/dist/components/label/index.vue.d.ts +0 -13
- package/dist/components/link-button/index.vue.d.ts +0 -33
- package/dist/components/list/index.vue.d.ts +0 -44
- package/dist/components/list-item/index.vue.d.ts +0 -29
- package/dist/components/loading-bar/index.vue.d.ts +0 -15
- package/dist/components/loading-dots/index.vue.d.ts +0 -15
- package/dist/components/material/index.vue.d.ts +0 -18
- package/dist/components/menu/index.vue.d.ts +0 -33
- package/dist/components/message/index.vue.d.ts +0 -176
- package/dist/components/message-item/index.vue.d.ts +0 -15
- package/dist/components/modal/index.vue.d.ts +0 -58
- package/dist/components/more-button/index.vue.d.ts +0 -20
- package/dist/components/noise-background/index.vue.d.ts +0 -19
- package/dist/components/note/index.vue.d.ts +0 -64
- package/dist/components/number-input/index.vue.d.ts +0 -39
- package/dist/components/overlay/index.vue.d.ts +0 -35
- package/dist/components/pagination/index.vue.d.ts +0 -21
- package/dist/components/pin-input/index.vue.d.ts +0 -28
- package/dist/components/placeholder/index.vue.d.ts +0 -18
- package/dist/components/popover/index.vue.d.ts +0 -73
- package/dist/components/progress/index.vue.d.ts +0 -34
- package/dist/components/radio/index.vue.d.ts +0 -20
- package/dist/components/radio-group/index.vue.d.ts +0 -22
- package/dist/components/resizable/index.vue.d.ts +0 -19
- package/dist/components/resizable-handle/index.vue.d.ts +0 -3
- package/dist/components/resizable-panel/index.vue.d.ts +0 -20
- package/dist/components/scrollable/index.vue.d.ts +0 -0
- package/dist/components/skeleton/index.vue.d.ts +0 -26
- package/dist/components/slider/index.vue.d.ts +0 -26
- package/dist/components/snippet/index.vue.d.ts +0 -18
- package/dist/components/spinner/index.vue.d.ts +0 -3
- package/dist/components/stack/index.vue.d.ts +0 -30
- package/dist/components/status-dot/index.vue.d.ts +0 -11
- package/dist/components/switch/index.vue.d.ts +0 -20
- package/dist/components/switch-group/index.vue.d.ts +0 -23
- package/dist/components/teleport/index.vue.d.ts +0 -21
- package/dist/components/text/index.vue.d.ts +0 -26
- package/dist/components/textarea/index.vue.d.ts +0 -28
- package/dist/components/theme-switcher/index.vue.d.ts +0 -8
- package/dist/components/time-picker/index.vue.d.ts +0 -35
- package/dist/components/toggle/index.vue.d.ts +0 -41
- package/dist/components/tooltip/index.vue.d.ts +0 -32
- package/dist/components/virtual-list/index.vue.d.ts +0 -24
|
@@ -36,9 +36,16 @@ const computedStyle = computed(() => {
|
|
|
36
36
|
}
|
|
37
37
|
|
|
38
38
|
--placeholder-deg: -45deg;
|
|
39
|
-
background:
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
39
|
+
background: linear-gradient(
|
|
40
|
+
var(--placeholder-deg),
|
|
41
|
+
var(--placeholder-color) 12.5%,
|
|
42
|
+
#0000 12.5%,
|
|
43
|
+
#0000 50%,
|
|
44
|
+
var(--placeholder-color) 50%,
|
|
45
|
+
var(--placeholder-color) 62.5%,
|
|
46
|
+
#0000 62.5%,
|
|
47
|
+
#0000 100%
|
|
48
|
+
)
|
|
49
|
+
0 0 / var(--placeholder-gap, 12px) var(--placeholder-gap, 12px) padding-box fixed;
|
|
43
50
|
}
|
|
44
51
|
</style>
|
|
@@ -11,16 +11,16 @@ interface Props {
|
|
|
11
11
|
position?: ComponentPosition;
|
|
12
12
|
showDelay?: number;
|
|
13
13
|
hideDelay?: number;
|
|
14
|
-
enterable?: boolean;
|
|
15
14
|
showArrow?: boolean;
|
|
16
15
|
arrowColor?: string;
|
|
17
|
-
|
|
16
|
+
interactive?: boolean;
|
|
18
17
|
autoPosition?: boolean;
|
|
19
18
|
wrapperClass?: ComponentClass;
|
|
20
19
|
contentClass?: ComponentClass;
|
|
21
20
|
contentStyle?: CSSProperties | string;
|
|
22
21
|
unsetPosition?: boolean;
|
|
23
22
|
transitionType?: 'fade' | 'fade-scale' | 'fade-slide';
|
|
23
|
+
toggleOnTrigger?: boolean;
|
|
24
24
|
closeOnInvisible?: boolean;
|
|
25
25
|
closeOnPressEscape?: boolean;
|
|
26
26
|
lockScrollOnVisible?: boolean;
|
|
@@ -57,10 +57,11 @@ declare const __VLS_base: import("vue").DefineComponent<Props, {
|
|
|
57
57
|
showDelay: number;
|
|
58
58
|
hideDelay: number;
|
|
59
59
|
arrowColor: string;
|
|
60
|
-
|
|
60
|
+
interactive: boolean;
|
|
61
61
|
autoPosition: boolean;
|
|
62
62
|
unsetPosition: boolean;
|
|
63
63
|
transitionType: "fade" | "fade-scale" | "fade-slide";
|
|
64
|
+
toggleOnTrigger: boolean;
|
|
64
65
|
closeOnInvisible: boolean;
|
|
65
66
|
}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
66
67
|
declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
|
|
@@ -8,6 +8,7 @@ import { useOutsideClick } from "../../composables/use-outside-click";
|
|
|
8
8
|
import { debounce } from "../../utils/debounce";
|
|
9
9
|
import { cachedOff, cachedOn, sleep } from "../../utils/event";
|
|
10
10
|
import { getCssUnitValue, toArray } from "../../utils/format";
|
|
11
|
+
import { useConfigProvider } from "../../composables/use-config-provider-context";
|
|
11
12
|
import PTeleport from "../teleport/index.vue";
|
|
12
13
|
defineOptions({
|
|
13
14
|
name: "PPopover",
|
|
@@ -21,18 +22,18 @@ const props = defineProps({
|
|
|
21
22
|
disabled: { type: Boolean, required: false },
|
|
22
23
|
maxWidth: { type: [Number, String], required: false },
|
|
23
24
|
position: { type: null, required: false, default: "bottom" },
|
|
24
|
-
showDelay: { type: Number, required: false, default:
|
|
25
|
-
hideDelay: { type: Number, required: false, default:
|
|
26
|
-
enterable: { type: Boolean, required: false },
|
|
25
|
+
showDelay: { type: Number, required: false, default: 0 },
|
|
26
|
+
hideDelay: { type: Number, required: false, default: 0 },
|
|
27
27
|
showArrow: { type: Boolean, required: false },
|
|
28
28
|
arrowColor: { type: String, required: false, default: "hsl(var(--primary))" },
|
|
29
|
-
|
|
29
|
+
interactive: { type: Boolean, required: false, default: true },
|
|
30
30
|
autoPosition: { type: Boolean, required: false, default: true },
|
|
31
31
|
wrapperClass: { type: [String, Array, Object], required: false },
|
|
32
32
|
contentClass: { type: [String, Array, Object], required: false },
|
|
33
33
|
contentStyle: { type: [Object, String], required: false },
|
|
34
34
|
unsetPosition: { type: Boolean, required: false, default: false },
|
|
35
35
|
transitionType: { type: String, required: false, default: "fade-scale" },
|
|
36
|
+
toggleOnTrigger: { type: Boolean, required: false, default: true },
|
|
36
37
|
closeOnInvisible: { type: Boolean, required: false, default: true },
|
|
37
38
|
closeOnPressEscape: { type: Boolean, required: false },
|
|
38
39
|
lockScrollOnVisible: { type: Boolean, required: false }
|
|
@@ -48,13 +49,11 @@ const localPosition = shallowRef(props.position);
|
|
|
48
49
|
const triggerMethods = computed(() => toArray(props.trigger));
|
|
49
50
|
const wrapperStyle = computed(() => ({
|
|
50
51
|
"z-index": props.zIndex,
|
|
51
|
-
"--popover-bg": props.arrowColor,
|
|
52
|
+
"--popover-arrow-bg": props.arrowColor,
|
|
52
53
|
"--popover-max-width": getCssUnitValue(props.maxWidth)
|
|
53
54
|
}));
|
|
54
|
-
const
|
|
55
|
-
|
|
56
|
-
unlockScroll
|
|
57
|
-
} = useLockScroll();
|
|
55
|
+
const configProvider = useConfigProvider();
|
|
56
|
+
const { lockScroll, unlockScroll } = useLockScroll();
|
|
58
57
|
const {
|
|
59
58
|
render: isRender,
|
|
60
59
|
visible: isVisible,
|
|
@@ -88,13 +87,17 @@ useOutsideClick(wrapperRef, {
|
|
|
88
87
|
const el = ev.target;
|
|
89
88
|
return !(triggerRef.value?.contains(el) || wrapperRef.value?.contains(el));
|
|
90
89
|
},
|
|
91
|
-
onTrigger: debounce(
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
90
|
+
onTrigger: debounce(
|
|
91
|
+
(ev) => {
|
|
92
|
+
emits("outside-click", ev);
|
|
93
|
+
if (triggerMethods.value.includes("manual")) {
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
handlePopoverHide();
|
|
97
|
+
},
|
|
98
|
+
500,
|
|
99
|
+
{ edges: ["leading"] }
|
|
100
|
+
)
|
|
98
101
|
});
|
|
99
102
|
useIntersectionObserver(triggerRef, ([entry]) => {
|
|
100
103
|
if (props.closeOnInvisible && isVisible.value && entry.intersectionRatio === 0) {
|
|
@@ -158,10 +161,13 @@ async function handlePopoverHide(immediate = false) {
|
|
|
158
161
|
clearTimeout(showPopoverTimer);
|
|
159
162
|
showPopoverTimer = null;
|
|
160
163
|
}
|
|
161
|
-
hidePopoverTimer = setTimeout(
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
164
|
+
hidePopoverTimer = setTimeout(
|
|
165
|
+
() => {
|
|
166
|
+
hidePopoverTimer = null;
|
|
167
|
+
resolve();
|
|
168
|
+
},
|
|
169
|
+
immediate ? 0 : props.hideDelay
|
|
170
|
+
);
|
|
165
171
|
});
|
|
166
172
|
await hidePopover();
|
|
167
173
|
if (props.closeOnPressEscape) {
|
|
@@ -186,7 +192,7 @@ async function onTriggerClick(ev) {
|
|
|
186
192
|
if (!triggerMethods.value.includes("click")) {
|
|
187
193
|
return;
|
|
188
194
|
}
|
|
189
|
-
if (isVisible.value && props.
|
|
195
|
+
if (isVisible.value && props.toggleOnTrigger) {
|
|
190
196
|
handlePopoverHide();
|
|
191
197
|
return;
|
|
192
198
|
}
|
|
@@ -234,7 +240,7 @@ function onContentPointerEnter() {
|
|
|
234
240
|
if (props.disabled) {
|
|
235
241
|
return;
|
|
236
242
|
}
|
|
237
|
-
if (!props.
|
|
243
|
+
if (!props.interactive || !isVisible.value) {
|
|
238
244
|
return;
|
|
239
245
|
}
|
|
240
246
|
handlePopoverShow();
|
|
@@ -243,7 +249,7 @@ function onContentPointerLeave() {
|
|
|
243
249
|
if (props.disabled) {
|
|
244
250
|
return;
|
|
245
251
|
}
|
|
246
|
-
if (props.
|
|
252
|
+
if (props.interactive && !triggerMethods.value.includes("hover")) {
|
|
247
253
|
return;
|
|
248
254
|
}
|
|
249
255
|
handlePopoverHide();
|
|
@@ -286,15 +292,16 @@ defineExpose({
|
|
|
286
292
|
:class="wrapperClass"
|
|
287
293
|
:style="wrapperStyle"
|
|
288
294
|
:data-visible="isVisible"
|
|
289
|
-
:data-
|
|
290
|
-
class="pxd-popover--wrapper sm:max-w-(--popover-max-width) absolute isolate z-10 flex max-w-full outline-none data-[
|
|
295
|
+
:data-interactive="interactive"
|
|
296
|
+
class="pxd-popover--wrapper sm:max-w-(--popover-max-width) absolute isolate z-10 flex max-w-full outline-none data-[interactive=false]:pointer-events-none data-[visible=false]:pointer-events-none motion-reduce:data-[visible=false]:hidden"
|
|
291
297
|
@pointerenter="onContentPointerEnter"
|
|
292
298
|
@pointerleave="onContentPointerLeave"
|
|
293
299
|
>
|
|
294
300
|
<div
|
|
295
|
-
class="pxd-popover--container pointer-events-auto relative z-1 w-inherit"
|
|
301
|
+
class="pxd-popover--container pointer-events-auto relative z-1 w-inherit transform-gpu default-animation-duration default-animation-timing-function"
|
|
296
302
|
:data-position="localPosition"
|
|
297
303
|
:data-transition-type="transitionType"
|
|
304
|
+
:data-show-transition="configProvider.popoverShowTransition"
|
|
298
305
|
>
|
|
299
306
|
<i v-if="showArrow" ref="arrayRef" class="pxd-popover--arrow absolute z-1 border-solid" />
|
|
300
307
|
<div class="pxd-popover--content" :class="contentClass" :style="contentStyle">
|
|
@@ -308,55 +315,101 @@ defineExpose({
|
|
|
308
315
|
|
|
309
316
|
<style lang="postcss">
|
|
310
317
|
@keyframes popover-fade-show {
|
|
311
|
-
0% {
|
|
312
|
-
|
|
318
|
+
0% {
|
|
319
|
+
opacity: 0;
|
|
320
|
+
pointer-events: none;
|
|
321
|
+
}
|
|
322
|
+
100% {
|
|
323
|
+
opacity: 1;
|
|
324
|
+
}
|
|
313
325
|
}
|
|
314
326
|
@keyframes popover-fade-hide {
|
|
315
|
-
0% {
|
|
316
|
-
|
|
327
|
+
0% {
|
|
328
|
+
opacity: 1;
|
|
329
|
+
}
|
|
330
|
+
100% {
|
|
331
|
+
opacity: 0;
|
|
332
|
+
pointer-events: none;
|
|
333
|
+
}
|
|
317
334
|
}
|
|
318
335
|
@keyframes popover-fade-scale-show {
|
|
319
|
-
0% {
|
|
320
|
-
|
|
336
|
+
0% {
|
|
337
|
+
transform: scale(0.95);
|
|
338
|
+
opacity: 0;
|
|
339
|
+
pointer-events: none;
|
|
340
|
+
}
|
|
341
|
+
100% {
|
|
342
|
+
transform: scale(1);
|
|
343
|
+
opacity: 1;
|
|
344
|
+
}
|
|
321
345
|
}
|
|
322
346
|
@keyframes popover-fade-scale-hide {
|
|
323
|
-
0% {
|
|
324
|
-
|
|
347
|
+
0% {
|
|
348
|
+
transform: scale(1);
|
|
349
|
+
opacity: 1;
|
|
350
|
+
}
|
|
351
|
+
100% {
|
|
352
|
+
transform: scale(0.95);
|
|
353
|
+
opacity: 0;
|
|
354
|
+
pointer-events: none;
|
|
355
|
+
}
|
|
325
356
|
}
|
|
326
357
|
@keyframes popover-fade-slide-show {
|
|
327
|
-
0% {
|
|
328
|
-
|
|
358
|
+
0% {
|
|
359
|
+
transform: translateY(100%);
|
|
360
|
+
opacity: 0;
|
|
361
|
+
pointer-events: none;
|
|
362
|
+
}
|
|
363
|
+
100% {
|
|
364
|
+
transform: translateY(0);
|
|
365
|
+
opacity: 1;
|
|
366
|
+
}
|
|
329
367
|
}
|
|
330
368
|
@keyframes popover-fade-slide-hide {
|
|
331
|
-
0% {
|
|
332
|
-
|
|
369
|
+
0% {
|
|
370
|
+
transform: translateY(0);
|
|
371
|
+
opacity: 1;
|
|
372
|
+
}
|
|
373
|
+
100% {
|
|
374
|
+
transform: translateY(100%);
|
|
375
|
+
opacity: 0;
|
|
376
|
+
pointer-events: none;
|
|
377
|
+
}
|
|
333
378
|
}
|
|
334
379
|
|
|
335
380
|
.pxd-popover--container {
|
|
336
|
-
|
|
337
|
-
animation
|
|
381
|
+
animation-name: popover-fade-show;
|
|
382
|
+
animation-fill-mode: forwards;
|
|
383
|
+
|
|
384
|
+
&:hover {
|
|
385
|
+
will-change: transform, animation;
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
[data-visible='true'] &[data-show-transition='false'] {
|
|
389
|
+
animation-name: none !important;
|
|
390
|
+
}
|
|
338
391
|
|
|
339
|
-
[data-visible=
|
|
392
|
+
[data-visible='true'] &[data-transition-type='fade'] {
|
|
340
393
|
animation-name: popover-fade-show;
|
|
341
394
|
}
|
|
342
395
|
|
|
343
|
-
[data-visible=
|
|
396
|
+
[data-visible='false'] &[data-transition-type='fade'] {
|
|
344
397
|
animation-name: popover-fade-hide;
|
|
345
398
|
}
|
|
346
399
|
|
|
347
|
-
[data-visible=
|
|
400
|
+
[data-visible='true'] &[data-transition-type='fade-scale'] {
|
|
348
401
|
animation-name: popover-fade-scale-show;
|
|
349
402
|
}
|
|
350
403
|
|
|
351
|
-
[data-visible=
|
|
404
|
+
[data-visible='false'] &[data-transition-type='fade-scale'] {
|
|
352
405
|
animation-name: popover-fade-scale-hide;
|
|
353
406
|
}
|
|
354
407
|
|
|
355
|
-
[data-visible=
|
|
408
|
+
[data-visible='true'] &[data-transition-type='fade-slide'] {
|
|
356
409
|
animation-name: popover-fade-slide-show;
|
|
357
410
|
}
|
|
358
411
|
|
|
359
|
-
[data-visible=
|
|
412
|
+
[data-visible='false'] &[data-transition-type='fade-slide'] {
|
|
360
413
|
animation-name: popover-fade-slide-hide;
|
|
361
414
|
}
|
|
362
415
|
|
|
@@ -381,7 +434,7 @@ defineExpose({
|
|
|
381
434
|
}
|
|
382
435
|
|
|
383
436
|
&[data-position='left'] {
|
|
384
|
-
transform-origin: right center
|
|
437
|
+
transform-origin: right center;
|
|
385
438
|
}
|
|
386
439
|
&[data-position='left-start'] {
|
|
387
440
|
transform-origin: right top;
|
|
@@ -400,12 +453,12 @@ defineExpose({
|
|
|
400
453
|
transform-origin: left bottom;
|
|
401
454
|
}
|
|
402
455
|
|
|
403
|
-
&[data-position=
|
|
404
|
-
&[data-position=
|
|
405
|
-
&[data-position=
|
|
456
|
+
&[data-position='top'] .pxd-popover--arrow,
|
|
457
|
+
&[data-position='top-start'] .pxd-popover--arrow,
|
|
458
|
+
&[data-position='top-end'] .pxd-popover--arrow {
|
|
406
459
|
bottom: -5px;
|
|
407
460
|
border-width: 6px 6px 0;
|
|
408
|
-
border-color: var(--popover-bg) transparent transparent;
|
|
461
|
+
border-color: var(--popover-arrow-bg) transparent transparent;
|
|
409
462
|
}
|
|
410
463
|
|
|
411
464
|
&[data-position='bottom'] .pxd-popover--arrow,
|
|
@@ -413,7 +466,7 @@ defineExpose({
|
|
|
413
466
|
&[data-position='bottom-end'] .pxd-popover--arrow {
|
|
414
467
|
top: -5px;
|
|
415
468
|
border-width: 0 6px 6px;
|
|
416
|
-
border-color: transparent transparent var(--popover-bg);
|
|
469
|
+
border-color: transparent transparent var(--popover-arrow-bg);
|
|
417
470
|
}
|
|
418
471
|
|
|
419
472
|
&[data-position='left'] .pxd-popover--arrow,
|
|
@@ -421,7 +474,7 @@ defineExpose({
|
|
|
421
474
|
&[data-position='left-end'] .pxd-popover--arrow {
|
|
422
475
|
right: -5px;
|
|
423
476
|
border-width: 6px 0 6px 6px;
|
|
424
|
-
border-color: transparent transparent transparent var(--popover-bg);
|
|
477
|
+
border-color: transparent transparent transparent var(--popover-arrow-bg);
|
|
425
478
|
}
|
|
426
479
|
|
|
427
480
|
&[data-position='right'] .pxd-popover--arrow,
|
|
@@ -429,7 +482,7 @@ defineExpose({
|
|
|
429
482
|
&[data-position='right-end'] .pxd-popover--arrow {
|
|
430
483
|
left: -5px;
|
|
431
484
|
border-width: 6px 6px 6px 0;
|
|
432
|
-
border-color: transparent var(--popover-bg) transparent transparent;
|
|
485
|
+
border-color: transparent var(--popover-arrow-bg) transparent transparent;
|
|
433
486
|
}
|
|
434
487
|
}
|
|
435
488
|
</style>
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export declare const progressVariant: import("tailwind-variants").TVReturnType<{
|
|
2
|
+
size: {
|
|
3
|
+
sm: string;
|
|
4
|
+
md: string;
|
|
5
|
+
lg: string;
|
|
6
|
+
};
|
|
7
|
+
}, undefined, "pxd-progress-bar flex-1 shrink-0 overflow-hidden rounded-full bg-gray-200", {
|
|
8
|
+
size: {
|
|
9
|
+
sm: string;
|
|
10
|
+
md: string;
|
|
11
|
+
lg: string;
|
|
12
|
+
};
|
|
13
|
+
}, undefined, import("tailwind-variants").TVReturnType<{
|
|
14
|
+
size: {
|
|
15
|
+
sm: string;
|
|
16
|
+
md: string;
|
|
17
|
+
lg: string;
|
|
18
|
+
};
|
|
19
|
+
}, undefined, "pxd-progress-bar flex-1 shrink-0 overflow-hidden rounded-full bg-gray-200", unknown, unknown, undefined>>;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { tv } from "tailwind-variants";
|
|
2
|
+
export const progressVariant = tv({
|
|
3
|
+
base: "pxd-progress-bar flex-1 shrink-0 overflow-hidden rounded-full bg-gray-200",
|
|
4
|
+
variants: {
|
|
5
|
+
size: {
|
|
6
|
+
sm: "h-2",
|
|
7
|
+
md: "h-2.5",
|
|
8
|
+
lg: "h-3.5"
|
|
9
|
+
}
|
|
10
|
+
},
|
|
11
|
+
defaultVariants: {
|
|
12
|
+
size: "md"
|
|
13
|
+
}
|
|
14
|
+
});
|
|
@@ -20,8 +20,8 @@ declare const __VLS_base: import("vue").DefineComponent<Props, {}, {}, {}, {}, i
|
|
|
20
20
|
"onUpdate:modelValue"?: ((args_0: number) => any) | undefined;
|
|
21
21
|
}>, {
|
|
22
22
|
label: boolean | string | number;
|
|
23
|
-
variant: ComponentVariant | "secondary";
|
|
24
23
|
max: number;
|
|
24
|
+
variant: ComponentVariant | "secondary";
|
|
25
25
|
min: number;
|
|
26
26
|
}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
27
27
|
declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
|
|
@@ -3,7 +3,8 @@ import { computed } from "vue";
|
|
|
3
3
|
import { useConfigProvider } from "../../composables/use-config-provider-context";
|
|
4
4
|
import { useModelValue } from "../../composables/use-model-value";
|
|
5
5
|
import { isTruthyProp } from "../../utils/format";
|
|
6
|
-
import { getColorByThreshold
|
|
6
|
+
import { getColorByThreshold } from "../../utils/get";
|
|
7
|
+
import { progressVariant } from "./cn";
|
|
7
8
|
defineOptions({
|
|
8
9
|
name: "PProgress",
|
|
9
10
|
model: {
|
|
@@ -21,12 +22,7 @@ const props = defineProps({
|
|
|
21
22
|
modelValue: { type: [Number, null], required: false }
|
|
22
23
|
});
|
|
23
24
|
const emits = defineEmits(["change", "update:modelValue"]);
|
|
24
|
-
const
|
|
25
|
-
const SIZES = {
|
|
26
|
-
sm: "h-2",
|
|
27
|
-
md: "h-2.5",
|
|
28
|
-
lg: "h-3.5"
|
|
29
|
-
};
|
|
25
|
+
const configProvider = useConfigProvider();
|
|
30
26
|
const VARIANTS_COLORS = {
|
|
31
27
|
primary: "var(--color-primary)",
|
|
32
28
|
success: "hsl(var(--color-blue-700-value))",
|
|
@@ -47,9 +43,8 @@ const computedLabel = computed(() => {
|
|
|
47
43
|
}
|
|
48
44
|
return false;
|
|
49
45
|
});
|
|
50
|
-
const
|
|
51
|
-
|
|
52
|
-
return classes.join(" ");
|
|
46
|
+
const computedClasses = computed(() => {
|
|
47
|
+
return progressVariant({ size: props.size || configProvider.size });
|
|
53
48
|
});
|
|
54
49
|
const computedColors = computed(() => {
|
|
55
50
|
const { colors, variant } = props;
|
|
@@ -68,12 +63,24 @@ const computedProgressBarStyles = computed(() => {
|
|
|
68
63
|
</script>
|
|
69
64
|
|
|
70
65
|
<template>
|
|
71
|
-
<div
|
|
72
|
-
|
|
73
|
-
|
|
66
|
+
<div
|
|
67
|
+
role="progressbar"
|
|
68
|
+
class="pxd-progress flex w-full items-center"
|
|
69
|
+
:aria-valuenow="progress"
|
|
70
|
+
:aria-valuemin="min"
|
|
71
|
+
:aria-valuemax="max"
|
|
72
|
+
>
|
|
73
|
+
<div :class="computedClasses">
|
|
74
|
+
<div
|
|
75
|
+
class="h-full rounded-inherit motion-safe:transition-all"
|
|
76
|
+
:style="computedProgressBarStyles"
|
|
77
|
+
/>
|
|
74
78
|
</div>
|
|
75
79
|
|
|
76
|
-
<span
|
|
80
|
+
<span
|
|
81
|
+
v-if="computedLabel || $slots.default"
|
|
82
|
+
class="text-sm ml-3 font-mono text-foreground-secondary empty:hidden"
|
|
83
|
+
>
|
|
77
84
|
<slot>
|
|
78
85
|
{{ computedLabel }}
|
|
79
86
|
</slot>
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
export declare const radioVariant: import("tailwind-variants").TVReturnType<{
|
|
2
|
+
checked: {
|
|
3
|
+
true: {
|
|
4
|
+
base: string;
|
|
5
|
+
disabled: string;
|
|
6
|
+
};
|
|
7
|
+
false: {
|
|
8
|
+
base: string;
|
|
9
|
+
disabled: string;
|
|
10
|
+
};
|
|
11
|
+
};
|
|
12
|
+
disabled: {
|
|
13
|
+
true: string;
|
|
14
|
+
false: string;
|
|
15
|
+
};
|
|
16
|
+
}, undefined, "pxd-radio--inner size-4 inline-flex items-center justify-center rounded-full border peer-focus-ring after:content-empty after:size-2 after:scale-40 after:rounded-full after:bg-primary after:opacity-0 peer-checked:after:scale-100 peer-checked:after:opacity-100 motion-safe:transition-colors motion-safe:after:transition-all", {
|
|
17
|
+
checked: {
|
|
18
|
+
true: {
|
|
19
|
+
base: string;
|
|
20
|
+
disabled: string;
|
|
21
|
+
};
|
|
22
|
+
false: {
|
|
23
|
+
base: string;
|
|
24
|
+
disabled: string;
|
|
25
|
+
};
|
|
26
|
+
};
|
|
27
|
+
disabled: {
|
|
28
|
+
true: string;
|
|
29
|
+
false: string;
|
|
30
|
+
};
|
|
31
|
+
}, undefined, import("tailwind-variants").TVReturnType<{
|
|
32
|
+
checked: {
|
|
33
|
+
true: {
|
|
34
|
+
base: string;
|
|
35
|
+
disabled: string;
|
|
36
|
+
};
|
|
37
|
+
false: {
|
|
38
|
+
base: string;
|
|
39
|
+
disabled: string;
|
|
40
|
+
};
|
|
41
|
+
};
|
|
42
|
+
disabled: {
|
|
43
|
+
true: string;
|
|
44
|
+
false: string;
|
|
45
|
+
};
|
|
46
|
+
}, undefined, "pxd-radio--inner size-4 inline-flex items-center justify-center rounded-full border peer-focus-ring after:content-empty after:size-2 after:scale-40 after:rounded-full after:bg-primary after:opacity-0 peer-checked:after:scale-100 peer-checked:after:opacity-100 motion-safe:transition-colors motion-safe:after:transition-all", unknown, unknown, undefined>>;
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { tv } from "tailwind-variants";
|
|
2
|
+
export const radioVariant = tv({
|
|
3
|
+
base: "pxd-radio--inner size-4 inline-flex items-center justify-center rounded-full border peer-focus-ring after:content-empty after:size-2 after:scale-40 after:rounded-full after:bg-primary after:opacity-0 peer-checked:after:scale-100 peer-checked:after:opacity-100 motion-safe:transition-colors motion-safe:after:transition-all",
|
|
4
|
+
variants: {
|
|
5
|
+
checked: {
|
|
6
|
+
true: {
|
|
7
|
+
base: "border-primary bg-background-100 peer-checked:after:scale-100",
|
|
8
|
+
disabled: "border-gray-500 bg-gray-100 peer-disabled:after:bg-gray-500"
|
|
9
|
+
},
|
|
10
|
+
false: {
|
|
11
|
+
base: "border-gray-alpha-400 bg-background-100 group-hover/radio:bg-gray-200",
|
|
12
|
+
disabled: "border-gray-500 bg-gray-100"
|
|
13
|
+
}
|
|
14
|
+
},
|
|
15
|
+
disabled: {
|
|
16
|
+
true: "",
|
|
17
|
+
false: ""
|
|
18
|
+
}
|
|
19
|
+
},
|
|
20
|
+
compoundVariants: [
|
|
21
|
+
{
|
|
22
|
+
checked: true,
|
|
23
|
+
disabled: false,
|
|
24
|
+
class: "border-primary bg-background-100 peer-checked:after:scale-100"
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
checked: true,
|
|
28
|
+
disabled: true,
|
|
29
|
+
class: "border-gray-500 bg-gray-100 peer-disabled:after:bg-gray-500"
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
checked: false,
|
|
33
|
+
disabled: false,
|
|
34
|
+
class: "border-gray-alpha-400 bg-background-100 group-hover/radio:bg-gray-200"
|
|
35
|
+
},
|
|
36
|
+
{ checked: false, disabled: true, class: "border-gray-500 bg-gray-100" }
|
|
37
|
+
],
|
|
38
|
+
defaultVariants: {
|
|
39
|
+
checked: false,
|
|
40
|
+
disabled: false
|
|
41
|
+
}
|
|
42
|
+
});
|
|
@@ -4,6 +4,7 @@ import { useModelValue } from "../../composables/use-model-value";
|
|
|
4
4
|
import { useUniqueId } from "../../composables/use-unique-id-context";
|
|
5
5
|
import { useRadioGroupContext } from "../../contexts/radio";
|
|
6
6
|
import { getUniqueId } from "../../utils/uid";
|
|
7
|
+
import { radioVariant } from "./cn";
|
|
7
8
|
defineOptions({
|
|
8
9
|
name: "PRadio",
|
|
9
10
|
model: {
|
|
@@ -23,24 +24,16 @@ const uniqueId = getUniqueId();
|
|
|
23
24
|
const modelValue = useModelValue(props, emits);
|
|
24
25
|
const radioGroupName = useUniqueId("RadioGroupName");
|
|
25
26
|
const radioGroupContext = useRadioGroupContext();
|
|
26
|
-
const isChecked = computed(
|
|
27
|
+
const isChecked = computed(
|
|
28
|
+
() => (radioGroupContext?.modelValue ?? modelValue.value) === props.value
|
|
29
|
+
);
|
|
27
30
|
const computedDisabled = computed(() => props.disabled || radioGroupContext?.disabled);
|
|
28
31
|
const computedRequired = computed(() => props.required || radioGroupContext?.required);
|
|
29
|
-
const
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
if (isChecked.value) {
|
|
35
|
-
classes.push(
|
|
36
|
-
computedDisabled.value ? "bg-gray-100 border-gray-500 peer-disabled:after:bg-gray-500" : "bg-background-100 border-primary peer-checked:after:scale-100"
|
|
37
|
-
);
|
|
38
|
-
} else {
|
|
39
|
-
classes.push(
|
|
40
|
-
computedDisabled.value ? "bg-gray-100 border-gray-500" : "bg-background-100 border-gray-alpha-400 group-hover/radio:bg-gray-200"
|
|
41
|
-
);
|
|
42
|
-
}
|
|
43
|
-
return classes.join(" ");
|
|
32
|
+
const computedClasses = computed(() => {
|
|
33
|
+
return radioVariant({
|
|
34
|
+
checked: isChecked.value,
|
|
35
|
+
disabled: computedDisabled.value
|
|
36
|
+
});
|
|
44
37
|
});
|
|
45
38
|
function onChangeValue() {
|
|
46
39
|
emits("update:modelValue", props.value);
|
|
@@ -66,9 +59,9 @@ function onChangeValue() {
|
|
|
66
59
|
:required="computedRequired"
|
|
67
60
|
:disabled="computedDisabled"
|
|
68
61
|
@change="onChangeValue"
|
|
69
|
-
|
|
62
|
+
/>
|
|
70
63
|
|
|
71
|
-
<span aria-hidden="true" :class="
|
|
64
|
+
<span aria-hidden="true" :class="computedClasses" />
|
|
72
65
|
|
|
73
66
|
<span class="text-sm flex-1 shrink-0 empty:hidden">
|
|
74
67
|
<slot>
|
|
@@ -17,7 +17,10 @@ function registerPanel(config) {
|
|
|
17
17
|
if (existingIndex === -1) {
|
|
18
18
|
panelConfigs.value.push({ ...config, order: orderCounter.value++ });
|
|
19
19
|
} else {
|
|
20
|
-
panelConfigs.value[existingIndex] = {
|
|
20
|
+
panelConfigs.value[existingIndex] = {
|
|
21
|
+
...config,
|
|
22
|
+
order: panelConfigs.value[existingIndex].order
|
|
23
|
+
};
|
|
21
24
|
}
|
|
22
25
|
panelConfigs.value.sort((a, b) => a.order - b.order);
|
|
23
26
|
nextTick(() => {
|
|
@@ -36,7 +39,10 @@ function registerHandle(config) {
|
|
|
36
39
|
if (existingIndex === -1) {
|
|
37
40
|
handleConfigs.value.push({ ...config, order: orderCounter.value++ });
|
|
38
41
|
} else {
|
|
39
|
-
handleConfigs.value[existingIndex] = {
|
|
42
|
+
handleConfigs.value[existingIndex] = {
|
|
43
|
+
...config,
|
|
44
|
+
order: handleConfigs.value[existingIndex].order
|
|
45
|
+
};
|
|
40
46
|
}
|
|
41
47
|
handleConfigs.value.sort((a, b) => a.order - b.order);
|
|
42
48
|
}
|