@salt-ds/date-components 0.0.0-snapshot-20260330155807

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 (227) hide show
  1. package/CHANGELOG.md +109 -0
  2. package/README.md +63 -0
  3. package/css/salt-date-components.css +633 -0
  4. package/dist-cjs/calendar/Calendar.css.js +6 -0
  5. package/dist-cjs/calendar/Calendar.css.js.map +1 -0
  6. package/dist-cjs/calendar/Calendar.js +154 -0
  7. package/dist-cjs/calendar/Calendar.js.map +1 -0
  8. package/dist-cjs/calendar/CalendarGrid.js +85 -0
  9. package/dist-cjs/calendar/CalendarGrid.js.map +1 -0
  10. package/dist-cjs/calendar/CalendarMonthHeader.css.js +6 -0
  11. package/dist-cjs/calendar/CalendarMonthHeader.css.js.map +1 -0
  12. package/dist-cjs/calendar/CalendarMonthHeader.js +41 -0
  13. package/dist-cjs/calendar/CalendarMonthHeader.js.map +1 -0
  14. package/dist-cjs/calendar/CalendarNavigation.css.js +6 -0
  15. package/dist-cjs/calendar/CalendarNavigation.css.js.map +1 -0
  16. package/dist-cjs/calendar/CalendarNavigation.js +334 -0
  17. package/dist-cjs/calendar/CalendarNavigation.js.map +1 -0
  18. package/dist-cjs/calendar/CalendarWeekHeader.css.js +6 -0
  19. package/dist-cjs/calendar/CalendarWeekHeader.css.js.map +1 -0
  20. package/dist-cjs/calendar/CalendarWeekHeader.js +46 -0
  21. package/dist-cjs/calendar/CalendarWeekHeader.js.map +1 -0
  22. package/dist-cjs/calendar/internal/CalendarContext.js +23 -0
  23. package/dist-cjs/calendar/internal/CalendarContext.js.map +1 -0
  24. package/dist-cjs/calendar/internal/CalendarDay.css.js +6 -0
  25. package/dist-cjs/calendar/internal/CalendarDay.css.js.map +1 -0
  26. package/dist-cjs/calendar/internal/CalendarDay.js +98 -0
  27. package/dist-cjs/calendar/internal/CalendarDay.js.map +1 -0
  28. package/dist-cjs/calendar/internal/CalendarMonth.css.js +6 -0
  29. package/dist-cjs/calendar/internal/CalendarMonth.css.js.map +1 -0
  30. package/dist-cjs/calendar/internal/CalendarMonth.js +81 -0
  31. package/dist-cjs/calendar/internal/CalendarMonth.js.map +1 -0
  32. package/dist-cjs/calendar/internal/createAnnouncement.js +90 -0
  33. package/dist-cjs/calendar/internal/createAnnouncement.js.map +1 -0
  34. package/dist-cjs/calendar/internal/useFocusManagement.js +66 -0
  35. package/dist-cjs/calendar/internal/useFocusManagement.js.map +1 -0
  36. package/dist-cjs/calendar/internal/utils.js +50 -0
  37. package/dist-cjs/calendar/internal/utils.js.map +1 -0
  38. package/dist-cjs/calendar/useCalendar.js +464 -0
  39. package/dist-cjs/calendar/useCalendar.js.map +1 -0
  40. package/dist-cjs/calendar/useCalendarDay.js +84 -0
  41. package/dist-cjs/calendar/useCalendarDay.js.map +1 -0
  42. package/dist-cjs/calendar/useCalendarSelection.js +353 -0
  43. package/dist-cjs/calendar/useCalendarSelection.js.map +1 -0
  44. package/dist-cjs/calendar/useDateSelectionAnnouncer.js +52 -0
  45. package/dist-cjs/calendar/useDateSelectionAnnouncer.js.map +1 -0
  46. package/dist-cjs/date-input/DateInput.css.js +6 -0
  47. package/dist-cjs/date-input/DateInput.css.js.map +1 -0
  48. package/dist-cjs/date-input/DateInputRange.js +353 -0
  49. package/dist-cjs/date-input/DateInputRange.js.map +1 -0
  50. package/dist-cjs/date-input/DateInputSingle.js +237 -0
  51. package/dist-cjs/date-input/DateInputSingle.js.map +1 -0
  52. package/dist-cjs/date-picker/DatePicker.js +83 -0
  53. package/dist-cjs/date-picker/DatePicker.js.map +1 -0
  54. package/dist-cjs/date-picker/DatePickerActions.css.js +6 -0
  55. package/dist-cjs/date-picker/DatePickerActions.css.js.map +1 -0
  56. package/dist-cjs/date-picker/DatePickerActions.js +119 -0
  57. package/dist-cjs/date-picker/DatePickerActions.js.map +1 -0
  58. package/dist-cjs/date-picker/DatePickerContext.js +36 -0
  59. package/dist-cjs/date-picker/DatePickerContext.js.map +1 -0
  60. package/dist-cjs/date-picker/DatePickerHelperText.css.js +6 -0
  61. package/dist-cjs/date-picker/DatePickerHelperText.css.js.map +1 -0
  62. package/dist-cjs/date-picker/DatePickerHelperText.js +36 -0
  63. package/dist-cjs/date-picker/DatePickerHelperText.js.map +1 -0
  64. package/dist-cjs/date-picker/DatePickerOverlay.css.js +6 -0
  65. package/dist-cjs/date-picker/DatePickerOverlay.css.js.map +1 -0
  66. package/dist-cjs/date-picker/DatePickerOverlay.js +49 -0
  67. package/dist-cjs/date-picker/DatePickerOverlay.js.map +1 -0
  68. package/dist-cjs/date-picker/DatePickerOverlayProvider.js +164 -0
  69. package/dist-cjs/date-picker/DatePickerOverlayProvider.js.map +1 -0
  70. package/dist-cjs/date-picker/DatePickerPanel.css.js +6 -0
  71. package/dist-cjs/date-picker/DatePickerPanel.css.js.map +1 -0
  72. package/dist-cjs/date-picker/DatePickerRangeGridPanel.js +250 -0
  73. package/dist-cjs/date-picker/DatePickerRangeGridPanel.js.map +1 -0
  74. package/dist-cjs/date-picker/DatePickerRangeInput.js +206 -0
  75. package/dist-cjs/date-picker/DatePickerRangeInput.js.map +1 -0
  76. package/dist-cjs/date-picker/DatePickerRangePanel.js +365 -0
  77. package/dist-cjs/date-picker/DatePickerRangePanel.js.map +1 -0
  78. package/dist-cjs/date-picker/DatePickerSingleGridPanel.js +262 -0
  79. package/dist-cjs/date-picker/DatePickerSingleGridPanel.js.map +1 -0
  80. package/dist-cjs/date-picker/DatePickerSingleInput.js +150 -0
  81. package/dist-cjs/date-picker/DatePickerSingleInput.js.map +1 -0
  82. package/dist-cjs/date-picker/DatePickerSinglePanel.js +20 -0
  83. package/dist-cjs/date-picker/DatePickerSinglePanel.js.map +1 -0
  84. package/dist-cjs/date-picker/DatePickerTrigger.js +32 -0
  85. package/dist-cjs/date-picker/DatePickerTrigger.js.map +1 -0
  86. package/dist-cjs/date-picker/useDatePicker.js +222 -0
  87. package/dist-cjs/date-picker/useDatePicker.js.map +1 -0
  88. package/dist-cjs/date-picker/useFocusOut.js +43 -0
  89. package/dist-cjs/date-picker/useFocusOut.js.map +1 -0
  90. package/dist-cjs/date-picker/useKeyboard.js +22 -0
  91. package/dist-cjs/date-picker/useKeyboard.js.map +1 -0
  92. package/dist-cjs/index.js +64 -0
  93. package/dist-cjs/index.js.map +1 -0
  94. package/dist-cjs/localization-provider/LocalizationProvider.js +51 -0
  95. package/dist-cjs/localization-provider/LocalizationProvider.js.map +1 -0
  96. package/dist-es/calendar/Calendar.css.js +4 -0
  97. package/dist-es/calendar/Calendar.css.js.map +1 -0
  98. package/dist-es/calendar/Calendar.js +152 -0
  99. package/dist-es/calendar/Calendar.js.map +1 -0
  100. package/dist-es/calendar/CalendarGrid.js +83 -0
  101. package/dist-es/calendar/CalendarGrid.js.map +1 -0
  102. package/dist-es/calendar/CalendarMonthHeader.css.js +4 -0
  103. package/dist-es/calendar/CalendarMonthHeader.css.js.map +1 -0
  104. package/dist-es/calendar/CalendarMonthHeader.js +39 -0
  105. package/dist-es/calendar/CalendarMonthHeader.js.map +1 -0
  106. package/dist-es/calendar/CalendarNavigation.css.js +4 -0
  107. package/dist-es/calendar/CalendarNavigation.css.js.map +1 -0
  108. package/dist-es/calendar/CalendarNavigation.js +332 -0
  109. package/dist-es/calendar/CalendarNavigation.js.map +1 -0
  110. package/dist-es/calendar/CalendarWeekHeader.css.js +4 -0
  111. package/dist-es/calendar/CalendarWeekHeader.css.js.map +1 -0
  112. package/dist-es/calendar/CalendarWeekHeader.js +44 -0
  113. package/dist-es/calendar/CalendarWeekHeader.js.map +1 -0
  114. package/dist-es/calendar/internal/CalendarContext.js +20 -0
  115. package/dist-es/calendar/internal/CalendarContext.js.map +1 -0
  116. package/dist-es/calendar/internal/CalendarDay.css.js +4 -0
  117. package/dist-es/calendar/internal/CalendarDay.css.js.map +1 -0
  118. package/dist-es/calendar/internal/CalendarDay.js +96 -0
  119. package/dist-es/calendar/internal/CalendarDay.js.map +1 -0
  120. package/dist-es/calendar/internal/CalendarMonth.css.js +4 -0
  121. package/dist-es/calendar/internal/CalendarMonth.css.js.map +1 -0
  122. package/dist-es/calendar/internal/CalendarMonth.js +79 -0
  123. package/dist-es/calendar/internal/CalendarMonth.js.map +1 -0
  124. package/dist-es/calendar/internal/createAnnouncement.js +87 -0
  125. package/dist-es/calendar/internal/createAnnouncement.js.map +1 -0
  126. package/dist-es/calendar/internal/useFocusManagement.js +64 -0
  127. package/dist-es/calendar/internal/useFocusManagement.js.map +1 -0
  128. package/dist-es/calendar/internal/utils.js +44 -0
  129. package/dist-es/calendar/internal/utils.js.map +1 -0
  130. package/dist-es/calendar/useCalendar.js +462 -0
  131. package/dist-es/calendar/useCalendar.js.map +1 -0
  132. package/dist-es/calendar/useCalendarDay.js +82 -0
  133. package/dist-es/calendar/useCalendarDay.js.map +1 -0
  134. package/dist-es/calendar/useCalendarSelection.js +349 -0
  135. package/dist-es/calendar/useCalendarSelection.js.map +1 -0
  136. package/dist-es/calendar/useDateSelectionAnnouncer.js +50 -0
  137. package/dist-es/calendar/useDateSelectionAnnouncer.js.map +1 -0
  138. package/dist-es/date-input/DateInput.css.js +4 -0
  139. package/dist-es/date-input/DateInput.css.js.map +1 -0
  140. package/dist-es/date-input/DateInputRange.js +350 -0
  141. package/dist-es/date-input/DateInputRange.js.map +1 -0
  142. package/dist-es/date-input/DateInputSingle.js +235 -0
  143. package/dist-es/date-input/DateInputSingle.js.map +1 -0
  144. package/dist-es/date-picker/DatePicker.js +80 -0
  145. package/dist-es/date-picker/DatePicker.js.map +1 -0
  146. package/dist-es/date-picker/DatePickerActions.css.js +4 -0
  147. package/dist-es/date-picker/DatePickerActions.css.js.map +1 -0
  148. package/dist-es/date-picker/DatePickerActions.js +117 -0
  149. package/dist-es/date-picker/DatePickerActions.js.map +1 -0
  150. package/dist-es/date-picker/DatePickerContext.js +32 -0
  151. package/dist-es/date-picker/DatePickerContext.js.map +1 -0
  152. package/dist-es/date-picker/DatePickerHelperText.css.js +4 -0
  153. package/dist-es/date-picker/DatePickerHelperText.css.js.map +1 -0
  154. package/dist-es/date-picker/DatePickerHelperText.js +34 -0
  155. package/dist-es/date-picker/DatePickerHelperText.js.map +1 -0
  156. package/dist-es/date-picker/DatePickerOverlay.css.js +4 -0
  157. package/dist-es/date-picker/DatePickerOverlay.css.js.map +1 -0
  158. package/dist-es/date-picker/DatePickerOverlay.js +47 -0
  159. package/dist-es/date-picker/DatePickerOverlay.js.map +1 -0
  160. package/dist-es/date-picker/DatePickerOverlayProvider.js +161 -0
  161. package/dist-es/date-picker/DatePickerOverlayProvider.js.map +1 -0
  162. package/dist-es/date-picker/DatePickerPanel.css.js +4 -0
  163. package/dist-es/date-picker/DatePickerPanel.css.js.map +1 -0
  164. package/dist-es/date-picker/DatePickerRangeGridPanel.js +248 -0
  165. package/dist-es/date-picker/DatePickerRangeGridPanel.js.map +1 -0
  166. package/dist-es/date-picker/DatePickerRangeInput.js +203 -0
  167. package/dist-es/date-picker/DatePickerRangeInput.js.map +1 -0
  168. package/dist-es/date-picker/DatePickerRangePanel.js +363 -0
  169. package/dist-es/date-picker/DatePickerRangePanel.js.map +1 -0
  170. package/dist-es/date-picker/DatePickerSingleGridPanel.js +260 -0
  171. package/dist-es/date-picker/DatePickerSingleGridPanel.js.map +1 -0
  172. package/dist-es/date-picker/DatePickerSingleInput.js +148 -0
  173. package/dist-es/date-picker/DatePickerSingleInput.js.map +1 -0
  174. package/dist-es/date-picker/DatePickerSinglePanel.js +18 -0
  175. package/dist-es/date-picker/DatePickerSinglePanel.js.map +1 -0
  176. package/dist-es/date-picker/DatePickerTrigger.js +30 -0
  177. package/dist-es/date-picker/DatePickerTrigger.js.map +1 -0
  178. package/dist-es/date-picker/useDatePicker.js +220 -0
  179. package/dist-es/date-picker/useDatePicker.js.map +1 -0
  180. package/dist-es/date-picker/useFocusOut.js +41 -0
  181. package/dist-es/date-picker/useFocusOut.js.map +1 -0
  182. package/dist-es/date-picker/useKeyboard.js +20 -0
  183. package/dist-es/date-picker/useKeyboard.js.map +1 -0
  184. package/dist-es/index.js +25 -0
  185. package/dist-es/index.js.map +1 -0
  186. package/dist-es/localization-provider/LocalizationProvider.js +47 -0
  187. package/dist-es/localization-provider/LocalizationProvider.js.map +1 -0
  188. package/dist-types/calendar/Calendar.d.ts +105 -0
  189. package/dist-types/calendar/CalendarGrid.d.ts +27 -0
  190. package/dist-types/calendar/CalendarMonthHeader.d.ts +17 -0
  191. package/dist-types/calendar/CalendarNavigation.d.ts +43 -0
  192. package/dist-types/calendar/CalendarWeekHeader.d.ts +6 -0
  193. package/dist-types/calendar/index.d.ts +9 -0
  194. package/dist-types/calendar/internal/CalendarContext.d.ts +6 -0
  195. package/dist-types/calendar/internal/CalendarDay.d.ts +33 -0
  196. package/dist-types/calendar/internal/CalendarMonth.d.ts +14 -0
  197. package/dist-types/calendar/internal/createAnnouncement.d.ts +24 -0
  198. package/dist-types/calendar/internal/useFocusManagement.d.ts +9 -0
  199. package/dist-types/calendar/internal/utils.d.ts +6 -0
  200. package/dist-types/calendar/useCalendar.d.ts +335 -0
  201. package/dist-types/calendar/useCalendarDay.d.ts +67 -0
  202. package/dist-types/calendar/useCalendarSelection.d.ts +145 -0
  203. package/dist-types/calendar/useDateSelectionAnnouncer.d.ts +6 -0
  204. package/dist-types/date-input/DateInputRange.d.ts +131 -0
  205. package/dist-types/date-input/DateInputSingle.d.ts +99 -0
  206. package/dist-types/date-input/index.d.ts +2 -0
  207. package/dist-types/date-picker/DatePicker.d.ts +52 -0
  208. package/dist-types/date-picker/DatePickerActions.d.ts +79 -0
  209. package/dist-types/date-picker/DatePickerContext.d.ts +172 -0
  210. package/dist-types/date-picker/DatePickerHelperText.d.ts +4 -0
  211. package/dist-types/date-picker/DatePickerOverlay.d.ts +11 -0
  212. package/dist-types/date-picker/DatePickerOverlayProvider.d.ts +106 -0
  213. package/dist-types/date-picker/DatePickerRangeGridPanel.d.ts +14 -0
  214. package/dist-types/date-picker/DatePickerRangeInput.d.ts +17 -0
  215. package/dist-types/date-picker/DatePickerRangePanel.d.ts +83 -0
  216. package/dist-types/date-picker/DatePickerSingleGridPanel.d.ts +63 -0
  217. package/dist-types/date-picker/DatePickerSingleInput.d.ts +15 -0
  218. package/dist-types/date-picker/DatePickerSinglePanel.d.ts +8 -0
  219. package/dist-types/date-picker/DatePickerTrigger.d.ts +9 -0
  220. package/dist-types/date-picker/index.d.ts +13 -0
  221. package/dist-types/date-picker/useDatePicker.d.ts +121 -0
  222. package/dist-types/date-picker/useFocusOut.d.ts +9 -0
  223. package/dist-types/date-picker/useKeyboard.d.ts +20 -0
  224. package/dist-types/index.d.ts +4 -0
  225. package/dist-types/localization-provider/LocalizationProvider.d.ts +62 -0
  226. package/dist-types/localization-provider/index.d.ts +1 -0
  227. package/package.json +60 -0
@@ -0,0 +1,20 @@
1
+ import { createContext, useContext } from 'react';
2
+
3
+ const CalendarContext = createContext(null);
4
+ if (process.env.NODE_ENV !== "production") {
5
+ CalendarContext.displayName = "CalendarContext";
6
+ }
7
+ function useCalendarContext() {
8
+ const context = useContext(
9
+ CalendarContext
10
+ );
11
+ if (!context) {
12
+ throw new Error(
13
+ "useCalendarContext should be called inside CalendarContext.Provider"
14
+ );
15
+ }
16
+ return context;
17
+ }
18
+
19
+ export { CalendarContext, useCalendarContext };
20
+ //# sourceMappingURL=CalendarContext.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CalendarContext.js","sources":["../src/calendar/internal/CalendarContext.tsx"],"sourcesContent":["import { createContext, useContext } from \"react\";\nimport type { UseCalendarReturn } from \"../useCalendar\";\n\nexport interface CalendarState extends UseCalendarReturn {}\n\nconst CalendarContext = createContext<CalendarState | null>(null);\n\nif (process.env.NODE_ENV !== \"production\") {\n CalendarContext.displayName = \"CalendarContext\";\n}\n\nfunction useCalendarContext(): CalendarState {\n const context = useContext(\n CalendarContext as React.Context<CalendarState | null>,\n );\n if (!context) {\n throw new Error(\n \"useCalendarContext should be called inside CalendarContext.Provider\",\n );\n }\n\n return context;\n}\n\nexport { CalendarContext, useCalendarContext };\n"],"names":[],"mappings":";;AAKA,MAAM,eAAA,GAAkB,cAAoC,IAAI;AAEhE,IAAI,OAAA,CAAQ,GAAA,CAAI,QAAA,KAAa,YAAA,EAAc;AACzC,EAAA,eAAA,CAAgB,WAAA,GAAc,iBAAA;AAChC;AAEA,SAAS,kBAAA,GAAoC;AAC3C,EAAA,MAAM,OAAA,GAAU,UAAA;AAAA,IACd;AAAA,GACF;AACA,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KACF;AAAA,EACF;AAEA,EAAA,OAAO,OAAA;AACT;;;;"}
@@ -0,0 +1,4 @@
1
+ var css_248z = ".salt-density-touch {\n --calendar-day-highlight-size: 14px;\n}\n.salt-density-low {\n --calendar-day-highlight-size: 12px;\n}\n.salt-density-medium {\n --calendar-day-highlight-size: 10px;\n}\n.salt-density-high {\n --calendar-day-highlight-size: 8px;\n}\n\n.saltCalendarDay {\n --calendar-day-zIndex-content: calc(var(--salt-zIndex-default) + 1);\n --calendar-day-zIndex-highlight: calc(var(--calendar-day-zIndex-content) + 2);\n font-family: var(--salt-text-fontFamily);\n font-weight: var(--salt-text-fontWeight);\n line-height: var(--salt-text-lineHeight);\n font-size: var(--salt-text-fontSize);\n width: var(--salt-size-base);\n height: var(--salt-size-base);\n color: var(--salt-content-primary-foreground);\n background: var(--salt-selectable-background);\n cursor: var(--salt-cursor-hover);\n border: none;\n padding: 0;\n display: flex;\n justify-content: center;\n align-items: center;\n position: relative;\n}\n\n.saltCalendarDay-content {\n margin: 0 var(--salt-spacing-50);\n width: 100%;\n z-index: var(--calendar-day-zIndex-content);\n}\n\n.saltCalendarDay:hover {\n color: var(--salt-content-primary-foreground);\n background: var(--salt-selectable-background-hover);\n border-radius: var(--salt-palette-corner-weak, 0);\n}\n\n.saltCalendarDay-hoveredSpan:not(.saltCalendarDay-selectedStart):not(.saltCalendarDay-selectedEnd),\n.saltCalendarDay-hoveredSpan:not(.saltCalendarDay-selectedStart):not(.saltCalendarDay-selectedEnd)::before,\n.saltCalendarDay-selectedSpan:not(.saltCalendarDay-selectedStart):not(.saltCalendarDay-selectedEnd),\n.saltCalendarDay-selectedSpan:not(.saltCalendarDay-selectedStart):not(.saltCalendarDay-selectedEnd)::before {\n border-radius: 0;\n}\n\n.saltCalendarDay-focused,\n.saltCalendarDay:focus,\n.saltCalendarDay:focus-visible {\n outline: none;\n z-index: var(--calendar-day-zIndex-content);\n}\n\n.saltCalendarDay-focused:focus-visible::before {\n content: \"\";\n position: absolute;\n box-sizing: border-box;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n outline: var(--salt-focused-outline);\n outline-offset: calc(var(--salt-focused-outlineWidth) * -1);\n border-radius: var(--salt-palette-corner-weak, 0);\n}\n\n.saltCalendarDay-selected .saltCalendarDay-content,\n.saltCalendarDay-selected:hover .saltCalendarDay-content,\n.saltCalendarDay-selectedStart .saltCalendarDay-content,\n.saltCalendarDay-hoveredStart .saltCalendarDay-content,\n.saltCalendarDay-selectedSpan .saltCalendarDay-content,\n.saltCalendarDay-hoveredSpan .saltCalendarDay-content,\n.saltCalendarDay-selectedEnd .saltCalendarDay-content,\n.saltCalendarDay-hoveredEnd .saltCalendarDay-content {\n color: var(--salt-content-primary-foreground);\n}\n\n.saltCalendarDay-selectedSpan:not(.saltCalendarDay-selectedStart):not(.saltCalendarDay-selectedEnd)::before,\n.saltCalendarDay-hoveredSpan:not(.saltCalendarDay-selectedSpan):not(.saltCalendarDay-selectedStart):not(.saltCalendarDay-selectedEnd)::before {\n content: \"\";\n position: absolute;\n box-sizing: border-box;\n top: 0;\n left: calc(var(--calendar-gap) * -1);\n right: calc(var(--calendar-gap) * -1);\n bottom: 0;\n background: var(--salt-selectable-background-hover);\n border-top: var(--salt-size-fixed-100) var(--salt-borderStyle-solid) var(--salt-selectable-borderColor-selected);\n border-bottom: var(--salt-size-fixed-100) var(--salt-borderStyle-solid) var(--salt-selectable-borderColor-selected);\n}\n\n.saltCalendarDay-selectedStart::before,\n.saltCalendarDay-selectedEnd::before {\n content: \"\";\n position: absolute;\n box-sizing: border-box;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: var(--salt-selectable-background-selected);\n border: var(--salt-size-fixed-100) var(--salt-borderStyle-solid) var(--salt-selectable-borderColor-selected);\n}\n\n.saltCalendarDay-selectedStart,\n.saltCalendarDay-selectedStart::before,\n.saltCalendarDay-focused.saltCalendarDay-selectedStart,\n.saltCalendarDay-focused.saltCalendarDay-selectedStart::before {\n border-radius: var(--salt-palette-corner-weak, 0) 0 0 var(--salt-palette-corner-weak, 0);\n}\n\n.saltCalendarDay-focused.saltCalendarDay-selectedEnd:not(.saltCalendarDay-selectedStart),\n.saltCalendarDay-focused.saltCalendarDay-selectedEnd:not(.saltCalendarDay-selectedStart)::before,\n.saltCalendarDay-selectedEnd:not(.saltCalendarDay-selectedStart),\n.saltCalendarDay-selectedEnd:not(.saltCalendarDay-selectedStart)::before {\n border-radius: 0 var(--salt-palette-corner-weak, 0) var(--salt-palette-corner-weak, 0) 0;\n}\n\n.saltCalendarDay-focused.saltCalendarDay-selectedSameDay,\n.saltCalendarDay-focused.saltCalendarDay-selectedSameDay::before,\n.saltCalendarDay-selectedSameDay,\n.saltCalendarDay-selectedSameDay::before {\n border-radius: var(--salt-palette-corner-weak, 0);\n}\n\n/** Single selection styles */\n\n.saltCalendarMonth-single .saltCalendarDay:hover:not(.saltCalendarDay-selected) {\n color: var(--salt-content-primary-foreground);\n background: var(--salt-selectable-background-hover);\n border-radius: var(--salt-palette-corner-weak, 0);\n}\n\n.saltCalendarMonth-single .saltCalendarDay-selected::before {\n content: \"\";\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n color: var(--salt-content-primary-foreground);\n background: var(--salt-selectable-background-selected);\n border: var(--salt-size-fixed-100) var(--salt-borderStyle-solid) var(--salt-selectable-borderColor-selected);\n border-radius: var(--salt-palette-corner-weak, 0);\n}\n\n/** Range selection styles */\n.saltCalendarMonth-range .saltCalendarDay-focused.saltCalendarDay-selectedSpan,\n.saltCalendarMonth-range .saltCalendarDay-focused.saltCalendarDay-hoveredSpan {\n outline-offset: calc(calc(var(--salt-focused-outlineWidth) * -1));\n}\n\n.saltCalendarMonth-range .saltCalendarDay:hover:not(.saltCalendarDay-selectedStart):not(.saltCalendarDay-selectedSpan):not(.saltCalendarDay-selectedEnd) {\n color: var(--salt-content-primary-foreground);\n background: var(--salt-selectable-background-hover);\n border-radius: var(--salt-palette-corner-weak, 0);\n}\n\n.saltCalendarMonth-range .saltCalendarDay:hover.saltCalendarDay-selectedSpan::before,\n.saltCalendarMonth-range .saltCalendarDay:hover.saltCalendarDay-hoveredSpan::before,\n.saltCalendarMonth-range .saltCalendarDay-focused.saltCalendarDay-hoveredEnd:not(.saltCalendarDay-selectedEnd):not(.saltCalendarDay-selectedStart)::before,\n.saltCalendarMonth-range .saltCalendarDay-focused.saltCalendarDay-hoveredEnd:not(.saltCalendarDay-selectedEnd):not(.saltCalendarDay-selectedStart)::before {\n border-radius: 0;\n}\n\n.saltCalendarMonth-range .saltCalendarDay-hoveredEnd:not(.saltCalendarDay-selectedStart):not(.saltCalendarDay-selectedEnd) {\n border-radius: 0;\n}\n\n.saltCalendarMonth-range .saltCalendarDay-hoveredEnd:not(.saltCalendarDay-selectedStart):not(.saltCalendarDay-selectedEnd):not(.saltCalendarDay-unselectable)::before {\n content: \"\";\n position: absolute;\n top: 0;\n left: calc(var(--calendar-gap) * -1);\n right: 0;\n bottom: 0;\n background: var(--salt-selectable-background-hover);\n border-radius: 0;\n border-top: var(--salt-size-fixed-100) var(--salt-borderStyle-solid) var(--salt-selectable-borderColor-selected);\n border-bottom: var(--salt-size-fixed-100) var(--salt-borderStyle-solid) var(--salt-selectable-borderColor-selected);\n}\n\n/** Offset range styles */\n\n.saltCalendarMonth-offset .saltCalendarDay-hoveredSpan,\n.saltCalendarMonth-offset .saltCalendarDay-hoveredSpan::before {\n border-radius: 0;\n}\n\n.saltCalendarMonth-offset .saltCalendarDay-focused.saltCalendarDay-hoveredStart:not(.saltCalendarDay-selectedStart),\n.saltCalendarMonth-offset .saltCalendarDay-focused.saltCalendarDay-hoveredStart:not(.saltCalendarDay-selectedStart)::before {\n border-radius: var(--salt-palette-corner-weak, 0) 0 0 var(--salt-palette-corner-weak, 0);\n}\n\n.saltCalendarMonth-offset .saltCalendarDay:hover:not(.saltCalendarDay-selectedStart):not(.saltCalendarDay-selectedSpan):not(.saltCalendarDay-selectedEnd),\n.saltCalendarMonth-offset .saltCalendarDay-hoveredStart:not(.saltCalendarDay-selectedStart):not(.saltCalendarDay-selectedSpan):not(.saltCalendarDay-selectedEnd),\n.saltCalendarMonth-offset .saltCalendarDay-hoveredSpan:not(.saltCalendarDay-selectedStart):not(.saltCalendarDay-selectedSpan):not(.saltCalendarDay-selectedEnd),\n.saltCalendarMonth-offset .saltCalendarDay-hoveredEnd:not(.saltCalendarDay-selectedStart):not(.saltCalendarDay-selectedSpan):not(.saltCalendarDay-selectedEnd) {\n color: var(--salt-content-primary-foreground);\n background: var(--salt-selectable-background-hover);\n}\n\n.saltCalendarMonth-offset .saltCalendarDay-hoveredSpan:not(.saltCalendarDay-selectedStart):not(.saltCalendarDay-selectedSpan):not(.saltCalendarDay-selectedEnd)::before {\n border-top: var(--salt-size-fixed-100) var(--salt-borderStyle-solid) var(--salt-selectable-background-hover);\n border-bottom: var(--salt-size-fixed-100) var(--salt-borderStyle-solid) var(--salt-selectable-background-hover);\n}\n\n.saltCalendarMonth-offset .saltCalendarDay-hoveredStart,\n.saltCalendarMonth-offset .saltCalendarDay-selectedStart {\n border-radius: var(--salt-palette-corner-weak, 0) 0 0 var(--salt-palette-corner-weak, 0);\n}\n\n.saltCalendarMonth-offset .saltCalendarDay.saltCalendarDay-hoveredEnd,\n.saltCalendarMonth-offset .saltCalendarDay-selectedEnd {\n border-radius: 0 var(--salt-palette-corner-weak, 0) var(--salt-palette-corner-weak, 0) 0;\n}\n\n.saltCalendarMonth-offset .saltCalendarDay-hoveredSpan,\n.saltCalendarMonth-offset .saltCalendarDay-selectedSpan {\n border-radius: 0;\n}\n\n.saltCalendarMonth-offset .saltCalendarDay-selectedStart.saltCalendarDay-selectedEnd {\n border-radius: var(--salt-palette-corner-weak, 0);\n}\n\n.saltCalendarDay-outOfRange {\n color: var(--salt-content-secondary-foreground);\n}\n.saltCalendarDay-outOfRange:hover {\n color: var(--salt-content-primary-foreground);\n}\n\n.saltCalendarDay-outOfRange .saltCalendarDay-today > span:last-of-type {\n border-bottom: var(--salt-size-indicator) var(--salt-borderStyle-solid) var(--salt-content-secondary-foreground);\n}\n\n.saltCalendarDay-outOfRange .saltCalendarDay-highlighted::after {\n background: var(--salt-content-secondary-foreground);\n}\n\n.saltCalendarDay-unselectable,\n.saltCalendarDay-unselectable:hover {\n background: var(--salt-selectable-background-disabled);\n cursor: var(--salt-cursor-disabled);\n}\n\n.saltCalendarDay-highlighted {\n position: absolute;\n left: 0;\n right: -1px;\n height: 100%;\n overflow: hidden;\n border-radius: var(--salt-palette-corner-weak, 0);\n}\n.saltCalendarDay-selectedStart .saltCalendarDay-highlighted {\n right: 0;\n}\n\n.saltCalendarDay-selectedEnd .saltCalendarDay-highlighted {\n right: 1px;\n}\n\n.saltCalendarDay-selectedStart .saltCalendarDay-highlighted,\n.saltCalendarDay-hoveredEnd:not(.saltCalendarDay-selectedEnd) .saltCalendarDay-highlighted,\n.saltCalendarDay-hoveredSpan .saltCalendarDay-highlighted,\n.saltCalendarDay-selectedSpan .saltCalendarDay-highlighted {\n border-radius: 0;\n}\n\n.saltCalendarDay-selectedSameDay .saltCalendarDay-highlighted {\n border-radius: var(--salt-palette-corner-weak, 0);\n}\n\n.saltCalendarDay-highlighted::after {\n content: \"\";\n top: 0;\n right: 0;\n box-sizing: border-box;\n height: var(--calendar-day-highlight-size); /* TODO: change for size-modifier when available */\n width: var(--calendar-day-highlight-size);\n background: var(--salt-accent-background);\n position: absolute;\n clip-path: polygon(100% 0, 100% 100%, 0 0);\n z-index: var(--calendar-day-zIndex-highlight);\n}\n.saltCalendarDay-focused:focus-visible .saltCalendarDay-highlighted::after {\n border: var(--salt-focused-outline);\n}\n\n.saltCalendarDay-unselectable::after {\n content: \"\";\n height: var(--salt-size-fixed-100);\n width: calc(100% - var(--salt-spacing-100));\n background: var(--salt-content-secondary-foreground);\n position: absolute;\n}\n\n.saltCalendarDay-today > span:last-of-type::after {\n content: \"\";\n display: block;\n width: calc(100% - calc(var(--salt-spacing-50) * 2));\n height: var(--salt-size-indicator);\n background: var(--salt-accent-borderColor);\n border-radius: var(--salt-palette-corner-weak);\n position: absolute;\n bottom: var(--salt-spacing-50);\n left: var(--salt-spacing-50);\n right: var(--salt-spacing-50);\n}\n\n.saltCalendarDay-hidden {\n visibility: hidden;\n}\n";
2
+
3
+ export { css_248z as default };
4
+ //# sourceMappingURL=CalendarDay.css.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CalendarDay.css.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
@@ -0,0 +1,96 @@
1
+ import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
2
+ import { makePrefixer, useForkRef, useIsomorphicLayoutEffect, renderProps, Tooltip } from '@salt-ds/core';
3
+ import { useComponentCssInjection } from '@salt-ds/styles';
4
+ import { useWindow } from '@salt-ds/window';
5
+ import { clsx } from 'clsx';
6
+ import { forwardRef } from 'react';
7
+ import { useLocalization } from '../../localization-provider/LocalizationProvider.js';
8
+ import { useCalendarDay } from '../useCalendarDay.js';
9
+ import css_248z from './CalendarDay.css.js';
10
+
11
+ const withBaseName = makePrefixer("saltCalendarDay");
12
+ const CalendarDay = forwardRef(
13
+ function CalendarDay2(props, ref) {
14
+ const {
15
+ className,
16
+ date,
17
+ render,
18
+ month,
19
+ TooltipProps,
20
+ format = "DD",
21
+ ...rest
22
+ } = props;
23
+ const { dateAdapter } = useLocalization();
24
+ const targetWindow = useWindow();
25
+ useComponentCssInjection({
26
+ testId: "salt-calendar-day",
27
+ css: css_248z,
28
+ window: targetWindow
29
+ });
30
+ const {
31
+ status,
32
+ focusedDateRef = null,
33
+ dayProps,
34
+ unselectableReason,
35
+ highlightedReason
36
+ } = useCalendarDay({
37
+ date,
38
+ month
39
+ });
40
+ const { focused, today, unselectable, highlighted, hidden, outOfRange } = status;
41
+ const buttonRef = useForkRef(ref, focusedDateRef);
42
+ useIsomorphicLayoutEffect(() => {
43
+ var _a;
44
+ if (focused) {
45
+ (_a = focusedDateRef == null ? void 0 : focusedDateRef.current) == null ? void 0 : _a.focus({ preventScroll: true });
46
+ }
47
+ }, [focused]);
48
+ const defaultButtonProps = {
49
+ children: /* @__PURE__ */ jsxs(Fragment, { children: [
50
+ highlighted ? /* @__PURE__ */ jsx("div", { className: withBaseName("highlighted") }) : null,
51
+ /* @__PURE__ */ jsx("span", { "aria-hidden": true, className: withBaseName("content"), children: dateAdapter.format(date, format) })
52
+ ] }),
53
+ ...dayProps,
54
+ ref: buttonRef,
55
+ ...rest,
56
+ className: clsx(
57
+ withBaseName(),
58
+ {
59
+ [withBaseName("hidden")]: hidden,
60
+ [withBaseName("unselectable")]: !!unselectable,
61
+ [withBaseName("outOfRange")]: outOfRange,
62
+ [withBaseName("focused")]: !!focused,
63
+ [withBaseName("today")]: today
64
+ },
65
+ dayProps.className,
66
+ className
67
+ )
68
+ };
69
+ const buttonElement = render ? renderProps("button", {
70
+ render,
71
+ ...defaultButtonProps,
72
+ status,
73
+ date
74
+ }) : /* @__PURE__ */ jsx("button", { ...defaultButtonProps });
75
+ const tooltipContent = unselectableReason || highlightedReason;
76
+ if (tooltipContent && (tooltipContent == null ? void 0 : tooltipContent.length) > 0) {
77
+ return /* @__PURE__ */ jsx(
78
+ Tooltip,
79
+ {
80
+ hideIcon: true,
81
+ status: "info",
82
+ content: tooltipContent,
83
+ placement: "top",
84
+ enterDelay: 0,
85
+ leaveDelay: 0,
86
+ ...TooltipProps,
87
+ children: buttonElement
88
+ }
89
+ );
90
+ }
91
+ return buttonElement;
92
+ }
93
+ );
94
+
95
+ export { CalendarDay };
96
+ //# sourceMappingURL=CalendarDay.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CalendarDay.js","sources":["../src/calendar/internal/CalendarDay.tsx"],"sourcesContent":["import {\n makePrefixer,\n type RenderPropsType,\n renderProps,\n Tooltip,\n type TooltipProps,\n useForkRef,\n useIsomorphicLayoutEffect,\n} from \"@salt-ds/core\";\nimport type { DateFrameworkType } from \"@salt-ds/date-adapters\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { clsx } from \"clsx\";\nimport { type ComponentPropsWithRef, forwardRef } from \"react\";\nimport { useLocalization } from \"../../localization-provider\";\nimport { type DayStatus, useCalendarDay } from \"../useCalendarDay\";\nimport calendarDayCss from \"./CalendarDay.css\";\n\nexport interface CalendarDayProps\n extends Omit<ComponentPropsWithRef<\"button\">, \"children\"> {\n /**\n * Day date\n */\n date: DateFrameworkType;\n /**\n * Format of date\n */\n format?: string;\n /**\n * Render prop to enable customisation of day button.\n */\n render?: RenderPropsType[\"render\"];\n /**\n * Month being rendered\n */\n month: DateFrameworkType;\n /**\n * Additional Tooltip props\n */\n TooltipProps?: Partial<TooltipProps>;\n}\nexport interface renderCalendarDayProps extends CalendarDayProps {\n /**\n * Status of day\n */\n status: DayStatus;\n}\n\nconst withBaseName = makePrefixer(\"saltCalendarDay\");\n\nexport const CalendarDay = forwardRef<HTMLButtonElement, CalendarDayProps>(\n function CalendarDay(\n props: CalendarDayProps,\n ref: React.Ref<HTMLButtonElement>,\n ) {\n const {\n className,\n date,\n render,\n month,\n TooltipProps,\n format = \"DD\",\n ...rest\n } = props;\n const { dateAdapter } = useLocalization();\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-calendar-day\",\n css: calendarDayCss,\n window: targetWindow,\n });\n\n const {\n status,\n focusedDateRef = null,\n dayProps,\n unselectableReason,\n highlightedReason,\n } = useCalendarDay({\n date,\n month,\n });\n const { focused, today, unselectable, highlighted, hidden, outOfRange } =\n status;\n const buttonRef = useForkRef(ref, focusedDateRef);\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: ignore `focusedDateRef.current`\n useIsomorphicLayoutEffect(() => {\n if (focused) {\n focusedDateRef?.current?.focus({ preventScroll: true });\n }\n }, [focused]);\n\n const defaultButtonProps = {\n children: (\n <>\n {highlighted ? <div className={withBaseName(\"highlighted\")} /> : null}\n <span aria-hidden={true} className={withBaseName(\"content\")}>\n {dateAdapter.format(date, format)}\n </span>\n </>\n ),\n ...dayProps,\n ref: buttonRef,\n ...rest,\n className: clsx(\n withBaseName(),\n {\n [withBaseName(\"hidden\")]: hidden,\n [withBaseName(\"unselectable\")]: !!unselectable,\n [withBaseName(\"outOfRange\")]: outOfRange,\n [withBaseName(\"focused\")]: !!focused,\n [withBaseName(\"today\")]: today,\n },\n dayProps.className,\n className,\n ),\n };\n\n const buttonElement = render ? (\n renderProps<React.ElementType<renderCalendarDayProps>>(\"button\", {\n render,\n ...defaultButtonProps,\n status,\n date,\n })\n ) : (\n <button {...defaultButtonProps} />\n );\n\n const tooltipContent: string | false | undefined =\n unselectableReason || highlightedReason;\n if (tooltipContent && tooltipContent?.length > 0) {\n return (\n <Tooltip\n hideIcon\n status=\"info\"\n content={tooltipContent}\n placement=\"top\"\n enterDelay={0} // --salt-duration-instant\n leaveDelay={0} // --salt-duration-instant\n {...TooltipProps}\n >\n {buttonElement}\n </Tooltip>\n );\n }\n return buttonElement;\n },\n);\n"],"names":["CalendarDay","calendarDayCss"],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ var css_248z = ".saltCalendarMonth-grid {\n display: flex;\n flex-direction: row;\n flex-wrap: wrap;\n width: calc(var(--calendar-day-size) * 7 + var(--calendar-gap) * 6);\n text-align: center;\n gap: var(--calendar-gap);\n}\n\n.saltCalendarMonth-grid > .saltCalendarMonth-week {\n display: flex;\n justify-content: flex-start;\n gap: var(--calendar-gap);\n width: 100%;\n}\n\n.saltCalendarMonth-grid > .saltCalendarMonth-week > .saltCalendarDay:last-child::before {\n right: 0;\n}\n\n.saltCalendarMonth-grid > .saltCalendarMonth-week > .saltCalendarDay:first-child::before {\n left: 0;\n}\n\n.saltCalendarMonth-grid > .saltCalendarMonth-week > * {\n width: var(--calendar-day-size);\n height: var(--calendar-day-size);\n box-sizing: border-box;\n}\n";
2
+
3
+ export { css_248z as default };
4
+ //# sourceMappingURL=CalendarMonth.css.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CalendarMonth.css.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
@@ -0,0 +1,79 @@
1
+ import { jsx } from 'react/jsx-runtime';
2
+ import { forwardRef, useMemo, createElement } from 'react';
3
+ import { makePrefixer } from '@salt-ds/core';
4
+ import { useComponentCssInjection } from '@salt-ds/styles';
5
+ import { useWindow } from '@salt-ds/window';
6
+ import { clsx } from 'clsx';
7
+ import { useLocalization } from '../../localization-provider/LocalizationProvider.js';
8
+ import { useCalendarContext } from './CalendarContext.js';
9
+ import { CalendarDay } from './CalendarDay.js';
10
+ import css_248z from './CalendarMonth.css.js';
11
+ import { generateVisibleDays } from './utils.js';
12
+
13
+ function chunkArray(array, chunkSize) {
14
+ const result = [];
15
+ for (let chunkIndex = 0; chunkIndex < array.length; chunkIndex += chunkSize) {
16
+ result.push(array.slice(chunkIndex, chunkIndex + chunkSize));
17
+ }
18
+ return result;
19
+ }
20
+ const withBaseName = makePrefixer("saltCalendarMonth");
21
+ const CalendarMonth = forwardRef(
22
+ function CalendarMonth2(props, ref) {
23
+ const { className, date, onMouseLeave, CalendarDayProps, ...rest } = props;
24
+ const { dateAdapter } = useLocalization();
25
+ const targetWindow = useWindow();
26
+ useComponentCssInjection({
27
+ testId: "salt-calendar-month",
28
+ css: css_248z,
29
+ window: targetWindow
30
+ });
31
+ const {
32
+ state: { selectionVariant, timezone = "default" },
33
+ helpers: { setHoveredDate }
34
+ } = useCalendarContext();
35
+ const handleMouseLeave = (event) => {
36
+ setHoveredDate(event, null);
37
+ onMouseLeave == null ? void 0 : onMouseLeave(event);
38
+ };
39
+ const weeks = useMemo(() => {
40
+ const days = generateVisibleDays(dateAdapter, date, timezone);
41
+ return chunkArray(days, 7);
42
+ }, [dateAdapter, date, timezone]);
43
+ return /* @__PURE__ */ jsx(
44
+ "div",
45
+ {
46
+ className: clsx(withBaseName(), className),
47
+ ref,
48
+ onMouseLeave: handleMouseLeave,
49
+ ...rest,
50
+ children: /* @__PURE__ */ jsx(
51
+ "div",
52
+ {
53
+ "data-testid": "CalendarGrid",
54
+ className: clsx(withBaseName("grid"), withBaseName(selectionVariant)),
55
+ children: weeks.map((week) => /* @__PURE__ */ jsx(
56
+ "div",
57
+ {
58
+ className: withBaseName("week"),
59
+ children: week.map((day) => /* @__PURE__ */ createElement(
60
+ CalendarDay,
61
+ {
62
+ ...CalendarDayProps,
63
+ key: dateAdapter.format(day, "DD MMM YYYY"),
64
+ date: day,
65
+ month: date
66
+ }
67
+ ))
68
+ },
69
+ `row-${dateAdapter.format(week[0], "DD MMM YYYY")}`
70
+ ))
71
+ }
72
+ )
73
+ }
74
+ );
75
+ }
76
+ );
77
+
78
+ export { CalendarMonth };
79
+ //# sourceMappingURL=CalendarMonth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CalendarMonth.js","sources":["../src/calendar/internal/CalendarMonth.tsx"],"sourcesContent":["import { makePrefixer } from \"@salt-ds/core\";\nimport type { DateFrameworkType } from \"@salt-ds/date-adapters\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { clsx } from \"clsx\";\nimport {\n type ComponentPropsWithRef,\n forwardRef,\n type MouseEvent,\n type SyntheticEvent,\n useMemo,\n} from \"react\";\nimport { useLocalization } from \"../../localization-provider\";\nimport { useCalendarContext } from \"./CalendarContext\";\nimport { CalendarDay, type CalendarDayProps } from \"./CalendarDay\";\nimport calendarMonthCss from \"./CalendarMonth.css\";\nimport { generateVisibleDays } from \"./utils\";\n\nexport interface CalendarMonthProps extends ComponentPropsWithRef<\"div\"> {\n /**\n * Month to render as selectable dates\n */\n date: DateFrameworkType;\n /**\n * Props for the CalendarDay component.\n */\n CalendarDayProps?: Partial<CalendarDayProps>;\n}\n\nfunction chunkArray(array: DateFrameworkType[], chunkSize: number) {\n const result = [];\n for (let chunkIndex = 0; chunkIndex < array.length; chunkIndex += chunkSize) {\n result.push(array.slice(chunkIndex, chunkIndex + chunkSize));\n }\n return result;\n}\n\nconst withBaseName = makePrefixer(\"saltCalendarMonth\");\n\nexport const CalendarMonth = forwardRef<HTMLDivElement, CalendarMonthProps>(\n function CalendarMonth(\n props: CalendarMonthProps,\n ref: React.Ref<HTMLDivElement>,\n ) {\n const { className, date, onMouseLeave, CalendarDayProps, ...rest } = props;\n const { dateAdapter } = useLocalization();\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-calendar-month\",\n css: calendarMonthCss,\n window: targetWindow,\n });\n\n const {\n state: { selectionVariant, timezone = \"default\" },\n helpers: { setHoveredDate },\n } = useCalendarContext();\n const handleMouseLeave = (event: SyntheticEvent) => {\n setHoveredDate(event, null);\n onMouseLeave?.(event as MouseEvent<HTMLDivElement>);\n };\n\n const weeks = useMemo(() => {\n const days = generateVisibleDays(dateAdapter, date, timezone);\n return chunkArray(days, 7);\n }, [dateAdapter, date, timezone]);\n\n return (\n <div\n className={clsx(withBaseName(), className)}\n ref={ref}\n onMouseLeave={handleMouseLeave}\n {...rest}\n >\n <div\n data-testid=\"CalendarGrid\"\n className={clsx(withBaseName(\"grid\"), withBaseName(selectionVariant))}\n >\n {weeks.map((week) => (\n <div\n key={`row-${dateAdapter.format(week[0], \"DD MMM YYYY\")}`}\n className={withBaseName(\"week\")}\n >\n {week.map((day) => (\n <CalendarDay\n {...CalendarDayProps}\n key={dateAdapter.format(day, \"DD MMM YYYY\")}\n date={day}\n month={date}\n />\n ))}\n </div>\n ))}\n </div>\n </div>\n );\n },\n);\n"],"names":["CalendarMonth","calendarMonthCss"],"mappings":";;;;;;;;;;;;AA6BA,SAAS,UAAA,CAAW,OAA4B,SAAA,EAAmB;AACjE,EAAA,MAAM,SAAS,EAAC;AAChB,EAAA,KAAA,IAAS,aAAa,CAAA,EAAG,UAAA,GAAa,KAAA,CAAM,MAAA,EAAQ,cAAc,SAAA,EAAW;AAC3E,IAAA,MAAA,CAAO,KAAK,KAAA,CAAM,KAAA,CAAM,UAAA,EAAY,UAAA,GAAa,SAAS,CAAC,CAAA;AAAA,EAC7D;AACA,EAAA,OAAO,MAAA;AACT;AAEA,MAAM,YAAA,GAAe,aAAa,mBAAmB,CAAA;AAE9C,MAAM,aAAA,GAAgB,UAAA;AAAA,EAC3B,SAASA,cAAAA,CACP,KAAA,EACA,GAAA,EACA;AACA,IAAA,MAAM,EAAE,SAAA,EAAW,IAAA,EAAM,cAAc,gBAAA,EAAkB,GAAG,MAAK,GAAI,KAAA;AACrE,IAAA,MAAM,EAAE,WAAA,EAAY,GAAI,eAAA,EAAgB;AACxC,IAAA,MAAM,eAAe,SAAA,EAAU;AAC/B,IAAA,wBAAA,CAAyB;AAAA,MACvB,MAAA,EAAQ,qBAAA;AAAA,MACR,GAAA,EAAKC,QAAA;AAAA,MACL,MAAA,EAAQ;AAAA,KACT,CAAA;AAED,IAAA,MAAM;AAAA,MACJ,KAAA,EAAO,EAAE,gBAAA,EAAkB,QAAA,GAAW,SAAA,EAAU;AAAA,MAChD,OAAA,EAAS,EAAE,cAAA;AAAe,QACxB,kBAAA,EAAmB;AACvB,IAAA,MAAM,gBAAA,GAAmB,CAAC,KAAA,KAA0B;AAClD,MAAA,cAAA,CAAe,OAAO,IAAI,CAAA;AAC1B,MAAA,YAAA,IAAA,IAAA,GAAA,MAAA,GAAA,YAAA,CAAe,KAAA,CAAA;AAAA,IACjB,CAAA;AAEA,IAAA,MAAM,KAAA,GAAQ,QAAQ,MAAM;AAC1B,MAAA,MAAM,IAAA,GAAO,mBAAA,CAAoB,WAAA,EAAa,IAAA,EAAM,QAAQ,CAAA;AAC5D,MAAA,OAAO,UAAA,CAAW,MAAM,CAAC,CAAA;AAAA,IAC3B,CAAA,EAAG,CAAC,WAAA,EAAa,IAAA,EAAM,QAAQ,CAAC,CAAA;AAEhC,IAAA,uBACE,GAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAW,IAAA,CAAK,YAAA,EAAa,EAAG,SAAS,CAAA;AAAA,QACzC,GAAA;AAAA,QACA,YAAA,EAAc,gBAAA;AAAA,QACb,GAAG,IAAA;AAAA,QAEJ,QAAA,kBAAA,GAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,aAAA,EAAY,cAAA;AAAA,YACZ,WAAW,IAAA,CAAK,YAAA,CAAa,MAAM,CAAA,EAAG,YAAA,CAAa,gBAAgB,CAAC,CAAA;AAAA,YAEnE,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,qBACV,GAAA;AAAA,cAAC,KAAA;AAAA,cAAA;AAAA,gBAEC,SAAA,EAAW,aAAa,MAAM,CAAA;AAAA,gBAE7B,QAAA,EAAA,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,qBACT,aAAA;AAAA,kBAAC,WAAA;AAAA,kBAAA;AAAA,oBACE,GAAG,gBAAA;AAAA,oBACJ,GAAA,EAAK,WAAA,CAAY,MAAA,CAAO,GAAA,EAAK,aAAa,CAAA;AAAA,oBAC1C,IAAA,EAAM,GAAA;AAAA,oBACN,KAAA,EAAO;AAAA;AAAA,iBAEV;AAAA,eAAA;AAAA,cAVI,OAAO,WAAA,CAAY,MAAA,CAAO,KAAK,CAAC,CAAA,EAAG,aAAa,CAAC,CAAA;AAAA,aAYzD;AAAA;AAAA;AACH;AAAA,KACF;AAAA,EAEJ;AACF;;;;"}
@@ -0,0 +1,87 @@
1
+ function createSingleSelectionAnnouncement(announcementType, state, dateAdapter) {
2
+ switch (announcementType) {
3
+ case "minFocusableDateExceeded":
4
+ return "cannot focus before minimum date";
5
+ case "maxFocusableDateExceeded":
6
+ return "cannot focus beyond maximum date";
7
+ case "dateSelected": {
8
+ const { multiselect, selectedDate } = state;
9
+ if (!selectedDate || multiselect && Array.isArray(selectedDate) && !selectedDate.length) {
10
+ return "cleared date selection";
11
+ }
12
+ if (multiselect && Array.isArray(selectedDate)) {
13
+ const lastSelectedDate = selectedDate[selectedDate.length - 1];
14
+ return `${dateAdapter.format(lastSelectedDate, "dddd D MMMM YYYY")}, selected, ${selectedDate.length} dates in selection`;
15
+ }
16
+ if (!multiselect && selectedDate) {
17
+ return `${dateAdapter.format(selectedDate, "dddd D MMMM YYYY")}, selected`;
18
+ }
19
+ break;
20
+ }
21
+ case "visibleMonthChanged": {
22
+ const { startVisibleMonth, endVisibleMonth } = state;
23
+ const isSingleMonth = dateAdapter.isSame(
24
+ startVisibleMonth,
25
+ endVisibleMonth,
26
+ "month"
27
+ );
28
+ if (isSingleMonth) {
29
+ return `Visible month starts from ${dateAdapter.format(startVisibleMonth, "dddd D MMMM YYYY")}`;
30
+ }
31
+ const endOfMonth = dateAdapter.endOf(endVisibleMonth, "month");
32
+ return `Visible months are from ${dateAdapter.format(startVisibleMonth, "dddd D MMMM YYYY")} to ${dateAdapter.format(endOfMonth, "dddd D MMMM YYYY")}`;
33
+ }
34
+ }
35
+ }
36
+ function createRangeSelectionAnnouncement(announcementType, state, dateAdapter) {
37
+ switch (announcementType) {
38
+ case "minFocusableDateExceeded":
39
+ return "cannot focus before minimum date";
40
+ case "maxFocusableDateExceeded":
41
+ return "cannot focus beyond maximum date";
42
+ case "dateSelected": {
43
+ const { multiselect, selectedDate } = state;
44
+ if (!selectedDate || multiselect && Array.isArray(selectedDate) && !selectedDate.length) {
45
+ return "cleared date selection";
46
+ }
47
+ let startDate;
48
+ let endDate;
49
+ if (multiselect && Array.isArray(selectedDate)) {
50
+ const last = selectedDate[selectedDate.length - 1];
51
+ startDate = last.startDate;
52
+ endDate = last.endDate;
53
+ } else if (!multiselect && selectedDate && typeof selectedDate === "object") {
54
+ const range = selectedDate;
55
+ startDate = range.startDate;
56
+ endDate = range.endDate;
57
+ }
58
+ if (startDate && !endDate) {
59
+ return `Selected start date ${dateAdapter.format(startDate, "dddd D MMMM YYYY")}`;
60
+ }
61
+ if (!startDate && endDate) {
62
+ return `${dateAdapter.format(endDate, "dddd D MMMM YYYY")}, selected as end date`;
63
+ }
64
+ if (startDate && endDate) {
65
+ const multiselectSuffix = multiselect && Array.isArray(selectedDate) ? `, ${selectedDate.length > 1 ? `${selectedDate.length} date ranges in selection` : ""}` : "";
66
+ return `Date range ${dateAdapter.format(startDate, "dddd D MMMM YYYY")} to ${dateAdapter.format(endDate, "dddd D MMMM YYYY")}, selected${multiselectSuffix}`;
67
+ }
68
+ break;
69
+ }
70
+ case "visibleMonthChanged": {
71
+ const { startVisibleMonth, endVisibleMonth } = state;
72
+ const isSingleMonth = dateAdapter.isSame(
73
+ startVisibleMonth,
74
+ endVisibleMonth,
75
+ "month"
76
+ );
77
+ if (isSingleMonth) {
78
+ return `Visible month starts from ${dateAdapter.format(startVisibleMonth, "dddd D MMMM YYYY")}`;
79
+ }
80
+ const endOfMonth = dateAdapter.endOf(endVisibleMonth, "month");
81
+ return `Visible months are from ${dateAdapter.format(startVisibleMonth, "dddd D MMMM YYYY")} to ${dateAdapter.format(endOfMonth, "dddd D MMMM YYYY")}`;
82
+ }
83
+ }
84
+ }
85
+
86
+ export { createRangeSelectionAnnouncement, createSingleSelectionAnnouncement };
87
+ //# sourceMappingURL=createAnnouncement.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createAnnouncement.js","sources":["../src/calendar/internal/createAnnouncement.ts"],"sourcesContent":["import type {\n DateFrameworkType,\n SaltDateAdapter,\n} from \"@salt-ds/date-adapters\";\n\nexport type AnnouncementType =\n | \"minFocusableDateExceeded\"\n | \"maxFocusableDateExceeded\"\n | \"dateSelected\"\n | \"visibleMonthChanged\";\n\nexport type AnnouncerMinMaxFocusState = Record<string, never>;\n\nexport interface AnnouncerVisibleMonthState {\n startVisibleMonth: DateFrameworkType;\n endVisibleMonth: DateFrameworkType;\n}\n\nexport interface AnnouncerRangeDateSelectedState {\n multiselect: boolean;\n selectedDate:\n | Array<{ startDate?: DateFrameworkType; endDate?: DateFrameworkType }>\n | { startDate?: DateFrameworkType; endDate?: DateFrameworkType }\n | null;\n}\n\nexport interface AnnouncerSingleDateSelectedState {\n multiselect: boolean;\n selectedDate: DateFrameworkType | DateFrameworkType[] | null;\n}\n\nexport type DateSelectionAnnouncerState =\n | AnnouncerSingleDateSelectedState\n | AnnouncerRangeDateSelectedState\n | AnnouncerVisibleMonthState\n | AnnouncerMinMaxFocusState;\n\nexport function createSingleSelectionAnnouncement(\n announcementType: AnnouncementType,\n state: DateSelectionAnnouncerState,\n dateAdapter: SaltDateAdapter,\n): string | undefined {\n switch (announcementType) {\n case \"minFocusableDateExceeded\":\n return \"cannot focus before minimum date\";\n case \"maxFocusableDateExceeded\":\n return \"cannot focus beyond maximum date\";\n case \"dateSelected\": {\n const { multiselect, selectedDate } =\n state as AnnouncerSingleDateSelectedState;\n if (\n !selectedDate ||\n (multiselect && Array.isArray(selectedDate) && !selectedDate.length)\n ) {\n return \"cleared date selection\";\n }\n if (multiselect && Array.isArray(selectedDate)) {\n const lastSelectedDate = selectedDate[selectedDate.length - 1];\n return `${dateAdapter.format(lastSelectedDate, \"dddd D MMMM YYYY\")}, selected, ${selectedDate.length} dates in selection`;\n }\n if (!multiselect && selectedDate) {\n return `${dateAdapter.format(selectedDate as DateFrameworkType, \"dddd D MMMM YYYY\")}, selected`;\n }\n break;\n }\n case \"visibleMonthChanged\": {\n const { startVisibleMonth, endVisibleMonth } =\n state as AnnouncerVisibleMonthState;\n const isSingleMonth = dateAdapter.isSame(\n startVisibleMonth,\n endVisibleMonth,\n \"month\",\n );\n if (isSingleMonth) {\n return `Visible month starts from ${dateAdapter.format(startVisibleMonth, \"dddd D MMMM YYYY\")}`;\n }\n const endOfMonth = dateAdapter.endOf(endVisibleMonth, \"month\");\n return `Visible months are from ${dateAdapter.format(startVisibleMonth, \"dddd D MMMM YYYY\")} to ${dateAdapter.format(endOfMonth, \"dddd D MMMM YYYY\")}`;\n }\n }\n}\n\nexport function createRangeSelectionAnnouncement(\n announcementType: AnnouncementType,\n state: DateSelectionAnnouncerState,\n dateAdapter: SaltDateAdapter,\n): string | undefined {\n switch (announcementType) {\n case \"minFocusableDateExceeded\":\n return \"cannot focus before minimum date\";\n case \"maxFocusableDateExceeded\":\n return \"cannot focus beyond maximum date\";\n case \"dateSelected\": {\n const { multiselect, selectedDate } =\n state as AnnouncerRangeDateSelectedState;\n if (\n !selectedDate ||\n (multiselect && Array.isArray(selectedDate) && !selectedDate.length)\n ) {\n return \"cleared date selection\";\n }\n let startDate: DateFrameworkType | null | undefined;\n let endDate: DateFrameworkType | null | undefined;\n if (multiselect && Array.isArray(selectedDate)) {\n const last = selectedDate[selectedDate.length - 1];\n startDate = last.startDate;\n endDate = last.endDate;\n } else if (\n !multiselect &&\n selectedDate &&\n typeof selectedDate === \"object\"\n ) {\n const range = selectedDate as {\n startDate?: DateFrameworkType | null;\n endDate?: DateFrameworkType | null;\n };\n startDate = range.startDate;\n endDate = range.endDate;\n }\n if (startDate && !endDate) {\n return `Selected start date ${dateAdapter.format(startDate, \"dddd D MMMM YYYY\")}`;\n }\n if (!startDate && endDate) {\n return `${dateAdapter.format(endDate, \"dddd D MMMM YYYY\")}, selected as end date`;\n }\n if (startDate && endDate) {\n const multiselectSuffix =\n multiselect && Array.isArray(selectedDate)\n ? `, ${selectedDate.length > 1 ? `${selectedDate.length} date ranges in selection` : \"\"}`\n : \"\";\n return `Date range ${dateAdapter.format(startDate, \"dddd D MMMM YYYY\")} to ${dateAdapter.format(endDate, \"dddd D MMMM YYYY\")}, selected${multiselectSuffix}`;\n }\n break;\n }\n case \"visibleMonthChanged\": {\n const { startVisibleMonth, endVisibleMonth } =\n state as AnnouncerVisibleMonthState;\n const isSingleMonth = dateAdapter.isSame(\n startVisibleMonth,\n endVisibleMonth,\n \"month\",\n );\n if (isSingleMonth) {\n return `Visible month starts from ${dateAdapter.format(startVisibleMonth, \"dddd D MMMM YYYY\")}`;\n }\n const endOfMonth = dateAdapter.endOf(endVisibleMonth, \"month\");\n return `Visible months are from ${dateAdapter.format(startVisibleMonth, \"dddd D MMMM YYYY\")} to ${dateAdapter.format(endOfMonth, \"dddd D MMMM YYYY\")}`;\n }\n }\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,64 @@
1
+ import { useLocalization } from '../../localization-provider/LocalizationProvider.js';
2
+ import { useCalendarContext } from './CalendarContext.js';
3
+
4
+ function useFocusManagement({ date }) {
5
+ const { dateAdapter } = useLocalization();
6
+ const {
7
+ helpers: { setFocusedDate }
8
+ } = useCalendarContext();
9
+ const handleClick = (event) => {
10
+ setFocusedDate(event, date);
11
+ };
12
+ const handleKeyDown = (event) => {
13
+ let newDate;
14
+ switch (event.key) {
15
+ case "ArrowUp":
16
+ newDate = dateAdapter.subtract(date, { weeks: 1 });
17
+ break;
18
+ case "ArrowDown":
19
+ newDate = dateAdapter.add(date, { weeks: 1 });
20
+ break;
21
+ case "ArrowLeft":
22
+ newDate = dateAdapter.subtract(date, { days: 1 });
23
+ break;
24
+ case "ArrowRight":
25
+ newDate = dateAdapter.add(date, { days: 1 });
26
+ break;
27
+ case "Home":
28
+ newDate = dateAdapter.startOf(date, "week");
29
+ break;
30
+ case "End":
31
+ newDate = dateAdapter.endOf(date, "week");
32
+ break;
33
+ case "PageUp":
34
+ if (event.shiftKey) {
35
+ newDate = dateAdapter.subtract(date, { years: 1 });
36
+ } else {
37
+ newDate = dateAdapter.subtract(date, { months: 1 });
38
+ }
39
+ break;
40
+ case "PageDown":
41
+ if (event.shiftKey) {
42
+ newDate = dateAdapter.add(date, { years: 1 });
43
+ } else {
44
+ newDate = dateAdapter.add(date, { months: 1 });
45
+ }
46
+ break;
47
+ }
48
+ if (newDate && dateAdapter.compare(newDate, date) !== 0) {
49
+ event.preventDefault();
50
+ setFocusedDate(event, newDate);
51
+ }
52
+ };
53
+ const handleFocus = (event) => {
54
+ setFocusedDate(event, date);
55
+ };
56
+ return {
57
+ handleClick,
58
+ handleKeyDown,
59
+ handleFocus
60
+ };
61
+ }
62
+
63
+ export { useFocusManagement };
64
+ //# sourceMappingURL=useFocusManagement.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useFocusManagement.js","sources":["../src/calendar/internal/useFocusManagement.ts"],"sourcesContent":["import type { DateFrameworkType } from \"@salt-ds/date-adapters\";\nimport type {\n FocusEventHandler,\n KeyboardEventHandler,\n MouseEventHandler,\n} from \"react\";\nimport { useLocalization } from \"../../localization-provider\";\nimport { useCalendarContext } from \"./CalendarContext\";\n\nexport function useFocusManagement({ date }: { date: DateFrameworkType }) {\n const { dateAdapter } = useLocalization<DateFrameworkType>();\n const {\n helpers: { setFocusedDate },\n } = useCalendarContext();\n const handleClick: MouseEventHandler<HTMLButtonElement> = (event) => {\n setFocusedDate(event, date);\n };\n\n const handleKeyDown: KeyboardEventHandler<HTMLButtonElement> = (event) => {\n let newDate: DateFrameworkType | undefined;\n switch (event.key) {\n case \"ArrowUp\":\n newDate = dateAdapter.subtract(date, { weeks: 1 });\n break;\n case \"ArrowDown\":\n newDate = dateAdapter.add(date, { weeks: 1 });\n break;\n case \"ArrowLeft\":\n newDate = dateAdapter.subtract(date, { days: 1 });\n break;\n case \"ArrowRight\":\n newDate = dateAdapter.add(date, { days: 1 });\n break;\n case \"Home\":\n newDate = dateAdapter.startOf(date, \"week\");\n break;\n case \"End\":\n newDate = dateAdapter.endOf(date, \"week\");\n break;\n case \"PageUp\":\n if (event.shiftKey) {\n newDate = dateAdapter.subtract(date, { years: 1 });\n } else {\n newDate = dateAdapter.subtract(date, { months: 1 });\n }\n break;\n case \"PageDown\":\n if (event.shiftKey) {\n newDate = dateAdapter.add(date, { years: 1 });\n } else {\n newDate = dateAdapter.add(date, { months: 1 });\n }\n break;\n default:\n }\n if (newDate && dateAdapter.compare(newDate, date) !== 0) {\n event.preventDefault();\n setFocusedDate(event, newDate);\n }\n };\n\n const handleFocus: FocusEventHandler<HTMLButtonElement> = (event) => {\n setFocusedDate(event, date);\n };\n\n return {\n handleClick,\n handleKeyDown,\n handleFocus,\n };\n}\n"],"names":[],"mappings":";;;AASO,SAAS,kBAAA,CAAmB,EAAE,IAAA,EAAK,EAAgC;AACxE,EAAA,MAAM,EAAE,WAAA,EAAY,GAAI,eAAA,EAAmC;AAC3D,EAAA,MAAM;AAAA,IACJ,OAAA,EAAS,EAAE,cAAA;AAAe,MACxB,kBAAA,EAAmB;AACvB,EAAA,MAAM,WAAA,GAAoD,CAAC,KAAA,KAAU;AACnE,IAAA,cAAA,CAAe,OAAO,IAAI,CAAA;AAAA,EAC5B,CAAA;AAEA,EAAA,MAAM,aAAA,GAAyD,CAAC,KAAA,KAAU;AACxE,IAAA,IAAI,OAAA;AACJ,IAAA,QAAQ,MAAM,GAAA;AAAK,MACjB,KAAK,SAAA;AACH,QAAA,OAAA,GAAU,YAAY,QAAA,CAAS,IAAA,EAAM,EAAE,KAAA,EAAO,GAAG,CAAA;AACjD,QAAA;AAAA,MACF,KAAK,WAAA;AACH,QAAA,OAAA,GAAU,YAAY,GAAA,CAAI,IAAA,EAAM,EAAE,KAAA,EAAO,GAAG,CAAA;AAC5C,QAAA;AAAA,MACF,KAAK,WAAA;AACH,QAAA,OAAA,GAAU,YAAY,QAAA,CAAS,IAAA,EAAM,EAAE,IAAA,EAAM,GAAG,CAAA;AAChD,QAAA;AAAA,MACF,KAAK,YAAA;AACH,QAAA,OAAA,GAAU,YAAY,GAAA,CAAI,IAAA,EAAM,EAAE,IAAA,EAAM,GAAG,CAAA;AAC3C,QAAA;AAAA,MACF,KAAK,MAAA;AACH,QAAA,OAAA,GAAU,WAAA,CAAY,OAAA,CAAQ,IAAA,EAAM,MAAM,CAAA;AAC1C,QAAA;AAAA,MACF,KAAK,KAAA;AACH,QAAA,OAAA,GAAU,WAAA,CAAY,KAAA,CAAM,IAAA,EAAM,MAAM,CAAA;AACxC,QAAA;AAAA,MACF,KAAK,QAAA;AACH,QAAA,IAAI,MAAM,QAAA,EAAU;AAClB,UAAA,OAAA,GAAU,YAAY,QAAA,CAAS,IAAA,EAAM,EAAE,KAAA,EAAO,GAAG,CAAA;AAAA,QACnD,CAAA,MAAO;AACL,UAAA,OAAA,GAAU,YAAY,QAAA,CAAS,IAAA,EAAM,EAAE,MAAA,EAAQ,GAAG,CAAA;AAAA,QACpD;AACA,QAAA;AAAA,MACF,KAAK,UAAA;AACH,QAAA,IAAI,MAAM,QAAA,EAAU;AAClB,UAAA,OAAA,GAAU,YAAY,GAAA,CAAI,IAAA,EAAM,EAAE,KAAA,EAAO,GAAG,CAAA;AAAA,QAC9C,CAAA,MAAO;AACL,UAAA,OAAA,GAAU,YAAY,GAAA,CAAI,IAAA,EAAM,EAAE,MAAA,EAAQ,GAAG,CAAA;AAAA,QAC/C;AACA,QAAA;AACF;AAEF,IAAA,IAAI,WAAW,WAAA,CAAY,OAAA,CAAQ,OAAA,EAAS,IAAI,MAAM,CAAA,EAAG;AACvD,MAAA,KAAA,CAAM,cAAA,EAAe;AACrB,MAAA,cAAA,CAAe,OAAO,OAAO,CAAA;AAAA,IAC/B;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,WAAA,GAAoD,CAAC,KAAA,KAAU;AACnE,IAAA,cAAA,CAAe,OAAO,IAAI,CAAA;AAAA,EAC5B,CAAA;AAEA,EAAA,OAAO;AAAA,IACL,WAAA;AAAA,IACA,aAAA;AAAA,IACA;AAAA,GACF;AACF;;;;"}
@@ -0,0 +1,44 @@
1
+ function daysOfWeek(dateAdapter, format) {
2
+ return Array.from(
3
+ { length: 7 },
4
+ (_, day) => dateAdapter.getDayOfWeekName(day, format)
5
+ );
6
+ }
7
+ function generateMonthsForYear(dateAdapter, currentYear) {
8
+ const startOfYear = dateAdapter.startOf(currentYear, "year");
9
+ return Array.from(
10
+ { length: 12 },
11
+ (_, month) => dateAdapter.add(startOfYear, { months: month })
12
+ );
13
+ }
14
+ function generateVisibleDays(dateAdapter, currentMonth, timezone) {
15
+ const totalDays = 6 * 7;
16
+ const startDate = dateAdapter.startOf(
17
+ dateAdapter.startOf(currentMonth, "month"),
18
+ "week"
19
+ );
20
+ return [...Array(totalDays).keys()].map((dayDelta) => {
21
+ let day = dateAdapter.add(startDate, { days: dayDelta });
22
+ day = dateAdapter.setTimezone(day, timezone);
23
+ return day;
24
+ });
25
+ }
26
+ function monthDiff(dateAdapter, a, b) {
27
+ const aMonth = dateAdapter.getMonth(a);
28
+ const aYear = dateAdapter.getYear(a);
29
+ const bMonth = dateAdapter.getMonth(b);
30
+ const bYear = dateAdapter.getYear(b);
31
+ return bMonth - aMonth + 12 * (bYear - aYear);
32
+ }
33
+ function generateDatesForMonth(dateAdapter, date) {
34
+ const startDate = dateAdapter.startOf(date, "month");
35
+ const endDate = dateAdapter.endOf(date, "month");
36
+ const dates = [];
37
+ for (let currentDate = startDate; dateAdapter.compare(currentDate, endDate) <= 0; currentDate = dateAdapter.add(currentDate, { days: 1 })) {
38
+ dates.push(currentDate);
39
+ }
40
+ return dates;
41
+ }
42
+
43
+ export { daysOfWeek, generateDatesForMonth, generateMonthsForYear, generateVisibleDays, monthDiff };
44
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sources":["../src/calendar/internal/utils.ts"],"sourcesContent":["import type {\n DateFrameworkType,\n SaltDateAdapter,\n Timezone,\n} from \"@salt-ds/date-adapters\";\n\nexport function daysOfWeek(\n dateAdapter: SaltDateAdapter,\n format: \"long\" | \"short\" | \"narrow\",\n) {\n return Array.from({ length: 7 }, (_, day) =>\n dateAdapter.getDayOfWeekName(day, format),\n );\n}\n\nexport function generateMonthsForYear(\n dateAdapter: SaltDateAdapter,\n currentYear: DateFrameworkType,\n) {\n const startOfYear = dateAdapter.startOf(currentYear, \"year\");\n return Array.from({ length: 12 }, (_, month) =>\n dateAdapter.add(startOfYear, { months: month }),\n );\n}\n\nexport function generateVisibleDays(\n dateAdapter: SaltDateAdapter,\n currentMonth: DateFrameworkType,\n timezone: Timezone,\n) {\n const totalDays = 6 * 7;\n const startDate = dateAdapter.startOf(\n dateAdapter.startOf(currentMonth, \"month\"),\n \"week\",\n );\n return [...Array(totalDays).keys()].map((dayDelta) => {\n let day = dateAdapter.add(startDate, { days: dayDelta });\n day = dateAdapter.setTimezone(day, timezone);\n return day;\n });\n}\n\nexport function monthDiff(\n dateAdapter: SaltDateAdapter,\n a: DateFrameworkType,\n b: DateFrameworkType,\n) {\n const aMonth = dateAdapter.getMonth(a);\n const aYear = dateAdapter.getYear(a);\n const bMonth = dateAdapter.getMonth(b);\n const bYear = dateAdapter.getYear(b);\n\n return bMonth - aMonth + 12 * (bYear - aYear);\n}\n\nexport function generateDatesForMonth(\n dateAdapter: SaltDateAdapter,\n date: DateFrameworkType,\n): DateFrameworkType[] {\n const startDate = dateAdapter.startOf(date, \"month\");\n const endDate = dateAdapter.endOf(date, \"month\");\n const dates: DateFrameworkType[] = [];\n for (\n let currentDate = startDate;\n dateAdapter.compare(currentDate, endDate) <= 0;\n currentDate = dateAdapter.add(currentDate, { days: 1 })\n ) {\n dates.push(currentDate);\n }\n return dates;\n}\n"],"names":[],"mappings":"AAMO,SAAS,UAAA,CACd,aACA,MAAA,EACA;AACA,EAAA,OAAO,KAAA,CAAM,IAAA;AAAA,IAAK,EAAE,QAAQ,CAAA,EAAE;AAAA,IAAG,CAAC,CAAA,EAAG,GAAA,KACnC,WAAA,CAAY,gBAAA,CAAiB,KAAK,MAAM;AAAA,GAC1C;AACF;AAEO,SAAS,qBAAA,CACd,aACA,WAAA,EACA;AACA,EAAA,MAAM,WAAA,GAAc,WAAA,CAAY,OAAA,CAAQ,WAAA,EAAa,MAAM,CAAA;AAC3D,EAAA,OAAO,KAAA,CAAM,IAAA;AAAA,IAAK,EAAE,QAAQ,EAAA,EAAG;AAAA,IAAG,CAAC,GAAG,KAAA,KACpC,WAAA,CAAY,IAAI,WAAA,EAAa,EAAE,MAAA,EAAQ,KAAA,EAAO;AAAA,GAChD;AACF;AAEO,SAAS,mBAAA,CACd,WAAA,EACA,YAAA,EACA,QAAA,EACA;AACA,EAAA,MAAM,YAAY,CAAA,GAAI,CAAA;AACtB,EAAA,MAAM,YAAY,WAAA,CAAY,OAAA;AAAA,IAC5B,WAAA,CAAY,OAAA,CAAQ,YAAA,EAAc,OAAO,CAAA;AAAA,IACzC;AAAA,GACF;AACA,EAAA,OAAO,CAAC,GAAG,KAAA,CAAM,SAAS,CAAA,CAAE,MAAM,CAAA,CAAE,GAAA,CAAI,CAAC,QAAA,KAAa;AACpD,IAAA,IAAI,MAAM,WAAA,CAAY,GAAA,CAAI,WAAW,EAAE,IAAA,EAAM,UAAU,CAAA;AACvD,IAAA,GAAA,GAAM,WAAA,CAAY,WAAA,CAAY,GAAA,EAAK,QAAQ,CAAA;AAC3C,IAAA,OAAO,GAAA;AAAA,EACT,CAAC,CAAA;AACH;AAEO,SAAS,SAAA,CACd,WAAA,EACA,CAAA,EACA,CAAA,EACA;AACA,EAAA,MAAM,MAAA,GAAS,WAAA,CAAY,QAAA,CAAS,CAAC,CAAA;AACrC,EAAA,MAAM,KAAA,GAAQ,WAAA,CAAY,OAAA,CAAQ,CAAC,CAAA;AACnC,EAAA,MAAM,MAAA,GAAS,WAAA,CAAY,QAAA,CAAS,CAAC,CAAA;AACrC,EAAA,MAAM,KAAA,GAAQ,WAAA,CAAY,OAAA,CAAQ,CAAC,CAAA;AAEnC,EAAA,OAAO,MAAA,GAAS,MAAA,GAAS,EAAA,IAAM,KAAA,GAAQ,KAAA,CAAA;AACzC;AAEO,SAAS,qBAAA,CACd,aACA,IAAA,EACqB;AACrB,EAAA,MAAM,SAAA,GAAY,WAAA,CAAY,OAAA,CAAQ,IAAA,EAAM,OAAO,CAAA;AACnD,EAAA,MAAM,OAAA,GAAU,WAAA,CAAY,KAAA,CAAM,IAAA,EAAM,OAAO,CAAA;AAC/C,EAAA,MAAM,QAA6B,EAAC;AACpC,EAAA,KAAA,IACM,cAAc,SAAA,EAClB,WAAA,CAAY,OAAA,CAAQ,WAAA,EAAa,OAAO,CAAA,IAAK,CAAA,EAC7C,WAAA,GAAc,WAAA,CAAY,IAAI,WAAA,EAAa,EAAE,IAAA,EAAM,CAAA,EAAG,CAAA,EACtD;AACA,IAAA,KAAA,CAAM,KAAK,WAAW,CAAA;AAAA,EACxB;AACA,EAAA,OAAO,KAAA;AACT;;;;"}