@epilot/zenith-react 0.2.0-next.0 → 0.2.0-next.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.
- package/dist/components/accordion/accordion.js +57 -48
- package/dist/components/accordion/accordion.js.map +1 -1
- package/dist/components/alert-dialog/alert-dialog.js +120 -92
- package/dist/components/alert-dialog/alert-dialog.js.map +1 -1
- package/dist/components/avatar/avatar-group.js +38 -35
- package/dist/components/avatar/avatar-group.js.map +1 -1
- package/dist/components/avatar/avatar.js +78 -71
- package/dist/components/avatar/avatar.js.map +1 -1
- package/dist/components/badge/badge.js +60 -55
- package/dist/components/badge/badge.js.map +1 -1
- package/dist/components/breadcrumb/breadcrumb.js +99 -54
- package/dist/components/breadcrumb/breadcrumb.js.map +1 -1
- package/dist/components/button/button.js +87 -77
- package/dist/components/button/button.js.map +1 -1
- package/dist/components/button-group/button-group.js +36 -32
- package/dist/components/button-group/button-group.js.map +1 -1
- package/dist/components/callout/callout.js +105 -98
- package/dist/components/callout/callout.js.map +1 -1
- package/dist/components/card/card.js +62 -52
- package/dist/components/card/card.js.map +1 -1
- package/dist/components/checkbox/checkbox.js +22 -19
- package/dist/components/checkbox/checkbox.js.map +1 -1
- package/dist/components/code-block/code-block.js +135 -123
- package/dist/components/code-block/code-block.js.map +1 -1
- package/dist/components/code-editor/code-editor.js +276 -260
- package/dist/components/code-editor/code-editor.js.map +1 -1
- package/dist/components/collapsible-sidebar/collapsible-sidebar.js +62 -56
- package/dist/components/collapsible-sidebar/collapsible-sidebar.js.map +1 -1
- package/dist/components/command/command.js +116 -105
- package/dist/components/command/command.js.map +1 -1
- package/dist/components/data-table/data-table-body.js +38 -34
- package/dist/components/data-table/data-table-body.js.map +1 -1
- package/dist/components/data-table/data-table-column-header.js +30 -26
- package/dist/components/data-table/data-table-column-header.js.map +1 -1
- package/dist/components/data-table/data-table-column-order.js +79 -73
- package/dist/components/data-table/data-table-column-order.js.map +1 -1
- package/dist/components/data-table/data-table-column-visibility.js +25 -22
- package/dist/components/data-table/data-table-column-visibility.js.map +1 -1
- package/dist/components/data-table/data-table-content.js +47 -44
- package/dist/components/data-table/data-table-content.js.map +1 -1
- package/dist/components/data-table/data-table-error.js +36 -32
- package/dist/components/data-table/data-table-error.js.map +1 -1
- package/dist/components/data-table/data-table-footer.js +10 -8
- package/dist/components/data-table/data-table-footer.js.map +1 -1
- package/dist/components/data-table/data-table-header-draggable.js +40 -36
- package/dist/components/data-table/data-table-header-draggable.js.map +1 -1
- package/dist/components/data-table/data-table-header.js +113 -99
- package/dist/components/data-table/data-table-header.js.map +1 -1
- package/dist/components/data-table/data-table-loading.js +21 -18
- package/dist/components/data-table/data-table-loading.js.map +1 -1
- package/dist/components/data-table/data-table-resize-handle.js +13 -11
- package/dist/components/data-table/data-table-resize-handle.js.map +1 -1
- package/dist/components/data-table/data-table-row.js +71 -59
- package/dist/components/data-table/data-table-row.js.map +1 -1
- package/dist/components/data-table/data-table-toolbar.js +9 -7
- package/dist/components/data-table/data-table-toolbar.js.map +1 -1
- package/dist/components/data-table/data-table.js +48 -46
- package/dist/components/data-table/data-table.js.map +1 -1
- package/dist/components/date-range-picker/date-range-picker.js +173 -164
- package/dist/components/date-range-picker/date-range-picker.js.map +1 -1
- package/dist/components/date-range-picker/range-calendar.js +36 -34
- package/dist/components/date-range-picker/range-calendar.js.map +1 -1
- package/dist/components/date-time-picker/calendar.js +290 -272
- package/dist/components/date-time-picker/calendar.js.map +1 -1
- package/dist/components/date-time-picker/date-time-picker-input.js +22 -20
- package/dist/components/date-time-picker/date-time-picker-input.js.map +1 -1
- package/dist/components/date-time-picker/date-time-picker-panel.js +126 -120
- package/dist/components/date-time-picker/date-time-picker-panel.js.map +1 -1
- package/dist/components/date-time-picker/date-time-picker.js +42 -40
- package/dist/components/date-time-picker/date-time-picker.js.map +1 -1
- package/dist/components/date-time-picker/time-picker.js +95 -87
- package/dist/components/date-time-picker/time-picker.js.map +1 -1
- package/dist/components/dialog/dialog.js +115 -95
- package/dist/components/dialog/dialog.js.map +1 -1
- package/dist/components/drawer/drawer.js +144 -109
- package/dist/components/drawer/drawer.js.map +1 -1
- package/dist/components/dropdown-menu/dropdown-menu.js +141 -112
- package/dist/components/dropdown-menu/dropdown-menu.js.map +1 -1
- package/dist/components/field/field-combobox.js +196 -176
- package/dist/components/field/field-combobox.js.map +1 -1
- package/dist/components/field/field.js +137 -126
- package/dist/components/field/field.js.map +1 -1
- package/dist/components/list/list.js +237 -219
- package/dist/components/list/list.js.map +1 -1
- package/dist/components/option-card/option-card.js +129 -116
- package/dist/components/option-card/option-card.js.map +1 -1
- package/dist/components/pill/pill.js +55 -51
- package/dist/components/pill/pill.js.map +1 -1
- package/dist/components/popover/popover.js +53 -36
- package/dist/components/popover/popover.js.map +1 -1
- package/dist/components/radio/radio.js +38 -34
- package/dist/components/radio/radio.js.map +1 -1
- package/dist/components/scroll-area/scroll-area.js +38 -35
- package/dist/components/scroll-area/scroll-area.js.map +1 -1
- package/dist/components/scroll-overflow/scroll-overflow.js +166 -151
- package/dist/components/scroll-overflow/scroll-overflow.js.map +1 -1
- package/dist/components/segmented-control/segmented-control.js +93 -85
- package/dist/components/segmented-control/segmented-control.js.map +1 -1
- package/dist/components/select/select.js +149 -128
- package/dist/components/select/select.js.map +1 -1
- package/dist/components/separator/separator.js +19 -16
- package/dist/components/separator/separator.js.map +1 -1
- package/dist/components/skeleton/skeleton.js +34 -30
- package/dist/components/skeleton/skeleton.js.map +1 -1
- package/dist/components/spinner/spinner.js +22 -17
- package/dist/components/spinner/spinner.js.map +1 -1
- package/dist/components/surface/surface.js +25 -22
- package/dist/components/surface/surface.js.map +1 -1
- package/dist/components/switch/switch.js +66 -57
- package/dist/components/switch/switch.js.map +1 -1
- package/dist/components/table/table-pagination.js +139 -129
- package/dist/components/table/table-pagination.js.map +1 -1
- package/dist/components/table/table.js +104 -90
- package/dist/components/table/table.js.map +1 -1
- package/dist/components/tabs/tabs.js +206 -128
- package/dist/components/tabs/tabs.js.map +1 -1
- package/dist/components/toast/toast.js +112 -100
- package/dist/components/toast/toast.js.map +1 -1
- package/dist/components/toggle/toggle.js +32 -30
- package/dist/components/toggle/toggle.js.map +1 -1
- package/dist/components/tooltip/tooltip.js +59 -46
- package/dist/components/tooltip/tooltip.js.map +1 -1
- package/dist/index.d.ts +12 -0
- package/dist/lib/clear-button.js +18 -17
- package/dist/lib/clear-button.js.map +1 -1
- package/dist/styles/host-reset.js +47 -0
- package/dist/styles/host-reset.js.map +1 -0
- package/dist/styles/overlay-layer.js +5 -0
- package/dist/styles/overlay-layer.js.map +1 -0
- package/dist/tokens.json +1 -1
- package/package.json +8 -6
- package/scripts/migration-diagnostics.mjs +42 -7
- package/scripts/migration-sweep.mjs +9 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"calendar.js","sources":["../../../src/components/date-time-picker/calendar.tsx"],"sourcesContent":["import * as React from \"react\"\nimport { isSameDay } from \"date-fns\"\nimport { mergeClasses, shorthands } from \"@epilot/zenith-runtime/v1\"\n\nimport { Button } from \"../button/button\"\nimport { SLOT_ATTR } from \"../../renderer/contract\"\nimport { makeZenithStyles } from \"../../styles/make-styles\"\nimport * as tokens from \"../../tokens\"\n\nimport type { DateTimePickerLocale } from \"./date-time-picker-utils\"\nimport {\n getCalendarDays,\n getWeekDays,\n formatMonth,\n isDateDisabled,\n isDayInCurrentMonth,\n isDaySelected,\n isDayToday,\n goToPreviousMonth,\n goToNextMonth,\n adjustTimeIfPast,\n getMonthNames,\n getDecadeStart,\n getWeekNumber,\n getWeekLabel,\n isDateInRange,\n normalizeRange,\n} from \"./date-time-picker-utils\"\n\nconst ChevronLeftIcon = (props: React.SVGProps<SVGSVGElement>) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n height=\"16px\"\n viewBox=\"0 -960 960 960\"\n width=\"16px\"\n fill=\"currentColor\"\n {...props}\n >\n <path d=\"M560-240 320-480l240-240 56 56-184 184 184 184-56 56Z\" />\n </svg>\n)\n\nconst ChevronRightIcon = (props: React.SVGProps<SVGSVGElement>) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n height=\"16px\"\n viewBox=\"0 -960 960 960\"\n width=\"16px\"\n fill=\"currentColor\"\n {...props}\n >\n <path d=\"M504-480 320-664l56-56 240 240-240 240-56-56 184-184Z\" />\n </svg>\n)\n\nexport type CalendarView = \"days\" | \"months\" | \"years\"\n\nexport type CalendarProps = {\n value: Date | null\n onChange: (date: Date) => void\n onDateSelect?: () => void\n disablePast?: boolean\n locale?: DateTimePickerLocale\n previousMonthLabel?: string\n nextMonthLabel?: string\n showTodayButton?: boolean\n todayLabel?: string\n currentTimeInTimezone?: Date\n showWeekNumbers?: boolean\n // Range mode props (optional - when provided, enables range highlighting)\n rangeStart?: Date | null\n rangeEnd?: Date | null\n hoveredDate?: Date | null\n onDayHover?: (day: Date | null) => void\n onDayClick?: (day: Date) => void\n showPreviousButton?: boolean\n showNextButton?: boolean\n controlledViewDate?: Date\n onViewDateChange?: (date: Date) => void\n // Replace prev/next-month overflow cells with empty placeholders — used by\n // RangeCalendar so adjacent panels don't render the same dates twice (which\n // would otherwise both pick up range styling and read as duplicates).\n hideOutOfMonthDays?: boolean\n className?: string\n}\n\nconst useStyles = makeZenithStyles({\n root: {\n width: \"100%\",\n },\n header: {\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n marginBottom: tokens.spacingElement2,\n },\n buttonSpacer: {\n width: \"1.75rem\",\n height: \"1.75rem\",\n },\n headerCenter: {\n display: \"flex\",\n alignItems: \"center\",\n ...shorthands.gap(tokens.spacingElement1),\n },\n headerBtn: {\n fontWeight: tokens.fontWeightSemibold,\n fontSize: tokens.textSm,\n lineHeight: tokens.leadingSm,\n color: tokens.grayA12,\n backgroundColor: tokens.grayA3,\n \":hover\": {\n backgroundColor: tokens.grayA4,\n },\n transitionProperty: \"background-color, color\",\n transitionDuration: \"150ms\",\n cursor: \"pointer\",\n ...shorthands.padding(\"0.25rem\", tokens.spacingElement2),\n ...shorthands.borderRadius(tokens.radiusMd),\n ...shorthands.border(\"0\"),\n outlineStyle: \"none\",\n },\n monthHeaderBtn: {\n textTransform: \"capitalize\",\n },\n decadeLabel: {\n fontWeight: tokens.fontWeightSemibold,\n fontSize: tokens.textSm,\n lineHeight: tokens.leadingSm,\n color: tokens.grayA12,\n ...shorthands.padding(\"0.25rem\", tokens.spacingElement2),\n },\n grid: {\n display: \"grid\",\n justifyItems: \"center\",\n ...shorthands.gap(\"0.125rem\"),\n gridTemplateColumns: \"repeat(7, minmax(0, 1fr))\",\n },\n gridWithWeeks: {\n gridTemplateColumns: \"auto repeat(7, minmax(0, 1fr))\",\n },\n gridRange: {\n rowGap: tokens.spacingElement1,\n columnGap: \"0\",\n },\n weekLabel: {\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n fontSize: tokens.textXs,\n lineHeight: tokens.leadingXs,\n fontWeight: tokens.fontWeightMedium,\n color: tokens.grayA11,\n height: \"1.75rem\",\n width: \"2rem\",\n },\n weekNumber: {\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n fontSize: tokens.textXs,\n lineHeight: tokens.leadingXs,\n fontWeight: tokens.fontWeightMedium,\n color: tokens.grayA11,\n height: \"2rem\",\n width: \"2rem\",\n },\n cellPlaceholder: {\n height: \"2rem\",\n width: \"2rem\",\n },\n dayBtn: {\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n fontSize: tokens.textSm,\n lineHeight: tokens.leadingSm,\n transitionProperty: \"background-color, color\",\n transitionDuration: \"150ms\",\n cursor: \"pointer\",\n height: \"2rem\",\n width: \"2rem\",\n ...shorthands.border(\"0\"),\n outlineStyle: \"none\",\n },\n dayBtnSingle: {\n ...shorthands.borderRadius(tokens.radiusMd),\n },\n dayBtnTransparent: {\n backgroundColor: \"transparent\",\n },\n dayBtnHover: {\n \":hover\": {\n backgroundColor: tokens.grayA4,\n },\n },\n dayBtnToday: {\n color: tokens.accentA11,\n textDecorationLine: \"underline\",\n textUnderlineOffset: \"4px\",\n textDecorationThickness: \"1.5px\",\n textDecorationColor: tokens.accentA11,\n },\n dayBtnSelected: {\n fontWeight: tokens.fontWeightSemibold,\n backgroundColor: tokens.accentSolid,\n color: tokens.accentContrast,\n \":hover\": {\n backgroundColor: tokens.accentSolidHover,\n },\n },\n dayBtnOutOfMonth: {\n color: tokens.grayA8,\n },\n dayBtnInMonth: {\n color: tokens.grayA12,\n },\n dayBtnDisabled: {\n opacity: 0.5,\n cursor: \"not-allowed\",\n },\n // Range styles\n dayBtnRangeSingleDay: {\n ...shorthands.borderRadius(tokens.radiusMd),\n backgroundColor: tokens.accentSolid,\n color: tokens.accentContrast,\n fontWeight: tokens.fontWeightSemibold,\n \":hover\": {\n backgroundColor: tokens.accentSolidHover,\n },\n },\n dayBtnRangeStart: {\n borderTopLeftRadius: tokens.radiusMd,\n borderBottomLeftRadius: tokens.radiusMd,\n borderTopRightRadius: 0,\n borderBottomRightRadius: 0,\n backgroundColor: tokens.accentSolid,\n color: tokens.accentContrast,\n fontWeight: tokens.fontWeightSemibold,\n \":hover\": {\n backgroundColor: tokens.accentSolidHover,\n },\n },\n dayBtnRangeEnd: {\n borderTopRightRadius: tokens.radiusMd,\n borderBottomRightRadius: tokens.radiusMd,\n borderTopLeftRadius: 0,\n borderBottomLeftRadius: 0,\n backgroundColor: tokens.accentSolid,\n color: tokens.accentContrast,\n fontWeight: tokens.fontWeightSemibold,\n \":hover\": {\n backgroundColor: tokens.accentSolidHover,\n },\n },\n dayBtnRangeMiddle: {\n ...shorthands.borderRadius(0),\n backgroundColor: tokens.accent3,\n color: tokens.grayA12,\n },\n dayBtnRangeMiddlePreview: {\n ...shorthands.borderRadius(0),\n backgroundColor: tokens.accentA3,\n color: tokens.grayA12,\n },\n todayContainer: {\n display: \"flex\",\n justifyContent: \"center\",\n paddingTop: tokens.spacingElement2,\n },\n monthsYearsGrid: {\n display: \"grid\",\n ...shorthands.gap(tokens.spacingElement2),\n ...shorthands.padding(tokens.spacingElement2, 0),\n },\n monthsGridCols: {\n gridTemplateColumns: \"repeat(3, 1fr)\",\n },\n yearsGridCols: {\n gridTemplateColumns: \"repeat(2, 1fr)\",\n },\n monthYearBtn: {\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n fontSize: tokens.textSm,\n lineHeight: tokens.leadingSm,\n ...shorthands.borderRadius(tokens.radiusMd),\n transitionProperty: \"background-color, color\",\n transitionDuration: \"150ms\",\n cursor: \"pointer\",\n height: \"2.25rem\",\n ...shorthands.border(\"0\"),\n outlineStyle: \"none\",\n },\n monthBtnCapitalize: {\n textTransform: \"capitalize\",\n },\n})\n\nexport const Calendar = React.forwardRef<HTMLDivElement, CalendarProps>(\n function Calendar(\n {\n value,\n onChange,\n onDateSelect,\n disablePast = false,\n locale = \"de\",\n previousMonthLabel = \"Previous month\",\n nextMonthLabel = \"Next month\",\n showTodayButton = false,\n todayLabel = \"Today\",\n currentTimeInTimezone,\n showWeekNumbers = false,\n rangeStart,\n rangeEnd,\n hoveredDate,\n onDayHover,\n onDayClick,\n showPreviousButton = true,\n showNextButton = true,\n controlledViewDate,\n onViewDateChange,\n hideOutOfMonthDays = false,\n className,\n },\n ref\n ) {\n const styles = useStyles()\n const [internalViewDate, setInternalViewDate] = React.useState(\n () => value || currentTimeInTimezone || new Date()\n )\n const [view, setView] = React.useState<CalendarView>(\"days\")\n\n const isRangeMode = rangeStart !== undefined\n const viewDate = controlledViewDate || internalViewDate\n const setViewDate = React.useCallback(\n (updater: Date | ((prev: Date) => Date)) => {\n if (onViewDateChange) {\n if (typeof updater === \"function\") {\n onViewDateChange(updater(viewDate))\n } else {\n onViewDateChange(updater)\n }\n } else {\n setInternalViewDate(updater)\n }\n },\n [onViewDateChange, viewDate]\n )\n\n const weekDays = getWeekDays(locale)\n const calendarDays = getCalendarDays(viewDate, locale)\n const monthNames = React.useMemo(() => getMonthNames(locale), [locale])\n\n const now = React.useMemo(\n () => currentTimeInTimezone || new Date(),\n [currentTimeInTimezone]\n )\n const currentYear = now.getFullYear()\n const currentMonth = now.getMonth()\n\n const viewYear = viewDate.getFullYear()\n const decadeStart = getDecadeStart(viewYear)\n\n // Navigation handlers\n const handlePrevious = React.useCallback(() => {\n setViewDate((prev) => {\n if (view === \"days\") return goToPreviousMonth(prev)\n if (view === \"months\")\n return new Date(prev.getFullYear() - 1, prev.getMonth(), 1)\n\n return new Date(prev.getFullYear() - 10, prev.getMonth(), 1)\n })\n }, [view, setViewDate])\n\n const handleNext = React.useCallback(() => {\n setViewDate((prev) => {\n if (view === \"days\") return goToNextMonth(prev)\n if (view === \"months\")\n return new Date(prev.getFullYear() + 1, prev.getMonth(), 1)\n\n return new Date(prev.getFullYear() + 10, prev.getMonth(), 1)\n })\n }, [view, setViewDate])\n\n const handleTodayClick = React.useCallback(() => {\n const today = new Date(now)\n\n if (value) {\n today.setHours(value.getHours(), value.getMinutes(), 0, 0)\n } else {\n today.setHours(0, 0, 0, 0)\n }\n\n const adjustedDate = adjustTimeIfPast(\n today,\n disablePast,\n currentTimeInTimezone\n )\n\n setViewDate(now)\n onChange(adjustedDate)\n onDateSelect?.()\n }, [\n onChange,\n onDateSelect,\n value,\n disablePast,\n currentTimeInTimezone,\n now,\n setViewDate,\n ])\n\n const handleDayClick = React.useCallback(\n (day: Date) => {\n if (isDateDisabled(day, disablePast, currentTimeInTimezone)) return\n\n // In range mode, delegate to parent handler\n if (onDayClick) {\n onDayClick(day)\n\n return\n }\n\n const newDate = new Date(day)\n\n if (value) {\n newDate.setHours(value.getHours(), value.getMinutes(), 0, 0)\n } else {\n newDate.setHours(0, 0, 0, 0)\n }\n\n const adjustedDate = adjustTimeIfPast(\n newDate,\n disablePast,\n currentTimeInTimezone\n )\n\n onChange(adjustedDate)\n onDateSelect?.()\n },\n [\n onChange,\n onDateSelect,\n onDayClick,\n value,\n disablePast,\n currentTimeInTimezone,\n ]\n )\n\n const handleMonthSelect = React.useCallback(\n (monthIndex: number) => {\n setViewDate((prev) => new Date(prev.getFullYear(), monthIndex, 1))\n setView(\"days\")\n },\n [setViewDate]\n )\n\n const handleYearSelect = React.useCallback(\n (year: number) => {\n setViewDate((prev) => new Date(year, prev.getMonth(), 1))\n setView(\"months\")\n },\n [setViewDate]\n )\n\n const handleMonthHeaderClick = React.useCallback(() => {\n setView(\"months\")\n }, [])\n\n const handleYearHeaderClick = React.useCallback(() => {\n setView(\"years\")\n }, [])\n\n return (\n <div\n ref={ref}\n className={mergeClasses(styles.root, className)}\n data-slot=\"calendar\"\n {...{ [SLOT_ATTR]: \"calendar\" }}\n onMouseLeave={onDayHover ? () => onDayHover(null) : undefined}\n >\n <div className={styles.header}>\n {showPreviousButton ? (\n <Button\n aria-label={previousMonthLabel}\n onClick={handlePrevious}\n size=\"icon\"\n variant=\"tertiary\"\n >\n <ChevronLeftIcon />\n </Button>\n ) : (\n <div className={styles.buttonSpacer} />\n )}\n <div className={styles.headerCenter}>\n {view === \"days\" && (\n <>\n <button\n className={mergeClasses(\n styles.headerBtn,\n styles.monthHeaderBtn\n )}\n onClick={handleMonthHeaderClick}\n type=\"button\"\n >\n {formatMonth(viewDate, locale)}\n </button>\n <button\n className={styles.headerBtn}\n onClick={handleYearHeaderClick}\n type=\"button\"\n >\n {viewYear}\n </button>\n </>\n )}\n {view === \"months\" && (\n <button\n className={styles.headerBtn}\n onClick={handleYearHeaderClick}\n type=\"button\"\n >\n {viewYear}\n </button>\n )}\n {view === \"years\" && (\n <span className={styles.decadeLabel}>\n {`${decadeStart} \\u2013 ${decadeStart + 9}`}\n </span>\n )}\n </div>\n {showNextButton ? (\n <Button\n aria-label={nextMonthLabel}\n onClick={handleNext}\n size=\"icon\"\n variant=\"tertiary\"\n >\n <ChevronRightIcon />\n </Button>\n ) : (\n <div className={styles.buttonSpacer} />\n )}\n </div>\n\n <div>\n {view === \"days\" && (\n <>\n <div\n className={mergeClasses(\n styles.grid,\n isRangeMode && styles.gridRange,\n showWeekNumbers && styles.gridWithWeeks\n )}\n data-slot=\"calendar-grid\"\n {...{ [SLOT_ATTR]: \"calendar-grid\" }}\n >\n {showWeekNumbers && (\n <div\n className={styles.weekLabel}\n data-slot=\"calendar-week-label\"\n {...{ [SLOT_ATTR]: \"calendar-week-label\" }}\n >\n {getWeekLabel(locale)}\n </div>\n )}\n {weekDays.map((day) => (\n <div\n className={styles.weekLabel}\n data-slot=\"calendar-weekday\"\n {...{ [SLOT_ATTR]: \"calendar-weekday\" }}\n key={day}\n >\n {day}\n </div>\n ))}\n\n {calendarDays.map((day, index) => {\n const weekLeading = showWeekNumbers && index % 7 === 0\n const rowIsAllOutOfMonth =\n hideOutOfMonthDays &&\n weekLeading &&\n calendarDays\n .slice(index, index + 7)\n .every((d) => !isDayInCurrentMonth(d, viewDate))\n const weekCell =\n weekLeading && !rowIsAllOutOfMonth ? (\n <div\n className={styles.weekNumber}\n data-slot=\"calendar-week-number\"\n {...{ [SLOT_ATTR]: \"calendar-week-number\" }}\n data-week={getWeekNumber(day)}\n key={`wk-${index}`}\n >\n {getWeekNumber(day)}\n </div>\n ) : weekLeading ? (\n <div\n aria-hidden=\"true\"\n className={styles.cellPlaceholder}\n data-slot=\"calendar-week-number-placeholder\"\n {...{ [SLOT_ATTR]: \"calendar-week-number-placeholder\" }}\n key={`wk-${index}`}\n />\n ) : null\n const isCurrentMonth = isDayInCurrentMonth(day, viewDate)\n\n // In range mode, skip rendering overflow days entirely so the\n // same date doesn't appear in two adjacent panels.\n if (hideOutOfMonthDays && !isCurrentMonth) {\n return (\n <React.Fragment key={index}>\n {weekCell}\n <div\n aria-hidden=\"true\"\n className={styles.cellPlaceholder}\n data-slot=\"calendar-day-placeholder\"\n {...{ [SLOT_ATTR]: \"calendar-day-placeholder\" }}\n />\n </React.Fragment>\n )\n }\n\n const isDisabled = isDateDisabled(\n day,\n disablePast,\n currentTimeInTimezone\n )\n const isSelected =\n !isRangeMode && value !== null && isDaySelected(day, value)\n const isCurrentDay = isDayToday(day)\n\n // Range mode calculations\n const effectiveEnd = rangeEnd || hoveredDate || null\n const hasRange = isRangeMode && rangeStart && effectiveEnd\n const inRange = hasRange\n ? isDateInRange(day, rangeStart!, effectiveEnd!)\n : false\n\n let isStart = false\n let isEnd = false\n let isSingleDay = false\n\n if (hasRange) {\n const normalized = normalizeRange(\n rangeStart!,\n effectiveEnd!\n )\n\n isStart = isSameDay(day, normalized.start)\n isEnd = isSameDay(day, normalized.end)\n isSingleDay = isStart && isEnd\n } else if (isRangeMode && rangeStart) {\n isStart = isSameDay(day, rangeStart)\n isSingleDay = isStart\n }\n\n const isEndpoint = isStart || isEnd\n const inRangeMiddle = inRange && !isStart && !isEnd\n const isPreviewRange =\n isRangeMode && !rangeEnd && !!hoveredDate\n\n let rangeOrSingleStyle = null\n if (!isRangeMode) {\n rangeOrSingleStyle = mergeClasses(\n styles.dayBtnSingle,\n !isSelected && !isCurrentDay && styles.dayBtnTransparent,\n !isSelected && styles.dayBtnHover,\n isCurrentDay && !isSelected && styles.dayBtnToday,\n isDisabled && styles.dayBtnDisabled,\n !isCurrentMonth &&\n !isDisabled &&\n !isSelected &&\n styles.dayBtnOutOfMonth,\n isSelected && styles.dayBtnSelected,\n isCurrentMonth &&\n !isSelected &&\n !isDisabled &&\n styles.dayBtnInMonth\n )\n } else {\n rangeOrSingleStyle = mergeClasses(\n isSingleDay && isEndpoint && styles.dayBtnRangeSingleDay,\n isStart && !isSingleDay && styles.dayBtnRangeStart,\n isEnd && !isStart && styles.dayBtnRangeEnd,\n inRangeMiddle &&\n !isPreviewRange &&\n styles.dayBtnRangeMiddle,\n inRangeMiddle &&\n isPreviewRange &&\n styles.dayBtnRangeMiddlePreview,\n !isEndpoint && !inRangeMiddle && styles.dayBtnSingle,\n !isEndpoint && !inRangeMiddle && styles.dayBtnTransparent,\n !isEndpoint && !inRangeMiddle && styles.dayBtnHover,\n isCurrentDay &&\n !isEndpoint &&\n !inRangeMiddle &&\n styles.dayBtnToday,\n isDisabled && styles.dayBtnDisabled,\n !isCurrentMonth &&\n !isDisabled &&\n !isEndpoint &&\n styles.dayBtnOutOfMonth,\n isCurrentMonth &&\n !isEndpoint &&\n !isDisabled &&\n styles.dayBtnInMonth\n )\n }\n\n return (\n <React.Fragment key={index}>\n {weekCell}\n <button\n aria-disabled={isDisabled}\n aria-pressed={isSelected || isEndpoint}\n className={mergeClasses(\n styles.dayBtn,\n rangeOrSingleStyle\n )}\n data-in-range={inRangeMiddle || undefined}\n data-selected={isSelected || isEndpoint}\n data-slot=\"calendar-day\"\n {...{ [SLOT_ATTR]: \"calendar-day\" }}\n data-today={isCurrentDay}\n disabled={isDisabled}\n onClick={() => handleDayClick(day)}\n onMouseEnter={\n onDayHover ? () => onDayHover(day) : undefined\n }\n type=\"button\"\n >\n {day.getDate()}\n </button>\n </React.Fragment>\n )\n })}\n </div>\n {showTodayButton && (\n <div\n className={styles.todayContainer}\n data-slot=\"calendar-today\"\n {...{ [SLOT_ATTR]: \"calendar-today\" }}\n >\n <Button\n onClick={handleTodayClick}\n size=\"xs\"\n variant=\"tertiary\"\n >\n {todayLabel}\n </Button>\n </div>\n )}\n </>\n )}\n\n {view === \"months\" && (\n <div\n className={mergeClasses(\n styles.monthsYearsGrid,\n styles.monthsGridCols\n )}\n data-slot=\"calendar-months\"\n {...{ [SLOT_ATTR]: \"calendar-months\" }}\n >\n {monthNames.map((name, index) => {\n const isSelected =\n value !== null &&\n viewYear === value.getFullYear() &&\n index === value.getMonth()\n const isCurrent =\n viewYear === currentYear && index === currentMonth\n const isPast =\n disablePast &&\n (viewYear < currentYear ||\n (viewYear === currentYear && index < currentMonth))\n\n return (\n <button\n className={mergeClasses(\n styles.monthYearBtn,\n styles.monthBtnCapitalize,\n !isSelected && !isCurrent && styles.dayBtnTransparent,\n !isSelected && styles.dayBtnHover,\n isCurrent && !isSelected && styles.dayBtnToday,\n isPast && styles.dayBtnDisabled,\n isSelected && styles.dayBtnSelected,\n !isSelected && !isPast && styles.dayBtnInMonth\n )}\n data-selected={isSelected}\n data-slot=\"calendar-month\"\n {...{ [SLOT_ATTR]: \"calendar-month\" }}\n disabled={isPast}\n key={index}\n onClick={() => handleMonthSelect(index)}\n type=\"button\"\n >\n {name}\n </button>\n )\n })}\n </div>\n )}\n\n {view === \"years\" && (\n <div\n className={mergeClasses(\n styles.monthsYearsGrid,\n styles.yearsGridCols\n )}\n data-slot=\"calendar-years\"\n {...{ [SLOT_ATTR]: \"calendar-years\" }}\n >\n {Array.from({ length: 10 }, (_, i) => {\n const year = decadeStart + i\n const isSelected =\n value !== null && year === value.getFullYear()\n const isCurrent = year === currentYear\n const isPast = disablePast && year < currentYear\n\n return (\n <button\n className={mergeClasses(\n styles.monthYearBtn,\n !isSelected && !isCurrent && styles.dayBtnTransparent,\n !isSelected && styles.dayBtnHover,\n isCurrent && !isSelected && styles.dayBtnToday,\n isPast && styles.dayBtnDisabled,\n isSelected && styles.dayBtnSelected,\n !isSelected && !isPast && styles.dayBtnInMonth\n )}\n data-selected={isSelected}\n data-slot=\"calendar-year\"\n {...{ [SLOT_ATTR]: \"calendar-year\" }}\n disabled={isPast}\n key={year}\n onClick={() => handleYearSelect(year)}\n type=\"button\"\n >\n {year}\n </button>\n )\n })}\n </div>\n )}\n </div>\n </div>\n )\n }\n)\n"],"names":["ChevronLeftIcon","props","jsx","ChevronRightIcon","useStyles","makeZenithStyles","tokens.spacingElement2","shorthands","tokens.spacingElement1","tokens.fontWeightSemibold","tokens.textSm","tokens.leadingSm","tokens.grayA12","tokens.grayA3","tokens.grayA4","tokens.radiusMd","tokens.textXs","tokens.leadingXs","tokens.fontWeightMedium","tokens.grayA11","tokens.accentA11","tokens.accentSolid","tokens.accentContrast","tokens.accentSolidHover","tokens.grayA8","tokens.accent3","tokens.accentA3","Calendar","React","value","onChange","onDateSelect","disablePast","locale","previousMonthLabel","nextMonthLabel","showTodayButton","todayLabel","currentTimeInTimezone","showWeekNumbers","rangeStart","rangeEnd","hoveredDate","onDayHover","onDayClick","showPreviousButton","showNextButton","controlledViewDate","onViewDateChange","hideOutOfMonthDays","className","ref","styles","internalViewDate","setInternalViewDate","view","setView","isRangeMode","viewDate","setViewDate","updater","weekDays","getWeekDays","calendarDays","getCalendarDays","monthNames","getMonthNames","now","currentYear","currentMonth","viewYear","decadeStart","getDecadeStart","handlePrevious","prev","goToPreviousMonth","handleNext","goToNextMonth","handleTodayClick","today","adjustedDate","adjustTimeIfPast","handleDayClick","day","isDateDisabled","newDate","handleMonthSelect","monthIndex","handleYearSelect","year","handleMonthHeaderClick","handleYearHeaderClick","jsxs","mergeClasses","SLOT_ATTR","Button","Fragment","formatMonth","createElement","index","weekLeading","rowIsAllOutOfMonth","d","isDayInCurrentMonth","weekCell","getWeekNumber","isCurrentMonth","isDisabled","isSelected","isDaySelected","isCurrentDay","isDayToday","effectiveEnd","hasRange","inRange","isDateInRange","isStart","isEnd","isSingleDay","normalized","normalizeRange","isSameDay","isEndpoint","inRangeMiddle","isPreviewRange","rangeOrSingleStyle","name","isCurrent","isPast","_","i"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"calendar.js","sources":["../../../src/components/date-time-picker/calendar.tsx"],"sourcesContent":["import * as React from \"react\"\nimport { isSameDay } from \"date-fns\"\nimport { mergeClasses, shorthands } from \"@epilot/zenith-runtime/v1\"\n\nimport { Button } from \"../button/button\"\nimport { SLOT_ATTR } from \"../../renderer/contract\"\nimport { makeZenithStyles } from \"../../styles/make-styles\"\nimport { boxModel, nativeControl } from \"../../styles/host-reset\"\nimport * as tokens from \"../../tokens\"\n\nimport type { DateTimePickerLocale } from \"./date-time-picker-utils\"\nimport {\n getCalendarDays,\n getWeekDays,\n formatMonth,\n isDateDisabled,\n isDayInCurrentMonth,\n isDaySelected,\n isDayToday,\n goToPreviousMonth,\n goToNextMonth,\n adjustTimeIfPast,\n getMonthNames,\n getDecadeStart,\n getWeekNumber,\n getWeekLabel,\n isDateInRange,\n normalizeRange,\n} from \"./date-time-picker-utils\"\n\nconst ChevronLeftIcon = (props: React.SVGProps<SVGSVGElement>) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n height=\"16px\"\n viewBox=\"0 -960 960 960\"\n width=\"16px\"\n fill=\"currentColor\"\n {...props}\n >\n <path d=\"M560-240 320-480l240-240 56 56-184 184 184 184-56 56Z\" />\n </svg>\n)\n\nconst ChevronRightIcon = (props: React.SVGProps<SVGSVGElement>) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n height=\"16px\"\n viewBox=\"0 -960 960 960\"\n width=\"16px\"\n fill=\"currentColor\"\n {...props}\n >\n <path d=\"M504-480 320-664l56-56 240 240-240 240-56-56 184-184Z\" />\n </svg>\n)\n\nexport type CalendarView = \"days\" | \"months\" | \"years\"\n\nexport type CalendarProps = {\n value: Date | null\n onChange: (date: Date) => void\n onDateSelect?: () => void\n disablePast?: boolean\n locale?: DateTimePickerLocale\n previousMonthLabel?: string\n nextMonthLabel?: string\n showTodayButton?: boolean\n todayLabel?: string\n currentTimeInTimezone?: Date\n showWeekNumbers?: boolean\n // Range mode props (optional - when provided, enables range highlighting)\n rangeStart?: Date | null\n rangeEnd?: Date | null\n hoveredDate?: Date | null\n onDayHover?: (day: Date | null) => void\n onDayClick?: (day: Date) => void\n showPreviousButton?: boolean\n showNextButton?: boolean\n controlledViewDate?: Date\n onViewDateChange?: (date: Date) => void\n // Replace prev/next-month overflow cells with empty placeholders — used by\n // RangeCalendar so adjacent panels don't render the same dates twice (which\n // would otherwise both pick up range styling and read as duplicates).\n hideOutOfMonthDays?: boolean\n className?: string\n}\n\nconst useStyles = makeZenithStyles({\n root: {\n ...boxModel,\n width: \"100%\",\n },\n header: {\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n marginBottom: tokens.spacingElement2,\n },\n buttonSpacer: {\n ...boxModel,\n width: \"1.75rem\",\n height: \"1.75rem\",\n },\n headerCenter: {\n display: \"flex\",\n alignItems: \"center\",\n ...shorthands.gap(tokens.spacingElement1),\n },\n headerBtn: {\n ...nativeControl,\n fontWeight: tokens.fontWeightSemibold,\n fontSize: tokens.textSm,\n lineHeight: tokens.leadingSm,\n color: tokens.grayA12,\n backgroundColor: tokens.grayA3,\n \":hover\": {\n backgroundColor: tokens.grayA4,\n },\n transitionProperty: \"background-color, color\",\n transitionDuration: \"150ms\",\n cursor: \"pointer\",\n ...shorthands.padding(\"0.25rem\", tokens.spacingElement2),\n ...shorthands.borderRadius(tokens.radiusMd),\n ...shorthands.border(\"0\"),\n outlineStyle: \"none\",\n },\n monthHeaderBtn: {\n textTransform: \"capitalize\",\n },\n decadeLabel: {\n ...boxModel,\n fontWeight: tokens.fontWeightSemibold,\n fontSize: tokens.textSm,\n lineHeight: tokens.leadingSm,\n color: tokens.grayA12,\n ...shorthands.padding(\"0.25rem\", tokens.spacingElement2),\n },\n grid: {\n display: \"grid\",\n justifyItems: \"center\",\n ...shorthands.gap(\"0.125rem\"),\n gridTemplateColumns: \"repeat(7, minmax(0, 1fr))\",\n },\n gridWithWeeks: {\n gridTemplateColumns: \"auto repeat(7, minmax(0, 1fr))\",\n },\n gridRange: {\n rowGap: tokens.spacingElement1,\n columnGap: \"0\",\n },\n weekLabel: {\n ...boxModel,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n fontSize: tokens.textXs,\n lineHeight: tokens.leadingXs,\n fontWeight: tokens.fontWeightMedium,\n color: tokens.grayA11,\n height: \"1.75rem\",\n width: \"2rem\",\n },\n weekNumber: {\n ...boxModel,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n fontSize: tokens.textXs,\n lineHeight: tokens.leadingXs,\n fontWeight: tokens.fontWeightMedium,\n color: tokens.grayA11,\n height: \"2rem\",\n width: \"2rem\",\n },\n cellPlaceholder: {\n ...boxModel,\n height: \"2rem\",\n width: \"2rem\",\n },\n dayBtn: {\n ...nativeControl,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n fontSize: tokens.textSm,\n lineHeight: tokens.leadingSm,\n transitionProperty: \"background-color, color\",\n transitionDuration: \"150ms\",\n cursor: \"pointer\",\n height: \"2rem\",\n width: \"2rem\",\n ...shorthands.border(\"0\"),\n outlineStyle: \"none\",\n },\n dayBtnSingle: {\n ...boxModel,\n ...shorthands.borderRadius(tokens.radiusMd),\n },\n dayBtnTransparent: {\n backgroundColor: \"transparent\",\n },\n dayBtnHover: {\n \":hover\": {\n backgroundColor: tokens.grayA4,\n },\n },\n dayBtnToday: {\n color: tokens.accentA11,\n textDecorationLine: \"underline\",\n textUnderlineOffset: \"4px\",\n textDecorationThickness: \"1.5px\",\n textDecorationColor: tokens.accentA11,\n },\n dayBtnSelected: {\n fontWeight: tokens.fontWeightSemibold,\n backgroundColor: tokens.accentSolid,\n color: tokens.accentContrast,\n \":hover\": {\n backgroundColor: tokens.accentSolidHover,\n },\n },\n dayBtnOutOfMonth: {\n color: tokens.grayA8,\n },\n dayBtnInMonth: {\n color: tokens.grayA12,\n },\n dayBtnDisabled: {\n opacity: 0.5,\n cursor: \"not-allowed\",\n },\n // Range styles\n dayBtnRangeSingleDay: {\n ...boxModel,\n ...shorthands.borderRadius(tokens.radiusMd),\n backgroundColor: tokens.accentSolid,\n color: tokens.accentContrast,\n fontWeight: tokens.fontWeightSemibold,\n \":hover\": {\n backgroundColor: tokens.accentSolidHover,\n },\n },\n dayBtnRangeStart: {\n ...boxModel,\n borderTopLeftRadius: tokens.radiusMd,\n borderBottomLeftRadius: tokens.radiusMd,\n borderTopRightRadius: 0,\n borderBottomRightRadius: 0,\n backgroundColor: tokens.accentSolid,\n color: tokens.accentContrast,\n fontWeight: tokens.fontWeightSemibold,\n \":hover\": {\n backgroundColor: tokens.accentSolidHover,\n },\n },\n dayBtnRangeEnd: {\n ...boxModel,\n borderTopRightRadius: tokens.radiusMd,\n borderBottomRightRadius: tokens.radiusMd,\n borderTopLeftRadius: 0,\n borderBottomLeftRadius: 0,\n backgroundColor: tokens.accentSolid,\n color: tokens.accentContrast,\n fontWeight: tokens.fontWeightSemibold,\n \":hover\": {\n backgroundColor: tokens.accentSolidHover,\n },\n },\n dayBtnRangeMiddle: {\n ...boxModel,\n ...shorthands.borderRadius(0),\n backgroundColor: tokens.accent3,\n color: tokens.grayA12,\n },\n dayBtnRangeMiddlePreview: {\n ...boxModel,\n ...shorthands.borderRadius(0),\n backgroundColor: tokens.accentA3,\n color: tokens.grayA12,\n },\n todayContainer: {\n ...boxModel,\n display: \"flex\",\n justifyContent: \"center\",\n paddingTop: tokens.spacingElement2,\n },\n monthsYearsGrid: {\n ...boxModel,\n display: \"grid\",\n ...shorthands.gap(tokens.spacingElement2),\n ...shorthands.padding(tokens.spacingElement2, 0),\n },\n monthsGridCols: {\n gridTemplateColumns: \"repeat(3, 1fr)\",\n },\n yearsGridCols: {\n gridTemplateColumns: \"repeat(2, 1fr)\",\n },\n monthYearBtn: {\n ...nativeControl,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n fontSize: tokens.textSm,\n lineHeight: tokens.leadingSm,\n ...shorthands.borderRadius(tokens.radiusMd),\n transitionProperty: \"background-color, color\",\n transitionDuration: \"150ms\",\n cursor: \"pointer\",\n height: \"2.25rem\",\n ...shorthands.border(\"0\"),\n outlineStyle: \"none\",\n },\n monthBtnCapitalize: {\n textTransform: \"capitalize\",\n },\n})\n\nexport const Calendar = React.forwardRef<HTMLDivElement, CalendarProps>(\n function Calendar(\n {\n value,\n onChange,\n onDateSelect,\n disablePast = false,\n locale = \"de\",\n previousMonthLabel = \"Previous month\",\n nextMonthLabel = \"Next month\",\n showTodayButton = false,\n todayLabel = \"Today\",\n currentTimeInTimezone,\n showWeekNumbers = false,\n rangeStart,\n rangeEnd,\n hoveredDate,\n onDayHover,\n onDayClick,\n showPreviousButton = true,\n showNextButton = true,\n controlledViewDate,\n onViewDateChange,\n hideOutOfMonthDays = false,\n className,\n },\n ref\n ) {\n const styles = useStyles()\n const [internalViewDate, setInternalViewDate] = React.useState(\n () => value || currentTimeInTimezone || new Date()\n )\n const [view, setView] = React.useState<CalendarView>(\"days\")\n\n const isRangeMode = rangeStart !== undefined\n const viewDate = controlledViewDate || internalViewDate\n const setViewDate = React.useCallback(\n (updater: Date | ((prev: Date) => Date)) => {\n if (onViewDateChange) {\n if (typeof updater === \"function\") {\n onViewDateChange(updater(viewDate))\n } else {\n onViewDateChange(updater)\n }\n } else {\n setInternalViewDate(updater)\n }\n },\n [onViewDateChange, viewDate]\n )\n\n const weekDays = getWeekDays(locale)\n const calendarDays = getCalendarDays(viewDate, locale)\n const monthNames = React.useMemo(() => getMonthNames(locale), [locale])\n\n const now = React.useMemo(\n () => currentTimeInTimezone || new Date(),\n [currentTimeInTimezone]\n )\n const currentYear = now.getFullYear()\n const currentMonth = now.getMonth()\n\n const viewYear = viewDate.getFullYear()\n const decadeStart = getDecadeStart(viewYear)\n\n // Navigation handlers\n const handlePrevious = React.useCallback(() => {\n setViewDate((prev) => {\n if (view === \"days\") return goToPreviousMonth(prev)\n if (view === \"months\")\n return new Date(prev.getFullYear() - 1, prev.getMonth(), 1)\n\n return new Date(prev.getFullYear() - 10, prev.getMonth(), 1)\n })\n }, [view, setViewDate])\n\n const handleNext = React.useCallback(() => {\n setViewDate((prev) => {\n if (view === \"days\") return goToNextMonth(prev)\n if (view === \"months\")\n return new Date(prev.getFullYear() + 1, prev.getMonth(), 1)\n\n return new Date(prev.getFullYear() + 10, prev.getMonth(), 1)\n })\n }, [view, setViewDate])\n\n const handleTodayClick = React.useCallback(() => {\n const today = new Date(now)\n\n if (value) {\n today.setHours(value.getHours(), value.getMinutes(), 0, 0)\n } else {\n today.setHours(0, 0, 0, 0)\n }\n\n const adjustedDate = adjustTimeIfPast(\n today,\n disablePast,\n currentTimeInTimezone\n )\n\n setViewDate(now)\n onChange(adjustedDate)\n onDateSelect?.()\n }, [\n onChange,\n onDateSelect,\n value,\n disablePast,\n currentTimeInTimezone,\n now,\n setViewDate,\n ])\n\n const handleDayClick = React.useCallback(\n (day: Date) => {\n if (isDateDisabled(day, disablePast, currentTimeInTimezone)) return\n\n // In range mode, delegate to parent handler\n if (onDayClick) {\n onDayClick(day)\n\n return\n }\n\n const newDate = new Date(day)\n\n if (value) {\n newDate.setHours(value.getHours(), value.getMinutes(), 0, 0)\n } else {\n newDate.setHours(0, 0, 0, 0)\n }\n\n const adjustedDate = adjustTimeIfPast(\n newDate,\n disablePast,\n currentTimeInTimezone\n )\n\n onChange(adjustedDate)\n onDateSelect?.()\n },\n [\n onChange,\n onDateSelect,\n onDayClick,\n value,\n disablePast,\n currentTimeInTimezone,\n ]\n )\n\n const handleMonthSelect = React.useCallback(\n (monthIndex: number) => {\n setViewDate((prev) => new Date(prev.getFullYear(), monthIndex, 1))\n setView(\"days\")\n },\n [setViewDate]\n )\n\n const handleYearSelect = React.useCallback(\n (year: number) => {\n setViewDate((prev) => new Date(year, prev.getMonth(), 1))\n setView(\"months\")\n },\n [setViewDate]\n )\n\n const handleMonthHeaderClick = React.useCallback(() => {\n setView(\"months\")\n }, [])\n\n const handleYearHeaderClick = React.useCallback(() => {\n setView(\"years\")\n }, [])\n\n return (\n <div\n ref={ref}\n className={mergeClasses(styles.root, className)}\n data-slot=\"calendar\"\n {...{ [SLOT_ATTR]: \"calendar\" }}\n onMouseLeave={onDayHover ? () => onDayHover(null) : undefined}\n >\n <div className={styles.header}>\n {showPreviousButton ? (\n <Button\n aria-label={previousMonthLabel}\n onClick={handlePrevious}\n size=\"icon\"\n variant=\"tertiary\"\n >\n <ChevronLeftIcon />\n </Button>\n ) : (\n <div className={styles.buttonSpacer} />\n )}\n <div className={styles.headerCenter}>\n {view === \"days\" && (\n <>\n <button\n className={mergeClasses(\n styles.headerBtn,\n styles.monthHeaderBtn\n )}\n onClick={handleMonthHeaderClick}\n type=\"button\"\n >\n {formatMonth(viewDate, locale)}\n </button>\n <button\n className={styles.headerBtn}\n onClick={handleYearHeaderClick}\n type=\"button\"\n >\n {viewYear}\n </button>\n </>\n )}\n {view === \"months\" && (\n <button\n className={styles.headerBtn}\n onClick={handleYearHeaderClick}\n type=\"button\"\n >\n {viewYear}\n </button>\n )}\n {view === \"years\" && (\n <span className={styles.decadeLabel}>\n {`${decadeStart} \\u2013 ${decadeStart + 9}`}\n </span>\n )}\n </div>\n {showNextButton ? (\n <Button\n aria-label={nextMonthLabel}\n onClick={handleNext}\n size=\"icon\"\n variant=\"tertiary\"\n >\n <ChevronRightIcon />\n </Button>\n ) : (\n <div className={styles.buttonSpacer} />\n )}\n </div>\n\n <div>\n {view === \"days\" && (\n <>\n <div\n className={mergeClasses(\n styles.grid,\n isRangeMode && styles.gridRange,\n showWeekNumbers && styles.gridWithWeeks\n )}\n data-slot=\"calendar-grid\"\n {...{ [SLOT_ATTR]: \"calendar-grid\" }}\n >\n {showWeekNumbers && (\n <div\n className={styles.weekLabel}\n data-slot=\"calendar-week-label\"\n {...{ [SLOT_ATTR]: \"calendar-week-label\" }}\n >\n {getWeekLabel(locale)}\n </div>\n )}\n {weekDays.map((day) => (\n <div\n className={styles.weekLabel}\n data-slot=\"calendar-weekday\"\n {...{ [SLOT_ATTR]: \"calendar-weekday\" }}\n key={day}\n >\n {day}\n </div>\n ))}\n\n {calendarDays.map((day, index) => {\n const weekLeading = showWeekNumbers && index % 7 === 0\n const rowIsAllOutOfMonth =\n hideOutOfMonthDays &&\n weekLeading &&\n calendarDays\n .slice(index, index + 7)\n .every((d) => !isDayInCurrentMonth(d, viewDate))\n const weekCell =\n weekLeading && !rowIsAllOutOfMonth ? (\n <div\n className={styles.weekNumber}\n data-slot=\"calendar-week-number\"\n {...{ [SLOT_ATTR]: \"calendar-week-number\" }}\n data-week={getWeekNumber(day)}\n key={`wk-${index}`}\n >\n {getWeekNumber(day)}\n </div>\n ) : weekLeading ? (\n <div\n aria-hidden=\"true\"\n className={styles.cellPlaceholder}\n data-slot=\"calendar-week-number-placeholder\"\n {...{ [SLOT_ATTR]: \"calendar-week-number-placeholder\" }}\n key={`wk-${index}`}\n />\n ) : null\n const isCurrentMonth = isDayInCurrentMonth(day, viewDate)\n\n // In range mode, skip rendering overflow days entirely so the\n // same date doesn't appear in two adjacent panels.\n if (hideOutOfMonthDays && !isCurrentMonth) {\n return (\n <React.Fragment key={index}>\n {weekCell}\n <div\n aria-hidden=\"true\"\n className={styles.cellPlaceholder}\n data-slot=\"calendar-day-placeholder\"\n {...{ [SLOT_ATTR]: \"calendar-day-placeholder\" }}\n />\n </React.Fragment>\n )\n }\n\n const isDisabled = isDateDisabled(\n day,\n disablePast,\n currentTimeInTimezone\n )\n const isSelected =\n !isRangeMode && value !== null && isDaySelected(day, value)\n const isCurrentDay = isDayToday(day)\n\n // Range mode calculations\n const effectiveEnd = rangeEnd || hoveredDate || null\n const hasRange = isRangeMode && rangeStart && effectiveEnd\n const inRange = hasRange\n ? isDateInRange(day, rangeStart!, effectiveEnd!)\n : false\n\n let isStart = false\n let isEnd = false\n let isSingleDay = false\n\n if (hasRange) {\n const normalized = normalizeRange(\n rangeStart!,\n effectiveEnd!\n )\n\n isStart = isSameDay(day, normalized.start)\n isEnd = isSameDay(day, normalized.end)\n isSingleDay = isStart && isEnd\n } else if (isRangeMode && rangeStart) {\n isStart = isSameDay(day, rangeStart)\n isSingleDay = isStart\n }\n\n const isEndpoint = isStart || isEnd\n const inRangeMiddle = inRange && !isStart && !isEnd\n const isPreviewRange =\n isRangeMode && !rangeEnd && !!hoveredDate\n\n let rangeOrSingleStyle = null\n if (!isRangeMode) {\n rangeOrSingleStyle = mergeClasses(\n styles.dayBtnSingle,\n !isSelected && !isCurrentDay && styles.dayBtnTransparent,\n !isSelected && styles.dayBtnHover,\n isCurrentDay && !isSelected && styles.dayBtnToday,\n isDisabled && styles.dayBtnDisabled,\n !isCurrentMonth &&\n !isDisabled &&\n !isSelected &&\n styles.dayBtnOutOfMonth,\n isSelected && styles.dayBtnSelected,\n isCurrentMonth &&\n !isSelected &&\n !isDisabled &&\n styles.dayBtnInMonth\n )\n } else {\n rangeOrSingleStyle = mergeClasses(\n isSingleDay && isEndpoint && styles.dayBtnRangeSingleDay,\n isStart && !isSingleDay && styles.dayBtnRangeStart,\n isEnd && !isStart && styles.dayBtnRangeEnd,\n inRangeMiddle &&\n !isPreviewRange &&\n styles.dayBtnRangeMiddle,\n inRangeMiddle &&\n isPreviewRange &&\n styles.dayBtnRangeMiddlePreview,\n !isEndpoint && !inRangeMiddle && styles.dayBtnSingle,\n !isEndpoint && !inRangeMiddle && styles.dayBtnTransparent,\n !isEndpoint && !inRangeMiddle && styles.dayBtnHover,\n isCurrentDay &&\n !isEndpoint &&\n !inRangeMiddle &&\n styles.dayBtnToday,\n isDisabled && styles.dayBtnDisabled,\n !isCurrentMonth &&\n !isDisabled &&\n !isEndpoint &&\n styles.dayBtnOutOfMonth,\n isCurrentMonth &&\n !isEndpoint &&\n !isDisabled &&\n styles.dayBtnInMonth\n )\n }\n\n return (\n <React.Fragment key={index}>\n {weekCell}\n <button\n aria-disabled={isDisabled}\n aria-pressed={isSelected || isEndpoint}\n className={mergeClasses(\n styles.dayBtn,\n rangeOrSingleStyle\n )}\n data-in-range={inRangeMiddle || undefined}\n data-selected={isSelected || isEndpoint}\n data-slot=\"calendar-day\"\n {...{ [SLOT_ATTR]: \"calendar-day\" }}\n data-today={isCurrentDay}\n disabled={isDisabled}\n onClick={() => handleDayClick(day)}\n onMouseEnter={\n onDayHover ? () => onDayHover(day) : undefined\n }\n type=\"button\"\n >\n {day.getDate()}\n </button>\n </React.Fragment>\n )\n })}\n </div>\n {showTodayButton && (\n <div\n className={styles.todayContainer}\n data-slot=\"calendar-today\"\n {...{ [SLOT_ATTR]: \"calendar-today\" }}\n >\n <Button\n onClick={handleTodayClick}\n size=\"xs\"\n variant=\"tertiary\"\n >\n {todayLabel}\n </Button>\n </div>\n )}\n </>\n )}\n\n {view === \"months\" && (\n <div\n className={mergeClasses(\n styles.monthsYearsGrid,\n styles.monthsGridCols\n )}\n data-slot=\"calendar-months\"\n {...{ [SLOT_ATTR]: \"calendar-months\" }}\n >\n {monthNames.map((name, index) => {\n const isSelected =\n value !== null &&\n viewYear === value.getFullYear() &&\n index === value.getMonth()\n const isCurrent =\n viewYear === currentYear && index === currentMonth\n const isPast =\n disablePast &&\n (viewYear < currentYear ||\n (viewYear === currentYear && index < currentMonth))\n\n return (\n <button\n className={mergeClasses(\n styles.monthYearBtn,\n styles.monthBtnCapitalize,\n !isSelected && !isCurrent && styles.dayBtnTransparent,\n !isSelected && styles.dayBtnHover,\n isCurrent && !isSelected && styles.dayBtnToday,\n isPast && styles.dayBtnDisabled,\n isSelected && styles.dayBtnSelected,\n !isSelected && !isPast && styles.dayBtnInMonth\n )}\n data-selected={isSelected}\n data-slot=\"calendar-month\"\n {...{ [SLOT_ATTR]: \"calendar-month\" }}\n disabled={isPast}\n key={index}\n onClick={() => handleMonthSelect(index)}\n type=\"button\"\n >\n {name}\n </button>\n )\n })}\n </div>\n )}\n\n {view === \"years\" && (\n <div\n className={mergeClasses(\n styles.monthsYearsGrid,\n styles.yearsGridCols\n )}\n data-slot=\"calendar-years\"\n {...{ [SLOT_ATTR]: \"calendar-years\" }}\n >\n {Array.from({ length: 10 }, (_, i) => {\n const year = decadeStart + i\n const isSelected =\n value !== null && year === value.getFullYear()\n const isCurrent = year === currentYear\n const isPast = disablePast && year < currentYear\n\n return (\n <button\n className={mergeClasses(\n styles.monthYearBtn,\n !isSelected && !isCurrent && styles.dayBtnTransparent,\n !isSelected && styles.dayBtnHover,\n isCurrent && !isSelected && styles.dayBtnToday,\n isPast && styles.dayBtnDisabled,\n isSelected && styles.dayBtnSelected,\n !isSelected && !isPast && styles.dayBtnInMonth\n )}\n data-selected={isSelected}\n data-slot=\"calendar-year\"\n {...{ [SLOT_ATTR]: \"calendar-year\" }}\n disabled={isPast}\n key={year}\n onClick={() => handleYearSelect(year)}\n type=\"button\"\n >\n {year}\n </button>\n )\n })}\n </div>\n )}\n </div>\n </div>\n )\n }\n)\n"],"names":["ChevronLeftIcon","props","jsx","ChevronRightIcon","useStyles","makeZenithStyles","boxModel","tokens.spacingElement2","shorthands","tokens.spacingElement1","nativeControl","tokens.fontWeightSemibold","tokens.textSm","tokens.leadingSm","tokens.grayA12","tokens.grayA3","tokens.grayA4","tokens.radiusMd","tokens.textXs","tokens.leadingXs","tokens.fontWeightMedium","tokens.grayA11","tokens.accentA11","tokens.accentSolid","tokens.accentContrast","tokens.accentSolidHover","tokens.grayA8","tokens.accent3","tokens.accentA3","Calendar","React","value","onChange","onDateSelect","disablePast","locale","previousMonthLabel","nextMonthLabel","showTodayButton","todayLabel","currentTimeInTimezone","showWeekNumbers","rangeStart","rangeEnd","hoveredDate","onDayHover","onDayClick","showPreviousButton","showNextButton","controlledViewDate","onViewDateChange","hideOutOfMonthDays","className","ref","styles","internalViewDate","setInternalViewDate","view","setView","isRangeMode","viewDate","setViewDate","updater","weekDays","getWeekDays","calendarDays","getCalendarDays","monthNames","getMonthNames","now","currentYear","currentMonth","viewYear","decadeStart","getDecadeStart","handlePrevious","prev","goToPreviousMonth","handleNext","goToNextMonth","handleTodayClick","today","adjustedDate","adjustTimeIfPast","handleDayClick","day","isDateDisabled","newDate","handleMonthSelect","monthIndex","handleYearSelect","year","handleMonthHeaderClick","handleYearHeaderClick","jsxs","mergeClasses","SLOT_ATTR","Button","Fragment","formatMonth","createElement","index","weekLeading","rowIsAllOutOfMonth","d","isDayInCurrentMonth","weekCell","getWeekNumber","isCurrentMonth","isDisabled","isSelected","isDaySelected","isCurrentDay","isDayToday","effectiveEnd","hasRange","inRange","isDateInRange","isStart","isEnd","isSingleDay","normalized","normalizeRange","isSameDay","isEndpoint","inRangeMiddle","isPreviewRange","rangeOrSingleStyle","name","isCurrent","isPast","_","i"],"mappings":"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"}
|
|
@@ -6,9 +6,10 @@ import { Button as N } from "../button/button.js";
|
|
|
6
6
|
import { FieldInputGroup as j, FieldInput as R, FieldGroupAddon as z } from "../field/field.js";
|
|
7
7
|
import { PopoverTrigger as L, PopoverAnchor as se } from "../popover/popover.js";
|
|
8
8
|
import { makeZenithStyles as le } from "../../styles/make-styles.js";
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
|
|
9
|
+
import { boxModel as re } from "../../styles/host-reset.js";
|
|
10
|
+
import { useDateTimePickerContext as oe } from "./date-time-picker-context.js";
|
|
11
|
+
import { formatDateTimeDisplay as V, parseDateTimeInput as ie } from "./date-time-picker-utils.js";
|
|
12
|
+
const ce = (r) => /* @__PURE__ */ s(
|
|
12
13
|
"svg",
|
|
13
14
|
{
|
|
14
15
|
xmlns: "http://www.w3.org/2000/svg",
|
|
@@ -19,14 +20,14 @@ const ie = (r) => /* @__PURE__ */ s(
|
|
|
19
20
|
...r,
|
|
20
21
|
children: /* @__PURE__ */ s("path", { d: "M200-80q-33 0-56.5-23.5T120-160v-560q0-33 23.5-56.5T200-800h40v-80h80v80h320v-80h80v80h40q33 0 56.5 23.5T840-720v560q0 33-23.5 56.5T760-80H200Zm0-80h560v-400H200v400Zm0-480h560v-80H200v80Zm0 0v-80 80Zm280 240q-17 0-28.5-11.5T440-440q0-17 11.5-28.5T480-480q17 0 28.5 11.5T520-440q0 17-11.5 28.5T480-400Zm-160 0q-17 0-28.5-11.5T280-440q0-17 11.5-28.5T320-480q17 0 28.5 11.5T360-440q0 17-11.5 28.5T320-400Zm320 0q-17 0-28.5-11.5T600-440q0-17 11.5-28.5T640-480q17 0 28.5 11.5T680-440q0 17-11.5 28.5T640-400ZM480-240q-17 0-28.5-11.5T440-280q0-17 11.5-28.5T480-320q17 0 28.5 11.5T520-280q0 17-11.5 28.5T480-240Zm-160 0q-17 0-28.5-11.5T280-280q0-17 11.5-28.5T320-320q17 0 28.5 11.5T360-280q0 17-11.5 28.5T320-240Zm320 0q-17 0-28.5-11.5T600-280q0-17 11.5-28.5T640-320q17 0 28.5 11.5T680-280q0 17-11.5 28.5T640-240Z" })
|
|
21
22
|
}
|
|
22
|
-
),
|
|
23
|
+
), ue = /\d/g, de = "dd.MM.yyyy", me = "dd.MM.yyyy HH:mm", pe = (r) => {
|
|
23
24
|
const f = r ? 12 : 8;
|
|
24
25
|
return (i) => {
|
|
25
26
|
const n = i.replace(/\D/g, "").slice(0, f);
|
|
26
27
|
let t = "", e = 0;
|
|
27
28
|
return t += (n[e++] || "_") + (n[e++] || "_"), t += ".", t += (n[e++] || "_") + (n[e++] || "_"), t += ".", t += (n[e++] || "_") + (n[e++] || "_") + (n[e++] || "_") + (n[e++] || "_"), r && (t += " ", t += (n[e++] || "_") + (n[e++] || "_"), t += ":", t += (n[e++] || "_") + (n[e++] || "_")), t;
|
|
28
29
|
};
|
|
29
|
-
}, J = l.createContext(null),
|
|
30
|
+
}, J = l.createContext(null), _e = ({
|
|
30
31
|
value: r,
|
|
31
32
|
children: f
|
|
32
33
|
}) => /* @__PURE__ */ s(J.Provider, { value: r, children: f }), Q = () => {
|
|
@@ -37,6 +38,7 @@ const ie = (r) => /* @__PURE__ */ s(
|
|
|
37
38
|
};
|
|
38
39
|
}, U = le({
|
|
39
40
|
group: {
|
|
41
|
+
...re,
|
|
40
42
|
width: "100%"
|
|
41
43
|
},
|
|
42
44
|
input: {
|
|
@@ -47,7 +49,7 @@ const ie = (r) => /* @__PURE__ */ s(
|
|
|
47
49
|
flexShrink: 1,
|
|
48
50
|
flexBasis: "0%"
|
|
49
51
|
}
|
|
50
|
-
}),
|
|
52
|
+
}), fe = l.forwardRef(
|
|
51
53
|
function({
|
|
52
54
|
ctx: f,
|
|
53
55
|
disabled: i,
|
|
@@ -66,10 +68,10 @@ const ie = (r) => /* @__PURE__ */ s(
|
|
|
66
68
|
onBlur: h,
|
|
67
69
|
setTempValue: D,
|
|
68
70
|
setInputValue: F
|
|
69
|
-
} = f,
|
|
70
|
-
() =>
|
|
71
|
-
[
|
|
72
|
-
), w =
|
|
71
|
+
} = f, M = o.includes("HH:mm"), C = l.useMemo(
|
|
72
|
+
() => pe(M),
|
|
73
|
+
[M]
|
|
74
|
+
), w = M ? me : de, I = y ? V(y, o, m) : "", [W, S] = l.useState(""), [X, Z] = l.useState(!1), H = l.useRef(null), Y = l.useCallback((a) => {
|
|
73
75
|
if (H.current = a, !a) return;
|
|
74
76
|
a.focus();
|
|
75
77
|
const p = a.value.indexOf("_");
|
|
@@ -85,19 +87,19 @@ const ie = (r) => /* @__PURE__ */ s(
|
|
|
85
87
|
g(null), D(null), F("");
|
|
86
88
|
return;
|
|
87
89
|
}
|
|
88
|
-
const c =
|
|
90
|
+
const c = ie(a, w, m);
|
|
89
91
|
c && (g(c), D(c), F(V(c, o, m)));
|
|
90
92
|
},
|
|
91
93
|
[g, D, F, w, o, m]
|
|
92
94
|
), B = ae({
|
|
93
|
-
accept:
|
|
95
|
+
accept: ue,
|
|
94
96
|
format: C,
|
|
95
97
|
mask: !0,
|
|
96
98
|
onChange: A,
|
|
97
99
|
value: W
|
|
98
100
|
}), O = l.useCallback(() => {
|
|
99
|
-
S(C(
|
|
100
|
-
}, [
|
|
101
|
+
S(C(I)), Z(!0);
|
|
102
|
+
}, [I, C]), $ = l.useCallback(() => {
|
|
101
103
|
Z(!1), h == null || h();
|
|
102
104
|
}, [h]), ee = l.useCallback(
|
|
103
105
|
(a) => {
|
|
@@ -150,7 +152,7 @@ const ie = (r) => /* @__PURE__ */ s(
|
|
|
150
152
|
disabled: i,
|
|
151
153
|
onFocus: O,
|
|
152
154
|
readOnly: !0,
|
|
153
|
-
value:
|
|
155
|
+
value: I
|
|
154
156
|
}
|
|
155
157
|
);
|
|
156
158
|
return /* @__PURE__ */ s(se, { asChild: !0, children: /* @__PURE__ */ G(
|
|
@@ -168,7 +170,7 @@ const ie = (r) => /* @__PURE__ */ s(
|
|
|
168
170
|
}
|
|
169
171
|
) });
|
|
170
172
|
}
|
|
171
|
-
),
|
|
173
|
+
), De = l.forwardRef(function({
|
|
172
174
|
editable: f = !1,
|
|
173
175
|
iconPosition: i = "end",
|
|
174
176
|
placeholder: n = "dd/MM/yyyy HH:mm",
|
|
@@ -179,10 +181,10 @@ const ie = (r) => /* @__PURE__ */ s(
|
|
|
179
181
|
className: k,
|
|
180
182
|
disabled: _
|
|
181
183
|
}, d) {
|
|
182
|
-
const T = U(), y = Q(), o =
|
|
184
|
+
const T = U(), y = Q(), o = oe(), m = _ ?? o.disabled, g = x || /* @__PURE__ */ s(ce, {});
|
|
183
185
|
if (f)
|
|
184
186
|
return /* @__PURE__ */ s(
|
|
185
|
-
|
|
187
|
+
fe,
|
|
186
188
|
{
|
|
187
189
|
className: k,
|
|
188
190
|
ctx: o,
|
|
@@ -235,7 +237,7 @@ const ie = (r) => /* @__PURE__ */ s(
|
|
|
235
237
|
);
|
|
236
238
|
});
|
|
237
239
|
export {
|
|
238
|
-
|
|
239
|
-
|
|
240
|
+
De as DateTimePickerInput,
|
|
241
|
+
_e as DateTimePickerLabelProvider
|
|
240
242
|
};
|
|
241
243
|
//# sourceMappingURL=date-time-picker-input.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"date-time-picker-input.js","sources":["../../../src/components/date-time-picker/date-time-picker-input.tsx"],"sourcesContent":["import * as React from \"react\"\nimport { useRifm } from \"rifm\"\nimport { mergeClasses } from \"@epilot/zenith-runtime/v1\"\n\nimport { Button } from \"../button/button\"\nimport { FieldGroupAddon, FieldInput, FieldInputGroup } from \"../field/field\"\nimport { PopoverAnchor, PopoverTrigger } from \"../popover/popover\"\nimport { SLOT_ATTR } from \"../../renderer/contract\"\nimport { makeZenithStyles } from \"../../styles/make-styles\"\n\nimport { useDateTimePickerContext } from \"./date-time-picker-context\"\nimport {\n formatDateTimeDisplay,\n parseDateTimeInput,\n} from \"./date-time-picker-utils\"\n\nconst CalendarIcon = (props: React.SVGProps<SVGSVGElement>) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n height=\"18px\"\n viewBox=\"0 -960 960 960\"\n width=\"18px\"\n fill=\"currentColor\"\n {...props}\n >\n <path d=\"M200-80q-33 0-56.5-23.5T120-160v-560q0-33 23.5-56.5T200-800h40v-80h80v80h320v-80h80v80h40q33 0 56.5 23.5T840-720v560q0 33-23.5 56.5T760-80H200Zm0-80h560v-400H200v400Zm0-480h560v-80H200v80Zm0 0v-80 80Zm280 240q-17 0-28.5-11.5T440-440q0-17 11.5-28.5T480-480q17 0 28.5 11.5T520-440q0 17-11.5 28.5T480-400Zm-160 0q-17 0-28.5-11.5T280-440q0-17 11.5-28.5T320-480q17 0 28.5 11.5T360-440q0 17-11.5 28.5T320-400Zm320 0q-17 0-28.5-11.5T600-440q0-17 11.5-28.5T640-480q17 0 28.5 11.5T680-440q0 17-11.5 28.5T640-400ZM480-240q-17 0-28.5-11.5T440-280q0-17 11.5-28.5T480-320q17 0 28.5 11.5T520-280q0 17-11.5 28.5T480-240Zm-160 0q-17 0-28.5-11.5T280-280q0-17 11.5-28.5T320-320q17 0 28.5 11.5T360-280q0 17-11.5 28.5T320-240Zm320 0q-17 0-28.5-11.5T600-280q0-17 11.5-28.5T640-320q17 0 28.5 11.5T680-280q0 17-11.5 28.5T640-240Z\" />\n </svg>\n)\n\nconst ACCEPT_DIGITS = /\\d/g\n\n// The mask always uses dots and colons regardless of the context format\nconst MASK_FORMAT_DATE = \"dd.MM.yyyy\"\nconst MASK_FORMAT_DATETIME = \"dd.MM.yyyy HH:mm\"\n\nconst createMaskFormatter = (isDateTime: boolean) => {\n const maxDigits = isDateTime ? 12 : 8\n\n return (str: string): string => {\n const digits = str.replace(/\\D/g, \"\").slice(0, maxDigits)\n let result = \"\"\n let di = 0\n\n result += (digits[di++] || \"_\") + (digits[di++] || \"_\")\n result += \".\"\n result += (digits[di++] || \"_\") + (digits[di++] || \"_\")\n result += \".\"\n result +=\n (digits[di++] || \"_\") +\n (digits[di++] || \"_\") +\n (digits[di++] || \"_\") +\n (digits[di++] || \"_\")\n\n if (isDateTime) {\n result += \" \"\n result += (digits[di++] || \"_\") + (digits[di++] || \"_\")\n result += \":\"\n result += (digits[di++] || \"_\") + (digits[di++] || \"_\")\n }\n\n return result\n }\n}\n\ntype DateTimePickerLabelling = {\n inputId: string\n labelId: string\n /** The visible label names the input; false when the caller passed `inputAriaLabel`. */\n namedByLabel: boolean\n}\n\nconst LabelContext = React.createContext<DateTimePickerLabelling | null>(null)\n\n/**\n * Set by `DateTimePicker`, which renders both the visible label and this input, so it can connect\n * them. Not exported from the package: composed usages wire their own label.\n *\n * @no-host-element context provider; renders only its children.\n */\nexport const DateTimePickerLabelProvider = ({\n value,\n children,\n}: {\n value: DateTimePickerLabelling | null\n children: React.ReactNode\n}) => <LabelContext.Provider value={value}>{children}</LabelContext.Provider>\n\n/** `id` and `aria-labelledby` for the input, when a `DateTimePicker` label is connected to it. */\nconst useLabelAttributes = () => {\n const labelling = React.useContext(LabelContext)\n return labelling === null\n ? {}\n : {\n id: labelling.inputId,\n ...(labelling.namedByLabel\n ? { \"aria-labelledby\": labelling.labelId }\n : {}),\n }\n}\n\nexport type DateTimePickerInputProps = {\n editable?: boolean\n iconPosition?: \"start\" | \"end\"\n placeholder?: string\n inputAriaLabel?: string\n openPickerAriaLabel?: string\n keyboardIcon?: React.ReactNode\n testId?: string\n className?: string\n disabled?: boolean\n}\n\nconst useStyles = makeZenithStyles({\n group: {\n width: \"100%\",\n },\n input: {\n textAlign: \"left\",\n },\n inputFlex: {\n flexGrow: 1,\n flexShrink: 1,\n flexBasis: \"0%\",\n },\n})\n\n// Editable input with rifm masking — manages its own display value\ntype EditableInputProps = {\n ctx: ReturnType<typeof useDateTimePickerContext>\n disabled: boolean\n icon: React.ReactNode\n iconPosition: \"start\" | \"end\"\n inputAriaLabel: string\n openPickerAriaLabel: string\n testId?: string\n className?: string\n}\n\nconst EditableInput = React.forwardRef<HTMLDivElement, EditableInputProps>(\n function EditableInput(\n {\n ctx,\n disabled,\n icon,\n iconPosition,\n inputAriaLabel,\n openPickerAriaLabel,\n testId,\n className,\n },\n ref\n ) {\n const styles = useStyles()\n const labelAttributes = useLabelAttributes()\n const {\n value,\n format,\n locale,\n onChange,\n onBlur,\n setTempValue,\n setInputValue,\n } = ctx\n\n const isDateTime = format.includes(\"HH:mm\")\n const maskFormat = React.useMemo(\n () => createMaskFormatter(isDateTime),\n [isDateTime]\n )\n const maskParseFormat = isDateTime ? MASK_FORMAT_DATETIME : MASK_FORMAT_DATE\n\n const displayValue = value\n ? formatDateTimeDisplay(value, format, locale)\n : \"\"\n\n const [maskedValue, setMaskedValue] = React.useState(\"\")\n const [focused, setFocused] = React.useState(false)\n const inputRef = React.useRef<HTMLInputElement>(null)\n\n // Callback ref: focus + position cursor when the Rifm input mounts\n const rifmRefCallback = React.useCallback((el: HTMLInputElement | null) => {\n inputRef.current = el\n if (!el) return\n\n el.focus()\n const pos = el.value.indexOf(\"_\")\n\n if (pos !== -1) {\n el.setSelectionRange(pos, pos)\n }\n }, [])\n\n const handleRifmChange = React.useCallback(\n (val: string) => {\n setMaskedValue(val)\n\n // Position cursor at next empty placeholder after Rifm processes\n requestAnimationFrame(() => {\n const el = inputRef.current\n if (!el) return\n\n const pos = el.value.indexOf(\"_\")\n const cursor = pos === -1 ? el.value.length : pos\n\n el.setSelectionRange(cursor, cursor)\n })\n\n const digits = val.replace(/\\D/g, \"\")\n\n if (digits.length === 0) {\n onChange(null)\n setTempValue(null)\n setInputValue(\"\")\n\n return\n }\n\n const parsed = parseDateTimeInput(val, maskParseFormat, locale)\n\n if (parsed) {\n onChange(parsed)\n setTempValue(parsed)\n setInputValue(formatDateTimeDisplay(parsed, format, locale))\n }\n },\n [onChange, setTempValue, setInputValue, maskParseFormat, format, locale]\n )\n\n const rifm = useRifm({\n accept: ACCEPT_DIGITS,\n format: maskFormat,\n mask: true,\n onChange: handleRifmChange,\n value: maskedValue,\n })\n\n const handleFocus = React.useCallback(() => {\n setMaskedValue(maskFormat(displayValue))\n setFocused(true)\n }, [displayValue, maskFormat])\n\n const handleBlur = React.useCallback(() => {\n setFocused(false)\n onBlur?.()\n }, [onBlur])\n\n const handlePaste = React.useCallback(\n (e: React.ClipboardEvent<HTMLInputElement>) => {\n // Always paste a date from the beginning, ignoring caret position.\n e.preventDefault()\n handleRifmChange(maskFormat(e.clipboardData.getData(\"text\")))\n },\n [handleRifmChange, maskFormat]\n )\n\n const handleKeyDown = React.useCallback(\n (e: React.KeyboardEvent<HTMLInputElement>) => {\n // On Backspace, skip the caret back over mask separators (\".\", \":\", \" \")\n if (e.key !== \"Backspace\") return\n\n const el = e.currentTarget\n const { selectionStart, selectionEnd } = el\n\n if (selectionStart === null || selectionStart !== selectionEnd) return\n\n let pos = selectionStart\n\n while (pos > 0 && !/[\\d_]/.test(el.value[pos - 1])) {\n pos--\n }\n\n if (pos !== selectionStart) {\n el.setSelectionRange(pos, pos)\n }\n },\n []\n )\n\n const iconAddon = (\n <FieldGroupAddon align={iconPosition}>\n <PopoverTrigger asChild>\n <Button\n aria-label={openPickerAriaLabel}\n disabled={disabled}\n size=\"icon-sm\"\n variant=\"tertiary\"\n >\n {icon}\n </Button>\n </PopoverTrigger>\n </FieldGroupAddon>\n )\n\n const input = focused ? (\n <FieldInput\n aria-label={inputAriaLabel}\n {...labelAttributes}\n className={mergeClasses(styles.inputFlex, styles.input)}\n data-testid={testId}\n disabled={disabled}\n onBlur={handleBlur}\n onChange={rifm.onChange}\n onFocus={handleFocus}\n onKeyDown={handleKeyDown}\n onPaste={handlePaste}\n ref={rifmRefCallback}\n value={rifm.value}\n />\n ) : (\n <FieldInput\n aria-label={inputAriaLabel}\n {...labelAttributes}\n className={mergeClasses(styles.inputFlex, styles.input)}\n data-testid={testId}\n disabled={disabled}\n onFocus={handleFocus}\n readOnly\n value={displayValue}\n />\n )\n\n return (\n <PopoverAnchor asChild>\n <FieldInputGroup\n className={mergeClasses(styles.group, className)}\n data-slot=\"datetimepicker-input\"\n {...{ [SLOT_ATTR]: \"datetimepicker-input\" }}\n ref={ref}\n >\n {iconPosition === \"start\" && iconAddon}\n {input}\n {iconPosition === \"end\" && iconAddon}\n </FieldInputGroup>\n </PopoverAnchor>\n )\n }\n)\n\nexport const DateTimePickerInput = React.forwardRef<\n HTMLDivElement,\n DateTimePickerInputProps\n>(function DateTimePickerInput(\n {\n editable = false,\n iconPosition = \"end\",\n placeholder = \"dd/MM/yyyy HH:mm\",\n inputAriaLabel = \"change date and time\",\n openPickerAriaLabel = \"Open date picker\",\n keyboardIcon,\n testId,\n className,\n disabled: disabledProp,\n },\n ref\n) {\n const styles = useStyles()\n const labelAttributes = useLabelAttributes()\n const ctx = useDateTimePickerContext()\n const disabled = disabledProp ?? ctx.disabled\n\n const IconComponent = keyboardIcon || <CalendarIcon />\n\n if (editable) {\n return (\n <EditableInput\n className={className}\n ctx={ctx}\n disabled={disabled}\n icon={IconComponent}\n iconPosition={iconPosition}\n inputAriaLabel={inputAriaLabel}\n openPickerAriaLabel={openPickerAriaLabel}\n ref={ref}\n testId={testId}\n />\n )\n }\n\n const iconAddon = (\n <FieldGroupAddon align={iconPosition}>\n <Button\n aria-label={openPickerAriaLabel}\n disabled={disabled}\n onClick={() => ctx.setIsOpen(true)}\n size=\"icon-sm\"\n variant=\"tertiary\"\n >\n {IconComponent}\n </Button>\n </FieldGroupAddon>\n )\n\n return (\n <FieldInputGroup\n className={mergeClasses(styles.group, className)}\n data-slot=\"datetimepicker-input\"\n {...{ [SLOT_ATTR]: \"datetimepicker-input\" }}\n ref={ref}\n >\n {iconPosition === \"start\" && iconAddon}\n <PopoverTrigger asChild>\n <FieldInput\n aria-label={inputAriaLabel}\n {...labelAttributes}\n className={mergeClasses(styles.inputFlex, styles.input)}\n data-testid={testId}\n disabled={disabled}\n onBlur={ctx.handleInputBlur}\n onChange={ctx.handleInputChange}\n placeholder={placeholder}\n value={ctx.inputValue}\n />\n </PopoverTrigger>\n {iconPosition === \"end\" && iconAddon}\n </FieldInputGroup>\n )\n})\n"],"names":["CalendarIcon","props","jsx","ACCEPT_DIGITS","MASK_FORMAT_DATE","MASK_FORMAT_DATETIME","createMaskFormatter","isDateTime","maxDigits","str","digits","result","di","LabelContext","React","DateTimePickerLabelProvider","value","children","useLabelAttributes","labelling","useStyles","makeZenithStyles","EditableInput","ctx","disabled","icon","iconPosition","inputAriaLabel","openPickerAriaLabel","testId","className","ref","styles","labelAttributes","format","locale","onChange","onBlur","setTempValue","setInputValue","maskFormat","maskParseFormat","displayValue","formatDateTimeDisplay","maskedValue","setMaskedValue","focused","setFocused","inputRef","rifmRefCallback","el","pos","handleRifmChange","val","cursor","parsed","parseDateTimeInput","rifm","useRifm","handleFocus","handleBlur","handlePaste","e","handleKeyDown","selectionStart","selectionEnd","iconAddon","FieldGroupAddon","PopoverTrigger","Button","input","FieldInput","mergeClasses","PopoverAnchor","jsxs","FieldInputGroup","SLOT_ATTR","DateTimePickerInput","editable","placeholder","keyboardIcon","disabledProp","useDateTimePickerContext","IconComponent"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"date-time-picker-input.js","sources":["../../../src/components/date-time-picker/date-time-picker-input.tsx"],"sourcesContent":["import * as React from \"react\"\nimport { useRifm } from \"rifm\"\nimport { mergeClasses } from \"@epilot/zenith-runtime/v1\"\n\nimport { Button } from \"../button/button\"\nimport { FieldGroupAddon, FieldInput, FieldInputGroup } from \"../field/field\"\nimport { PopoverAnchor, PopoverTrigger } from \"../popover/popover\"\nimport { SLOT_ATTR } from \"../../renderer/contract\"\nimport { makeZenithStyles } from \"../../styles/make-styles\"\nimport { boxModel } from \"../../styles/host-reset\"\n\nimport { useDateTimePickerContext } from \"./date-time-picker-context\"\nimport {\n formatDateTimeDisplay,\n parseDateTimeInput,\n} from \"./date-time-picker-utils\"\n\nconst CalendarIcon = (props: React.SVGProps<SVGSVGElement>) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n height=\"18px\"\n viewBox=\"0 -960 960 960\"\n width=\"18px\"\n fill=\"currentColor\"\n {...props}\n >\n <path d=\"M200-80q-33 0-56.5-23.5T120-160v-560q0-33 23.5-56.5T200-800h40v-80h80v80h320v-80h80v80h40q33 0 56.5 23.5T840-720v560q0 33-23.5 56.5T760-80H200Zm0-80h560v-400H200v400Zm0-480h560v-80H200v80Zm0 0v-80 80Zm280 240q-17 0-28.5-11.5T440-440q0-17 11.5-28.5T480-480q17 0 28.5 11.5T520-440q0 17-11.5 28.5T480-400Zm-160 0q-17 0-28.5-11.5T280-440q0-17 11.5-28.5T320-480q17 0 28.5 11.5T360-440q0 17-11.5 28.5T320-400Zm320 0q-17 0-28.5-11.5T600-440q0-17 11.5-28.5T640-480q17 0 28.5 11.5T680-440q0 17-11.5 28.5T640-400ZM480-240q-17 0-28.5-11.5T440-280q0-17 11.5-28.5T480-320q17 0 28.5 11.5T520-280q0 17-11.5 28.5T480-240Zm-160 0q-17 0-28.5-11.5T280-280q0-17 11.5-28.5T320-320q17 0 28.5 11.5T360-280q0 17-11.5 28.5T320-240Zm320 0q-17 0-28.5-11.5T600-280q0-17 11.5-28.5T640-320q17 0 28.5 11.5T680-280q0 17-11.5 28.5T640-240Z\" />\n </svg>\n)\n\nconst ACCEPT_DIGITS = /\\d/g\n\n// The mask always uses dots and colons regardless of the context format\nconst MASK_FORMAT_DATE = \"dd.MM.yyyy\"\nconst MASK_FORMAT_DATETIME = \"dd.MM.yyyy HH:mm\"\n\nconst createMaskFormatter = (isDateTime: boolean) => {\n const maxDigits = isDateTime ? 12 : 8\n\n return (str: string): string => {\n const digits = str.replace(/\\D/g, \"\").slice(0, maxDigits)\n let result = \"\"\n let di = 0\n\n result += (digits[di++] || \"_\") + (digits[di++] || \"_\")\n result += \".\"\n result += (digits[di++] || \"_\") + (digits[di++] || \"_\")\n result += \".\"\n result +=\n (digits[di++] || \"_\") +\n (digits[di++] || \"_\") +\n (digits[di++] || \"_\") +\n (digits[di++] || \"_\")\n\n if (isDateTime) {\n result += \" \"\n result += (digits[di++] || \"_\") + (digits[di++] || \"_\")\n result += \":\"\n result += (digits[di++] || \"_\") + (digits[di++] || \"_\")\n }\n\n return result\n }\n}\n\ntype DateTimePickerLabelling = {\n inputId: string\n labelId: string\n /** The visible label names the input; false when the caller passed `inputAriaLabel`. */\n namedByLabel: boolean\n}\n\nconst LabelContext = React.createContext<DateTimePickerLabelling | null>(null)\n\n/**\n * Set by `DateTimePicker`, which renders both the visible label and this input, so it can connect\n * them. Not exported from the package: composed usages wire their own label.\n *\n * @no-host-element context provider; renders only its children.\n */\nexport const DateTimePickerLabelProvider = ({\n value,\n children,\n}: {\n value: DateTimePickerLabelling | null\n children: React.ReactNode\n}) => <LabelContext.Provider value={value}>{children}</LabelContext.Provider>\n\n/** `id` and `aria-labelledby` for the input, when a `DateTimePicker` label is connected to it. */\nconst useLabelAttributes = () => {\n const labelling = React.useContext(LabelContext)\n return labelling === null\n ? {}\n : {\n id: labelling.inputId,\n ...(labelling.namedByLabel\n ? { \"aria-labelledby\": labelling.labelId }\n : {}),\n }\n}\n\nexport type DateTimePickerInputProps = {\n editable?: boolean\n iconPosition?: \"start\" | \"end\"\n placeholder?: string\n inputAriaLabel?: string\n openPickerAriaLabel?: string\n keyboardIcon?: React.ReactNode\n testId?: string\n className?: string\n disabled?: boolean\n}\n\nconst useStyles = makeZenithStyles({\n group: {\n ...boxModel,\n width: \"100%\",\n },\n input: {\n textAlign: \"left\",\n },\n inputFlex: {\n flexGrow: 1,\n flexShrink: 1,\n flexBasis: \"0%\",\n },\n})\n\n// Editable input with rifm masking — manages its own display value\ntype EditableInputProps = {\n ctx: ReturnType<typeof useDateTimePickerContext>\n disabled: boolean\n icon: React.ReactNode\n iconPosition: \"start\" | \"end\"\n inputAriaLabel: string\n openPickerAriaLabel: string\n testId?: string\n className?: string\n}\n\nconst EditableInput = React.forwardRef<HTMLDivElement, EditableInputProps>(\n function EditableInput(\n {\n ctx,\n disabled,\n icon,\n iconPosition,\n inputAriaLabel,\n openPickerAriaLabel,\n testId,\n className,\n },\n ref\n ) {\n const styles = useStyles()\n const labelAttributes = useLabelAttributes()\n const {\n value,\n format,\n locale,\n onChange,\n onBlur,\n setTempValue,\n setInputValue,\n } = ctx\n\n const isDateTime = format.includes(\"HH:mm\")\n const maskFormat = React.useMemo(\n () => createMaskFormatter(isDateTime),\n [isDateTime]\n )\n const maskParseFormat = isDateTime ? MASK_FORMAT_DATETIME : MASK_FORMAT_DATE\n\n const displayValue = value\n ? formatDateTimeDisplay(value, format, locale)\n : \"\"\n\n const [maskedValue, setMaskedValue] = React.useState(\"\")\n const [focused, setFocused] = React.useState(false)\n const inputRef = React.useRef<HTMLInputElement>(null)\n\n // Callback ref: focus + position cursor when the Rifm input mounts\n const rifmRefCallback = React.useCallback((el: HTMLInputElement | null) => {\n inputRef.current = el\n if (!el) return\n\n el.focus()\n const pos = el.value.indexOf(\"_\")\n\n if (pos !== -1) {\n el.setSelectionRange(pos, pos)\n }\n }, [])\n\n const handleRifmChange = React.useCallback(\n (val: string) => {\n setMaskedValue(val)\n\n // Position cursor at next empty placeholder after Rifm processes\n requestAnimationFrame(() => {\n const el = inputRef.current\n if (!el) return\n\n const pos = el.value.indexOf(\"_\")\n const cursor = pos === -1 ? el.value.length : pos\n\n el.setSelectionRange(cursor, cursor)\n })\n\n const digits = val.replace(/\\D/g, \"\")\n\n if (digits.length === 0) {\n onChange(null)\n setTempValue(null)\n setInputValue(\"\")\n\n return\n }\n\n const parsed = parseDateTimeInput(val, maskParseFormat, locale)\n\n if (parsed) {\n onChange(parsed)\n setTempValue(parsed)\n setInputValue(formatDateTimeDisplay(parsed, format, locale))\n }\n },\n [onChange, setTempValue, setInputValue, maskParseFormat, format, locale]\n )\n\n const rifm = useRifm({\n accept: ACCEPT_DIGITS,\n format: maskFormat,\n mask: true,\n onChange: handleRifmChange,\n value: maskedValue,\n })\n\n const handleFocus = React.useCallback(() => {\n setMaskedValue(maskFormat(displayValue))\n setFocused(true)\n }, [displayValue, maskFormat])\n\n const handleBlur = React.useCallback(() => {\n setFocused(false)\n onBlur?.()\n }, [onBlur])\n\n const handlePaste = React.useCallback(\n (e: React.ClipboardEvent<HTMLInputElement>) => {\n // Always paste a date from the beginning, ignoring caret position.\n e.preventDefault()\n handleRifmChange(maskFormat(e.clipboardData.getData(\"text\")))\n },\n [handleRifmChange, maskFormat]\n )\n\n const handleKeyDown = React.useCallback(\n (e: React.KeyboardEvent<HTMLInputElement>) => {\n // On Backspace, skip the caret back over mask separators (\".\", \":\", \" \")\n if (e.key !== \"Backspace\") return\n\n const el = e.currentTarget\n const { selectionStart, selectionEnd } = el\n\n if (selectionStart === null || selectionStart !== selectionEnd) return\n\n let pos = selectionStart\n\n while (pos > 0 && !/[\\d_]/.test(el.value[pos - 1])) {\n pos--\n }\n\n if (pos !== selectionStart) {\n el.setSelectionRange(pos, pos)\n }\n },\n []\n )\n\n const iconAddon = (\n <FieldGroupAddon align={iconPosition}>\n <PopoverTrigger asChild>\n <Button\n aria-label={openPickerAriaLabel}\n disabled={disabled}\n size=\"icon-sm\"\n variant=\"tertiary\"\n >\n {icon}\n </Button>\n </PopoverTrigger>\n </FieldGroupAddon>\n )\n\n const input = focused ? (\n <FieldInput\n aria-label={inputAriaLabel}\n {...labelAttributes}\n className={mergeClasses(styles.inputFlex, styles.input)}\n data-testid={testId}\n disabled={disabled}\n onBlur={handleBlur}\n onChange={rifm.onChange}\n onFocus={handleFocus}\n onKeyDown={handleKeyDown}\n onPaste={handlePaste}\n ref={rifmRefCallback}\n value={rifm.value}\n />\n ) : (\n <FieldInput\n aria-label={inputAriaLabel}\n {...labelAttributes}\n className={mergeClasses(styles.inputFlex, styles.input)}\n data-testid={testId}\n disabled={disabled}\n onFocus={handleFocus}\n readOnly\n value={displayValue}\n />\n )\n\n return (\n <PopoverAnchor asChild>\n <FieldInputGroup\n className={mergeClasses(styles.group, className)}\n data-slot=\"datetimepicker-input\"\n {...{ [SLOT_ATTR]: \"datetimepicker-input\" }}\n ref={ref}\n >\n {iconPosition === \"start\" && iconAddon}\n {input}\n {iconPosition === \"end\" && iconAddon}\n </FieldInputGroup>\n </PopoverAnchor>\n )\n }\n)\n\nexport const DateTimePickerInput = React.forwardRef<\n HTMLDivElement,\n DateTimePickerInputProps\n>(function DateTimePickerInput(\n {\n editable = false,\n iconPosition = \"end\",\n placeholder = \"dd/MM/yyyy HH:mm\",\n inputAriaLabel = \"change date and time\",\n openPickerAriaLabel = \"Open date picker\",\n keyboardIcon,\n testId,\n className,\n disabled: disabledProp,\n },\n ref\n) {\n const styles = useStyles()\n const labelAttributes = useLabelAttributes()\n const ctx = useDateTimePickerContext()\n const disabled = disabledProp ?? ctx.disabled\n\n const IconComponent = keyboardIcon || <CalendarIcon />\n\n if (editable) {\n return (\n <EditableInput\n className={className}\n ctx={ctx}\n disabled={disabled}\n icon={IconComponent}\n iconPosition={iconPosition}\n inputAriaLabel={inputAriaLabel}\n openPickerAriaLabel={openPickerAriaLabel}\n ref={ref}\n testId={testId}\n />\n )\n }\n\n const iconAddon = (\n <FieldGroupAddon align={iconPosition}>\n <Button\n aria-label={openPickerAriaLabel}\n disabled={disabled}\n onClick={() => ctx.setIsOpen(true)}\n size=\"icon-sm\"\n variant=\"tertiary\"\n >\n {IconComponent}\n </Button>\n </FieldGroupAddon>\n )\n\n return (\n <FieldInputGroup\n className={mergeClasses(styles.group, className)}\n data-slot=\"datetimepicker-input\"\n {...{ [SLOT_ATTR]: \"datetimepicker-input\" }}\n ref={ref}\n >\n {iconPosition === \"start\" && iconAddon}\n <PopoverTrigger asChild>\n <FieldInput\n aria-label={inputAriaLabel}\n {...labelAttributes}\n className={mergeClasses(styles.inputFlex, styles.input)}\n data-testid={testId}\n disabled={disabled}\n onBlur={ctx.handleInputBlur}\n onChange={ctx.handleInputChange}\n placeholder={placeholder}\n value={ctx.inputValue}\n />\n </PopoverTrigger>\n {iconPosition === \"end\" && iconAddon}\n </FieldInputGroup>\n )\n})\n"],"names":["CalendarIcon","props","jsx","ACCEPT_DIGITS","MASK_FORMAT_DATE","MASK_FORMAT_DATETIME","createMaskFormatter","isDateTime","maxDigits","str","digits","result","di","LabelContext","React","DateTimePickerLabelProvider","value","children","useLabelAttributes","labelling","useStyles","makeZenithStyles","boxModel","EditableInput","ctx","disabled","icon","iconPosition","inputAriaLabel","openPickerAriaLabel","testId","className","ref","styles","labelAttributes","format","locale","onChange","onBlur","setTempValue","setInputValue","maskFormat","maskParseFormat","displayValue","formatDateTimeDisplay","maskedValue","setMaskedValue","focused","setFocused","inputRef","rifmRefCallback","el","pos","handleRifmChange","val","cursor","parsed","parseDateTimeInput","rifm","useRifm","handleFocus","handleBlur","handlePaste","e","handleKeyDown","selectionStart","selectionEnd","iconAddon","FieldGroupAddon","PopoverTrigger","Button","input","FieldInput","mergeClasses","PopoverAnchor","jsxs","FieldInputGroup","SLOT_ATTR","DateTimePickerInput","editable","placeholder","keyboardIcon","disabledProp","useDateTimePickerContext","IconComponent"],"mappings":";;;;;;;;;;;AAiBA,MAAMA,KAAe,CAACC,MACpB,gBAAAC;AAAA,EAAC;AAAA,EAAA;AAAA,IACC,OAAM;AAAA,IACN,QAAO;AAAA,IACP,SAAQ;AAAA,IACR,OAAM;AAAA,IACN,MAAK;AAAA,IACJ,GAAGD;AAAA,IAEJ,UAAA,gBAAAC,EAAC,QAAA,EAAK,GAAE,yyBAAA,CAAyyB;AAAA,EAAA;AACnzB,GAGIC,KAAgB,OAGhBC,KAAmB,cACnBC,KAAuB,oBAEvBC,KAAsB,CAACC,MAAwB;AACnD,QAAMC,IAAYD,IAAa,KAAK;AAEpC,SAAO,CAACE,MAAwB;AAC9B,UAAMC,IAASD,EAAI,QAAQ,OAAO,EAAE,EAAE,MAAM,GAAGD,CAAS;AACxD,QAAIG,IAAS,IACTC,IAAK;AAET,WAAAD,MAAWD,EAAOE,GAAI,KAAK,QAAQF,EAAOE,GAAI,KAAK,MACnDD,KAAU,KACVA,MAAWD,EAAOE,GAAI,KAAK,QAAQF,EAAOE,GAAI,KAAK,MACnDD,KAAU,KACVA,MACGD,EAAOE,GAAI,KAAK,QAChBF,EAAOE,GAAI,KAAK,QAChBF,EAAOE,GAAI,KAAK,QAChBF,EAAOE,GAAI,KAAK,MAEfL,MACFI,KAAU,KACVA,MAAWD,EAAOE,GAAI,KAAK,QAAQF,EAAOE,GAAI,KAAK,MACnDD,KAAU,KACVA,MAAWD,EAAOE,GAAI,KAAK,QAAQF,EAAOE,GAAI,KAAK,OAG9CD;AAAA,EACT;AACF,GASME,IAAeC,EAAM,cAA8C,IAAI,GAQhEC,KAA8B,CAAC;AAAA,EAC1C,OAAAC;AAAA,EACA,UAAAC;AACF,MAGM,gBAAAf,EAACW,EAAa,UAAb,EAAsB,OAAAG,GAAe,UAAAC,EAAA,CAAS,GAG/CC,IAAqB,MAAM;AAC/B,QAAMC,IAAYL,EAAM,WAAWD,CAAY;AAC/C,SAAOM,MAAc,OACjB,KACA;AAAA,IACE,IAAIA,EAAU;AAAA,IACd,GAAIA,EAAU,eACV,EAAE,mBAAmBA,EAAU,QAAA,IAC/B,CAAA;AAAA,EAAC;AAEb,GAcMC,IAAYC,GAAiB;AAAA,EACjC,OAAO;AAAA,IACL,GAAGC;AAAA,IACH,OAAO;AAAA,EAAA;AAAA,EAET,OAAO;AAAA,IACL,WAAW;AAAA,EAAA;AAAA,EAEb,WAAW;AAAA,IACT,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,WAAW;AAAA,EAAA;AAEf,CAAC,GAcKC,KAAgBT,EAAM;AAAA,EAC1B,SACE;AAAA,IACE,KAAAU;AAAA,IACA,UAAAC;AAAA,IACA,MAAAC;AAAA,IACA,cAAAC;AAAA,IACA,gBAAAC;AAAA,IACA,qBAAAC;AAAA,IACA,QAAAC;AAAA,IACA,WAAAC;AAAA,EAAA,GAEFC,GACA;AACA,UAAMC,IAASb,EAAA,GACTc,IAAkBhB,EAAA,GAClB;AAAA,MACJ,OAAAF;AAAA,MACA,QAAAmB;AAAA,MACA,QAAAC;AAAA,MACA,UAAAC;AAAA,MACA,QAAAC;AAAA,MACA,cAAAC;AAAA,MACA,eAAAC;AAAA,IAAA,IACEhB,GAEEjB,IAAa4B,EAAO,SAAS,OAAO,GACpCM,IAAa3B,EAAM;AAAA,MACvB,MAAMR,GAAoBC,CAAU;AAAA,MACpC,CAACA,CAAU;AAAA,IAAA,GAEPmC,IAAkBnC,IAAaF,KAAuBD,IAEtDuC,IAAe3B,IACjB4B,EAAsB5B,GAAOmB,GAAQC,CAAM,IAC3C,IAEE,CAACS,GAAaC,CAAc,IAAIhC,EAAM,SAAS,EAAE,GACjD,CAACiC,GAASC,CAAU,IAAIlC,EAAM,SAAS,EAAK,GAC5CmC,IAAWnC,EAAM,OAAyB,IAAI,GAG9CoC,IAAkBpC,EAAM,YAAY,CAACqC,MAAgC;AAEzE,UADAF,EAAS,UAAUE,GACf,CAACA,EAAI;AAET,MAAAA,EAAG,MAAA;AACH,YAAMC,IAAMD,EAAG,MAAM,QAAQ,GAAG;AAEhC,MAAIC,MAAQ,MACVD,EAAG,kBAAkBC,GAAKA,CAAG;AAAA,IAEjC,GAAG,CAAA,CAAE,GAECC,IAAmBvC,EAAM;AAAA,MAC7B,CAACwC,MAAgB;AAgBf,YAfAR,EAAeQ,CAAG,GAGlB,sBAAsB,MAAM;AAC1B,gBAAMH,IAAKF,EAAS;AACpB,cAAI,CAACE,EAAI;AAET,gBAAMC,IAAMD,EAAG,MAAM,QAAQ,GAAG,GAC1BI,IAASH,MAAQ,KAAKD,EAAG,MAAM,SAASC;AAE9C,UAAAD,EAAG,kBAAkBI,GAAQA,CAAM;AAAA,QACrC,CAAC,GAEcD,EAAI,QAAQ,OAAO,EAAE,EAEzB,WAAW,GAAG;AACvB,UAAAjB,EAAS,IAAI,GACbE,EAAa,IAAI,GACjBC,EAAc,EAAE;AAEhB;AAAA,QACF;AAEA,cAAMgB,IAASC,GAAmBH,GAAKZ,GAAiBN,CAAM;AAE9D,QAAIoB,MACFnB,EAASmB,CAAM,GACfjB,EAAaiB,CAAM,GACnBhB,EAAcI,EAAsBY,GAAQrB,GAAQC,CAAM,CAAC;AAAA,MAE/D;AAAA,MACA,CAACC,GAAUE,GAAcC,GAAeE,GAAiBP,GAAQC,CAAM;AAAA,IAAA,GAGnEsB,IAAOC,GAAQ;AAAA,MACnB,QAAQxD;AAAA,MACR,QAAQsC;AAAA,MACR,MAAM;AAAA,MACN,UAAUY;AAAA,MACV,OAAOR;AAAA,IAAA,CACR,GAEKe,IAAc9C,EAAM,YAAY,MAAM;AAC1C,MAAAgC,EAAeL,EAAWE,CAAY,CAAC,GACvCK,EAAW,EAAI;AAAA,IACjB,GAAG,CAACL,GAAcF,CAAU,CAAC,GAEvBoB,IAAa/C,EAAM,YAAY,MAAM;AACzC,MAAAkC,EAAW,EAAK,GAChBV,KAAA,QAAAA;AAAA,IACF,GAAG,CAACA,CAAM,CAAC,GAELwB,KAAchD,EAAM;AAAA,MACxB,CAACiD,MAA8C;AAE7C,QAAAA,EAAE,eAAA,GACFV,EAAiBZ,EAAWsB,EAAE,cAAc,QAAQ,MAAM,CAAC,CAAC;AAAA,MAC9D;AAAA,MACA,CAACV,GAAkBZ,CAAU;AAAA,IAAA,GAGzBuB,KAAgBlD,EAAM;AAAA,MAC1B,CAACiD,MAA6C;AAE5C,YAAIA,EAAE,QAAQ,YAAa;AAE3B,cAAMZ,IAAKY,EAAE,eACP,EAAE,gBAAAE,GAAgB,cAAAC,EAAA,IAAiBf;AAEzC,YAAIc,MAAmB,QAAQA,MAAmBC,EAAc;AAEhE,YAAId,IAAMa;AAEV,eAAOb,IAAM,KAAK,CAAC,QAAQ,KAAKD,EAAG,MAAMC,IAAM,CAAC,CAAC;AAC/C,UAAAA;AAGF,QAAIA,MAAQa,KACVd,EAAG,kBAAkBC,GAAKA,CAAG;AAAA,MAEjC;AAAA,MACA,CAAA;AAAA,IAAC,GAGGe,sBACHC,GAAA,EAAgB,OAAOzC,GACtB,UAAA,gBAAAzB,EAACmE,GAAA,EAAe,SAAO,IACrB,UAAA,gBAAAnE;AAAA,MAACoE;AAAA,MAAA;AAAA,QACC,cAAYzC;AAAA,QACZ,UAAAJ;AAAA,QACA,MAAK;AAAA,QACL,SAAQ;AAAA,QAEP,UAAAC;AAAA,MAAA;AAAA,IAAA,GAEL,EAAA,CACF,GAGI6C,KAAQxB,IACZ,gBAAA7C;AAAA,MAACsE;AAAA,MAAA;AAAA,QACC,cAAY5C;AAAA,QACX,GAAGM;AAAA,QACJ,WAAWuC,EAAaxC,EAAO,WAAWA,EAAO,KAAK;AAAA,QACtD,eAAaH;AAAA,QACb,UAAAL;AAAA,QACA,QAAQoC;AAAA,QACR,UAAUH,EAAK;AAAA,QACf,SAASE;AAAA,QACT,WAAWI;AAAA,QACX,SAASF;AAAA,QACT,KAAKZ;AAAA,QACL,OAAOQ,EAAK;AAAA,MAAA;AAAA,IAAA,IAGd,gBAAAxD;AAAA,MAACsE;AAAA,MAAA;AAAA,QACC,cAAY5C;AAAA,QACX,GAAGM;AAAA,QACJ,WAAWuC,EAAaxC,EAAO,WAAWA,EAAO,KAAK;AAAA,QACtD,eAAaH;AAAA,QACb,UAAAL;AAAA,QACA,SAASmC;AAAA,QACT,UAAQ;AAAA,QACR,OAAOjB;AAAA,MAAA;AAAA,IAAA;AAIX,WACE,gBAAAzC,EAACwE,IAAA,EAAc,SAAO,IACpB,UAAA,gBAAAC;AAAA,MAACC;AAAA,MAAA;AAAA,QACC,WAAWH,EAAaxC,EAAO,OAAOF,CAAS;AAAA,QAC/C,aAAU;AAAA,QACJ,CAAC8C,CAAS,GAAG;AAAA,QACnB,KAAA7C;AAAA,QAEC,UAAA;AAAA,UAAAL,MAAiB,WAAWwC;AAAA,UAC5BI;AAAA,UACA5C,MAAiB,SAASwC;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA,GAE/B;AAAA,EAEJ;AACF,GAEaW,KAAsBhE,EAAM,WAGvC,SACA;AAAA,EACE,UAAAiE,IAAW;AAAA,EACX,cAAApD,IAAe;AAAA,EACf,aAAAqD,IAAc;AAAA,EACd,gBAAApD,IAAiB;AAAA,EACjB,qBAAAC,IAAsB;AAAA,EACtB,cAAAoD;AAAA,EACA,QAAAnD;AAAA,EACA,WAAAC;AAAA,EACA,UAAUmD;AACZ,GACAlD,GACA;AACA,QAAMC,IAASb,EAAA,GACTc,IAAkBhB,EAAA,GAClBM,IAAM2D,GAAA,GACN1D,IAAWyD,KAAgB1D,EAAI,UAE/B4D,IAAgBH,KAAgB,gBAAA/E,EAACF,IAAA,CAAA,CAAa;AAEpD,MAAI+E;AACF,WACE,gBAAA7E;AAAA,MAACqB;AAAA,MAAA;AAAA,QACC,WAAAQ;AAAA,QACA,KAAAP;AAAA,QACA,UAAAC;AAAA,QACA,MAAM2D;AAAA,QACN,cAAAzD;AAAA,QACA,gBAAAC;AAAA,QACA,qBAAAC;AAAA,QACA,KAAAG;AAAA,QACA,QAAAF;AAAA,MAAA;AAAA,IAAA;AAKN,QAAMqC,IACJ,gBAAAjE,EAACkE,GAAA,EAAgB,OAAOzC,GACtB,UAAA,gBAAAzB;AAAA,IAACoE;AAAA,IAAA;AAAA,MACC,cAAYzC;AAAA,MACZ,UAAAJ;AAAA,MACA,SAAS,MAAMD,EAAI,UAAU,EAAI;AAAA,MACjC,MAAK;AAAA,MACL,SAAQ;AAAA,MAEP,UAAA4D;AAAA,IAAA;AAAA,EAAA,GAEL;AAGF,SACE,gBAAAT;AAAA,IAACC;AAAA,IAAA;AAAA,MACC,WAAWH,EAAaxC,EAAO,OAAOF,CAAS;AAAA,MAC/C,aAAU;AAAA,MACJ,CAAC8C,CAAS,GAAG;AAAA,MACnB,KAAA7C;AAAA,MAEC,UAAA;AAAA,QAAAL,MAAiB,WAAWwC;AAAA,QAC7B,gBAAAjE,EAACmE,GAAA,EAAe,SAAO,IACrB,UAAA,gBAAAnE;AAAA,UAACsE;AAAA,UAAA;AAAA,YACC,cAAY5C;AAAA,YACX,GAAGM;AAAA,YACJ,WAAWuC,EAAaxC,EAAO,WAAWA,EAAO,KAAK;AAAA,YACtD,eAAaH;AAAA,YACb,UAAAL;AAAA,YACA,QAAQD,EAAI;AAAA,YACZ,UAAUA,EAAI;AAAA,YACd,aAAAwD;AAAA,YACA,OAAOxD,EAAI;AAAA,UAAA;AAAA,QAAA,GAEf;AAAA,QACCG,MAAiB,SAASwC;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGjC,CAAC;"}
|