@startdownnotez404/ui 1.3.5 → 1.3.6
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/AutocompleteField-653233JU.mjs +203 -0
- package/dist/AutocompleteField-653233JU.mjs.map +1 -0
- package/dist/AvatarField-KFASMVZU.mjs +378 -0
- package/dist/AvatarField-KFASMVZU.mjs.map +1 -0
- package/dist/{DateField-ZYMZFHL4.mjs → DateField-CDJ6W6XF.mjs} +19 -7
- package/dist/DateField-CDJ6W6XF.mjs.map +1 -0
- package/dist/DateRangeField-ZWSFT5KV.mjs +118 -0
- package/dist/DateRangeField-ZWSFT5KV.mjs.map +1 -0
- package/dist/{DateTimeField-TPTJ7YIZ.mjs → DateTimeField-SFAF4I6A.mjs} +36 -11
- package/dist/DateTimeField-SFAF4I6A.mjs.map +1 -0
- package/dist/FileUploadField-TSNCSLXX.mjs +101 -0
- package/dist/FileUploadField-TSNCSLXX.mjs.map +1 -0
- package/dist/{JSONEditorField-TMRWGXVR.mjs → JSONEditorField-3KXC2GOG.mjs} +7 -6
- package/dist/{JSONEditorField-TMRWGXVR.mjs.map → JSONEditorField-3KXC2GOG.mjs.map} +1 -1
- package/dist/{PopperMenu-LJ36RPBW.mjs → PopperMenu-PSHLKIEZ.mjs} +26 -12
- package/dist/{PopperMenu-LJ36RPBW.mjs.map → PopperMenu-PSHLKIEZ.mjs.map} +1 -1
- package/dist/{TelField-LOGRVZ4I.mjs → TelField-FRQT2UBJ.mjs} +8 -7
- package/dist/{TelField-LOGRVZ4I.mjs.map → TelField-FRQT2UBJ.mjs.map} +1 -1
- package/dist/TimeField-XVWXBJID.mjs +94 -0
- package/dist/TimeField-XVWXBJID.mjs.map +1 -0
- package/dist/alert.d.mts +148 -18
- package/dist/alert.d.ts +148 -18
- package/dist/alert.js +698 -254
- package/dist/alert.js.map +1 -1
- package/dist/alert.mjs +46 -10
- package/dist/autocomplete.d.mts +438 -4
- package/dist/autocomplete.d.ts +438 -4
- package/dist/autocomplete.js +632 -21
- package/dist/autocomplete.js.map +1 -1
- package/dist/autocomplete.mjs +26 -7
- package/dist/avatar.js +2 -1
- package/dist/avatar.js.map +1 -1
- package/dist/avatar.mjs +12 -11
- package/dist/box.mjs +2 -1
- package/dist/button.mjs +3 -2
- package/dist/chart.mjs +3 -2
- package/dist/checkbox.mjs +3 -2
- package/dist/chunk-2FK24ZPJ.mjs +78 -0
- package/dist/chunk-2FK24ZPJ.mjs.map +1 -0
- package/dist/{chunk-V26V2S3W.mjs → chunk-3O3N6X6D.mjs} +3 -3
- package/dist/{chunk-Y74ALKBL.mjs → chunk-4MSPA7U7.mjs} +11 -9
- package/dist/{chunk-Y74ALKBL.mjs.map → chunk-4MSPA7U7.mjs.map} +1 -1
- package/dist/{chunk-24XDGNJ6.mjs → chunk-4P45Z5LR.mjs} +63 -41
- package/dist/chunk-4P45Z5LR.mjs.map +1 -0
- package/dist/chunk-4SSJY32J.mjs +1182 -0
- package/dist/chunk-4SSJY32J.mjs.map +1 -0
- package/dist/{chunk-XJ2SXC2Q.mjs → chunk-6B6I27TT.mjs} +18 -16
- package/dist/{chunk-XJ2SXC2Q.mjs.map → chunk-6B6I27TT.mjs.map} +1 -1
- package/dist/chunk-6JKMEH2L.mjs +205 -0
- package/dist/chunk-6JKMEH2L.mjs.map +1 -0
- package/dist/{chunk-IN3O4R7Q.mjs → chunk-7O526A2D.mjs} +6 -4
- package/dist/{chunk-IN3O4R7Q.mjs.map → chunk-7O526A2D.mjs.map} +1 -1
- package/dist/chunk-AFLEG5ZC.mjs +28 -0
- package/dist/chunk-AFLEG5ZC.mjs.map +1 -0
- package/dist/{chunk-UGMRJMFZ.mjs → chunk-BO5CU4ZM.mjs} +4 -4
- package/dist/{chunk-JIU5GVM7.mjs → chunk-D4XPNSSI.mjs} +5 -3
- package/dist/{chunk-JIU5GVM7.mjs.map → chunk-D4XPNSSI.mjs.map} +1 -1
- package/dist/chunk-DPIMA5IO.mjs +72 -0
- package/dist/chunk-DPIMA5IO.mjs.map +1 -0
- package/dist/chunk-F2CGFVIZ.mjs +83 -0
- package/dist/chunk-F2CGFVIZ.mjs.map +1 -0
- package/dist/{chunk-R5MKQN6D.mjs → chunk-FBLSJQWK.mjs} +3 -3
- package/dist/{chunk-BGB7JHIU.mjs → chunk-FMGZCOJC.mjs} +5 -3
- package/dist/{chunk-BGB7JHIU.mjs.map → chunk-FMGZCOJC.mjs.map} +1 -1
- package/dist/{chunk-UTVSYS6S.mjs → chunk-FNSIQ2B7.mjs} +18 -6
- package/dist/chunk-FNSIQ2B7.mjs.map +1 -0
- package/dist/{chunk-JWANK42G.mjs → chunk-FUZ2JNTZ.mjs} +3 -3
- package/dist/{chunk-CRYIEYZZ.mjs → chunk-HAJWE62X.mjs} +66 -42
- package/dist/chunk-HAJWE62X.mjs.map +1 -0
- package/dist/{chunk-CWFWRZWU.mjs → chunk-KSN33A6I.mjs} +3 -2
- package/dist/{chunk-CWFWRZWU.mjs.map → chunk-KSN33A6I.mjs.map} +1 -1
- package/dist/chunk-KYTHGFFY.mjs +866 -0
- package/dist/chunk-KYTHGFFY.mjs.map +1 -0
- package/dist/{chunk-QKGCW37O.mjs → chunk-LDFM46LV.mjs} +5 -3
- package/dist/{chunk-QKGCW37O.mjs.map → chunk-LDFM46LV.mjs.map} +1 -1
- package/dist/chunk-LQNDBPHU.mjs +142 -0
- package/dist/chunk-LQNDBPHU.mjs.map +1 -0
- package/dist/{chunk-E3I2VDHZ.mjs → chunk-M2PYXSAF.mjs} +6 -4
- package/dist/{chunk-E3I2VDHZ.mjs.map → chunk-M2PYXSAF.mjs.map} +1 -1
- package/dist/{chunk-DELCADNF.mjs → chunk-ODVKRIVN.mjs} +30 -30
- package/dist/{chunk-HR3A4H4E.mjs → chunk-PEJL2T2K.mjs} +13 -11
- package/dist/{chunk-HR3A4H4E.mjs.map → chunk-PEJL2T2K.mjs.map} +1 -1
- package/dist/{chunk-OGNGPI3M.mjs → chunk-PL55YKT4.mjs} +2 -2
- package/dist/{chunk-S6EZVRZC.mjs → chunk-PNSJC6PC.mjs} +5 -28
- package/dist/chunk-PNSJC6PC.mjs.map +1 -0
- package/dist/{chunk-TDRA5EZI.mjs → chunk-PUREEN2J.mjs} +7 -7
- package/dist/chunk-QFS5CENY.mjs +659 -0
- package/dist/chunk-QFS5CENY.mjs.map +1 -0
- package/dist/chunk-RSN7NH2J.mjs +250 -0
- package/dist/chunk-RSN7NH2J.mjs.map +1 -0
- package/dist/{chunk-UDREPVEY.mjs → chunk-RVSMEZE3.mjs} +12 -78
- package/dist/chunk-RVSMEZE3.mjs.map +1 -0
- package/dist/{chunk-SRWPHN2N.mjs → chunk-S64IYJ6Y.mjs} +2 -2
- package/dist/{chunk-ZG3NQI77.mjs → chunk-SMD7OEUW.mjs} +6 -4
- package/dist/{chunk-ZG3NQI77.mjs.map → chunk-SMD7OEUW.mjs.map} +1 -1
- package/dist/{chunk-NJYNJLT7.mjs → chunk-SWFB3A3G.mjs} +2 -2
- package/dist/{chunk-RXBQ7KXF.mjs → chunk-USXGNKWJ.mjs} +98 -44
- package/dist/chunk-USXGNKWJ.mjs.map +1 -0
- package/dist/{chunk-OJV6V7YZ.mjs → chunk-VL7V52YD.mjs} +27 -20
- package/dist/chunk-VL7V52YD.mjs.map +1 -0
- package/dist/{chunk-2ZZJTBTE.mjs → chunk-WJZ3IYET.mjs} +2 -2
- package/dist/chunk-XAJAMVAG.mjs +1720 -0
- package/dist/chunk-XAJAMVAG.mjs.map +1 -0
- package/dist/chunk-YIJ5QVJ6.mjs +277 -0
- package/dist/chunk-YIJ5QVJ6.mjs.map +1 -0
- package/dist/{chunk-T6AMRENK.mjs → chunk-YRW5NKD7.mjs} +148 -112
- package/dist/chunk-YRW5NKD7.mjs.map +1 -0
- package/dist/chunk-ZMJKG2UI.mjs +71 -0
- package/dist/chunk-ZMJKG2UI.mjs.map +1 -0
- package/dist/confirm.d.mts +48 -0
- package/dist/confirm.d.ts +48 -0
- package/dist/confirm.js +334 -0
- package/dist/confirm.js.map +1 -0
- package/dist/confirm.mjs +20 -0
- package/dist/datePicker.d.mts +256 -14
- package/dist/datePicker.d.ts +256 -14
- package/dist/datePicker.js +1624 -145
- package/dist/datePicker.js.map +1 -1
- package/dist/datePicker.mjs +19 -6
- package/dist/dialog.d.mts +166 -0
- package/dist/dialog.d.ts +166 -0
- package/dist/dialog.js +362 -0
- package/dist/dialog.js.map +1 -0
- package/dist/dialog.mjs +45 -0
- package/dist/emptyState.d.mts +17 -0
- package/dist/emptyState.d.ts +17 -0
- package/dist/emptyState.js +253 -0
- package/dist/emptyState.js.map +1 -0
- package/dist/emptyState.mjs +12 -0
- package/dist/emptyState.mjs.map +1 -0
- package/dist/errorState.d.mts +18 -0
- package/dist/errorState.d.ts +18 -0
- package/dist/{displayFile.js → errorState.js} +107 -156
- package/dist/errorState.js.map +1 -0
- package/dist/errorState.mjs +15 -0
- package/dist/errorState.mjs.map +1 -0
- package/dist/fileUpload.d.mts +197 -0
- package/dist/fileUpload.d.ts +197 -0
- package/dist/fileUpload.js +1483 -0
- package/dist/fileUpload.js.map +1 -0
- package/dist/fileUpload.mjs +65 -0
- package/dist/fileUpload.mjs.map +1 -0
- package/dist/flowMap.mjs +7 -6
- package/dist/flowMap.mjs.map +1 -1
- package/dist/image.js +1195 -429
- package/dist/image.js.map +1 -1
- package/dist/image.mjs +8 -6
- package/dist/index.d.ts +7 -2
- package/dist/index.js +8606 -4087
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +314 -152
- package/dist/inlineError.d.mts +16 -0
- package/dist/inlineError.d.ts +16 -0
- package/dist/inlineError.js +297 -0
- package/dist/inlineError.js.map +1 -0
- package/dist/inlineError.mjs +15 -0
- package/dist/inlineError.mjs.map +1 -0
- package/dist/input.mjs +8 -7
- package/dist/jsonEditor.mjs +3 -2
- package/dist/list.mjs +7 -6
- package/dist/loading.mjs +8 -6
- package/dist/markdown.mjs +7 -6
- package/dist/markdown.mjs.map +1 -1
- package/dist/menu.mjs +9 -8
- package/dist/modal.js +2 -1
- package/dist/modal.js.map +1 -1
- package/dist/modal.mjs +7 -5
- package/dist/process.d.mts +33 -75
- package/dist/process.d.ts +33 -75
- package/dist/process.js +1275 -203
- package/dist/process.js.map +1 -1
- package/dist/process.mjs +12 -9
- package/dist/scrollToLoad.mjs +4 -3
- package/dist/select.mjs +10 -9
- package/dist/skeleton.d.mts +15 -1
- package/dist/skeleton.d.ts +15 -1
- package/dist/skeleton.js +114 -2
- package/dist/skeleton.js.map +1 -1
- package/dist/skeleton.mjs +6 -3
- package/dist/stepper.mjs +4 -3
- package/dist/tab.mjs +10 -9
- package/dist/table.d.mts +269 -85
- package/dist/table.d.ts +269 -85
- package/dist/table.js +5102 -3153
- package/dist/table.js.map +1 -1
- package/dist/table.mjs +21 -19
- package/dist/theme.js +1766 -432
- package/dist/theme.js.map +1 -1
- package/dist/theme.mjs +32 -25
- package/dist/timeline.mjs +4 -3
- package/dist/toast.d.mts +49 -0
- package/dist/toast.d.ts +49 -0
- package/dist/toast.js +175 -0
- package/dist/toast.js.map +1 -0
- package/dist/toast.mjs +9 -0
- package/dist/toast.mjs.map +1 -0
- package/dist/toggleButtonGroup.mjs +3 -2
- package/dist/useForm.d.mts +270 -86
- package/dist/useForm.d.ts +270 -86
- package/dist/useForm.js +4672 -2727
- package/dist/useForm.js.map +1 -1
- package/dist/useForm.mjs +18 -16
- package/dist/useSearch.mjs +13 -12
- package/dist/variablesRenderer.mjs +8 -7
- package/package.json +3 -3
- package/dist/AutocompleteField-ZKNU2IRR.mjs +0 -181
- package/dist/AutocompleteField-ZKNU2IRR.mjs.map +0 -1
- package/dist/AvatarField-SAODT3CZ.mjs +0 -275
- package/dist/AvatarField-SAODT3CZ.mjs.map +0 -1
- package/dist/DateField-ZYMZFHL4.mjs.map +0 -1
- package/dist/DateTimeField-TPTJ7YIZ.mjs.map +0 -1
- package/dist/FileUploadField-NTMWBJER.mjs +0 -78
- package/dist/FileUploadField-NTMWBJER.mjs.map +0 -1
- package/dist/chunk-24XDGNJ6.mjs.map +0 -1
- package/dist/chunk-27KYFU7R.mjs +0 -30
- package/dist/chunk-27KYFU7R.mjs.map +0 -1
- package/dist/chunk-AAH2O24U.mjs +0 -325
- package/dist/chunk-AAH2O24U.mjs.map +0 -1
- package/dist/chunk-CRYIEYZZ.mjs.map +0 -1
- package/dist/chunk-EEH7HACG.mjs +0 -249
- package/dist/chunk-EEH7HACG.mjs.map +0 -1
- package/dist/chunk-EKPULYPU.mjs +0 -497
- package/dist/chunk-EKPULYPU.mjs.map +0 -1
- package/dist/chunk-OJV6V7YZ.mjs.map +0 -1
- package/dist/chunk-RXBQ7KXF.mjs.map +0 -1
- package/dist/chunk-S6EZVRZC.mjs.map +0 -1
- package/dist/chunk-SGCUDWO3.mjs +0 -396
- package/dist/chunk-SGCUDWO3.mjs.map +0 -1
- package/dist/chunk-T6AMRENK.mjs.map +0 -1
- package/dist/chunk-UDREPVEY.mjs.map +0 -1
- package/dist/chunk-UTVSYS6S.mjs.map +0 -1
- package/dist/chunk-XIMFP6RB.mjs +0 -161
- package/dist/chunk-XIMFP6RB.mjs.map +0 -1
- package/dist/displayFile.d.mts +0 -95
- package/dist/displayFile.d.ts +0 -95
- package/dist/displayFile.js.map +0 -1
- package/dist/displayFile.mjs +0 -19
- package/dist/fileUploader.d.mts +0 -86
- package/dist/fileUploader.d.ts +0 -86
- package/dist/fileUploader.js +0 -722
- package/dist/fileUploader.js.map +0 -1
- package/dist/fileUploader.mjs +0 -16
- /package/dist/{chunk-V26V2S3W.mjs.map → chunk-3O3N6X6D.mjs.map} +0 -0
- /package/dist/{chunk-UGMRJMFZ.mjs.map → chunk-BO5CU4ZM.mjs.map} +0 -0
- /package/dist/{chunk-R5MKQN6D.mjs.map → chunk-FBLSJQWK.mjs.map} +0 -0
- /package/dist/{chunk-JWANK42G.mjs.map → chunk-FUZ2JNTZ.mjs.map} +0 -0
- /package/dist/{chunk-DELCADNF.mjs.map → chunk-ODVKRIVN.mjs.map} +0 -0
- /package/dist/{chunk-OGNGPI3M.mjs.map → chunk-PL55YKT4.mjs.map} +0 -0
- /package/dist/{chunk-TDRA5EZI.mjs.map → chunk-PUREEN2J.mjs.map} +0 -0
- /package/dist/{chunk-SRWPHN2N.mjs.map → chunk-S64IYJ6Y.mjs.map} +0 -0
- /package/dist/{chunk-NJYNJLT7.mjs.map → chunk-SWFB3A3G.mjs.map} +0 -0
- /package/dist/{chunk-2ZZJTBTE.mjs.map → chunk-WJZ3IYET.mjs.map} +0 -0
- /package/dist/{displayFile.mjs.map → confirm.mjs.map} +0 -0
- /package/dist/{fileUploader.mjs.map → dialog.mjs.map} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/elemental/DatePicker/src/MuiXDatePicker.tsx","../src/components/elemental/DatePicker/src/MuiXDateTimePicker.tsx","../src/components/elemental/DatePicker/src/MuiXTimePicker.tsx","../src/components/elemental/DatePicker/src/MuiXDateRangePicker.tsx","../src/components/elemental/DatePicker/src/theme.ts"],"sourcesContent":["'use client'\nimport React from 'react'\nimport dayjs, { type Dayjs } from 'dayjs'\nimport customParseFormat from 'dayjs/plugin/customParseFormat'\nimport { LocalizationProvider } from '@mui/x-date-pickers/LocalizationProvider'\nimport { AdapterDayjs } from '@mui/x-date-pickers/AdapterDayjs'\nimport { DateCalendar } from '@mui/x-date-pickers/DateCalendar'\nimport DialogActions from '@mui/material/DialogActions'\nimport InputAdornment from '@mui/material/InputAdornment'\n\nimport { Box } from '@/ele/Box'\nimport { Paper } from '@/ele/Paper'\nimport { Popper, ClickAwayListener } from '@/ele/Overlay'\nimport { IconButton } from '@/ele/Button'\nimport { TextField } from '@/ele/Input'\nimport {\n CheckIcon,\n ClearIcon,\n DeleteForeverIcon,\n TodayIcon,\n CalendarTodayIcon,\n} from '@/icons/MuiIcon'\n\ndayjs.extend(customParseFormat)\n\n/** Display / default parse format — matches prior MUI Date field for en-US. */\nconst DISPLAY_DATE_FMT = 'MM/DD/YYYY'\n\nexport type MuiXDatePickerProps = {\n /** Controlled value (Dayjs, Date, or null). Prefer this in forms/stories. */\n value?: Dayjs | Date | string | null\n /** Uncontrolled initial value when `value` is omitted. */\n defaultValue?: Dayjs | Date | string | null\n /**\n * Called with Dayjs | null (same shape as MUI DatePicker) so UseForm DateField\n * can keep using `d?.toDate?.()`.\n */\n onChange?: (value: Dayjs | null) => void\n label?: string\n disabled?: boolean\n /** Override display format (default `MM/DD/YYYY`). */\n format?: string\n /** Optional sx for the outer field wrapper. */\n sx?: React.ComponentProps<typeof Box>['sx']\n /**\n * When true, the trigger field stays read-only (calendar-only).\n * Default false — user can type a date string and commit on blur/Enter.\n */\n disableTyping?: boolean\n /**\n * Legacy passthrough kept for UseForm slotProps compatibility.\n * `textField` bits are applied to the trigger field.\n */\n slotProps?: {\n textField?: Record<string, unknown>\n openPickerIcon?: Record<string, unknown>\n actionBar?: Record<string, unknown>\n }\n}\n\nconst toDayjs = (v: Dayjs | Date | string | null | undefined): Dayjs | null => {\n if (v == null || v === '') return null\n const d = dayjs(v)\n return d.isValid() ? d : null\n}\n\nconst formatDateLabel = (v: Dayjs | null, fmt: string): string =>\n v && v.isValid() ? v.format(fmt) : ''\n\n/**\n * Date-only formats (align with DateTime / DateRange per-half formats).\n * Tried strictly before a loose dayjs parse.\n */\nconst DATE_PARSE_FORMATS = [\n DISPLAY_DATE_FMT,\n 'M/D/YYYY',\n 'YYYY-MM-DD',\n 'MMM D, YYYY',\n 'D MMM YYYY',\n 'MMM D YYYY',\n 'YYYY/MM/DD',\n] as const\n\n/**\n * Parse typed date text into a Dayjs (start of day).\n * Returns `null` for empty clear; `'invalid'` when unparseable (caller reverts).\n */\nconst parseDateInput = (raw: string): Dayjs | null | 'invalid' => {\n const trimmed = raw.trim()\n if (!trimmed) return null\n\n for (const fmt of DATE_PARSE_FORMATS) {\n const d = dayjs(trimmed, fmt, true)\n if (d.isValid()) return d.startOf('day')\n }\n\n // Loose dayjs last resort (ISO / locale strings)\n const loose = dayjs(trimmed)\n if (loose.isValid()) return loose.startOf('day')\n\n return 'invalid'\n}\n\n/**\n * Soft/quiet DatePicker with a typeable trigger field.\n *\n * Trigger text is editable by default (commit on blur/Enter). Calendar icon\n * opens the DateCalendar popover; focusing/typing the field does not.\n * Pass `disableTyping` for read-only calendar-only mode.\n *\n * Invalid typed input reverts to the last committed label.\n * Escape cancels the edit without committing.\n */\nexport const MuiXDatePicker: React.FC<MuiXDatePickerProps> = ({\n value: valueProp,\n defaultValue,\n onChange,\n label = 'Pick a date',\n disabled,\n format: formatProp,\n sx,\n disableTyping = false,\n slotProps,\n}) => {\n const displayFmt = formatProp ?? DISPLAY_DATE_FMT\n\n const isControlled = valueProp !== undefined\n const [uncontrolled, setUncontrolled] = React.useState<Dayjs | null>(() =>\n toDayjs(defaultValue),\n )\n const value = isControlled ? toDayjs(valueProp) : uncontrolled\n\n const [open, setOpen] = React.useState(false)\n const [draft, setDraft] = React.useState<Dayjs | null>(value)\n\n const committedLabel = formatDateLabel(value, displayFmt)\n const [inputText, setInputText] = React.useState(committedLabel)\n const [fieldFocused, setFieldFocused] = React.useState(false)\n const typingEnabled = !disableTyping\n const skipCommitOnBlurRef = React.useRef(false)\n\n const anchorRef = React.useRef<HTMLDivElement | null>(null)\n const [anchorEl, setAnchorEl] = React.useState<HTMLElement | null>(null)\n\n const tf = (slotProps?.textField ?? {}) as Record<string, unknown>\n const mergedDisabled = disabled ?? (tf.disabled as boolean | undefined)\n const mergedRequired = Boolean(tf.required)\n const mergedError = Boolean(tf.error)\n const helperText = tf.helperText as React.ReactNode | undefined\n\n const commit = (next: Dayjs | null) => {\n if (!isControlled) setUncontrolled(next)\n onChange?.(next)\n return next\n }\n\n // Sync display text from committed value when not actively typing.\n React.useEffect(() => {\n if (!fieldFocused) setInputText(committedLabel)\n }, [committedLabel, fieldFocused])\n\n const commitTypedInput = () => {\n if (!typingEnabled) return\n const parsed = parseDateInput(inputText)\n if (parsed === 'invalid') {\n setInputText(committedLabel)\n return\n }\n const next = commit(parsed)\n setDraft(next)\n setInputText(formatDateLabel(next, displayFmt))\n }\n\n const openPicker = () => {\n if (mergedDisabled) return\n setDraft(value)\n setOpen(true)\n }\n\n const closePicker = () => {\n setOpen(false)\n }\n\n const handleAccept = () => {\n commit(draft)\n setInputText(formatDateLabel(draft, displayFmt))\n closePicker()\n }\n\n const handleCancel = () => {\n setDraft(value)\n closePicker()\n }\n\n const handleClear = () => {\n setDraft(null)\n }\n\n const handleToday = () => {\n setDraft(dayjs().startOf('day'))\n }\n\n const handleCalendarChange = (d: Dayjs | null) => {\n if (!d) {\n setDraft(null)\n return\n }\n setDraft(dayjs(d).startOf('day'))\n }\n\n return (\n <LocalizationProvider dateAdapter={AdapterDayjs}>\n <Box sx={{ display: 'inline-flex', flexDirection: 'column', ...((sx as object) || {}) }}>\n <Box\n ref={(el: HTMLDivElement | null) => {\n anchorRef.current = el\n setAnchorEl(el)\n }}\n sx={{ display: 'inline-flex', minWidth: 200 }}\n >\n <TextField\n size=\"small\"\n fullWidth\n label={label}\n value={typingEnabled ? inputText : committedLabel}\n placeholder={displayFmt}\n disabled={mergedDisabled}\n required={mergedRequired}\n error={mergedError}\n helperText={helperText}\n onClick={typingEnabled ? undefined : openPicker}\n onFocus={() => {\n if (typingEnabled) {\n setFieldFocused(true)\n } else {\n openPicker()\n }\n }}\n onBlur={() => {\n if (!typingEnabled) return\n setFieldFocused(false)\n if (skipCommitOnBlurRef.current) {\n skipCommitOnBlurRef.current = false\n setInputText(committedLabel)\n return\n }\n commitTypedInput()\n }}\n onChange={(e) => {\n if (!typingEnabled) return\n setInputText(e.target.value)\n }}\n onKeyDown={(e) => {\n if (!typingEnabled) return\n if (e.key === 'Enter') {\n e.preventDefault()\n ;(e.target as HTMLInputElement).blur()\n }\n if (e.key === 'Escape') {\n e.preventDefault()\n skipCommitOnBlurRef.current = true\n setInputText(committedLabel)\n ;(e.target as HTMLInputElement).blur()\n }\n }}\n inputProps={{\n readOnly: !typingEnabled,\n 'aria-label': label,\n 'data-testid': 'date-field',\n }}\n InputProps={{\n endAdornment: (\n <InputAdornment position=\"end\">\n <IconButton\n size=\"small\"\n disabled={mergedDisabled}\n aria-label=\"Choose date\"\n title=\"Choose date\"\n {...(slotProps?.openPickerIcon as object)}\n onMouseDown={(e) => {\n // Keep focus in the field so blur does not race the open.\n e.preventDefault()\n }}\n onClick={(e) => {\n e.stopPropagation()\n if (open) closePicker()\n else openPicker()\n }}\n >\n <CalendarTodayIcon fontSize=\"small\" />\n </IconButton>\n </InputAdornment>\n ),\n }}\n />\n </Box>\n\n <Popper\n open={open}\n anchorEl={anchorEl}\n placement=\"bottom-start\"\n style={{ zIndex: 1300 }}\n >\n <ClickAwayListener onClickAway={handleCancel}>\n <Paper\n elevation={0}\n sx={{\n mt: 1,\n borderRadius: '20px',\n background: 'var(--mui-palette-background-default)',\n border: 'solid 1px var(--mui-palette-border-1)',\n overflow: 'hidden',\n }}\n >\n <DateCalendar\n value={draft}\n onChange={handleCalendarChange}\n showDaysOutsideCurrentMonth\n />\n <DialogActions sx={{ px: 1.5, pb: 1, justifyContent: 'flex-end', gap: 0.5 }}>\n <IconButton data-testid=\"clear-action-button\" onClick={handleClear} title=\"clear\">\n <DeleteForeverIcon fontSize=\"small\" />\n </IconButton>\n <IconButton data-testid=\"today-action-button\" onClick={handleToday} title=\"today\">\n <TodayIcon fontSize=\"small\" />\n </IconButton>\n <IconButton onClick={handleCancel} title=\"cancel\">\n <ClearIcon fontSize=\"small\" />\n </IconButton>\n <IconButton onClick={handleAccept} title=\"accept\">\n <CheckIcon fontSize=\"small\" />\n </IconButton>\n </DialogActions>\n </Paper>\n </ClickAwayListener>\n </Popper>\n </Box>\n </LocalizationProvider>\n )\n}\n\nexport default MuiXDatePicker\n","'use client'\nimport React from 'react'\nimport dayjs, { type Dayjs } from 'dayjs'\nimport customParseFormat from 'dayjs/plugin/customParseFormat'\nimport { LocalizationProvider } from '@mui/x-date-pickers/LocalizationProvider'\nimport { AdapterDayjs } from '@mui/x-date-pickers/AdapterDayjs'\nimport { DateCalendar } from '@mui/x-date-pickers/DateCalendar'\nimport { MultiSectionDigitalClock } from '@mui/x-date-pickers/MultiSectionDigitalClock'\nimport DialogActions from '@mui/material/DialogActions'\nimport InputAdornment from '@mui/material/InputAdornment'\n\nimport { Box } from '@/ele/Box'\nimport { Paper } from '@/ele/Paper'\nimport { Popper, ClickAwayListener } from '@/ele/Overlay'\nimport { IconButton } from '@/ele/Button'\nimport { TextField } from '@/ele/Input'\nimport {\n CheckIcon,\n ClearIcon,\n DeleteForeverIcon,\n CalendarTodayIcon,\n} from '@/icons/MuiIcon'\n\ndayjs.extend(customParseFormat)\n\n/** Display format — date + 12h time (matches prior MUI DateTime field for en-US). */\nconst DISPLAY_DATETIME_FMT = 'MM/DD/YYYY hh:mm a'\nconst DISPLAY_DATETIME_FMT_24 = 'MM/DD/YYYY HH:mm'\n\nexport type MuiXDateTimePickerProps = {\n /** Controlled value (Dayjs, Date, or null). Prefer this in forms/stories. */\n value?: Dayjs | Date | string | null\n /** Uncontrolled initial value when `value` is omitted. */\n defaultValue?: Dayjs | Date | string | null\n /**\n * Called with Dayjs | null (same shape as MUI DateTimePicker) so UseForm\n * DateTimeField can keep using `d?.toDate?.()`.\n */\n onChange?: (value: Dayjs | null) => void\n label?: string\n disabled?: boolean\n /** 12h + am/pm when true (default). When false, display/parse as `HH:mm`. */\n ampm?: boolean\n /** Override display format (default `MM/DD/YYYY hh:mm a` or 24h variant). */\n format?: string\n /** Optional sx for the outer field wrapper. */\n sx?: React.ComponentProps<typeof Box>['sx']\n /**\n * When true, the trigger field stays read-only (calendar-only).\n * Default false — user can type a datetime string and commit on blur/Enter.\n */\n disableTyping?: boolean\n /**\n * Legacy passthrough kept for UseForm slotProps compatibility.\n * `textField` bits are applied to the trigger field.\n */\n slotProps?: {\n textField?: Record<string, unknown>\n openPickerIcon?: Record<string, unknown>\n actionBar?: Record<string, unknown>\n }\n}\n\nconst toDayjs = (v: Dayjs | Date | string | null | undefined): Dayjs | null => {\n if (v == null || v === '') return null\n const d = dayjs(v)\n return d.isValid() ? d : null\n}\n\nconst formatDateTimeLabel = (v: Dayjs | null, fmt: string): string =>\n v && v.isValid() ? v.format(fmt) : ''\n\n/** Date-only formats (align with DateRange). */\nconst DATE_PARSE_FORMATS = [\n 'MM/DD/YYYY',\n 'M/D/YYYY',\n 'YYYY-MM-DD',\n 'MMM D, YYYY',\n 'D MMM YYYY',\n 'MMM D YYYY',\n 'YYYY/MM/DD',\n] as const\n\nconst MERIDIEM_TIME_FORMATS = [\n 'hh:mm a',\n 'h:mm a',\n 'hh:mma',\n 'h:mma',\n 'hh:mm A',\n 'h:mm A',\n 'hh:mmA',\n 'h:mmA',\n] as const\n\n/** Full datetime strings tried strictly before loose dayjs. */\nconst DATETIME_PARSE_FORMATS = [\n DISPLAY_DATETIME_FMT,\n 'MM/DD/YYYY h:mm a',\n 'M/D/YYYY hh:mm a',\n 'M/D/YYYY h:mm a',\n 'MM/DD/YYYY hh:mma',\n 'M/D/YYYY h:mma',\n 'MM/DD/YYYY HH:mm',\n 'M/D/YYYY H:mm',\n 'MM/DD/YYYY H:mm',\n 'YYYY-MM-DD HH:mm',\n 'YYYY-MM-DD H:mm',\n 'YYYY-MM-DDTHH:mm',\n 'YYYY-MM-DDTHH:mm:ss',\n 'YYYY-MM-DD HH:mm:ss',\n 'MMM D, YYYY hh:mm a',\n 'MMM D, YYYY h:mm a',\n 'MMM D, YYYY HH:mm',\n] as const\n\nconst stampDateTime = (\n datePart: Dayjs,\n hour: number,\n minute: number,\n): Dayjs => datePart.hour(hour).minute(minute).second(0).millisecond(0)\n\n/**\n * Parse a time-of-day fragment (same rules as Time picker).\n * Returns `'invalid'` when unparseable.\n */\nconst parseTimeFragment = (\n raw: string,\n opts: { ampm: boolean; anchorHour: number | null },\n): { hour: number; minute: number } | 'invalid' => {\n const trimmed = raw.trim()\n if (!trimmed) return 'invalid'\n\n const normalized = trimmed\n .replace(/\\s+/g, ' ')\n .replace(/(\\d)\\s*([ap])\\.?m\\.?$/i, (_, d, p) => `${d} ${p.toLowerCase()}m`)\n\n for (const fmt of MERIDIEM_TIME_FORMATS) {\n const d = dayjs(normalized, fmt, true)\n if (d.isValid()) return { hour: d.hour(), minute: d.minute() }\n }\n\n const bare = normalized.match(/^(\\d{1,2})\\s*:\\s*(\\d{2})$/)\n if (bare) {\n const hour = Number(bare[1])\n const minute = Number(bare[2])\n if (minute > 59 || hour > 23) return 'invalid'\n\n if (!opts.ampm || hour > 12 || (hour === 0 && bare[1].length === 2)) {\n return { hour, minute }\n }\n\n let h12 = hour % 12\n if (opts.anchorHour != null && opts.anchorHour >= 12) {\n h12 += 12\n }\n if (hour === 12 && opts.anchorHour == null) {\n h12 = 12\n } else if (hour === 12 && opts.anchorHour != null) {\n h12 = opts.anchorHour >= 12 ? 12 : 0\n }\n return { hour: h12, minute }\n }\n\n for (const fmt of ['HH:mm', 'H:mm'] as const) {\n const d = dayjs(normalized, fmt, true)\n if (d.isValid()) return { hour: d.hour(), minute: d.minute() }\n }\n\n return 'invalid'\n}\n\nconst parseDateFragment = (raw: string): Dayjs | null | 'invalid' => {\n const t = raw.trim()\n if (!t) return null\n for (const fmt of DATE_PARSE_FORMATS) {\n const d = dayjs(t, fmt, true)\n if (d.isValid()) return d.startOf('day')\n }\n const loose = dayjs(t)\n if (loose.isValid()) return loose.startOf('day')\n return 'invalid'\n}\n\n/**\n * Split \"date time\" — prefer last whitespace before a time-looking token so\n * \"MMM D, YYYY h:mm a\" keeps the comma date intact.\n */\nconst splitDateAndTime = (raw: string): [string, string] | null => {\n const s = raw.trim()\n // Explicit ISO T separator\n const isoT = s.match(/^(\\d{4}-\\d{2}-\\d{2})[T\\s]+(.+)$/i)\n if (isoT) return [isoT[1], isoT[2]]\n\n // Trailing time: ... HH:mm (optional am/pm)\n const m = s.match(/^(.+?)\\s+(\\d{1,2}:\\d{2}(?:\\s*[ap]\\.?m\\.?)?)$/i)\n if (m) return [m[1], m[2]]\n\n return null\n}\n\n/**\n * Parse typed datetime text into a Dayjs.\n * Returns `null` for empty clear; `'invalid'` when unparseable (caller reverts).\n *\n * Order: full datetime formats -> date + time halves -> date-only (keeps time from\n * `anchor`, else 00:00) -> loose dayjs.\n */\nconst parseDateTimeInput = (\n raw: string,\n opts: { ampm: boolean; anchor: Dayjs | null },\n): Dayjs | null | 'invalid' => {\n const trimmed = raw.trim()\n if (!trimmed) return null\n\n const normalized = trimmed\n .replace(/\\s+/g, ' ')\n .replace(/(\\d)\\s*([ap])\\.?m\\.?$/i, (_, d, p) => `${d} ${p.toLowerCase()}m`)\n\n // 1) Strict full datetime formats\n for (const fmt of DATETIME_PARSE_FORMATS) {\n const d = dayjs(normalized, fmt, true)\n if (d.isValid()) return d.second(0).millisecond(0)\n }\n\n // 2) Date half + time half\n const halves = splitDateAndTime(normalized)\n if (halves) {\n const datePart = parseDateFragment(halves[0])\n if (datePart === 'invalid' || datePart == null) return 'invalid'\n const timePart = parseTimeFragment(halves[1], {\n ampm: opts.ampm,\n anchorHour: opts.anchor && opts.anchor.isValid() ? opts.anchor.hour() : null,\n })\n if (timePart === 'invalid') return 'invalid'\n return stampDateTime(datePart, timePart.hour, timePart.minute)\n }\n\n // 3) Date-only — keep existing time when editing, else midnight\n const dateOnly = parseDateFragment(normalized)\n if (dateOnly !== 'invalid' && dateOnly != null) {\n if (opts.anchor && opts.anchor.isValid()) {\n return stampDateTime(dateOnly, opts.anchor.hour(), opts.anchor.minute())\n }\n return stampDateTime(dateOnly, 0, 0)\n }\n\n // 4) Loose dayjs last resort (ISO / locale strings)\n const loose = dayjs(trimmed)\n if (loose.isValid()) return loose.second(0).millisecond(0)\n\n return 'invalid'\n}\n\n/**\n * Soft/quiet DateTimePicker with a typeable trigger field.\n *\n * Trigger text is editable by default (commit on blur/Enter). Calendar icon\n * opens the date+time popover; focusing/typing the field does not.\n * Pass `disableTyping` for read-only calendar-only mode.\n *\n * Invalid typed input reverts to the last committed label.\n * Escape cancels the edit without committing.\n */\nexport const MuiXDateTimePicker: React.FC<MuiXDateTimePickerProps> = ({\n value: valueProp,\n defaultValue,\n onChange,\n label = 'Pick date & time',\n disabled,\n ampm = true,\n format: formatProp,\n sx,\n disableTyping = false,\n slotProps,\n}) => {\n const displayFmt = formatProp ?? (ampm ? DISPLAY_DATETIME_FMT : DISPLAY_DATETIME_FMT_24)\n\n const isControlled = valueProp !== undefined\n const [uncontrolled, setUncontrolled] = React.useState<Dayjs | null>(() =>\n toDayjs(defaultValue),\n )\n const value = isControlled ? toDayjs(valueProp) : uncontrolled\n\n const [open, setOpen] = React.useState(false)\n const [draft, setDraft] = React.useState<Dayjs | null>(value)\n\n const committedLabel = formatDateTimeLabel(value, displayFmt)\n const [inputText, setInputText] = React.useState(committedLabel)\n const [fieldFocused, setFieldFocused] = React.useState(false)\n const typingEnabled = !disableTyping\n const skipCommitOnBlurRef = React.useRef(false)\n\n const anchorRef = React.useRef<HTMLDivElement | null>(null)\n const [anchorEl, setAnchorEl] = React.useState<HTMLElement | null>(null)\n\n const tf = (slotProps?.textField ?? {}) as Record<string, unknown>\n const mergedDisabled = disabled ?? (tf.disabled as boolean | undefined)\n const mergedRequired = Boolean(tf.required)\n const mergedError = Boolean(tf.error)\n const helperText = tf.helperText as React.ReactNode | undefined\n\n const commit = (next: Dayjs | null) => {\n if (!isControlled) setUncontrolled(next)\n onChange?.(next)\n return next\n }\n\n // Sync display text from committed value when not actively typing.\n React.useEffect(() => {\n if (!fieldFocused) setInputText(committedLabel)\n }, [committedLabel, fieldFocused])\n\n const commitTypedInput = () => {\n if (!typingEnabled) return\n const parsed = parseDateTimeInput(inputText, { ampm, anchor: value })\n if (parsed === 'invalid') {\n setInputText(committedLabel)\n return\n }\n const next = commit(parsed)\n setDraft(next)\n setInputText(formatDateTimeLabel(next, displayFmt))\n }\n\n const openPicker = () => {\n if (mergedDisabled) return\n setDraft(value)\n setOpen(true)\n }\n\n const closePicker = () => {\n setOpen(false)\n }\n\n const handleAccept = () => {\n commit(draft)\n setInputText(formatDateTimeLabel(draft, displayFmt))\n closePicker()\n }\n\n const handleCancel = () => {\n setDraft(value)\n closePicker()\n }\n\n const handleClear = () => {\n setDraft(null)\n }\n\n const handleCalendarChange = (d: Dayjs | null) => {\n if (!d) {\n setDraft(null)\n return\n }\n if (draft && draft.isValid()) {\n setDraft(stampDateTime(d, draft.hour(), draft.minute()))\n } else {\n // Fresh pick — keep current clock time so time section is not midnight-only.\n const now = dayjs()\n setDraft(stampDateTime(d, now.hour(), now.minute()))\n }\n }\n\n const handleClockChange = (v: Dayjs | null) => {\n if (!v) return\n const base = draft && draft.isValid() ? draft : dayjs()\n setDraft(stampDateTime(base, dayjs(v).hour(), dayjs(v).minute()))\n }\n\n const clockViews = ampm\n ? (['hours', 'minutes', 'meridiem'] as const)\n : (['hours', 'minutes'] as const)\n\n const placeholder = ampm ? 'MM/DD/YYYY hh:mm aa' : 'MM/DD/YYYY HH:mm'\n\n return (\n <LocalizationProvider dateAdapter={AdapterDayjs}>\n <Box sx={{ display: 'inline-flex', flexDirection: 'column', ...((sx as object) || {}) }}>\n <Box\n ref={(el: HTMLDivElement | null) => {\n anchorRef.current = el\n setAnchorEl(el)\n }}\n sx={{ display: 'inline-flex', minWidth: 260 }}\n >\n <TextField\n size=\"small\"\n fullWidth\n label={label}\n value={typingEnabled ? inputText : committedLabel}\n placeholder={placeholder}\n disabled={mergedDisabled}\n required={mergedRequired}\n error={mergedError}\n helperText={helperText}\n onClick={typingEnabled ? undefined : openPicker}\n onFocus={() => {\n if (typingEnabled) {\n setFieldFocused(true)\n } else {\n openPicker()\n }\n }}\n onBlur={() => {\n if (!typingEnabled) return\n setFieldFocused(false)\n if (skipCommitOnBlurRef.current) {\n skipCommitOnBlurRef.current = false\n setInputText(committedLabel)\n return\n }\n commitTypedInput()\n }}\n onChange={(e) => {\n if (!typingEnabled) return\n setInputText(e.target.value)\n }}\n onKeyDown={(e) => {\n if (!typingEnabled) return\n if (e.key === 'Enter') {\n e.preventDefault()\n ;(e.target as HTMLInputElement).blur()\n }\n if (e.key === 'Escape') {\n e.preventDefault()\n skipCommitOnBlurRef.current = true\n setInputText(committedLabel)\n ;(e.target as HTMLInputElement).blur()\n }\n }}\n inputProps={{\n readOnly: !typingEnabled,\n 'aria-label': label,\n 'data-testid': 'datetime-field',\n }}\n InputProps={{\n endAdornment: (\n <InputAdornment position=\"end\">\n <IconButton\n size=\"small\"\n disabled={mergedDisabled}\n aria-label=\"Choose date and time\"\n title=\"Choose date and time\"\n {...(slotProps?.openPickerIcon as object)}\n onMouseDown={(e) => {\n // Keep focus in the field so blur does not race the open.\n e.preventDefault()\n }}\n onClick={(e) => {\n e.stopPropagation()\n if (open) closePicker()\n else openPicker()\n }}\n >\n <CalendarTodayIcon fontSize=\"small\" />\n </IconButton>\n </InputAdornment>\n ),\n }}\n />\n </Box>\n\n <Popper\n open={open}\n anchorEl={anchorEl}\n placement=\"bottom-start\"\n style={{ zIndex: 1300 }}\n >\n <ClickAwayListener onClickAway={handleCancel}>\n <Paper\n elevation={0}\n sx={{\n mt: 1,\n borderRadius: '20px',\n background: 'var(--mui-palette-background-default)',\n border: 'solid 1px var(--mui-palette-border-1)',\n overflow: 'hidden',\n }}\n >\n <Box\n sx={{\n display: 'flex',\n flexDirection: { xs: 'column', sm: 'row' },\n alignItems: 'stretch',\n }}\n >\n <DateCalendar\n value={draft}\n onChange={handleCalendarChange}\n showDaysOutsideCurrentMonth\n />\n <Box\n sx={{\n px: 1,\n pt: 1,\n borderLeft: {\n sm: 'solid 1px var(--mui-palette-border-1)',\n },\n borderTop: {\n xs: 'solid 1px var(--mui-palette-border-1)',\n sm: 'none',\n },\n display: 'flex',\n alignItems: 'center',\n }}\n >\n <MultiSectionDigitalClock\n ampm={ampm}\n value={draft}\n onChange={handleClockChange}\n views={[...clockViews]}\n />\n </Box>\n </Box>\n <DialogActions sx={{ px: 1.5, pb: 1, justifyContent: 'flex-end', gap: 0.5 }}>\n <IconButton data-testid=\"clear-action-button\" onClick={handleClear} title=\"clear\">\n <DeleteForeverIcon fontSize=\"small\" />\n </IconButton>\n <IconButton onClick={handleCancel} title=\"cancel\">\n <ClearIcon fontSize=\"small\" />\n </IconButton>\n <IconButton onClick={handleAccept} title=\"accept\">\n <CheckIcon fontSize=\"small\" />\n </IconButton>\n </DialogActions>\n </Paper>\n </ClickAwayListener>\n </Popper>\n </Box>\n </LocalizationProvider>\n )\n}\n\nexport default MuiXDateTimePicker\n","'use client'\nimport React from 'react'\nimport dayjs, { type Dayjs } from 'dayjs'\nimport customParseFormat from 'dayjs/plugin/customParseFormat'\nimport { LocalizationProvider } from '@mui/x-date-pickers/LocalizationProvider'\nimport { AdapterDayjs } from '@mui/x-date-pickers/AdapterDayjs'\nimport { MultiSectionDigitalClock } from '@mui/x-date-pickers/MultiSectionDigitalClock'\nimport DialogActions from '@mui/material/DialogActions'\nimport InputAdornment from '@mui/material/InputAdornment'\nimport AccessTimeIcon from '@mui/icons-material/AccessTime'\n\nimport { Box } from '@/ele/Box'\nimport { Paper } from '@/ele/Paper'\nimport { Popper, ClickAwayListener } from '@/ele/Overlay'\nimport { IconButton } from '@/ele/Button'\nimport { TextField } from '@/ele/Input'\nimport {\n CheckIcon,\n ClearIcon,\n DeleteForeverIcon,\n} from '@/icons/MuiIcon'\n\ndayjs.extend(customParseFormat)\n\n/** Display / default parse format — 12h with am/pm (matches prior MUI Time field). */\nconst DISPLAY_TIME_FMT = 'hh:mm a'\n\n\nexport type MuiXTimePickerProps = {\n /** Controlled value (Dayjs, Date, or null). Prefer this in forms/stories. */\n value?: Dayjs | Date | string | null\n /** Uncontrolled initial value when `value` is omitted. */\n defaultValue?: Dayjs | Date | string | null\n /**\n * Called with Dayjs | null (same shape as MUI TimePicker) so UseForm TimeField\n * can keep using `d?.toDate?.()`.\n */\n onChange?: (value: Dayjs | null) => void\n label?: string\n disabled?: boolean\n /** 12h + am/pm when true (default). When false, display/parse as `HH:mm`. */\n ampm?: boolean\n /** Override display format (default `hh:mm a` or `HH:mm` when ampm=false). */\n format?: string\n /** Optional sx for the outer field wrapper. */\n sx?: React.ComponentProps<typeof Box>['sx']\n /**\n * When true, the trigger field stays read-only (clock-only).\n * Default false — user can type a time string and commit on blur/Enter.\n */\n disableTyping?: boolean\n /**\n * Legacy passthrough kept for UseForm slotProps compatibility.\n * `textField` bits are applied to the trigger field.\n */\n slotProps?: {\n textField?: Record<string, unknown>\n openPickerIcon?: Record<string, unknown>\n actionBar?: Record<string, unknown>\n }\n}\n\nconst toDayjs = (v: Dayjs | Date | string | null | undefined): Dayjs | null => {\n if (v == null || v === '') return null\n const d = dayjs(v)\n return d.isValid() ? d : null\n}\n\nconst formatTimeLabel = (v: Dayjs | null, fmt: string): string =>\n v && v.isValid() ? v.format(fmt) : ''\n\nconst MERIDIEM_PARSE_FORMATS = [\n 'hh:mm a',\n 'h:mm a',\n 'hh:mma',\n 'h:mma',\n 'hh:mm A',\n 'h:mm A',\n 'hh:mmA',\n 'h:mmA',\n] as const\n\nconst stampTime = (anchor: Dayjs | null, hour: number, minute: number): Dayjs => {\n const base = anchor && anchor.isValid() ? anchor : dayjs()\n return base.hour(hour).minute(minute).second(0).millisecond(0)\n}\n\n/**\n * Parse typed time text into a Dayjs (keeps calendar day from `anchor` when set).\n * Returns `null` for empty clear; `'invalid'` when unparseable (caller reverts).\n *\n * Order: meridiem strings → 24h when hour > 12 (or 00) → bare h:mm with anchor\n * period (else AM).\n */\nconst parseTimeInput = (\n raw: string,\n opts: { ampm: boolean; anchor: Dayjs | null },\n): Dayjs | null | 'invalid' => {\n const trimmed = raw.trim()\n if (!trimmed) return null\n\n // Normalize compact am/pm: \"4:15pm\" / \"04:15PM\" → spaced for dayjs formats.\n const normalized = trimmed\n .replace(/\\s+/g, ' ')\n .replace(/(\\d)\\s*([ap])\\.?m\\.?$/i, (_, d, p) => `${d} ${p.toLowerCase()}m`)\n\n // 1) Explicit am/pm (always accepted).\n for (const fmt of MERIDIEM_PARSE_FORMATS) {\n const d = dayjs(normalized, fmt, true)\n if (d.isValid()) return stampTime(opts.anchor, d.hour(), d.minute())\n }\n\n // 2) Plain hour:minute — decide 24h vs 12h+anchor.\n const bare = normalized.match(/^(\\d{1,2})\\s*:\\s*(\\d{2})$/)\n if (bare) {\n const hour = Number(bare[1])\n const minute = Number(bare[2])\n if (minute > 59 || hour > 23) return 'invalid'\n\n // Clear 24h: hour > 12, or 00:mm midnight, or ampm=false mode.\n if (!opts.ampm || hour > 12 || (hour === 0 && bare[1].length === 2)) {\n return stampTime(opts.anchor, hour, minute)\n }\n\n // Ambiguous 1–12: keep existing period when editing, else AM.\n let h12 = hour % 12 // 12 → 0 (midnight/noon base)\n if (opts.anchor && opts.anchor.isValid() && opts.anchor.hour() >= 12) {\n h12 += 12\n }\n // hour === 12 with no anchor → noon (12), not midnight: special-case.\n if (hour === 12 && !(opts.anchor && opts.anchor.isValid())) {\n h12 = 12\n } else if (hour === 12 && opts.anchor && opts.anchor.isValid()) {\n h12 = opts.anchor.hour() >= 12 ? 12 : 0\n }\n return stampTime(opts.anchor, h12, minute)\n }\n\n // 3) Strict 24h formats as last resort (e.g. \"16:15\" already handled above).\n for (const fmt of ['HH:mm', 'H:mm'] as const) {\n const d = dayjs(normalized, fmt, true)\n if (d.isValid()) return stampTime(opts.anchor, d.hour(), d.minute())\n }\n\n return 'invalid'\n}\n\n/**\n * Soft/quiet TimePicker with a typeable trigger field.\n *\n * Trigger text is editable by default (commit on blur/Enter). Clock icon opens\n * the multi-section digital clock popover; focusing/typing the field does not.\n * Pass `disableTyping` for read-only clock-only mode.\n *\n * Invalid typed input (e.g. `04:15 aa`) reverts to the last committed label.\n * Escape cancels the edit without committing.\n */\nexport const MuiXTimePicker: React.FC<MuiXTimePickerProps> = ({\n value: valueProp,\n defaultValue,\n onChange,\n label = 'Pick a time',\n disabled,\n ampm = true,\n format: formatProp,\n sx,\n disableTyping = false,\n slotProps,\n}) => {\n const displayFmt = formatProp ?? (ampm ? DISPLAY_TIME_FMT : 'HH:mm')\n\n const isControlled = valueProp !== undefined\n const [uncontrolled, setUncontrolled] = React.useState<Dayjs | null>(() =>\n toDayjs(defaultValue),\n )\n const value = isControlled ? toDayjs(valueProp) : uncontrolled\n\n const [open, setOpen] = React.useState(false)\n const [draft, setDraft] = React.useState<Dayjs | null>(value)\n\n const committedLabel = formatTimeLabel(value, displayFmt)\n const [inputText, setInputText] = React.useState(committedLabel)\n const [fieldFocused, setFieldFocused] = React.useState(false)\n const typingEnabled = !disableTyping\n const skipCommitOnBlurRef = React.useRef(false)\n\n const anchorRef = React.useRef<HTMLDivElement | null>(null)\n const [anchorEl, setAnchorEl] = React.useState<HTMLElement | null>(null)\n\n const tf = (slotProps?.textField ?? {}) as Record<string, unknown>\n const mergedDisabled = disabled ?? (tf.disabled as boolean | undefined)\n const mergedRequired = Boolean(tf.required)\n const mergedError = Boolean(tf.error)\n const helperText = tf.helperText as React.ReactNode | undefined\n\n const commit = (next: Dayjs | null) => {\n if (!isControlled) setUncontrolled(next)\n onChange?.(next)\n return next\n }\n\n // Sync display text from committed value when not actively typing.\n React.useEffect(() => {\n if (!fieldFocused) setInputText(committedLabel)\n }, [committedLabel, fieldFocused])\n\n const commitTypedInput = () => {\n if (!typingEnabled) return\n const parsed = parseTimeInput(inputText, { ampm, anchor: value })\n if (parsed === 'invalid') {\n setInputText(committedLabel)\n return\n }\n const next = commit(parsed)\n setDraft(next)\n setInputText(formatTimeLabel(next, displayFmt))\n }\n\n const openPicker = () => {\n if (mergedDisabled) return\n setDraft(value)\n setOpen(true)\n }\n\n const closePicker = () => {\n setOpen(false)\n }\n\n const handleAccept = () => {\n commit(draft)\n setInputText(formatTimeLabel(draft, displayFmt))\n closePicker()\n }\n\n const handleCancel = () => {\n setDraft(value)\n closePicker()\n }\n\n const handleClear = () => {\n setDraft(null)\n }\n\n const clockViews = ampm\n ? (['hours', 'minutes', 'meridiem'] as const)\n : (['hours', 'minutes'] as const)\n\n return (\n <LocalizationProvider dateAdapter={AdapterDayjs}>\n <Box sx={{ display: 'inline-flex', flexDirection: 'column', ...((sx as object) || {}) }}>\n <Box\n ref={(el: HTMLDivElement | null) => {\n anchorRef.current = el\n setAnchorEl(el)\n }}\n sx={{ display: 'inline-flex', minWidth: 200 }}\n >\n <TextField\n size=\"small\"\n fullWidth\n label={label}\n value={typingEnabled ? inputText : committedLabel}\n placeholder={ampm ? 'hh:mm aa' : 'HH:mm'}\n disabled={mergedDisabled}\n required={mergedRequired}\n error={mergedError}\n helperText={helperText}\n onClick={typingEnabled ? undefined : openPicker}\n onFocus={() => {\n if (typingEnabled) {\n setFieldFocused(true)\n } else {\n openPicker()\n }\n }}\n onBlur={() => {\n if (!typingEnabled) return\n setFieldFocused(false)\n if (skipCommitOnBlurRef.current) {\n skipCommitOnBlurRef.current = false\n setInputText(committedLabel)\n return\n }\n commitTypedInput()\n }}\n onChange={(e) => {\n if (!typingEnabled) return\n setInputText(e.target.value)\n }}\n onKeyDown={(e) => {\n if (!typingEnabled) return\n if (e.key === 'Enter') {\n e.preventDefault()\n ;(e.target as HTMLInputElement).blur()\n }\n if (e.key === 'Escape') {\n e.preventDefault()\n skipCommitOnBlurRef.current = true\n setInputText(committedLabel)\n ;(e.target as HTMLInputElement).blur()\n }\n }}\n inputProps={{\n readOnly: !typingEnabled,\n 'aria-label': label,\n 'data-testid': 'time-field',\n }}\n InputProps={{\n endAdornment: (\n <InputAdornment position=\"end\">\n <IconButton\n size=\"small\"\n disabled={mergedDisabled}\n aria-label=\"Choose time\"\n title=\"Choose time\"\n {...(slotProps?.openPickerIcon as object)}\n onMouseDown={(e) => {\n // Keep focus in the field so blur does not race the open.\n e.preventDefault()\n }}\n onClick={(e) => {\n e.stopPropagation()\n if (open) closePicker()\n else openPicker()\n }}\n >\n <AccessTimeIcon fontSize=\"small\" />\n </IconButton>\n </InputAdornment>\n ),\n }}\n />\n </Box>\n\n <Popper\n open={open}\n anchorEl={anchorEl}\n placement=\"bottom-start\"\n style={{ zIndex: 1300 }}\n >\n <ClickAwayListener onClickAway={handleCancel}>\n <Paper\n elevation={0}\n sx={{\n mt: 1,\n borderRadius: '20px',\n background: 'var(--mui-palette-background-default)',\n border: 'solid 1px var(--mui-palette-border-1)',\n overflow: 'hidden',\n }}\n >\n <Box sx={{ px: 1, pt: 1 }}>\n <MultiSectionDigitalClock\n ampm={ampm}\n value={draft}\n onChange={(v) => setDraft(v ? dayjs(v as Dayjs) : null)}\n views={[...clockViews]}\n />\n </Box>\n <DialogActions sx={{ px: 1.5, pb: 1, justifyContent: 'flex-end', gap: 0.5 }}>\n <IconButton data-testid=\"clear-action-button\" onClick={handleClear} title=\"clear\">\n <DeleteForeverIcon fontSize=\"small\" />\n </IconButton>\n <IconButton onClick={handleCancel} title=\"cancel\">\n <ClearIcon fontSize=\"small\" />\n </IconButton>\n <IconButton onClick={handleAccept} title=\"accept\">\n <CheckIcon fontSize=\"small\" />\n </IconButton>\n </DialogActions>\n </Paper>\n </ClickAwayListener>\n </Popper>\n </Box>\n </LocalizationProvider>\n )\n}\n\nexport default MuiXTimePicker","'use client'\nimport React from 'react'\nimport dayjs, { type Dayjs } from 'dayjs'\nimport customParseFormat from 'dayjs/plugin/customParseFormat'\nimport { LocalizationProvider } from '@mui/x-date-pickers/LocalizationProvider'\nimport { AdapterDayjs } from '@mui/x-date-pickers/AdapterDayjs'\nimport { DateCalendar } from '@mui/x-date-pickers/DateCalendar'\nimport { PickersDay, type PickersDayProps } from '@mui/x-date-pickers/PickersDay'\nimport DialogActions from '@mui/material/DialogActions'\nimport InputAdornment from '@mui/material/InputAdornment'\n\nimport { Box } from '@/ele/Box'\nimport { Paper } from '@/ele/Paper'\nimport { Popper, ClickAwayListener } from '@/ele/Overlay'\nimport { IconButton } from '@/ele/Button'\nimport { TextField } from '@/ele/Input'\nimport { Chip } from '@/ele/Chip'\nimport {\n CheckIcon,\n ClearIcon,\n DeleteForeverIcon,\n CalendarTodayIcon,\n NavigateBeforeIcon,\n NavigateNextIcon,\n} from '@/icons/MuiIcon'\n\ndayjs.extend(customParseFormat)\n\nexport type DateRangeValue = {\n start: Date | null\n end: Date | null\n}\n\nexport type MuiXDateRangePickerProps = {\n /** Controlled value. Prefer this in forms/stories. */\n value?: DateRangeValue\n /** Uncontrolled initial value when `value` is omitted. */\n defaultValue?: DateRangeValue\n onChange?: (value: DateRangeValue) => void\n /** Combined field label (defaults to start/end labels joined). */\n label?: string\n startLabel?: string\n endLabel?: string\n disabled?: boolean\n /** Optional sx for the outer field wrapper. */\n sx?: React.ComponentProps<typeof Box>['sx']\n /**\n * Show the Trip.com-style endorsement chip when both ends are set.\n * Defaults to true (chip appears once start + end are non-null).\n * Pass false to hide entirely.\n */\n showEndorsement?: boolean\n /**\n * Custom chip label. String always shows that text when both ends are set.\n * Function receives `{ start, end }` and may return `string | null` (`null` hides).\n * When omitted, uses the built-in night/day formatter (`endorsementUnit`).\n */\n endorsement?: string | ((range: { start: Date; end: Date }) => string | null)\n /**\n * Unit for the default formatter.\n * - `nights` (default): `end.diff(start, 'day')` -> \"N night(s)\" (hotel-style)\n * - `days`: `end.diff(start, 'day') + 1` -> \"N day(s)\" (inclusive calendar days)\n */\n endorsementUnit?: 'nights' | 'days'\n /**\n * Legacy passthrough kept for UseForm slotProps compatibility.\n * `start` / `end` textField bits are lightly applied to the single trigger field.\n */\n slotProps?: {\n start?: { slotProps?: { textField?: Record<string, unknown> }; disabled?: boolean }\n end?: { slotProps?: { textField?: Record<string, unknown> }; disabled?: boolean }\n }\n /**\n * When true, the trigger field stays read-only (calendar-only).\n * Default false — user can type a range string and commit on blur/Enter.\n */\n disableTyping?: boolean\n}\n\nconst EMPTY: DateRangeValue = { start: null, end: null }\n\nconst toDayjs = (d: Date | null | undefined): Dayjs | null => (d ? dayjs(d) : null)\n\nconst toDate = (d: Dayjs | null): Date | null => {\n if (!d) return null\n return typeof d.toDate === 'function' ? d.toDate() : (d as unknown as Date)\n}\n\nconst orderRange = (next: DateRangeValue): DateRangeValue => {\n if (next.start && next.end && next.start.getTime() > next.end.getTime()) {\n return { start: next.end, end: next.start }\n }\n return next\n}\n\nconst DISPLAY_DATE_FMT = 'MMM D, YYYY'\n\nconst formatDay = (d: Date | null): string => (d ? dayjs(d).format(DISPLAY_DATE_FMT) : '')\n\nconst formatRangeLabel = (v: DateRangeValue, startLabel: string, endLabel: string): string => {\n const s = formatDay(v.start)\n const e = formatDay(v.end)\n if (s && e) return `${s} – ${e}`\n if (s) return `${s} – ${endLabel}`\n if (e) return `${startLabel} – ${e}`\n return ''\n}\n\n/** Formats tried (strict) then a loose dayjs parse. */\nconst DATE_PARSE_FORMATS = [\n DISPLAY_DATE_FMT,\n 'YYYY-MM-DD',\n 'M/D/YYYY',\n 'MM/DD/YYYY',\n 'D MMM YYYY',\n 'MMM D YYYY',\n 'YYYY/MM/DD',\n] as const\n\nconst parseOneDate = (raw: string): Date | null | 'invalid' => {\n const t = raw.trim()\n if (!t) return null\n for (const fmt of DATE_PARSE_FORMATS) {\n const d = dayjs(t, fmt, true)\n if (d.isValid()) return d.startOf('day').toDate()\n }\n const loose = dayjs(t)\n if (loose.isValid()) return loose.startOf('day').toDate()\n return 'invalid'\n}\n\n/**\n * Split typed range into halves. Prefer en-dash (display), then ` to `,\n * spaced hyphen / slash, then ISO/ISO with bare slash.\n */\nconst splitRangeHalves = (raw: string): [string, string] | null => {\n const s = raw.trim()\n if (!s) return null\n\n if (s.includes('–')) {\n const i = s.indexOf('–')\n return [s.slice(0, i), s.slice(i + '–'.length)]\n }\n\n const toParts = s.split(/\\s+to\\s+/i)\n if (toParts.length === 2) return [toParts[0], toParts[1]]\n\n for (const sep of [' - ', ' / ']) {\n if (s.includes(sep)) {\n const i = s.indexOf(sep)\n return [s.slice(0, i), s.slice(i + sep.length)]\n }\n }\n\n const isoSlash = s.match(/^(\\d{4}-\\d{2}-\\d{2})\\s*\\/\\s*(\\d{4}-\\d{2}-\\d{2})$/)\n if (isoSlash) return [isoSlash[1], isoSlash[2]]\n\n // Bare hyphen between two ISO dates only (avoids eating MMM D, YYYY hyphens).\n const isoHyphen = s.match(/^(\\d{4}-\\d{2}-\\d{2})\\s*-\\s*(\\d{4}-\\d{2}-\\d{2})$/)\n if (isoHyphen) return [isoHyphen[1], isoHyphen[2]]\n\n return null\n}\n\nconst isLabelPlaceholder = (part: string, label: string) => {\n const t = part.trim()\n return !t || t.toLowerCase() === label.trim().toLowerCase()\n}\n\n/**\n * Parse typed range text into `{ start, end }`.\n * Returns `null` when the string cannot be parsed (caller should revert).\n * Empty input clears to both-null. Partial halves may be null.\n */\nconst parseRangeInput = (\n raw: string,\n startLabel: string,\n endLabel: string,\n): DateRangeValue | null => {\n const trimmed = raw.trim()\n if (!trimmed) return EMPTY\n\n const halves = splitRangeHalves(trimmed)\n if (!halves) {\n if (isLabelPlaceholder(trimmed, startLabel) || isLabelPlaceholder(trimmed, endLabel)) {\n return EMPTY\n }\n const one = parseOneDate(trimmed)\n if (one === 'invalid') return null\n return { start: one, end: null }\n }\n\n const [a, b] = halves\n let start: Date | null\n let end: Date | null\n\n if (isLabelPlaceholder(a, startLabel)) {\n start = null\n } else {\n const p = parseOneDate(a)\n if (p === 'invalid') return null\n start = p\n }\n\n if (isLabelPlaceholder(b, endLabel)) {\n end = null\n } else {\n const p = parseOneDate(b)\n if (p === 'invalid') return null\n end = p\n }\n\n return orderRange({ start, end })\n}\n\n/** Hotel nights = exclusive day diff; inclusive days = nights + 1. */\nconst formatDefaultEndorsement = (\n start: Date,\n end: Date,\n unit: 'nights' | 'days' = 'nights',\n): string => {\n const nights = Math.max(0, dayjs(end).startOf('day').diff(dayjs(start).startOf('day'), 'day'))\n if (unit === 'days') {\n const days = nights + 1\n return days === 1 ? '1 day' : `${days} days`\n }\n return nights === 1 ? '1 night' : `${nights} nights`\n}\n\n/**\n * Resolve chip label. Requires both ends (for default + custom string/fn).\n * `showEndorsement === false` always hides; otherwise default/custom rules apply.\n */\nconst resolveEndorsementLabel = (\n start: Date | null,\n end: Date | null,\n showEndorsement: boolean | undefined,\n endorsement: MuiXDateRangePickerProps['endorsement'],\n endorsementUnit: 'nights' | 'days' = 'nights',\n): string | null => {\n if (!start || !end) return null\n if (showEndorsement === false) return null\n if (typeof endorsement === 'string') return endorsement\n if (typeof endorsement === 'function') return endorsement({ start, end })\n return formatDefaultEndorsement(start, end, endorsementUnit)\n}\n\nconst endorsementChipSx = {\n height: 22,\n mr: 0.5,\n maxWidth: 140,\n borderColor: 'var(--mui-palette-border-1)',\n backgroundColor: 'var(--mui-palette-focus-1)',\n color: 'text.secondary',\n fontWeight: 500,\n fontSize: '0.75rem',\n '& .MuiChip-label': { px: 1, overflow: 'hidden', textOverflow: 'ellipsis' },\n} as const\n\ntype RangeDayProps = PickersDayProps & {\n rangeStart: Dayjs | null\n rangeEnd: Dayjs | null\n hoverDay: Dayjs | null\n}\n\nconst dayStart = (d: Dayjs) => d.startOf('day')\n\nconst isSameDay = (a: Dayjs | null, b: Dayjs | null) => !!(a && b && a.isSame(b, 'day'))\n\nconst isBetween = (day: Dayjs, start: Dayjs, end: Dayjs) => {\n const t = dayStart(day).valueOf()\n const a = dayStart(start).valueOf()\n const b = dayStart(end).valueOf()\n const lo = Math.min(a, b)\n const hi = Math.max(a, b)\n return t > lo && t < hi\n}\n\n/**\n * Shared range wash for hover-preview AND committed selection.\n * Resting fill is always focus-1 (bridge + endpoints) so drag preview and\n * stable selection never hue-shift. Endpoints only add weight.\n * CSS :hover / hoverDay may intensify to focus-1-hover on the single cell\n * under the cursor — never as a resting endpoint fill (that caused the flip).\n * Kill MUI focus / Mui-selected cream primary overrides.\n */\nconst RANGE_TEXT = 'var(--mui-palette-error-main)'\nconst RANGE_FILL = 'var(--mui-palette-focus-1)'\nconst RANGE_FILL_HOVER = 'var(--mui-palette-focus-1-hover)'\nconst RANGE_QUIET_BORDER = 'var(--mui-palette-border-1)'\n\nconst rangeDayFillSx = (isEndpoint: boolean, isHoveredCell: boolean) => ({\n color: RANGE_TEXT,\n // Hovered cell (preview end under cursor) gets the stronger wash; others stay focus-1.\n backgroundColor: isHoveredCell ? RANGE_FILL_HOVER : RANGE_FILL,\n fontWeight: isEndpoint ? 600 : undefined,\n // Soft quiet ring on the day under cursor — readable, no cream primary.\n ...(isHoveredCell\n ? {\n boxShadow: `inset 0 0 0 1px ${RANGE_QUIET_BORDER}`,\n }\n : {}),\n // Per-cell :hover intensify only; focus/selected stay on shared tokens (no primary cream).\n '&:hover': {\n color: RANGE_TEXT,\n backgroundColor: RANGE_FILL_HOVER,\n },\n '&:focus, &.Mui-focusVisible': {\n color: RANGE_TEXT,\n backgroundColor: isHoveredCell ? RANGE_FILL_HOVER : RANGE_FILL,\n },\n '&.Mui-selected, &.Mui-selected:hover, &.Mui-selected:focus': {\n color: RANGE_TEXT,\n backgroundColor: isHoveredCell ? RANGE_FILL_HOVER : RANGE_FILL,\n fontWeight: isEndpoint ? 600 : undefined,\n },\n})\n\nconst RangeDay = React.forwardRef<HTMLButtonElement, RangeDayProps>(function RangeDay(props, ref) {\n const { rangeStart, rangeEnd, hoverDay, day, outsideCurrentMonth, sx, ...other } = props\n const current = dayjs(day as Dayjs)\n\n // One preview/committed geometry: hover end while selecting, else committed end.\n const previewEnd =\n rangeStart && !rangeEnd && hoverDay ? hoverDay : rangeEnd\n\n const isStart = isSameDay(current, rangeStart)\n const isEnd = isSameDay(current, previewEnd) && !!(rangeEnd || (rangeStart && hoverDay))\n const inBridge =\n !!rangeStart &&\n !!previewEnd &&\n isBetween(current, rangeStart, previewEnd)\n\n const isEndpoint = isStart || isEnd\n const showRange = isEndpoint || inBridge\n // Extra affordance for the cell under the pointer (preview tracking via hoverDay).\n const isHoveredCell = !!hoverDay && isSameDay(current, hoverDay) && !outsideCurrentMonth\n\n // Continuous wash: square off the side that faces the bridge.\n let radius: string | number = '50%'\n if (isStart && isEnd) {\n radius = '50%'\n } else if (isStart && previewEnd) {\n radius = '50% 0 0 50%'\n } else if (isEnd && rangeStart) {\n radius = '0 50% 50% 0'\n } else if (inBridge) {\n radius = 0\n }\n\n return (\n <PickersDay\n {...other}\n ref={ref}\n day={day}\n outsideCurrentMonth={outsideCurrentMonth}\n selected={false}\n autoFocus={false}\n disableMargin\n sx={[\n {\n fontSize: '0.8125rem',\n // Soft hover for ordinary (non-range) days — quiet focus wash, not primary cream.\n ...(!showRange && !outsideCurrentMonth\n ? {\n '&:hover': {\n backgroundColor: RANGE_FILL,\n },\n }\n : {}),\n ...(showRange && !outsideCurrentMonth\n ? {\n borderRadius: radius,\n ...rangeDayFillSx(isEndpoint, isHoveredCell),\n }\n : {}),\n },\n ...(Array.isArray(sx) ? sx : sx ? [sx] : []),\n ]}\n />\n )\n})\n\n/** Match small IconButton width so month labels stay centered in each pane. */\nconst NAV_BTN_SLOT_PX = 30\n\n/**\n * Soft month+year label centered over a calendar pane (booking-style).\n * Custom header replaces MUI PickersCalendarHeader so labels never depend on\n * ArrowSwitcher / switch-view internals.\n */\nconst monthPaneLabelSx = {\n flex: 1,\n textAlign: 'center' as const,\n typography: 'body1',\n fontWeight: 500,\n lineHeight: '40px',\n userSelect: 'none' as const,\n color: 'text.primary',\n}\n\nconst navBtnSlotSx = {\n width: NAV_BTN_SLOT_PX,\n flexShrink: 0,\n}\n\n/** Hide MUI built-in calendar header (we render Prev / labels / Next ourselves). */\nconst NullCalendarHeader = () => null\n\n/**\n * Free (non-Pro) date range: single field + dual-month booking calendar popover.\n *\n * Value shape: `{ start: Date | null; end: Date | null }` — null halves are OK.\n * When both halves are set and start > end, they are swapped so the range is\n * always ordered (start ≤ end).\n *\n * Trigger text is editable by default (commit on blur/Enter). Calendar icon\n * opens the popover; focusing/typing the field does not. Pass `disableTyping`\n * for read-only calendar-only mode.\n */\nexport const MuiXDateRangePicker: React.FC<MuiXDateRangePickerProps> = ({\n value: valueProp,\n defaultValue,\n onChange,\n label,\n startLabel = 'Start',\n endLabel = 'End',\n disabled,\n showEndorsement,\n endorsement,\n endorsementUnit = 'nights',\n slotProps,\n sx,\n disableTyping = false,\n}) => {\n const isControlled = valueProp !== undefined\n const [uncontrolled, setUncontrolled] = React.useState<DateRangeValue>(\n defaultValue ?? EMPTY,\n )\n const value = isControlled ? (valueProp ?? EMPTY) : uncontrolled\n\n const [open, setOpen] = React.useState(false)\n const [draft, setDraft] = React.useState<DateRangeValue>(value)\n const [selectingEnd, setSelectingEnd] = React.useState(false)\n const [hoverDay, setHoverDay] = React.useState<Dayjs | null>(null)\n const [leftMonth, setLeftMonth] = React.useState<Dayjs>(() =>\n toDayjs(value.start) ?? toDayjs(value.end) ?? dayjs().startOf('month'),\n )\n\n const committedLabel = formatRangeLabel(value, startLabel, endLabel)\n const [inputText, setInputText] = React.useState(committedLabel)\n const [fieldFocused, setFieldFocused] = React.useState(false)\n const typingEnabled = !disableTyping\n const skipCommitOnBlurRef = React.useRef(false)\n\n const anchorRef = React.useRef<HTMLDivElement | null>(null)\n const [anchorEl, setAnchorEl] = React.useState<HTMLElement | null>(null)\n\n const fieldLabel = label ?? `${startLabel} – ${endLabel}`\n\n const startTf = (slotProps?.start?.slotProps?.textField ?? {}) as Record<string, unknown>\n const endTf = (slotProps?.end?.slotProps?.textField ?? {}) as Record<string, unknown>\n const mergedDisabled =\n disabled ??\n (slotProps?.start?.disabled as boolean | undefined) ??\n (slotProps?.end?.disabled as boolean | undefined) ??\n (startTf.disabled as boolean | undefined) ??\n (endTf.disabled as boolean | undefined)\n const mergedRequired = Boolean(startTf.required || endTf.required)\n const mergedError = Boolean(startTf.error || endTf.error)\n\n const commit = (next: DateRangeValue) => {\n const ordered = orderRange(next)\n if (!isControlled) setUncontrolled(ordered)\n onChange?.(ordered)\n return ordered\n }\n\n // Sync display text from committed value when not actively typing.\n React.useEffect(() => {\n if (!fieldFocused) setInputText(committedLabel)\n }, [committedLabel, fieldFocused])\n\n const commitTypedInput = () => {\n if (!typingEnabled) return\n const parsed = parseRangeInput(inputText, startLabel, endLabel)\n if (parsed === null) {\n setInputText(committedLabel)\n return\n }\n const ordered = commit(parsed)\n setDraft(ordered)\n setSelectingEnd(Boolean(ordered.start && !ordered.end))\n setInputText(formatRangeLabel(ordered, startLabel, endLabel))\n }\n\n const openPicker = () => {\n if (mergedDisabled) return\n setDraft(value)\n setSelectingEnd(Boolean(value.start && !value.end))\n setHoverDay(null)\n setLeftMonth(toDayjs(value.start) ?? toDayjs(value.end) ?? dayjs().startOf('month'))\n setOpen(true)\n }\n\n const closePicker = () => {\n setOpen(false)\n setHoverDay(null)\n }\n\n const handleAccept = () => {\n commit(draft)\n closePicker()\n }\n\n const handleCancel = () => {\n setDraft(value)\n closePicker()\n }\n\n const handleClear = () => {\n setDraft(EMPTY)\n setSelectingEnd(false)\n setHoverDay(null)\n }\n\n const handleDayClick = (day: Dayjs | null) => {\n if (!day) return\n const picked = toDate(day)\n if (!selectingEnd || !draft.start) {\n setDraft({ start: picked, end: null })\n setSelectingEnd(true)\n setHoverDay(null)\n return\n }\n // Second click — complete range (orderRange handles reverse picks).\n setDraft(orderRange({ start: draft.start, end: picked }))\n setSelectingEnd(false)\n setHoverDay(null)\n }\n\n const shiftMonths = (delta: number) => {\n setLeftMonth((m) => m.add(delta, 'month').startOf('month'))\n }\n\n const rangeStart = toDayjs(draft.start)\n const rangeEnd = toDayjs(draft.end)\n\n const DaySlot = React.useCallback(\n (dayProps: PickersDayProps) => (\n <RangeDay\n {...dayProps}\n rangeStart={rangeStart}\n rangeEnd={rangeEnd}\n hoverDay={selectingEnd ? hoverDay : null}\n onMouseEnter={(event, d) => {\n dayProps.onMouseEnter?.(event, d)\n if (selectingEnd) setHoverDay(dayjs(d as Dayjs))\n }}\n onDaySelect={(d) => {\n handleDayClick(dayjs(d as Dayjs))\n }}\n />\n ),\n // handleDayClick closes over draft/selectingEnd; recreate when those change.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [rangeStart, rangeEnd, selectingEnd, hoverDay, draft.start],\n )\n\n const rightMonth = leftMonth.add(1, 'month')\n\n // Chip range: when open use draft (+ hover preview while picking end); else committed value.\n const endorsementStart = open ? draft.start : value.start\n const endorsementEnd = open\n ? selectingEnd && draft.start && hoverDay\n ? toDate(hoverDay)\n : selectingEnd\n ? null\n : draft.end\n : value.end\n const endorsementLabel = resolveEndorsementLabel(\n endorsementStart,\n endorsementEnd,\n showEndorsement,\n endorsement,\n endorsementUnit,\n )\n\n return (\n <LocalizationProvider dateAdapter={AdapterDayjs}>\n <Box sx={{ display: 'inline-flex', flexDirection: 'column', ...((sx as object) || {}) }}>\n <Box\n ref={(el: HTMLDivElement | null) => {\n anchorRef.current = el\n setAnchorEl(el)\n }}\n sx={{ display: 'inline-flex', minWidth: 280 }}\n >\n <TextField\n size=\"small\"\n fullWidth\n label={fieldLabel}\n value={typingEnabled ? inputText : committedLabel}\n placeholder={`${startLabel} – ${endLabel}`}\n disabled={mergedDisabled}\n required={mergedRequired}\n error={mergedError}\n onClick={typingEnabled ? undefined : openPicker}\n onFocus={() => {\n if (typingEnabled) {\n setFieldFocused(true)\n } else {\n openPicker()\n }\n }}\n onBlur={() => {\n if (!typingEnabled) return\n setFieldFocused(false)\n if (skipCommitOnBlurRef.current) {\n skipCommitOnBlurRef.current = false\n setInputText(committedLabel)\n return\n }\n commitTypedInput()\n }}\n onChange={(e) => {\n if (!typingEnabled) return\n setInputText(e.target.value)\n }}\n onKeyDown={(e) => {\n if (!typingEnabled) return\n if (e.key === 'Enter') {\n e.preventDefault()\n ;(e.target as HTMLInputElement).blur()\n }\n if (e.key === 'Escape') {\n e.preventDefault()\n skipCommitOnBlurRef.current = true\n setInputText(committedLabel)\n ;(e.target as HTMLInputElement).blur()\n }\n }}\n inputProps={{\n readOnly: !typingEnabled,\n 'aria-label': fieldLabel,\n 'data-testid': 'date-range-field',\n }}\n InputProps={{\n endAdornment: (\n <InputAdornment position=\"end\" sx={{ gap: 0.25 }}>\n {endorsementLabel ? (\n <Box\n component=\"span\"\n onMouseDown={(e) => {\n e.preventDefault()\n e.stopPropagation()\n }}\n onClick={(e) => {\n e.stopPropagation()\n openPicker()\n }}\n sx={{ display: 'inline-flex', cursor: 'pointer' }}\n >\n <Chip\n size=\"small\"\n variant=\"outlined\"\n label={endorsementLabel}\n data-testid=\"date-range-endorsement\"\n aria-label={endorsementLabel}\n sx={endorsementChipSx}\n />\n </Box>\n ) : null}\n <IconButton\n size=\"small\"\n disabled={mergedDisabled}\n onClick={(e) => {\n e.stopPropagation()\n if (open) closePicker()\n else openPicker()\n }}\n aria-label=\"Choose date range\"\n title=\"Choose date range\"\n >\n <CalendarTodayIcon fontSize=\"small\" />\n </IconButton>\n </InputAdornment>\n ),\n }}\n />\n </Box>\n\n <Popper\n open={open}\n anchorEl={anchorEl}\n placement=\"bottom-start\"\n style={{ zIndex: 1300 }}\n >\n <ClickAwayListener onClickAway={handleCancel}>\n <Paper\n elevation={0}\n sx={{\n mt: 1,\n borderRadius: '20px',\n background: 'var(--mui-palette-background-default)',\n border: 'solid 1px var(--mui-palette-border-1)',\n overflow: 'hidden',\n }}\n >\n <Box\n sx={{\n display: 'flex',\n alignItems: 'stretch',\n gap: 0,\n px: 1,\n pt: 1,\n flexWrap: { xs: 'wrap', sm: 'nowrap' },\n }}\n >\n <Box sx={{ width: 300 }}>\n {/*\n Custom dual-month chrome: Prev far left of popover, month label\n centered over this pane, spacer balances Next on the right pane.\n MUI calendarHeader is nulled so built-in arrows/labels never compete.\n */}\n <Box\n sx={{\n display: 'flex',\n alignItems: 'center',\n minHeight: 40,\n px: 0.5,\n }}\n >\n <IconButton\n size=\"small\"\n onClick={() => shiftMonths(-1)}\n aria-label=\"Previous month\"\n title=\"Previous month\"\n >\n <NavigateBeforeIcon fontSize=\"small\" />\n </IconButton>\n <Box sx={monthPaneLabelSx} aria-live=\"polite\">\n {leftMonth.format('MMMM YYYY')}\n </Box>\n <Box sx={navBtnSlotSx} aria-hidden />\n </Box>\n {/*\n referenceDate only seeds the initial month (useCalendarState reducer\n init). Remount via key so shiftMonths actually changes the view.\n */}\n <DateCalendar\n key={leftMonth.format('YYYY-MM')}\n value={null}\n referenceDate={leftMonth}\n onMonthChange={(m) => setLeftMonth(dayjs(m as Dayjs).startOf('month'))}\n showDaysOutsideCurrentMonth\n slots={{ day: DaySlot, calendarHeader: NullCalendarHeader }}\n sx={{ width: 300 }}\n />\n </Box>\n <Box\n sx={{\n width: '1px',\n alignSelf: 'stretch',\n bgcolor: 'var(--mui-palette-border-1)',\n display: { xs: 'none', sm: 'block' },\n }}\n />\n <Box sx={{ width: 300 }}>\n <Box\n sx={{\n display: 'flex',\n alignItems: 'center',\n minHeight: 40,\n px: 0.5,\n }}\n >\n <Box sx={navBtnSlotSx} aria-hidden />\n <Box sx={monthPaneLabelSx} aria-live=\"polite\">\n {rightMonth.format('MMMM YYYY')}\n </Box>\n <IconButton\n size=\"small\"\n onClick={() => shiftMonths(1)}\n aria-label=\"Next month\"\n title=\"Next month\"\n >\n <NavigateNextIcon fontSize=\"small\" />\n </IconButton>\n </Box>\n <DateCalendar\n key={rightMonth.format('YYYY-MM')}\n value={null}\n referenceDate={rightMonth}\n onMonthChange={(m) =>\n setLeftMonth(dayjs(m as Dayjs).subtract(1, 'month').startOf('month'))\n }\n showDaysOutsideCurrentMonth\n slots={{ day: DaySlot, calendarHeader: NullCalendarHeader }}\n sx={{ width: 300 }}\n />\n </Box>\n </Box>\n\n <DialogActions sx={{ px: 1.5, pb: 1, justifyContent: 'flex-end', gap: 0.5 }}>\n <IconButton data-testid=\"clear-action-button\" onClick={handleClear} title=\"clear\">\n <DeleteForeverIcon fontSize=\"small\" />\n </IconButton>\n <IconButton onClick={handleCancel} title=\"cancel\">\n <ClearIcon fontSize=\"small\" />\n </IconButton>\n <IconButton onClick={handleAccept} title=\"accept\">\n <CheckIcon fontSize=\"small\" />\n </IconButton>\n </DialogActions>\n </Paper>\n </ClickAwayListener>\n </Popper>\n </Box>\n </LocalizationProvider>\n )\n}\n\nexport default MuiXDateRangePicker\n","import type { MuiComponentTheme } from '@/_utils/_types'\n\nexport const datePickerTheme = {\n defaultProps: {\n slotProps: {\n popper: {\n sx: {\n \"& .MuiPaper-root\": {\n borderRadius: '20px',\n background: 'var(--mui-palette-background-default)',\n border: 'solid 1px var(--mui-palette-border-1)',\n },\n },\n }\n },\n },\n} as const satisfies MuiComponentTheme<'MuiDatePicker'>\nexport const dateTimePickerTheme = {\n defaultProps: {\n slotProps: {\n popper: {\n sx: {\n \"& .MuiPaper-root\": {\n borderRadius: '20px',\n background: 'var(--mui-palette-background-default)',\n border: 'solid 1px var(--mui-palette-border-1)',\n },\n },\n }\n },\n },\n} as const satisfies MuiComponentTheme<'MuiDateTimePicker'>\n\nexport const timePickerTheme = {\n defaultProps: {\n slotProps: {\n popper: {\n sx: {\n \"& .MuiPaper-root\": {\n borderRadius: '20px',\n background: 'var(--mui-palette-background-default)',\n border: 'solid 1px var(--mui-palette-border-1)',\n },\n },\n }\n },\n },\n} as const satisfies MuiComponentTheme<'MuiTimePicker'>\n\nexport const dateCalendarTheme = {\n defaultProps: {\n slotProps: {},\n },\n styleOverrides: {\n root: {\n borderRadius: '20px',\n },\n },\n} as const satisfies MuiComponentTheme<'MuiDateCalendar'>\n\nexport const pickersCalendarHeaderTheme = {\n defaultProps: {\n slotProps: {\n previousIconButton: { size: 'small' },\n nextIconButton: { size: 'small' },\n switchViewIcon: { fontSize: 'small' },\n },\n },\n styleOverrides: {\n root: {},\n label: {},\n },\n} as const satisfies MuiComponentTheme<'MuiPickersCalendarHeader'>\n\nexport const pickersDayTheme = {\n defaultProps: {},\n styleOverrides: {\n root: {\n '&.Mui-selected.MuiButtonBase-root': {\n color: 'var(--mui-palette-error-main)',\n backgroundColor: 'var(--mui-palette-focus-1)',\n '&:hover': {\n backgroundColor: 'var(--mui-palette-focus-1-hover)',\n },\n },\n '&.MuiPickersDay-today': {\n borderColor: 'var(--mui-palette-focus-1)',\n },\n },\n dayOutsideMonth: {\n color: 'var(--mui-palette-text-disabled)',\n },\n },\n} as const satisfies MuiComponentTheme<'MuiPickersDay'>\n\n/**\n * MultiSectionDigitalClock items are MenuItems. Global MuiMenuItem paints a\n * full-size `::before` fill on `.Mui-selected`, and MUI X also sets\n * `backgroundColor: primary.main` + contrast text. Together that produced\n * solid opaque pink blocks with unreadable labels. Match PickersDay soft\n * selected (readable error text + quiet focus wash; kill the ::before cover).\n */\nexport const multiSectionDigitalClockTheme = {\n defaultProps: {\n slotProps: {\n digitalClockSectionItem: {\n dense: true,\n },\n },\n },\n styleOverrides: {\n root: {\n '&': { paddingRight: '4px' },\n '& .MuiMultiSectionDigitalClockSection-root': {\n scrollbarWidth: 'inherit',\n '& .MuiMultiSectionDigitalClockSection-item, & li': {\n borderRadius: 'var(--mui-shape-borderRadius)',\n position: 'relative',\n overflow: 'hidden',\n '&::before': {\n borderRadius: 'var(--mui-shape-borderRadius)',\n content: 'none',\n display: 'none',\n backgroundColor: 'transparent',\n width: 0,\n height: 0,\n },\n '&.Mui-selected': {\n color: 'var(--mui-palette-error-main)',\n backgroundColor: 'var(--mui-palette-focus-1)',\n '&:hover, &:focus-visible': {\n backgroundColor: 'var(--mui-palette-focus-1-hover)',\n },\n '&::before': {\n content: 'none',\n display: 'none',\n backgroundColor: 'transparent',\n },\n },\n },\n },\n },\n },\n} as const satisfies MuiComponentTheme<'MuiMultiSectionDigitalClock'>\n\nexport const pickersInputBaseTheme = {\n styleOverrides: {\n root: {\n '&.Mui-focused:not(.Mui-error) fieldset.MuiPickersOutlinedInput-notchedOutline': {\n borderColor: 'var(--mui-palette-text-secondary)',\n },\n '&.MuiPickersInputBase-root': {\n '& .MuiButtonBase-root': {\n '& > svg': {\n fontSize: '1.25rem',\n },\n },\n },\n },\n },\n} as const satisfies MuiComponentTheme<'MuiPickersInputBase'>\r\n"],"mappings":"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","names":["default","React","dayjs","customParseFormat","LocalizationProvider","AdapterDayjs","DateCalendar","DialogActions","InputAdornment","jsx","jsxs","dayjs","customParseFormat","toDayjs","DATE_PARSE_FORMATS","React","LocalizationProvider","AdapterDayjs","default","InputAdornment","DateCalendar","DialogActions","React","dayjs","customParseFormat","LocalizationProvider","AdapterDayjs","MultiSectionDigitalClock","DialogActions","InputAdornment","jsx","jsxs","dayjs","customParseFormat","toDayjs","React","LocalizationProvider","AdapterDayjs","default","InputAdornment","MultiSectionDigitalClock","DialogActions","React","dayjs","customParseFormat","LocalizationProvider","AdapterDayjs","DateCalendar","DialogActions","InputAdornment","jsx","jsxs","dayjs","customParseFormat","toDayjs","DISPLAY_DATE_FMT","DATE_PARSE_FORMATS","React","RangeDay","LocalizationProvider","AdapterDayjs","default","InputAdornment","DateCalendar","DialogActions"]}
|
|
@@ -0,0 +1,277 @@
|
|
|
1
|
+
import {
|
|
2
|
+
randomStrGenerator
|
|
3
|
+
} from "./chunk-QFF3HTHL.mjs";
|
|
4
|
+
|
|
5
|
+
// src/components/compound/Alert/src/toast.ts
|
|
6
|
+
import { closeSnackbar } from "notistack";
|
|
7
|
+
|
|
8
|
+
// src/components/compound/Alert/src/_utils/utils.ts
|
|
9
|
+
import { enqueueSnackbar, useSnackbar } from "notistack";
|
|
10
|
+
|
|
11
|
+
// src/components/compound/Alert/src/_utils/const.ts
|
|
12
|
+
var ALERT_VARIANTs = {
|
|
13
|
+
info: "myInfo",
|
|
14
|
+
warning: "myWarning",
|
|
15
|
+
success: "mySuccess",
|
|
16
|
+
error: "myError",
|
|
17
|
+
system: "mySystem",
|
|
18
|
+
insight: "myInsight",
|
|
19
|
+
collapsable: "myCollapsable"
|
|
20
|
+
};
|
|
21
|
+
var ALERT_STYLE_VARIANTs = {
|
|
22
|
+
soft: "soft",
|
|
23
|
+
classic: "classic"
|
|
24
|
+
};
|
|
25
|
+
var DEFAULTs = {
|
|
26
|
+
AUTO_HIDE_DURATION: 3e3,
|
|
27
|
+
/** Quiet glass toast look is the default snackbar chrome. */
|
|
28
|
+
STYLE_VARIANT: "soft",
|
|
29
|
+
ANCHOR_ORIGIN: { horizontal: "right", vertical: "top" },
|
|
30
|
+
PROVIDER_CONFIGs: {
|
|
31
|
+
maxSnack: 3,
|
|
32
|
+
dense: true,
|
|
33
|
+
preventDuplicate: true,
|
|
34
|
+
autoHideDuration: 3e3
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
var ERRORs = {
|
|
38
|
+
invalid_variant: "Invalid alert variant provided",
|
|
39
|
+
enqueue_failed: "Failed to enqueue alert",
|
|
40
|
+
missing_message: "Message is required for alert",
|
|
41
|
+
missing_component_props: "Component props are required for collapsible alert"
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
// src/components/compound/Alert/src/_utils/utils.ts
|
|
45
|
+
function enqueueAlertWith(enqueue, {
|
|
46
|
+
message,
|
|
47
|
+
variant,
|
|
48
|
+
id = randomStrGenerator(10),
|
|
49
|
+
autoHideDuration = DEFAULTs.AUTO_HIDE_DURATION,
|
|
50
|
+
anchorOrigin = DEFAULTs.ANCHOR_ORIGIN,
|
|
51
|
+
icon,
|
|
52
|
+
styleVariant,
|
|
53
|
+
action,
|
|
54
|
+
...rest
|
|
55
|
+
}) {
|
|
56
|
+
try {
|
|
57
|
+
enqueue(message, {
|
|
58
|
+
variant,
|
|
59
|
+
anchorOrigin,
|
|
60
|
+
autoHideDuration,
|
|
61
|
+
key: id,
|
|
62
|
+
id,
|
|
63
|
+
icon,
|
|
64
|
+
styleVariant,
|
|
65
|
+
alertAction: action,
|
|
66
|
+
...rest
|
|
67
|
+
});
|
|
68
|
+
return { success: true, data: id };
|
|
69
|
+
} catch (error2) {
|
|
70
|
+
console.error("Failed to enqueue alert:", error2);
|
|
71
|
+
return { success: false, error: error2 instanceof Error ? error2.message : "Unknown error" };
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
function enqueueCollapsableWith(enqueue, {
|
|
75
|
+
id = randomStrGenerator(10),
|
|
76
|
+
autoHideDuration = DEFAULTs.AUTO_HIDE_DURATION,
|
|
77
|
+
anchorOrigin = DEFAULTs.ANCHOR_ORIGIN,
|
|
78
|
+
styleVariant,
|
|
79
|
+
componentProps = {},
|
|
80
|
+
componentWrapperProps = {},
|
|
81
|
+
...rest
|
|
82
|
+
}) {
|
|
83
|
+
try {
|
|
84
|
+
enqueue("", {
|
|
85
|
+
variant: ALERT_VARIANTs.collapsable,
|
|
86
|
+
anchorOrigin,
|
|
87
|
+
autoHideDuration,
|
|
88
|
+
componentProps,
|
|
89
|
+
componentWrapperProps,
|
|
90
|
+
id,
|
|
91
|
+
styleVariant,
|
|
92
|
+
...rest
|
|
93
|
+
});
|
|
94
|
+
return { success: true, data: id };
|
|
95
|
+
} catch (error2) {
|
|
96
|
+
console.error("Failed to enqueue collapsable alert:", error2);
|
|
97
|
+
return { success: false, error: error2 instanceof Error ? error2.message : "Unknown error" };
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
function useAlert() {
|
|
101
|
+
const { enqueueSnackbar: enqueue, closeSnackbar: closeSnackbar2 } = useSnackbar();
|
|
102
|
+
const enqueueAlert2 = (options) => enqueueAlertWith(enqueue, options);
|
|
103
|
+
const enqueueCollapsable2 = (options) => enqueueCollapsableWith(enqueue, options);
|
|
104
|
+
const enqueueError2 = (message, options) => enqueueAlert2({ variant: ALERT_VARIANTs.error, message, ...options });
|
|
105
|
+
const enqueueSuccess2 = (message, options) => enqueueAlert2({ variant: ALERT_VARIANTs.success, message, ...options });
|
|
106
|
+
const enqueueWarning2 = (message, options) => enqueueAlert2({ variant: ALERT_VARIANTs.warning, message, ...options });
|
|
107
|
+
const enqueueInfo2 = (message, options) => enqueueAlert2({ variant: ALERT_VARIANTs.info, message, ...options });
|
|
108
|
+
const enqueueSystem2 = (message, options) => enqueueAlert2({ variant: ALERT_VARIANTs.system, message, ...options });
|
|
109
|
+
const enqueueInsight2 = (message, options) => enqueueAlert2({ variant: ALERT_VARIANTs.insight, message, ...options });
|
|
110
|
+
return {
|
|
111
|
+
enqueueAlert: enqueueAlert2,
|
|
112
|
+
enqueueCollapsable: enqueueCollapsable2,
|
|
113
|
+
enqueueError: enqueueError2,
|
|
114
|
+
enqueueSuccess: enqueueSuccess2,
|
|
115
|
+
enqueueWarning: enqueueWarning2,
|
|
116
|
+
enqueueInfo: enqueueInfo2,
|
|
117
|
+
enqueueSystem: enqueueSystem2,
|
|
118
|
+
enqueueInsight: enqueueInsight2,
|
|
119
|
+
closeSnackbar: closeSnackbar2
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
function enqueueAlert({
|
|
123
|
+
message,
|
|
124
|
+
variant,
|
|
125
|
+
id = randomStrGenerator(10),
|
|
126
|
+
autoHideDuration = DEFAULTs.AUTO_HIDE_DURATION,
|
|
127
|
+
anchorOrigin = DEFAULTs.ANCHOR_ORIGIN,
|
|
128
|
+
icon,
|
|
129
|
+
styleVariant,
|
|
130
|
+
action,
|
|
131
|
+
...rest
|
|
132
|
+
}) {
|
|
133
|
+
return enqueueAlertWith(enqueueSnackbar, {
|
|
134
|
+
message,
|
|
135
|
+
variant,
|
|
136
|
+
id,
|
|
137
|
+
autoHideDuration,
|
|
138
|
+
anchorOrigin,
|
|
139
|
+
icon,
|
|
140
|
+
styleVariant,
|
|
141
|
+
action,
|
|
142
|
+
...rest
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
function enqueueCollapsable({
|
|
146
|
+
id = randomStrGenerator(10),
|
|
147
|
+
autoHideDuration = DEFAULTs.AUTO_HIDE_DURATION,
|
|
148
|
+
anchorOrigin = DEFAULTs.ANCHOR_ORIGIN,
|
|
149
|
+
styleVariant,
|
|
150
|
+
componentProps = {},
|
|
151
|
+
componentWrapperProps = {},
|
|
152
|
+
...rest
|
|
153
|
+
}) {
|
|
154
|
+
return enqueueCollapsableWith(enqueueSnackbar, {
|
|
155
|
+
id,
|
|
156
|
+
autoHideDuration,
|
|
157
|
+
anchorOrigin,
|
|
158
|
+
styleVariant,
|
|
159
|
+
componentProps,
|
|
160
|
+
componentWrapperProps,
|
|
161
|
+
...rest
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
function enqueueError(message, options) {
|
|
165
|
+
return enqueueAlert({
|
|
166
|
+
variant: ALERT_VARIANTs.error,
|
|
167
|
+
message,
|
|
168
|
+
...options
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
function enqueueSuccess(message, options) {
|
|
172
|
+
return enqueueAlert({
|
|
173
|
+
variant: ALERT_VARIANTs.success,
|
|
174
|
+
message,
|
|
175
|
+
...options
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
function enqueueWarning(message, options) {
|
|
179
|
+
return enqueueAlert({
|
|
180
|
+
variant: ALERT_VARIANTs.warning,
|
|
181
|
+
message,
|
|
182
|
+
...options
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
function enqueueInfo(message, options) {
|
|
186
|
+
return enqueueAlert({
|
|
187
|
+
variant: ALERT_VARIANTs.info,
|
|
188
|
+
message,
|
|
189
|
+
...options
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
function enqueueSystem(message, options) {
|
|
193
|
+
return enqueueAlert({
|
|
194
|
+
variant: ALERT_VARIANTs.system,
|
|
195
|
+
message,
|
|
196
|
+
...options
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
function enqueueInsight(message, options) {
|
|
200
|
+
return enqueueAlert({
|
|
201
|
+
variant: ALERT_VARIANTs.insight,
|
|
202
|
+
message,
|
|
203
|
+
...options
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
// src/components/compound/Alert/src/toast.ts
|
|
208
|
+
var TOAST_TO_ALERT = {
|
|
209
|
+
success: ALERT_VARIANTs.success,
|
|
210
|
+
error: ALERT_VARIANTs.error,
|
|
211
|
+
info: ALERT_VARIANTs.info,
|
|
212
|
+
warning: ALERT_VARIANTs.warning
|
|
213
|
+
};
|
|
214
|
+
var DEFAULT_DURATION = 4e3;
|
|
215
|
+
function toAlertOptions(message, options = {}) {
|
|
216
|
+
const variant = options.variant ?? "info";
|
|
217
|
+
const duration = options.duration === void 0 ? DEFAULT_DURATION : options.duration;
|
|
218
|
+
return {
|
|
219
|
+
message,
|
|
220
|
+
variant: TOAST_TO_ALERT[variant],
|
|
221
|
+
id: options.id,
|
|
222
|
+
autoHideDuration: duration,
|
|
223
|
+
styleVariant: "soft",
|
|
224
|
+
action: options.action,
|
|
225
|
+
// Historical toast.* corner was bottom-right.
|
|
226
|
+
anchorOrigin: { horizontal: "right", vertical: "bottom" }
|
|
227
|
+
};
|
|
228
|
+
}
|
|
229
|
+
function show(message, options) {
|
|
230
|
+
const result = enqueueAlert(toAlertOptions(message, options));
|
|
231
|
+
return result.success ? result.data : options?.id ?? "";
|
|
232
|
+
}
|
|
233
|
+
function success(message, options) {
|
|
234
|
+
return show(message, { ...options, variant: "success" });
|
|
235
|
+
}
|
|
236
|
+
function error(message, options) {
|
|
237
|
+
return show(message, { ...options, variant: "error" });
|
|
238
|
+
}
|
|
239
|
+
function info(message, options) {
|
|
240
|
+
return show(message, { ...options, variant: "info" });
|
|
241
|
+
}
|
|
242
|
+
function warning(message, options) {
|
|
243
|
+
return show(message, { ...options, variant: "warning" });
|
|
244
|
+
}
|
|
245
|
+
function dismiss(id) {
|
|
246
|
+
closeSnackbar(id);
|
|
247
|
+
}
|
|
248
|
+
function dismissAll() {
|
|
249
|
+
closeSnackbar();
|
|
250
|
+
}
|
|
251
|
+
var toast = Object.assign(show, {
|
|
252
|
+
success,
|
|
253
|
+
error,
|
|
254
|
+
info,
|
|
255
|
+
warning,
|
|
256
|
+
dismiss,
|
|
257
|
+
dismissAll,
|
|
258
|
+
show
|
|
259
|
+
});
|
|
260
|
+
|
|
261
|
+
export {
|
|
262
|
+
ALERT_VARIANTs,
|
|
263
|
+
ALERT_STYLE_VARIANTs,
|
|
264
|
+
DEFAULTs,
|
|
265
|
+
ERRORs,
|
|
266
|
+
useAlert,
|
|
267
|
+
enqueueAlert,
|
|
268
|
+
enqueueCollapsable,
|
|
269
|
+
enqueueError,
|
|
270
|
+
enqueueSuccess,
|
|
271
|
+
enqueueWarning,
|
|
272
|
+
enqueueInfo,
|
|
273
|
+
enqueueSystem,
|
|
274
|
+
enqueueInsight,
|
|
275
|
+
toast
|
|
276
|
+
};
|
|
277
|
+
//# sourceMappingURL=chunk-YIJ5QVJ6.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/compound/Alert/src/toast.ts","../src/components/compound/Alert/src/_utils/utils.ts","../src/components/compound/Alert/src/_utils/const.ts"],"sourcesContent":["import type { ReactNode } from 'react'\nimport { closeSnackbar } from 'notistack'\nimport { ALERT_VARIANTs, enqueueAlert } from './_utils'\nimport type { AlertAction, AlertVariant } from './_utils'\n\n/** @deprecated Prefer AlertVariant / enqueue* with styleVariant soft. */\nexport type ToastVariant = 'success' | 'error' | 'info' | 'warning'\n\n/** @deprecated Prefer AlertAction. */\nexport type ToastAction = AlertAction\n\n/** @deprecated Prefer AlertOptions (styleVariant soft). */\nexport type ToastOptions = {\n id?: string\n /** Auto-dismiss ms. `null` keeps until closed. Default 4000. */\n duration?: number | null\n action?: ToastAction\n onClose?: () => void\n}\n\nexport type ToastShowOptions = ToastOptions & {\n variant?: ToastVariant\n}\n\nconst TOAST_TO_ALERT: Record<ToastVariant, AlertVariant> = {\n success: ALERT_VARIANTs.success,\n error: ALERT_VARIANTs.error,\n info: ALERT_VARIANTs.info,\n warning: ALERT_VARIANTs.warning,\n}\n\nconst DEFAULT_DURATION = 4000\n\nfunction toAlertOptions(message: ReactNode, options: ToastShowOptions = {}) {\n const variant: ToastVariant = options.variant ?? 'info'\n const duration =\n options.duration === undefined ? DEFAULT_DURATION : options.duration\n\n return {\n message,\n variant: TOAST_TO_ALERT[variant],\n id: options.id,\n autoHideDuration: duration,\n styleVariant: 'soft' as const,\n action: options.action,\n // Historical toast.* corner was bottom-right.\n anchorOrigin: { horizontal: 'right' as const, vertical: 'bottom' as const },\n }\n}\n\nfunction show(message: ReactNode, options?: ToastShowOptions) {\n const result = enqueueAlert(toAlertOptions(message, options))\n return result.success ? result.data : (options?.id ?? '')\n}\n\nfunction success(message: ReactNode, options?: ToastOptions) {\n return show(message, { ...options, variant: 'success' })\n}\n\nfunction error(message: ReactNode, options?: ToastOptions) {\n return show(message, { ...options, variant: 'error' })\n}\n\nfunction info(message: ReactNode, options?: ToastOptions) {\n return show(message, { ...options, variant: 'info' })\n}\n\nfunction warning(message: ReactNode, options?: ToastOptions) {\n return show(message, { ...options, variant: 'warning' })\n}\n\nfunction dismiss(id?: string) {\n closeSnackbar(id)\n}\n\nfunction dismissAll() {\n closeSnackbar()\n}\n\n/**\n * Convenience alias that enqueues soft Alert (`styleVariant: 'soft'`).\n * Requires AlertProvider (ThemeProvider mounts it). Prefer `useAlert` /\n * `enqueueSuccess` for new code — there is no separate Toast compound.\n *\n * @example\n * toast.success('Saved')\n * toast.error('Failed', { action: { label: 'Undo', onClick: restore } })\n */\nexport const toast = Object.assign(show, {\n success,\n error,\n info,\n warning,\n dismiss,\n dismissAll,\n show,\n})\n","'use client'\nimport { enqueueSnackbar, useSnackbar } from 'notistack'\nimport { randomStrGenerator } from '@/_utils/_func/random'\nimport { AlertOptions, CollapsableAlertOptions, AlertOperationResult } from './types'\nimport { ALERT_VARIANTs, DEFAULTs } from './const'\n\ntype EnqueueFn = ReturnType<typeof useSnackbar>['enqueueSnackbar']\n\nfunction enqueueAlertWith(\n enqueue: EnqueueFn,\n {\n message,\n variant,\n id = randomStrGenerator(10),\n autoHideDuration = DEFAULTs.AUTO_HIDE_DURATION,\n anchorOrigin = DEFAULTs.ANCHOR_ORIGIN,\n icon,\n styleVariant,\n action,\n ...rest\n }: AlertOptions\n): AlertOperationResult<string> {\n try {\n // Cast: variant is a union (AlertVariant); OptionsWithExtraProps is per-variant.\n // Public API keeps action; wire as alertAction (notistack SharedProps already owns action).\n enqueue(message, {\n variant,\n anchorOrigin,\n autoHideDuration,\n key: id,\n id,\n icon,\n styleVariant,\n alertAction: action,\n ...rest,\n } as Parameters<EnqueueFn>[1])\n return { success: true, data: id as string }\n } catch (error) {\n console.error('Failed to enqueue alert:', error)\n return { success: false, error: (error instanceof Error ? error.message : 'Unknown error') }\n }\n}\n\nfunction enqueueCollapsableWith(\n enqueue: EnqueueFn,\n {\n id = randomStrGenerator(10),\n autoHideDuration = DEFAULTs.AUTO_HIDE_DURATION,\n anchorOrigin = DEFAULTs.ANCHOR_ORIGIN,\n styleVariant,\n componentProps = {},\n componentWrapperProps = {},\n ...rest\n }: CollapsableAlertOptions\n): AlertOperationResult<string> {\n try {\n enqueue('', {\n variant: ALERT_VARIANTs.collapsable,\n anchorOrigin,\n autoHideDuration,\n componentProps,\n componentWrapperProps,\n id,\n styleVariant,\n ...rest,\n } as Parameters<EnqueueFn>[1])\n return { success: true, data: id as string }\n } catch (error) {\n console.error('Failed to enqueue collapsable alert:', error)\n return { success: false, error: (error instanceof Error ? error.message : 'Unknown error') }\n }\n}\n\nexport function useAlert() {\n const { enqueueSnackbar: enqueue, closeSnackbar } = useSnackbar()\n\n const enqueueAlert = (options: AlertOptions) => enqueueAlertWith(enqueue, options)\n const enqueueCollapsable = (options: CollapsableAlertOptions) => enqueueCollapsableWith(enqueue, options)\n const enqueueError = (message: string | React.ReactNode, options?: Omit<AlertOptions, 'message' | 'variant'>) =>\n enqueueAlert({ variant: ALERT_VARIANTs.error, message, ...options })\n const enqueueSuccess = (message: string | React.ReactNode, options?: Omit<AlertOptions, 'message' | 'variant'>) =>\n enqueueAlert({ variant: ALERT_VARIANTs.success, message, ...options })\n const enqueueWarning = (message: string | React.ReactNode, options?: Omit<AlertOptions, 'message' | 'variant'>) =>\n enqueueAlert({ variant: ALERT_VARIANTs.warning, message, ...options })\n const enqueueInfo = (message: string | React.ReactNode, options?: Omit<AlertOptions, 'message' | 'variant'>) =>\n enqueueAlert({ variant: ALERT_VARIANTs.info, message, ...options })\n const enqueueSystem = (message: string | React.ReactNode, options?: Omit<AlertOptions, 'message' | 'variant'>) =>\n enqueueAlert({ variant: ALERT_VARIANTs.system, message, ...options })\n const enqueueInsight = (message: string | React.ReactNode, options?: Omit<AlertOptions, 'message' | 'variant'>) =>\n enqueueAlert({ variant: ALERT_VARIANTs.insight, message, ...options })\n\n return {\n enqueueAlert,\n enqueueCollapsable,\n enqueueError,\n enqueueSuccess,\n enqueueWarning,\n enqueueInfo,\n enqueueSystem,\n enqueueInsight,\n closeSnackbar,\n }\n}\n\nexport function enqueueAlert({\n message,\n variant,\n id = randomStrGenerator(10),\n autoHideDuration = DEFAULTs.AUTO_HIDE_DURATION,\n anchorOrigin = DEFAULTs.ANCHOR_ORIGIN,\n icon,\n styleVariant,\n action,\n ...rest\n}: AlertOptions): AlertOperationResult<string> {\n return enqueueAlertWith(enqueueSnackbar, {\n message,\n variant,\n id,\n autoHideDuration,\n anchorOrigin,\n icon,\n styleVariant,\n action,\n ...rest,\n })\n}\n\nexport function enqueueCollapsable({\n id = randomStrGenerator(10),\n autoHideDuration = DEFAULTs.AUTO_HIDE_DURATION,\n anchorOrigin = DEFAULTs.ANCHOR_ORIGIN,\n styleVariant,\n componentProps = {},\n componentWrapperProps = {},\n ...rest\n}: CollapsableAlertOptions): AlertOperationResult<string> {\n return enqueueCollapsableWith(enqueueSnackbar, {\n id,\n autoHideDuration,\n anchorOrigin,\n styleVariant,\n componentProps,\n componentWrapperProps,\n ...rest,\n })\n}\n\nexport function enqueueError(message: string | React.ReactNode, options?: Omit<AlertOptions, 'message' | 'variant'>) {\n return enqueueAlert({\n variant: ALERT_VARIANTs.error,\n message,\n ...options\n })\n}\n\nexport function enqueueSuccess(message: string | React.ReactNode, options?: Omit<AlertOptions, 'message' | 'variant'>) {\n return enqueueAlert({\n variant: ALERT_VARIANTs.success,\n message,\n ...options\n })\n}\n\nexport function enqueueWarning(message: string | React.ReactNode, options?: Omit<AlertOptions, 'message' | 'variant'>) {\n return enqueueAlert({\n variant: ALERT_VARIANTs.warning,\n message,\n ...options\n })\n}\n\nexport function enqueueInfo(message: string | React.ReactNode, options?: Omit<AlertOptions, 'message' | 'variant'>) {\n return enqueueAlert({\n variant: ALERT_VARIANTs.info,\n message,\n ...options\n })\n}\n\nexport function enqueueSystem(message: string | React.ReactNode, options?: Omit<AlertOptions, 'message' | 'variant'>) {\n return enqueueAlert({\n variant: ALERT_VARIANTs.system,\n message,\n ...options\n })\n}\n\nexport function enqueueInsight(message: string | React.ReactNode, options?: Omit<AlertOptions, 'message' | 'variant'>) {\n return enqueueAlert({\n variant: ALERT_VARIANTs.insight,\n message,\n ...options\n })\n}\n","export const ALERT_VARIANTs = {\n info: 'myInfo',\n warning: 'myWarning',\n success: 'mySuccess',\n error: 'myError',\n system: 'mySystem',\n insight: 'myInsight',\n collapsable: 'myCollapsable',\n} as const\n\nexport const ALERT_STYLE_VARIANTs = {\n soft: 'soft',\n classic: 'classic',\n} as const\n\nexport const DEFAULTs = {\n AUTO_HIDE_DURATION: 3000,\n /** Quiet glass toast look is the default snackbar chrome. */\n STYLE_VARIANT: 'soft' as const,\n ANCHOR_ORIGIN: { horizontal: \"right\" as const, vertical: \"top\" as const },\n PROVIDER_CONFIGs: {\n maxSnack: 3,\n dense: true,\n preventDuplicate: true,\n autoHideDuration: 3000,\n }\n} as const\n\nexport const ERRORs = {\n invalid_variant: 'Invalid alert variant provided',\n enqueue_failed: 'Failed to enqueue alert',\n missing_message: 'Message is required for alert',\n missing_component_props: 'Component props are required for collapsible alert',\n} as const\n"],"mappings":"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","names":["error","closeSnackbar","enqueueAlert","enqueueCollapsable","enqueueError","enqueueSuccess","enqueueWarning","enqueueInfo","enqueueSystem","enqueueInsight"]}
|