@salt-ds/date-components 1.1.1 → 1.1.3

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 (66) hide show
  1. package/CHANGELOG.md +71 -0
  2. package/css/salt-date-components.css +2 -2
  3. package/dist-cjs/calendar/Calendar.js +1 -1
  4. package/dist-cjs/calendar/Calendar.js.map +1 -1
  5. package/dist-cjs/calendar/CalendarGrid.js +1 -1
  6. package/dist-cjs/calendar/CalendarGrid.js.map +1 -1
  7. package/dist-cjs/calendar/CalendarMonthHeader.js +1 -1
  8. package/dist-cjs/calendar/CalendarMonthHeader.js.map +1 -1
  9. package/dist-cjs/calendar/CalendarNavigation.js +1 -1
  10. package/dist-cjs/calendar/CalendarNavigation.js.map +1 -1
  11. package/dist-cjs/calendar/internal/createAnnouncement.js +3 -3
  12. package/dist-cjs/calendar/internal/createAnnouncement.js.map +1 -1
  13. package/dist-cjs/calendar/useCalendarSelection.js +1 -1
  14. package/dist-cjs/calendar/useCalendarSelection.js.map +1 -1
  15. package/dist-cjs/date-input/DateInput.css.js +1 -1
  16. package/dist-cjs/date-input/DateInputRange.js +9 -10
  17. package/dist-cjs/date-input/DateInputRange.js.map +1 -1
  18. package/dist-cjs/date-input/DateInputSingle.js +1 -1
  19. package/dist-cjs/date-input/DateInputSingle.js.map +1 -1
  20. package/dist-cjs/date-picker/DatePicker.js +1 -1
  21. package/dist-cjs/date-picker/DatePicker.js.map +1 -1
  22. package/dist-cjs/date-picker/DatePickerActions.js +3 -3
  23. package/dist-cjs/date-picker/DatePickerActions.js.map +1 -1
  24. package/dist-cjs/date-picker/DatePickerOverlayProvider.js +3 -1
  25. package/dist-cjs/date-picker/DatePickerOverlayProvider.js.map +1 -1
  26. package/dist-cjs/date-picker/DatePickerRangeInput.js +2 -2
  27. package/dist-cjs/date-picker/DatePickerRangeInput.js.map +1 -1
  28. package/dist-cjs/date-picker/DatePickerSingleInput.js +2 -2
  29. package/dist-cjs/date-picker/DatePickerSingleInput.js.map +1 -1
  30. package/dist-cjs/date-picker/DatePickerTrigger.js +1 -1
  31. package/dist-cjs/date-picker/DatePickerTrigger.js.map +1 -1
  32. package/dist-cjs/date-picker/useDatePicker.js +1 -1
  33. package/dist-cjs/date-picker/useDatePicker.js.map +1 -1
  34. package/dist-es/calendar/Calendar.js +1 -1
  35. package/dist-es/calendar/Calendar.js.map +1 -1
  36. package/dist-es/calendar/CalendarGrid.js +1 -1
  37. package/dist-es/calendar/CalendarGrid.js.map +1 -1
  38. package/dist-es/calendar/CalendarMonthHeader.js +1 -1
  39. package/dist-es/calendar/CalendarMonthHeader.js.map +1 -1
  40. package/dist-es/calendar/CalendarNavigation.js +1 -1
  41. package/dist-es/calendar/CalendarNavigation.js.map +1 -1
  42. package/dist-es/calendar/internal/createAnnouncement.js +3 -3
  43. package/dist-es/calendar/internal/createAnnouncement.js.map +1 -1
  44. package/dist-es/calendar/useCalendarSelection.js +1 -1
  45. package/dist-es/calendar/useCalendarSelection.js.map +1 -1
  46. package/dist-es/date-input/DateInput.css.js +1 -1
  47. package/dist-es/date-input/DateInputRange.js +9 -10
  48. package/dist-es/date-input/DateInputRange.js.map +1 -1
  49. package/dist-es/date-input/DateInputSingle.js +1 -1
  50. package/dist-es/date-input/DateInputSingle.js.map +1 -1
  51. package/dist-es/date-picker/DatePicker.js +1 -1
  52. package/dist-es/date-picker/DatePicker.js.map +1 -1
  53. package/dist-es/date-picker/DatePickerActions.js +3 -3
  54. package/dist-es/date-picker/DatePickerActions.js.map +1 -1
  55. package/dist-es/date-picker/DatePickerOverlayProvider.js +3 -1
  56. package/dist-es/date-picker/DatePickerOverlayProvider.js.map +1 -1
  57. package/dist-es/date-picker/DatePickerRangeInput.js +2 -2
  58. package/dist-es/date-picker/DatePickerRangeInput.js.map +1 -1
  59. package/dist-es/date-picker/DatePickerSingleInput.js +2 -2
  60. package/dist-es/date-picker/DatePickerSingleInput.js.map +1 -1
  61. package/dist-es/date-picker/DatePickerTrigger.js +1 -1
  62. package/dist-es/date-picker/DatePickerTrigger.js.map +1 -1
  63. package/dist-es/date-picker/useDatePicker.js +1 -1
  64. package/dist-es/date-picker/useDatePicker.js.map +1 -1
  65. package/dist-types/date-input/DateInputRange.d.ts +9 -4
  66. package/package.json +4 -4
@@ -8,7 +8,7 @@ import { useCalendarContext } from './internal/CalendarContext.js';
8
8
  import { CalendarMonth } from './internal/CalendarMonth.js';
9
9
 
10
10
  const CalendarGrid = forwardRef(
11
- (props, ref) => {
11
+ function CalendarGrid2(props, ref) {
12
12
  const {
13
13
  CalendarDayProps,
14
14
  CalendarWeekHeaderProps,
@@ -1 +1 @@
1
- {"version":3,"file":"CalendarGrid.js","sources":["../src/calendar/CalendarGrid.tsx"],"sourcesContent":["import {\n GridItem,\n GridLayout,\n type ResponsiveProp,\n useForkRef,\n} from \"@salt-ds/core\";\nimport {\n type ComponentPropsWithoutRef,\n type FocusEventHandler,\n forwardRef,\n useMemo,\n useRef,\n} from \"react\";\nimport { useLocalization } from \"../localization-provider\";\nimport {\n CalendarMonthHeader,\n type CalendarMonthHeaderProps,\n} from \"./CalendarMonthHeader\";\nimport {\n CalendarWeekHeader,\n type CalendarWeekHeaderProps,\n} from \"./CalendarWeekHeader\";\nimport { useCalendarContext } from \"./internal/CalendarContext\";\nimport type { CalendarDayProps } from \"./internal/CalendarDay\";\nimport { CalendarMonth } from \"./internal/CalendarMonth\";\n\n/**\n * Props for the CalendarGrid component.\n */\nexport interface CalendarGridProps extends ComponentPropsWithoutRef<\"div\"> {\n /**\n * Number of columns\n */\n columns?: ResponsiveProp<number | string>;\n /**\n * Props for `CalendarWeekHeader`\n */\n CalendarWeekHeaderProps?: Partial<CalendarWeekHeaderProps>;\n /**\n * Props for `CalendarMonthHeader`\n */\n CalendarMonthHeaderProps?: Partial<CalendarMonthHeaderProps>;\n /**\n * Props for `CalendarDay`\n */\n CalendarDayProps?: Partial<CalendarDayProps>;\n}\n\nexport const CalendarGrid = forwardRef<HTMLDivElement, CalendarGridProps>(\n (props: CalendarGridProps, ref: React.Ref<HTMLDivElement>) => {\n const {\n CalendarDayProps,\n CalendarWeekHeaderProps,\n CalendarMonthHeaderProps,\n columns = 1,\n onBlur,\n ...rest\n } = props;\n\n const { dateAdapter } = useLocalization();\n\n const {\n helpers: { setFocusedDate, setHoveredDate },\n state: { visibleMonth, numberOfVisibleMonths = 1 },\n } = useCalendarContext();\n const calendarGridRef = useRef<HTMLDivElement>(null);\n const containerRef = useForkRef(ref, calendarGridRef);\n\n const handleCalendarGridBlur: FocusEventHandler<HTMLDivElement> = (\n event,\n ) => {\n event.stopPropagation();\n const relatedTarget = event.relatedTarget as HTMLElement;\n if (\n calendarGridRef.current &&\n relatedTarget &&\n calendarGridRef.current.contains(relatedTarget)\n ) {\n return;\n }\n setFocusedDate(event, null);\n setHoveredDate(event, null);\n onBlur?.(event);\n };\n\n const visibleMonths = useMemo(\n () =>\n Array.from({ length: numberOfVisibleMonths }, (_value, index) =>\n dateAdapter.add(visibleMonth, {\n months: index,\n }),\n ),\n [dateAdapter, numberOfVisibleMonths, visibleMonth],\n );\n\n return (\n <GridLayout\n columns={columns}\n gap={1}\n ref={containerRef}\n onBlur={handleCalendarGridBlur}\n {...rest}\n >\n {visibleMonths.map((gridItemVisibleMonth) => (\n <GridItem\n key={`calendar-grid-item-${dateAdapter.format(gridItemVisibleMonth, \"MMMM YYYY\")}`}\n >\n {numberOfVisibleMonths > 1 ? (\n <CalendarMonthHeader\n {...CalendarMonthHeaderProps}\n month={gridItemVisibleMonth}\n />\n ) : null}\n <CalendarWeekHeader {...CalendarWeekHeaderProps} />\n <CalendarMonth\n date={gridItemVisibleMonth}\n CalendarDayProps={CalendarDayProps}\n />\n </GridItem>\n ))}\n </GridLayout>\n );\n },\n);\n"],"names":[],"mappings":";;;;;;;;;AAgDO,MAAM,YAAA,GAAe,UAAA;AAAA,EAC1B,CAAC,OAA0B,GAAA,KAAmC;AAC5D,IAAA,MAAM;AAAA,MACJ,gBAAA;AAAA,MACA,uBAAA;AAAA,MACA,wBAAA;AAAA,MACA,OAAA,GAAU,CAAA;AAAA,MACV,MAAA;AAAA,MACA,GAAG;AAAA,KACL,GAAI,KAAA;AAEJ,IAAA,MAAM,EAAE,WAAA,EAAY,GAAI,eAAA,EAAgB;AAExC,IAAA,MAAM;AAAA,MACJ,OAAA,EAAS,EAAE,cAAA,EAAgB,cAAA,EAAe;AAAA,MAC1C,KAAA,EAAO,EAAE,YAAA,EAAc,qBAAA,GAAwB,CAAA;AAAE,QAC/C,kBAAA,EAAmB;AACvB,IAAA,MAAM,eAAA,GAAkB,OAAuB,IAAI,CAAA;AACnD,IAAA,MAAM,YAAA,GAAe,UAAA,CAAW,GAAA,EAAK,eAAe,CAAA;AAEpD,IAAA,MAAM,sBAAA,GAA4D,CAChE,KAAA,KACG;AACH,MAAA,KAAA,CAAM,eAAA,EAAgB;AACtB,MAAA,MAAM,gBAAgB,KAAA,CAAM,aAAA;AAC5B,MAAA,IACE,gBAAgB,OAAA,IAChB,aAAA,IACA,gBAAgB,OAAA,CAAQ,QAAA,CAAS,aAAa,CAAA,EAC9C;AACA,QAAA;AAAA,MACF;AACA,MAAA,cAAA,CAAe,OAAO,IAAI,CAAA;AAC1B,MAAA,cAAA,CAAe,OAAO,IAAI,CAAA;AAC1B,MAAA,MAAA,IAAA,IAAA,GAAA,MAAA,GAAA,MAAA,CAAS,KAAA,CAAA;AAAA,IACX,CAAA;AAEA,IAAA,MAAM,aAAA,GAAgB,OAAA;AAAA,MACpB,MACE,KAAA,CAAM,IAAA;AAAA,QAAK,EAAE,QAAQ,qBAAA,EAAsB;AAAA,QAAG,CAAC,MAAA,EAAQ,KAAA,KACrD,WAAA,CAAY,IAAI,YAAA,EAAc;AAAA,UAC5B,MAAA,EAAQ;AAAA,SACT;AAAA,OACH;AAAA,MACF,CAAC,WAAA,EAAa,qBAAA,EAAuB,YAAY;AAAA,KACnD;AAEA,IAAA,uBACE,GAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QACC,OAAA;AAAA,QACA,GAAA,EAAK,CAAA;AAAA,QACL,GAAA,EAAK,YAAA;AAAA,QACL,MAAA,EAAQ,sBAAA;AAAA,QACP,GAAG,IAAA;AAAA,QAEH,QAAA,EAAA,aAAA,CAAc,GAAA,CAAI,CAAC,oBAAA,qBAClB,IAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YAGE,QAAA,EAAA;AAAA,cAAA,qBAAA,GAAwB,CAAA,mBACvB,GAAA;AAAA,gBAAC,mBAAA;AAAA,gBAAA;AAAA,kBACE,GAAG,wBAAA;AAAA,kBACJ,KAAA,EAAO;AAAA;AAAA,eACT,GACE,IAAA;AAAA,8BACJ,GAAA,CAAC,kBAAA,EAAA,EAAoB,GAAG,uBAAA,EAAyB,CAAA;AAAA,8BACjD,GAAA;AAAA,gBAAC,aAAA;AAAA,gBAAA;AAAA,kBACC,IAAA,EAAM,oBAAA;AAAA,kBACN;AAAA;AAAA;AACF;AAAA,WAAA;AAAA,UAZK,CAAA,mBAAA,EAAsB,WAAA,CAAY,MAAA,CAAO,oBAAA,EAAsB,WAAW,CAAC,CAAA;AAAA,SAcnF;AAAA;AAAA,KACH;AAAA,EAEJ;AACF;;;;"}
1
+ {"version":3,"file":"CalendarGrid.js","sources":["../src/calendar/CalendarGrid.tsx"],"sourcesContent":["import {\n GridItem,\n GridLayout,\n type ResponsiveProp,\n useForkRef,\n} from \"@salt-ds/core\";\nimport {\n type ComponentPropsWithoutRef,\n type FocusEventHandler,\n forwardRef,\n useMemo,\n useRef,\n} from \"react\";\nimport { useLocalization } from \"../localization-provider\";\nimport {\n CalendarMonthHeader,\n type CalendarMonthHeaderProps,\n} from \"./CalendarMonthHeader\";\nimport {\n CalendarWeekHeader,\n type CalendarWeekHeaderProps,\n} from \"./CalendarWeekHeader\";\nimport { useCalendarContext } from \"./internal/CalendarContext\";\nimport type { CalendarDayProps } from \"./internal/CalendarDay\";\nimport { CalendarMonth } from \"./internal/CalendarMonth\";\n\n/**\n * Props for the CalendarGrid component.\n */\nexport interface CalendarGridProps extends ComponentPropsWithoutRef<\"div\"> {\n /**\n * Number of columns\n */\n columns?: ResponsiveProp<number | string>;\n /**\n * Props for `CalendarWeekHeader`\n */\n CalendarWeekHeaderProps?: Partial<CalendarWeekHeaderProps>;\n /**\n * Props for `CalendarMonthHeader`\n */\n CalendarMonthHeaderProps?: Partial<CalendarMonthHeaderProps>;\n /**\n * Props for `CalendarDay`\n */\n CalendarDayProps?: Partial<CalendarDayProps>;\n}\n\nexport const CalendarGrid = forwardRef<HTMLDivElement, CalendarGridProps>(\n function CalendarGrid(props, ref) {\n const {\n CalendarDayProps,\n CalendarWeekHeaderProps,\n CalendarMonthHeaderProps,\n columns = 1,\n onBlur,\n ...rest\n } = props;\n\n const { dateAdapter } = useLocalization();\n\n const {\n helpers: { setFocusedDate, setHoveredDate },\n state: { visibleMonth, numberOfVisibleMonths = 1 },\n } = useCalendarContext();\n const calendarGridRef = useRef<HTMLDivElement>(null);\n const containerRef = useForkRef(ref, calendarGridRef);\n\n const handleCalendarGridBlur: FocusEventHandler<HTMLDivElement> = (\n event,\n ) => {\n event.stopPropagation();\n const relatedTarget = event.relatedTarget as HTMLElement;\n if (\n calendarGridRef.current &&\n relatedTarget &&\n calendarGridRef.current.contains(relatedTarget)\n ) {\n return;\n }\n setFocusedDate(event, null);\n setHoveredDate(event, null);\n onBlur?.(event);\n };\n\n const visibleMonths = useMemo(\n () =>\n Array.from({ length: numberOfVisibleMonths }, (_value, index) =>\n dateAdapter.add(visibleMonth, {\n months: index,\n }),\n ),\n [dateAdapter, numberOfVisibleMonths, visibleMonth],\n );\n\n return (\n <GridLayout\n columns={columns}\n gap={1}\n ref={containerRef}\n onBlur={handleCalendarGridBlur}\n {...rest}\n >\n {visibleMonths.map((gridItemVisibleMonth) => (\n <GridItem\n key={`calendar-grid-item-${dateAdapter.format(gridItemVisibleMonth, \"MMMM YYYY\")}`}\n >\n {numberOfVisibleMonths > 1 ? (\n <CalendarMonthHeader\n {...CalendarMonthHeaderProps}\n month={gridItemVisibleMonth}\n />\n ) : null}\n <CalendarWeekHeader {...CalendarWeekHeaderProps} />\n <CalendarMonth\n date={gridItemVisibleMonth}\n CalendarDayProps={CalendarDayProps}\n />\n </GridItem>\n ))}\n </GridLayout>\n );\n },\n);\n"],"names":["CalendarGrid"],"mappings":";;;;;;;;;AAgDO,MAAM,YAAA,GAAe,UAAA;AAAA,EAC1B,SAASA,aAAAA,CAAa,KAAA,EAAO,GAAA,EAAK;AAChC,IAAA,MAAM;AAAA,MACJ,gBAAA;AAAA,MACA,uBAAA;AAAA,MACA,wBAAA;AAAA,MACA,OAAA,GAAU,CAAA;AAAA,MACV,MAAA;AAAA,MACA,GAAG;AAAA,KACL,GAAI,KAAA;AAEJ,IAAA,MAAM,EAAE,WAAA,EAAY,GAAI,eAAA,EAAgB;AAExC,IAAA,MAAM;AAAA,MACJ,OAAA,EAAS,EAAE,cAAA,EAAgB,cAAA,EAAe;AAAA,MAC1C,KAAA,EAAO,EAAE,YAAA,EAAc,qBAAA,GAAwB,CAAA;AAAE,QAC/C,kBAAA,EAAmB;AACvB,IAAA,MAAM,eAAA,GAAkB,OAAuB,IAAI,CAAA;AACnD,IAAA,MAAM,YAAA,GAAe,UAAA,CAAW,GAAA,EAAK,eAAe,CAAA;AAEpD,IAAA,MAAM,sBAAA,GAA4D,CAChE,KAAA,KACG;AACH,MAAA,KAAA,CAAM,eAAA,EAAgB;AACtB,MAAA,MAAM,gBAAgB,KAAA,CAAM,aAAA;AAC5B,MAAA,IACE,gBAAgB,OAAA,IAChB,aAAA,IACA,gBAAgB,OAAA,CAAQ,QAAA,CAAS,aAAa,CAAA,EAC9C;AACA,QAAA;AAAA,MACF;AACA,MAAA,cAAA,CAAe,OAAO,IAAI,CAAA;AAC1B,MAAA,cAAA,CAAe,OAAO,IAAI,CAAA;AAC1B,MAAA,MAAA,IAAA,IAAA,GAAA,MAAA,GAAA,MAAA,CAAS,KAAA,CAAA;AAAA,IACX,CAAA;AAEA,IAAA,MAAM,aAAA,GAAgB,OAAA;AAAA,MACpB,MACE,KAAA,CAAM,IAAA;AAAA,QAAK,EAAE,QAAQ,qBAAA,EAAsB;AAAA,QAAG,CAAC,MAAA,EAAQ,KAAA,KACrD,WAAA,CAAY,IAAI,YAAA,EAAc;AAAA,UAC5B,MAAA,EAAQ;AAAA,SACT;AAAA,OACH;AAAA,MACF,CAAC,WAAA,EAAa,qBAAA,EAAuB,YAAY;AAAA,KACnD;AAEA,IAAA,uBACE,GAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QACC,OAAA;AAAA,QACA,GAAA,EAAK,CAAA;AAAA,QACL,GAAA,EAAK,YAAA;AAAA,QACL,MAAA,EAAQ,sBAAA;AAAA,QACP,GAAG,IAAA;AAAA,QAEH,QAAA,EAAA,aAAA,CAAc,GAAA,CAAI,CAAC,oBAAA,qBAClB,IAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YAGE,QAAA,EAAA;AAAA,cAAA,qBAAA,GAAwB,CAAA,mBACvB,GAAA;AAAA,gBAAC,mBAAA;AAAA,gBAAA;AAAA,kBACE,GAAG,wBAAA;AAAA,kBACJ,KAAA,EAAO;AAAA;AAAA,eACT,GACE,IAAA;AAAA,8BACJ,GAAA,CAAC,kBAAA,EAAA,EAAoB,GAAG,uBAAA,EAAyB,CAAA;AAAA,8BACjD,GAAA;AAAA,gBAAC,aAAA;AAAA,gBAAA;AAAA,kBACC,IAAA,EAAM,oBAAA;AAAA,kBACN;AAAA;AAAA;AACF;AAAA,WAAA;AAAA,UAZK,CAAA,mBAAA,EAAsB,WAAA,CAAY,MAAA,CAAO,oBAAA,EAAsB,WAAW,CAAC,CAAA;AAAA,SAcnF;AAAA;AAAA,KACH;AAAA,EAEJ;AACF;;;;"}
@@ -8,7 +8,7 @@ import { useLocalization } from '../localization-provider/LocalizationProvider.j
8
8
  import css_248z from './CalendarMonthHeader.css.js';
9
9
 
10
10
  const withBaseName = makePrefixer("saltCalendarMonthHeader");
11
- const CalendarMonthHeader = forwardRef((props, ref) => {
11
+ const CalendarMonthHeader = forwardRef(function CalendarMonthHeader2(props, ref) {
12
12
  const { className, format: formatMonthProp = "MMMM", month, ...rest } = props;
13
13
  const { dateAdapter } = useLocalization();
14
14
  const targetWindow = useWindow();
@@ -1 +1 @@
1
- {"version":3,"file":"CalendarMonthHeader.js","sources":["../src/calendar/CalendarMonthHeader.tsx"],"sourcesContent":["import { makePrefixer, Text } 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, useCallback } from \"react\";\nimport { useLocalization } from \"../localization-provider\";\nimport calendarMonthHeaderCss from \"./CalendarMonthHeader.css\";\n\n/**\n * Props for the CalendarMonthHeader component.\n */\nexport interface CalendarMonthHeaderProps extends ComponentPropsWithRef<\"div\"> {\n /**\n * Month value\n */\n month: DateFrameworkType;\n /**\n * Format the month value\n * @param date\n */\n format?: string;\n}\n\nconst withBaseName = makePrefixer(\"saltCalendarMonthHeader\");\n\nexport const CalendarMonthHeader = forwardRef<\n HTMLDivElement,\n CalendarMonthHeaderProps\n>((props: CalendarMonthHeaderProps, ref: React.Ref<HTMLDivElement>) => {\n const { className, format: formatMonthProp = \"MMMM\", month, ...rest } = props;\n const { dateAdapter } = useLocalization();\n\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-calendar-month-header\",\n css: calendarMonthHeaderCss,\n window: targetWindow,\n });\n\n const formatMonth = useCallback(\n (date?: DateFrameworkType) => {\n return dateAdapter.format(date, formatMonthProp);\n },\n [dateAdapter, formatMonthProp],\n );\n\n return (\n <div\n data-testid=\"CalendarMonthHeader\"\n className={clsx(withBaseName(), className)}\n ref={ref}\n {...rest}\n >\n <Text>{formatMonth(month)}</Text>\n </div>\n );\n});\n"],"names":["calendarMonthHeaderCss"],"mappings":";;;;;;;;;AAwBA,MAAM,YAAA,GAAe,aAAa,yBAAyB,CAAA;AAEpD,MAAM,mBAAA,GAAsB,UAAA,CAGjC,CAAC,KAAA,EAAiC,GAAA,KAAmC;AACrE,EAAA,MAAM,EAAE,WAAW,MAAA,EAAQ,eAAA,GAAkB,QAAQ,KAAA,EAAO,GAAG,MAAK,GAAI,KAAA;AACxE,EAAA,MAAM,EAAE,WAAA,EAAY,GAAI,eAAA,EAAgB;AAExC,EAAA,MAAM,eAAe,SAAA,EAAU;AAC/B,EAAA,wBAAA,CAAyB;AAAA,IACvB,MAAA,EAAQ,4BAAA;AAAA,IACR,GAAA,EAAKA,QAAA;AAAA,IACL,MAAA,EAAQ;AAAA,GACT,CAAA;AAED,EAAA,MAAM,WAAA,GAAc,WAAA;AAAA,IAClB,CAAC,IAAA,KAA6B;AAC5B,MAAA,OAAO,WAAA,CAAY,MAAA,CAAO,IAAA,EAAM,eAAe,CAAA;AAAA,IACjD,CAAA;AAAA,IACA,CAAC,aAAa,eAAe;AAAA,GAC/B;AAEA,EAAA,uBACE,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,aAAA,EAAY,qBAAA;AAAA,MACZ,SAAA,EAAW,IAAA,CAAK,YAAA,EAAa,EAAG,SAAS,CAAA;AAAA,MACzC,GAAA;AAAA,MACC,GAAG,IAAA;AAAA,MAEJ,QAAA,kBAAA,GAAA,CAAC,IAAA,EAAA,EAAM,QAAA,EAAA,WAAA,CAAY,KAAK,CAAA,EAAE;AAAA;AAAA,GAC5B;AAEJ,CAAC;;;;"}
1
+ {"version":3,"file":"CalendarMonthHeader.js","sources":["../src/calendar/CalendarMonthHeader.tsx"],"sourcesContent":["import { makePrefixer, Text } 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, useCallback } from \"react\";\nimport { useLocalization } from \"../localization-provider\";\nimport calendarMonthHeaderCss from \"./CalendarMonthHeader.css\";\n\n/**\n * Props for the CalendarMonthHeader component.\n */\nexport interface CalendarMonthHeaderProps extends ComponentPropsWithRef<\"div\"> {\n /**\n * Month value\n */\n month: DateFrameworkType;\n /**\n * Format the month value\n * @param date\n */\n format?: string;\n}\n\nconst withBaseName = makePrefixer(\"saltCalendarMonthHeader\");\n\nexport const CalendarMonthHeader = forwardRef<\n HTMLDivElement,\n CalendarMonthHeaderProps\n>(function CalendarMonthHeader(props, ref) {\n const { className, format: formatMonthProp = \"MMMM\", month, ...rest } = props;\n const { dateAdapter } = useLocalization();\n\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-calendar-month-header\",\n css: calendarMonthHeaderCss,\n window: targetWindow,\n });\n\n const formatMonth = useCallback(\n (date?: DateFrameworkType) => {\n return dateAdapter.format(date, formatMonthProp);\n },\n [dateAdapter, formatMonthProp],\n );\n\n return (\n <div\n data-testid=\"CalendarMonthHeader\"\n className={clsx(withBaseName(), className)}\n ref={ref}\n {...rest}\n >\n <Text>{formatMonth(month)}</Text>\n </div>\n );\n});\n"],"names":["CalendarMonthHeader","calendarMonthHeaderCss"],"mappings":";;;;;;;;;AAwBA,MAAM,YAAA,GAAe,aAAa,yBAAyB,CAAA;AAEpD,MAAM,mBAAA,GAAsB,UAAA,CAGjC,SAASA,oBAAAA,CAAoB,OAAO,GAAA,EAAK;AACzC,EAAA,MAAM,EAAE,WAAW,MAAA,EAAQ,eAAA,GAAkB,QAAQ,KAAA,EAAO,GAAG,MAAK,GAAI,KAAA;AACxE,EAAA,MAAM,EAAE,WAAA,EAAY,GAAI,eAAA,EAAgB;AAExC,EAAA,MAAM,eAAe,SAAA,EAAU;AAC/B,EAAA,wBAAA,CAAyB;AAAA,IACvB,MAAA,EAAQ,4BAAA;AAAA,IACR,GAAA,EAAKC,QAAA;AAAA,IACL,MAAA,EAAQ;AAAA,GACT,CAAA;AAED,EAAA,MAAM,WAAA,GAAc,WAAA;AAAA,IAClB,CAAC,IAAA,KAA6B;AAC5B,MAAA,OAAO,WAAA,CAAY,MAAA,CAAO,IAAA,EAAM,eAAe,CAAA;AAAA,IACjD,CAAA;AAAA,IACA,CAAC,aAAa,eAAe;AAAA,GAC/B;AAEA,EAAA,uBACE,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,aAAA,EAAY,qBAAA;AAAA,MACZ,SAAA,EAAW,IAAA,CAAK,YAAA,EAAa,EAAG,SAAS,CAAA;AAAA,MACzC,GAAA;AAAA,MACC,GAAG,IAAA;AAAA,MAEJ,QAAA,kBAAA,GAAA,CAAC,IAAA,EAAA,EAAM,QAAA,EAAA,WAAA,CAAY,KAAK,CAAA,EAAE;AAAA;AAAA,GAC5B;AAEJ,CAAC;;;;"}
@@ -153,7 +153,7 @@ function OptionWithTooltip({
153
153
  }
154
154
  );
155
155
  }
156
- const CalendarNavigation = forwardRef((props, ref) => {
156
+ const CalendarNavigation = forwardRef(function CalendarNavigation2(props, ref) {
157
157
  const {
158
158
  className,
159
159
  formatMonth: formatMonthProp,
@@ -1 +1 @@
1
- {"version":3,"file":"CalendarNavigation.js","sources":["../src/calendar/CalendarNavigation.tsx"],"sourcesContent":["import {\n Button,\n type ButtonProps,\n Dropdown,\n type DropdownProps,\n makePrefixer,\n Option,\n type OptionProps,\n Tooltip,\n type TooltipProps,\n useIcon,\n useListControlContext,\n} from \"@salt-ds/core\";\nimport type {\n DateFrameworkType,\n SaltDateAdapter,\n Timezone,\n} 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 MouseEventHandler,\n type SyntheticEvent,\n useCallback,\n useMemo,\n} from \"react\";\nimport { useLocalization } from \"../localization-provider\";\nimport calendarNavigationCss from \"./CalendarNavigation.css\";\nimport { useCalendarContext } from \"./internal/CalendarContext\";\nimport { generateMonthsForYear, monthDiff } from \"./internal/utils\";\n\n/**\n * Props for the CalendarNavigation component.\n */\nexport interface CalendarNavigationProps extends ComponentPropsWithRef<\"div\"> {\n /**\n * Props for the month dropdown component.\n */\n MonthDropdownProps?: DropdownProps<DateFrameworkType>;\n /**\n * Props for the year dropdown component.\n */\n YearDropdownProps?: DropdownProps<DateFrameworkType>;\n /**\n * Additional props for Previous button.\n */\n PreviousButtonProps?: ButtonProps;\n /**\n * Additional props for Next button.\n */\n NextButtonProps?: ButtonProps;\n /**\n * If `true`, hides the year dropdown.\n */\n hideYearDropdown?: boolean;\n /**\n * The step value for navigation. Defaults to 1.\n */\n step?: number;\n /**\n * Format the month dropdown values\n * @param date\n */\n formatMonth?: string;\n /**\n * Format the year dropdown values\n * @param date\n */\n formatYear?: string;\n}\n\ninterface OptionWithTooltipProps extends OptionProps {\n value: DateFrameworkType;\n tooltipContent?: string;\n}\n\nconst withBaseName = makePrefixer(\"saltCalendarNavigation\");\n\nconst ConditionalTooltip: React.FC<TooltipProps> = ({\n children,\n disabled = true,\n ...rest\n}) => {\n if (disabled) {\n return <>{children}</>;\n }\n return <Tooltip {...rest}>{children}</Tooltip>;\n};\n\nfunction generateYearsBetweenRange(\n dateAdapter: SaltDateAdapter,\n minYear: number,\n maxYear: number,\n timezone: Timezone = \"default\",\n): DateFrameworkType[] {\n const years: DateFrameworkType[] = [];\n let startOfYear = dateAdapter.today(timezone);\n for (let year = minYear; year <= maxYear; year++) {\n startOfYear = dateAdapter.set(startOfYear, { day: 1, month: 1, year });\n years.push(startOfYear);\n }\n return years;\n}\n\nfunction useCalendarNavigation() {\n const {\n state: {\n visibleMonth,\n timezone,\n minDate,\n maxDate,\n numberOfVisibleMonths = 1,\n },\n helpers: { setVisibleMonth, isDayVisible, isOutsideAllowedMonths },\n } = useCalendarContext();\n\n const { dateAdapter } = useLocalization();\n\n const disableNavigatePrevious = isDayVisible(minDate);\n const disableNavigateNext = isDayVisible(maxDate);\n\n const moveToNextMonth = useCallback(\n (event: SyntheticEvent, step = 1) => {\n setVisibleMonth(event, dateAdapter.add(visibleMonth, { months: step }));\n },\n [dateAdapter, setVisibleMonth, visibleMonth],\n );\n\n const moveToPreviousMonth = useCallback(\n (event: SyntheticEvent, step = 1) => {\n setVisibleMonth(\n event,\n dateAdapter.subtract(visibleMonth, { months: step }),\n );\n },\n [dateAdapter, setVisibleMonth, visibleMonth],\n );\n\n const moveToMonth = useCallback(\n (event: SyntheticEvent, month: DateFrameworkType) => {\n let newMonth = month;\n\n if (isOutsideAllowedMonths(newMonth)) {\n // If month is navigable we should move to the closest navigable month based on the new selection\n const navigableMonths = generateMonthsForYear(\n dateAdapter,\n newMonth,\n ).filter((n) => !isOutsideAllowedMonths(n));\n newMonth = navigableMonths.reduce(\n (closestMonth, currentMonth) =>\n Math.abs(monthDiff(dateAdapter, currentMonth, newMonth)) <\n Math.abs(monthDiff(dateAdapter, closestMonth, newMonth))\n ? currentMonth\n : closestMonth,\n minDate,\n );\n }\n setVisibleMonth(event, newMonth);\n },\n [dateAdapter, isOutsideAllowedMonths, setVisibleMonth, minDate],\n );\n\n const months: DateFrameworkType[] = useMemo(\n () => generateMonthsForYear(dateAdapter, visibleMonth),\n [dateAdapter, visibleMonth],\n );\n\n const years: DateFrameworkType[] = useMemo(\n () =>\n generateYearsBetweenRange(\n dateAdapter,\n Math.min(\n dateAdapter.getYear(minDate),\n dateAdapter.getYear(visibleMonth),\n ),\n Math.max(\n dateAdapter.getYear(maxDate),\n dateAdapter.getYear(visibleMonth),\n ),\n timezone,\n ),\n [dateAdapter, minDate, maxDate, visibleMonth, timezone],\n );\n\n const selectedMonth: DateFrameworkType | undefined = months.find(\n (month: DateFrameworkType) =>\n dateAdapter.isSame(month, visibleMonth, \"month\"),\n );\n const selectedYear: DateFrameworkType | undefined = years.find(\n (year: DateFrameworkType) => dateAdapter.isSame(year, visibleMonth, \"year\"),\n );\n\n return useMemo(\n () => ({\n moveToNextMonth,\n moveToPreviousMonth,\n moveToMonth,\n visibleMonth,\n months,\n years,\n disableNavigateNext,\n disableNavigatePrevious,\n selectedMonth,\n selectedYear,\n isOutsideAllowedMonths,\n numberOfVisibleMonths,\n }),\n [\n months,\n moveToPreviousMonth,\n moveToNextMonth,\n moveToMonth,\n visibleMonth,\n years,\n disableNavigateNext,\n disableNavigatePrevious,\n selectedMonth,\n selectedYear,\n isOutsideAllowedMonths,\n numberOfVisibleMonths,\n ],\n );\n}\n\nfunction OptionWithTooltip({\n value,\n children,\n disabled = false,\n tooltipContent,\n ...rest\n}: OptionWithTooltipProps) {\n const { activeState, openState } = useListControlContext();\n const open = activeState?.value === value;\n return (\n <ConditionalTooltip\n placement=\"right\"\n open={open && openState}\n disabled={!disabled}\n content={tooltipContent}\n enterDelay={0} // --salt-duration-instant\n leaveDelay={0} // --salt-duration-instant\n >\n <Option value={value} disabled={disabled} {...rest}>\n {children}\n </Option>\n </ConditionalTooltip>\n );\n}\n\nexport const CalendarNavigation = forwardRef<\n HTMLDivElement,\n CalendarNavigationProps\n>((props: CalendarNavigationProps, ref: React.Ref<HTMLDivElement>) => {\n const {\n className,\n formatMonth: formatMonthProp,\n formatYear: formatYearProp,\n MonthDropdownProps,\n NextButtonProps,\n PreviousButtonProps,\n YearDropdownProps,\n hideYearDropdown,\n step = 1,\n ...rest\n } = props;\n\n const { dateAdapter } = useLocalization();\n\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-calendar-navigation\",\n css: calendarNavigationCss,\n window: targetWindow,\n });\n\n const { NextIcon, PreviousIcon } = useIcon();\n\n const {\n moveToPreviousMonth,\n moveToNextMonth,\n moveToMonth,\n months,\n years,\n disableNavigateNext,\n disableNavigatePrevious,\n selectedMonth,\n selectedYear,\n isOutsideAllowedMonths,\n visibleMonth,\n numberOfVisibleMonths,\n } = useCalendarNavigation();\n\n const handleNavigatePrevious: MouseEventHandler<HTMLButtonElement> =\n useCallback(\n (event) => {\n moveToPreviousMonth(event, step);\n },\n [moveToPreviousMonth, step],\n );\n\n const handleNavigateNext: MouseEventHandler<HTMLButtonElement> = useCallback(\n (event) => {\n moveToNextMonth(event, step);\n },\n [moveToNextMonth, step],\n );\n\n const handleMonthSelect = useCallback(\n (event: SyntheticEvent, month: DateFrameworkType[]) => {\n moveToMonth(event, month[0]);\n },\n [moveToMonth],\n );\n\n const handleYearSelect = useCallback(\n (event: SyntheticEvent, year: DateFrameworkType[]) => {\n let newVisibleMonth = dateAdapter.clone(visibleMonth);\n newVisibleMonth = dateAdapter.set(newVisibleMonth, {\n year: dateAdapter.getYear(year[0]),\n });\n moveToMonth(event, newVisibleMonth);\n },\n [dateAdapter, moveToMonth, visibleMonth],\n );\n\n const formatMonth = useCallback(\n (date?: DateFrameworkType, formatString?: string) => {\n const format = formatString || formatMonthProp || \"MMM\";\n if (date) {\n return dateAdapter.format(date, format);\n }\n return \"\";\n },\n [dateAdapter, formatMonthProp],\n );\n\n const formatYear = useCallback(\n (date?: DateFrameworkType) => {\n if (date && formatYearProp) {\n return dateAdapter.format(date, formatYearProp);\n }\n return !date ? \"\" : `${dateAdapter.format(date, \"YYYY\")}`;\n },\n [dateAdapter, formatYearProp],\n );\n\n const isPreviousMonthDisabled =\n PreviousButtonProps?.disabled || disableNavigatePrevious;\n const isNextMonthDisabled = NextButtonProps?.disabled || disableNavigateNext;\n\n // Constrain to a max of 2 calendar widths + gap when showing multiple months\n const navStyle =\n numberOfVisibleMonths >= 2\n ? ({\n \"--calendarNavigation-maxWidth\":\n \"calc(var(--calendarNavigation-calendarWidth) * 2 + var(--salt-spacing-100))\",\n ...rest.style,\n } as React.CSSProperties)\n : rest.style;\n\n return (\n <div\n className={clsx(\n withBaseName(),\n { [withBaseName(\"hideYearDropdown\")]: hideYearDropdown },\n className,\n )}\n ref={ref}\n {...rest}\n style={navStyle}\n >\n <ConditionalTooltip\n placement=\"top\"\n disabled={!isPreviousMonthDisabled}\n content=\"Past dates are out of range\"\n enterDelay={0} // --salt-duration-instant\n leaveDelay={0} // --salt-duration-instant\n >\n <Button\n aria-label={\n isPreviousMonthDisabled\n ? \"Past dates are out of range\"\n : \"Previous Month\"\n }\n appearance=\"transparent\"\n sentiment=\"neutral\"\n onClick={handleNavigatePrevious}\n focusableWhenDisabled={true}\n {...PreviousButtonProps}\n disabled={isPreviousMonthDisabled}\n >\n <PreviousIcon aria-hidden />\n </Button>\n </ConditionalTooltip>\n <div className={clsx({ [withBaseName(\"dropdowns\")]: !hideYearDropdown })}>\n <Dropdown\n aria-label=\"Month Dropdown\"\n selected={selectedMonth ? [selectedMonth] : []}\n value={formatMonth(selectedMonth)}\n onSelectionChange={handleMonthSelect}\n {...MonthDropdownProps}\n >\n {months.map((month) => (\n <OptionWithTooltip\n key={formatMonth(month)}\n value={month}\n aria-label={formatMonth(month, \"MMMM\")}\n disabled={isOutsideAllowedMonths(month)}\n tooltipContent=\"This month is out of range\"\n >\n {formatMonth(month)}\n </OptionWithTooltip>\n ))}\n </Dropdown>\n {!hideYearDropdown ? (\n <Dropdown\n aria-label=\"Year Dropdown\"\n selected={selectedYear ? [selectedYear] : []}\n value={formatYear(selectedYear)}\n onSelectionChange={handleYearSelect}\n {...YearDropdownProps}\n className={clsx(\n withBaseName(\"yearDropdown\"),\n YearDropdownProps?.className,\n )}\n >\n {years.map((year) => (\n <OptionWithTooltip key={formatYear(year)} value={year}>\n {formatYear(year)}\n </OptionWithTooltip>\n ))}\n </Dropdown>\n ) : null}\n </div>\n <ConditionalTooltip\n placement=\"top\"\n disabled={!isNextMonthDisabled}\n content=\"Future dates are out of range\"\n enterDelay={0} // --salt-duration-instant\n leaveDelay={0} // --salt-duration-instant\n >\n <Button\n aria-label={\n isNextMonthDisabled ? \"Future dates are out of range\" : \"Next Month\"\n }\n appearance=\"transparent\"\n sentiment=\"neutral\"\n onClick={handleNavigateNext}\n focusableWhenDisabled={true}\n {...NextButtonProps}\n disabled={isNextMonthDisabled}\n >\n <NextIcon aria-hidden />\n </Button>\n </ConditionalTooltip>\n </div>\n );\n});\n"],"names":["calendarNavigationCss"],"mappings":"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"}
1
+ {"version":3,"file":"CalendarNavigation.js","sources":["../src/calendar/CalendarNavigation.tsx"],"sourcesContent":["import {\n Button,\n type ButtonProps,\n Dropdown,\n type DropdownProps,\n makePrefixer,\n Option,\n type OptionProps,\n Tooltip,\n type TooltipProps,\n useIcon,\n useListControlContext,\n} from \"@salt-ds/core\";\nimport type {\n DateFrameworkType,\n SaltDateAdapter,\n Timezone,\n} 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 MouseEventHandler,\n type SyntheticEvent,\n useCallback,\n useMemo,\n} from \"react\";\nimport { useLocalization } from \"../localization-provider\";\nimport calendarNavigationCss from \"./CalendarNavigation.css\";\nimport { useCalendarContext } from \"./internal/CalendarContext\";\nimport { generateMonthsForYear, monthDiff } from \"./internal/utils\";\n\n/**\n * Props for the CalendarNavigation component.\n */\nexport interface CalendarNavigationProps extends ComponentPropsWithRef<\"div\"> {\n /**\n * Props for the month dropdown component.\n */\n MonthDropdownProps?: DropdownProps<DateFrameworkType>;\n /**\n * Props for the year dropdown component.\n */\n YearDropdownProps?: DropdownProps<DateFrameworkType>;\n /**\n * Additional props for Previous button.\n */\n PreviousButtonProps?: ButtonProps;\n /**\n * Additional props for Next button.\n */\n NextButtonProps?: ButtonProps;\n /**\n * If `true`, hides the year dropdown.\n */\n hideYearDropdown?: boolean;\n /**\n * The step value for navigation. Defaults to 1.\n */\n step?: number;\n /**\n * Format the month dropdown values\n * @param date\n */\n formatMonth?: string;\n /**\n * Format the year dropdown values\n * @param date\n */\n formatYear?: string;\n}\n\ninterface OptionWithTooltipProps extends OptionProps {\n value: DateFrameworkType;\n tooltipContent?: string;\n}\n\nconst withBaseName = makePrefixer(\"saltCalendarNavigation\");\n\nconst ConditionalTooltip: React.FC<TooltipProps> = ({\n children,\n disabled = true,\n ...rest\n}) => {\n if (disabled) {\n return <>{children}</>;\n }\n return <Tooltip {...rest}>{children}</Tooltip>;\n};\n\nfunction generateYearsBetweenRange(\n dateAdapter: SaltDateAdapter,\n minYear: number,\n maxYear: number,\n timezone: Timezone = \"default\",\n): DateFrameworkType[] {\n const years: DateFrameworkType[] = [];\n let startOfYear = dateAdapter.today(timezone);\n for (let year = minYear; year <= maxYear; year++) {\n startOfYear = dateAdapter.set(startOfYear, { day: 1, month: 1, year });\n years.push(startOfYear);\n }\n return years;\n}\n\nfunction useCalendarNavigation() {\n const {\n state: {\n visibleMonth,\n timezone,\n minDate,\n maxDate,\n numberOfVisibleMonths = 1,\n },\n helpers: { setVisibleMonth, isDayVisible, isOutsideAllowedMonths },\n } = useCalendarContext();\n\n const { dateAdapter } = useLocalization();\n\n const disableNavigatePrevious = isDayVisible(minDate);\n const disableNavigateNext = isDayVisible(maxDate);\n\n const moveToNextMonth = useCallback(\n (event: SyntheticEvent, step = 1) => {\n setVisibleMonth(event, dateAdapter.add(visibleMonth, { months: step }));\n },\n [dateAdapter, setVisibleMonth, visibleMonth],\n );\n\n const moveToPreviousMonth = useCallback(\n (event: SyntheticEvent, step = 1) => {\n setVisibleMonth(\n event,\n dateAdapter.subtract(visibleMonth, { months: step }),\n );\n },\n [dateAdapter, setVisibleMonth, visibleMonth],\n );\n\n const moveToMonth = useCallback(\n (event: SyntheticEvent, month: DateFrameworkType) => {\n let newMonth = month;\n\n if (isOutsideAllowedMonths(newMonth)) {\n // If month is navigable we should move to the closest navigable month based on the new selection\n const navigableMonths = generateMonthsForYear(\n dateAdapter,\n newMonth,\n ).filter((n) => !isOutsideAllowedMonths(n));\n newMonth = navigableMonths.reduce(\n (closestMonth, currentMonth) =>\n Math.abs(monthDiff(dateAdapter, currentMonth, newMonth)) <\n Math.abs(monthDiff(dateAdapter, closestMonth, newMonth))\n ? currentMonth\n : closestMonth,\n minDate,\n );\n }\n setVisibleMonth(event, newMonth);\n },\n [dateAdapter, isOutsideAllowedMonths, setVisibleMonth, minDate],\n );\n\n const months: DateFrameworkType[] = useMemo(\n () => generateMonthsForYear(dateAdapter, visibleMonth),\n [dateAdapter, visibleMonth],\n );\n\n const years: DateFrameworkType[] = useMemo(\n () =>\n generateYearsBetweenRange(\n dateAdapter,\n Math.min(\n dateAdapter.getYear(minDate),\n dateAdapter.getYear(visibleMonth),\n ),\n Math.max(\n dateAdapter.getYear(maxDate),\n dateAdapter.getYear(visibleMonth),\n ),\n timezone,\n ),\n [dateAdapter, minDate, maxDate, visibleMonth, timezone],\n );\n\n const selectedMonth: DateFrameworkType | undefined = months.find(\n (month: DateFrameworkType) =>\n dateAdapter.isSame(month, visibleMonth, \"month\"),\n );\n const selectedYear: DateFrameworkType | undefined = years.find(\n (year: DateFrameworkType) => dateAdapter.isSame(year, visibleMonth, \"year\"),\n );\n\n return useMemo(\n () => ({\n moveToNextMonth,\n moveToPreviousMonth,\n moveToMonth,\n visibleMonth,\n months,\n years,\n disableNavigateNext,\n disableNavigatePrevious,\n selectedMonth,\n selectedYear,\n isOutsideAllowedMonths,\n numberOfVisibleMonths,\n }),\n [\n months,\n moveToPreviousMonth,\n moveToNextMonth,\n moveToMonth,\n visibleMonth,\n years,\n disableNavigateNext,\n disableNavigatePrevious,\n selectedMonth,\n selectedYear,\n isOutsideAllowedMonths,\n numberOfVisibleMonths,\n ],\n );\n}\n\nfunction OptionWithTooltip({\n value,\n children,\n disabled = false,\n tooltipContent,\n ...rest\n}: OptionWithTooltipProps) {\n const { activeState, openState } = useListControlContext();\n const open = activeState?.value === value;\n return (\n <ConditionalTooltip\n placement=\"right\"\n open={open && openState}\n disabled={!disabled}\n content={tooltipContent}\n enterDelay={0} // --salt-duration-instant\n leaveDelay={0} // --salt-duration-instant\n >\n <Option value={value} disabled={disabled} {...rest}>\n {children}\n </Option>\n </ConditionalTooltip>\n );\n}\n\nexport const CalendarNavigation = forwardRef<\n HTMLDivElement,\n CalendarNavigationProps\n>(function CalendarNavigation(props, ref) {\n const {\n className,\n formatMonth: formatMonthProp,\n formatYear: formatYearProp,\n MonthDropdownProps,\n NextButtonProps,\n PreviousButtonProps,\n YearDropdownProps,\n hideYearDropdown,\n step = 1,\n ...rest\n } = props;\n\n const { dateAdapter } = useLocalization();\n\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-calendar-navigation\",\n css: calendarNavigationCss,\n window: targetWindow,\n });\n\n const { NextIcon, PreviousIcon } = useIcon();\n\n const {\n moveToPreviousMonth,\n moveToNextMonth,\n moveToMonth,\n months,\n years,\n disableNavigateNext,\n disableNavigatePrevious,\n selectedMonth,\n selectedYear,\n isOutsideAllowedMonths,\n visibleMonth,\n numberOfVisibleMonths,\n } = useCalendarNavigation();\n\n const handleNavigatePrevious: MouseEventHandler<HTMLButtonElement> =\n useCallback(\n (event) => {\n moveToPreviousMonth(event, step);\n },\n [moveToPreviousMonth, step],\n );\n\n const handleNavigateNext: MouseEventHandler<HTMLButtonElement> = useCallback(\n (event) => {\n moveToNextMonth(event, step);\n },\n [moveToNextMonth, step],\n );\n\n const handleMonthSelect = useCallback(\n (event: SyntheticEvent, month: DateFrameworkType[]) => {\n moveToMonth(event, month[0]);\n },\n [moveToMonth],\n );\n\n const handleYearSelect = useCallback(\n (event: SyntheticEvent, year: DateFrameworkType[]) => {\n let newVisibleMonth = dateAdapter.clone(visibleMonth);\n newVisibleMonth = dateAdapter.set(newVisibleMonth, {\n year: dateAdapter.getYear(year[0]),\n });\n moveToMonth(event, newVisibleMonth);\n },\n [dateAdapter, moveToMonth, visibleMonth],\n );\n\n const formatMonth = useCallback(\n (date?: DateFrameworkType, formatString?: string) => {\n const format = formatString || formatMonthProp || \"MMM\";\n if (date) {\n return dateAdapter.format(date, format);\n }\n return \"\";\n },\n [dateAdapter, formatMonthProp],\n );\n\n const formatYear = useCallback(\n (date?: DateFrameworkType) => {\n if (date && formatYearProp) {\n return dateAdapter.format(date, formatYearProp);\n }\n return !date ? \"\" : `${dateAdapter.format(date, \"YYYY\")}`;\n },\n [dateAdapter, formatYearProp],\n );\n\n const isPreviousMonthDisabled =\n PreviousButtonProps?.disabled || disableNavigatePrevious;\n const isNextMonthDisabled = NextButtonProps?.disabled || disableNavigateNext;\n\n // Constrain to a max of 2 calendar widths + gap when showing multiple months\n const navStyle =\n numberOfVisibleMonths >= 2\n ? ({\n \"--calendarNavigation-maxWidth\":\n \"calc(var(--calendarNavigation-calendarWidth) * 2 + var(--salt-spacing-100))\",\n ...rest.style,\n } as React.CSSProperties)\n : rest.style;\n\n return (\n <div\n className={clsx(\n withBaseName(),\n { [withBaseName(\"hideYearDropdown\")]: hideYearDropdown },\n className,\n )}\n ref={ref}\n {...rest}\n style={navStyle}\n >\n <ConditionalTooltip\n placement=\"top\"\n disabled={!isPreviousMonthDisabled}\n content=\"Past dates are out of range\"\n enterDelay={0} // --salt-duration-instant\n leaveDelay={0} // --salt-duration-instant\n >\n <Button\n aria-label={\n isPreviousMonthDisabled\n ? \"Past dates are out of range\"\n : \"Previous Month\"\n }\n appearance=\"transparent\"\n sentiment=\"neutral\"\n onClick={handleNavigatePrevious}\n focusableWhenDisabled={true}\n {...PreviousButtonProps}\n disabled={isPreviousMonthDisabled}\n >\n <PreviousIcon aria-hidden />\n </Button>\n </ConditionalTooltip>\n <div className={clsx({ [withBaseName(\"dropdowns\")]: !hideYearDropdown })}>\n <Dropdown\n aria-label=\"Month Dropdown\"\n selected={selectedMonth ? [selectedMonth] : []}\n value={formatMonth(selectedMonth)}\n onSelectionChange={handleMonthSelect}\n {...MonthDropdownProps}\n >\n {months.map((month) => (\n <OptionWithTooltip\n key={formatMonth(month)}\n value={month}\n aria-label={formatMonth(month, \"MMMM\")}\n disabled={isOutsideAllowedMonths(month)}\n tooltipContent=\"This month is out of range\"\n >\n {formatMonth(month)}\n </OptionWithTooltip>\n ))}\n </Dropdown>\n {!hideYearDropdown ? (\n <Dropdown\n aria-label=\"Year Dropdown\"\n selected={selectedYear ? [selectedYear] : []}\n value={formatYear(selectedYear)}\n onSelectionChange={handleYearSelect}\n {...YearDropdownProps}\n className={clsx(\n withBaseName(\"yearDropdown\"),\n YearDropdownProps?.className,\n )}\n >\n {years.map((year) => (\n <OptionWithTooltip key={formatYear(year)} value={year}>\n {formatYear(year)}\n </OptionWithTooltip>\n ))}\n </Dropdown>\n ) : null}\n </div>\n <ConditionalTooltip\n placement=\"top\"\n disabled={!isNextMonthDisabled}\n content=\"Future dates are out of range\"\n enterDelay={0} // --salt-duration-instant\n leaveDelay={0} // --salt-duration-instant\n >\n <Button\n aria-label={\n isNextMonthDisabled ? \"Future dates are out of range\" : \"Next Month\"\n }\n appearance=\"transparent\"\n sentiment=\"neutral\"\n onClick={handleNavigateNext}\n focusableWhenDisabled={true}\n {...NextButtonProps}\n disabled={isNextMonthDisabled}\n >\n <NextIcon aria-hidden />\n </Button>\n </ConditionalTooltip>\n </div>\n );\n});\n"],"names":["CalendarNavigation","calendarNavigationCss"],"mappings":"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"}
@@ -11,10 +11,10 @@ function createSingleSelectionAnnouncement(announcementType, state, dateAdapter)
11
11
  }
12
12
  if (multiselect && Array.isArray(selectedDate)) {
13
13
  const lastSelectedDate = selectedDate[selectedDate.length - 1];
14
- return `${dateAdapter.format(lastSelectedDate, "dddd D MMMM YYYY")}, selected, ${selectedDate.length} dates in selection`;
14
+ return `${dateAdapter.format(lastSelectedDate, "dddd DD MMMM YYYY")}, selected, ${selectedDate.length} dates in selection`;
15
15
  }
16
16
  if (!multiselect && selectedDate) {
17
- return `${dateAdapter.format(selectedDate, "dddd D MMMM YYYY")}, selected`;
17
+ return `${dateAdapter.format(selectedDate, "dddd DD MMMM YYYY")}, selected`;
18
18
  }
19
19
  break;
20
20
  }
@@ -62,7 +62,7 @@ function createRangeSelectionAnnouncement(announcementType, state, dateAdapter)
62
62
  }
63
63
  if (startDate && endDate) {
64
64
  const multiselectSuffix = multiselect && Array.isArray(selectedDate) ? `, ${selectedDate.length > 1 ? `${selectedDate.length} date ranges in selection` : ""}` : "";
65
- return `Date range ${dateAdapter.format(startDate, "dddd D MMMM YYYY")} to ${dateAdapter.format(endDate, "dddd D MMMM YYYY")}, selected${multiselectSuffix}`;
65
+ return `Date range ${dateAdapter.format(startDate, "dddd DD MMMM YYYY")} to ${dateAdapter.format(endDate, "dddd DD MMMM YYYY")}, selected${multiselectSuffix}`;
66
66
  }
67
67
  break;
68
68
  }
@@ -1 +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 `${dateAdapter.format(startVisibleMonth, \"MMMM YYYY\")}.`;\n }\n return `${dateAdapter.format(startVisibleMonth, \"MMMM YYYY\")} and ${dateAdapter.format(endVisibleMonth, \"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 \"Select end date.\";\n }\n if (!startDate && endDate) {\n return \"Select start 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 `${dateAdapter.format(startVisibleMonth, \"MMMM YYYY\")}.`;\n }\n return `${dateAdapter.format(startVisibleMonth, \"MMMM YYYY\")} and ${dateAdapter.format(endVisibleMonth, \"MMMM YYYY\")}.`;\n }\n }\n}\n\n/**\n * Creates navigation announcements for single selection (visibleMonthChanged, min/maxFocusableDateExceeded).\n * Used in DatePicker grid panels where dateSelected is handled by the parent DatePicker.\n */\nexport function createSingleNavigationAnnouncement(\n announcementType: AnnouncementType,\n state: DateSelectionAnnouncerState,\n dateAdapter: SaltDateAdapter,\n): string | undefined {\n if (announcementType === \"dateSelected\") {\n return undefined;\n }\n return createSingleSelectionAnnouncement(\n announcementType,\n state,\n dateAdapter,\n );\n}\n\n/**\n * Creates navigation announcements for range selection (visibleMonthChanged, min/maxFocusableDateExceeded).\n * Used in DatePicker grid panels where dateSelected is handled by the parent DatePicker.\n */\nexport function createRangeNavigationAnnouncement(\n announcementType: AnnouncementType,\n state: DateSelectionAnnouncerState,\n dateAdapter: SaltDateAdapter,\n): string | undefined {\n if (announcementType === \"dateSelected\") {\n return undefined;\n }\n return createRangeSelectionAnnouncement(announcementType, state, dateAdapter);\n}\n"],"names":[],"mappings":"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"}
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 DD MMMM YYYY\")}, selected, ${selectedDate.length} dates in selection`;\n }\n if (!multiselect && selectedDate) {\n return `${dateAdapter.format(selectedDate as DateFrameworkType, \"dddd DD 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 `${dateAdapter.format(startVisibleMonth, \"MMMM YYYY\")}.`;\n }\n return `${dateAdapter.format(startVisibleMonth, \"MMMM YYYY\")} and ${dateAdapter.format(endVisibleMonth, \"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 \"Select end date.\";\n }\n if (!startDate && endDate) {\n return \"Select start 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 DD MMMM YYYY\")} to ${dateAdapter.format(endDate, \"dddd DD 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 `${dateAdapter.format(startVisibleMonth, \"MMMM YYYY\")}.`;\n }\n return `${dateAdapter.format(startVisibleMonth, \"MMMM YYYY\")} and ${dateAdapter.format(endVisibleMonth, \"MMMM YYYY\")}.`;\n }\n }\n}\n\n/**\n * Creates navigation announcements for single selection (visibleMonthChanged, min/maxFocusableDateExceeded).\n * Used in DatePicker grid panels where dateSelected is handled by the parent DatePicker.\n */\nexport function createSingleNavigationAnnouncement(\n announcementType: AnnouncementType,\n state: DateSelectionAnnouncerState,\n dateAdapter: SaltDateAdapter,\n): string | undefined {\n if (announcementType === \"dateSelected\") {\n return undefined;\n }\n return createSingleSelectionAnnouncement(\n announcementType,\n state,\n dateAdapter,\n );\n}\n\n/**\n * Creates navigation announcements for range selection (visibleMonthChanged, min/maxFocusableDateExceeded).\n * Used in DatePicker grid panels where dateSelected is handled by the parent DatePicker.\n */\nexport function createRangeNavigationAnnouncement(\n announcementType: AnnouncementType,\n state: DateSelectionAnnouncerState,\n dateAdapter: SaltDateAdapter,\n): string | undefined {\n if (announcementType === \"dateSelected\") {\n return undefined;\n }\n return createRangeSelectionAnnouncement(announcementType, state, dateAdapter);\n}\n"],"names":[],"mappings":"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"}
@@ -290,7 +290,7 @@ function useCalendarSelectionDay({ date }) {
290
290
  const hoveredStart = isHoveredStart(date);
291
291
  const hoveredSpan = isHoveredSpan(date);
292
292
  const hoveredEnd = isHoveredEnd(date);
293
- const formattedDate = dateAdapter.format(date, "dddd D MMMM YYYY");
293
+ const formattedDate = dateAdapter.format(date, "dddd DD MMMM YYYY");
294
294
  let ariaLabel = formattedDate;
295
295
  if (selectionVariant === "single") {
296
296
  if (selected) {
@@ -1 +1 @@
1
- {"version":3,"file":"useCalendarSelection.js","sources":["../src/calendar/useCalendarSelection.ts"],"sourcesContent":["import { makePrefixer, useControlled } from \"@salt-ds/core\";\nimport type {\n DateFrameworkType,\n SaltDateAdapter,\n} from \"@salt-ds/date-adapters\";\nimport { clsx } from \"clsx\";\nimport {\n type KeyboardEventHandler,\n type MouseEventHandler,\n type SyntheticEvent,\n useCallback,\n useMemo,\n} from \"react\";\nimport { useLocalization } from \"../localization-provider\";\nimport { useCalendarContext } from \"./internal/CalendarContext\";\n\n/**\n * Type representing a single date selection.\n */\nexport type SingleDateSelection<\n TDate extends DateFrameworkType = DateFrameworkType,\n> = TDate;\n\n/**\n * Type representing a date range selection.\n * @template TDate - The type of the date object.\n */\nexport type DateRangeSelection<\n TDate extends DateFrameworkType = DateFrameworkType,\n> = {\n /**\n * The start date of the range, or null if empty\n */\n startDate?: TDate | null;\n /**\n * The end date of the range, or null if empty\n */\n endDate?: TDate | null;\n};\n\n/**\n * Checks if a value is a date range selection.\n * @template TDate - The type of the date object.\n * @param value - The value to check.\n * @returns `true` if the value is a date range selection, otherwise `false`.\n */\nexport function isDateRangeSelection<\n TDate extends DateFrameworkType = DateFrameworkType,\n>(value: unknown): value is DateRangeSelection<TDate> {\n return (\n !!value &&\n !Array.isArray(value) &&\n typeof value === \"object\" &&\n (\"startDate\" in value || \"endDate\" in value)\n );\n}\n\nexport type SelectionVariant = \"single\" | \"range\" | \"offset\";\n\n/**\n * Base properties for calendar UseCalendarSelection hook.\n */\nexport interface UseCalendarSelectionBaseProps<Selection> {\n /**\n * Determines if a date is outside the allowed date range.\n * @param date - The date to check.\n * @returns 0 if inside the date range, -1 if before the min date, 1 if after the max date.\n */\n isOutsideAllowedDates?: (date: DateFrameworkType) => -1 | 0 | 1;\n /**\n * Function to determine if a day is selectable.\n * @param date - The date to check.\n * @returns `true` if the day is selectable, otherwise `false`.\n */\n isDaySelectable?: (date: DateFrameworkType) => boolean;\n /**\n * If `true`, the calendar will be multiselect.\n */\n multiselect?: boolean;\n /**\n * The selection variant, set to \"single\".\n */\n selectionVariant: SelectionVariant;\n /**\n * The currently selected date.\n */\n selectedDate?: Selection;\n /**\n * The default selected date.\n */\n defaultSelectedDate?: Selection;\n /**\n * Callback fired when the selected date changes.\n * @param event - The synthetic event.\n * @param selectedDate - The new selected date.\n */\n onSelectionChange?: (event: SyntheticEvent, selectedDate: Selection) => void;\n /**\n * A pure function to manage the selected date for uncontrolled use-cases.\n * Return the selection based on the previous selection and the new date.\n * @param previousSelectedDate\n * @param newDate\n */\n select?: (\n previousSelectedDate: Selection,\n newDate: DateFrameworkType,\n ) => Selection;\n /**\n * Function to calculate the start date offset.\n * @param date - The date to offset.\n * @returns The offset start date.\n */\n startDateOffset?: (date: DateFrameworkType) => DateFrameworkType;\n /**\n * Function to calculate the end date offset.\n * @param date - The date to offset.\n * @returns The offset end date.\n */\n endDateOffset?: (date: DateFrameworkType) => DateFrameworkType;\n}\n\nexport type UseCalendarSelectionSingleProps =\n UseCalendarSelectionBaseProps<SingleDateSelection<DateFrameworkType> | null> & {\n selectionVariant: \"single\";\n multiselect?: false;\n };\n\nexport type UseCalendarSelectionMultiselectSingleProps =\n UseCalendarSelectionBaseProps<\n Array<SingleDateSelection<DateFrameworkType>>\n > & {\n selectionVariant: \"single\";\n multiselect: true;\n };\n\nexport type UseCalendarSelectionRangeProps = UseCalendarSelectionBaseProps<\n DateRangeSelection<DateFrameworkType>\n> & {\n selectionVariant: \"range\";\n multiselect?: false;\n};\n\nexport type UseCalendarSelectionMultiselectRangeProps =\n UseCalendarSelectionBaseProps<\n Array<DateRangeSelection<DateFrameworkType>>\n > & {\n selectionVariant: \"range\";\n multiselect: true;\n };\n\nexport type UseCalendarSelectionOffsetProps = UseCalendarSelectionBaseProps<\n DateRangeSelection<DateFrameworkType>\n> & {\n selectionVariant: \"offset\";\n multiselect?: false;\n};\n\nexport type UseCalendarSelectionMultiselectOffsetProps =\n UseCalendarSelectionBaseProps<\n Array<DateRangeSelection<DateFrameworkType>>\n > & {\n selectionVariant: \"offset\";\n multiselect: true;\n };\n\nexport type UseCalendarSelectionProps =\n | UseCalendarSelectionSingleProps\n | UseCalendarSelectionMultiselectSingleProps\n | UseCalendarSelectionRangeProps\n | UseCalendarSelectionMultiselectRangeProps\n | UseCalendarSelectionOffsetProps\n | UseCalendarSelectionMultiselectOffsetProps;\n\nfunction selectDateRange(\n dateAdapter: SaltDateAdapter,\n previousSelectedDate: DateRangeSelection<DateFrameworkType>,\n newDate: DateFrameworkType,\n) {\n if (previousSelectedDate?.startDate && previousSelectedDate?.endDate) {\n return {\n startDate: newDate,\n };\n }\n if (\n previousSelectedDate?.startDate &&\n dateAdapter.compare(newDate, previousSelectedDate?.startDate) >= 0\n ) {\n return {\n ...previousSelectedDate,\n endDate: newDate,\n };\n }\n return {\n startDate: newDate,\n };\n}\n\nfunction selectMultiselectDateRange(\n dateAdapter: SaltDateAdapter,\n previousSelectedDate: DateRangeSelection<DateFrameworkType>[],\n newDate: DateFrameworkType,\n): DateRangeSelection<DateFrameworkType>[] {\n const lastRange = previousSelectedDate.length\n ? previousSelectedDate[previousSelectedDate.length - 1]\n : undefined;\n const isIncompleteRange = !lastRange?.endDate;\n\n if (isIncompleteRange) {\n const isNewSelection = previousSelectedDate.length === 0;\n if (isNewSelection) {\n return [{ startDate: newDate }];\n }\n const completeDateRange = selectDateRange(\n dateAdapter,\n previousSelectedDate[previousSelectedDate.length - 1],\n newDate,\n );\n return [...previousSelectedDate.slice(0, -1), completeDateRange];\n }\n return [...previousSelectedDate, { startDate: newDate }];\n}\n\nexport function useCalendarSelection(props: UseCalendarSelectionProps) {\n const {\n selectedDate: selectedDateProp,\n defaultSelectedDate,\n onSelectionChange,\n isDaySelectable = () => true,\n isOutsideAllowedDates = () => 0,\n select: selectProp,\n selectionVariant,\n startDateOffset,\n endDateOffset,\n multiselect,\n } = props as UseCalendarSelectionProps & {\n startDateOffset?: (date: DateFrameworkType) => DateFrameworkType;\n endDateOffset?: (date: DateFrameworkType) => DateFrameworkType;\n multiselect?: boolean;\n };\n const { dateAdapter } = useLocalization<DateFrameworkType>();\n const [selectedDate, setSelectedDateState] = useControlled({\n controlled: selectedDateProp,\n default: defaultSelectedDate,\n name: \"Calendar\",\n state: \"selectedDate\",\n });\n\n const setSelectedDate = useCallback(\n (\n event: SyntheticEvent<HTMLButtonElement>,\n newSelectedDate: DateFrameworkType,\n ) => {\n if (!isDaySelectable || isDaySelectable(newSelectedDate)) {\n const handleSelectionChange = <\n U extends\n | (DateFrameworkType | null)\n | DateFrameworkType[]\n | (DateRangeSelection<DateFrameworkType> | null)\n | DateRangeSelection<DateFrameworkType>[],\n >(\n updatedSelection: U,\n changeHandler:\n | ((event: SyntheticEvent, updatedSelection: U) => void)\n | undefined,\n ) => {\n changeHandler?.(event, updatedSelection);\n setSelectedDateState(updatedSelection);\n };\n\n switch (selectionVariant) {\n case \"single\": {\n if (multiselect) {\n const multipleSingleSelectedDate = selectedDate as Array<\n SingleDateSelection<DateFrameworkType>\n >;\n const select =\n selectProp as UseCalendarSelectionMultiselectSingleProps[\"select\"];\n const updatedSelection: Array<\n SingleDateSelection<DateFrameworkType>\n > = select\n ? select(multipleSingleSelectedDate ?? [], newSelectedDate)\n : [...(multipleSingleSelectedDate ?? []), newSelectedDate];\n\n const changeHandler =\n onSelectionChange as UseCalendarSelectionMultiselectSingleProps[\"onSelectionChange\"];\n handleSelectionChange(updatedSelection, changeHandler);\n } else {\n const singleSelectedDate =\n selectedDate as SingleDateSelection<DateFrameworkType> | null;\n const select =\n selectProp as UseCalendarSelectionSingleProps[\"select\"];\n const updatedSelection: SingleDateSelection<DateFrameworkType> | null =\n select\n ? select(singleSelectedDate, newSelectedDate)\n : newSelectedDate;\n\n const changeHandler =\n onSelectionChange as UseCalendarSelectionSingleProps[\"onSelectionChange\"];\n handleSelectionChange(updatedSelection, changeHandler);\n }\n break;\n }\n case \"range\": {\n if (multiselect) {\n const multipleRangeSelectedDate = selectedDate as Array<\n DateRangeSelection<DateFrameworkType>\n >;\n const select =\n selectProp as UseCalendarSelectionMultiselectRangeProps[\"select\"];\n const updatedSelection: DateRangeSelection<DateFrameworkType>[] =\n select\n ? select(multipleRangeSelectedDate ?? [], newSelectedDate)\n : selectMultiselectDateRange(\n dateAdapter,\n multipleRangeSelectedDate ?? [],\n newSelectedDate,\n );\n\n const changeHandler =\n onSelectionChange as UseCalendarSelectionMultiselectRangeProps[\"onSelectionChange\"];\n handleSelectionChange(updatedSelection, changeHandler);\n } else {\n const rangeSelectedDate =\n selectedDate as DateRangeSelection<DateFrameworkType>;\n const select =\n selectProp as UseCalendarSelectionRangeProps[\"select\"];\n const updatedSelection: DateRangeSelection<DateFrameworkType> =\n select\n ? select(rangeSelectedDate, newSelectedDate)\n : selectDateRange(\n dateAdapter,\n rangeSelectedDate,\n newSelectedDate,\n );\n\n const changeHandler =\n onSelectionChange as UseCalendarSelectionRangeProps[\"onSelectionChange\"];\n handleSelectionChange(updatedSelection, changeHandler);\n }\n break;\n }\n case \"offset\": {\n if (multiselect) {\n const multipleOffsetSelectedDate = selectedDate as Array<\n DateRangeSelection<DateFrameworkType>\n >;\n const select =\n selectProp as UseCalendarSelectionMultiselectOffsetProps[\"select\"];\n const updatedSelection: DateRangeSelection<DateFrameworkType>[] =\n select\n ? select(multipleOffsetSelectedDate ?? [], newSelectedDate)\n : [\n ...(multipleOffsetSelectedDate ?? []),\n {\n startDate: newSelectedDate,\n endDate: endDateOffset\n ? endDateOffset(newSelectedDate)\n : newSelectedDate,\n },\n ];\n\n const changeHandler =\n onSelectionChange as UseCalendarSelectionMultiselectOffsetProps[\"onSelectionChange\"];\n handleSelectionChange(updatedSelection, changeHandler);\n } else {\n const offsetSelectedDate =\n selectedDate as DateRangeSelection<DateFrameworkType>;\n const select =\n selectProp as UseCalendarSelectionOffsetProps[\"select\"];\n const updatedSelection: DateRangeSelection<DateFrameworkType> =\n select\n ? select(offsetSelectedDate, newSelectedDate)\n : {\n startDate: startDateOffset\n ? startDateOffset(newSelectedDate)\n : newSelectedDate,\n endDate: endDateOffset\n ? endDateOffset(newSelectedDate)\n : newSelectedDate,\n };\n const changeHandler =\n onSelectionChange as UseCalendarSelectionOffsetProps[\"onSelectionChange\"];\n handleSelectionChange(updatedSelection, changeHandler);\n }\n break;\n }\n }\n }\n },\n [\n dateAdapter,\n isDaySelectable,\n selectProp,\n selectedDate,\n selectionVariant,\n onSelectionChange,\n multiselect,\n startDateOffset,\n endDateOffset,\n ],\n );\n\n const isSelected = useCallback(\n (date: DateFrameworkType) => {\n if (!selectedDate) {\n return false;\n }\n if (selectionVariant === \"single\") {\n const singleDates = (\n Array.isArray(selectedDate) ? selectedDate : [selectedDate]\n ) as DateFrameworkType[];\n return singleDates.some((singleDate) =>\n dateAdapter.isSame(singleDate, date, \"day\"),\n );\n }\n return false;\n },\n [dateAdapter, selectedDate, selectionVariant],\n );\n\n const isSameDay = useCallback(\n (date: DateFrameworkType) => {\n const dateRanges = Array.isArray(selectedDate)\n ? selectedDate\n : [selectedDate];\n return dateRanges.some((range) => {\n if (\n (selectionVariant === \"range\" || selectionVariant === \"offset\") &&\n isDateRangeSelection(range) &&\n range?.startDate &&\n range?.endDate &&\n dateAdapter.isSame(range?.startDate, date, \"day\")\n ) {\n return dateAdapter.isSame(range?.startDate, range?.endDate, \"day\");\n }\n return false;\n });\n },\n [dateAdapter, selectionVariant, selectedDate],\n );\n\n const isSelectedStart = useCallback(\n (date: DateFrameworkType) => {\n if (selectionVariant === \"single\") {\n return false;\n }\n const dateRanges = Array.isArray(selectedDate)\n ? selectedDate\n : [selectedDate];\n return dateRanges.some((range) => {\n if (\n (selectionVariant === \"range\" || selectionVariant === \"offset\") &&\n isDateRangeSelection(range) &&\n dateAdapter.isValid(range.startDate) &&\n isOutsideAllowedDates(range.startDate) === 0\n ) {\n return dateAdapter.isSame(range.startDate, date, \"day\");\n }\n return false;\n });\n },\n [dateAdapter, isOutsideAllowedDates, selectionVariant, selectedDate],\n );\n\n const isSelectedSpan = useCallback(\n (date: DateFrameworkType) => {\n if (selectionVariant === \"single\") {\n return false;\n }\n const dateRanges = Array.isArray(selectedDate)\n ? selectedDate\n : [selectedDate];\n return dateRanges.some((range) => {\n if (\n (selectionVariant === \"range\" || selectionVariant === \"offset\") &&\n isDateRangeSelection(range) &&\n dateAdapter.isValid(range.startDate) &&\n dateAdapter.isValid(range.endDate) &&\n isOutsideAllowedDates(range.startDate) === 0 &&\n isOutsideAllowedDates(range.endDate) === 0\n ) {\n return (\n dateAdapter.compare(date, range.startDate) > 0 &&\n dateAdapter.compare(date, range.endDate) < 0\n );\n }\n return false;\n });\n },\n [dateAdapter, isOutsideAllowedDates, selectionVariant, selectedDate],\n );\n\n const isSelectedEnd = useCallback(\n (date: DateFrameworkType) => {\n if (selectionVariant === \"single\") {\n return false;\n }\n const dateRanges = Array.isArray(selectedDate)\n ? selectedDate\n : [selectedDate];\n return dateRanges.some((range) => {\n if (\n (selectionVariant === \"range\" || selectionVariant === \"offset\") &&\n isDateRangeSelection(range) &&\n dateAdapter.isValid(range.endDate) &&\n isOutsideAllowedDates(range.endDate) === 0\n ) {\n return dateAdapter.isSame(range.endDate, date, \"day\");\n }\n return false;\n });\n },\n [dateAdapter, isOutsideAllowedDates, selectionVariant, selectedDate],\n );\n\n return useMemo(\n () => ({\n state: {\n selectedDate,\n },\n helpers: {\n isSelected,\n isSameDay,\n setSelectedDate,\n isSelectedStart,\n isSelectedSpan,\n isSelectedEnd,\n },\n }),\n [\n selectedDate,\n isSelected,\n isSameDay,\n isSelectedStart,\n isSelectedSpan,\n isSelectedEnd,\n setSelectedDate,\n ],\n );\n}\n\nconst withBaseName = makePrefixer(\"saltCalendarDay\");\n\nexport function useCalendarSelectionDay({ date }: { date: DateFrameworkType }) {\n const { dateAdapter } = useLocalization<DateFrameworkType>();\n const {\n state: { selectionVariant, minDate, maxDate },\n helpers: {\n setSelectedDate,\n isSameDay,\n isSelected,\n isSelectedStart,\n isSelectedSpan,\n isSelectedEnd,\n isHovered,\n isHoveredStart,\n isHoveredSpan,\n isHoveredEnd,\n isDaySelectable,\n },\n } = useCalendarContext();\n\n const handleClick: MouseEventHandler<HTMLButtonElement> = useCallback(\n (event) => {\n setSelectedDate(event, date);\n },\n [date, setSelectedDate],\n );\n\n const handleKeyDown: KeyboardEventHandler<HTMLButtonElement> = useCallback(\n (event) => {\n switch (event.key) {\n case \"Space\":\n case \"Enter\":\n setSelectedDate(event, date);\n event.preventDefault();\n }\n },\n [date, setSelectedDate],\n );\n\n const selected = isSelected(date);\n const selectedStart = isSelectedStart(date);\n const selectedSpan = isSelectedSpan(date);\n const selectedEnd = isSelectedEnd(date);\n const selectedOnSameDay = isSameDay(date);\n\n const hovered = isHovered(date);\n const hoveredStart = isHoveredStart(date);\n const hoveredSpan = isHoveredSpan(date);\n const hoveredEnd = isHoveredEnd(date);\n\n const formattedDate = dateAdapter.format(date, \"dddd D MMMM YYYY\");\n\n // Determine aria-label based on selection state\n let ariaLabel = formattedDate;\n if (selectionVariant === \"single\") {\n if (selected) {\n ariaLabel = `${ariaLabel}, selected`;\n }\n } else if (selectedStart) {\n ariaLabel = `Start date: ${formattedDate}, selected`;\n } else if (selectedEnd) {\n ariaLabel = `End range: ${formattedDate}, selected`;\n } else if (selectedSpan) {\n ariaLabel = `In range: ${formattedDate}, selected`;\n } else if (hoveredStart) {\n ariaLabel = `Start new range: ${formattedDate}`;\n } else if (hoveredEnd) {\n ariaLabel = `${formattedDate}, select as end date`;\n } else {\n if (dateAdapter.isSame(minDate, date, \"day\")) {\n ariaLabel = `${formattedDate}, minimum date`;\n } else if (dateAdapter.isSame(maxDate, date, \"day\")) {\n ariaLabel = `${formattedDate}, maximum date`;\n }\n }\n\n return {\n handleClick,\n handleKeyDown,\n status: {\n hovered,\n selected,\n selectedStart,\n selectedSpan,\n selectedEnd,\n hoveredStart,\n hoveredSpan,\n hoveredEnd,\n },\n dayProps: {\n className: clsx({\n [withBaseName(\"selected\")]:\n selectionVariant === \"single\" ? selected : undefined,\n [withBaseName(\"selectedStart\")]:\n selectionVariant !== \"single\" ? selectedStart : undefined,\n [withBaseName(\"selectedSpan\")]:\n selectionVariant !== \"single\" ? selectedSpan : undefined,\n [withBaseName(\"selectedEnd\")]:\n selectionVariant !== \"single\" ? selectedEnd : undefined,\n [withBaseName(\"selectedSameDay\")]:\n selectionVariant !== \"single\" && selectedOnSameDay,\n [withBaseName(\"hoveredStart\")]:\n selectionVariant !== \"single\" && hoveredStart,\n [withBaseName(\"hoveredSpan\")]:\n selectionVariant !== \"single\" && hoveredSpan,\n [withBaseName(\"hoveredEnd\")]:\n selectionVariant !== \"single\" && hoveredEnd,\n }),\n \"aria-disabled\":\n isDaySelectable && !isDaySelectable(date) ? \"true\" : undefined,\n \"aria-label\": ariaLabel,\n },\n };\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"useCalendarSelection.js","sources":["../src/calendar/useCalendarSelection.ts"],"sourcesContent":["import { makePrefixer, useControlled } from \"@salt-ds/core\";\nimport type {\n DateFrameworkType,\n SaltDateAdapter,\n} from \"@salt-ds/date-adapters\";\nimport { clsx } from \"clsx\";\nimport {\n type KeyboardEventHandler,\n type MouseEventHandler,\n type SyntheticEvent,\n useCallback,\n useMemo,\n} from \"react\";\nimport { useLocalization } from \"../localization-provider\";\nimport { useCalendarContext } from \"./internal/CalendarContext\";\n\n/**\n * Type representing a single date selection.\n */\nexport type SingleDateSelection<\n TDate extends DateFrameworkType = DateFrameworkType,\n> = TDate;\n\n/**\n * Type representing a date range selection.\n * @template TDate - The type of the date object.\n */\nexport type DateRangeSelection<\n TDate extends DateFrameworkType = DateFrameworkType,\n> = {\n /**\n * The start date of the range, or null if empty\n */\n startDate?: TDate | null;\n /**\n * The end date of the range, or null if empty\n */\n endDate?: TDate | null;\n};\n\n/**\n * Checks if a value is a date range selection.\n * @template TDate - The type of the date object.\n * @param value - The value to check.\n * @returns `true` if the value is a date range selection, otherwise `false`.\n */\nexport function isDateRangeSelection<\n TDate extends DateFrameworkType = DateFrameworkType,\n>(value: unknown): value is DateRangeSelection<TDate> {\n return (\n !!value &&\n !Array.isArray(value) &&\n typeof value === \"object\" &&\n (\"startDate\" in value || \"endDate\" in value)\n );\n}\n\nexport type SelectionVariant = \"single\" | \"range\" | \"offset\";\n\n/**\n * Base properties for calendar UseCalendarSelection hook.\n */\nexport interface UseCalendarSelectionBaseProps<Selection> {\n /**\n * Determines if a date is outside the allowed date range.\n * @param date - The date to check.\n * @returns 0 if inside the date range, -1 if before the min date, 1 if after the max date.\n */\n isOutsideAllowedDates?: (date: DateFrameworkType) => -1 | 0 | 1;\n /**\n * Function to determine if a day is selectable.\n * @param date - The date to check.\n * @returns `true` if the day is selectable, otherwise `false`.\n */\n isDaySelectable?: (date: DateFrameworkType) => boolean;\n /**\n * If `true`, the calendar will be multiselect.\n */\n multiselect?: boolean;\n /**\n * The selection variant, set to \"single\".\n */\n selectionVariant: SelectionVariant;\n /**\n * The currently selected date.\n */\n selectedDate?: Selection;\n /**\n * The default selected date.\n */\n defaultSelectedDate?: Selection;\n /**\n * Callback fired when the selected date changes.\n * @param event - The synthetic event.\n * @param selectedDate - The new selected date.\n */\n onSelectionChange?: (event: SyntheticEvent, selectedDate: Selection) => void;\n /**\n * A pure function to manage the selected date for uncontrolled use-cases.\n * Return the selection based on the previous selection and the new date.\n * @param previousSelectedDate\n * @param newDate\n */\n select?: (\n previousSelectedDate: Selection,\n newDate: DateFrameworkType,\n ) => Selection;\n /**\n * Function to calculate the start date offset.\n * @param date - The date to offset.\n * @returns The offset start date.\n */\n startDateOffset?: (date: DateFrameworkType) => DateFrameworkType;\n /**\n * Function to calculate the end date offset.\n * @param date - The date to offset.\n * @returns The offset end date.\n */\n endDateOffset?: (date: DateFrameworkType) => DateFrameworkType;\n}\n\nexport type UseCalendarSelectionSingleProps =\n UseCalendarSelectionBaseProps<SingleDateSelection<DateFrameworkType> | null> & {\n selectionVariant: \"single\";\n multiselect?: false;\n };\n\nexport type UseCalendarSelectionMultiselectSingleProps =\n UseCalendarSelectionBaseProps<\n Array<SingleDateSelection<DateFrameworkType>>\n > & {\n selectionVariant: \"single\";\n multiselect: true;\n };\n\nexport type UseCalendarSelectionRangeProps = UseCalendarSelectionBaseProps<\n DateRangeSelection<DateFrameworkType>\n> & {\n selectionVariant: \"range\";\n multiselect?: false;\n};\n\nexport type UseCalendarSelectionMultiselectRangeProps =\n UseCalendarSelectionBaseProps<\n Array<DateRangeSelection<DateFrameworkType>>\n > & {\n selectionVariant: \"range\";\n multiselect: true;\n };\n\nexport type UseCalendarSelectionOffsetProps = UseCalendarSelectionBaseProps<\n DateRangeSelection<DateFrameworkType>\n> & {\n selectionVariant: \"offset\";\n multiselect?: false;\n};\n\nexport type UseCalendarSelectionMultiselectOffsetProps =\n UseCalendarSelectionBaseProps<\n Array<DateRangeSelection<DateFrameworkType>>\n > & {\n selectionVariant: \"offset\";\n multiselect: true;\n };\n\nexport type UseCalendarSelectionProps =\n | UseCalendarSelectionSingleProps\n | UseCalendarSelectionMultiselectSingleProps\n | UseCalendarSelectionRangeProps\n | UseCalendarSelectionMultiselectRangeProps\n | UseCalendarSelectionOffsetProps\n | UseCalendarSelectionMultiselectOffsetProps;\n\nfunction selectDateRange(\n dateAdapter: SaltDateAdapter,\n previousSelectedDate: DateRangeSelection<DateFrameworkType>,\n newDate: DateFrameworkType,\n) {\n if (previousSelectedDate?.startDate && previousSelectedDate?.endDate) {\n return {\n startDate: newDate,\n };\n }\n if (\n previousSelectedDate?.startDate &&\n dateAdapter.compare(newDate, previousSelectedDate?.startDate) >= 0\n ) {\n return {\n ...previousSelectedDate,\n endDate: newDate,\n };\n }\n return {\n startDate: newDate,\n };\n}\n\nfunction selectMultiselectDateRange(\n dateAdapter: SaltDateAdapter,\n previousSelectedDate: DateRangeSelection<DateFrameworkType>[],\n newDate: DateFrameworkType,\n): DateRangeSelection<DateFrameworkType>[] {\n const lastRange = previousSelectedDate.length\n ? previousSelectedDate[previousSelectedDate.length - 1]\n : undefined;\n const isIncompleteRange = !lastRange?.endDate;\n\n if (isIncompleteRange) {\n const isNewSelection = previousSelectedDate.length === 0;\n if (isNewSelection) {\n return [{ startDate: newDate }];\n }\n const completeDateRange = selectDateRange(\n dateAdapter,\n previousSelectedDate[previousSelectedDate.length - 1],\n newDate,\n );\n return [...previousSelectedDate.slice(0, -1), completeDateRange];\n }\n return [...previousSelectedDate, { startDate: newDate }];\n}\n\nexport function useCalendarSelection(props: UseCalendarSelectionProps) {\n const {\n selectedDate: selectedDateProp,\n defaultSelectedDate,\n onSelectionChange,\n isDaySelectable = () => true,\n isOutsideAllowedDates = () => 0,\n select: selectProp,\n selectionVariant,\n startDateOffset,\n endDateOffset,\n multiselect,\n } = props as UseCalendarSelectionProps & {\n startDateOffset?: (date: DateFrameworkType) => DateFrameworkType;\n endDateOffset?: (date: DateFrameworkType) => DateFrameworkType;\n multiselect?: boolean;\n };\n const { dateAdapter } = useLocalization<DateFrameworkType>();\n const [selectedDate, setSelectedDateState] = useControlled({\n controlled: selectedDateProp,\n default: defaultSelectedDate,\n name: \"Calendar\",\n state: \"selectedDate\",\n });\n\n const setSelectedDate = useCallback(\n (\n event: SyntheticEvent<HTMLButtonElement>,\n newSelectedDate: DateFrameworkType,\n ) => {\n if (!isDaySelectable || isDaySelectable(newSelectedDate)) {\n const handleSelectionChange = <\n U extends\n | (DateFrameworkType | null)\n | DateFrameworkType[]\n | (DateRangeSelection<DateFrameworkType> | null)\n | DateRangeSelection<DateFrameworkType>[],\n >(\n updatedSelection: U,\n changeHandler:\n | ((event: SyntheticEvent, updatedSelection: U) => void)\n | undefined,\n ) => {\n changeHandler?.(event, updatedSelection);\n setSelectedDateState(updatedSelection);\n };\n\n switch (selectionVariant) {\n case \"single\": {\n if (multiselect) {\n const multipleSingleSelectedDate = selectedDate as Array<\n SingleDateSelection<DateFrameworkType>\n >;\n const select =\n selectProp as UseCalendarSelectionMultiselectSingleProps[\"select\"];\n const updatedSelection: Array<\n SingleDateSelection<DateFrameworkType>\n > = select\n ? select(multipleSingleSelectedDate ?? [], newSelectedDate)\n : [...(multipleSingleSelectedDate ?? []), newSelectedDate];\n\n const changeHandler =\n onSelectionChange as UseCalendarSelectionMultiselectSingleProps[\"onSelectionChange\"];\n handleSelectionChange(updatedSelection, changeHandler);\n } else {\n const singleSelectedDate =\n selectedDate as SingleDateSelection<DateFrameworkType> | null;\n const select =\n selectProp as UseCalendarSelectionSingleProps[\"select\"];\n const updatedSelection: SingleDateSelection<DateFrameworkType> | null =\n select\n ? select(singleSelectedDate, newSelectedDate)\n : newSelectedDate;\n\n const changeHandler =\n onSelectionChange as UseCalendarSelectionSingleProps[\"onSelectionChange\"];\n handleSelectionChange(updatedSelection, changeHandler);\n }\n break;\n }\n case \"range\": {\n if (multiselect) {\n const multipleRangeSelectedDate = selectedDate as Array<\n DateRangeSelection<DateFrameworkType>\n >;\n const select =\n selectProp as UseCalendarSelectionMultiselectRangeProps[\"select\"];\n const updatedSelection: DateRangeSelection<DateFrameworkType>[] =\n select\n ? select(multipleRangeSelectedDate ?? [], newSelectedDate)\n : selectMultiselectDateRange(\n dateAdapter,\n multipleRangeSelectedDate ?? [],\n newSelectedDate,\n );\n\n const changeHandler =\n onSelectionChange as UseCalendarSelectionMultiselectRangeProps[\"onSelectionChange\"];\n handleSelectionChange(updatedSelection, changeHandler);\n } else {\n const rangeSelectedDate =\n selectedDate as DateRangeSelection<DateFrameworkType>;\n const select =\n selectProp as UseCalendarSelectionRangeProps[\"select\"];\n const updatedSelection: DateRangeSelection<DateFrameworkType> =\n select\n ? select(rangeSelectedDate, newSelectedDate)\n : selectDateRange(\n dateAdapter,\n rangeSelectedDate,\n newSelectedDate,\n );\n\n const changeHandler =\n onSelectionChange as UseCalendarSelectionRangeProps[\"onSelectionChange\"];\n handleSelectionChange(updatedSelection, changeHandler);\n }\n break;\n }\n case \"offset\": {\n if (multiselect) {\n const multipleOffsetSelectedDate = selectedDate as Array<\n DateRangeSelection<DateFrameworkType>\n >;\n const select =\n selectProp as UseCalendarSelectionMultiselectOffsetProps[\"select\"];\n const updatedSelection: DateRangeSelection<DateFrameworkType>[] =\n select\n ? select(multipleOffsetSelectedDate ?? [], newSelectedDate)\n : [\n ...(multipleOffsetSelectedDate ?? []),\n {\n startDate: newSelectedDate,\n endDate: endDateOffset\n ? endDateOffset(newSelectedDate)\n : newSelectedDate,\n },\n ];\n\n const changeHandler =\n onSelectionChange as UseCalendarSelectionMultiselectOffsetProps[\"onSelectionChange\"];\n handleSelectionChange(updatedSelection, changeHandler);\n } else {\n const offsetSelectedDate =\n selectedDate as DateRangeSelection<DateFrameworkType>;\n const select =\n selectProp as UseCalendarSelectionOffsetProps[\"select\"];\n const updatedSelection: DateRangeSelection<DateFrameworkType> =\n select\n ? select(offsetSelectedDate, newSelectedDate)\n : {\n startDate: startDateOffset\n ? startDateOffset(newSelectedDate)\n : newSelectedDate,\n endDate: endDateOffset\n ? endDateOffset(newSelectedDate)\n : newSelectedDate,\n };\n const changeHandler =\n onSelectionChange as UseCalendarSelectionOffsetProps[\"onSelectionChange\"];\n handleSelectionChange(updatedSelection, changeHandler);\n }\n break;\n }\n }\n }\n },\n [\n dateAdapter,\n isDaySelectable,\n selectProp,\n selectedDate,\n selectionVariant,\n onSelectionChange,\n multiselect,\n startDateOffset,\n endDateOffset,\n ],\n );\n\n const isSelected = useCallback(\n (date: DateFrameworkType) => {\n if (!selectedDate) {\n return false;\n }\n if (selectionVariant === \"single\") {\n const singleDates = (\n Array.isArray(selectedDate) ? selectedDate : [selectedDate]\n ) as DateFrameworkType[];\n return singleDates.some((singleDate) =>\n dateAdapter.isSame(singleDate, date, \"day\"),\n );\n }\n return false;\n },\n [dateAdapter, selectedDate, selectionVariant],\n );\n\n const isSameDay = useCallback(\n (date: DateFrameworkType) => {\n const dateRanges = Array.isArray(selectedDate)\n ? selectedDate\n : [selectedDate];\n return dateRanges.some((range) => {\n if (\n (selectionVariant === \"range\" || selectionVariant === \"offset\") &&\n isDateRangeSelection(range) &&\n range?.startDate &&\n range?.endDate &&\n dateAdapter.isSame(range?.startDate, date, \"day\")\n ) {\n return dateAdapter.isSame(range?.startDate, range?.endDate, \"day\");\n }\n return false;\n });\n },\n [dateAdapter, selectionVariant, selectedDate],\n );\n\n const isSelectedStart = useCallback(\n (date: DateFrameworkType) => {\n if (selectionVariant === \"single\") {\n return false;\n }\n const dateRanges = Array.isArray(selectedDate)\n ? selectedDate\n : [selectedDate];\n return dateRanges.some((range) => {\n if (\n (selectionVariant === \"range\" || selectionVariant === \"offset\") &&\n isDateRangeSelection(range) &&\n dateAdapter.isValid(range.startDate) &&\n isOutsideAllowedDates(range.startDate) === 0\n ) {\n return dateAdapter.isSame(range.startDate, date, \"day\");\n }\n return false;\n });\n },\n [dateAdapter, isOutsideAllowedDates, selectionVariant, selectedDate],\n );\n\n const isSelectedSpan = useCallback(\n (date: DateFrameworkType) => {\n if (selectionVariant === \"single\") {\n return false;\n }\n const dateRanges = Array.isArray(selectedDate)\n ? selectedDate\n : [selectedDate];\n return dateRanges.some((range) => {\n if (\n (selectionVariant === \"range\" || selectionVariant === \"offset\") &&\n isDateRangeSelection(range) &&\n dateAdapter.isValid(range.startDate) &&\n dateAdapter.isValid(range.endDate) &&\n isOutsideAllowedDates(range.startDate) === 0 &&\n isOutsideAllowedDates(range.endDate) === 0\n ) {\n return (\n dateAdapter.compare(date, range.startDate) > 0 &&\n dateAdapter.compare(date, range.endDate) < 0\n );\n }\n return false;\n });\n },\n [dateAdapter, isOutsideAllowedDates, selectionVariant, selectedDate],\n );\n\n const isSelectedEnd = useCallback(\n (date: DateFrameworkType) => {\n if (selectionVariant === \"single\") {\n return false;\n }\n const dateRanges = Array.isArray(selectedDate)\n ? selectedDate\n : [selectedDate];\n return dateRanges.some((range) => {\n if (\n (selectionVariant === \"range\" || selectionVariant === \"offset\") &&\n isDateRangeSelection(range) &&\n dateAdapter.isValid(range.endDate) &&\n isOutsideAllowedDates(range.endDate) === 0\n ) {\n return dateAdapter.isSame(range.endDate, date, \"day\");\n }\n return false;\n });\n },\n [dateAdapter, isOutsideAllowedDates, selectionVariant, selectedDate],\n );\n\n return useMemo(\n () => ({\n state: {\n selectedDate,\n },\n helpers: {\n isSelected,\n isSameDay,\n setSelectedDate,\n isSelectedStart,\n isSelectedSpan,\n isSelectedEnd,\n },\n }),\n [\n selectedDate,\n isSelected,\n isSameDay,\n isSelectedStart,\n isSelectedSpan,\n isSelectedEnd,\n setSelectedDate,\n ],\n );\n}\n\nconst withBaseName = makePrefixer(\"saltCalendarDay\");\n\nexport function useCalendarSelectionDay({ date }: { date: DateFrameworkType }) {\n const { dateAdapter } = useLocalization<DateFrameworkType>();\n const {\n state: { selectionVariant, minDate, maxDate },\n helpers: {\n setSelectedDate,\n isSameDay,\n isSelected,\n isSelectedStart,\n isSelectedSpan,\n isSelectedEnd,\n isHovered,\n isHoveredStart,\n isHoveredSpan,\n isHoveredEnd,\n isDaySelectable,\n },\n } = useCalendarContext();\n\n const handleClick: MouseEventHandler<HTMLButtonElement> = useCallback(\n (event) => {\n setSelectedDate(event, date);\n },\n [date, setSelectedDate],\n );\n\n const handleKeyDown: KeyboardEventHandler<HTMLButtonElement> = useCallback(\n (event) => {\n switch (event.key) {\n case \"Space\":\n case \"Enter\":\n setSelectedDate(event, date);\n event.preventDefault();\n }\n },\n [date, setSelectedDate],\n );\n\n const selected = isSelected(date);\n const selectedStart = isSelectedStart(date);\n const selectedSpan = isSelectedSpan(date);\n const selectedEnd = isSelectedEnd(date);\n const selectedOnSameDay = isSameDay(date);\n\n const hovered = isHovered(date);\n const hoveredStart = isHoveredStart(date);\n const hoveredSpan = isHoveredSpan(date);\n const hoveredEnd = isHoveredEnd(date);\n\n // Use a two-digit day so the accessible name contains the visible day text (WCAG 2.5.3 Label in Name).\n const formattedDate = dateAdapter.format(date, \"dddd DD MMMM YYYY\");\n\n // Determine aria-label based on selection state\n let ariaLabel = formattedDate;\n if (selectionVariant === \"single\") {\n if (selected) {\n ariaLabel = `${ariaLabel}, selected`;\n }\n } else if (selectedStart) {\n ariaLabel = `Start date: ${formattedDate}, selected`;\n } else if (selectedEnd) {\n ariaLabel = `End range: ${formattedDate}, selected`;\n } else if (selectedSpan) {\n ariaLabel = `In range: ${formattedDate}, selected`;\n } else if (hoveredStart) {\n ariaLabel = `Start new range: ${formattedDate}`;\n } else if (hoveredEnd) {\n ariaLabel = `${formattedDate}, select as end date`;\n } else {\n if (dateAdapter.isSame(minDate, date, \"day\")) {\n ariaLabel = `${formattedDate}, minimum date`;\n } else if (dateAdapter.isSame(maxDate, date, \"day\")) {\n ariaLabel = `${formattedDate}, maximum date`;\n }\n }\n\n return {\n handleClick,\n handleKeyDown,\n status: {\n hovered,\n selected,\n selectedStart,\n selectedSpan,\n selectedEnd,\n hoveredStart,\n hoveredSpan,\n hoveredEnd,\n },\n dayProps: {\n className: clsx({\n [withBaseName(\"selected\")]:\n selectionVariant === \"single\" ? selected : undefined,\n [withBaseName(\"selectedStart\")]:\n selectionVariant !== \"single\" ? selectedStart : undefined,\n [withBaseName(\"selectedSpan\")]:\n selectionVariant !== \"single\" ? selectedSpan : undefined,\n [withBaseName(\"selectedEnd\")]:\n selectionVariant !== \"single\" ? selectedEnd : undefined,\n [withBaseName(\"selectedSameDay\")]:\n selectionVariant !== \"single\" && selectedOnSameDay,\n [withBaseName(\"hoveredStart\")]:\n selectionVariant !== \"single\" && hoveredStart,\n [withBaseName(\"hoveredSpan\")]:\n selectionVariant !== \"single\" && hoveredSpan,\n [withBaseName(\"hoveredEnd\")]:\n selectionVariant !== \"single\" && hoveredEnd,\n }),\n \"aria-disabled\":\n isDaySelectable && !isDaySelectable(date) ? \"true\" : undefined,\n \"aria-label\": ariaLabel,\n },\n };\n}\n"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- var css_248z = "/* Style applied to the root element */\n.saltDateInput {\n align-items: center;\n background: var(--saltDateInput-background, var(--input-background));\n border-radius: var(--salt-palette-corner-weak, 0);\n color: var(--saltDateInput-color, var(--salt-content-primary-foreground));\n display: inline-flex;\n font-family: var(--salt-text-fontFamily);\n font-size: var(--saltDateInput-fontSize, var(--salt-text-fontSize));\n line-height: var(--saltDateInput-lineHeight, var(--salt-text-lineHeight));\n letter-spacing: var(--salt-text-letterSpacing);\n height: var(--saltDateInput-height, var(--salt-size-base));\n min-height: var(--saltDateInput-minHeight, var(--salt-size-base));\n min-width: var(--saltDateInput-minWidth, 4em);\n padding-left: var(--saltDateInput-paddingLeft, var(--salt-spacing-100));\n padding-right: var(--saltDateInput-paddingRight, var(--salt-spacing-100));\n position: relative;\n box-sizing: border-box;\n overflow: hidden;\n width: 100%;\n}\n\n.saltDateInput:hover {\n cursor: var(--salt-cursor-text);\n}\n\n/* Style applied if `bordered={true}` */\n.saltDateInput-bordered.saltDateInput {\n border: var(--salt-size-fixed-100) var(--salt-borderStyle-solid) var(--input-borderColor);\n}\n\n.saltDateInput-bordered.saltDateInput:hover {\n border-style: var(--salt-borderStyle-solid);\n border-color: var(--input-borderColor-hover);\n}\n\n.saltDateInput-bordered.saltDateInput-focused,\n.saltDateInput-bordered.saltDateInput-focused:hover {\n border-style: var(--salt-borderStyle-solid);\n border-color: var(--input-borderColor-active);\n}\n\n.saltDateInput-bordered.saltDateInput-readOnly,\n.saltDateInput-bordered.saltDateInput-readOnly:hover {\n border-style: var(--salt-borderStyle-solid);\n border-color: var(--salt-editable-borderColor-readonly);\n}\n\n.saltDateInput-bordered.saltDateInput-disabled,\n.saltDateInput-bordered.saltDateInput-disabled:hover {\n border-style: var(--salt-borderStyle-solid);\n border-color: var(--salt-editable-borderColor-disabled);\n}\n\n.saltDateInput-activationIndicator {\n left: 0;\n bottom: 0;\n width: 100%;\n position: absolute;\n border-bottom: var(--salt-size-fixed-100) var(--salt-borderStyle-solid) var(--input-borderColor);\n}\n\n.saltDateInput:hover .saltDateInput-activationIndicator {\n border-bottom-style: var(--salt-borderStyle-solid);\n border-bottom-color: var(--input-borderColor-hover);\n}\n\n.saltDateInput-focused .saltDateInput-activationIndicator,\n.saltDateInput-focused:hover .saltDateInput-activationIndicator {\n border-bottom: var(--salt-size-fixed-200) var(--salt-borderStyle-solid) var(--input-borderColor-active);\n}\n\n.saltDateInput-readOnly .saltDateInput-activationIndicator,\n.saltDateInput-readOnly:hover .saltDateInput-activationIndicator {\n border-bottom-style: var(--salt-borderStyle-solid);\n border-bottom-color: var(--salt-editable-borderColor-readonly);\n}\n\n.saltDateInput-disabled .saltDateInput-activationIndicator,\n.saltDateInput-disabled:hover .saltDateInput-activationIndicator {\n border-bottom-style: var(--salt-borderStyle-solid);\n border-bottom-color: var(--salt-editable-borderColor-disabled);\n}\n\n.saltDateInput-bordered .saltDateInput-activationIndicator,\n.saltDateInput-bordered.saltDateInput-readOnly .saltDateInput-activationIndicator,\n.saltDateInput-bordered.saltDateInput-disabled:hover .saltDateInput-activationIndicator {\n border-bottom-width: 0;\n}\n\n.saltDateInput-bordered.saltDateInput-focused .saltDateInput-activationIndicator {\n /* Activation indicator width minus the border from the input. */\n border-bottom-width: var(--salt-size-fixed-100);\n}\n\n/* Class applied if `variant=\"primary\"` */\n.saltDateInput-primary {\n --input-background: var(--salt-editable-primary-background);\n --input-background-disabled: var(--salt-editable-primary-background-disabled);\n --input-background-readonly: var(--salt-editable-background-readonly);\n --input-borderColor: var(--salt-editable-borderColor);\n --input-borderColor-active: var(--salt-editable-borderColor-active);\n --input-borderColor-hover: var(--salt-editable-borderColor-hover);\n --input-outlineColor: var(--salt-focused-outlineColor);\n}\n\n/* Class applied if `variant=\"secondary\"` */\n.saltDateInput-secondary {\n --input-background: var(--salt-editable-secondary-background);\n --input-background-disabled: var(--salt-editable-secondary-background-disabled);\n --input-background-readonly: var(--salt-editable-background-readonly);\n --input-borderColor: var(--salt-editable-borderColor);\n --input-borderColor-active: var(--salt-editable-borderColor-active);\n --input-borderColor-hover: var(--salt-editable-borderColor-hover);\n --input-outlineColor: var(--salt-focused-outlineColor);\n}\n\n/* Class applied if `variant=\"tertiary\"` */\n.saltDateInput-tertiary {\n --input-background: var(--salt-editable-tertiary-background);\n --input-background-readonly: var(--salt-editable-background-readonly);\n --input-borderColor: var(--salt-editable-borderColor);\n --input-borderColor-active: var(--salt-editable-borderColor-active);\n --input-borderColor-hover: var(--salt-editable-borderColor-hover);\n --input-outlineColor: var(--salt-focused-outlineColor);\n}\n\n/* Style applied to input if `validationState=\"error\"` */\n.saltDateInput-error {\n --input-background: var(--salt-status-error-background);\n --input-background-readonly: var(--salt-status-error-background);\n --input-borderColor: var(--salt-status-error-borderColor);\n --input-borderColor-active: var(--salt-status-error-borderColor);\n --input-borderColor-hover: var(--salt-status-error-borderColor);\n --input-outlineColor: var(--salt-status-error-borderColor);\n}\n\n/* Style applied to input if `validationState=\"warning\"` */\n.saltDateInput-warning {\n --input-background: var(--salt-status-warning-background);\n --input-background-readonly: var(--salt-status-warning-background);\n --input-borderColor: var(--salt-status-warning-borderColor);\n --input-borderColor-active: var(--salt-status-warning-borderColor);\n --input-borderColor-hover: var(--salt-status-warning-borderColor);\n --input-outlineColor: var(--salt-status-warning-borderColor);\n}\n\n/* Style applied to input if `validationState=\"success\"` */\n.saltDateInput-success {\n --input-background: var(--salt-status-success-background);\n --input-background-readonly: var(--salt-status-success-background);\n --input-borderColor: var(--salt-status-success-borderColor);\n --input-borderColor-active: var(--salt-status-success-borderColor);\n --input-borderColor-hover: var(--salt-status-success-borderColor);\n --input-outlineColor: var(--salt-status-success-borderColor);\n}\n\n/* Styling when focused */\n.saltDateInput-focused,\n.saltDateInput-focused:hover {\n cursor: var(--salt-cursor-text);\n outline: var(--saltDateInput-outline, var(--salt-focused-outlineWidth) var(--salt-focused-outlineStyle) var(--input-outlineColor));\n}\n\n/* Style applied if `readOnly={true}` */\n.saltDateInput.saltDateInput-readOnly {\n background: var(--input-background-readonly);\n cursor: var(--salt-cursor-readonly);\n}\n\n/* Styling when focused if `disabled={true}` */\n.saltDateInput-disabled,\n.saltDateInput-disabled:hover {\n background: var(--input-background-disabled);\n cursor: var(--salt-cursor-disabled);\n color: var(--saltDateInput-color-disabled, var(--salt-content-primary-foreground-disabled));\n}\n\n/* Style applied to start adornments */\n.saltDateInput-startAdornmentContainer {\n align-items: center;\n display: inline-flex;\n padding-right: var(--salt-spacing-100);\n column-gap: var(--salt-spacing-100);\n}\n\n/* Style applied to end adornments */\n.saltDateInput-endAdornmentContainer {\n display: inline-flex;\n column-gap: var(--salt-spacing-50);\n align-items: flex-end;\n}\n\n.saltDateInput-endAdornmentContainer .saltButton ~ .saltButton {\n margin-left: calc(-1 * var(--salt-spacing-50));\n}\n\n.saltDateInput-endAdornmentContainer .saltButton:last-child {\n margin-right: calc(var(--salt-spacing-50) * -1);\n}\n\n.saltDateInput-startAdornmentContainer > .saltButton,\n.saltDateInput-endAdornmentContainer > .saltButton {\n --saltButton-padding: calc(var(--salt-spacing-50) - var(--button-borderWidth));\n --saltButton-height: calc(var(--salt-size-base) - var(--salt-spacing-100));\n --saltButton-borderRadius: var(--salt-palette-corner-weaker);\n}\n\n/* Style applied to inner input component */\n.saltDateInput-input {\n background: none;\n border: none;\n box-sizing: content-box;\n color: inherit;\n cursor: inherit;\n display: block;\n font: inherit;\n height: 100%;\n letter-spacing: var(--saltDateInput-letterSpacing, var(--salt-text-letterSpacing));\n margin: 0;\n min-width: 0;\n overflow: hidden;\n padding: 0;\n text-align: left;\n width: 100%;\n}\n\n/* Reset in the class */\n.saltDateInput-input:focus {\n outline: none;\n}\n\n/* Style applied to selected input if `disabled={true}` */\n.saltDateInput-disabled .saltDateInput-input::selection {\n background: none;\n}\n\n/* Style applied to placeholder text */\n.saltDateInput-input::placeholder {\n color: var(--salt-content-secondary-foreground);\n font-weight: var(--salt-text-fontWeight-small);\n}\n\n/* Style applied to the dash between two inputs in range date input */\n.saltDateInput-dash {\n margin: 0 var(--salt-spacing-50);\n}\n\n/* Visually hidden but still announced by screen readers */\n.saltDateInput-visuallyHidden {\n position: absolute;\n width: 1px;\n height: 1px;\n overflow: hidden;\n clip: rect(0 0 0 0);\n white-space: nowrap;\n}\n";
1
+ var css_248z = "/* Style applied to the root element */\n.saltDateInput {\n align-items: center;\n background: var(--saltDateInput-background, var(--input-background));\n border-radius: var(--salt-palette-corner-weak, 0);\n color: var(--saltDateInput-color, var(--salt-content-primary-foreground));\n display: inline-flex;\n font-family: var(--salt-text-fontFamily);\n font-size: var(--saltDateInput-fontSize, var(--salt-text-fontSize));\n line-height: var(--saltDateInput-lineHeight, var(--salt-text-lineHeight));\n letter-spacing: var(--salt-text-letterSpacing);\n height: var(--saltDateInput-height, var(--salt-size-base));\n min-height: var(--saltDateInput-minHeight, var(--salt-size-base));\n min-width: var(--saltDateInput-minWidth, 4em);\n padding-left: var(--saltDateInput-paddingLeft, var(--salt-spacing-100));\n padding-right: var(--saltDateInput-paddingRight, var(--salt-spacing-100));\n position: relative;\n box-sizing: border-box;\n overflow: hidden;\n width: 100%;\n}\n\n.saltDateInput:hover {\n cursor: var(--salt-cursor-text);\n}\n\n/* Style applied if `bordered={true}` */\n.saltDateInput-bordered.saltDateInput {\n border: var(--salt-size-fixed-100) var(--salt-borderStyle-solid) var(--input-borderColor);\n}\n\n.saltDateInput-bordered.saltDateInput:hover {\n border-style: var(--salt-borderStyle-solid);\n border-color: var(--input-borderColor-hover);\n}\n\n.saltDateInput-bordered.saltDateInput-focused,\n.saltDateInput-bordered.saltDateInput-focused:hover {\n border-style: var(--salt-borderStyle-solid);\n border-color: var(--input-borderColor-active);\n}\n\n.saltDateInput-bordered.saltDateInput-readOnly,\n.saltDateInput-bordered.saltDateInput-readOnly:hover {\n border-style: var(--salt-borderStyle-solid);\n border-color: var(--salt-editable-borderColor-readonly);\n}\n\n.saltDateInput-bordered.saltDateInput-disabled,\n.saltDateInput-bordered.saltDateInput-disabled:hover {\n border-style: var(--salt-borderStyle-solid);\n border-color: var(--salt-editable-borderColor-disabled);\n}\n\n.saltDateInput-activationIndicator {\n left: 0;\n bottom: 0;\n width: 100%;\n position: absolute;\n border-bottom: var(--salt-size-fixed-100) var(--salt-borderStyle-solid) var(--input-borderColor);\n}\n\n.saltDateInput:hover .saltDateInput-activationIndicator {\n border-bottom-style: var(--salt-borderStyle-solid);\n border-bottom-color: var(--input-borderColor-hover);\n}\n\n.saltDateInput-focused .saltDateInput-activationIndicator,\n.saltDateInput-focused:hover .saltDateInput-activationIndicator {\n border-bottom: var(--salt-size-fixed-200) var(--salt-borderStyle-solid) var(--input-borderColor-active);\n}\n\n.saltDateInput-readOnly .saltDateInput-activationIndicator,\n.saltDateInput-readOnly:hover .saltDateInput-activationIndicator {\n border-bottom-style: var(--salt-borderStyle-solid);\n border-bottom-color: var(--salt-editable-borderColor-readonly);\n}\n\n.saltDateInput-disabled .saltDateInput-activationIndicator,\n.saltDateInput-disabled:hover .saltDateInput-activationIndicator {\n border-bottom-style: var(--salt-borderStyle-solid);\n border-bottom-color: var(--salt-editable-borderColor-disabled);\n}\n\n.saltDateInput-bordered .saltDateInput-activationIndicator,\n.saltDateInput-bordered.saltDateInput-readOnly .saltDateInput-activationIndicator,\n.saltDateInput-bordered.saltDateInput-disabled:hover .saltDateInput-activationIndicator {\n border-bottom-width: 0;\n}\n\n.saltDateInput-bordered.saltDateInput-focused .saltDateInput-activationIndicator {\n /* Activation indicator width minus the border from the input. */\n border-bottom-width: var(--salt-size-fixed-100);\n}\n\n/* Class applied if `variant=\"primary\"` */\n.saltDateInput-primary {\n --input-background: var(--salt-editable-primary-background);\n --input-background-disabled: var(--salt-editable-primary-background-disabled);\n --input-background-readonly: var(--salt-editable-background-readonly);\n --input-borderColor: var(--salt-editable-borderColor);\n --input-borderColor-active: var(--salt-editable-borderColor-active);\n --input-borderColor-hover: var(--salt-editable-borderColor-hover);\n --input-outlineColor: var(--salt-focused-outlineColor);\n}\n\n/* Class applied if `variant=\"secondary\"` */\n.saltDateInput-secondary {\n --input-background: var(--salt-editable-secondary-background);\n --input-background-disabled: var(--salt-editable-secondary-background-disabled);\n --input-background-readonly: var(--salt-editable-background-readonly);\n --input-borderColor: var(--salt-editable-borderColor);\n --input-borderColor-active: var(--salt-editable-borderColor-active);\n --input-borderColor-hover: var(--salt-editable-borderColor-hover);\n --input-outlineColor: var(--salt-focused-outlineColor);\n}\n\n/* Class applied if `variant=\"tertiary\"` */\n.saltDateInput-tertiary {\n --input-background: var(--salt-editable-tertiary-background);\n --input-background-readonly: var(--salt-editable-background-readonly);\n --input-borderColor: var(--salt-editable-borderColor);\n --input-borderColor-active: var(--salt-editable-borderColor-active);\n --input-borderColor-hover: var(--salt-editable-borderColor-hover);\n --input-outlineColor: var(--salt-focused-outlineColor);\n}\n\n/* Style applied to input if `validationState=\"error\"` */\n.saltDateInput-error {\n --input-background: var(--salt-status-error-background);\n --input-background-readonly: var(--salt-status-error-background);\n --input-borderColor: var(--salt-status-error-borderColor);\n --input-borderColor-active: var(--salt-status-error-borderColor);\n --input-borderColor-hover: var(--salt-status-error-borderColor);\n --input-outlineColor: var(--salt-status-error-borderColor);\n}\n\n/* Style applied to input if `validationState=\"warning\"` */\n.saltDateInput-warning {\n --input-background: var(--salt-status-warning-background);\n --input-background-readonly: var(--salt-status-warning-background);\n --input-borderColor: var(--salt-status-warning-borderColor);\n --input-borderColor-active: var(--salt-status-warning-borderColor);\n --input-borderColor-hover: var(--salt-status-warning-borderColor);\n --input-outlineColor: var(--salt-status-warning-borderColor);\n}\n\n/* Style applied to input if `validationState=\"success\"` */\n.saltDateInput-success {\n --input-background: var(--salt-status-success-background);\n --input-background-readonly: var(--salt-status-success-background);\n --input-borderColor: var(--salt-status-success-borderColor);\n --input-borderColor-active: var(--salt-status-success-borderColor);\n --input-borderColor-hover: var(--salt-status-success-borderColor);\n --input-outlineColor: var(--salt-status-success-borderColor);\n}\n\n/* Styling when focused */\n.saltDateInput-focused,\n.saltDateInput-focused:hover {\n cursor: var(--salt-cursor-text);\n outline: var(--saltDateInput-outline, var(--salt-focused-outlineWidth) var(--salt-focused-outlineStyle) var(--input-outlineColor));\n}\n\n/* Style applied if `readOnly={true}` */\n.saltDateInput.saltDateInput-readOnly {\n background: var(--input-background-readonly);\n cursor: var(--salt-cursor-readonly);\n}\n\n/* Styling when focused if `disabled={true}` */\n.saltDateInput-disabled,\n.saltDateInput-disabled:hover {\n background: var(--input-background-disabled);\n cursor: var(--salt-cursor-disabled);\n color: var(--saltDateInput-color-disabled, var(--salt-content-primary-foreground-disabled));\n}\n\n/* Style applied to start adornments */\n.saltDateInput-startAdornmentContainer {\n align-items: center;\n display: inline-flex;\n padding-right: var(--salt-spacing-100);\n column-gap: var(--salt-spacing-100);\n}\n\n/* Style applied to end adornments */\n.saltDateInput-endAdornmentContainer {\n display: inline-flex;\n column-gap: var(--salt-spacing-50);\n align-items: flex-end;\n}\n\n.saltDateInput-endAdornmentContainer .saltButton ~ .saltButton {\n margin-left: calc(-1 * var(--salt-spacing-50));\n}\n\n.saltDateInput-endAdornmentContainer .saltButton:last-child {\n margin-right: calc(var(--salt-spacing-50) * -1);\n}\n\n.saltDateInput-startAdornmentContainer > .saltButton,\n.saltDateInput-endAdornmentContainer > .saltButton {\n --saltButton-padding: calc(var(--salt-spacing-50) - var(--button-borderWidth));\n --saltButton-height: calc(var(--salt-size-base) - var(--salt-spacing-100));\n --saltButton-borderRadius: var(--salt-palette-corner-weaker);\n}\n\n/* Style applied to inner input component */\n.saltDateInput-input {\n background: none;\n border: none;\n box-sizing: content-box;\n color: inherit;\n cursor: inherit;\n display: block;\n font: inherit;\n height: 100%;\n letter-spacing: var(--saltDateInput-letterSpacing, var(--salt-text-letterSpacing));\n margin: 0;\n min-width: 0;\n overflow: hidden;\n padding: 0;\n text-align: left;\n width: 100%;\n}\n\n/* Reset in the class */\n.saltDateInput-input:focus {\n outline: none;\n}\n\n/* Style applied to selected input if `disabled={true}` */\n.saltDateInput-disabled .saltDateInput-input::selection {\n background: none;\n}\n\n/* Style applied to placeholder text */\n.saltDateInput-input::placeholder {\n color: var(--salt-content-secondary-foreground);\n font-weight: var(--salt-text-fontWeight-lighter);\n}\n\n/* Style applied to the dash between two inputs in range date input */\n.saltDateInput-dash {\n margin: 0 var(--salt-spacing-50);\n}\n\n/* Visually hidden but still announced by screen readers */\n.saltDateInput-visuallyHidden {\n position: absolute;\n width: 1px;\n height: 1px;\n overflow: hidden;\n clip: rect(0 0 0 0);\n white-space: nowrap;\n}\n";
2
2
 
3
3
  export { css_248z as default };
4
4
  //# sourceMappingURL=DateInput.css.js.map
@@ -8,13 +8,12 @@ import { useLocalization } from '../localization-provider/LocalizationProvider.j
8
8
  import css_248z from './DateInput.css.js';
9
9
 
10
10
  const withBaseName = makePrefixer("saltDateInput");
11
- var DateParserField = /* @__PURE__ */ ((DateParserField2) => {
12
- DateParserField2["START"] = "start";
13
- DateParserField2["END"] = "end";
14
- return DateParserField2;
15
- })(DateParserField || {});
11
+ const DateParserField = {
12
+ START: "start",
13
+ END: "end"
14
+ };
16
15
  const DateInputRange = forwardRef(
17
- (props, ref) => {
16
+ function DateInputRange2(props, ref) {
18
17
  const { dateAdapter } = useLocalization();
19
18
  const {
20
19
  "aria-label": ariaLabel,
@@ -86,8 +85,8 @@ const DateInputRange = forwardRef(
86
85
  if (!defaultValue) {
87
86
  return void 0;
88
87
  }
89
- const { date: startDate = void 0 } = parseDateValue(defaultValue == null ? void 0 : defaultValue.startDate, "start" /* START */) ?? {};
90
- const { date: endDate = void 0 } = parseDateValue(defaultValue == null ? void 0 : defaultValue.endDate, "end" /* END */) ?? {};
88
+ const { date: startDate = void 0 } = parseDateValue(defaultValue == null ? void 0 : defaultValue.startDate, DateParserField.START) ?? {};
89
+ const { date: endDate = void 0 } = parseDateValue(defaultValue == null ? void 0 : defaultValue.endDate, DateParserField.END) ?? {};
91
90
  return {
92
91
  startDate,
93
92
  endDate
@@ -204,8 +203,8 @@ const DateInputRange = forwardRef(
204
203
  const endInputIsRequired = formFieldRequired ? ["required", "asterisk"].includes(formFieldRequired) : endInputPropsRequired;
205
204
  const apply = (event) => {
206
205
  var _a, _b;
207
- const { date: startDate = void 0, ...startDateParseDetails } = parseDateValue(dateValue == null ? void 0 : dateValue.startDate, "start" /* START */) ?? {};
208
- const { date: endDate = void 0, ...endDateParseDetails } = parseDateValue(dateValue == null ? void 0 : dateValue.endDate, "end" /* END */) ?? {};
206
+ const { date: startDate = void 0, ...startDateParseDetails } = parseDateValue(dateValue == null ? void 0 : dateValue.startDate, DateParserField.START) ?? {};
207
+ const { date: endDate = void 0, ...endDateParseDetails } = parseDateValue(dateValue == null ? void 0 : dateValue.endDate, DateParserField.END) ?? {};
209
208
  const updatedDateRange = {
210
209
  startDate: ((_a = dateValue == null ? void 0 : dateValue.startDate) == null ? void 0 : _a.length) ? startDate : null,
211
210
  endDate: ((_b = dateValue == null ? void 0 : dateValue.endDate) == null ? void 0 : _b.length) ? endDate : null