niuma-ui 2.0.3 → 2.0.4
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/CHANGELOG.md +38 -0
- package/dist/components/_shared/src/reka.d.ts +1 -1
- package/dist/components/_shared/src/reka.js +2 -2
- package/dist/components/anchor/index.d.ts +1 -1
- package/dist/components/anchor/src/RsAnchor.css +63 -32
- package/dist/components/anchor/src/RsAnchor.d.ts +29 -2
- package/dist/components/anchor/src/RsAnchor.impl.js +199 -81
- package/dist/components/anchor/src/RsAnchor.js +1 -1
- package/dist/components/anchor/src/anchor-utils.d.ts +36 -4
- package/dist/components/anchor/src/anchor-utils.js +81 -19
- package/dist/components/auto-complete/index.d.ts +2 -0
- package/dist/components/auto-complete/src/RsAutoComplete.css +122 -0
- package/dist/components/auto-complete/src/RsAutoComplete.d.ts +47 -7
- package/dist/components/auto-complete/src/RsAutoComplete.impl.js +180 -72
- package/dist/components/auto-complete/src/RsAutoComplete.js +4 -1
- package/dist/components/auto-complete/src/auto-complete-utils.d.ts +7 -0
- package/dist/components/auto-complete/src/auto-complete-utils.js +17 -0
- package/dist/components/avatar/index.d.ts +1 -0
- package/dist/components/avatar/src/RsAvatar.css +36 -19
- package/dist/components/avatar/src/RsAvatar.d.ts +9 -3
- package/dist/components/avatar/src/RsAvatar.impl.js +57 -33
- package/dist/components/avatar/src/RsAvatar.js +2 -1
- package/dist/components/avatar/src/avatar-utils.d.ts +16 -7
- package/dist/components/avatar/src/avatar-utils.js +41 -3
- package/dist/components/breadcrumb/index.d.ts +1 -1
- package/dist/components/breadcrumb/src/RsBreadcrumb.css +50 -17
- package/dist/components/breadcrumb/src/RsBreadcrumb.d.ts +45 -6
- package/dist/components/breadcrumb/src/RsBreadcrumb.impl.js +111 -12
- package/dist/components/breadcrumb/src/RsBreadcrumb.js +2 -1
- package/dist/components/breadcrumb/src/breadcrumb-utils.d.ts +37 -5
- package/dist/components/breadcrumb/src/breadcrumb-utils.js +70 -9
- package/dist/components/calendar-grid/index.d.ts +2 -0
- package/dist/components/calendar-grid/src/RsCalendarGrid.css +105 -45
- package/dist/components/calendar-grid/src/RsCalendarGrid.d.ts +62 -2
- package/dist/components/calendar-grid/src/RsCalendarGrid.impl.js +265 -94
- package/dist/components/calendar-grid/src/RsCalendarGrid.js +1 -1
- package/dist/components/calendar-grid/src/calendar-grid-utils.d.ts +72 -0
- package/dist/components/calendar-grid/src/calendar-grid-utils.js +122 -0
- package/dist/components/card/index.d.ts +1 -1
- package/dist/components/card/src/RsCard.css +108 -98
- package/dist/components/card/src/RsCard.d.ts +3 -12
- package/dist/components/card/src/RsCard.impl.js +29 -25
- package/dist/components/card/src/RsCard.js +2 -1
- package/dist/components/card/src/card-utils.d.ts +25 -0
- package/dist/components/card/src/card-utils.js +10 -0
- package/dist/components/cascader/index.d.ts +1 -0
- package/dist/components/cascader/src/RsCascader.css +175 -30
- package/dist/components/cascader/src/RsCascader.d.ts +15 -3
- package/dist/components/cascader/src/RsCascader.impl.js +277 -48
- package/dist/components/cascader/src/RsCascader.js +1 -1
- package/dist/components/cascader/src/cascader-utils.d.ts +2 -0
- package/dist/components/cascader/src/cascader-utils.js +8 -1
- package/dist/components/checkbox/index.d.ts +1 -0
- package/dist/components/checkbox/src/RsCheckbox.css +46 -23
- package/dist/components/checkbox/src/RsCheckbox.d.ts +11 -1
- package/dist/components/checkbox/src/RsCheckbox.impl.js +37 -9
- package/dist/components/checkbox/src/RsCheckbox.js +2 -1
- package/dist/components/checkbox/src/checkbox-utils.d.ts +4 -0
- package/dist/components/checkbox/src/checkbox-utils.js +12 -0
- package/dist/components/container/index.d.ts +1 -1
- package/dist/components/container/src/RsContainer.css +11 -11
- package/dist/components/container/src/RsContainer.d.ts +2 -12
- package/dist/components/container/src/RsContainer.impl.js +10 -57
- package/dist/components/container/src/RsContainer.js +1 -1
- package/dist/components/container/src/container-utils.d.ts +23 -0
- package/dist/components/container/src/container-utils.js +51 -0
- package/dist/components/date-picker/index.d.ts +4 -2
- package/dist/components/date-picker/src/RsDatePicker.css +42 -22
- package/dist/components/date-picker/src/RsDatePicker.d.ts +44 -20
- package/dist/components/date-picker/src/RsDatePicker.impl.js +484 -222
- package/dist/components/date-picker/src/RsDatePicker.js +1 -3
- package/dist/components/date-picker/src/RsDateTimePicker.d.ts +33 -6
- package/dist/components/date-picker/src/RsDateTimePicker.impl.js +47 -6
- package/dist/components/date-picker/src/date-picker-utils.d.ts +19 -0
- package/dist/components/date-picker/src/date-picker-utils.js +33 -10
- package/dist/components/dynamic-tags/index.d.ts +1 -1
- package/dist/components/dynamic-tags/src/RsDynamicTags.css +115 -38
- package/dist/components/dynamic-tags/src/RsDynamicTags.d.ts +58 -17
- package/dist/components/dynamic-tags/src/RsDynamicTags.impl.js +269 -106
- package/dist/components/dynamic-tags/src/RsDynamicTags.js +1 -1
- package/dist/components/dynamic-tags/src/dynamic-tags-utils.d.ts +19 -0
- package/dist/components/dynamic-tags/src/dynamic-tags-utils.js +60 -0
- package/dist/components/fieldset/src/RsFieldset.css +71 -41
- package/dist/components/fieldset/src/RsFieldset.d.ts +21 -2
- package/dist/components/fieldset/src/RsFieldset.impl.js +93 -26
- package/dist/components/fieldset/src/RsFieldset.js +1 -1
- package/dist/components/fieldset/src/fieldset-utils.d.ts +4 -0
- package/dist/components/fieldset/src/fieldset-utils.js +9 -1
- package/dist/components/form/index.d.ts +1 -0
- package/dist/components/form/src/RsForm.css +15 -12
- package/dist/components/form/src/RsForm.d.ts +20 -22
- package/dist/components/form/src/RsForm.impl.js +33 -20
- package/dist/components/form/src/RsForm.js +1 -1
- package/dist/components/form/src/form-utils.d.ts +7 -0
- package/dist/components/form/src/form-utils.js +28 -1
- package/dist/components/input/index.d.ts +1 -1
- package/dist/components/input/src/RsInput.css +78 -260
- package/dist/components/input/src/RsInput.d.ts +5 -3
- package/dist/components/input/src/RsInput.impl.js +8 -16
- package/dist/components/input/src/RsInput.js +1 -1
- package/dist/components/input/src/input-utils.d.ts +11 -0
- package/dist/components/input/src/input-utils.js +22 -0
- package/dist/components/input-number/index.d.ts +1 -0
- package/dist/components/input-number/src/RsInputNumber.css +31 -31
- package/dist/components/input-number/src/RsInputNumber.d.ts +15 -13
- package/dist/components/input-number/src/RsInputNumber.impl.js +17 -4
- package/dist/components/input-number/src/RsInputNumber.js +1 -1
- package/dist/components/label/src/RsLabel.css +30 -11
- package/dist/components/label/src/RsLabel.d.ts +18 -1
- package/dist/components/label/src/RsLabel.impl.js +63 -10
- package/dist/components/label/src/RsLabel.js +1 -1
- package/dist/components/label/src/label-utils.d.ts +6 -0
- package/dist/components/label/src/label-utils.js +16 -0
- package/dist/components/link/src/RsLink.d.ts +2 -2
- package/dist/components/loading/src/RsLoading.d.ts +1 -1
- package/dist/components/mentions/index.d.ts +2 -1
- package/dist/components/mentions/src/RsMentions.css +119 -3
- package/dist/components/mentions/src/RsMentions.d.ts +56 -4
- package/dist/components/mentions/src/RsMentions.impl.js +298 -79
- package/dist/components/mentions/src/RsMentions.js +1 -3
- package/dist/components/mentions/src/mentions-utils.d.ts +5 -1
- package/dist/components/mentions/src/mentions-utils.js +28 -9
- package/dist/components/popover/src/RsPopover.d.ts +1 -1
- package/dist/components/radio/index.d.ts +1 -1
- package/dist/components/radio/src/RsRadio.css +7 -6
- package/dist/components/radio/src/RsRadio.d.ts +8 -5
- package/dist/components/radio/src/RsRadio.impl.js +34 -24
- package/dist/components/radio/src/RsRadio.js +2 -1
- package/dist/components/radio/src/RsRadioItem.css +61 -44
- package/dist/components/radio/src/RsRadioItem.d.ts +2 -2
- package/dist/components/radio/src/RsRadioItem.impl.js +53 -20
- package/dist/components/radio/src/RsRadioItem.js +2 -1
- package/dist/components/radio/src/radio-utils.d.ts +12 -1
- package/dist/components/radio/src/radio-utils.js +15 -1
- package/dist/components/scrollbar/src/RsScrollbar.css +71 -24
- package/dist/components/scrollbar/src/RsScrollbar.d.ts +9 -5
- package/dist/components/scrollbar/src/RsScrollbar.impl.js +372 -47
- package/dist/components/scrollbar/src/RsScrollbar.js +2 -1
- package/dist/components/scrollbar/src/scrollbar-utils.d.ts +34 -2
- package/dist/components/scrollbar/src/scrollbar-utils.js +64 -1
- package/dist/components/select/index.d.ts +1 -0
- package/dist/components/select/src/RsSelect.css +54 -42
- package/dist/components/select/src/RsSelect.d.ts +19 -2
- package/dist/components/select/src/RsSelect.impl.js +727 -312
- package/dist/components/select/src/RsSelect.js +1 -1
- package/dist/components/select/src/select-utils.d.ts +4 -2
- package/dist/components/select/src/select-utils.js +8 -3
- package/dist/components/select/src/use-rs-select.d.ts +1 -0
- package/dist/components/select/src/use-rs-select.js +23 -17
- package/dist/components/switch/index.d.ts +2 -1
- package/dist/components/switch/src/RsSwitch.css +36 -18
- package/dist/components/switch/src/RsSwitch.d.ts +18 -5
- package/dist/components/switch/src/RsSwitch.impl.js +61 -29
- package/dist/components/switch/src/RsSwitch.js +2 -1
- package/dist/components/switch/src/switch-utils.d.ts +4 -0
- package/dist/components/switch/src/switch-utils.js +9 -0
- package/dist/components/textarea/src/RsTextarea.css +23 -23
- package/dist/components/textarea/src/RsTextarea.d.ts +6 -12
- package/dist/components/textarea/src/RsTextarea.impl.js +37 -46
- package/dist/components/textarea/src/RsTextarea.js +1 -1
- package/dist/components/textarea/src/textarea-utils.d.ts +27 -0
- package/dist/components/textarea/src/textarea-utils.js +61 -0
- package/dist/components/time-picker/index.d.ts +3 -2
- package/dist/components/time-picker/src/RsTimePicker.css +41 -24
- package/dist/components/time-picker/src/RsTimePicker.d.ts +52 -7
- package/dist/components/time-picker/src/RsTimePicker.impl.js +520 -156
- package/dist/components/time-picker/src/RsTimePicker.js +1 -3
- package/dist/components/time-picker/src/RsTimePickerColumns.css +26 -18
- package/dist/components/time-picker/src/RsTimePickerColumns.d.ts +3 -1
- package/dist/components/time-picker/src/RsTimePickerColumns.impl.js +62 -9
- package/dist/components/time-picker/src/RsTimePickerColumns.js +1 -1
- package/dist/components/time-picker/src/time-picker-utils.d.ts +38 -0
- package/dist/components/time-picker/src/time-picker-utils.js +97 -5
- package/dist/components/toaster/src/RsToaster.d.ts +1 -1
- package/dist/components/tooltip/src/RsTooltip.d.ts +1 -1
- package/dist/components/tree/src/RsTree.d.ts +3 -3
- package/dist/components/tree-select/index.d.ts +2 -0
- package/dist/components/tree-select/src/RsTreeSelect.css +100 -25
- package/dist/components/tree-select/src/RsTreeSelect.d.ts +91 -7
- package/dist/components/tree-select/src/RsTreeSelect.impl.js +464 -79
- package/dist/components/tree-select/src/RsTreeSelect.js +1 -1
- package/dist/components/tree-select/src/tree-select-utils.d.ts +20 -0
- package/dist/components/tree-select/src/tree-select-utils.js +60 -0
- package/dist/components/upload/index.d.ts +2 -1
- package/dist/components/upload/src/RsUpload.css +223 -75
- package/dist/components/upload/src/RsUpload.d.ts +77 -1
- package/dist/components/upload/src/RsUpload.impl.js +404 -90
- package/dist/components/upload/src/RsUpload.js +1 -1
- package/dist/components/upload/src/upload-utils.d.ts +21 -2
- package/dist/components/upload/src/upload-utils.js +139 -9
- package/dist/index.d.ts +21 -11
- package/dist/index.js +6 -0
- package/dist/locale/messages.js +46 -2
- package/dist/styles.css +518 -154
- package/dist/theme/brand.example.css +1 -1
- package/package.json +1 -1
- package/dist/components/breadcrumb/src/RsBreadcrumbItems.d.ts +0 -8
- package/dist/components/breadcrumb/src/RsBreadcrumbItems.impl.js +0 -40
- package/dist/components/breadcrumb/src/RsBreadcrumbItems.js +0 -5
- package/dist/components/date-picker/src/RsDatePicker-1.css +0 -157
- package/dist/components/mentions/src/RsMentions-1.css +0 -29
- package/dist/components/time-picker/src/RsTimePicker-1.css +0 -98
|
@@ -1,20 +1,48 @@
|
|
|
1
|
+
import { RS_COMPONENT_SIZE_ICON_PX } from "../../../theme/types.js";
|
|
2
|
+
import { useRsConfigOptional } from "../../../composables/useRsConfig.js";
|
|
3
|
+
import { resolveDirMode } from "../../../locale/apply.js";
|
|
1
4
|
import { useRsI18n } from "../../../composables/useRsI18n.js";
|
|
2
5
|
import RsIcon_default from "../../icon/src/RsIcon.js";
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
6
|
+
import { useRsFormContext } from "../../form/src/form-utils.js";
|
|
7
|
+
import { useResolvedRsComponentSize } from "../../_shared/src/resolve-size.js";
|
|
8
|
+
import { rsRadiusCss, useResolvedRsRadius } from "../../_shared/src/resolve-radius.js";
|
|
9
|
+
import { buildCalendarGrid, getTodayDate, isSameDate, resolveWeekStartsOn } from "../../date-picker/src/date-picker-utils.js";
|
|
10
|
+
import { addCalendarMonths, calendarCellClass, chunkCalendarWeeks, resolveCalendarCellState, resolveFocusedDate, resolveKeyboardMove, sameYearMonth, toDisabledDateSet, weekNumberOfRow } from "./calendar-grid-utils.js";
|
|
11
|
+
import { Fragment, computed, createCommentVNode, createElementBlock, createElementVNode, createTextVNode, createVNode, defineComponent, mergeModels, mergeProps, nextTick, normalizeClass, normalizeStyle, openBlock, ref, renderList, renderSlot, toDisplayString, unref, useModel, watch } from "vue";
|
|
5
12
|
//#region src/components/calendar-grid/src/RsCalendarGrid.vue?vue&type=script&setup=true&lang.ts
|
|
6
|
-
var _hoisted_1 =
|
|
13
|
+
var _hoisted_1 = ["id"];
|
|
7
14
|
var _hoisted_2 = { class: "rs-calendar-grid__header" };
|
|
8
15
|
var _hoisted_3 = { class: "rs-calendar-grid__nav-group" };
|
|
9
|
-
var _hoisted_4 = ["aria-label"];
|
|
10
|
-
var _hoisted_5 = ["aria-label"];
|
|
11
|
-
var _hoisted_6 = {
|
|
16
|
+
var _hoisted_4 = ["aria-label", "disabled"];
|
|
17
|
+
var _hoisted_5 = ["aria-label", "disabled"];
|
|
18
|
+
var _hoisted_6 = {
|
|
19
|
+
class: "rs-calendar-grid__title",
|
|
20
|
+
"aria-live": "polite"
|
|
21
|
+
};
|
|
12
22
|
var _hoisted_7 = { class: "rs-calendar-grid__nav-group" };
|
|
13
|
-
var _hoisted_8 = ["aria-label"];
|
|
14
|
-
var _hoisted_9 = ["aria-label"];
|
|
15
|
-
var _hoisted_10 =
|
|
16
|
-
var _hoisted_11 =
|
|
23
|
+
var _hoisted_8 = ["aria-label", "disabled"];
|
|
24
|
+
var _hoisted_9 = ["aria-label", "disabled"];
|
|
25
|
+
var _hoisted_10 = ["aria-label"];
|
|
26
|
+
var _hoisted_11 = {
|
|
27
|
+
key: 0,
|
|
28
|
+
scope: "col",
|
|
29
|
+
class: "rs-calendar-grid__weekday rs-calendar-grid__weekday--week"
|
|
30
|
+
};
|
|
31
|
+
var _hoisted_12 = {
|
|
32
|
+
key: 0,
|
|
33
|
+
class: "rs-calendar-grid__week-num"
|
|
34
|
+
};
|
|
35
|
+
var _hoisted_13 = [
|
|
36
|
+
"data-iso",
|
|
37
|
+
"disabled",
|
|
38
|
+
"tabindex",
|
|
39
|
+
"aria-selected",
|
|
40
|
+
"aria-current",
|
|
41
|
+
"aria-label",
|
|
42
|
+
"onClick"
|
|
43
|
+
];
|
|
17
44
|
var RsCalendarGrid_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComponent({
|
|
45
|
+
name: "RsCalendarGrid",
|
|
18
46
|
__name: "RsCalendarGrid",
|
|
19
47
|
props: /*@__PURE__*/ mergeModels({
|
|
20
48
|
selected: { default: null },
|
|
@@ -22,7 +50,33 @@ var RsCalendarGrid_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ d
|
|
|
22
50
|
rangeEnd: { default: null },
|
|
23
51
|
minDate: {},
|
|
24
52
|
maxDate: {},
|
|
25
|
-
disabledDates: { default: () => [] }
|
|
53
|
+
disabledDates: { default: () => [] },
|
|
54
|
+
disabledDate: {},
|
|
55
|
+
weekStartsOn: {},
|
|
56
|
+
size: {},
|
|
57
|
+
radius: {},
|
|
58
|
+
disabled: {
|
|
59
|
+
type: Boolean,
|
|
60
|
+
default: false
|
|
61
|
+
},
|
|
62
|
+
highlightToday: {
|
|
63
|
+
type: Boolean,
|
|
64
|
+
default: true
|
|
65
|
+
},
|
|
66
|
+
showOutside: {
|
|
67
|
+
type: Boolean,
|
|
68
|
+
default: true
|
|
69
|
+
},
|
|
70
|
+
selectOutside: {
|
|
71
|
+
type: Boolean,
|
|
72
|
+
default: true
|
|
73
|
+
},
|
|
74
|
+
showWeekNumbers: {
|
|
75
|
+
type: Boolean,
|
|
76
|
+
default: false
|
|
77
|
+
},
|
|
78
|
+
ariaLabel: {},
|
|
79
|
+
id: {}
|
|
26
80
|
}, {
|
|
27
81
|
"viewYear": { required: true },
|
|
28
82
|
"viewYearModifiers": {},
|
|
@@ -30,151 +84,268 @@ var RsCalendarGrid_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ d
|
|
|
30
84
|
"viewMonthModifiers": {}
|
|
31
85
|
}),
|
|
32
86
|
emits: /*@__PURE__*/ mergeModels(["select"], ["update:viewYear", "update:viewMonth"]),
|
|
33
|
-
setup(__props, { emit: __emit }) {
|
|
87
|
+
setup(__props, { expose: __expose, emit: __emit }) {
|
|
34
88
|
const viewYear = useModel(__props, "viewYear");
|
|
35
89
|
const viewMonth = useModel(__props, "viewMonth");
|
|
36
90
|
const props = __props;
|
|
37
91
|
const emit = __emit;
|
|
38
92
|
const { t, locale } = useRsI18n();
|
|
93
|
+
const config = useRsConfigOptional();
|
|
94
|
+
const form = useRsFormContext();
|
|
95
|
+
const resolvedSize = useResolvedRsComponentSize(() => props.size);
|
|
96
|
+
const resolvedRadius = useResolvedRsRadius(() => props.radius, "sm");
|
|
97
|
+
const rootRef = ref(null);
|
|
98
|
+
const focused = ref(resolveFocusedDate(viewYear.value, viewMonth.value, props.selected));
|
|
99
|
+
const resolvedDisabled = computed(() => props.disabled || form?.disabled.value === true);
|
|
100
|
+
const writingDir = computed(() => resolveDirMode(config?.dir.value ?? "auto", locale.value));
|
|
101
|
+
const resolvedWeekStartsOn = computed(() => resolveWeekStartsOn(locale.value, props.weekStartsOn));
|
|
102
|
+
const navIconSize = computed(() => RS_COMPONENT_SIZE_ICON_PX[resolvedSize.value]);
|
|
103
|
+
const disabledDateSet = computed(() => toDisabledDateSet(props.disabledDates));
|
|
104
|
+
const todayDate = computed(() => props.highlightToday ? getTodayDate() : null);
|
|
39
105
|
const weekdayLabels = computed(() => {
|
|
40
106
|
const formatter = new Intl.DateTimeFormat(locale.value, { weekday: "short" });
|
|
41
|
-
const
|
|
107
|
+
const sunday = new Date(2024, 0, 7);
|
|
42
108
|
return Array.from({ length: 7 }, (_, index) => {
|
|
43
|
-
const date = new Date(
|
|
44
|
-
date.setDate(
|
|
109
|
+
const date = new Date(sunday);
|
|
110
|
+
date.setDate(sunday.getDate() + (resolvedWeekStartsOn.value + index) % 7);
|
|
45
111
|
return formatter.format(date);
|
|
46
112
|
});
|
|
47
113
|
});
|
|
48
|
-
const
|
|
114
|
+
const monthFormatter = computed(() => new Intl.DateTimeFormat(locale.value, {
|
|
49
115
|
year: "numeric",
|
|
50
116
|
month: "long"
|
|
51
|
-
})
|
|
52
|
-
const
|
|
53
|
-
const
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
117
|
+
}));
|
|
118
|
+
const monthLabel = computed(() => monthFormatter.value.format(new Date(viewYear.value, viewMonth.value - 1, 1)));
|
|
119
|
+
const cellAriaFormatter = computed(() => new Intl.DateTimeFormat(locale.value, { dateStyle: "full" }));
|
|
120
|
+
const cellViews = computed(() => {
|
|
121
|
+
return buildCalendarGrid(viewYear.value, viewMonth.value, resolvedWeekStartsOn.value).map((cell) => ({
|
|
122
|
+
cell,
|
|
123
|
+
state: resolveCalendarCellState(cell, {
|
|
124
|
+
selected: props.selected,
|
|
125
|
+
rangeStart: props.rangeStart,
|
|
126
|
+
rangeEnd: props.rangeEnd,
|
|
127
|
+
today: todayDate.value,
|
|
128
|
+
disabledDates: disabledDateSet.value,
|
|
129
|
+
disabledDate: props.disabledDate,
|
|
130
|
+
minDate: props.minDate,
|
|
131
|
+
maxDate: props.maxDate,
|
|
132
|
+
gridDisabled: resolvedDisabled.value
|
|
133
|
+
})
|
|
134
|
+
}));
|
|
57
135
|
});
|
|
136
|
+
const weeks = computed(() => chunkCalendarWeeks(cellViews.value).map((days) => ({
|
|
137
|
+
days,
|
|
138
|
+
weekNumber: weekNumberOfRow(days, resolvedWeekStartsOn.value)
|
|
139
|
+
})));
|
|
140
|
+
const gridLabel = computed(() => props.ariaLabel || t("calendarGrid.label"));
|
|
141
|
+
const rootStyle = computed(() => ({ "--rs-calendar-grid-radius": rsRadiusCss(resolvedRadius.value) }));
|
|
142
|
+
function cellAriaLabel(date) {
|
|
143
|
+
return cellAriaFormatter.value.format(new Date(date.year, date.month - 1, date.day));
|
|
144
|
+
}
|
|
145
|
+
function cellSlotProps(view, weekNumber) {
|
|
146
|
+
return {
|
|
147
|
+
date: {
|
|
148
|
+
year: view.cell.year,
|
|
149
|
+
month: view.cell.month,
|
|
150
|
+
day: view.cell.day
|
|
151
|
+
},
|
|
152
|
+
iso: view.state.iso,
|
|
153
|
+
inCurrentMonth: view.cell.inCurrentMonth,
|
|
154
|
+
selected: view.state.selected,
|
|
155
|
+
disabled: view.state.disabled,
|
|
156
|
+
today: view.state.today,
|
|
157
|
+
inRange: view.state.inRange,
|
|
158
|
+
rangeStart: view.state.rangeStart,
|
|
159
|
+
rangeEnd: view.state.rangeEnd,
|
|
160
|
+
weekNumber
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
function isCellInteractive(inCurrentMonth, disabled) {
|
|
164
|
+
if (disabled) return false;
|
|
165
|
+
if (!inCurrentMonth && !props.showOutside) return false;
|
|
166
|
+
if (!inCurrentMonth && !props.selectOutside) return false;
|
|
167
|
+
return true;
|
|
168
|
+
}
|
|
169
|
+
function isCellTabbable(date, inCurrentMonth) {
|
|
170
|
+
if (!props.showOutside && !inCurrentMonth) return false;
|
|
171
|
+
return isSameDate(focused.value, date);
|
|
172
|
+
}
|
|
173
|
+
function applyView(next) {
|
|
174
|
+
if (next.year !== viewYear.value) viewYear.value = next.year;
|
|
175
|
+
if (next.month !== viewMonth.value) viewMonth.value = next.month;
|
|
176
|
+
focused.value = next;
|
|
177
|
+
}
|
|
178
|
+
function focusCell(date) {
|
|
179
|
+
const iso = `${String(date.year).padStart(4, "0")}-${String(date.month).padStart(2, "0")}-${String(date.day).padStart(2, "0")}`;
|
|
180
|
+
(rootRef.value?.querySelector(`[data-iso="${iso}"]`))?.focus();
|
|
181
|
+
}
|
|
58
182
|
function goPrevYear() {
|
|
59
|
-
|
|
183
|
+
if (resolvedDisabled.value) return;
|
|
184
|
+
applyView(addCalendarMonths({
|
|
185
|
+
year: viewYear.value,
|
|
186
|
+
month: viewMonth.value,
|
|
187
|
+
day: focused.value.day
|
|
188
|
+
}, -12));
|
|
60
189
|
}
|
|
61
190
|
function goNextYear() {
|
|
62
|
-
|
|
191
|
+
if (resolvedDisabled.value) return;
|
|
192
|
+
applyView(addCalendarMonths({
|
|
193
|
+
year: viewYear.value,
|
|
194
|
+
month: viewMonth.value,
|
|
195
|
+
day: focused.value.day
|
|
196
|
+
}, 12));
|
|
63
197
|
}
|
|
64
198
|
function goPrevMonth() {
|
|
65
|
-
if (
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
199
|
+
if (resolvedDisabled.value) return;
|
|
200
|
+
applyView(addCalendarMonths({
|
|
201
|
+
year: viewYear.value,
|
|
202
|
+
month: viewMonth.value,
|
|
203
|
+
day: focused.value.day
|
|
204
|
+
}, -1));
|
|
71
205
|
}
|
|
72
206
|
function goNextMonth() {
|
|
73
|
-
if (
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
207
|
+
if (resolvedDisabled.value) return;
|
|
208
|
+
applyView(addCalendarMonths({
|
|
209
|
+
year: viewYear.value,
|
|
210
|
+
month: viewMonth.value,
|
|
211
|
+
day: focused.value.day
|
|
212
|
+
}, 1));
|
|
79
213
|
}
|
|
80
|
-
function
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
214
|
+
function selectDate(date, inCurrentMonth, disabled) {
|
|
215
|
+
if (!isCellInteractive(inCurrentMonth, disabled)) return;
|
|
216
|
+
focused.value = date;
|
|
217
|
+
emit("select", {
|
|
218
|
+
year: date.year,
|
|
219
|
+
month: date.month,
|
|
220
|
+
day: date.day
|
|
221
|
+
});
|
|
85
222
|
}
|
|
86
|
-
function
|
|
87
|
-
|
|
223
|
+
function moveFocus(next) {
|
|
224
|
+
applyView(next);
|
|
225
|
+
nextTick(() => focusCell(next));
|
|
88
226
|
}
|
|
89
|
-
function
|
|
90
|
-
|
|
91
|
-
|
|
227
|
+
function selectFocusedDate() {
|
|
228
|
+
const view = cellViews.value.find((item) => isSameDate(item.cell, focused.value));
|
|
229
|
+
if (view) selectDate(view.cell, view.cell.inCurrentMonth, view.state.disabled);
|
|
92
230
|
}
|
|
93
|
-
function
|
|
94
|
-
|
|
95
|
-
if (
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
231
|
+
function onGridKeydown(event) {
|
|
232
|
+
if (resolvedDisabled.value) return;
|
|
233
|
+
if (event.key === "Enter" || event.key === " ") {
|
|
234
|
+
event.preventDefault();
|
|
235
|
+
selectFocusedDate();
|
|
236
|
+
return;
|
|
237
|
+
}
|
|
238
|
+
const next = resolveKeyboardMove(focused.value, event.key, {
|
|
239
|
+
weekStartsOn: resolvedWeekStartsOn.value,
|
|
240
|
+
rtl: writingDir.value === "rtl",
|
|
241
|
+
shiftKey: event.shiftKey
|
|
99
242
|
});
|
|
243
|
+
if (!next) return;
|
|
244
|
+
event.preventDefault();
|
|
245
|
+
moveFocus(next);
|
|
100
246
|
}
|
|
101
|
-
function
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
return {
|
|
106
|
-
"rs-calendar-grid__cell--outside": !cell.inCurrentMonth,
|
|
107
|
-
"rs-calendar-grid__cell--selected": selected,
|
|
108
|
-
"rs-calendar-grid__cell--range-start": isRangeStart(cell),
|
|
109
|
-
"rs-calendar-grid__cell--range-end": isRangeEnd(cell),
|
|
110
|
-
"rs-calendar-grid__cell--in-range": inRange && !endpoint,
|
|
111
|
-
"rs-calendar-grid__cell--endpoint": endpoint || selected
|
|
112
|
-
};
|
|
247
|
+
function focus() {
|
|
248
|
+
if (resolvedDisabled.value) return;
|
|
249
|
+
if (!sameYearMonth(focused.value, viewYear.value, viewMonth.value)) focused.value = resolveFocusedDate(viewYear.value, viewMonth.value, props.selected);
|
|
250
|
+
nextTick(() => focusCell(focused.value));
|
|
113
251
|
}
|
|
114
|
-
function
|
|
115
|
-
if (
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
day: cell.day
|
|
120
|
-
});
|
|
252
|
+
function goToToday() {
|
|
253
|
+
if (resolvedDisabled.value) return;
|
|
254
|
+
const today = getTodayDate();
|
|
255
|
+
applyView(today);
|
|
256
|
+
nextTick(() => focusCell(today));
|
|
121
257
|
}
|
|
258
|
+
watch(() => [
|
|
259
|
+
viewYear.value,
|
|
260
|
+
viewMonth.value,
|
|
261
|
+
props.selected
|
|
262
|
+
], () => {
|
|
263
|
+
if (!sameYearMonth(focused.value, viewYear.value, viewMonth.value)) focused.value = resolveFocusedDate(viewYear.value, viewMonth.value, props.selected);
|
|
264
|
+
});
|
|
265
|
+
__expose({
|
|
266
|
+
focus,
|
|
267
|
+
goToToday
|
|
268
|
+
});
|
|
122
269
|
return (_ctx, _cache) => {
|
|
123
|
-
return openBlock(), createElementBlock("div",
|
|
270
|
+
return openBlock(), createElementBlock("div", {
|
|
271
|
+
id: __props.id,
|
|
272
|
+
ref_key: "rootRef",
|
|
273
|
+
ref: rootRef,
|
|
274
|
+
class: normalizeClass(["rs-calendar-grid", [`rs-calendar-grid--${unref(resolvedSize)}`, { "rs-calendar-grid--disabled": resolvedDisabled.value }]]),
|
|
275
|
+
style: normalizeStyle(rootStyle.value)
|
|
276
|
+
}, [createElementVNode("div", _hoisted_2, [
|
|
124
277
|
createElementVNode("div", _hoisted_3, [createElementVNode("button", {
|
|
125
278
|
type: "button",
|
|
126
279
|
class: "rs-calendar-grid__nav rs-calendar-grid__nav--prev-year",
|
|
127
|
-
"aria-label": unref(t)("
|
|
280
|
+
"aria-label": unref(t)("calendarGrid.prevYear"),
|
|
281
|
+
disabled: resolvedDisabled.value,
|
|
128
282
|
onClick: goPrevYear
|
|
129
283
|
}, [createVNode(RsIcon_default, {
|
|
130
284
|
name: "chevrons-left",
|
|
131
|
-
size:
|
|
132
|
-
})], 8, _hoisted_4), createElementVNode("button", {
|
|
285
|
+
size: navIconSize.value
|
|
286
|
+
}, null, 8, ["size"])], 8, _hoisted_4), createElementVNode("button", {
|
|
133
287
|
type: "button",
|
|
134
288
|
class: "rs-calendar-grid__nav rs-calendar-grid__nav--prev-month",
|
|
135
|
-
"aria-label": unref(t)("
|
|
289
|
+
"aria-label": unref(t)("calendarGrid.prevMonth"),
|
|
290
|
+
disabled: resolvedDisabled.value,
|
|
136
291
|
onClick: goPrevMonth
|
|
137
292
|
}, [createVNode(RsIcon_default, {
|
|
138
293
|
name: "chevron-left",
|
|
139
|
-
size:
|
|
140
|
-
})], 8, _hoisted_5)]),
|
|
141
|
-
createElementVNode("span", _hoisted_6,
|
|
294
|
+
size: navIconSize.value
|
|
295
|
+
}, null, 8, ["size"])], 8, _hoisted_5)]),
|
|
296
|
+
createElementVNode("span", _hoisted_6, [renderSlot(_ctx.$slots, "title", {
|
|
297
|
+
year: viewYear.value,
|
|
298
|
+
month: viewMonth.value,
|
|
299
|
+
label: monthLabel.value
|
|
300
|
+
}, () => [createTextVNode(toDisplayString(monthLabel.value), 1)], true)]),
|
|
142
301
|
createElementVNode("div", _hoisted_7, [createElementVNode("button", {
|
|
143
302
|
type: "button",
|
|
144
303
|
class: "rs-calendar-grid__nav rs-calendar-grid__nav--next-month",
|
|
145
|
-
"aria-label": unref(t)("
|
|
304
|
+
"aria-label": unref(t)("calendarGrid.nextMonth"),
|
|
305
|
+
disabled: resolvedDisabled.value,
|
|
146
306
|
onClick: goNextMonth
|
|
147
307
|
}, [createVNode(RsIcon_default, {
|
|
148
308
|
name: "chevron-right",
|
|
149
|
-
size:
|
|
150
|
-
})], 8, _hoisted_8), createElementVNode("button", {
|
|
309
|
+
size: navIconSize.value
|
|
310
|
+
}, null, 8, ["size"])], 8, _hoisted_8), createElementVNode("button", {
|
|
151
311
|
type: "button",
|
|
152
312
|
class: "rs-calendar-grid__nav rs-calendar-grid__nav--next-year",
|
|
153
|
-
"aria-label": unref(t)("
|
|
313
|
+
"aria-label": unref(t)("calendarGrid.nextYear"),
|
|
314
|
+
disabled: resolvedDisabled.value,
|
|
154
315
|
onClick: goNextYear
|
|
155
316
|
}, [createVNode(RsIcon_default, {
|
|
156
317
|
name: "chevrons-right",
|
|
157
|
-
size:
|
|
158
|
-
})], 8, _hoisted_9)])
|
|
159
|
-
]), createElementVNode("table",
|
|
318
|
+
size: navIconSize.value
|
|
319
|
+
}, null, 8, ["size"])], 8, _hoisted_9)])
|
|
320
|
+
]), createElementVNode("table", {
|
|
321
|
+
class: "rs-calendar-grid__table",
|
|
322
|
+
"aria-label": gridLabel.value,
|
|
323
|
+
onKeydown: onGridKeydown
|
|
324
|
+
}, [createElementVNode("thead", null, [createElementVNode("tr", null, [__props.showWeekNumbers ? (openBlock(), createElementBlock("th", _hoisted_11, toDisplayString(unref(t)("calendarGrid.week")), 1)) : createCommentVNode("", true), (openBlock(true), createElementBlock(Fragment, null, renderList(weekdayLabels.value, (label, index) => {
|
|
160
325
|
return openBlock(), createElementBlock("th", {
|
|
161
326
|
key: index,
|
|
162
327
|
scope: "col",
|
|
163
328
|
class: "rs-calendar-grid__weekday"
|
|
164
329
|
}, toDisplayString(label), 1);
|
|
165
330
|
}), 128))])]), createElementVNode("tbody", null, [(openBlock(true), createElementBlock(Fragment, null, renderList(weeks.value, (week, weekIndex) => {
|
|
166
|
-
return openBlock(), createElementBlock("tr", { key: weekIndex }, [(openBlock(true), createElementBlock(Fragment, null, renderList(week, (
|
|
331
|
+
return openBlock(), createElementBlock("tr", { key: weekIndex }, [__props.showWeekNumbers ? (openBlock(), createElementBlock("td", _hoisted_12, toDisplayString(week.weekNumber), 1)) : createCommentVNode("", true), (openBlock(true), createElementBlock(Fragment, null, renderList(week.days, (view) => {
|
|
167
332
|
return openBlock(), createElementBlock("td", {
|
|
168
|
-
key:
|
|
333
|
+
key: view.state.iso,
|
|
169
334
|
class: "rs-calendar-grid__day"
|
|
170
|
-
}, [
|
|
335
|
+
}, [view.cell.inCurrentMonth || __props.showOutside ? (openBlock(), createElementBlock("button", {
|
|
336
|
+
key: 0,
|
|
171
337
|
type: "button",
|
|
172
|
-
class: normalizeClass(["rs-calendar-grid__cell",
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
338
|
+
class: normalizeClass(["rs-calendar-grid__cell", unref(calendarCellClass)(view.state, view.cell.inCurrentMonth)]),
|
|
339
|
+
"data-iso": view.state.iso,
|
|
340
|
+
disabled: view.state.disabled || !view.cell.inCurrentMonth && !__props.selectOutside,
|
|
341
|
+
tabindex: isCellTabbable(view.cell, view.cell.inCurrentMonth) ? 0 : -1,
|
|
342
|
+
"aria-selected": view.state.selected || view.state.rangeStart || view.state.rangeEnd,
|
|
343
|
+
"aria-current": view.state.today ? "date" : void 0,
|
|
344
|
+
"aria-label": cellAriaLabel(view.cell),
|
|
345
|
+
onClick: ($event) => selectDate(view.cell, view.cell.inCurrentMonth, view.state.disabled)
|
|
346
|
+
}, [renderSlot(_ctx.$slots, "cell", mergeProps({ ref_for: true }, cellSlotProps(view, week.weekNumber)), () => [createTextVNode(toDisplayString(view.cell.day), 1)], true)], 10, _hoisted_13)) : createCommentVNode("", true)]);
|
|
176
347
|
}), 128))]);
|
|
177
|
-
}), 128))])])]);
|
|
348
|
+
}), 128))])], 40, _hoisted_10)], 14, _hoisted_1);
|
|
178
349
|
};
|
|
179
350
|
}
|
|
180
351
|
});
|
|
@@ -3,6 +3,6 @@ import _plugin_vue_export_helper_default from "../../../_virtual/_plugin-vue_exp
|
|
|
3
3
|
import RsCalendarGrid_vue_vue_type_script_setup_true_lang_default from "./RsCalendarGrid.impl.js";
|
|
4
4
|
|
|
5
5
|
//#region src/components/calendar-grid/src/RsCalendarGrid.vue
|
|
6
|
-
var RsCalendarGrid_default = /*#__PURE__*/ _plugin_vue_export_helper_default(RsCalendarGrid_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-
|
|
6
|
+
var RsCalendarGrid_default = /*#__PURE__*/ _plugin_vue_export_helper_default(RsCalendarGrid_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-e9d29258"]]);
|
|
7
7
|
//#endregion
|
|
8
8
|
export { RsCalendarGrid_default as default };
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { type RsCalendarCell, type RsDatePickerDisabledDate, type RsParsedDate, type RsWeekStartsOn } from '../../date-picker/src/date-picker-utils';
|
|
2
|
+
export type { RsCalendarCell, RsDatePickerDisabledDate, RsParsedDate, RsWeekStartsOn, };
|
|
3
|
+
/** `#cell` 插槽载荷。墙钟年月日,不是 Date。 */
|
|
4
|
+
export interface RsCalendarGridCellSlot {
|
|
5
|
+
date: RsParsedDate;
|
|
6
|
+
iso: string;
|
|
7
|
+
inCurrentMonth: boolean;
|
|
8
|
+
selected: boolean;
|
|
9
|
+
disabled: boolean;
|
|
10
|
+
today: boolean;
|
|
11
|
+
inRange: boolean;
|
|
12
|
+
rangeStart: boolean;
|
|
13
|
+
rangeEnd: boolean;
|
|
14
|
+
weekNumber: number;
|
|
15
|
+
}
|
|
16
|
+
export interface RsCalendarCellState {
|
|
17
|
+
iso: string;
|
|
18
|
+
selected: boolean;
|
|
19
|
+
rangeStart: boolean;
|
|
20
|
+
rangeEnd: boolean;
|
|
21
|
+
inRange: boolean;
|
|
22
|
+
endpoint: boolean;
|
|
23
|
+
today: boolean;
|
|
24
|
+
disabled: boolean;
|
|
25
|
+
}
|
|
26
|
+
export interface RsCalendarCellView {
|
|
27
|
+
cell: RsCalendarCell;
|
|
28
|
+
state: RsCalendarCellState;
|
|
29
|
+
}
|
|
30
|
+
export interface RsCalendarWeekView {
|
|
31
|
+
days: RsCalendarCellView[];
|
|
32
|
+
weekNumber: number;
|
|
33
|
+
}
|
|
34
|
+
export declare function toDisabledDateSet(dates: readonly string[] | undefined): Set<string>;
|
|
35
|
+
export declare function isCalendarCellDisabled(cell: RsParsedDate, options: {
|
|
36
|
+
disabledDates: ReadonlySet<string>;
|
|
37
|
+
disabledDate?: RsDatePickerDisabledDate;
|
|
38
|
+
minDate?: string;
|
|
39
|
+
maxDate?: string;
|
|
40
|
+
}): boolean;
|
|
41
|
+
export declare function resolveCalendarCellState(cell: RsCalendarCell, options: {
|
|
42
|
+
selected?: RsParsedDate | null;
|
|
43
|
+
rangeStart?: RsParsedDate | null;
|
|
44
|
+
rangeEnd?: RsParsedDate | null;
|
|
45
|
+
today?: RsParsedDate | null;
|
|
46
|
+
disabledDates: ReadonlySet<string>;
|
|
47
|
+
disabledDate?: RsDatePickerDisabledDate;
|
|
48
|
+
minDate?: string;
|
|
49
|
+
maxDate?: string;
|
|
50
|
+
gridDisabled?: boolean;
|
|
51
|
+
}): RsCalendarCellState;
|
|
52
|
+
export declare function calendarCellClass(state: RsCalendarCellState, inCurrentMonth: boolean): Record<string, boolean>;
|
|
53
|
+
export declare function shiftViewMonth(year: number, month: number, delta: number): {
|
|
54
|
+
year: number;
|
|
55
|
+
month: number;
|
|
56
|
+
};
|
|
57
|
+
export declare function shiftViewYear(year: number, delta: number): number;
|
|
58
|
+
export declare function addCalendarDays(date: RsParsedDate, days: number): RsParsedDate;
|
|
59
|
+
export declare function addCalendarMonths(date: RsParsedDate, months: number): RsParsedDate;
|
|
60
|
+
export declare function startOfCalendarWeek(date: RsParsedDate, weekStartsOn: RsWeekStartsOn): RsParsedDate;
|
|
61
|
+
export declare function endOfCalendarWeek(date: RsParsedDate, weekStartsOn: RsWeekStartsOn): RsParsedDate;
|
|
62
|
+
/** ISO-8601 周序号(周四所在年)。不引入 dayjs isoWeek 插件。 */
|
|
63
|
+
export declare function isoWeekOf(date: RsParsedDate): number;
|
|
64
|
+
export declare function weekNumberOfRow(days: readonly RsCalendarCellView[], weekStartsOn: RsWeekStartsOn): number;
|
|
65
|
+
export declare function chunkCalendarWeeks(cells: readonly RsCalendarCellView[]): RsCalendarCellView[][];
|
|
66
|
+
export declare function resolveKeyboardMove(focused: RsParsedDate, key: string, options: {
|
|
67
|
+
weekStartsOn: RsWeekStartsOn;
|
|
68
|
+
rtl: boolean;
|
|
69
|
+
shiftKey: boolean;
|
|
70
|
+
}): RsParsedDate | null;
|
|
71
|
+
export declare function resolveFocusedDate(viewYear: number, viewMonth: number, selected?: RsParsedDate | null): RsParsedDate;
|
|
72
|
+
export declare function sameYearMonth(date: RsParsedDate, year: number, month: number): boolean;
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import { dayjs } from "../../../utils/rs-dayjs.js";
|
|
2
|
+
import { formatDateParts, getTodayDate, isDateBetweenParsed, isDateWithinBounds, isSameDate } from "../../date-picker/src/date-picker-utils.js";
|
|
3
|
+
//#region src/components/calendar-grid/src/calendar-grid-utils.ts
|
|
4
|
+
function toDisabledDateSet(dates) {
|
|
5
|
+
return new Set(dates ?? []);
|
|
6
|
+
}
|
|
7
|
+
function isCalendarCellDisabled(cell, options) {
|
|
8
|
+
const iso = formatDateParts(cell);
|
|
9
|
+
if (options.disabledDates.has(iso)) return true;
|
|
10
|
+
if (options.disabledDate?.({
|
|
11
|
+
year: cell.year,
|
|
12
|
+
month: cell.month,
|
|
13
|
+
day: cell.day
|
|
14
|
+
})) return true;
|
|
15
|
+
return !isDateWithinBounds(cell.year, cell.month, cell.day, {
|
|
16
|
+
minDate: options.minDate,
|
|
17
|
+
maxDate: options.maxDate
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
function resolveCalendarCellState(cell, options) {
|
|
21
|
+
const selected = options.selected ? isSameDate(options.selected, cell) : false;
|
|
22
|
+
const rangeStart = options.rangeStart ? isSameDate(options.rangeStart, cell) : false;
|
|
23
|
+
const rangeEnd = options.rangeEnd ? isSameDate(options.rangeEnd, cell) : false;
|
|
24
|
+
const inRange = Boolean(options.rangeStart && options.rangeEnd && isDateBetweenParsed(cell, options.rangeStart, options.rangeEnd));
|
|
25
|
+
const endpoint = rangeStart || rangeEnd || selected;
|
|
26
|
+
return {
|
|
27
|
+
iso: formatDateParts(cell),
|
|
28
|
+
selected,
|
|
29
|
+
rangeStart,
|
|
30
|
+
rangeEnd,
|
|
31
|
+
inRange: inRange && !endpoint,
|
|
32
|
+
endpoint,
|
|
33
|
+
today: options.today ? isSameDate(options.today, cell) : false,
|
|
34
|
+
disabled: options.gridDisabled === true || isCalendarCellDisabled(cell, options)
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
function calendarCellClass(state, inCurrentMonth) {
|
|
38
|
+
return {
|
|
39
|
+
"rs-calendar-grid__cell--outside": !inCurrentMonth,
|
|
40
|
+
"rs-calendar-grid__cell--selected": state.selected,
|
|
41
|
+
"rs-calendar-grid__cell--range-start": state.rangeStart,
|
|
42
|
+
"rs-calendar-grid__cell--range-end": state.rangeEnd,
|
|
43
|
+
"rs-calendar-grid__cell--in-range": state.inRange,
|
|
44
|
+
"rs-calendar-grid__cell--endpoint": state.endpoint,
|
|
45
|
+
"rs-calendar-grid__cell--today": state.today
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
function addCalendarDays(date, days) {
|
|
49
|
+
const next = dayjs().year(date.year).month(date.month - 1).date(date.day).add(days, "day");
|
|
50
|
+
return {
|
|
51
|
+
year: next.year(),
|
|
52
|
+
month: next.month() + 1,
|
|
53
|
+
day: next.date()
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
function addCalendarMonths(date, months) {
|
|
57
|
+
const nextMonth = dayjs().year(date.year).month(date.month - 1).date(1).add(months, "month");
|
|
58
|
+
const maxDay = nextMonth.daysInMonth();
|
|
59
|
+
return {
|
|
60
|
+
year: nextMonth.year(),
|
|
61
|
+
month: nextMonth.month() + 1,
|
|
62
|
+
day: Math.min(date.day, maxDay)
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
function startOfCalendarWeek(date, weekStartsOn) {
|
|
66
|
+
return addCalendarDays(date, -((dayjs().year(date.year).month(date.month - 1).date(date.day).day() - weekStartsOn + 7) % 7));
|
|
67
|
+
}
|
|
68
|
+
function endOfCalendarWeek(date, weekStartsOn) {
|
|
69
|
+
return addCalendarDays(startOfCalendarWeek(date, weekStartsOn), 6);
|
|
70
|
+
}
|
|
71
|
+
/** ISO-8601 周序号(周四所在年)。不引入 dayjs isoWeek 插件。 */
|
|
72
|
+
function isoWeekOf(date) {
|
|
73
|
+
const current = dayjs().year(date.year).month(date.month - 1).date(date.day);
|
|
74
|
+
const weekday = current.day() || 7;
|
|
75
|
+
const thursday = current.add(4 - weekday, "day");
|
|
76
|
+
const jan1 = dayjs().year(thursday.year()).month(0).date(1);
|
|
77
|
+
return Math.ceil((thursday.diff(jan1, "day") + 1) / 7);
|
|
78
|
+
}
|
|
79
|
+
function weekNumberOfRow(days, weekStartsOn) {
|
|
80
|
+
const pivot = days[(4 - weekStartsOn + 7) % 7]?.cell ?? days[0]?.cell;
|
|
81
|
+
return pivot ? isoWeekOf(pivot) : 0;
|
|
82
|
+
}
|
|
83
|
+
function chunkCalendarWeeks(cells) {
|
|
84
|
+
const rows = [];
|
|
85
|
+
for (let index = 0; index < cells.length; index += 7) rows.push(cells.slice(index, index + 7));
|
|
86
|
+
return rows;
|
|
87
|
+
}
|
|
88
|
+
function arrowDayDelta(key, rtl) {
|
|
89
|
+
if (key === "ArrowLeft") return rtl ? 1 : -1;
|
|
90
|
+
if (key === "ArrowRight") return rtl ? -1 : 1;
|
|
91
|
+
if (key === "ArrowUp") return -7;
|
|
92
|
+
if (key === "ArrowDown") return 7;
|
|
93
|
+
return null;
|
|
94
|
+
}
|
|
95
|
+
function resolveKeyboardMove(focused, key, options) {
|
|
96
|
+
const days = arrowDayDelta(key, options.rtl);
|
|
97
|
+
if (days != null) return addCalendarDays(focused, days);
|
|
98
|
+
if (key === "Home") return startOfCalendarWeek(focused, options.weekStartsOn);
|
|
99
|
+
if (key === "End") return endOfCalendarWeek(focused, options.weekStartsOn);
|
|
100
|
+
if (key === "PageUp") return addCalendarMonths(focused, options.shiftKey ? -12 : -1);
|
|
101
|
+
if (key === "PageDown") return addCalendarMonths(focused, options.shiftKey ? 12 : 1);
|
|
102
|
+
return null;
|
|
103
|
+
}
|
|
104
|
+
function resolveFocusedDate(viewYear, viewMonth, selected) {
|
|
105
|
+
if (selected?.year === viewYear && selected.month === viewMonth) return {
|
|
106
|
+
year: selected.year,
|
|
107
|
+
month: selected.month,
|
|
108
|
+
day: selected.day
|
|
109
|
+
};
|
|
110
|
+
const today = getTodayDate();
|
|
111
|
+
if (today.year === viewYear && today.month === viewMonth) return today;
|
|
112
|
+
return {
|
|
113
|
+
year: viewYear,
|
|
114
|
+
month: viewMonth,
|
|
115
|
+
day: 1
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
function sameYearMonth(date, year, month) {
|
|
119
|
+
return date.year === year && date.month === month;
|
|
120
|
+
}
|
|
121
|
+
//#endregion
|
|
122
|
+
export { addCalendarDays, addCalendarMonths, calendarCellClass, chunkCalendarWeeks, endOfCalendarWeek, isCalendarCellDisabled, isoWeekOf, resolveCalendarCellState, resolveFocusedDate, resolveKeyboardMove, sameYearMonth, startOfCalendarWeek, toDisabledDateSet, weekNumberOfRow };
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
export { default as RsCard } from './src/RsCard.js';
|
|
2
|
-
export type { RsCardSize, RsCardVariant } from './src/
|
|
2
|
+
export type { RsCardSize, RsCardVariant } from './src/card-utils';
|