vuetify 3.3.19 → 3.3.21
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/dist/json/attributes.json +43 -31
- package/dist/json/importMap-labs.json +4 -4
- package/dist/json/importMap.json +4 -4
- package/dist/json/tags.json +3 -0
- package/dist/json/web-types.json +97 -70
- package/dist/vuetify-labs.css +5073 -5056
- package/dist/vuetify-labs.d.ts +240 -220
- package/dist/vuetify-labs.esm.js +101 -62
- package/dist/vuetify-labs.esm.js.map +1 -1
- package/dist/vuetify-labs.js +101 -62
- package/dist/vuetify-labs.min.css +2 -2
- package/dist/vuetify.css +5452 -5440
- package/dist/vuetify.d.ts +168 -166
- package/dist/vuetify.esm.js +56 -41
- package/dist/vuetify.esm.js.map +1 -1
- package/dist/vuetify.js +56 -41
- package/dist/vuetify.js.map +1 -1
- package/dist/vuetify.min.css +2 -2
- package/dist/vuetify.min.js +775 -773
- package/dist/vuetify.min.js.map +1 -1
- package/lib/blueprints/index.d.mts +2 -0
- package/lib/blueprints/md1.d.mts +2 -0
- package/lib/blueprints/md2.d.mts +2 -0
- package/lib/blueprints/md3.d.mts +2 -0
- package/lib/components/VAutocomplete/index.d.mts +14 -14
- package/lib/components/VCheckbox/index.d.mts +8 -8
- package/lib/components/VChip/VChip.css +67 -67
- package/lib/components/VChip/_variables.scss +1 -1
- package/lib/components/VColorPicker/VColorPickerCanvas.mjs +1 -0
- package/lib/components/VColorPicker/VColorPickerCanvas.mjs.map +1 -1
- package/lib/components/VCombobox/VCombobox.mjs +1 -1
- package/lib/components/VCombobox/VCombobox.mjs.map +1 -1
- package/lib/components/VCombobox/index.d.mts +14 -14
- package/lib/components/VField/VField.css +3 -0
- package/lib/components/VField/VField.sass +3 -0
- package/lib/components/VField/_variables.scss +1 -0
- package/lib/components/VFileInput/index.d.mts +20 -20
- package/lib/components/VInput/index.d.mts +8 -8
- package/lib/components/VList/VList.css +0 -3
- package/lib/components/VList/VList.sass +0 -4
- package/lib/components/VList/VListItem.css +9 -1
- package/lib/components/VList/VListItem.sass +12 -1
- package/lib/components/VNavigationDrawer/VNavigationDrawer.mjs +8 -7
- package/lib/components/VNavigationDrawer/VNavigationDrawer.mjs.map +1 -1
- package/lib/components/VRadioGroup/index.d.mts +8 -8
- package/lib/components/VRangeSlider/index.d.mts +8 -8
- package/lib/components/VSelect/index.d.mts +14 -14
- package/lib/components/VSlider/VSliderThumb.css +2 -0
- package/lib/components/VSlider/VSliderThumb.mjs +7 -6
- package/lib/components/VSlider/VSliderThumb.mjs.map +1 -1
- package/lib/components/VSlider/VSliderThumb.sass +2 -0
- package/lib/components/VSlider/VSliderTrack.mjs +5 -7
- package/lib/components/VSlider/VSliderTrack.mjs.map +1 -1
- package/lib/components/VSlider/index.d.mts +8 -8
- package/lib/components/VSlider/slider.mjs +4 -10
- package/lib/components/VSlider/slider.mjs.map +1 -1
- package/lib/components/VSwitch/index.d.mts +8 -8
- package/lib/components/VTable/VTable.css +3 -0
- package/lib/components/VTable/VTable.sass +3 -0
- package/lib/components/VTextField/VTextField.mjs +1 -1
- package/lib/components/VTextField/VTextField.mjs.map +1 -1
- package/lib/components/VTextField/index.d.mts +26 -26
- package/lib/components/VTextarea/index.d.mts +20 -20
- package/lib/components/VTimeline/VTimeline.css +0 -1
- package/lib/components/VTimeline/VTimeline.sass +0 -1
- package/lib/components/VValidation/index.d.mts +8 -8
- package/lib/components/index.d.mts +164 -164
- package/lib/composables/forwardRefs.mjs +4 -4
- package/lib/composables/forwardRefs.mjs.map +1 -1
- package/lib/composables/validation.mjs +2 -2
- package/lib/composables/validation.mjs.map +1 -1
- package/lib/entry-bundler.mjs +1 -1
- package/lib/framework.mjs +1 -1
- package/lib/index.d.mts +4 -2
- package/lib/labs/VDataTable/VDataTableFooter.mjs +12 -4
- package/lib/labs/VDataTable/VDataTableFooter.mjs.map +1 -1
- package/lib/labs/VDataTable/VDataTableVirtual.mjs +5 -5
- package/lib/labs/VDataTable/VDataTableVirtual.mjs.map +1 -1
- package/lib/labs/VDataTable/composables/select.mjs +6 -6
- package/lib/labs/VDataTable/composables/select.mjs.map +1 -1
- package/lib/labs/VDataTable/index.d.mts +48 -48
- package/lib/labs/VDateInput/index.d.mts +14 -14
- package/lib/labs/VDatePicker/VDatePickerMonth.mjs +14 -2
- package/lib/labs/VDatePicker/VDatePickerMonth.mjs.map +1 -1
- package/lib/labs/VDatePicker/index.d.mts +18 -0
- package/lib/labs/VDateRangePicker/index.d.mts +12 -0
- package/lib/labs/VOtpInput/VOtpInput.css +3 -2
- package/lib/labs/VOtpInput/VOtpInput.mjs +7 -4
- package/lib/labs/VOtpInput/VOtpInput.mjs.map +1 -1
- package/lib/labs/VOtpInput/VOtpInput.sass +9 -8
- package/lib/labs/VOtpInput/_variables.scss +9 -0
- package/lib/labs/VSkeletonLoader/VSkeletonLoader.css +4 -0
- package/lib/labs/VSkeletonLoader/VSkeletonLoader.mjs +2 -1
- package/lib/labs/VSkeletonLoader/VSkeletonLoader.mjs.map +1 -1
- package/lib/labs/VSkeletonLoader/VSkeletonLoader.sass +4 -0
- package/lib/labs/VSkeletonLoader/index.d.mts +8 -8
- package/lib/labs/components.d.mts +74 -56
- package/lib/labs/date/DateAdapter.mjs.map +1 -1
- package/lib/labs/date/adapters/vuetify.d.mts +4 -0
- package/lib/labs/date/adapters/vuetify.mjs +18 -1
- package/lib/labs/date/adapters/vuetify.mjs.map +1 -1
- package/lib/labs/date/date.mjs +1 -1
- package/lib/labs/date/date.mjs.map +1 -1
- package/lib/labs/date/index.d.mts +4 -0
- package/package.json +2 -2
|
@@ -338,6 +338,7 @@ declare const VDateCard: {
|
|
|
338
338
|
"onUpdate:displayDate"?: ((value: any) => any) | undefined;
|
|
339
339
|
"onUpdate:inputMode"?: ((value: any) => any) | undefined;
|
|
340
340
|
"onUpdate:viewMode"?: ((mode: "month" | "year") => any) | undefined;
|
|
341
|
+
allowedDates?: Function | unknown[] | undefined;
|
|
341
342
|
hoverDate?: any;
|
|
342
343
|
onCancel?: (() => any) | undefined;
|
|
343
344
|
onSave?: (() => any) | undefined;
|
|
@@ -618,6 +619,7 @@ declare const VDateCard: {
|
|
|
618
619
|
format?: string | undefined;
|
|
619
620
|
side?: string | undefined;
|
|
620
621
|
displayDate?: any;
|
|
622
|
+
allowedDates?: Function | unknown[] | undefined;
|
|
621
623
|
hoverDate?: any;
|
|
622
624
|
} & {
|
|
623
625
|
$children?: vue.VNodeChild | (() => vue.VNodeChild) | {
|
|
@@ -1180,6 +1182,7 @@ declare const VDateCard: {
|
|
|
1180
1182
|
format?: string | undefined;
|
|
1181
1183
|
side?: string | undefined;
|
|
1182
1184
|
displayDate?: any;
|
|
1185
|
+
allowedDates?: Function | unknown[] | undefined;
|
|
1183
1186
|
hoverDate?: any;
|
|
1184
1187
|
} & {
|
|
1185
1188
|
$children?: vue.VNodeChild | (() => vue.VNodeChild) | {
|
|
@@ -1462,6 +1465,7 @@ declare const VDateCard: {
|
|
|
1462
1465
|
format?: string | undefined;
|
|
1463
1466
|
side?: string | undefined;
|
|
1464
1467
|
displayDate?: any;
|
|
1468
|
+
allowedDates?: Function | unknown[] | undefined;
|
|
1465
1469
|
hoverDate?: any;
|
|
1466
1470
|
} & {
|
|
1467
1471
|
$children?: vue.VNodeChild | (() => vue.VNodeChild) | {
|
|
@@ -2209,6 +2213,7 @@ declare const VDateCard: {
|
|
|
2209
2213
|
type: PropType<any[]>;
|
|
2210
2214
|
default: () => never[];
|
|
2211
2215
|
};
|
|
2216
|
+
allowedDates: (FunctionConstructor | ArrayConstructor)[];
|
|
2212
2217
|
showAdjacentMonths: BooleanConstructor;
|
|
2213
2218
|
hideWeekdays: BooleanConstructor;
|
|
2214
2219
|
showWeek: BooleanConstructor;
|
|
@@ -2693,6 +2698,7 @@ declare const VDateCard: {
|
|
|
2693
2698
|
type: PropType<any[]>;
|
|
2694
2699
|
default: () => never[];
|
|
2695
2700
|
};
|
|
2701
|
+
allowedDates: (FunctionConstructor | ArrayConstructor)[];
|
|
2696
2702
|
showAdjacentMonths: BooleanConstructor;
|
|
2697
2703
|
hideWeekdays: BooleanConstructor;
|
|
2698
2704
|
showWeek: BooleanConstructor;
|
|
@@ -2865,6 +2871,7 @@ declare const VDatePicker: {
|
|
|
2865
2871
|
"onUpdate:displayDate"?: ((date: any) => any) | undefined;
|
|
2866
2872
|
"onUpdate:inputMode"?: ((inputMode: "calendar" | "keyboard") => any) | undefined;
|
|
2867
2873
|
"onUpdate:viewMode"?: ((viewMode: "month" | "year") => any) | undefined;
|
|
2874
|
+
allowedDates?: Function | unknown[] | undefined;
|
|
2868
2875
|
hoverDate?: any;
|
|
2869
2876
|
"onClick:cancel"?: (() => any) | undefined;
|
|
2870
2877
|
"onClick:save"?: (() => any) | undefined;
|
|
@@ -2943,6 +2950,7 @@ declare const VDatePicker: {
|
|
|
2943
2950
|
rounded?: string | number | boolean | undefined;
|
|
2944
2951
|
bgColor?: string | undefined;
|
|
2945
2952
|
displayDate?: any;
|
|
2953
|
+
allowedDates?: Function | unknown[] | undefined;
|
|
2946
2954
|
hoverDate?: any;
|
|
2947
2955
|
} & {
|
|
2948
2956
|
$children?: vue.VNodeChild | (() => vue.VNodeChild) | {
|
|
@@ -3099,6 +3107,7 @@ declare const VDatePicker: {
|
|
|
3099
3107
|
rounded?: string | number | boolean | undefined;
|
|
3100
3108
|
bgColor?: string | undefined;
|
|
3101
3109
|
displayDate?: any;
|
|
3110
|
+
allowedDates?: Function | unknown[] | undefined;
|
|
3102
3111
|
hoverDate?: any;
|
|
3103
3112
|
} & {
|
|
3104
3113
|
$children?: vue.VNodeChild | (() => vue.VNodeChild) | {
|
|
@@ -3188,6 +3197,7 @@ declare const VDatePicker: {
|
|
|
3188
3197
|
rounded?: string | number | boolean | undefined;
|
|
3189
3198
|
bgColor?: string | undefined;
|
|
3190
3199
|
displayDate?: any;
|
|
3200
|
+
allowedDates?: Function | unknown[] | undefined;
|
|
3191
3201
|
hoverDate?: any;
|
|
3192
3202
|
} & {
|
|
3193
3203
|
$children?: vue.VNodeChild | (() => vue.VNodeChild) | {
|
|
@@ -3324,6 +3334,7 @@ declare const VDatePicker: {
|
|
|
3324
3334
|
type: vue.PropType<any[]>;
|
|
3325
3335
|
default: () => never[];
|
|
3326
3336
|
};
|
|
3337
|
+
allowedDates: (FunctionConstructor | ArrayConstructor)[];
|
|
3327
3338
|
showAdjacentMonths: BooleanConstructor;
|
|
3328
3339
|
hideWeekdays: BooleanConstructor;
|
|
3329
3340
|
showWeek: BooleanConstructor;
|
|
@@ -3435,6 +3446,7 @@ declare const VDatePicker: {
|
|
|
3435
3446
|
type: vue.PropType<any[]>;
|
|
3436
3447
|
default: () => never[];
|
|
3437
3448
|
};
|
|
3449
|
+
allowedDates: (FunctionConstructor | ArrayConstructor)[];
|
|
3438
3450
|
showAdjacentMonths: BooleanConstructor;
|
|
3439
3451
|
hideWeekdays: BooleanConstructor;
|
|
3440
3452
|
showWeek: BooleanConstructor;
|
|
@@ -4057,6 +4069,7 @@ declare const VDatePickerMonth: {
|
|
|
4057
4069
|
"onUpdate:modelValue"?: ((date: readonly any[]) => any) | undefined;
|
|
4058
4070
|
"onUpdate:focused"?: ((focused: boolean) => any) | undefined;
|
|
4059
4071
|
"onUpdate:displayDate"?: ((date: any) => any) | undefined;
|
|
4072
|
+
allowedDates?: Function | unknown[] | undefined;
|
|
4060
4073
|
hoverDate?: any;
|
|
4061
4074
|
"onUpdate:hoverDate"?: ((date: any) => any) | undefined;
|
|
4062
4075
|
};
|
|
@@ -4088,6 +4101,7 @@ declare const VDatePickerMonth: {
|
|
|
4088
4101
|
min?: string | number | Date | undefined;
|
|
4089
4102
|
format?: string | undefined;
|
|
4090
4103
|
side?: string | undefined;
|
|
4104
|
+
allowedDates?: Function | unknown[] | undefined;
|
|
4091
4105
|
hoverDate?: any;
|
|
4092
4106
|
} & {
|
|
4093
4107
|
$children?: vue.VNodeChild | (() => vue.VNodeChild) | {
|
|
@@ -4153,6 +4167,7 @@ declare const VDatePickerMonth: {
|
|
|
4153
4167
|
min?: string | number | Date | undefined;
|
|
4154
4168
|
format?: string | undefined;
|
|
4155
4169
|
side?: string | undefined;
|
|
4170
|
+
allowedDates?: Function | unknown[] | undefined;
|
|
4156
4171
|
hoverDate?: any;
|
|
4157
4172
|
} & {
|
|
4158
4173
|
$children?: vue.VNodeChild | (() => vue.VNodeChild) | {
|
|
@@ -4185,6 +4200,7 @@ declare const VDatePickerMonth: {
|
|
|
4185
4200
|
min?: string | number | Date | undefined;
|
|
4186
4201
|
format?: string | undefined;
|
|
4187
4202
|
side?: string | undefined;
|
|
4203
|
+
allowedDates?: Function | unknown[] | undefined;
|
|
4188
4204
|
hoverDate?: any;
|
|
4189
4205
|
} & {
|
|
4190
4206
|
$children?: vue.VNodeChild | (() => vue.VNodeChild) | {
|
|
@@ -4227,6 +4243,7 @@ declare const VDatePickerMonth: {
|
|
|
4227
4243
|
type: vue.PropType<any>;
|
|
4228
4244
|
default: null;
|
|
4229
4245
|
};
|
|
4246
|
+
allowedDates: (FunctionConstructor | ArrayConstructor)[];
|
|
4230
4247
|
color: {
|
|
4231
4248
|
type: vue.PropType<string>;
|
|
4232
4249
|
default: string;
|
|
@@ -4251,6 +4268,7 @@ declare const VDatePickerMonth: {
|
|
|
4251
4268
|
type: vue.PropType<any>;
|
|
4252
4269
|
default: null;
|
|
4253
4270
|
};
|
|
4271
|
+
allowedDates: (FunctionConstructor | ArrayConstructor)[];
|
|
4254
4272
|
color: {
|
|
4255
4273
|
type: vue.PropType<string>;
|
|
4256
4274
|
default: string;
|
|
@@ -87,6 +87,7 @@ declare const VDateRangeCard: {
|
|
|
87
87
|
"onUpdate:displayDate"?: ((date: any) => any) | undefined;
|
|
88
88
|
"onUpdate:inputMode"?: ((inputMode: "calendar" | "keyboard") => any) | undefined;
|
|
89
89
|
"onUpdate:viewMode"?: ((viewMode: "month" | "year") => any) | undefined;
|
|
90
|
+
readonly allowedDates?: Function | unknown[] | undefined;
|
|
90
91
|
readonly hoverDate?: any;
|
|
91
92
|
};
|
|
92
93
|
$attrs: {
|
|
@@ -127,6 +128,7 @@ declare const VDateRangeCard: {
|
|
|
127
128
|
type: vue.PropType<any[]>;
|
|
128
129
|
default: () => never[];
|
|
129
130
|
};
|
|
131
|
+
allowedDates: (FunctionConstructor | ArrayConstructor)[];
|
|
130
132
|
showAdjacentMonths: BooleanConstructor;
|
|
131
133
|
hideWeekdays: BooleanConstructor;
|
|
132
134
|
showWeek: BooleanConstructor;
|
|
@@ -236,6 +238,7 @@ declare const VDateRangeCard: {
|
|
|
236
238
|
type: vue.PropType<any[]>;
|
|
237
239
|
default: () => never[];
|
|
238
240
|
};
|
|
241
|
+
allowedDates: (FunctionConstructor | ArrayConstructor)[];
|
|
239
242
|
showAdjacentMonths: BooleanConstructor;
|
|
240
243
|
hideWeekdays: BooleanConstructor;
|
|
241
244
|
showWeek: BooleanConstructor;
|
|
@@ -307,6 +310,7 @@ declare const VDateRangeCard: {
|
|
|
307
310
|
type: vue.PropType<any[]>;
|
|
308
311
|
default: () => never[];
|
|
309
312
|
};
|
|
313
|
+
allowedDates: (FunctionConstructor | ArrayConstructor)[];
|
|
310
314
|
showAdjacentMonths: BooleanConstructor;
|
|
311
315
|
hideWeekdays: BooleanConstructor;
|
|
312
316
|
showWeek: BooleanConstructor;
|
|
@@ -396,6 +400,7 @@ declare const VDateRangeCard: {
|
|
|
396
400
|
type: vue.PropType<any[]>;
|
|
397
401
|
default: () => never[];
|
|
398
402
|
};
|
|
403
|
+
allowedDates: (FunctionConstructor | ArrayConstructor)[];
|
|
399
404
|
showAdjacentMonths: BooleanConstructor;
|
|
400
405
|
hideWeekdays: BooleanConstructor;
|
|
401
406
|
showWeek: BooleanConstructor;
|
|
@@ -457,6 +462,7 @@ declare const VDateRangeCard: {
|
|
|
457
462
|
type: vue.PropType<any[]>;
|
|
458
463
|
default: () => never[];
|
|
459
464
|
};
|
|
465
|
+
allowedDates: (FunctionConstructor | ArrayConstructor)[];
|
|
460
466
|
showAdjacentMonths: BooleanConstructor;
|
|
461
467
|
hideWeekdays: BooleanConstructor;
|
|
462
468
|
showWeek: BooleanConstructor;
|
|
@@ -594,6 +600,7 @@ declare const VDateRangePicker: {
|
|
|
594
600
|
"onUpdate:displayDate"?: ((date: any) => any) | undefined;
|
|
595
601
|
"onUpdate:inputMode"?: ((input: string) => any) | undefined;
|
|
596
602
|
"onUpdate:viewMode"?: ((mode: "month" | "year") => any) | undefined;
|
|
603
|
+
allowedDates?: Function | unknown[] | undefined;
|
|
597
604
|
hoverDate?: any;
|
|
598
605
|
onCancel?: (() => any) | undefined;
|
|
599
606
|
onSave?: ((date: any) => any) | undefined;
|
|
@@ -655,6 +662,7 @@ declare const VDateRangePicker: {
|
|
|
655
662
|
theme?: string | undefined;
|
|
656
663
|
rounded?: string | number | boolean | undefined;
|
|
657
664
|
bgColor?: string | undefined;
|
|
665
|
+
allowedDates?: Function | unknown[] | undefined;
|
|
658
666
|
hoverDate?: any;
|
|
659
667
|
} & {
|
|
660
668
|
$children?: vue.VNodeChild | (() => vue.VNodeChild) | {
|
|
@@ -765,6 +773,7 @@ declare const VDateRangePicker: {
|
|
|
765
773
|
theme?: string | undefined;
|
|
766
774
|
rounded?: string | number | boolean | undefined;
|
|
767
775
|
bgColor?: string | undefined;
|
|
776
|
+
allowedDates?: Function | unknown[] | undefined;
|
|
768
777
|
hoverDate?: any;
|
|
769
778
|
} & {
|
|
770
779
|
$children?: vue.VNodeChild | (() => vue.VNodeChild) | {
|
|
@@ -828,6 +837,7 @@ declare const VDateRangePicker: {
|
|
|
828
837
|
theme?: string | undefined;
|
|
829
838
|
rounded?: string | number | boolean | undefined;
|
|
830
839
|
bgColor?: string | undefined;
|
|
840
|
+
allowedDates?: Function | unknown[] | undefined;
|
|
831
841
|
hoverDate?: any;
|
|
832
842
|
} & {
|
|
833
843
|
$children?: vue.VNodeChild | (() => vue.VNodeChild) | {
|
|
@@ -900,6 +910,7 @@ declare const VDateRangePicker: {
|
|
|
900
910
|
type: vue.PropType<any>;
|
|
901
911
|
default: null;
|
|
902
912
|
};
|
|
913
|
+
allowedDates: (FunctionConstructor | ArrayConstructor)[];
|
|
903
914
|
color: StringConstructor;
|
|
904
915
|
showAdjacentMonths: BooleanConstructor;
|
|
905
916
|
hideWeekdays: {
|
|
@@ -997,6 +1008,7 @@ declare const VDateRangePicker: {
|
|
|
997
1008
|
type: vue.PropType<any>;
|
|
998
1009
|
default: null;
|
|
999
1010
|
};
|
|
1011
|
+
allowedDates: (FunctionConstructor | ArrayConstructor)[];
|
|
1000
1012
|
color: StringConstructor;
|
|
1001
1013
|
showAdjacentMonths: BooleanConstructor;
|
|
1002
1014
|
hideWeekdays: {
|
|
@@ -3,12 +3,11 @@
|
|
|
3
3
|
align-items: center;
|
|
4
4
|
display: flex;
|
|
5
5
|
justify-content: center;
|
|
6
|
-
padding: 0.5rem;
|
|
6
|
+
padding: 0.5rem 0;
|
|
7
7
|
position: relative;
|
|
8
8
|
}
|
|
9
9
|
.v-otp-input .v-field {
|
|
10
10
|
height: 100%;
|
|
11
|
-
margin: 0 0.25rem;
|
|
12
11
|
}
|
|
13
12
|
|
|
14
13
|
.v-otp-input__divider {
|
|
@@ -18,6 +17,7 @@
|
|
|
18
17
|
.v-otp-input__content {
|
|
19
18
|
align-items: center;
|
|
20
19
|
display: flex;
|
|
20
|
+
gap: 0.5rem;
|
|
21
21
|
height: 64px;
|
|
22
22
|
padding: 0.5rem;
|
|
23
23
|
justify-content: center;
|
|
@@ -30,6 +30,7 @@
|
|
|
30
30
|
}
|
|
31
31
|
|
|
32
32
|
.v-otp-input__field {
|
|
33
|
+
color: inherit;
|
|
33
34
|
font-size: 1.25rem;
|
|
34
35
|
height: 100%;
|
|
35
36
|
outline: none;
|
|
@@ -32,7 +32,7 @@ export const makeVOtpInputProps = propsFactory({
|
|
|
32
32
|
placeholder: String,
|
|
33
33
|
type: {
|
|
34
34
|
type: String,
|
|
35
|
-
default: '
|
|
35
|
+
default: 'number'
|
|
36
36
|
},
|
|
37
37
|
...makeDimensionProps(),
|
|
38
38
|
...makeFocusProps(),
|
|
@@ -78,7 +78,7 @@ export const VOtpInput = genericComponent()({
|
|
|
78
78
|
model.value = array;
|
|
79
79
|
let target = null;
|
|
80
80
|
if (focusIndex.value > model.value.length) {
|
|
81
|
-
target = model.value.length
|
|
81
|
+
target = model.value.length;
|
|
82
82
|
} else if (focusIndex.value + 1 !== Number(props.length)) {
|
|
83
83
|
target = 'next';
|
|
84
84
|
} else {
|
|
@@ -103,7 +103,7 @@ export const VOtpInput = genericComponent()({
|
|
|
103
103
|
target = 'prev';
|
|
104
104
|
} else {
|
|
105
105
|
requestAnimationFrame(() => {
|
|
106
|
-
inputRef.value[index]
|
|
106
|
+
inputRef.value[index]?.select();
|
|
107
107
|
});
|
|
108
108
|
}
|
|
109
109
|
}
|
|
@@ -132,6 +132,9 @@ export const VOtpInput = genericComponent()({
|
|
|
132
132
|
}
|
|
133
133
|
provideDefaults({
|
|
134
134
|
VField: {
|
|
135
|
+
color: computed(() => props.color),
|
|
136
|
+
bgColor: computed(() => props.color),
|
|
137
|
+
baseColor: computed(() => props.baseColor),
|
|
135
138
|
disabled: computed(() => props.disabled),
|
|
136
139
|
error: computed(() => props.error),
|
|
137
140
|
variant: computed(() => props.variant)
|
|
@@ -147,7 +150,7 @@ export const VOtpInput = genericComponent()({
|
|
|
147
150
|
watch(focusIndex, val => {
|
|
148
151
|
if (val < 0) return;
|
|
149
152
|
IN_BROWSER && window.requestAnimationFrame(() => {
|
|
150
|
-
inputRef.value[val]
|
|
153
|
+
inputRef.value[val]?.select();
|
|
151
154
|
});
|
|
152
155
|
});
|
|
153
156
|
useRender(() => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VOtpInput.mjs","names":["makeVFieldProps","VField","VOverlay","VProgressCircular","provideDefaults","makeDimensionProps","useDimension","makeFocusProps","useFocus","useLocale","useProxiedModel","computed","ref","watch","filterInputAttrs","focusChild","genericComponent","IN_BROWSER","only","propsFactory","useRender","makeVOtpInputProps","autofocus","Boolean","divider","String","focusAll","label","type","default","length","Number","modelValue","undefined","placeholder","variant","VOtpInput","name","props","emits","finish","val","setup","_ref","attrs","emit","slots","dimensionStyles","isFocused","focus","blur","model","split","join","t","fields","Array","fill","focusIndex","contentRef","inputRef","current","value","onInput","array","slice","target","requestAnimationFrame","onKeydown","e","index","includes","key","preventDefault","select","onPaste","stopPropagation","clipboardData","getData","reset","onFocus","onBlur","disabled","error","scoped","deep","window","rootAttrs","inputAttrs","_createVNode","_mergeProps","class","style","map","_","i","_Fragment","event","loading","loader","some","input"],"sources":["../../../src/labs/VOtpInput/VOtpInput.tsx"],"sourcesContent":["// Styles\nimport './VOtpInput.sass'\n\n// Components\nimport { makeVFieldProps, VField } from '@/components/VField/VField'\nimport { VOverlay } from '@/components/VOverlay/VOverlay'\nimport { VProgressCircular } from '@/components/VProgressCircular/VProgressCircular'\n\n// Composables\nimport { provideDefaults } from '@/composables/defaults'\nimport { makeDimensionProps, useDimension } from '@/composables/dimensions'\nimport { makeFocusProps, useFocus } from '@/composables/focus'\nimport { useLocale } from '@/composables/locale'\nimport { useProxiedModel } from '@/composables/proxiedModel'\n\n// Utilities\nimport { computed, ref, watch } from 'vue'\nimport { filterInputAttrs, focusChild, genericComponent, IN_BROWSER, only, propsFactory, useRender } from '@/util'\n\n// Types\nimport type { PropType } from 'vue'\n\n// Types\nexport type VOtpInputSlots = {\n default: never\n loader: never\n}\n\nexport const makeVOtpInputProps = propsFactory({\n autofocus: Boolean,\n divider: String,\n focusAll: Boolean,\n label: {\n type: String,\n default: '$vuetify.input.otp',\n },\n length: {\n type: [Number, String],\n default: 6,\n },\n modelValue: {\n type: [Number, String],\n default: undefined,\n },\n placeholder: String,\n type: {\n type: String as PropType<'text' | 'password' | 'number'>,\n default: 'text',\n },\n\n ...makeDimensionProps(),\n ...makeFocusProps(),\n ...only(makeVFieldProps({\n variant: 'outlined' as const,\n }), [\n 'baseColor',\n 'bgColor',\n 'class',\n 'color',\n 'disabled',\n 'error',\n 'loading',\n 'rounded',\n 'style',\n 'theme',\n 'variant',\n ]),\n}, 'VOtpInput')\n\nexport const VOtpInput = genericComponent<VOtpInputSlots>()({\n name: 'VOtpInput',\n\n props: makeVOtpInputProps(),\n\n emits: {\n finish: (val: string) => true,\n 'update:focused': (val: boolean) => true,\n 'update:modelValue': (val: string) => true,\n },\n\n setup (props, { attrs, emit, slots }) {\n const { dimensionStyles } = useDimension(props)\n const { isFocused, focus, blur } = useFocus(props)\n const model = useProxiedModel(\n props,\n 'modelValue',\n '',\n val => String(val).split(''),\n val => val.join('')\n )\n const { t } = useLocale()\n\n const fields = computed(() => Array(Number(props.length)).fill(0))\n const focusIndex = ref(-1)\n const contentRef = ref<HTMLElement>()\n const inputRef = ref<HTMLInputElement[]>([])\n const current = computed(() => inputRef.value[focusIndex.value])\n\n function onInput () {\n const array = model.value.slice()\n const value = current.value.value\n\n array[focusIndex.value] = value\n\n model.value = array\n\n let target: any = null\n\n if (focusIndex.value > model.value.length) {\n target = model.value.length + 1\n } else if (focusIndex.value + 1 !== Number(props.length)) {\n target = 'next'\n } else {\n requestAnimationFrame(() => current.value?.blur())\n }\n\n if (target) focusChild(contentRef.value!, target)\n }\n\n function onKeydown (e: KeyboardEvent) {\n const array = model.value.slice()\n const index = focusIndex.value\n let target: 'next' | 'prev' | 'first' | 'last' | number | null = null\n\n if (![\n 'ArrowLeft',\n 'ArrowRight',\n 'Backspace',\n 'Delete',\n ].includes(e.key)) return\n\n e.preventDefault()\n\n if (e.key === 'ArrowLeft') {\n target = 'prev'\n } else if (e.key === 'ArrowRight') {\n target = 'next'\n } else if (['Backspace', 'Delete'].includes(e.key)) {\n array[focusIndex.value] = ''\n\n model.value = array\n\n if (focusIndex.value > 0 && e.key === 'Backspace') {\n target = 'prev'\n } else {\n requestAnimationFrame(() => {\n inputRef.value[index].select()\n })\n }\n }\n\n requestAnimationFrame(() => {\n if (target != null) {\n focusChild(contentRef.value!, target)\n }\n })\n }\n\n function onPaste (index: number, e: ClipboardEvent) {\n e.preventDefault()\n e.stopPropagation()\n\n model.value = (e?.clipboardData?.getData('Text') ?? '').split('')\n\n inputRef.value?.[index].blur()\n }\n\n function reset () {\n model.value = []\n }\n\n function onFocus (e: FocusEvent, index: number) {\n focus()\n\n focusIndex.value = index\n }\n\n function onBlur () {\n blur()\n\n focusIndex.value = -1\n }\n\n provideDefaults({\n VField: {\n disabled: computed(() => props.disabled),\n error: computed(() => props.error),\n variant: computed(() => props.variant),\n },\n }, { scoped: true })\n\n watch(model, val => {\n if (val.length === Number(props.length)) emit('finish', val.join(''))\n }, { deep: true })\n\n watch(focusIndex, val => {\n if (val < 0) return\n\n IN_BROWSER && window.requestAnimationFrame(() => {\n inputRef.value[val].select()\n })\n })\n\n useRender(() => {\n const [rootAttrs, inputAttrs] = filterInputAttrs(attrs)\n\n return (\n <div\n class={[\n 'v-otp-input',\n {\n 'v-otp-input--divided': !!props.divider,\n },\n props.class,\n ]}\n style={[\n props.style,\n ]}\n { ...rootAttrs }\n >\n <div\n ref={ contentRef }\n class=\"v-otp-input__content\"\n style={[\n dimensionStyles.value,\n ]}\n >\n { fields.value.map((_, i) => (\n <>\n { props.divider && i !== 0 && (\n <span class=\"v-otp-input__divider\">{ props.divider }</span>\n )}\n\n <VField\n focused={ (isFocused.value && props.focusAll) || focusIndex.value === i }\n key={ i }\n >\n {{\n ...slots,\n default: () => {\n return (\n <input\n ref={ val => inputRef.value[i] = val as HTMLInputElement }\n aria-label={ t(props.label, i + 1) }\n autofocus={ i === 0 && props.autofocus }\n autocomplete=\"one-time-code\"\n class={[\n 'v-otp-input__field',\n ]}\n inputmode=\"text\"\n min={ props.type === 'number' ? 0 : undefined }\n maxlength=\"1\"\n placeholder={ props.placeholder }\n type={ props.type }\n value={ model.value[i] }\n onInput={ onInput }\n onFocus={ e => onFocus(e, i) }\n onBlur={ onBlur }\n onKeydown={ onKeydown }\n onPaste={ event => onPaste(i, event) }\n />\n )\n },\n }}\n </VField>\n </>\n ))}\n\n <input\n class=\"v-otp-input-input\"\n type=\"hidden\"\n { ...inputAttrs }\n value={ model.value.join('') }\n />\n\n <VOverlay\n contained\n content-class=\"v-otp-input__loader\"\n model-value={ !!props.loading }\n persistent\n >\n { slots.loader?.() ?? (\n <VProgressCircular\n color={ typeof props.loading === 'boolean' ? undefined : props.loading }\n indeterminate\n size=\"24\"\n width=\"2\"\n />\n )}\n </VOverlay>\n\n { slots.default?.() }\n </div>\n </div>\n )\n })\n\n return {\n blur: () => {\n inputRef.value?.some(input => input.blur())\n },\n focus: () => {\n inputRef.value?.[0].focus()\n },\n reset,\n isFocused,\n }\n },\n})\n\nexport type VOtpInput = InstanceType<typeof VOtpInput>\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"VOtpInput.mjs","names":["makeVFieldProps","VField","VOverlay","VProgressCircular","provideDefaults","makeDimensionProps","useDimension","makeFocusProps","useFocus","useLocale","useProxiedModel","computed","ref","watch","filterInputAttrs","focusChild","genericComponent","IN_BROWSER","only","propsFactory","useRender","makeVOtpInputProps","autofocus","Boolean","divider","String","focusAll","label","type","default","length","Number","modelValue","undefined","placeholder","variant","VOtpInput","name","props","emits","finish","val","setup","_ref","attrs","emit","slots","dimensionStyles","isFocused","focus","blur","model","split","join","t","fields","Array","fill","focusIndex","contentRef","inputRef","current","value","onInput","array","slice","target","requestAnimationFrame","onKeydown","e","index","includes","key","preventDefault","select","onPaste","stopPropagation","clipboardData","getData","reset","onFocus","onBlur","color","bgColor","baseColor","disabled","error","scoped","deep","window","rootAttrs","inputAttrs","_createVNode","_mergeProps","class","style","map","_","i","_Fragment","event","loading","loader","some","input"],"sources":["../../../src/labs/VOtpInput/VOtpInput.tsx"],"sourcesContent":["// Styles\nimport './VOtpInput.sass'\n\n// Components\nimport { makeVFieldProps, VField } from '@/components/VField/VField'\nimport { VOverlay } from '@/components/VOverlay/VOverlay'\nimport { VProgressCircular } from '@/components/VProgressCircular/VProgressCircular'\n\n// Composables\nimport { provideDefaults } from '@/composables/defaults'\nimport { makeDimensionProps, useDimension } from '@/composables/dimensions'\nimport { makeFocusProps, useFocus } from '@/composables/focus'\nimport { useLocale } from '@/composables/locale'\nimport { useProxiedModel } from '@/composables/proxiedModel'\n\n// Utilities\nimport { computed, ref, watch } from 'vue'\nimport { filterInputAttrs, focusChild, genericComponent, IN_BROWSER, only, propsFactory, useRender } from '@/util'\n\n// Types\nimport type { PropType } from 'vue'\n\n// Types\nexport type VOtpInputSlots = {\n default: never\n loader: never\n}\n\nexport const makeVOtpInputProps = propsFactory({\n autofocus: Boolean,\n divider: String,\n focusAll: Boolean,\n label: {\n type: String,\n default: '$vuetify.input.otp',\n },\n length: {\n type: [Number, String],\n default: 6,\n },\n modelValue: {\n type: [Number, String],\n default: undefined,\n },\n placeholder: String,\n type: {\n type: String as PropType<'text' | 'password' | 'number'>,\n default: 'number',\n },\n\n ...makeDimensionProps(),\n ...makeFocusProps(),\n ...only(makeVFieldProps({\n variant: 'outlined' as const,\n }), [\n 'baseColor',\n 'bgColor',\n 'class',\n 'color',\n 'disabled',\n 'error',\n 'loading',\n 'rounded',\n 'style',\n 'theme',\n 'variant',\n ]),\n}, 'VOtpInput')\n\nexport const VOtpInput = genericComponent<VOtpInputSlots>()({\n name: 'VOtpInput',\n\n props: makeVOtpInputProps(),\n\n emits: {\n finish: (val: string) => true,\n 'update:focused': (val: boolean) => true,\n 'update:modelValue': (val: string) => true,\n },\n\n setup (props, { attrs, emit, slots }) {\n const { dimensionStyles } = useDimension(props)\n const { isFocused, focus, blur } = useFocus(props)\n const model = useProxiedModel(\n props,\n 'modelValue',\n '',\n val => String(val).split(''),\n val => val.join('')\n )\n const { t } = useLocale()\n\n const fields = computed(() => Array(Number(props.length)).fill(0))\n const focusIndex = ref(-1)\n const contentRef = ref<HTMLElement>()\n const inputRef = ref<HTMLInputElement[]>([])\n const current = computed(() => inputRef.value[focusIndex.value])\n\n function onInput () {\n const array = model.value.slice()\n const value = current.value.value\n\n array[focusIndex.value] = value\n\n model.value = array\n\n let target: any = null\n\n if (focusIndex.value > model.value.length) {\n target = model.value.length\n } else if (focusIndex.value + 1 !== Number(props.length)) {\n target = 'next'\n } else {\n requestAnimationFrame(() => current.value?.blur())\n }\n\n if (target) focusChild(contentRef.value!, target)\n }\n\n function onKeydown (e: KeyboardEvent) {\n const array = model.value.slice()\n const index = focusIndex.value\n let target: 'next' | 'prev' | 'first' | 'last' | number | null = null\n\n if (![\n 'ArrowLeft',\n 'ArrowRight',\n 'Backspace',\n 'Delete',\n ].includes(e.key)) return\n\n e.preventDefault()\n\n if (e.key === 'ArrowLeft') {\n target = 'prev'\n } else if (e.key === 'ArrowRight') {\n target = 'next'\n } else if (['Backspace', 'Delete'].includes(e.key)) {\n array[focusIndex.value] = ''\n\n model.value = array\n\n if (focusIndex.value > 0 && e.key === 'Backspace') {\n target = 'prev'\n } else {\n requestAnimationFrame(() => {\n inputRef.value[index]?.select()\n })\n }\n }\n\n requestAnimationFrame(() => {\n if (target != null) {\n focusChild(contentRef.value!, target)\n }\n })\n }\n\n function onPaste (index: number, e: ClipboardEvent) {\n e.preventDefault()\n e.stopPropagation()\n\n model.value = (e?.clipboardData?.getData('Text') ?? '').split('')\n\n inputRef.value?.[index].blur()\n }\n\n function reset () {\n model.value = []\n }\n\n function onFocus (e: FocusEvent, index: number) {\n focus()\n\n focusIndex.value = index\n }\n\n function onBlur () {\n blur()\n\n focusIndex.value = -1\n }\n\n provideDefaults({\n VField: {\n color: computed(() => props.color),\n bgColor: computed(() => props.color),\n baseColor: computed(() => props.baseColor),\n disabled: computed(() => props.disabled),\n error: computed(() => props.error),\n variant: computed(() => props.variant),\n },\n }, { scoped: true })\n\n watch(model, val => {\n if (val.length === Number(props.length)) emit('finish', val.join(''))\n }, { deep: true })\n\n watch(focusIndex, val => {\n if (val < 0) return\n\n IN_BROWSER && window.requestAnimationFrame(() => {\n inputRef.value[val]?.select()\n })\n })\n\n useRender(() => {\n const [rootAttrs, inputAttrs] = filterInputAttrs(attrs)\n\n return (\n <div\n class={[\n 'v-otp-input',\n {\n 'v-otp-input--divided': !!props.divider,\n },\n props.class,\n ]}\n style={[\n props.style,\n ]}\n { ...rootAttrs }\n >\n <div\n ref={ contentRef }\n class=\"v-otp-input__content\"\n style={[\n dimensionStyles.value,\n ]}\n >\n { fields.value.map((_, i) => (\n <>\n { props.divider && i !== 0 && (\n <span class=\"v-otp-input__divider\">{ props.divider }</span>\n )}\n\n <VField\n focused={ (isFocused.value && props.focusAll) || focusIndex.value === i }\n key={ i }\n >\n {{\n ...slots,\n default: () => {\n return (\n <input\n ref={ val => inputRef.value[i] = val as HTMLInputElement }\n aria-label={ t(props.label, i + 1) }\n autofocus={ i === 0 && props.autofocus }\n autocomplete=\"one-time-code\"\n class={[\n 'v-otp-input__field',\n ]}\n inputmode=\"text\"\n min={ props.type === 'number' ? 0 : undefined }\n maxlength=\"1\"\n placeholder={ props.placeholder }\n type={ props.type }\n value={ model.value[i] }\n onInput={ onInput }\n onFocus={ e => onFocus(e, i) }\n onBlur={ onBlur }\n onKeydown={ onKeydown }\n onPaste={ event => onPaste(i, event) }\n />\n )\n },\n }}\n </VField>\n </>\n ))}\n\n <input\n class=\"v-otp-input-input\"\n type=\"hidden\"\n { ...inputAttrs }\n value={ model.value.join('') }\n />\n\n <VOverlay\n contained\n content-class=\"v-otp-input__loader\"\n model-value={ !!props.loading }\n persistent\n >\n { slots.loader?.() ?? (\n <VProgressCircular\n color={ typeof props.loading === 'boolean' ? undefined : props.loading }\n indeterminate\n size=\"24\"\n width=\"2\"\n />\n )}\n </VOverlay>\n\n { slots.default?.() }\n </div>\n </div>\n )\n })\n\n return {\n blur: () => {\n inputRef.value?.some(input => input.blur())\n },\n focus: () => {\n inputRef.value?.[0].focus()\n },\n reset,\n isFocused,\n }\n },\n})\n\nexport type VOtpInput = InstanceType<typeof VOtpInput>\n"],"mappings":"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"}
|
|
@@ -9,31 +9,32 @@
|
|
|
9
9
|
align-items: center
|
|
10
10
|
display: flex
|
|
11
11
|
justify-content: center
|
|
12
|
-
padding:
|
|
12
|
+
padding: $otp-input-padding
|
|
13
13
|
position: relative
|
|
14
14
|
|
|
15
15
|
.v-field
|
|
16
16
|
height: 100%
|
|
17
|
-
margin: 0 .25rem
|
|
18
17
|
|
|
19
18
|
.v-otp-input__divider
|
|
20
|
-
margin:
|
|
19
|
+
margin: $otp-input-divider-margin
|
|
21
20
|
|
|
22
21
|
.v-otp-input__content
|
|
23
22
|
align-items: center
|
|
24
23
|
display: flex
|
|
25
|
-
|
|
26
|
-
|
|
24
|
+
gap: $otp-input-content-gap
|
|
25
|
+
height: $otp-input-content-height
|
|
26
|
+
padding: $otp-input-content-padding
|
|
27
27
|
justify-content: center
|
|
28
|
-
max-width:
|
|
28
|
+
max-width: $otp-input-content-max-width
|
|
29
29
|
position: relative
|
|
30
30
|
border-radius: inherit
|
|
31
31
|
|
|
32
32
|
.v-otp-input--divided &
|
|
33
|
-
max-width:
|
|
33
|
+
max-width: $otp-input-divided-content-max-width
|
|
34
34
|
|
|
35
35
|
.v-otp-input__field
|
|
36
|
-
|
|
36
|
+
color: inherit
|
|
37
|
+
font-size: $otp-input-field-font-size
|
|
37
38
|
height: 100%
|
|
38
39
|
outline: none
|
|
39
40
|
text-align: center
|
|
@@ -1,2 +1,11 @@
|
|
|
1
1
|
@use '../../styles/settings';
|
|
2
2
|
@use '../../styles/tools';
|
|
3
|
+
|
|
4
|
+
$otp-input-content-gap: .5rem !default;
|
|
5
|
+
$otp-input-content-height: 64px !default;
|
|
6
|
+
$otp-input-content-max-width: 320px !default;
|
|
7
|
+
$otp-input-content-padding: .5rem !default;
|
|
8
|
+
$otp-input-divided-content-max-width: 360px !default;
|
|
9
|
+
$otp-input-divider-margin: 0 8px !default;
|
|
10
|
+
$otp-input-field-font-size: 1.25rem !default;
|
|
11
|
+
$otp-input-padding: .5rem 0 !default;
|
|
@@ -10,12 +10,16 @@
|
|
|
10
10
|
.v-skeleton-loader__actions {
|
|
11
11
|
justify-content: end;
|
|
12
12
|
}
|
|
13
|
+
.v-skeleton-loader .v-skeleton-loader__ossein {
|
|
14
|
+
height: 100%;
|
|
15
|
+
}
|
|
13
16
|
.v-skeleton-loader .v-skeleton-loader__avatar,
|
|
14
17
|
.v-skeleton-loader .v-skeleton-loader__button,
|
|
15
18
|
.v-skeleton-loader .v-skeleton-loader__chip,
|
|
16
19
|
.v-skeleton-loader .v-skeleton-loader__divider,
|
|
17
20
|
.v-skeleton-loader .v-skeleton-loader__heading,
|
|
18
21
|
.v-skeleton-loader .v-skeleton-loader__image,
|
|
22
|
+
.v-skeleton-loader .v-skeleton-loader__ossein,
|
|
19
23
|
.v-skeleton-loader .v-skeleton-loader__text {
|
|
20
24
|
background: rgba(var(--v-theme-on-surface), var(--v-border-opacity));
|
|
21
25
|
}
|
|
@@ -30,6 +30,7 @@ export const rootTypes = {
|
|
|
30
30
|
'list-item-avatar-two-line': 'avatar, sentences',
|
|
31
31
|
'list-item-three-line': 'paragraph',
|
|
32
32
|
'list-item-avatar-three-line': 'avatar, paragraph',
|
|
33
|
+
ossein: 'ossein',
|
|
33
34
|
paragraph: 'text@3',
|
|
34
35
|
sentences: 'text@2',
|
|
35
36
|
subtitle: 'text',
|
|
@@ -94,7 +95,7 @@ export const makeVSkeletonLoaderProps = propsFactory({
|
|
|
94
95
|
},
|
|
95
96
|
type: {
|
|
96
97
|
type: [String, Array],
|
|
97
|
-
default: '
|
|
98
|
+
default: 'ossein'
|
|
98
99
|
},
|
|
99
100
|
...makeDimensionProps(),
|
|
100
101
|
...makeElevationProps(),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VSkeletonLoader.mjs","names":["useBackgroundColor","makeDimensionProps","useDimension","makeElevationProps","useElevation","useLocale","makeThemeProps","provideTheme","computed","toRef","genericComponent","propsFactory","useRender","wrapInArray","rootTypes","actions","article","avatar","button","card","chip","divider","heading","image","paragraph","sentences","subtitle","table","text","genBone","type","children","arguments","length","undefined","_createVNode","genBones","bone","split","Array","from","map","genStructure","includes","mapBones","push","bones","replace","makeVSkeletonLoaderProps","boilerplate","Boolean","color","String","loading","loadingText","default","VSkeletonLoader","name","props","setup","_ref","slots","backgroundColorClasses","backgroundColorStyles","dimensionStyles","elevationClasses","themeClasses","t","items","join","isLoading","value"],"sources":["../../../src/labs/VSkeletonLoader/VSkeletonLoader.tsx"],"sourcesContent":["// Styles\nimport './VSkeletonLoader.sass'\n\n// Composables\nimport { useBackgroundColor } from '@/composables/color'\nimport { makeDimensionProps, useDimension } from '@/composables/dimensions'\nimport { makeElevationProps, useElevation } from '@/composables/elevation'\nimport { useLocale } from '@/composables/locale'\nimport { makeThemeProps, provideTheme } from '@/composables/theme'\n\n// Utilities\nimport { computed, toRef } from 'vue'\nimport { genericComponent, propsFactory, useRender, wrapInArray } from '@/util'\n\n// Types\nimport type { PropType, VNode } from 'vue'\n\ntype VSkeletonBone<T> = T | VSkeletonBone<T>[]\n\nexport type VSkeletonBones = VSkeletonBone<VNode>\nexport type VSkeletonLoaderType = keyof typeof rootTypes\n\nexport const rootTypes = {\n actions: 'button@2',\n article: 'heading, paragraph',\n avatar: 'avatar',\n button: 'button',\n card: 'image, heading',\n 'card-avatar': 'image, list-item-avatar',\n chip: 'chip',\n 'date-picker': 'list-item, heading, divider, date-picker-options, date-picker-days, actions',\n 'date-picker-options': 'text, avatar@2',\n 'date-picker-days': 'avatar@28',\n divider: 'divider',\n heading: 'heading',\n image: 'image',\n 'list-item': 'text',\n 'list-item-avatar': 'avatar, text',\n 'list-item-two-line': 'sentences',\n 'list-item-avatar-two-line': 'avatar, sentences',\n 'list-item-three-line': 'paragraph',\n 'list-item-avatar-three-line': 'avatar, paragraph',\n paragraph: 'text@3',\n sentences: 'text@2',\n subtitle: 'text',\n table: 'table-heading, table-thead, table-tbody, table-tfoot',\n 'table-heading': 'chip, text',\n 'table-thead': 'heading@6',\n 'table-tbody': 'table-row-divider@6',\n 'table-row-divider': 'table-row, divider',\n 'table-row': 'text@6',\n 'table-tfoot': 'text@2, avatar@2',\n text: 'text',\n} as const\n\nfunction genBone (type: string, children: VSkeletonBones = []) {\n return (\n <div\n class={[\n 'v-skeleton-loader__bone',\n `v-skeleton-loader__${type}`,\n ]}\n >\n { children }\n </div>\n )\n}\n\nfunction genBones (bone: string) {\n // e.g. 'text@3'\n const [type, length] = bone.split('@') as [VSkeletonLoaderType, number]\n\n // Generate a length array based upon\n // value after @ in the bone string\n return Array.from({ length }).map(() => genStructure(type))\n}\n\nfunction genStructure (type?: string): VSkeletonBones {\n let children: VSkeletonBones = []\n\n if (!type) return children\n\n // TODO: figure out a better way to type this\n const bone = (rootTypes as Record<string, string>)[type]\n\n // End of recursion, do nothing\n /* eslint-disable-next-line no-empty, brace-style */\n if (type === bone) {}\n // Array of values - e.g. 'heading, paragraph, text@2'\n else if (type.includes(',')) return mapBones(type)\n // Array of values - e.g. 'paragraph@4'\n else if (type.includes('@')) return genBones(type)\n // Array of values - e.g. 'card@2'\n else if (bone.includes(',')) children = mapBones(bone)\n // Array of values - e.g. 'list-item@2'\n else if (bone.includes('@')) children = genBones(bone)\n // Single value - e.g. 'card-heading'\n else if (bone) children.push(genStructure(bone))\n\n return [genBone(type, children)]\n}\n\nfunction mapBones (bones: string) {\n // Remove spaces and return array of structures\n return bones.replace(/\\s/g, '').split(',').map(genStructure)\n}\n\nexport const makeVSkeletonLoaderProps = propsFactory({\n boilerplate: Boolean,\n color: String,\n loading: Boolean,\n loadingText: {\n type: String,\n default: '$vuetify.loading',\n },\n type: {\n type: [String, Array] as PropType<\n | VSkeletonLoaderType | (string & {})\n | ReadonlyArray<VSkeletonLoaderType | (string & {})>\n >,\n default: 'image',\n },\n\n ...makeDimensionProps(),\n ...makeElevationProps(),\n ...makeThemeProps(),\n}, 'VSkeletonLoader')\n\nexport const VSkeletonLoader = genericComponent()({\n name: 'VSkeletonLoader',\n\n props: makeVSkeletonLoaderProps(),\n\n setup (props, { slots }) {\n const { backgroundColorClasses, backgroundColorStyles } = useBackgroundColor(toRef(props, 'color'))\n const { dimensionStyles } = useDimension(props)\n const { elevationClasses } = useElevation(props)\n const { themeClasses } = provideTheme(props)\n const { t } = useLocale()\n\n const items = computed(() => genStructure(wrapInArray(props.type).join(',')))\n\n useRender(() => {\n const isLoading = !slots.default || props.loading\n\n return (\n <div\n class={[\n 'v-skeleton-loader',\n {\n 'v-skeleton-loader--boilerplate': props.boilerplate,\n },\n themeClasses.value,\n backgroundColorClasses.value,\n elevationClasses.value,\n ]}\n style={[\n backgroundColorStyles.value,\n isLoading ? dimensionStyles.value : {},\n ]}\n aria-busy={ !props.boilerplate ? isLoading : undefined }\n aria-live={ !props.boilerplate ? 'polite' : undefined }\n aria-label={ !props.boilerplate ? t(props.loadingText) : undefined }\n role={ !props.boilerplate ? 'alert' : undefined }\n >\n { isLoading ? items.value : slots.default?.() }\n </div>\n )\n })\n\n return {}\n },\n})\n\nexport type VSkeletonLoader = InstanceType<typeof VSkeletonLoader>\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"VSkeletonLoader.mjs","names":["useBackgroundColor","makeDimensionProps","useDimension","makeElevationProps","useElevation","useLocale","makeThemeProps","provideTheme","computed","toRef","genericComponent","propsFactory","useRender","wrapInArray","rootTypes","actions","article","avatar","button","card","chip","divider","heading","image","ossein","paragraph","sentences","subtitle","table","text","genBone","type","children","arguments","length","undefined","_createVNode","genBones","bone","split","Array","from","map","genStructure","includes","mapBones","push","bones","replace","makeVSkeletonLoaderProps","boilerplate","Boolean","color","String","loading","loadingText","default","VSkeletonLoader","name","props","setup","_ref","slots","backgroundColorClasses","backgroundColorStyles","dimensionStyles","elevationClasses","themeClasses","t","items","join","isLoading","value"],"sources":["../../../src/labs/VSkeletonLoader/VSkeletonLoader.tsx"],"sourcesContent":["// Styles\nimport './VSkeletonLoader.sass'\n\n// Composables\nimport { useBackgroundColor } from '@/composables/color'\nimport { makeDimensionProps, useDimension } from '@/composables/dimensions'\nimport { makeElevationProps, useElevation } from '@/composables/elevation'\nimport { useLocale } from '@/composables/locale'\nimport { makeThemeProps, provideTheme } from '@/composables/theme'\n\n// Utilities\nimport { computed, toRef } from 'vue'\nimport { genericComponent, propsFactory, useRender, wrapInArray } from '@/util'\n\n// Types\nimport type { PropType, VNode } from 'vue'\n\ntype VSkeletonBone<T> = T | VSkeletonBone<T>[]\n\nexport type VSkeletonBones = VSkeletonBone<VNode>\nexport type VSkeletonLoaderType = keyof typeof rootTypes\n\nexport const rootTypes = {\n actions: 'button@2',\n article: 'heading, paragraph',\n avatar: 'avatar',\n button: 'button',\n card: 'image, heading',\n 'card-avatar': 'image, list-item-avatar',\n chip: 'chip',\n 'date-picker': 'list-item, heading, divider, date-picker-options, date-picker-days, actions',\n 'date-picker-options': 'text, avatar@2',\n 'date-picker-days': 'avatar@28',\n divider: 'divider',\n heading: 'heading',\n image: 'image',\n 'list-item': 'text',\n 'list-item-avatar': 'avatar, text',\n 'list-item-two-line': 'sentences',\n 'list-item-avatar-two-line': 'avatar, sentences',\n 'list-item-three-line': 'paragraph',\n 'list-item-avatar-three-line': 'avatar, paragraph',\n ossein: 'ossein',\n paragraph: 'text@3',\n sentences: 'text@2',\n subtitle: 'text',\n table: 'table-heading, table-thead, table-tbody, table-tfoot',\n 'table-heading': 'chip, text',\n 'table-thead': 'heading@6',\n 'table-tbody': 'table-row-divider@6',\n 'table-row-divider': 'table-row, divider',\n 'table-row': 'text@6',\n 'table-tfoot': 'text@2, avatar@2',\n text: 'text',\n} as const\n\nfunction genBone (type: string, children: VSkeletonBones = []) {\n return (\n <div\n class={[\n 'v-skeleton-loader__bone',\n `v-skeleton-loader__${type}`,\n ]}\n >\n { children }\n </div>\n )\n}\n\nfunction genBones (bone: string) {\n // e.g. 'text@3'\n const [type, length] = bone.split('@') as [VSkeletonLoaderType, number]\n\n // Generate a length array based upon\n // value after @ in the bone string\n return Array.from({ length }).map(() => genStructure(type))\n}\n\nfunction genStructure (type?: string): VSkeletonBones {\n let children: VSkeletonBones = []\n\n if (!type) return children\n\n // TODO: figure out a better way to type this\n const bone = (rootTypes as Record<string, string>)[type]\n\n // End of recursion, do nothing\n /* eslint-disable-next-line no-empty, brace-style */\n if (type === bone) {}\n // Array of values - e.g. 'heading, paragraph, text@2'\n else if (type.includes(',')) return mapBones(type)\n // Array of values - e.g. 'paragraph@4'\n else if (type.includes('@')) return genBones(type)\n // Array of values - e.g. 'card@2'\n else if (bone.includes(',')) children = mapBones(bone)\n // Array of values - e.g. 'list-item@2'\n else if (bone.includes('@')) children = genBones(bone)\n // Single value - e.g. 'card-heading'\n else if (bone) children.push(genStructure(bone))\n\n return [genBone(type, children)]\n}\n\nfunction mapBones (bones: string) {\n // Remove spaces and return array of structures\n return bones.replace(/\\s/g, '').split(',').map(genStructure)\n}\n\nexport const makeVSkeletonLoaderProps = propsFactory({\n boilerplate: Boolean,\n color: String,\n loading: Boolean,\n loadingText: {\n type: String,\n default: '$vuetify.loading',\n },\n type: {\n type: [String, Array] as PropType<\n | VSkeletonLoaderType | (string & {})\n | ReadonlyArray<VSkeletonLoaderType | (string & {})>\n >,\n default: 'ossein',\n },\n\n ...makeDimensionProps(),\n ...makeElevationProps(),\n ...makeThemeProps(),\n}, 'VSkeletonLoader')\n\nexport const VSkeletonLoader = genericComponent()({\n name: 'VSkeletonLoader',\n\n props: makeVSkeletonLoaderProps(),\n\n setup (props, { slots }) {\n const { backgroundColorClasses, backgroundColorStyles } = useBackgroundColor(toRef(props, 'color'))\n const { dimensionStyles } = useDimension(props)\n const { elevationClasses } = useElevation(props)\n const { themeClasses } = provideTheme(props)\n const { t } = useLocale()\n\n const items = computed(() => genStructure(wrapInArray(props.type).join(',')))\n\n useRender(() => {\n const isLoading = !slots.default || props.loading\n\n return (\n <div\n class={[\n 'v-skeleton-loader',\n {\n 'v-skeleton-loader--boilerplate': props.boilerplate,\n },\n themeClasses.value,\n backgroundColorClasses.value,\n elevationClasses.value,\n ]}\n style={[\n backgroundColorStyles.value,\n isLoading ? dimensionStyles.value : {},\n ]}\n aria-busy={ !props.boilerplate ? isLoading : undefined }\n aria-live={ !props.boilerplate ? 'polite' : undefined }\n aria-label={ !props.boilerplate ? t(props.loadingText) : undefined }\n role={ !props.boilerplate ? 'alert' : undefined }\n >\n { isLoading ? items.value : slots.default?.() }\n </div>\n )\n })\n\n return {}\n },\n})\n\nexport type VSkeletonLoader = InstanceType<typeof VSkeletonLoader>\n"],"mappings":"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"}
|
|
@@ -15,12 +15,16 @@
|
|
|
15
15
|
&__actions
|
|
16
16
|
justify-content: end
|
|
17
17
|
|
|
18
|
+
.v-skeleton-loader__ossein
|
|
19
|
+
height: 100%
|
|
20
|
+
|
|
18
21
|
.v-skeleton-loader__avatar,
|
|
19
22
|
.v-skeleton-loader__button,
|
|
20
23
|
.v-skeleton-loader__chip,
|
|
21
24
|
.v-skeleton-loader__divider,
|
|
22
25
|
.v-skeleton-loader__heading,
|
|
23
26
|
.v-skeleton-loader__image,
|
|
27
|
+
.v-skeleton-loader__ossein,
|
|
24
28
|
.v-skeleton-loader__text
|
|
25
29
|
background: $skeleton-loader-text-background
|
|
26
30
|
|