niuma-ui 2.0.2 → 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.
Files changed (242) hide show
  1. package/CHANGELOG.md +61 -0
  2. package/README.md +2 -0
  3. package/README.zh-CN.md +2 -0
  4. package/dist/components/_shared/src/reka.d.ts +1 -1
  5. package/dist/components/_shared/src/reka.js +2 -2
  6. package/dist/components/anchor/index.d.ts +1 -1
  7. package/dist/components/anchor/src/RsAnchor.css +63 -32
  8. package/dist/components/anchor/src/RsAnchor.d.ts +29 -2
  9. package/dist/components/anchor/src/RsAnchor.impl.js +199 -81
  10. package/dist/components/anchor/src/RsAnchor.js +1 -1
  11. package/dist/components/anchor/src/anchor-utils.d.ts +36 -4
  12. package/dist/components/anchor/src/anchor-utils.js +81 -19
  13. package/dist/components/auto-complete/index.d.ts +2 -0
  14. package/dist/components/auto-complete/src/RsAutoComplete.css +122 -0
  15. package/dist/components/auto-complete/src/RsAutoComplete.d.ts +47 -7
  16. package/dist/components/auto-complete/src/RsAutoComplete.impl.js +180 -72
  17. package/dist/components/auto-complete/src/RsAutoComplete.js +4 -1
  18. package/dist/components/auto-complete/src/auto-complete-utils.d.ts +7 -0
  19. package/dist/components/auto-complete/src/auto-complete-utils.js +17 -0
  20. package/dist/components/avatar/index.d.ts +1 -0
  21. package/dist/components/avatar/src/RsAvatar.css +36 -19
  22. package/dist/components/avatar/src/RsAvatar.d.ts +9 -3
  23. package/dist/components/avatar/src/RsAvatar.impl.js +57 -33
  24. package/dist/components/avatar/src/RsAvatar.js +2 -1
  25. package/dist/components/avatar/src/avatar-utils.d.ts +16 -7
  26. package/dist/components/avatar/src/avatar-utils.js +41 -3
  27. package/dist/components/badge/index.d.ts +1 -0
  28. package/dist/components/badge/src/RsBadge.css +61 -8
  29. package/dist/components/badge/src/RsBadge.d.ts +19 -3
  30. package/dist/components/badge/src/RsBadge.impl.js +46 -3
  31. package/dist/components/badge/src/RsBadge.js +1 -1
  32. package/dist/components/badge/src/badge-utils.d.ts +11 -0
  33. package/dist/components/badge/src/badge-utils.js +32 -0
  34. package/dist/components/breadcrumb/index.d.ts +1 -1
  35. package/dist/components/breadcrumb/src/RsBreadcrumb.css +50 -17
  36. package/dist/components/breadcrumb/src/RsBreadcrumb.d.ts +45 -6
  37. package/dist/components/breadcrumb/src/RsBreadcrumb.impl.js +111 -12
  38. package/dist/components/breadcrumb/src/RsBreadcrumb.js +2 -1
  39. package/dist/components/breadcrumb/src/breadcrumb-utils.d.ts +37 -5
  40. package/dist/components/breadcrumb/src/breadcrumb-utils.js +70 -9
  41. package/dist/components/button/src/RsButton.css +87 -71
  42. package/dist/components/button/src/RsButton.d.ts +7 -3
  43. package/dist/components/button/src/RsButton.impl.js +43 -31
  44. package/dist/components/button/src/RsButton.js +1 -1
  45. package/dist/components/button/src/button-utils.d.ts +17 -0
  46. package/dist/components/button/src/button-utils.js +14 -1
  47. package/dist/components/calendar-grid/index.d.ts +2 -0
  48. package/dist/components/calendar-grid/src/RsCalendarGrid.css +105 -45
  49. package/dist/components/calendar-grid/src/RsCalendarGrid.d.ts +62 -2
  50. package/dist/components/calendar-grid/src/RsCalendarGrid.impl.js +265 -94
  51. package/dist/components/calendar-grid/src/RsCalendarGrid.js +1 -1
  52. package/dist/components/calendar-grid/src/calendar-grid-utils.d.ts +72 -0
  53. package/dist/components/calendar-grid/src/calendar-grid-utils.js +122 -0
  54. package/dist/components/card/index.d.ts +1 -1
  55. package/dist/components/card/src/RsCard.css +108 -98
  56. package/dist/components/card/src/RsCard.d.ts +3 -12
  57. package/dist/components/card/src/RsCard.impl.js +29 -25
  58. package/dist/components/card/src/RsCard.js +2 -1
  59. package/dist/components/card/src/card-utils.d.ts +25 -0
  60. package/dist/components/card/src/card-utils.js +10 -0
  61. package/dist/components/cascader/index.d.ts +1 -0
  62. package/dist/components/cascader/src/RsCascader.css +175 -30
  63. package/dist/components/cascader/src/RsCascader.d.ts +14 -2
  64. package/dist/components/cascader/src/RsCascader.impl.js +277 -48
  65. package/dist/components/cascader/src/RsCascader.js +1 -1
  66. package/dist/components/cascader/src/cascader-utils.d.ts +2 -0
  67. package/dist/components/cascader/src/cascader-utils.js +8 -1
  68. package/dist/components/checkbox/index.d.ts +1 -0
  69. package/dist/components/checkbox/src/RsCheckbox.css +46 -23
  70. package/dist/components/checkbox/src/RsCheckbox.d.ts +11 -1
  71. package/dist/components/checkbox/src/RsCheckbox.impl.js +37 -9
  72. package/dist/components/checkbox/src/RsCheckbox.js +2 -1
  73. package/dist/components/checkbox/src/checkbox-utils.d.ts +4 -0
  74. package/dist/components/checkbox/src/checkbox-utils.js +12 -0
  75. package/dist/components/container/index.d.ts +1 -1
  76. package/dist/components/container/src/RsContainer.css +11 -11
  77. package/dist/components/container/src/RsContainer.d.ts +2 -12
  78. package/dist/components/container/src/RsContainer.impl.js +10 -57
  79. package/dist/components/container/src/RsContainer.js +1 -1
  80. package/dist/components/container/src/container-utils.d.ts +23 -0
  81. package/dist/components/container/src/container-utils.js +51 -0
  82. package/dist/components/date-picker/index.d.ts +4 -2
  83. package/dist/components/date-picker/src/RsDatePicker.css +42 -22
  84. package/dist/components/date-picker/src/RsDatePicker.d.ts +44 -20
  85. package/dist/components/date-picker/src/RsDatePicker.impl.js +484 -222
  86. package/dist/components/date-picker/src/RsDatePicker.js +1 -3
  87. package/dist/components/date-picker/src/RsDateTimePicker.d.ts +33 -6
  88. package/dist/components/date-picker/src/RsDateTimePicker.impl.js +47 -6
  89. package/dist/components/date-picker/src/date-picker-utils.d.ts +19 -0
  90. package/dist/components/date-picker/src/date-picker-utils.js +33 -10
  91. package/dist/components/divider/index.d.ts +1 -0
  92. package/dist/components/divider/src/RsDivider.css +37 -22
  93. package/dist/components/divider/src/RsDivider.d.ts +4 -2
  94. package/dist/components/divider/src/RsDivider.impl.js +26 -12
  95. package/dist/components/divider/src/RsDivider.js +1 -1
  96. package/dist/components/divider/src/divider-utils.d.ts +4 -0
  97. package/dist/components/dynamic-tags/index.d.ts +1 -1
  98. package/dist/components/dynamic-tags/src/RsDynamicTags.css +115 -38
  99. package/dist/components/dynamic-tags/src/RsDynamicTags.d.ts +59 -18
  100. package/dist/components/dynamic-tags/src/RsDynamicTags.impl.js +269 -106
  101. package/dist/components/dynamic-tags/src/RsDynamicTags.js +1 -1
  102. package/dist/components/dynamic-tags/src/dynamic-tags-utils.d.ts +19 -0
  103. package/dist/components/dynamic-tags/src/dynamic-tags-utils.js +60 -0
  104. package/dist/components/fieldset/src/RsFieldset.css +71 -41
  105. package/dist/components/fieldset/src/RsFieldset.d.ts +21 -2
  106. package/dist/components/fieldset/src/RsFieldset.impl.js +93 -26
  107. package/dist/components/fieldset/src/RsFieldset.js +1 -1
  108. package/dist/components/fieldset/src/fieldset-utils.d.ts +4 -0
  109. package/dist/components/fieldset/src/fieldset-utils.js +9 -1
  110. package/dist/components/form/index.d.ts +1 -0
  111. package/dist/components/form/src/RsForm.css +15 -12
  112. package/dist/components/form/src/RsForm.d.ts +20 -22
  113. package/dist/components/form/src/RsForm.impl.js +33 -20
  114. package/dist/components/form/src/RsForm.js +1 -1
  115. package/dist/components/form/src/form-utils.d.ts +7 -0
  116. package/dist/components/form/src/form-utils.js +28 -1
  117. package/dist/components/icon/src/RsIcon.css +9 -4
  118. package/dist/components/icon/src/RsIcon.d.ts +4 -3
  119. package/dist/components/icon/src/RsIcon.impl.js +9 -32
  120. package/dist/components/icon/src/RsIcon.js +1 -1
  121. package/dist/components/icon/src/icon-utils.d.ts +17 -0
  122. package/dist/components/icon/src/icon-utils.js +39 -0
  123. package/dist/components/input/index.d.ts +1 -1
  124. package/dist/components/input/src/RsInput.css +78 -260
  125. package/dist/components/input/src/RsInput.d.ts +5 -3
  126. package/dist/components/input/src/RsInput.impl.js +8 -16
  127. package/dist/components/input/src/RsInput.js +1 -1
  128. package/dist/components/input/src/input-utils.d.ts +11 -0
  129. package/dist/components/input/src/input-utils.js +22 -0
  130. package/dist/components/input-number/index.d.ts +1 -0
  131. package/dist/components/input-number/src/RsInputNumber.css +31 -31
  132. package/dist/components/input-number/src/RsInputNumber.d.ts +15 -13
  133. package/dist/components/input-number/src/RsInputNumber.impl.js +17 -4
  134. package/dist/components/input-number/src/RsInputNumber.js +1 -1
  135. package/dist/components/label/src/RsLabel.css +30 -11
  136. package/dist/components/label/src/RsLabel.d.ts +18 -1
  137. package/dist/components/label/src/RsLabel.impl.js +63 -10
  138. package/dist/components/label/src/RsLabel.js +1 -1
  139. package/dist/components/label/src/label-utils.d.ts +6 -0
  140. package/dist/components/label/src/label-utils.js +16 -0
  141. package/dist/components/link/index.d.ts +1 -0
  142. package/dist/components/link/src/RsLink.css +58 -17
  143. package/dist/components/link/src/RsLink.d.ts +12 -4
  144. package/dist/components/link/src/RsLink.impl.js +26 -25
  145. package/dist/components/link/src/RsLink.js +2 -1
  146. package/dist/components/link/src/link-utils.d.ts +9 -0
  147. package/dist/components/link/src/link-utils.js +15 -0
  148. package/dist/components/loading/src/RsLoading.d.ts +2 -2
  149. package/dist/components/mentions/index.d.ts +2 -1
  150. package/dist/components/mentions/src/RsMentions.css +119 -3
  151. package/dist/components/mentions/src/RsMentions.d.ts +56 -4
  152. package/dist/components/mentions/src/RsMentions.impl.js +298 -79
  153. package/dist/components/mentions/src/RsMentions.js +1 -3
  154. package/dist/components/mentions/src/mentions-utils.d.ts +5 -1
  155. package/dist/components/mentions/src/mentions-utils.js +28 -9
  156. package/dist/components/popover/src/RsPopover.d.ts +1 -1
  157. package/dist/components/radio/index.d.ts +1 -1
  158. package/dist/components/radio/src/RsRadio.css +7 -6
  159. package/dist/components/radio/src/RsRadio.d.ts +8 -5
  160. package/dist/components/radio/src/RsRadio.impl.js +34 -24
  161. package/dist/components/radio/src/RsRadio.js +2 -1
  162. package/dist/components/radio/src/RsRadioItem.css +61 -44
  163. package/dist/components/radio/src/RsRadioItem.d.ts +2 -2
  164. package/dist/components/radio/src/RsRadioItem.impl.js +53 -20
  165. package/dist/components/radio/src/RsRadioItem.js +2 -1
  166. package/dist/components/radio/src/radio-utils.d.ts +12 -1
  167. package/dist/components/radio/src/radio-utils.js +15 -1
  168. package/dist/components/scrollbar/src/RsScrollbar.css +71 -24
  169. package/dist/components/scrollbar/src/RsScrollbar.d.ts +9 -5
  170. package/dist/components/scrollbar/src/RsScrollbar.impl.js +372 -47
  171. package/dist/components/scrollbar/src/RsScrollbar.js +2 -1
  172. package/dist/components/scrollbar/src/scrollbar-utils.d.ts +34 -2
  173. package/dist/components/scrollbar/src/scrollbar-utils.js +64 -1
  174. package/dist/components/select/index.d.ts +1 -0
  175. package/dist/components/select/src/RsSelect.css +54 -42
  176. package/dist/components/select/src/RsSelect.d.ts +19 -2
  177. package/dist/components/select/src/RsSelect.impl.js +727 -312
  178. package/dist/components/select/src/RsSelect.js +1 -1
  179. package/dist/components/select/src/select-utils.d.ts +4 -2
  180. package/dist/components/select/src/select-utils.js +8 -3
  181. package/dist/components/select/src/use-rs-select.d.ts +1 -0
  182. package/dist/components/select/src/use-rs-select.js +23 -17
  183. package/dist/components/switch/index.d.ts +2 -1
  184. package/dist/components/switch/src/RsSwitch.css +36 -18
  185. package/dist/components/switch/src/RsSwitch.d.ts +18 -5
  186. package/dist/components/switch/src/RsSwitch.impl.js +61 -29
  187. package/dist/components/switch/src/RsSwitch.js +2 -1
  188. package/dist/components/switch/src/switch-utils.d.ts +4 -0
  189. package/dist/components/switch/src/switch-utils.js +9 -0
  190. package/dist/components/tag/index.d.ts +1 -1
  191. package/dist/components/tag/src/RsTag.css +42 -38
  192. package/dist/components/tag/src/RsTag.d.ts +3 -2
  193. package/dist/components/tag/src/RsTag.impl.js +18 -9
  194. package/dist/components/tag/src/RsTag.js +1 -1
  195. package/dist/components/tag/src/tag-utils.d.ts +8 -0
  196. package/dist/components/terminal/src/RsTerminal.d.ts +1 -1
  197. package/dist/components/textarea/src/RsTextarea.css +23 -23
  198. package/dist/components/textarea/src/RsTextarea.d.ts +6 -12
  199. package/dist/components/textarea/src/RsTextarea.impl.js +37 -46
  200. package/dist/components/textarea/src/RsTextarea.js +1 -1
  201. package/dist/components/textarea/src/textarea-utils.d.ts +27 -0
  202. package/dist/components/textarea/src/textarea-utils.js +61 -0
  203. package/dist/components/time-picker/index.d.ts +3 -2
  204. package/dist/components/time-picker/src/RsTimePicker.css +41 -24
  205. package/dist/components/time-picker/src/RsTimePicker.d.ts +52 -7
  206. package/dist/components/time-picker/src/RsTimePicker.impl.js +520 -156
  207. package/dist/components/time-picker/src/RsTimePicker.js +1 -3
  208. package/dist/components/time-picker/src/RsTimePickerColumns.css +26 -18
  209. package/dist/components/time-picker/src/RsTimePickerColumns.d.ts +3 -1
  210. package/dist/components/time-picker/src/RsTimePickerColumns.impl.js +62 -9
  211. package/dist/components/time-picker/src/RsTimePickerColumns.js +1 -1
  212. package/dist/components/time-picker/src/time-picker-utils.d.ts +38 -0
  213. package/dist/components/time-picker/src/time-picker-utils.js +97 -5
  214. package/dist/components/toaster/src/RsToaster.d.ts +1 -1
  215. package/dist/components/tooltip/src/RsTooltip.d.ts +1 -1
  216. package/dist/components/tree/src/RsTree.d.ts +3 -3
  217. package/dist/components/tree-select/index.d.ts +2 -0
  218. package/dist/components/tree-select/src/RsTreeSelect.css +100 -25
  219. package/dist/components/tree-select/src/RsTreeSelect.d.ts +91 -7
  220. package/dist/components/tree-select/src/RsTreeSelect.impl.js +464 -79
  221. package/dist/components/tree-select/src/RsTreeSelect.js +1 -1
  222. package/dist/components/tree-select/src/tree-select-utils.d.ts +20 -0
  223. package/dist/components/tree-select/src/tree-select-utils.js +60 -0
  224. package/dist/components/upload/index.d.ts +2 -1
  225. package/dist/components/upload/src/RsUpload.css +223 -75
  226. package/dist/components/upload/src/RsUpload.d.ts +77 -1
  227. package/dist/components/upload/src/RsUpload.impl.js +404 -90
  228. package/dist/components/upload/src/RsUpload.js +1 -1
  229. package/dist/components/upload/src/upload-utils.d.ts +21 -2
  230. package/dist/components/upload/src/upload-utils.js +139 -9
  231. package/dist/index.d.ts +24 -11
  232. package/dist/index.js +6 -0
  233. package/dist/locale/messages.js +46 -2
  234. package/dist/styles.css +518 -154
  235. package/dist/theme/brand.example.css +1 -1
  236. package/package.json +9 -8
  237. package/dist/components/breadcrumb/src/RsBreadcrumbItems.d.ts +0 -8
  238. package/dist/components/breadcrumb/src/RsBreadcrumbItems.impl.js +0 -40
  239. package/dist/components/breadcrumb/src/RsBreadcrumbItems.js +0 -5
  240. package/dist/components/date-picker/src/RsDatePicker-1.css +0 -157
  241. package/dist/components/mentions/src/RsMentions-1.css +0 -29
  242. 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 { buildCalendarGrid, formatDateParts, isDateBetweenParsed, isDateWithinBounds, isSameDate } from "../../date-picker/src/date-picker-utils.js";
4
- import { Fragment, computed, createElementBlock, createElementVNode, createVNode, defineComponent, mergeModels, normalizeClass, openBlock, renderList, toDisplayString, unref, useModel } from "vue";
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 = { class: "rs-calendar-grid" };
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 = { class: "rs-calendar-grid__title" };
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 = { class: "rs-calendar-grid__table" };
16
- var _hoisted_11 = ["disabled", "onClick"];
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 monday = new Date(2024, 0, 1);
107
+ const sunday = new Date(2024, 0, 7);
42
108
  return Array.from({ length: 7 }, (_, index) => {
43
- const date = new Date(monday);
44
- date.setDate(monday.getDate() + index);
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 monthLabel = computed(() => new Intl.DateTimeFormat(locale.value, {
114
+ const monthFormatter = computed(() => new Intl.DateTimeFormat(locale.value, {
49
115
  year: "numeric",
50
116
  month: "long"
51
- }).format(new Date(viewYear.value, viewMonth.value - 1, 1)));
52
- const cells = computed(() => buildCalendarGrid(viewYear.value, viewMonth.value));
53
- const weeks = computed(() => {
54
- const rows = [];
55
- for (let index = 0; index < cells.value.length; index += 7) rows.push(cells.value.slice(index, index + 7));
56
- return rows;
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
- viewYear.value -= 1;
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
- viewYear.value += 1;
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 (viewMonth.value === 1) {
66
- viewYear.value -= 1;
67
- viewMonth.value = 12;
68
- return;
69
- }
70
- viewMonth.value -= 1;
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 (viewMonth.value === 12) {
74
- viewYear.value += 1;
75
- viewMonth.value = 1;
76
- return;
77
- }
78
- viewMonth.value += 1;
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 isSelected(cell) {
81
- return props.selected ? isSameDate(props.selected, cell) : false;
82
- }
83
- function isRangeStart(cell) {
84
- return props.rangeStart ? isSameDate(props.rangeStart, cell) : false;
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 isRangeEnd(cell) {
87
- return props.rangeEnd ? isSameDate(props.rangeEnd, cell) : false;
223
+ function moveFocus(next) {
224
+ applyView(next);
225
+ nextTick(() => focusCell(next));
88
226
  }
89
- function isInRange(cell) {
90
- if (!props.rangeStart || !props.rangeEnd) return false;
91
- return isDateBetweenParsed(cell, props.rangeStart, props.rangeEnd);
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 isDisabled(cell) {
94
- const iso = formatDateParts(cell);
95
- if (props.disabledDates.includes(iso)) return true;
96
- return !isDateWithinBounds(cell.year, cell.month, cell.day, {
97
- minDate: props.minDate,
98
- maxDate: props.maxDate
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 cellClass(cell) {
102
- const endpoint = isRangeStart(cell) || isRangeEnd(cell);
103
- const inRange = isInRange(cell);
104
- const selected = isSelected(cell);
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 selectDate(cell) {
115
- if (isDisabled(cell)) return;
116
- emit("select", {
117
- year: cell.year,
118
- month: cell.month,
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", _hoisted_1, [createElementVNode("div", _hoisted_2, [
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)("datePicker.prevYear"),
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: 16
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)("datePicker.prevMonth"),
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: 16
140
- })], 8, _hoisted_5)]),
141
- createElementVNode("span", _hoisted_6, toDisplayString(monthLabel.value), 1),
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)("datePicker.nextMonth"),
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: 16
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)("datePicker.nextYear"),
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: 16
158
- })], 8, _hoisted_9)])
159
- ]), createElementVNode("table", _hoisted_10, [createElementVNode("thead", null, [createElementVNode("tr", null, [(openBlock(true), createElementBlock(Fragment, null, renderList(weekdayLabels.value, (label, index) => {
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, (cell) => {
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: unref(formatDateParts)(cell),
333
+ key: view.state.iso,
169
334
  class: "rs-calendar-grid__day"
170
- }, [createElementVNode("button", {
335
+ }, [view.cell.inCurrentMonth || __props.showOutside ? (openBlock(), createElementBlock("button", {
336
+ key: 0,
171
337
  type: "button",
172
- class: normalizeClass(["rs-calendar-grid__cell", cellClass(cell)]),
173
- disabled: isDisabled(cell),
174
- onClick: ($event) => selectDate(cell)
175
- }, toDisplayString(cell.day), 11, _hoisted_11)]);
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-35786efd"]]);
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/RsCard.js';
2
+ export type { RsCardSize, RsCardVariant } from './src/card-utils';