@servicetitan/anvil2 2.0.4 → 2.2.0
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/CHANGELOG.md +56 -0
- package/dist/{Calendar-jO-0jbbt.js → Calendar-D0CczOpQ.js} +3 -835
- package/dist/Calendar-D0CczOpQ.js.map +1 -0
- package/dist/{Calendar-DxLrWESu.js → Calendar-oNlBgZKB.js} +2 -2
- package/dist/{Calendar-DxLrWESu.js.map → Calendar-oNlBgZKB.js.map} +1 -1
- package/dist/Calendar.js +2 -2
- package/dist/{Checkbox-9VbydUcM.js → Checkbox-DIY-6agd.js} +12 -12
- package/dist/Checkbox-DIY-6agd.js.map +1 -0
- package/dist/{Checkbox-ZXftLNwB.js → Checkbox-DuzAqrE7.js} +2 -2
- package/dist/{Checkbox-ZXftLNwB.js.map → Checkbox-DuzAqrE7.js.map} +1 -1
- package/dist/Checkbox.js +1 -1
- package/dist/{Combobox-CNObHLjp.js → Combobox-CSGn20KQ.js} +14 -7
- package/dist/Combobox-CSGn20KQ.js.map +1 -0
- package/dist/Combobox.js +1 -1
- package/dist/{DataTable-CQpySyDq.js → DataTable-D30sE1Xt.js} +223 -19
- package/dist/DataTable-D30sE1Xt.js.map +1 -0
- package/dist/{DateFieldRange-BG86w0pX.js → DateFieldRange-DBOiqaML.js} +46 -36
- package/dist/DateFieldRange-DBOiqaML.js.map +1 -0
- package/dist/DateFieldRange.js +1 -1
- package/dist/{DateFieldSingle-Byu_jyye.js → DateFieldSingle-C4hU55MP.js} +38 -29
- package/dist/DateFieldSingle-C4hU55MP.js.map +1 -0
- package/dist/DateFieldSingle.js +1 -1
- package/dist/{DateFieldYearless-Dw1k3_PY.js → DateFieldYearless-BXkUiHIR.js} +14 -13
- package/dist/DateFieldYearless-BXkUiHIR.js.map +1 -0
- package/dist/DateFieldYearless.js +1 -1
- package/dist/{DateFieldYearlessRange--plyld10.js → DateFieldYearlessRange-CGffFnVT.js} +14 -13
- package/dist/DateFieldYearlessRange-CGffFnVT.js.map +1 -0
- package/dist/DateFieldYearlessRange.js +1 -1
- package/dist/{DaysOfTheWeek-vE310Rjp.js → DaysOfTheWeek-DJEDopC9.js} +9 -5
- package/dist/DaysOfTheWeek-DJEDopC9.js.map +1 -0
- package/dist/DaysOfTheWeek.js +1 -1
- package/dist/{Dialog-DZPaz84r.js → Dialog-BbsZMnCA.js} +4 -4
- package/dist/{Dialog-DZPaz84r.js.map → Dialog-BbsZMnCA.js.map} +1 -1
- package/dist/Dialog.js +1 -1
- package/dist/{Drawer-pMQOa2jH.js → Drawer-Dhq76ot3.js} +4 -4
- package/dist/{Drawer-pMQOa2jH.js.map → Drawer-Dhq76ot3.js.map} +1 -1
- package/dist/Drawer.js +1 -1
- package/dist/DrillDown.js +1 -1
- package/dist/{FieldDialog-Be54L3E-.js → FieldDialog-CAuhkCZY.js} +541 -142
- package/dist/FieldDialog-CAuhkCZY.js.map +1 -0
- package/dist/FieldDialog.css +58 -28
- package/dist/{FieldLabel-DSrHbw9U.js → FieldLabel-DL0D6fvc.js} +2 -2
- package/dist/{FieldLabel-DSrHbw9U.js.map → FieldLabel-DL0D6fvc.js.map} +1 -1
- package/dist/FieldLabel.js +1 -1
- package/dist/FieldMessage-DS0COrjp.js +132 -0
- package/dist/FieldMessage-DS0COrjp.js.map +1 -0
- package/dist/FieldMessage.css +18 -4
- package/dist/FieldMessage.js +2 -1
- package/dist/FieldMessage.js.map +1 -1
- package/dist/{Helper-CK-XjpR3.js → Helper-PNGm_U2X.js} +7 -4
- package/dist/Helper-PNGm_U2X.js.map +1 -0
- package/dist/{InputMask-DoqWRi3t.js → InputMask-Ds0W2fKy.js} +2 -2
- package/dist/{InputMask-DoqWRi3t.js.map → InputMask-Ds0W2fKy.js.map} +1 -1
- package/dist/InputMask.js +1 -1
- package/dist/{ListView-CtRhYAls.js → ListView-MMmJDM--.js} +2 -2
- package/dist/{ListView-CtRhYAls.js.map → ListView-MMmJDM--.js.map} +1 -1
- package/dist/ListView.js +1 -1
- package/dist/MultiSelectField.js +1 -1
- package/dist/{MultiSelectFieldSync-xj7jXas-.js → MultiSelectFieldSync-Bey99LzJ.js} +178 -58
- package/dist/MultiSelectFieldSync-Bey99LzJ.js.map +1 -0
- package/dist/NumberField-CDkEUfXW.js +237 -0
- package/dist/NumberField-CDkEUfXW.js.map +1 -0
- package/dist/NumberField.js +1 -1
- package/dist/{Page-vc7zs4tn.js → Page-BVxybI-j.js} +6 -6
- package/dist/{Page-vc7zs4tn.js.map → Page-BVxybI-j.js.map} +1 -1
- package/dist/Page.js +1 -1
- package/dist/{Popover-OOLK0hUz.js → Popover-4C5IVk8T.js} +7 -6
- package/dist/{Popover-OOLK0hUz.js.map → Popover-4C5IVk8T.js.map} +1 -1
- package/dist/Popover.css +15 -14
- package/dist/Popover.js +1 -1
- package/dist/{ProgressBar-HA9RPZfC.js → ProgressBar-BGwp-qnf.js} +16 -11
- package/dist/ProgressBar-BGwp-qnf.js.map +1 -0
- package/dist/ProgressBar.js +1 -1
- package/dist/{Radio-31wKzlZ4.js → Radio-BRcpSu-d.js} +12 -12
- package/dist/Radio-BRcpSu-d.js.map +1 -0
- package/dist/{Radio-BwWDJuLF.js → Radio-D7hNws2b.js} +2 -2
- package/dist/{Radio-BwWDJuLF.js.map → Radio-D7hNws2b.js.map} +1 -1
- package/dist/Radio.js +1 -1
- package/dist/{SelectCard-C91twG1S.js → SelectCard-Bag44PmE.js} +3 -3
- package/dist/{SelectCard-C91twG1S.js.map → SelectCard-Bag44PmE.js.map} +1 -1
- package/dist/SelectCard.js +1 -1
- package/dist/SelectField.js +1 -1
- package/dist/{SelectFieldSync-BFsJssdD.js → SelectFieldSync-CigqXq3T.js} +67 -50
- package/dist/SelectFieldSync-CigqXq3T.js.map +1 -0
- package/dist/{SelectTrigger-Cxhx9IVo.js → SelectTrigger-DgsvUfyl.js} +2 -2
- package/dist/{SelectTrigger-Cxhx9IVo.js.map → SelectTrigger-DgsvUfyl.js.map} +1 -1
- package/dist/SelectTrigger.js +1 -1
- package/dist/{SelectTriggerBase-aaOWep-V.js → SelectTriggerBase-OxfNqdIq.js} +12 -7
- package/dist/SelectTriggerBase-OxfNqdIq.js.map +1 -0
- package/dist/{Stepper-Jv9A3Ned.js → Stepper-D8lkCP8Y.js} +11 -2
- package/dist/Stepper-D8lkCP8Y.js.map +1 -0
- package/dist/Stepper.js +1 -1
- package/dist/{Switch-DQICcdAv.js → Switch-D0zwZCg4.js} +2 -2
- package/dist/{Switch-DQICcdAv.js.map → Switch-D0zwZCg4.js.map} +1 -1
- package/dist/Switch.js +1 -1
- package/dist/Table.js +1 -1
- package/dist/{TextField-CDiiYSlT.js → TextField-BycenT6H.js} +13 -12
- package/dist/TextField-BycenT6H.js.map +1 -0
- package/dist/{TextField-CnYxS52Y.js → TextField-Dfzn2HeL.js} +2 -2
- package/dist/{TextField-CnYxS52Y.js.map → TextField-Dfzn2HeL.js.map} +1 -1
- package/dist/TextField.js +1 -1
- package/dist/{Textarea-BnHIDj2P.js → Textarea-BwbwJP6z.js} +13 -12
- package/dist/Textarea-BwbwJP6z.js.map +1 -0
- package/dist/Textarea.js +1 -1
- package/dist/{TimeField-ChqK40k_.js → TimeField-B0WSzSfJ.js} +4 -4
- package/dist/{TimeField-ChqK40k_.js.map → TimeField-B0WSzSfJ.js.map} +1 -1
- package/dist/TimeField.js +1 -1
- package/dist/TimezoneMessage-Cnsl4cHT.js +84 -0
- package/dist/TimezoneMessage-Cnsl4cHT.js.map +1 -0
- package/dist/TimezoneMessage.css +7 -0
- package/dist/Toast.js +2 -2
- package/dist/{Toaster-BlycAc63.js → Toaster-9Q_yaKGu.js} +18 -18
- package/dist/Toaster-9Q_yaKGu.js.map +1 -0
- package/dist/{Toaster-DW_bi2L9.js → Toaster-DHo8dnWH.js} +2 -2
- package/dist/{Toaster-DW_bi2L9.js.map → Toaster-DHo8dnWH.js.map} +1 -1
- package/dist/{Toolbar-vBomnRKG.js → Toolbar-CVOenuCF.js} +70 -23
- package/dist/Toolbar-CVOenuCF.js.map +1 -0
- package/dist/Toolbar.js +1 -1
- package/dist/{Tooltip-CUiAJXak.js → Tooltip-Bt62hC5J.js} +5 -5
- package/dist/{Tooltip-CUiAJXak.js.map → Tooltip-Bt62hC5J.js.map} +1 -1
- package/dist/Tooltip.css +9 -8
- package/dist/Tooltip.js +1 -1
- package/dist/{YearlessDateInputWithPicker-DZSb8sPf.js → YearlessDateInputWithPicker-ztozRk-X.js} +3 -3
- package/dist/{YearlessDateInputWithPicker-DZSb8sPf.js.map → YearlessDateInputWithPicker-ztozRk-X.js.map} +1 -1
- package/dist/beta/components/MultiSelectField/MultiSelectField.d.ts +2 -0
- package/dist/beta/components/MultiSelectField/MultiSelectFieldSync.d.ts +43 -4
- package/dist/beta/components/MultiSelectField/internal/MultiSelectFieldList.d.ts +5 -5
- package/dist/beta/components/MultiSelectField/internal/useComboMultiple.d.ts +13 -2
- package/dist/beta/components/MultiSelectField/stories/MultiSelectField.stories.data.d.ts +1 -0
- package/dist/beta/components/MultiSelectField/types.d.ts +52 -8
- package/dist/beta/components/SelectField/SelectFieldSync.d.ts +10 -3
- package/dist/beta/components/SelectField/internal/FieldListBase.d.ts +6 -5
- package/dist/beta/components/SelectField/internal/SelectFieldList.d.ts +4 -2
- package/dist/beta/components/SelectField/internal/SelectFieldListItem.d.ts +2 -1
- package/dist/beta/components/SelectField/internal/VirtualizedFieldListBase.d.ts +2 -0
- package/dist/beta/components/SelectField/internal/useCombo.d.ts +3 -1
- package/dist/beta/components/SelectField/internal/useFieldListSections.d.ts +55 -0
- package/dist/beta/components/SelectField/stories/SelectField.stories.data.d.ts +1 -0
- package/dist/beta/components/SelectField/types.d.ts +24 -6
- package/dist/beta/components/Table/DataTable/internal/editable-cells/DataTableEditableNumberCell.d.ts +7 -0
- package/dist/beta/components/Table/DataTable/internal/util/getTanStackColumnDef.d.ts +1 -0
- package/dist/beta/components/Table/DataTable/stories/DataTable.story-data.d.ts +1 -0
- package/dist/beta/components/Table/createColumnHelper.d.ts +36 -9
- package/dist/beta/components/Table/types.d.ts +54 -4
- package/dist/beta/components/Toolbar/Filters/internal/utils/filter-state.d.ts +1 -0
- package/dist/beta.js +7 -7
- package/dist/components/ButtonToggle/ButtonToggle.d.ts +1 -1
- package/dist/components/Checkbox/Checkbox.d.ts +2 -1
- package/dist/components/Checkbox/CheckboxGroup.d.ts +16 -8
- package/dist/components/Checkbox/internal/Checkbox.d.ts +1 -1
- package/dist/components/DateFieldRange/DateFieldRange.d.ts +8 -1
- package/dist/components/DateFieldRange/internal/DateFieldRangeCalendar.d.ts +3 -1
- package/dist/components/DateFieldSingle/DateFieldSingle.d.ts +8 -1
- package/dist/components/DateFieldSingle/internal/DateFieldSingleCalendar.d.ts +3 -1
- package/dist/components/DateFieldSingle/internal/TimezoneMessage.d.ts +6 -0
- package/dist/components/DateFieldSingle/internal/utils.d.ts +11 -0
- package/dist/components/DateFieldYearless/DateFieldYearless.d.ts +8 -3
- package/dist/components/DateFieldYearlessRange/DateFieldYearlessRange.d.ts +12 -1
- package/dist/components/DaysOfTheWeek/DaysOfTheWeek.d.ts +20 -6
- package/dist/components/Dialog/internal/useInitialFocus.d.ts +5 -1
- package/dist/components/FieldMessage/FieldMessage.d.ts +39 -20
- package/dist/components/FieldMessage/index.d.ts +1 -0
- package/dist/components/FieldMessage/utils.d.ts +7 -0
- package/dist/components/NumberField/NumberField.d.ts +24 -2
- package/dist/components/Page/Page.d.ts +2 -2
- package/dist/components/ProgressBar/ProgressBar.d.ts +8 -3
- package/dist/components/Radio/Radio.d.ts +2 -1
- package/dist/components/Radio/RadioGroup.d.ts +16 -8
- package/dist/components/SelectTrigger/internal/SelectTriggerBase.d.ts +1 -1
- package/dist/components/Stepper/Stepper.d.ts +6 -2
- package/dist/components/TextField/internal/TextField.d.ts +12 -1
- package/dist/components/Textarea/Textarea.d.ts +8 -5
- package/dist/index-DXeGMe23.js +836 -0
- package/dist/index-DXeGMe23.js.map +1 -0
- package/dist/{index.esm-BMOZFPwN.js → index.esm-C2ZhC_8d.js} +2 -2
- package/dist/{index.esm-BMOZFPwN.js.map → index.esm-C2ZhC_8d.js.map} +1 -1
- package/dist/{useOnClickOutside-Cyqbe1n3.js → index.esm-K9kxJhLx.js} +88 -94
- package/dist/index.esm-K9kxJhLx.js.map +1 -0
- package/dist/index.js +31 -30
- package/dist/index.js.map +1 -1
- package/dist/internal/components/Helper/Helper.d.ts +12 -3
- package/dist/internal/components/StatusIcon/StatusIcon.d.ts +45 -0
- package/dist/internal/components/StatusIcon/index.d.ts +1 -0
- package/dist/internal/functions/index.d.ts +1 -0
- package/dist/internal/functions/warnOnce.d.ts +5 -0
- package/dist/internal/hooks/useNumberField/useNumberField.d.ts +1 -1
- package/dist/{useDrilldown-lAdB3FFW.js → useDrilldown-jbU4Cs5l.js} +2 -598
- package/dist/useDrilldown-jbU4Cs5l.js.map +1 -0
- package/dist/{useInitialFocus-nOW12jQ5.js → useInitialFocus-BRRbylek.js} +2 -2
- package/dist/{useInitialFocus-nOW12jQ5.js.map → useInitialFocus-BRRbylek.js.map} +1 -1
- package/dist/{NumberField-W1k8V5Qq.js → useNumberField-eMyk7MB8.js} +5 -235
- package/dist/useNumberField-eMyk7MB8.js.map +1 -0
- package/dist/useOnClickOutside-Zw5vzxSq.js +71 -0
- package/dist/useOnClickOutside-Zw5vzxSq.js.map +1 -0
- package/dist/utils-pudAMGnO.js +25 -0
- package/dist/utils-pudAMGnO.js.map +1 -0
- package/package.json +9 -8
- package/dist/Calendar-jO-0jbbt.js.map +0 -1
- package/dist/Checkbox-9VbydUcM.js.map +0 -1
- package/dist/Combobox-CNObHLjp.js.map +0 -1
- package/dist/DataTable-CQpySyDq.js.map +0 -1
- package/dist/DateFieldRange-BG86w0pX.js.map +0 -1
- package/dist/DateFieldSingle-Byu_jyye.js.map +0 -1
- package/dist/DateFieldYearless-Dw1k3_PY.js.map +0 -1
- package/dist/DateFieldYearlessRange--plyld10.js.map +0 -1
- package/dist/DaysOfTheWeek-vE310Rjp.js.map +0 -1
- package/dist/FieldDialog-Be54L3E-.js.map +0 -1
- package/dist/FieldMessage-tEr6rWXS.js +0 -54
- package/dist/FieldMessage-tEr6rWXS.js.map +0 -1
- package/dist/Helper-CK-XjpR3.js.map +0 -1
- package/dist/MultiSelectFieldSync-xj7jXas-.js.map +0 -1
- package/dist/NumberField-W1k8V5Qq.js.map +0 -1
- package/dist/ProgressBar-HA9RPZfC.js.map +0 -1
- package/dist/Radio-31wKzlZ4.js.map +0 -1
- package/dist/SelectFieldSync-BFsJssdD.js.map +0 -1
- package/dist/SelectTriggerBase-aaOWep-V.js.map +0 -1
- package/dist/Stepper-Jv9A3Ned.js.map +0 -1
- package/dist/TextField-CDiiYSlT.js.map +0 -1
- package/dist/Textarea-BnHIDj2P.js.map +0 -1
- package/dist/Toaster-BlycAc63.js.map +0 -1
- package/dist/Toolbar-vBomnRKG.js.map +0 -1
- package/dist/useDrilldown-lAdB3FFW.js.map +0 -1
- package/dist/useOnClickOutside-Cyqbe1n3.js.map +0 -1
- package/dist/utils-BHKRoLps.js +0 -60
- package/dist/utils-BHKRoLps.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"DateFieldRange-BG86w0pX.js","sources":["../src/components/DateFieldRange/internal/maskito/dateRangePlaceholderMask.ts","../src/components/DateFieldRange/internal/MaskedDateRangeInput.tsx","../src/components/DateFieldRange/internal/useDateFieldRangeConversion.ts","../src/components/DateFieldRange/internal/useDateFieldRangeState.ts","../src/components/DateFieldRange/internal/DateFieldRangeCalendar.tsx","../src/components/DateFieldRange/internal/utils.ts","../src/components/DateFieldRange/DateFieldRange.tsx"],"sourcesContent":["import type { MaskitoOptions } from \"@maskito/core\";\nimport {\n MaskitoDateMode,\n maskitoDateRangeOptionsGenerator,\n maskitoWithPlaceholder,\n} from \"@maskito/kit\";\nimport { makeZeroShortcutPreprocessor } from \"../../../DateFieldSingle/internal/maskito/makeZeroShortcutPreprocessor\";\n\nexport type DateMode = Extract<\n MaskitoDateMode,\n \"dd/mm/yyyy\" | \"mm/dd/yyyy\" | \"yyyy/mm/dd\"\n>;\n\nconst datePlaceholderMask = ({\n mode,\n dateSeparator = \"/\",\n rangeSeparator = \" - \",\n placeholder,\n}: {\n mode: DateMode;\n dateSeparator?: string;\n rangeSeparator?: string;\n placeholder: string;\n}) => {\n const dateRangeOptions = maskitoDateRangeOptionsGenerator({\n mode,\n dateSeparator,\n rangeSeparator,\n });\n\n const { plugins, removePlaceholder, ...placeholderOptions } =\n maskitoWithPlaceholder(placeholder);\n\n const datePlaceholderMask = {\n ...dateRangeOptions,\n plugins: plugins.concat(dateRangeOptions.plugins || []),\n preprocessors: [\n ...placeholderOptions.preprocessors,\n ...dateRangeOptions.preprocessors,\n makeZeroShortcutPreprocessor(placeholder, dateSeparator),\n ],\n postprocessors: [\n // NOTE this is super fragile. If Maskito maintainers change the order of the post-processors, this will break.\n // The last postprocessor is the date swap postprocessor, which we don't want to run.\n // A unit test is added to ensure this doesn't break on a dependency update.\n ...dateRangeOptions.postprocessors.slice(0, -1),\n ...placeholderOptions.postprocessors,\n ],\n } satisfies Required<MaskitoOptions>;\n\n return { options: datePlaceholderMask, removePlaceholder };\n};\n\nexport default datePlaceholderMask;\n","import { maskitoParseDate } from \"@maskito/kit\";\nimport { useMaskito } from \"@maskito/react\";\nimport { TextField, TextFieldProps } from \"../../TextField/internal/TextField\";\nimport {\n forwardRef,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { useMergeRefs } from \"@floating-ui/react\";\nimport { DateTime } from \"luxon\";\nimport { Icon } from \"../../Icon\";\nimport Event from \"@servicetitan/hammer-icon/mdi/round/event.svg\";\nimport dateRangePlaceholderMask from \"./maskito/dateRangePlaceholderMask\";\nimport {\n DateModeToFormatMap,\n DateModeToPlaceholderMap,\n} from \"../../DateFieldSingle/internal/constants\";\nimport { DateMode } from \"../../DateFieldSingle/types\";\nimport { usePrevious } from \"../../../internal/hooks\";\nimport { jsDateToUtcDateTime } from \"../../DateFieldSingle/internal/utils\";\n\nconst RANGE_SEPARATOR = \" - \";\n\nexport type MaskedDateRangeInputChange = {\n startDate: DateTime | null;\n endDate: DateTime | null;\n isInputValid: boolean;\n isInputEmpty: boolean;\n};\n\nexport type MaskedDateRangeInputChangeHandler = (\n change: MaskedDateRangeInputChange,\n) => void;\n\nexport type MaskedDateRangeInputProps = Omit<\n TextFieldProps,\n \"onChange\" | \"value\" | \"ref\" | \"showCounter\" | \"hint\" | \"prefix\"\n> & {\n onChange: MaskedDateRangeInputChangeHandler;\n mode?: DateMode;\n startDate: DateTime | null;\n endDate: DateTime | null;\n disableHint?: boolean;\n};\n\nexport type MaskedDateRangeInputRef = HTMLInputElement & {\n setDateRange: (startDate: DateTime | null, endDate: DateTime | null) => void;\n};\n\n/**\n * A masked date input component that allows for the input of a date in a specific format.\n *\n * Provides a `setDates` method that can be used to set the date from outside the component (e.g from a calendar).\n *\n * @internal This component is not intended to be used directly in consumer code.\n *\n * @param props - The props for the MaskedDateRangeInput component.\n * @param props.onChange - The function to call when the date changes.\n * @param props.mode - The mode of the date input.\n * @param props.startDate - The start date.\n * @param props.endDate - The end date.\n * @param props.disableHint - Whether to disable the hint.\n */\nexport const MaskedDateRangeInput = forwardRef<\n MaskedDateRangeInputRef,\n MaskedDateRangeInputProps\n>(\n (\n {\n onChange,\n mode = \"mm/dd/yyyy\",\n startDate,\n endDate,\n disableHint = false,\n ...props\n },\n ref,\n ) => {\n const halfPlaceholder = DateModeToPlaceholderMap[mode];\n const fullPlaceholder = `${halfPlaceholder}${RANGE_SEPARATOR}${halfPlaceholder}`;\n\n // Tracks the value of the input as it is being typed.\n const [inputValue, setInputValue] = useState(fullPlaceholder);\n\n const { options, removePlaceholder } = dateRangePlaceholderMask({\n mode,\n placeholder: fullPlaceholder,\n dateSeparator: \"/\",\n rangeSeparator: RANGE_SEPARATOR,\n });\n const maskedInputRef = useMaskito({ options });\n const inputRef = useRef<HTMLInputElement>(null);\n const combinedRef = useMergeRefs([maskedInputRef, inputRef, ref]);\n const previousStartDate = usePrevious(startDate);\n const previousEndDate = usePrevious(endDate);\n const previousMode = usePrevious(mode);\n\n // Update the input value when the mode changes.\n useEffect(() => {\n if (mode !== previousMode) {\n setInputValue((previousInputValue) =>\n swapMode(previousInputValue, previousMode ?? mode, mode),\n );\n }\n }, [mode, fullPlaceholder, previousMode]);\n\n // Update the input value when the parent's start date or end date changes.\n useEffect(() => {\n if (startDate === undefined || endDate === undefined) return;\n // Return early if the values haven't actually changed.\n if (startDate === previousStartDate && endDate === previousEndDate)\n return;\n if (\n // plus one just represents a date that is guaranteed to be different.\n startDate?.equals(previousStartDate ?? startDate?.plus({ days: 1 })) &&\n (endDate?.equals(previousEndDate ?? endDate?.plus({ days: 1 })) ||\n endDate === previousEndDate)\n )\n return;\n const startDateString =\n startDate?.toFormat(DateModeToFormatMap[mode]) ?? halfPlaceholder;\n const endDateString =\n endDate?.toFormat(DateModeToFormatMap[mode]) ?? halfPlaceholder;\n const newInputValue = `${startDateString}${RANGE_SEPARATOR}${endDateString}`;\n setInputValue(newInputValue);\n }, [\n startDate,\n endDate,\n mode,\n halfPlaceholder,\n previousStartDate,\n previousEndDate,\n ]);\n\n const currentParsedData = useMemo(() => {\n return parseRangeInputValue(inputValue, mode, removePlaceholder);\n }, [inputValue, mode, removePlaceholder]);\n\n const handleChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n setInputValue(event.target.value);\n const {\n startDate: newlyParsedStartDate,\n endDate: newlyParsedEndDate,\n isInputValid,\n isInputEmpty,\n isHalfEmpty,\n } = parseRangeInputValue(event.target.value, mode, removePlaceholder);\n\n // We only want to call onChange for substantive changes.\n // This is to avoid unnecessary re-renders of upstream components.\n const isValueDifferent =\n isInputValid !== currentParsedData.isInputValid || // The input has changed validity\n isInputEmpty !== currentParsedData.isInputEmpty || // The input has changed emptiness\n (newlyParsedStartDate === null) !==\n (currentParsedData.startDate === null) || // The start date has changed from empty to non-empty or vice versa\n (newlyParsedEndDate === null) !==\n (currentParsedData.endDate === null) || // The end date has changed from empty to non-empty or vice versa\n isHalfEmpty !== currentParsedData.isHalfEmpty || // The half has changed from empty to non-empty or vice versa\n (newlyParsedStartDate !== null &&\n currentParsedData.startDate !== null &&\n !newlyParsedStartDate.equals(currentParsedData.startDate)) || // The start date has changed\n (newlyParsedEndDate !== null &&\n currentParsedData.endDate !== null &&\n !newlyParsedEndDate.equals(currentParsedData.endDate)); // The end date has changed\n\n // If the value has not changed, we do not need to call onChange.\n if (!isValueDifferent) return;\n onChange?.({\n startDate: isInputEmpty\n ? null\n : (newlyParsedStartDate ?? startDate ?? null),\n endDate:\n isInputEmpty || isHalfEmpty\n ? null\n : (newlyParsedEndDate ?? endDate ?? null),\n isInputValid,\n isInputEmpty,\n });\n };\n\n // Extend the input ref with additional methods.\n // This provides a way to set the input value from outside the component.\n useImperativeHandle(ref, () => {\n const input = inputRef.current;\n if (!input) return null as unknown as MaskedDateRangeInputRef;\n return Object.assign(input, {\n setDateRange: (\n startDate: DateTime | null,\n endDate: DateTime | null,\n ) => {\n const startDateString = startDate?.toFormat(\n DateModeToFormatMap[mode],\n );\n const endDateString = endDate?.toFormat(DateModeToFormatMap[mode]);\n const newInputValue = `${startDateString ?? halfPlaceholder}${RANGE_SEPARATOR}${endDateString ?? halfPlaceholder}`;\n setInputValue(newInputValue);\n },\n });\n }, [mode, halfPlaceholder]);\n\n return (\n <TextField\n ref={combinedRef}\n data-start-date={startDate?.toISODate() ?? \"\"}\n data-end-date={endDate?.toISODate() ?? \"\"}\n data-input-valid={currentParsedData.isInputValid}\n data-input-empty={currentParsedData.isInputEmpty}\n {...props}\n showCounter={false}\n value={inputValue}\n onChange={handleChange}\n prefix={<Icon svg={Event} />}\n hint={disableHint ? undefined : `Format: ${mode}`}\n />\n );\n },\n);\n\nMaskedDateRangeInput.displayName = \"MaskedDateRangeInput\";\n\nfunction parseRangeInputValue(\n value: string,\n mode: DateMode,\n removePlaceholder: (value: string) => string,\n) {\n const valueMinusPlaceholder = removePlaceholder(value);\n const [startDate, endDate] = valueMinusPlaceholder.split(RANGE_SEPARATOR);\n const startJsDate = maskitoParseDate(startDate, { mode });\n const endJsDate = endDate ? maskitoParseDate(endDate, { mode }) : null;\n const startLuxonDate = startJsDate ? jsDateToUtcDateTime(startJsDate) : null;\n const endLuxonDate = endJsDate ? jsDateToUtcDateTime(endJsDate) : null;\n return {\n startDate: startLuxonDate,\n endDate: endLuxonDate,\n isInputValid: !!(startLuxonDate && endLuxonDate), // input valid if both dates are filled\n isInputEmpty: valueMinusPlaceholder === \"\", // input empty if nothing is typed\n isHalfEmpty: endDate === undefined,\n };\n}\n\nfunction swapMode(inputString: string, previousMode: DateMode, mode: DateMode) {\n const halves = inputString.split(RANGE_SEPARATOR);\n const segments = halves.map((half) => half.split(\"/\"));\n\n let startDay, startMonth, startYear, endDay, endMonth, endYear;\n if (previousMode === \"mm/dd/yyyy\") {\n startDay = segments[0][1];\n startMonth = segments[0][0];\n startYear = segments[0][2];\n endDay = segments[1][1];\n endMonth = segments[1][0];\n endYear = segments[1][2];\n }\n if (previousMode === \"dd/mm/yyyy\") {\n startDay = segments[0][0];\n startMonth = segments[0][1];\n startYear = segments[0][2];\n endDay = segments[1][0];\n endMonth = segments[1][1];\n endYear = segments[1][2];\n }\n if (previousMode === \"yyyy/mm/dd\") {\n startDay = segments[0][2];\n startMonth = segments[0][1];\n startYear = segments[0][0];\n endDay = segments[1][2];\n endMonth = segments[1][1];\n endYear = segments[1][0];\n }\n\n if (mode === \"mm/dd/yyyy\") {\n return `${startMonth}/${startDay}/${startYear}${RANGE_SEPARATOR}${endMonth}/${endDay}/${endYear}`;\n }\n if (mode === \"dd/mm/yyyy\") {\n return `${startDay}/${startMonth}/${startYear}${RANGE_SEPARATOR}${endDay}/${endMonth}/${endYear}`;\n }\n if (mode === \"yyyy/mm/dd\") {\n return `${startYear}/${startMonth}/${startDay}${RANGE_SEPARATOR}${endYear}/${endMonth}/${endDay}`;\n }\n\n return inputString;\n}\n","import { useCallback, useMemo } from \"react\";\nimport { DateFieldRangeChange, DateFieldRangeProps } from \"../DateFieldRange\";\nimport { convertStringToDate } from \"../../DateFieldSingle/internal/utils\";\nimport { DateTime } from \"luxon\";\n\n/**\n * This hook is used to convert the string props of a DateFieldRange component to a DateTime format.\n *\n * @param props - The props of the DateFieldRange component.\n * @returns The normalized value, defaultValue, minDate, maxDate, and unavailable dates in DateTime format.\n * @internal This hook is not intended to be used directly in consumer code.\n */\nexport const useDateFieldRangeConversion = (props: DateFieldRangeProps) => {\n const { value, defaultValue, minDate, maxDate, unavailable, onChange } =\n props;\n\n const normalizedValue = useMemo(() => {\n if (value === null || value === undefined) return value;\n return {\n startDate: convertStringToDate(value.startDate) ?? null,\n endDate: convertStringToDate(value.endDate) ?? null,\n };\n }, [value]);\n\n const normalizedDefaultValue = useMemo(() => {\n if (defaultValue === null || defaultValue === undefined)\n return defaultValue;\n return {\n startDate: convertStringToDate(defaultValue.startDate) ?? null,\n endDate: convertStringToDate(defaultValue.endDate) ?? null,\n };\n }, [defaultValue]);\n\n const normalizedMinDate = useMemo(\n () => convertStringToDate(minDate),\n [minDate],\n );\n const normalizedMaxDate = useMemo(\n () => convertStringToDate(maxDate),\n [maxDate],\n );\n\n const normalizedUnavailableDates = useMemo(() => {\n return unavailable?.dates\n ?.map((date) => convertStringToDate(date))\n .filter((date) => date !== null && date !== undefined);\n }, [unavailable?.dates]);\n\n const handleChange = useCallback(\n (\n change: Omit<DateFieldRangeChange, \"startDate\" | \"endDate\"> & {\n startDate: DateTime | null;\n endDate: DateTime | null;\n },\n ) => {\n onChange?.({\n ...change,\n startDate: change.startDate?.toISODate() ?? null,\n endDate: change.endDate?.toISODate() ?? null,\n });\n },\n [onChange],\n );\n\n return {\n value: normalizedValue,\n defaultValue: normalizedDefaultValue,\n minDate: normalizedMinDate,\n maxDate: normalizedMaxDate,\n unavailable: {\n dates: normalizedUnavailableDates,\n daysOfWeek: unavailable?.daysOfWeek,\n },\n onChange: handleChange,\n };\n};\n","import { DateTime } from \"luxon\";\nimport { useOptionallyControlledState } from \"../../../internal/hooks\";\nimport { MaskedDateRangeInputChange } from \"./MaskedDateRangeInput\";\n\nexport type DateFieldRangeStateChange = {\n startDate: DateTime | null;\n endDate: DateTime | null;\n isInputValid: boolean;\n isInputEmpty: boolean;\n};\n\nexport type DateFieldRangeStateChangeHandler = (\n change: DateFieldRangeStateChange,\n) => void;\n\nexport type DateFieldRangeStateParam = {\n /**\n * The controlled value of the start date.\n */\n valueProp?: {\n startDate: DateTime | null;\n endDate: DateTime | null;\n } | null;\n /**\n * The default value of the start date.\n */\n defaultValueProp?: {\n startDate: DateTime | null;\n endDate: DateTime | null;\n } | null;\n /**\n * The function to call when the state changes.\n */\n onChange: DateFieldRangeStateChangeHandler;\n};\n\n/**\n * This hook is used to keep the state of a DateFieldRange component in sync with the input and calendar.\n */\nexport type DateFieldRangeState = {\n /**\n * The start date.\n */\n startDate: DateTime | null;\n /**\n * The end date.\n */\n endDate: DateTime | null;\n /**\n * The function to set the start date.\n */\n setStartDate: (date: DateTime | null) => void;\n /**\n * The function to set the end date.\n */\n setEndDate: (date: DateTime | null) => void;\n /**\n * The function to handle the input change.\n */\n handleInputChange: (change: MaskedDateRangeInputChange) => void;\n /**\n * The function to handle the calendar selection.\n */\n handleCalendarSelection: ({\n startDate,\n endDate,\n }: {\n startDate: DateTime | null;\n endDate: DateTime | null;\n }) => void;\n};\n\n/**\n * This is a hook for keeping state in sync between a date input and calendar.\n */\nexport function useDateFieldRangeState({\n valueProp,\n defaultValueProp,\n onChange,\n}: DateFieldRangeStateParam): DateFieldRangeState {\n const [startDate, setStartDate] =\n useOptionallyControlledState<DateTime | null>({\n controlledValue:\n valueProp !== undefined ? valueProp?.startDate : undefined,\n defaultValue:\n defaultValueProp !== undefined\n ? defaultValueProp?.startDate\n : undefined,\n });\n const [endDate, setEndDate] = useOptionallyControlledState<DateTime | null>({\n controlledValue: valueProp !== undefined ? valueProp?.endDate : undefined,\n defaultValue:\n defaultValueProp !== undefined ? defaultValueProp?.endDate : undefined,\n });\n\n const setSharedValue = (value: {\n startDate: DateTime | null;\n endDate: DateTime | null;\n }) => {\n setStartDate(value.startDate);\n setEndDate(value.endDate);\n };\n\n const handleInputChange = (change: MaskedDateRangeInputChange) => {\n const range = change.isInputEmpty\n ? null\n : {\n startDate: change.startDate?.startOf(\"day\") ?? null,\n endDate: change.endDate?.startOf(\"day\") ?? null,\n };\n\n onChange?.({\n startDate: range?.startDate ?? null,\n endDate: range?.endDate ?? null,\n isInputValid: change.isInputValid,\n isInputEmpty: change.isInputEmpty,\n });\n\n setStartDate(range?.startDate ?? null);\n setEndDate(range?.endDate ?? null);\n };\n\n const handleCalendarSelection = ({\n startDate,\n endDate,\n }: {\n startDate: DateTime | null;\n endDate: DateTime | null;\n }) => {\n setSharedValue({ startDate, endDate });\n onChange?.({\n startDate,\n endDate,\n isInputValid: true,\n isInputEmpty: false,\n });\n };\n\n return {\n startDate,\n endDate,\n setStartDate,\n setEndDate,\n handleInputChange,\n handleCalendarSelection,\n };\n}\n","import { DateTime, WeekdayNumbers } from \"luxon\";\nimport { Calendar, CalendarRangeValue } from \"../../Calendar/Calendar\";\nimport { useMemo } from \"react\";\nimport { usePrevious } from \"../../../internal/hooks\";\n\nexport type DateFieldRangeCalendarProps = {\n startDate: DateTime | null;\n endDate: DateTime | null;\n onKeyDown?: (event: React.KeyboardEvent<HTMLDivElement>) => void;\n onSelection: ({\n startDate,\n endDate,\n }: {\n startDate: DateTime | null;\n endDate: DateTime | null;\n }) => void;\n minDate?: DateTime | null;\n maxDate?: DateTime | null;\n unavailable?: {\n dates?: DateTime[];\n daysOfWeek?: WeekdayNumbers[];\n };\n};\n\nexport const DateFieldRangeCalendar = ({\n startDate,\n endDate,\n onKeyDown,\n onSelection,\n minDate,\n maxDate,\n unavailable,\n}: DateFieldRangeCalendarProps) => {\n const previousStartDate = usePrevious(startDate);\n const previousEndDate = usePrevious(endDate);\n\n const handleCalendarSelection = (data: { value: CalendarRangeValue }) => {\n if (!data.value) return;\n const calStartDate = data.value.start\n ? DateTime.fromISO(data.value.start, { zone: \"utc\" })\n : null;\n const calEndDate = data.value.end\n ? DateTime.fromISO(data.value.end, { zone: \"utc\" })\n : null;\n onSelection({\n startDate: calStartDate,\n endDate: calEndDate,\n });\n };\n\n const defaultFocusedDate = useMemo(() => {\n // Nothing selected, focus today\n if (!startDate && !endDate) return DateTime.now().toISODate();\n if (!startDate) return endDate?.toISODate();\n if (!endDate) return startDate?.toISODate();\n if (endDate && !previousEndDate?.equals(endDate)) {\n return endDate.toISODate();\n } else if (startDate && !previousStartDate?.equals(startDate)) {\n return startDate.toISODate();\n }\n\n if (endDate) return endDate.toISODate();\n if (startDate) return startDate.toISODate();\n return DateTime.now().toISODate();\n }, [previousStartDate, previousEndDate, startDate, endDate]);\n\n return (\n <Calendar\n // Crappy hack because the Calendar does not update when the value changes.\n key={`${startDate?.toISODate()}-${endDate?.toISODate()}`}\n range={true}\n onKeyDown={onKeyDown}\n defaultFocusedDate={defaultFocusedDate}\n value={{\n start: startDate?.toISODate() || undefined,\n end: endDate?.toISODate() || undefined,\n }}\n onSelection={handleCalendarSelection}\n defaultTimeZone=\"UTC\"\n minDate={minDate?.toISODate() ?? undefined}\n maxDate={maxDate?.toISODate() ?? undefined}\n unavailable={\n unavailable\n ? {\n dates: unavailable.dates?.map((d) => d.toISODate() ?? \"\"),\n daysOfWeek: unavailable.daysOfWeek,\n }\n : undefined\n }\n _disableAutofocus\n _disableFocus\n />\n );\n};\n","import { DateTime } from \"luxon\";\nimport { validateDate } from \"../../DateFieldSingle/internal/utils\";\n\ntype DateConstraints = {\n unavailable?: {\n dates?: DateTime[];\n daysOfWeek?: number[];\n };\n minDate?: DateTime;\n maxDate?: DateTime;\n};\n\nexport function validateDateRange({\n required,\n startDate,\n endDate,\n startDateConstraints,\n endDateConstraints,\n}: {\n required?: boolean;\n startDate: DateTime | null;\n endDate: DateTime | null;\n startDateConstraints: DateConstraints;\n endDateConstraints: DateConstraints;\n}) {\n if (!required && !startDate && !endDate) return true;\n return (\n validateDate({\n date: startDate,\n constraints: { ...startDateConstraints, required: true },\n }) &&\n validateDate({\n date: endDate,\n constraints: { ...endDateConstraints, required: true },\n }) &&\n (!startDate || !endDate || startDate <= endDate)\n );\n}\n","import { childrenToString } from \"../../internal/functions\";\nimport { useTrackingId } from \"../../hooks\";\nimport { DataTrackingId } from \"../../types\";\nimport {\n MaskedDateRangeInput,\n MaskedDateRangeInputProps,\n MaskedDateRangeInputRef,\n} from \"./internal/MaskedDateRangeInput\";\nimport { DateMode } from \"../DateFieldSingle/types\";\nimport { DateFieldRangeCalendar } from \"./internal/DateFieldRangeCalendar\";\nimport { RefObject, useMemo, useRef } from \"react\";\nimport { useDateFieldRangeConversion } from \"./internal/useDateFieldRangeConversion\";\nimport {\n DateFieldRangeStateChange,\n useDateFieldRangeState,\n} from \"./internal/useDateFieldRangeState\";\nimport { useFocusWithin } from \"../../internal/hooks\";\nimport { validateDateRange } from \"./internal/utils\";\nimport Popover from \"../Popover\";\nimport { mergeRefs } from \"../../hooks/useMergeRefs/useMergeRefs\";\n\nexport type DateFieldRangeChange = {\n /**\n * The start date in ISO 8601 format.\n * @example \"2025-03-22\"\n */\n startDate: string | null;\n /**\n * The end date in ISO 8601 format.\n * @example \"2025-07-02\"\n */\n endDate: string | null;\n /**\n * Whether the input field contains two parsable dates.\n * This is not the same as the date range being valid.\n *\n */\n isInputValid: boolean;\n /**\n * Whether the input field is empty.\n */\n isInputEmpty: boolean;\n /**\n * Whether the start and end dates are valid according to the constraints.\n * Constraints include:\n * - Required\n * - Unavailable dates\n * - Unavailable days of the week\n * - Min date\n * - Max date\n */\n isDateRangeValid: boolean;\n};\n\nexport type DateFieldRangeChangeHandler = (\n change: DateFieldRangeChange,\n) => void;\n\nexport type DateFieldRangeValue = {\n startDate: string | null;\n endDate: string | null;\n} | null;\n\nexport type DateFieldRangeProps = Omit<\n MaskedDateRangeInputProps,\n | \"onChange\"\n | \"value\"\n | \"autoComplete\"\n | \"onClick\"\n | \"onKeyDown\"\n | \"ref\"\n | \"required\"\n | \"startDate\"\n | \"endDate\"\n | \"defaultValue\"\n | \"onFocus\"\n | \"onBlur\"\n> & {\n value?: DateFieldRangeValue;\n defaultValue?: DateFieldRangeValue;\n onChange?: DateFieldRangeChangeHandler;\n mode?: Extract<DateMode, \"mm/dd/yyyy\" | \"dd/mm/yyyy\">;\n disableHint?: boolean;\n disableCalendar?: boolean;\n unavailable?: {\n dates?: string[];\n daysOfWeek?: (1 | 2 | 3 | 4 | 5 | 6 | 7)[];\n };\n minDate?: string;\n maxDate?: string;\n required?: boolean;\n onFocus?: (event: React.FocusEvent) => void;\n onBlur?: (event: React.FocusEvent) => void;\n} & DataTrackingId;\n\nexport const DateFieldRange = (props: DateFieldRangeProps) => {\n const data = {\n label: childrenToString(props.label),\n labelProps: props.labelProps,\n description: childrenToString(props.description),\n };\n\n const trackingId = useTrackingId({\n name: \"DateFieldRange\",\n data,\n hasOverride: !!props[\"data-tracking-id\"],\n });\n\n const {\n onFocus,\n onBlur,\n disableCalendar,\n required,\n mode,\n label,\n value: valueProp,\n defaultValue: defaultValueProp,\n minDate: minDateProp,\n maxDate: maxDateProp,\n unavailable: unavailableProp,\n onChange: onChangeProp,\n ...rest\n } = props;\n\n const popoverRef = useRef<{\n openPopover: () => void;\n closePopover: () => void;\n }>(null);\n\n const handleInputKeyDown = (ev: React.KeyboardEvent<HTMLInputElement>) => {\n if (ev.key === \"ArrowDown\") {\n ev.preventDefault();\n popoverRef.current?.openPopover();\n requestAnimationFrame(() => {\n popoverContentRef.current?.querySelector(\"button\")?.focus();\n });\n }\n };\n\n const { props: wrapperProps } = useFocusWithin({\n onBlur: (e) => {\n onBlur?.(e);\n popoverRef.current?.closePopover();\n },\n onFocus: onFocus,\n });\n\n const { value, defaultValue, minDate, maxDate, unavailable, onChange } =\n useDateFieldRangeConversion({\n value: valueProp,\n defaultValue: defaultValueProp,\n minDate: minDateProp,\n maxDate: maxDateProp,\n unavailable: unavailableProp,\n onChange: onChangeProp,\n });\n\n const inputRef = useRef<MaskedDateRangeInputRef>(null);\n const popoverContentRef = useRef<HTMLDivElement>(null);\n\n const handleChange = (change: DateFieldRangeStateChange) => {\n const sharedConstraints = {\n unavailable,\n minDate: minDate ?? undefined,\n maxDate: maxDate ?? undefined,\n };\n\n onChange?.({\n startDate: change.startDate?.startOf(\"day\") ?? null,\n endDate: change.endDate?.startOf(\"day\") ?? null,\n isInputValid: change.isInputValid,\n isInputEmpty: change.isInputEmpty,\n isDateRangeValid: validateDateRange({\n required: required,\n startDate: change.startDate?.startOf(\"day\") ?? null,\n endDate: change.endDate?.startOf(\"day\") ?? null,\n startDateConstraints: sharedConstraints,\n endDateConstraints: sharedConstraints,\n }),\n });\n };\n\n const { startDate, endDate, handleInputChange, handleCalendarSelection } =\n useDateFieldRangeState({\n valueProp: value,\n defaultValueProp: defaultValue,\n onChange: handleChange,\n });\n\n const currentValidity = useMemo(() => {\n return validateDateRange({\n required,\n startDate,\n endDate,\n startDateConstraints: {\n unavailable,\n minDate: minDate ?? undefined,\n maxDate: maxDate ?? undefined,\n },\n endDateConstraints: {\n unavailable,\n minDate: minDate ?? undefined,\n maxDate: maxDate ?? undefined,\n },\n });\n }, [required, startDate, endDate, minDate, maxDate, unavailable]);\n\n const commonFieldProps = {\n ...rest,\n mode,\n label,\n onChange: handleInputChange,\n startDate: startDate ?? null,\n endDate: endDate ?? null,\n required,\n autoComplete: \"off\",\n \"data-date-range-valid\": currentValidity,\n \"data-tracking-id\": trackingId,\n \"aria-label\": label ? undefined : \"Select a date range\",\n };\n\n const justTheField = (\n <MaskedDateRangeInput {...commonFieldProps} ref={inputRef} />\n );\n\n if (disableCalendar) {\n return justTheField;\n }\n\n return (\n <div {...wrapperProps}>\n <Popover\n ref={popoverRef}\n placement=\"bottom-start\"\n disableFlipFallback\n disableAutoUpdate\n >\n <Popover.Trigger>\n {({ ref: iRef, onKeyDown }) => {\n const mergedRef = mergeRefs([\n inputRef,\n iRef as RefObject<HTMLInputElement>,\n ]);\n return (\n <MaskedDateRangeInput\n {...commonFieldProps}\n ref={mergedRef}\n onKeyDown={(ev) => {\n onKeyDown?.(ev);\n handleInputKeyDown(ev);\n }}\n onClick={() => popoverRef.current?.openPopover()}\n onFocus={onFocus}\n onBlur={onBlur}\n />\n );\n }}\n </Popover.Trigger>\n <Popover.Content ref={popoverContentRef} data-testid=\"calendar-popover\">\n <DateFieldRangeCalendar\n startDate={startDate}\n endDate={endDate}\n onSelection={(v) => {\n if (v.endDate) {\n inputRef.current?.focus();\n popoverRef.current?.closePopover();\n }\n handleCalendarSelection(v);\n }}\n minDate={minDate}\n maxDate={maxDate}\n unavailable={unavailable}\n />\n </Popover.Content>\n </Popover>\n </div>\n );\n};\n\nDateFieldRange.displayName = \"DateFieldRange\";\n"],"names":["datePlaceholderMask","dateRangePlaceholderMask","startDate","endDate","Event"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"DateFieldSingle-Byu_jyye.js","sources":["../src/components/DateFieldSingle/internal/maskito/datePlaceholderMask.ts","../src/components/DateFieldSingle/internal/MaskedDateInput.tsx","../src/components/DateFieldSingle/internal/useDateFieldSingleConversion.ts","../src/components/DateFieldSingle/internal/useDateFieldSingleState.ts","../src/components/DateFieldSingle/internal/DateFieldSingleCalendar.tsx","../src/components/DateFieldSingle/DateFieldSingle.tsx"],"sourcesContent":["import type { MaskitoOptions } from \"@maskito/core\";\nimport {\n maskitoDateOptionsGenerator,\n maskitoWithPlaceholder,\n} from \"@maskito/kit\";\nimport { makeZeroShortcutPreprocessor } from \"./makeZeroShortcutPreprocessor\";\nimport { DateMode } from \"../../types\";\n\nconst datePlaceholderMask = ({\n mode,\n separator = \"/\",\n placeholder,\n}: {\n mode: DateMode;\n separator?: string;\n placeholder: string;\n}) => {\n const dateOptions = maskitoDateOptionsGenerator({\n mode,\n separator,\n });\n\n const { plugins, removePlaceholder, ...placeholderOptions } =\n maskitoWithPlaceholder(placeholder);\n\n const datePlaceholderMask = {\n ...dateOptions,\n plugins: plugins.concat(dateOptions.plugins || []),\n preprocessors: [\n ...placeholderOptions.preprocessors,\n ...dateOptions.preprocessors,\n makeZeroShortcutPreprocessor(mode, separator),\n ],\n postprocessors: [\n ...dateOptions.postprocessors,\n ...placeholderOptions.postprocessors,\n ],\n } satisfies Required<MaskitoOptions>;\n\n return { options: datePlaceholderMask, removePlaceholder };\n};\n\nexport default datePlaceholderMask;\n","import { maskitoParseDate } from \"@maskito/kit\";\nimport { useMaskito } from \"@maskito/react\";\nimport { TextField, TextFieldProps } from \"../../TextField/internal/TextField\";\nimport {\n forwardRef,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { useMergeRefs } from \"@floating-ui/react\";\nimport { DateTime } from \"luxon\";\nimport datePlaceholderMask from \"./maskito/datePlaceholderMask\";\nimport { Icon } from \"../../Icon\";\nimport Event from \"@servicetitan/hammer-icon/mdi/round/event.svg\";\nimport { DateModeToFormatMap, DateModeToPlaceholderMap } from \"./constants\";\nimport { DateMode } from \"../types\";\nimport { usePrevious } from \"../../../internal/hooks\";\nimport { jsDateToUtcDateTime } from \"./utils\";\n\nexport type MaskedDateInputChange = {\n date: DateTime | null;\n isInputValid: boolean;\n isInputEmpty: boolean;\n};\n\nexport type MaskedDateInputChangeHandler = (\n change: MaskedDateInputChange,\n) => void;\n\nexport type MaskedDateInputProps = Omit<\n TextFieldProps,\n \"onChange\" | \"value\" | \"ref\" | \"showCounter\" | \"hint\" | \"prefix\"\n> & {\n onChange: MaskedDateInputChangeHandler;\n mode?: DateMode;\n lastValidDate: DateTime | null;\n disableHint?: boolean;\n};\n\nexport type MaskedDateInputRef = HTMLInputElement & {\n setDate: (date: DateTime | null) => void;\n};\n\n/**\n * A masked date input component that allows for the input of a date in a specific format.\n *\n * Provides a `setDate` method that can be used to set the date from outside the component (e.g from a calendar).\n *\n * @internal This component is not intended to be used directly in consumer code.\n *\n * @param props - The props for the MaskedDateInput component.\n * @param props.onChange - The function to call when the date changes.\n * @param props.mode - The mode of the date input.\n */\nexport const MaskedDateInput = forwardRef<\n MaskedDateInputRef,\n MaskedDateInputProps\n>(\n (\n {\n onChange,\n mode = \"mm/dd/yyyy\",\n lastValidDate,\n disableHint = false,\n ...props\n },\n ref,\n ) => {\n const placeholder = DateModeToPlaceholderMap[mode];\n const [inputValue, setInputValue] = useState(placeholder);\n const { options, removePlaceholder } = datePlaceholderMask({\n mode,\n placeholder,\n });\n const maskedInputRef = useMaskito({ options });\n const inputRef = useRef<HTMLInputElement>(null);\n const combinedRef = useMergeRefs([maskedInputRef, inputRef, ref]);\n const previousDateRef = useRef<DateTime | null>(null);\n const previousMode = usePrevious(mode);\n\n // Update the input value when the mode changes.\n useEffect(() => {\n if (mode !== previousMode) {\n setInputValue((oldInputValue) =>\n swapMode(oldInputValue, previousMode ?? mode, mode),\n );\n }\n }, [mode, previousMode]);\n\n // Update the input value when the parent's date changes.\n useEffect(() => {\n if (lastValidDate === undefined) return;\n if (lastValidDate === previousDateRef.current) return; // Note: Reference equality is intentional here\n if (!lastValidDate?.equals(previousDateRef.current ?? DateTime.now())) {\n setInputValue(\n lastValidDate?.toFormat(DateModeToFormatMap[mode]) ?? placeholder,\n );\n previousDateRef.current = lastValidDate;\n }\n }, [lastValidDate, mode, placeholder]);\n\n const currentParsedData = useMemo(() => {\n return parseInputValue(inputValue, mode, removePlaceholder);\n }, [inputValue, mode, removePlaceholder]);\n\n const handleChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n setInputValue(event.target.value);\n const { date, isInputValid, isInputEmpty } = parseInputValue(\n event.target.value,\n mode,\n removePlaceholder,\n );\n\n // We only want to call onChange for substantive changes.\n // This is to avoid unnecessary re-renders of upstream components.\n const isValueDifferent =\n isInputValid !== currentParsedData.isInputValid || // The input has changed validity\n isInputEmpty !== currentParsedData.isInputEmpty || // The input has changed emptiness\n (date === null) !== (currentParsedData.date === null) || // The input has changed from empty to non-empty or vice versa\n (date !== null &&\n lastValidDate !== null &&\n !date.equals(lastValidDate)); // The date has changed\n\n // If the value has not changed, we do not need to call onChange.\n if (!isValueDifferent) return;\n onChange?.({\n date: date ?? lastValidDate ?? null,\n isInputValid,\n isInputEmpty,\n });\n };\n\n // Extend the input ref with additional methods.\n // This provides a way to set the input value from outside the component.\n useImperativeHandle(ref, () => {\n const input = inputRef.current;\n if (!input) return null as unknown as MaskedDateInputRef;\n return Object.assign(input, {\n setDate: (date: DateTime | null) => {\n setInputValue(\n date?.toFormat(DateModeToFormatMap[mode]) ?? placeholder,\n );\n },\n });\n }, [mode, placeholder]);\n\n return (\n <TextField\n ref={combinedRef}\n data-date={lastValidDate?.toISODate() ?? \"\"}\n data-input-valid={currentParsedData.isInputValid}\n data-input-empty={currentParsedData.isInputEmpty}\n {...props}\n showCounter={false}\n value={inputValue}\n onChange={handleChange}\n prefix={<Icon svg={Event} />}\n hint={disableHint ? undefined : `Format: ${mode}`}\n />\n );\n },\n);\n\nMaskedDateInput.displayName = \"MaskedDateInput\";\n\nfunction parseInputValue(\n value: string,\n mode: DateMode,\n removePlaceholder: (value: string) => string,\n) {\n const valueMinusPlaceholder = removePlaceholder(value);\n const jsDate = maskitoParseDate(valueMinusPlaceholder, { mode });\n const luxonDate = jsDate ? jsDateToUtcDateTime(jsDate) : null;\n return {\n date: luxonDate,\n isInputValid: !!luxonDate,\n isInputEmpty: valueMinusPlaceholder === \"\",\n };\n}\n\nfunction swapMode(inputString: string, previousMode: DateMode, mode: DateMode) {\n const { day, month, year } = divideSegments(inputString, previousMode);\n return orderSegmentsByMode(day, month, year, mode);\n}\n\nfunction divideSegments(\n value: string,\n mode: DateMode,\n): {\n day: string;\n month: string;\n year: string;\n} {\n const [segment1, segment2, segment3] = value.split(\"/\");\n if (mode === \"dd/mm/yyyy\") {\n return { day: segment1, month: segment2, year: segment3 };\n } else if (mode === \"mm/dd/yyyy\") {\n return { day: segment2, month: segment1, year: segment3 };\n } else if (mode === \"yyyy/mm/dd\") {\n return { day: segment3, month: segment2, year: segment1 };\n }\n return { day: \"__\", month: \"__\", year: \"____\" };\n}\n\nfunction orderSegmentsByMode(\n day: string,\n month: string,\n year: string,\n mode: DateMode,\n) {\n if (mode === \"dd/mm/yyyy\") {\n return `${day}/${month}/${year}`;\n } else if (mode === \"mm/dd/yyyy\") {\n return `${month}/${day}/${year}`;\n } else if (mode === \"yyyy/mm/dd\") {\n return `${year}/${month}/${day}`;\n } else {\n return \"\";\n }\n}\n","import { useCallback, useMemo } from \"react\";\nimport { convertStringToDate } from \"./utils\";\nimport {\n DateFieldSingleChange,\n DateFieldSingleProps,\n} from \"../DateFieldSingle\";\nimport { DateTime, WeekdayNumbers } from \"luxon\";\n\nexport type DateFieldSingleConversion = {\n /**\n * The current value of the date field.\n */\n value?: DateTime | null;\n /**\n * The default (uncontrolled) value of the date field.\n */\n defaultValue?: DateTime | null;\n /**\n * The minimum date of the date field.\n */\n minDate?: DateTime | null;\n /**\n * The maximum date of the date field.\n */\n maxDate?: DateTime | null;\n /**\n * The unavailable dates of the date field.\n */\n unavailable: {\n /**\n * The unavailable dates of the date field.\n */\n dates?: DateTime[];\n /**\n * The unavailable days of the week of the date field.\n */\n daysOfWeek?: WeekdayNumbers[];\n };\n /**\n * The callback for when the date changes.\n */\n onChange: (\n change: Omit<DateFieldSingleChange, \"date\"> & { date: DateTime | null },\n ) => void;\n};\n\n/**\n * Converts the props of the DateFieldSingle component to Luxon DateTime objects for easier internal use.\n * @param props - The props of the DateFieldSingle component using ISO 8601 strings.\n * @returns The converted props using Luxon DateTime objects.\n */\nexport function useDateFieldSingleConversion({\n value,\n defaultValue,\n minDate,\n maxDate,\n unavailable,\n onChange,\n}: DateFieldSingleProps): DateFieldSingleConversion {\n const normalizedValue = useMemo(() => convertStringToDate(value), [value]);\n const normalizedDefaultValue = useMemo(\n () => convertStringToDate(defaultValue),\n [defaultValue],\n );\n const normalizedMinDate = useMemo(\n () => convertStringToDate(minDate),\n [minDate],\n );\n const normalizedMaxDate = useMemo(\n () => convertStringToDate(maxDate),\n [maxDate],\n );\n const normalizedUnavailableDates = useMemo(\n () =>\n unavailable?.dates\n ?.map((d) => convertStringToDate(d))\n .filter((d) => d !== null && d !== undefined),\n [unavailable?.dates],\n );\n\n const handleChange = useCallback(\n (\n change: Omit<DateFieldSingleChange, \"date\"> & { date: DateTime | null },\n ) => {\n onChange?.({\n ...change,\n date: change.date?.toISODate() ?? null,\n });\n },\n [onChange],\n );\n\n return {\n value: normalizedValue,\n defaultValue: normalizedDefaultValue,\n minDate: normalizedMinDate,\n maxDate: normalizedMaxDate,\n unavailable: {\n dates: normalizedUnavailableDates,\n daysOfWeek: unavailable?.daysOfWeek,\n },\n onChange: handleChange,\n };\n}\n","import { DateTime } from \"luxon\";\nimport { useOptionallyControlledState } from \"../../../internal/hooks\";\nimport { MaskedDateInputChange } from \"./MaskedDateInput\";\n\nexport type DateFieldSingleStateChange = {\n date: DateTime | null;\n isInputValid: boolean;\n isInputEmpty: boolean;\n};\n\nexport type DateFieldSingleStateChangeHandler = (\n change: DateFieldSingleStateChange,\n) => void;\n\nexport type DateFieldSingleStateParam = {\n /**\n * The controlled value of the date field.\n */\n valueProp?: DateTime | null;\n /**\n * The default (uncontrolled) value of the date field.\n */\n defaultValueProp?: DateTime | null;\n /**\n * Callback for when the date changes.\n */\n onChange: DateFieldSingleStateChangeHandler;\n};\n\nexport type DateFieldSingleState = {\n /**\n * The current value (DateTime) of the date field.\n */\n value: DateTime | null;\n /**\n * Sets the value of the date field.\n */\n setValue: (value: DateTime | null) => void;\n /**\n * Handles the change of the input field.\n */\n handleInputChange: (change: MaskedDateInputChange) => void;\n /**\n * Handles the selection of a date in the calendar.\n */\n handleCalendarSelection: (date: DateTime) => void;\n};\n\n/**\n * This is a hook for keeping state in sync between a date input and calendar.\n */\nexport function useDateFieldSingleState({\n valueProp,\n defaultValueProp,\n onChange,\n}: DateFieldSingleStateParam): DateFieldSingleState {\n const [value, setValue] = useOptionallyControlledState<DateTime | null>({\n controlledValue: valueProp,\n defaultValue: defaultValueProp,\n });\n\n const handleInputChange = (change: MaskedDateInputChange) => {\n const date = change.isInputEmpty\n ? null\n : (change.date?.startOf(\"day\") ?? null);\n onChange?.({\n date,\n isInputValid: change.isInputValid,\n isInputEmpty: change.isInputEmpty,\n });\n if (change.isInputValid) {\n setValue(change.isInputEmpty ? null : change.date);\n }\n if (change.isInputEmpty) {\n setValue(null);\n return;\n }\n if (change.date) {\n setValue(change.date);\n }\n };\n\n const handleCalendarSelection = (date: DateTime) => {\n setValue(date);\n onChange?.({\n date,\n isInputValid: true,\n isInputEmpty: false,\n });\n };\n\n return {\n value,\n setValue,\n handleInputChange,\n handleCalendarSelection,\n };\n}\n","import { DateTime, WeekdayNumbers } from \"luxon\";\nimport { Calendar, CalendarProps, CalendarValue } from \"../../Calendar\";\n\ntype DateFieldSingleCalendarProps = Omit<\n CalendarProps,\n | \"onSelection\"\n | \"value\"\n | \"onKeyDown\"\n | \"defaultFocusedDate\"\n | \"range\"\n | \"defaultTimeZone\"\n | \"unavailable\"\n | \"minDate\"\n | \"maxDate\"\n | \"defaultValue\"\n | \"_disableAutofocus\"\n> & {\n onKeyDown?: (event: React.KeyboardEvent<HTMLDivElement>) => void;\n value: DateTime | null;\n onSelection: (date: DateTime) => void;\n minDate?: DateTime | null;\n maxDate?: DateTime | null;\n unavailable?: { dates?: DateTime[]; daysOfWeek?: WeekdayNumbers[] };\n};\n\nexport function DateFieldSingleCalendar({\n onKeyDown,\n value,\n onSelection,\n minDate,\n maxDate,\n unavailable,\n ...rest\n}: DateFieldSingleCalendarProps) {\n const handleCalendarSelection = (data: { value: CalendarValue }) => {\n if (data.value) {\n const date = DateTime.fromISO(data.value, { zone: \"utc\" });\n onSelection(date);\n }\n };\n\n return (\n <Calendar\n {...rest}\n range={false}\n onKeyDown={onKeyDown}\n defaultFocusedDate={value?.toISODate() || DateTime.now().toISODate()}\n value={value?.toISODate() || undefined}\n onSelection={handleCalendarSelection}\n defaultTimeZone=\"UTC\"\n minDate={minDate?.toISODate() ?? undefined}\n maxDate={maxDate?.toISODate() ?? undefined}\n unavailable={\n unavailable\n ? {\n dates: unavailable.dates?.map((d) => d.toISODate() ?? \"\"),\n daysOfWeek: unavailable.daysOfWeek,\n }\n : undefined\n }\n _disableFocus\n _disableAutofocus\n />\n );\n}\n","import { childrenToString } from \"../../internal/functions\";\nimport { useTrackingId } from \"../../hooks\";\nimport { DataTrackingId } from \"../../types\";\nimport Popover from \"../Popover\";\nimport { RefObject, useMemo, useRef } from \"react\";\nimport {\n MaskedDateInput,\n MaskedDateInputProps,\n MaskedDateInputRef,\n} from \"./internal/MaskedDateInput\";\nimport { DateMode } from \"./types\";\nimport { useDateFieldSingleConversion } from \"./internal/useDateFieldSingleConversion\";\nimport {\n DateFieldSingleStateChangeHandler,\n useDateFieldSingleState,\n} from \"./internal/useDateFieldSingleState\";\nimport { validateDate } from \"./internal/utils\";\nimport { useFocusWithin } from \"../../internal/hooks\";\nimport { DateFieldSingleCalendar } from \"./internal/DateFieldSingleCalendar\";\nimport { mergeRefs } from \"../../hooks/useMergeRefs/useMergeRefs\";\n\nexport type DateFieldSingleProps = Omit<\n MaskedDateInputProps,\n | \"onChange\"\n | \"value\"\n | \"autoComplete\"\n | \"onClick\"\n | \"onKeyDown\"\n | \"ref\"\n | \"lastValidDate\"\n | \"setLastValidDate\"\n | \"required\"\n | \"onFocus\"\n | \"onBlur\"\n> & {\n value?: string | null;\n defaultValue?: string | null;\n onChange?: DateFieldSingleChangeHandler;\n onFocus?: (event: React.FocusEvent) => void;\n onBlur?: (event: React.FocusEvent) => void;\n mode?: Extract<DateMode, \"mm/dd/yyyy\" | \"dd/mm/yyyy\">;\n disableHint?: boolean;\n disableCalendar?: boolean;\n unavailable?: {\n /**\n * The specific dates that are unavailable. ISO 8601 format.\n * @example [\"2025-07-02\"]\n */\n dates?: string[];\n /**\n * The days of the week that are unavailable.\n * (1-7, where 1 is Monday and 7 is Sunday)\n */\n daysOfWeek?: (1 | 2 | 3 | 4 | 5 | 6 | 7)[];\n };\n minDate?: string;\n maxDate?: string;\n required?: boolean;\n} & DataTrackingId;\n\nexport type DateFieldSingleChange = {\n /**\n * The date in ISO 8601 format.\n * @example \"2025-07-02\"\n */\n date: string | null;\n /**\n * Whether the input is valid. That is, it matches the format and is not empty.\n * This does not mean that the date is valid according to the constraints.\n */\n isInputValid: boolean;\n /**\n * Whether the input is empty.\n */\n isInputEmpty: boolean;\n /**\n * Whether the date is valid according to the constraints.\n * Constraints include:\n * - Required\n * - Unavailable dates\n * - Unavailable days of the week\n * - Min date\n * - Max date\n */\n isDateValid: boolean;\n};\n\nexport type DateFieldSingleChangeHandler = (\n change: DateFieldSingleChange,\n) => void;\n\nexport const DateFieldSingle = (props: DateFieldSingleProps) => {\n const data = {\n label: childrenToString(props.label),\n labelProps: props.labelProps,\n description: childrenToString(props.description),\n };\n\n const trackingId = useTrackingId({\n name: \"DateFieldSingle\",\n data,\n hasOverride: !!props[\"data-tracking-id\"],\n });\n\n const {\n onFocus,\n onBlur,\n disableCalendar,\n required,\n mode,\n value: valueProp,\n defaultValue: defaultValueProp,\n minDate: minDateProp,\n maxDate: maxDateProp,\n unavailable: unavailableProp,\n onChange: onChangeProp,\n label,\n ...rest\n } = props;\n\n const popoverRef = useRef<{\n openPopover: () => void;\n closePopover: () => void;\n }>(null);\n const inputRef = useRef<MaskedDateInputRef>(null);\n // We convert any props that deal in ISO 8601 strings to Luxon DateTime objects for easier internal use.\n const {\n value: normalizedValue,\n defaultValue: normalizedDefaultValue,\n minDate,\n maxDate,\n unavailable,\n onChange,\n } = useDateFieldSingleConversion({\n value: valueProp,\n defaultValue: defaultValueProp,\n onChange: onChangeProp,\n minDate: minDateProp,\n maxDate: maxDateProp,\n unavailable: unavailableProp,\n });\n\n const handleChange: DateFieldSingleStateChangeHandler = (change) => {\n onChange?.({\n ...change,\n isDateValid: validateDate({\n date: change.date,\n constraints: {\n required,\n unavailable,\n minDate: minDate ?? undefined,\n maxDate: maxDate ?? undefined,\n },\n }),\n });\n };\n\n // We use a hook to keep the value of input and the calendar in sync.\n const { value, handleInputChange, handleCalendarSelection } =\n useDateFieldSingleState({\n valueProp: normalizedValue,\n defaultValueProp: normalizedDefaultValue,\n onChange: handleChange,\n });\n\n const { props: wrapperProps } = useFocusWithin({\n onBlur: (e) => {\n onBlur?.(e);\n popoverRef.current?.closePopover();\n },\n onFocus,\n });\n\n const popoverContentRef = useRef<HTMLDivElement>(null);\n\n const currentValidity = useMemo(\n () =>\n validateDate({\n date: value,\n constraints: {\n required,\n unavailable,\n minDate: minDate ?? undefined,\n maxDate: maxDate ?? undefined,\n },\n }),\n [value, required, unavailable, minDate, maxDate],\n );\n\n const handleInputKeyDown = (ev: React.KeyboardEvent<HTMLInputElement>) => {\n if (ev.key === \"ArrowDown\") {\n popoverRef.current?.openPopover();\n requestAnimationFrame(() => {\n popoverContentRef.current?.querySelector(\"button\")?.focus();\n });\n }\n };\n\n const commonFieldProps = {\n ...rest,\n label,\n mode,\n onChange: handleInputChange,\n lastValidDate: value,\n required,\n autoComplete: \"off\",\n \"data-date-valid\": currentValidity,\n \"data-tracking-id\": trackingId,\n \"aria-label\": label ? undefined : \"Select a Date\",\n };\n if (disableCalendar) {\n return <MaskedDateInput ref={inputRef} {...commonFieldProps} />;\n }\n\n return (\n <div {...wrapperProps}>\n <Popover\n ref={popoverRef}\n placement=\"bottom-start\"\n disableFlipFallback\n disableAutoUpdate\n >\n <Popover.Trigger>\n {({ ref: iRef, onKeyDown }) => {\n const mergedRef = mergeRefs([\n iRef as RefObject<HTMLInputElement>,\n inputRef,\n ]);\n return (\n <MaskedDateInput\n {...commonFieldProps}\n ref={mergedRef}\n onKeyDown={(ev) => {\n onKeyDown?.(ev);\n handleInputKeyDown(ev);\n }}\n onClick={() => popoverRef.current?.openPopover()}\n onFocus={onFocus}\n onBlur={onBlur}\n />\n );\n }}\n </Popover.Trigger>\n <Popover.Content ref={popoverContentRef} data-testid=\"calendar-popover\">\n <DateFieldSingleCalendar\n value={value}\n onSelection={(v) => {\n inputRef.current?.focus();\n handleCalendarSelection(v);\n popoverRef.current?.closePopover();\n }}\n minDate={minDate}\n maxDate={maxDate}\n unavailable={unavailable}\n />\n </Popover.Content>\n </Popover>\n </div>\n );\n};\n\nDateFieldSingle.displayName = \"DateFieldSingle\";\n"],"names":["datePlaceholderMask","Event"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"DateFieldYearless-Dw1k3_PY.js","sources":["../src/components/DateFieldYearless/DateFieldYearless.tsx"],"sourcesContent":["import { childrenToString } from \"../../internal/functions\";\nimport { useTrackingId } from \"../../hooks\";\nimport { DataTrackingId, LayoutUtilProps, Size } from \"../../types\";\nimport { YearlessDate, YearlessDateMode } from \"./types\";\nimport {\n YearlessDateInputWithPicker,\n YearlessDateInputWithPickerRef,\n} from \"./internal/YearlessDateInputWithPicker\";\nimport { useLayoutPropsUtil } from \"../../internal/hooks\";\nimport {\n useId,\n useRef,\n useState,\n ReactElement,\n ReactNode,\n ComponentPropsWithoutRef,\n} from \"react\";\nimport { FieldLabel, FieldLabelProps } from \"../FieldLabel\";\nimport { Helper, HelperProps } from \"../../internal/components\";\nimport styles from \"../TextField/TextField.module.scss\";\nimport cx from \"classnames\";\n\nexport type DateFieldYearlessProps = Omit<\n ComponentPropsWithoutRef<\"input\">,\n | \"onChange\"\n | \"value\"\n | \"defaultValue\"\n | \"ref\"\n | \"size\"\n | \"type\"\n | \"onFocus\"\n | \"onBlur\"\n> &\n LayoutUtilProps & {\n /**\n * The controlled value of the date field\n */\n value?: YearlessDate | null;\n /**\n * The default value for uncontrolled usage\n */\n defaultValue?: YearlessDate | null;\n /**\n * The function to call when the date value changes\n */\n onChange?: DateFieldYearlessChangeHandler;\n /**\n * The date format mode (mm/dd or dd/mm)\n */\n mode?: YearlessDateMode;\n /**\n * Whether the field is required\n */\n required?: boolean;\n /**\n * The minimum allowed date\n */\n minDate?: YearlessDate | null;\n /**\n * The maximum allowed date\n */\n maxDate?: YearlessDate | null;\n /**\n * Configuration for unavailable dates\n */\n unavailable?: {\n /**\n * Array of dates that are not selectable\n */\n dates?: YearlessDate[];\n };\n /**\n * Whether the picker is disabled\n */\n disablePicker?: boolean;\n /**\n * Error state or error message\n */\n error?: ReactElement | string | boolean;\n /**\n * Label for the field\n */\n label?: FieldLabelProps[\"children\"];\n /**\n * Props for the label component\n */\n labelProps?: FieldLabelProps;\n /**\n * Description text for the field\n */\n description?: HelperProps[\"description\"];\n /**\n * Error aria-live setting\n */\n errorAriaLive?: HelperProps[\"errorAriaLive\"];\n /**\n * Size of the input\n */\n size?: Extract<Size, \"small\" | \"medium\" | \"large\">;\n /**\n * Whether the field is disabled\n */\n disabled?: boolean;\n /**\n * Whether the field is in loading state\n */\n loading?: boolean;\n /**\n * Additional info content\n */\n moreInfo?: ReactNode;\n /**\n * Whether to disable the format hint\n */\n disableHint?: boolean;\n /**\n * Function to call when the field is focused\n */\n onFocus?: (event: React.FocusEvent) => void;\n /**\n * Function to call when the field is blurred\n */\n onBlur?: (event: React.FocusEvent) => void;\n } & DataTrackingId;\n\n/**\n * Represents a change event for the DateFieldYearless component\n */\nexport type DateFieldYearlessChange = {\n /**\n * The current date value\n */\n value: YearlessDate | null;\n /**\n * Whether the input is valid\n */\n isInputValid: boolean;\n /**\n * Whether the input is empty\n */\n isInputEmpty: boolean;\n /**\n * Whether the overall value is valid\n */\n isValid: boolean;\n};\n\n/**\n * Handler function for DateFieldYearless change events\n */\nexport type DateFieldYearlessChangeHandler = (\n change: DateFieldYearlessChange,\n) => void;\n\n/**\n * DateFieldYearless component for inputting dates without year information.\n *\n * Features:\n * - Supports both controlled and uncontrolled usage\n * - Supports different date formats (mm/dd or dd/mm)\n * - Supports layout utilities for positioning and spacing\n *\n * @example\n * <DateFieldYearless\n * label=\"Birthday\"\n * mode=\"mm/dd\"\n * required\n * onChange={(change) => console.log('Date changed:', change.value)}\n * />\n */\nexport const DateFieldYearless = (props: DateFieldYearlessProps) => {\n const { layoutStyles, componentProps } = useLayoutPropsUtil(props);\n const {\n value,\n defaultValue,\n minDate,\n maxDate,\n unavailable,\n required,\n disablePicker = false,\n mode = \"mm/dd\",\n error,\n errorAriaLive: errorAriaLiveProp = \"assertive\",\n label,\n moreInfo,\n size,\n disabled,\n loading,\n labelProps,\n description,\n id: idProp,\n style,\n disableHint = false,\n onFocus,\n onBlur,\n className,\n onChange,\n ...restProps\n } = componentProps;\n\n const inputRef = useRef<YearlessDateInputWithPickerRef>(null);\n\n const [openInfo, setOpenInfo] = useState(false);\n const [errorAriaLive, setErrorAriaLive] =\n useState<HelperProps[\"errorAriaLive\"]>(\"off\");\n\n const handleFocus = (e: React.FocusEvent) => {\n setOpenInfo(true);\n setErrorAriaLive(errorAriaLiveProp);\n onFocus?.(e);\n };\n const handleBlur = (e: React.FocusEvent) => {\n setOpenInfo(false);\n setErrorAriaLive(\"off\");\n onBlur?.(e);\n };\n\n const data = {\n label: childrenToString(props.label),\n labelProps: props.labelProps,\n description: childrenToString(props.description),\n };\n\n const trackingId = useTrackingId({\n name: \"DateFieldYearless\",\n data,\n hasOverride: !!props[\"data-tracking-id\"],\n });\n\n const labelUid = useId();\n const id = idProp ?? labelUid;\n const helperUid = useId();\n\n const errorMessage = typeof error !== \"boolean\" ? error : undefined;\n\n const styleCombined = { ...style, ...layoutStyles };\n\n return (\n <div\n className={cx(styles[\"textfield\"], className)}\n data-anv=\"datefield-yearless\"\n style={styleCombined}\n >\n {label && (\n <FieldLabel\n // Hack to deal with Tooltip mismanaging state\n key={openInfo ? \"open\" : \"closed\"}\n moreInfo={moreInfo}\n moreInfoOpen={openInfo}\n required={required}\n htmlFor={id}\n {...labelProps}\n >\n {label}\n </FieldLabel>\n )}\n <YearlessDateInputWithPicker\n {...restProps}\n ref={inputRef}\n mode={mode}\n required={required}\n minDate={minDate}\n maxDate={maxDate}\n unavailable={unavailable}\n disablePicker={disablePicker}\n size={size}\n error={!!error}\n disabled={disabled}\n loading={loading}\n id={id}\n data-tracking-id={trackingId}\n aria-describedby={helperUid}\n aria-invalid={error ? !!error : undefined}\n aria-label={label ? undefined : \"Select a date\"}\n value={value}\n defaultValue={defaultValue}\n onChange={onChange}\n onFocus={handleFocus}\n onBlur={handleBlur}\n />\n {errorMessage || description || (!disableHint && mode) ? (\n <Helper\n id={helperUid}\n hint={disableHint ? undefined : `Format: ${mode}`}\n showCounter={false}\n errorMessage={errorMessage}\n errorAriaLive={errorAriaLive}\n description={description}\n />\n ) : null}\n </div>\n );\n};\n\nDateFieldYearless.displayName = \"DateFieldYearless\";\n"],"names":["styles"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"DateFieldYearlessRange--plyld10.js","sources":["../../hammer-icon/mdi/filled/arrow_forward.svg","../src/components/DateFieldYearlessRange/DateFieldYearlessRange.tsx"],"sourcesContent":["import * as React from \"react\";\nconst SvgArrowForward = (props) => /* @__PURE__ */ React.createElement(\"svg\", { xmlns: \"http://www.w3.org/2000/svg\", width: \"1em\", height: \"1em\", viewBox: \"0 0 24 24\", ...props }, /* @__PURE__ */ React.createElement(\"path\", { d: \"m12 4-1.41 1.41L16.17 11H4v2h12.17l-5.58 5.59L12 20l8-8z\" }));\nexport default SvgArrowForward;\n","import { ReactElement, useId, useState } from \"react\";\nimport cx from \"classnames\";\nimport textFieldStyles from \"../TextField/TextField.module.scss\";\nimport dateFieldYearlessRangeStyles from \"./DateFieldYearlessRange.module.scss\";\nimport { Helper, HelperProps } from \"../../internal/components\";\nimport { LayoutUtilProps, Size } from \"../../types\";\nimport {\n useLayoutPropsUtil,\n useOptionallyControlledState,\n} from \"../../internal/hooks\";\nimport FieldLabel, { FieldLabelProps } from \"../FieldLabel\";\nimport { YearlessDate, YearlessDateMode } from \"../DateFieldYearless/types\";\nimport Icon from \"../Icon\";\nimport ArrowForward from \"@servicetitan/hammer-icon/mdi/filled/arrow_forward.svg\";\nimport { YearlessDateInputWithPicker } from \"../DateFieldYearless/internal/YearlessDateInputWithPicker\";\n\nexport type DateFieldYearlessRangeValue = {\n startDate: YearlessDate | null;\n endDate: YearlessDate | null;\n};\n\nexport type DateFieldYearlessRangeChange = {\n startDate: YearlessDate | null;\n endDate: YearlessDate | null;\n};\n\nexport type DateFieldYearlessRangeChangeHandler = (\n change: DateFieldYearlessRangeChange,\n) => void;\n\nexport type DateFieldYearlessRangeProps = {\n /**\n * The controlled value of the date field\n */\n value?: DateFieldYearlessRangeValue;\n /**\n * The default value for uncontrolled usage\n */\n defaultValue?: DateFieldYearlessRangeValue;\n /**\n * The function to call when the date value changes\n */\n onChange?: DateFieldYearlessRangeChangeHandler;\n /**\n * The date format mode (mm/dd or dd/mm)\n */\n mode?: YearlessDateMode;\n /**\n * Whether the field is required\n */\n required?: boolean;\n /**\n * Whether the picker is disabled\n */\n disablePicker?: boolean;\n /**\n * Whether to disable the hint\n */\n disableHint?: boolean;\n error?: ReactElement | string | boolean;\n label: string;\n hideLabel?: boolean;\n size?: Extract<Size, \"small\" | \"medium\" | \"large\">;\n description?: HelperProps[\"description\"];\n errorAriaLive?: HelperProps[\"errorAriaLive\"];\n disabled?: boolean;\n onFocus?: (event: React.FocusEvent) => void;\n onBlur?: (event: React.FocusEvent) => void;\n id?: string;\n startLabel?: string;\n endLabel?: string;\n legendProps?: Omit<FieldLabelProps, \"el\">;\n moreInfo?: FieldLabelProps[\"moreInfo\"];\n} & LayoutUtilProps;\n\nexport const DateFieldYearlessRange = (props: DateFieldYearlessRangeProps) => {\n const { layoutStyles, componentProps } = useLayoutPropsUtil(props);\n const {\n label,\n moreInfo,\n size,\n hideLabel = false,\n required,\n id: idProp,\n legendProps,\n errorAriaLive: errorAriaLiveProp = \"assertive\",\n onFocus: onFocusProp,\n onBlur: onBlurProp,\n error,\n disabled,\n disableHint,\n description,\n mode = \"mm/dd\",\n startLabel = \"Start date\",\n endLabel = \"End date\",\n disablePicker,\n } = componentProps;\n\n const [value, setValue] =\n useOptionallyControlledState<DateFieldYearlessRangeValue>({\n controlledValue: props.value,\n defaultValue: props.defaultValue,\n onChange: props.onChange,\n });\n\n const [openInfo, setOpenInfo] = useState(false);\n const [errorAriaLive, setErrorAriaLive] =\n useState<HelperProps[\"errorAriaLive\"]>(\"off\");\n\n const handleFocus = (e: React.FocusEvent) => {\n setOpenInfo(true);\n setErrorAriaLive(errorAriaLiveProp);\n onFocusProp?.(e);\n };\n const handleBlur = (e: React.FocusEvent) => {\n setOpenInfo(false);\n setErrorAriaLive(\"off\");\n onBlurProp?.(e);\n };\n\n const labelUid = useId();\n const id = idProp ?? labelUid;\n const helperUid = useId();\n\n const errorMessage = typeof error !== \"boolean\" ? error : undefined;\n\n const handleStartDateChange = (startDate: YearlessDate | null) => {\n setValue({\n ...value,\n startDate,\n });\n };\n\n const handleEndDateChange = (endDate: YearlessDate | null) => {\n setValue({\n ...value,\n endDate,\n });\n };\n\n return (\n <fieldset\n className={cx(\n textFieldStyles[\"textfield\"],\n dateFieldYearlessRangeStyles[\"range-root\"],\n )}\n data-anv=\"date-field-yearless-range\"\n style={layoutStyles}\n >\n <FieldLabel\n el=\"legend\"\n moreInfo={moreInfo}\n moreInfoOpen={openInfo}\n required={required}\n {...legendProps}\n className={cx(\n legendProps?.className,\n hideLabel ? dateFieldYearlessRangeStyles[\"sr-only\"] : undefined,\n )}\n >\n {label}\n </FieldLabel>\n <div className={dateFieldYearlessRangeStyles[\"range-row\"]}>\n <FieldLabel\n htmlFor={id + \"-\" + \"start\"}\n className={dateFieldYearlessRangeStyles[\"sr-only\"]}\n >\n {startLabel}\n </FieldLabel>\n <YearlessDateInputWithPicker\n id={id + \"-\" + \"start\"}\n size={size}\n error={!!error}\n required={required}\n disabled={disabled}\n mode={mode}\n value={value?.startDate}\n onChange={(change) => handleStartDateChange(change.value)}\n aria-describedby={helperUid}\n disablePicker={disablePicker}\n onFocus={handleFocus}\n onBlur={handleBlur}\n />\n <Icon\n svg={ArrowForward}\n className={dateFieldYearlessRangeStyles[\"range-arrow\"]}\n />\n <FieldLabel\n htmlFor={id + \"-\" + \"end\"}\n className={dateFieldYearlessRangeStyles[\"sr-only\"]}\n >\n {endLabel}\n </FieldLabel>\n <YearlessDateInputWithPicker\n id={id + \"-\" + \"end\"}\n size={size}\n error={!!error}\n required={required}\n disabled={disabled}\n mode={mode}\n value={value?.endDate}\n onChange={(change) => handleEndDateChange(change.value)}\n aria-labelledby={labelUid}\n aria-describedby={helperUid}\n disablePicker={disablePicker}\n onFocus={handleFocus}\n onBlur={handleBlur}\n />\n </div>\n {!disableHint || errorMessage || description ? (\n <Helper\n id={helperUid}\n hint={disableHint ? undefined : `Format: ${mode}`}\n showCounter={false}\n errorMessage={errorMessage}\n errorAriaLive={errorAriaLive}\n description={description}\n />\n ) : null}\n </fieldset>\n );\n};\n"],"names":["ArrowForward"],"mappings":";;;;;;;;;;;;;;;;;;AACA,MAAM,eAAe,GAAG,CAAC,KAAK,qBAAqB,KAAK,CAAC,aAAa,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,4BAA4B,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,GAAG,KAAK,EAAE,kBAAkB,KAAK,CAAC,aAAa,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,0DAA0D,EAAE,CAAC,CAAC;;AC0E5R,MAAM,sBAAA,GAAyB,CAAC,KAAA,KAAuC;AAC5E,EAAA,MAAM,EAAE,YAAA,EAAc,cAAA,EAAe,GAAI,mBAAmB,KAAK,CAAA;AACjE,EAAA,MAAM;AAAA,IACJ,KAAA;AAAA,IACA,QAAA;AAAA,IACA,IAAA;AAAA,IACA,SAAA,GAAY,KAAA;AAAA,IACZ,QAAA;AAAA,IACA,EAAA,EAAI,MAAA;AAAA,IACJ,WAAA;AAAA,IACA,eAAe,iBAAA,GAAoB,WAAA;AAAA,IACnC,OAAA,EAAS,WAAA;AAAA,IACT,MAAA,EAAQ,UAAA;AAAA,IACR,KAAA;AAAA,IACA,QAAA;AAAA,IACA,WAAA;AAAA,IACA,WAAA;AAAA,IACA,IAAA,GAAO,OAAA;AAAA,IACP,UAAA,GAAa,YAAA;AAAA,IACb,QAAA,GAAW,UAAA;AAAA,IACX;AAAA,GACF,GAAI,cAAA;AAEJ,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GACpB,4BAAA,CAA0D;AAAA,IACxD,iBAAiB,KAAA,CAAM,KAAA;AAAA,IACvB,cAAc,KAAA,CAAM,YAAA;AAAA,IACpB,UAAU,KAAA,CAAM;AAAA,GACjB,CAAA;AAEH,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAI,SAAS,KAAK,CAAA;AAC9C,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GACpC,SAAuC,KAAK,CAAA;AAE9C,EAAA,MAAM,WAAA,GAAc,CAAC,CAAA,KAAwB;AAC3C,IAAA,WAAA,CAAY,IAAI,CAAA;AAChB,IAAA,gBAAA,CAAiB,iBAAiB,CAAA;AAClC,IAAA,WAAA,GAAc,CAAC,CAAA;AAAA,EACjB,CAAA;AACA,EAAA,MAAM,UAAA,GAAa,CAAC,CAAA,KAAwB;AAC1C,IAAA,WAAA,CAAY,KAAK,CAAA;AACjB,IAAA,gBAAA,CAAiB,KAAK,CAAA;AACtB,IAAA,UAAA,GAAa,CAAC,CAAA;AAAA,EAChB,CAAA;AAEA,EAAA,MAAM,WAAW,KAAA,EAAM;AACvB,EAAA,MAAM,KAAK,MAAA,IAAU,QAAA;AACrB,EAAA,MAAM,YAAY,KAAA,EAAM;AAExB,EAAA,MAAM,YAAA,GAAe,OAAO,KAAA,KAAU,SAAA,GAAY,KAAA,GAAQ,MAAA;AAE1D,EAAA,MAAM,qBAAA,GAAwB,CAAC,SAAA,KAAmC;AAChE,IAAA,QAAA,CAAS;AAAA,MACP,GAAG,KAAA;AAAA,MACH;AAAA,KACD,CAAA;AAAA,EACH,CAAA;AAEA,EAAA,MAAM,mBAAA,GAAsB,CAAC,OAAA,KAAiC;AAC5D,IAAA,QAAA,CAAS;AAAA,MACP,GAAG,KAAA;AAAA,MACH;AAAA,KACD,CAAA;AAAA,EACH,CAAA;AAEA,EAAA,uBACE,IAAA;AAAA,IAAC,UAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,EAAA;AAAA,QACT,gBAAgB,WAAW,CAAA;AAAA,QAC3B,6BAA6B,YAAY;AAAA,OAC3C;AAAA,MACA,UAAA,EAAS,2BAAA;AAAA,MACT,KAAA,EAAO,YAAA;AAAA,MAEP,QAAA,EAAA;AAAA,wBAAA,GAAA;AAAA,UAAC,UAAA;AAAA,UAAA;AAAA,YACC,EAAA,EAAG,QAAA;AAAA,YACH,QAAA;AAAA,YACA,YAAA,EAAc,QAAA;AAAA,YACd,QAAA;AAAA,YACC,GAAG,WAAA;AAAA,YACJ,SAAA,EAAW,EAAA;AAAA,cACT,WAAA,EAAa,SAAA;AAAA,cACb,SAAA,GAAY,4BAAA,CAA6B,SAAS,CAAA,GAAI;AAAA,aACxD;AAAA,YAEC,QAAA,EAAA;AAAA;AAAA,SACH;AAAA,wBACA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,4BAAA,CAA6B,WAAW,CAAA,EACtD,QAAA,EAAA;AAAA,0BAAA,GAAA;AAAA,YAAC,UAAA;AAAA,YAAA;AAAA,cACC,SAAS,EAAA,GAAK,QAAA;AAAA,cACd,SAAA,EAAW,6BAA6B,SAAS,CAAA;AAAA,cAEhD,QAAA,EAAA;AAAA;AAAA,WACH;AAAA,0BACA,GAAA;AAAA,YAAC,2BAAA;AAAA,YAAA;AAAA,cACC,IAAI,EAAA,GAAK,QAAA;AAAA,cACT,IAAA;AAAA,cACA,KAAA,EAAO,CAAC,CAAC,KAAA;AAAA,cACT,QAAA;AAAA,cACA,QAAA;AAAA,cACA,IAAA;AAAA,cACA,OAAO,KAAA,EAAO,SAAA;AAAA,cACd,QAAA,EAAU,CAAC,MAAA,KAAW,qBAAA,CAAsB,OAAO,KAAK,CAAA;AAAA,cACxD,kBAAA,EAAkB,SAAA;AAAA,cAClB,aAAA;AAAA,cACA,OAAA,EAAS,WAAA;AAAA,cACT,MAAA,EAAQ;AAAA;AAAA,WACV;AAAA,0BACA,GAAA;AAAA,YAAC,IAAA;AAAA,YAAA;AAAA,cACC,GAAA,EAAKA,eAAA;AAAA,cACL,SAAA,EAAW,6BAA6B,aAAa;AAAA;AAAA,WACvD;AAAA,0BACA,GAAA;AAAA,YAAC,UAAA;AAAA,YAAA;AAAA,cACC,SAAS,EAAA,GAAK,MAAA;AAAA,cACd,SAAA,EAAW,6BAA6B,SAAS,CAAA;AAAA,cAEhD,QAAA,EAAA;AAAA;AAAA,WACH;AAAA,0BACA,GAAA;AAAA,YAAC,2BAAA;AAAA,YAAA;AAAA,cACC,IAAI,EAAA,GAAK,MAAA;AAAA,cACT,IAAA;AAAA,cACA,KAAA,EAAO,CAAC,CAAC,KAAA;AAAA,cACT,QAAA;AAAA,cACA,QAAA;AAAA,cACA,IAAA;AAAA,cACA,OAAO,KAAA,EAAO,OAAA;AAAA,cACd,QAAA,EAAU,CAAC,MAAA,KAAW,mBAAA,CAAoB,OAAO,KAAK,CAAA;AAAA,cACtD,iBAAA,EAAiB,QAAA;AAAA,cACjB,kBAAA,EAAkB,SAAA;AAAA,cAClB,aAAA;AAAA,cACA,OAAA,EAAS,WAAA;AAAA,cACT,MAAA,EAAQ;AAAA;AAAA;AACV,SAAA,EACF,CAAA;AAAA,QACC,CAAC,WAAA,IAAe,YAAA,IAAgB,WAAA,mBAC/B,GAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,EAAA,EAAI,SAAA;AAAA,YACJ,IAAA,EAAM,WAAA,GAAc,MAAA,GAAY,CAAA,QAAA,EAAW,IAAI,CAAA,CAAA;AAAA,YAC/C,WAAA,EAAa,KAAA;AAAA,YACb,YAAA;AAAA,YACA,aAAA;AAAA,YACA;AAAA;AAAA,SACF,GACE;AAAA;AAAA;AAAA,GACN;AAEJ;;;;"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"DaysOfTheWeek-vE310Rjp.js","sources":["../src/components/DaysOfTheWeek/DaysOfTheWeek.tsx"],"sourcesContent":["import {\n AriaAttributes,\n ReactElement,\n Ref,\n forwardRef,\n useId,\n useMemo,\n} from \"react\";\nimport { DataTrackingId } from \"../../types\";\nimport styles from \"./DaysOfTheWeek.module.scss\";\nimport { FieldLabel, FieldLabelProps } from \"../FieldLabel\";\n\nimport ButtonToggle from \"../ButtonToggle\";\nimport Tooltip from \"../Tooltip\";\nimport { Helper } from \"../../internal/components\";\nimport Flex from \"../Flex\";\n\n/**\n * Props for the DaysOfTheWeek component\n */\nexport type DaysOfTheWeekProps = {\n /**\n * The selected days (1-7, where 1 is Monday and 7 is Sunday)\n */\n selectedDays?: number[];\n /**\n * Callback fired when the selection changes\n */\n onChange?: (selectedDays: number[]) => void;\n /**\n * Whether the component is disabled\n * Can be a boolean to disable all days, or an array of day numbers (1-7) to disable specific days\n */\n disabled?: boolean | number[];\n /**\n * The first day of the week (1-7, where 1 is Monday and 7 is Sunday)\n * @default 1\n */\n firstDay?: number;\n /**\n * Hint text or element to display above the component\n */\n hint?: ReactElement | string;\n /**\n * ID for the component\n */\n id?: string;\n /**\n * Description text or element to display below the component\n */\n description?: ReactElement | string;\n /**\n * Error message to display when there is an error\n */\n errorMessage?: ReactElement | string;\n /**\n * aria-live for the error message\n * @default assertive\n */\n errorAriaLive?: AriaAttributes[\"aria-live\"];\n /**\n * Label text or element\n */\n label?: FieldLabelProps[\"children\"];\n /**\n * Whether the field is required\n */\n required?: boolean;\n /**\n * Additional info to display in a tooltip next to the label\n */\n moreInfo?: FieldLabelProps[\"moreInfo\"];\n /**\n * Additional props to pass to the Label component\n */\n labelProps?: FieldLabelProps;\n} & DataTrackingId;\n\ninterface DayInfo {\n short: string;\n full: string;\n}\n\n// Days in order from Monday to Sunday\nconst DAYS: DayInfo[] = [\n { short: \"Mo\", full: \"Monday\" },\n { short: \"Tu\", full: \"Tuesday\" },\n { short: \"We\", full: \"Wednesday\" },\n { short: \"Th\", full: \"Thursday\" },\n { short: \"Fr\", full: \"Friday\" },\n { short: \"Sa\", full: \"Saturday\" },\n { short: \"Su\", full: \"Sunday\" },\n];\n\n/**\n * DaysOfTheWeek component for selecting multiple days of the week.\n *\n * Features:\n * - Displays days of the week as toggleable buttons\n * - Supports custom first day of the week (Monday-Sunday)\n * - Individual day selection and deselection\n * - Optional label, hint, description, and error messaging\n * - Full accessibility support with ARIA attributes\n * - Tooltips showing full day names on hover\n * - Responsive design with flexible layout\n * - Support for disabling specific days or the entire component\n * - Automatic tracking ID generation for analytics\n *\n * @example\n * <DaysOfTheWeek\n * selectedDays={[2, 4, 6]}\n * onChange={(days) => console.log('Selected days:', days)}\n * label=\"Working Days\"\n * firstDay={1}\n * />\n */\nexport const DaysOfTheWeek = forwardRef(\n (props: DaysOfTheWeekProps, ref: Ref<HTMLDivElement>) => {\n const {\n selectedDays = [],\n onChange,\n disabled,\n firstDay = 7,\n hint,\n id: idProp,\n description,\n errorMessage,\n errorAriaLive,\n label,\n required,\n moreInfo,\n labelProps,\n } = props;\n\n const autoId = useId();\n const id = idProp ?? autoId;\n const labelUid = useId();\n const helperUid = useId();\n\n const hasHelperText = hint || errorMessage || description;\n\n const orderedDays = useMemo(() => {\n const firstDayIndex = firstDay - 1;\n return [...DAYS.slice(firstDayIndex), ...DAYS.slice(0, firstDayIndex)];\n }, [firstDay]);\n\n const handleDayToggle = (index: number) => {\n // Convert from 0-based array index to 1-based day number, accounting for firstDay\n const dayNumber = ((index + firstDay - 1) % 7) + 1;\n const newSelectedDays = selectedDays.includes(dayNumber)\n ? selectedDays.filter((d) => d !== dayNumber)\n : [...selectedDays, dayNumber];\n\n onChange?.(newSelectedDays);\n };\n\n const isDayDisabled = (dayNumber: number) => {\n if (typeof disabled === \"boolean\") {\n return disabled;\n }\n if (Array.isArray(disabled)) {\n return disabled.includes(dayNumber);\n }\n return false;\n };\n\n return (\n <div className={styles[\"days-of-the-week-container\"]}>\n {label ? (\n <FieldLabel\n moreInfo={moreInfo}\n required={required}\n id={labelUid}\n htmlFor={id}\n {...labelProps}\n >\n {label}\n </FieldLabel>\n ) : null}\n <Flex ref={ref} gap={2} className={styles[\"days-of-the-week\"]} id={id}>\n {orderedDays.map((day, index) => {\n // Convert from 0-based array index to 1-based day number, accounting for firstDay\n const dayNumber = ((index + firstDay - 1) % 7) + 1;\n return (\n <Tooltip key={day.short} placement=\"top\">\n <Tooltip.Trigger className={styles[\"button-toggle-wrapper\"]}>\n <ButtonToggle\n checked={selectedDays.includes(dayNumber)}\n onClick={() => handleDayToggle(index)}\n disabled={isDayDisabled(dayNumber)}\n className={styles[\"button-toggle\"]}\n id={label ? labelUid : undefined}\n aria-describedby={hasHelperText ? helperUid : undefined}\n >\n {day.short}\n </ButtonToggle>\n </Tooltip.Trigger>\n <Tooltip.Content>{day.full}</Tooltip.Content>\n </Tooltip>\n );\n })}\n </Flex>\n {hasHelperText ? (\n <Helper\n id={helperUid}\n hint={hint}\n description={description}\n errorMessage={errorMessage}\n errorAriaLive={errorAriaLive}\n />\n ) : null}\n </div>\n );\n },\n);\nDaysOfTheWeek.displayName = \"DaysOfTheWeek\";\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"FieldDialog-Be54L3E-.js","sources":["../src/internal/hooks/useSelectFieldLoading/useSelectFieldLoading.ts","../src/beta/components/SelectField/internal/SelectFieldListItem.tsx","../src/beta/components/SelectField/internal/InView.tsx","../src/beta/components/SelectField/internal/FieldListBase.tsx","../src/beta/components/SelectField/internal/SelectFieldLabel.tsx","../src/internal/hooks/useDebouncedCallback/useDebouncedCallback.ts","../src/beta/components/SelectField/internal/usePinnedOptions.ts","../src/beta/components/SelectField/internal/useGroupedOptions.ts","../src/beta/components/SelectField/internal/FieldPopover/FieldPopover.tsx","../src/beta/hooks/useAdaptiveView/useAdaptiveView.tsx","../src/beta/components/SelectField/internal/FieldDialog/FieldDialog.tsx"],"sourcesContent":["import { useCallback, useEffect, useRef, useState } from \"react\";\nimport {\n SelectFieldOption,\n SelectFieldPageLazyResult,\n SelectFieldOffsetLazyResult,\n SelectFieldGroupLazyResult,\n SelectFieldPropsLazyPage,\n SelectFieldPropsLazyOffset,\n SelectFieldPropsLazyGroup,\n SelectFieldPropsEager,\n} from \"../../../beta/components/SelectField/types\";\n\nexport const DEFAULT_PAGE_SIZE = 20;\nconst DEFAULT_CACHE_MAX_SIZE = 15;\n\n/**\n * Configuration for caching search results in useSelectFieldLoading.\n * When enabled, the full accumulated state (options, pagination cursor, hasMore)\n * is cached per search value, allowing instant restoration when returning to\n * a previous search.\n */\nexport type CacheConfig = {\n /**\n * Whether caching is enabled. Defaults to true.\n */\n enabled?: boolean;\n /**\n * Maximum number of search values to cache before clearing.\n * Defaults to 15.\n */\n maxSize?: number;\n};\n\n/**\n * The full state cached per search value, including accumulated options,\n * pagination cursor, and hasMore flag.\n */\ntype CachedSearchState = {\n options: SelectFieldOption[];\n hasMore: boolean;\n previousPage: number;\n previousOffset: number;\n previousGroup: string | number | null;\n};\n\ntype UseSelectFieldLoadingConfigLazyPage = Pick<\n SelectFieldPropsLazyPage,\n \"lazy\" | \"loadOptions\"\n> & {\n pageSize: number;\n cache?: CacheConfig;\n};\n\ntype UseSelectFieldLoadingConfigLazyOffset = Pick<\n SelectFieldPropsLazyOffset,\n \"lazy\" | \"loadOptions\"\n> & {\n limit: number;\n cache?: CacheConfig;\n};\n\ntype UseSelectFieldLoadingConfigLazyGroup = Pick<\n SelectFieldPropsLazyGroup,\n \"lazy\" | \"loadOptions\"\n> & {\n cache?: CacheConfig;\n};\n\ntype UseSelectFieldLoadingConfigEager = Pick<\n SelectFieldPropsEager,\n \"lazy\" | \"loadOptions\"\n> & {\n cache?: CacheConfig;\n};\n\nexport type UseSelectFieldLoadingConfig =\n | UseSelectFieldLoadingConfigLazyPage\n | UseSelectFieldLoadingConfigLazyOffset\n | UseSelectFieldLoadingConfigLazyGroup\n | UseSelectFieldLoadingConfigEager;\n\nexport type UseSelectFieldLoadingReturn = {\n /**\n * Current loaded options array\n */\n options: SelectFieldOption[];\n /**\n * Boolean indicating initial load in progress\n */\n loading: boolean;\n /**\n * Boolean indicating load more in progress\n */\n loadingMore: boolean;\n /**\n * Boolean indicating if more options are available\n */\n hasMore: boolean;\n /**\n * Function to load options. When initial is true, replaces options and sets loading state.\n * When initial is false or undefined, appends options and sets loadingMore state.\n * @param searchValue - The search value to load options for\n * @param options - Optional configuration\n * @param options.initial - Whether this is an initial load (replaces options) or continuation (appends options)\n */\n loadOptions: (\n searchValue: string,\n options?: { initial?: boolean },\n ) => Promise<void>;\n /**\n * Function to load more options (for pagination). Appends to existing options.\n * @param searchValue - The search value to load more options for\n */\n loadMore: (searchValue: string) => Promise<void>;\n /**\n * Function to reset all state to initial values\n */\n reset: () => void;\n /**\n * Function to clear the search results cache\n */\n clearCache: () => void;\n};\n\n/**\n * Custom hook for managing SelectField option loading state and logic.\n *\n * Features:\n * - Manages option loading state (loading, loadingMore, hasMore)\n * - Supports eager loading and three lazy loading modes (page, offset, group)\n * - Handles pagination state tracking for lazy loading\n * - Provides methods to load options (initial or continuation) and load more\n * - Automatically manages option replacement vs appending based on load type\n * - Tracks pagination state (page, offset, group) for lazy loading modes\n * - Provides reset functionality to clear all state\n *\n * @param config - Configuration object containing lazy mode, loadOptions function, and pagination settings\n * @returns Object containing options, loading states, and load functions\n *\n * @example\n * const { options, loading, loadingMore, hasMore, loadOptions, loadMore } = useSelectFieldLoading({\n * lazy: \"page\",\n * loadOptions: async (searchValue, page, pageSize) => {\n * const result = await fetchOptions(searchValue, page, pageSize);\n * return { options: result.items, hasMore: result.hasMore };\n * },\n * pageSize: 10\n * });\n */\nexport function useSelectFieldLoading(\n config: UseSelectFieldLoadingConfig,\n): UseSelectFieldLoadingReturn {\n const { lazy, loadOptions: loadOptionsProp, cache: cacheConfig } = config;\n\n // Cache configuration\n const cacheEnabled = cacheConfig?.enabled !== false;\n const cacheMaxSize = cacheConfig?.maxSize ?? DEFAULT_CACHE_MAX_SIZE;\n\n const [options, setOptions] = useState<SelectFieldOption[]>([]);\n const [hasMoreToLoad, setHasMoreToLoad] = useState(false);\n const [previousGroup, setPreviousGroup] = useState<string | number | null>(\n null,\n );\n const [previousPage, setPreviousPage] = useState<number>(0);\n const [previousOffset, setPreviousOffset] = useState<number>(0);\n const [loading, setLoading] = useState(false);\n const [loadingMore, setLoadingMore] = useState(false);\n\n // Cache state: stores full accumulated state per search value\n const [stateCache, setStateCache] = useState<Map<string, CachedSearchState>>(\n () => new Map(),\n );\n // Track the current search value to know which cache entry to update on loadMore\n const currentSearchValueRef = useRef<string>(\"\");\n // Track whether loadOptions has completed at least once, to distinguish\n // the initial empty state from an API response that returned zero results.\n const hasCompletedLoadRef = useRef(false);\n\n const appendOptions = useCallback((newOptions: SelectFieldOption[]) => {\n setOptions((prevOptions) => prevOptions.concat(newOptions));\n }, []);\n\n const pageSize =\n lazy === \"page\"\n ? (config as UseSelectFieldLoadingConfigLazyPage).pageSize\n : DEFAULT_PAGE_SIZE;\n const limit =\n lazy === \"offset\"\n ? (config as UseSelectFieldLoadingConfigLazyOffset).limit\n : DEFAULT_PAGE_SIZE;\n\n // Helper to restore state from cache\n const restoreFromCache = useCallback((cached: CachedSearchState) => {\n setOptions(cached.options);\n setHasMoreToLoad(cached.hasMore);\n setPreviousPage(cached.previousPage);\n setPreviousOffset(cached.previousOffset);\n setPreviousGroup(cached.previousGroup);\n }, []);\n\n // Sync current state to cache whenever options or pagination state changes.\n // This effect runs after React has batched all state updates from loadOptions/loadMore,\n // ensuring we cache the complete, up-to-date state.\n useEffect(() => {\n if (!cacheEnabled) return;\n const searchValue = currentSearchValueRef.current;\n // Don't cache the initial empty state before any load has completed\n if (!hasCompletedLoadRef.current) return;\n\n setStateCache((prev) => {\n // Clear cache if we've reached max size\n if (prev.size >= cacheMaxSize) {\n prev.clear();\n }\n\n prev.set(searchValue, {\n options,\n hasMore: hasMoreToLoad,\n previousPage,\n previousOffset,\n previousGroup,\n });\n return new Map(prev);\n });\n }, [\n cacheEnabled,\n cacheMaxSize,\n options,\n hasMoreToLoad,\n previousPage,\n previousOffset,\n previousGroup,\n ]);\n\n const loadOptions = useCallback(\n async (\n searchValue: string,\n options?: { initial?: boolean },\n ): Promise<void> => {\n const isInitial = !!options?.initial;\n\n // On initial load, check cache first\n if (isInitial && cacheEnabled) {\n const cached = stateCache.get(searchValue);\n if (cached) {\n // Restore full state from cache - no API call needed\n currentSearchValueRef.current = searchValue;\n restoreFromCache(cached);\n return;\n }\n }\n\n // Track current search value for cache updates on loadMore\n if (isInitial) {\n currentSearchValueRef.current = searchValue;\n }\n\n (isInitial ? setLoading : setLoadingMore)(true);\n\n try {\n if (!lazy) {\n const result = await loadOptionsProp(searchValue);\n const resolved = Array.isArray(result) ? result : await result;\n (isInitial ? setOptions : appendOptions)(resolved);\n } else {\n let result:\n | SelectFieldPageLazyResult\n | SelectFieldOffsetLazyResult\n | SelectFieldGroupLazyResult;\n\n if (lazy === \"page\") {\n const page = isInitial ? 0 : previousPage;\n result = await loadOptionsProp(searchValue, page, pageSize);\n setPreviousPage(isInitial ? 1 : page + 1);\n } else if (lazy === \"offset\") {\n const offset = isInitial ? 0 : previousOffset;\n result = await loadOptionsProp(searchValue, offset, limit);\n setPreviousOffset(isInitial ? limit : offset + limit);\n } else if (lazy === \"group\") {\n const group = isInitial ? null : previousGroup;\n result = await loadOptionsProp(searchValue, group);\n setPreviousGroup(\n result.options[result.options.length - 1]?.group ?? null,\n );\n } else {\n throw new Error(\n `Invalid lazy mode: ${lazy}. Expected 'page', 'offset', or 'group'.`,\n );\n }\n\n setHasMoreToLoad(result.hasMore ?? false);\n (isInitial ? setOptions : appendOptions)(result.options);\n }\n hasCompletedLoadRef.current = true;\n } finally {\n (isInitial ? setLoading : setLoadingMore)(false);\n }\n },\n [\n lazy,\n pageSize,\n limit,\n loadOptionsProp,\n appendOptions,\n previousPage,\n previousOffset,\n previousGroup,\n cacheEnabled,\n stateCache,\n restoreFromCache,\n ],\n );\n\n const loadMore = useCallback(\n async (searchValue: string): Promise<void> => {\n await loadOptions(searchValue, { initial: false });\n },\n [loadOptions],\n );\n\n const reset = useCallback(() => {\n setOptions([]);\n setHasMoreToLoad(false);\n setPreviousGroup(null);\n setPreviousPage(0);\n setPreviousOffset(0);\n setLoading(false);\n setLoadingMore(false);\n }, []);\n\n const clearCache = useCallback(() => {\n setStateCache(new Map());\n }, []);\n\n return {\n options,\n loading,\n loadingMore,\n hasMore: hasMoreToLoad,\n loadOptions,\n loadMore,\n reset,\n clearCache,\n };\n}\n","import { UseComboboxPropGetters } from \"downshift\";\nimport { Flex } from \"../../../../components/Flex\";\nimport { SelectFieldDownshiftItem } from \"../types\";\nimport Icon from \"../../../../components/Icon\";\nimport styles from \"./SelectFieldListItem.module.scss\";\nimport CheckboxOutline from \"@servicetitan/hammer-icon/mdi/round/check_box_outline_blank.svg\";\nimport CheckboxChecked from \"@servicetitan/hammer-icon/mdi/round/check_box.svg\";\nimport CheckboxIndeterminate from \"@servicetitan/hammer-icon/mdi/round/indeterminate_check_box.svg\";\nimport Check from \"@servicetitan/hammer-icon/mdi/round/check.svg\";\nimport cx from \"classnames\";\nimport { useMemo } from \"react\";\nimport Text from \"../../../../components/Text\";\nimport { CheckState } from \"../../../../types\";\nimport Spinner from \"../../../../components/Spinner\";\n\ntype GetItemProps =\n UseComboboxPropGetters<SelectFieldDownshiftItem>[\"getItemProps\"];\n\nexport type SelectFieldListItemProps = {\n item: SelectFieldDownshiftItem;\n index: number;\n highlighted: boolean;\n disabled: boolean;\n getItemProps: GetItemProps;\n selectionType: \"single\" | \"multiple\";\n checked: CheckState;\n};\n\nexport const SelectFieldListItem = ({\n item,\n index,\n highlighted,\n disabled,\n getItemProps,\n selectionType,\n checked,\n}: SelectFieldListItemProps) => {\n const checkbox = useMemo(() => {\n if (checked === \"checked\")\n return { icon: CheckboxChecked, class: styles[\"checked\"] };\n if (checked === \"unchecked\")\n return { icon: CheckboxOutline, class: styles[\"unchecked\"] };\n if (checked === \"indeterminate\")\n return { icon: CheckboxIndeterminate, class: styles[\"indeterminate\"] };\n return { icon: CheckboxOutline, class: styles[\"unchecked\"] };\n }, [checked]);\n\n return (\n <li\n key={item.id}\n {...getItemProps({\n item,\n index,\n className: cx(styles[\"select-field-list-item\"], {\n [styles.highlighted]: highlighted,\n [styles.selected]: checked === \"checked\",\n [styles.disabled]: disabled,\n [styles.single]: selectionType === \"single\",\n [styles.multiple]: selectionType === \"multiple\",\n }),\n })}\n >\n {selectionType === \"multiple\" && (\n <div>\n {checked === \"loading\" ? (\n <Spinner size=\"medium\" />\n ) : (\n <Icon\n size=\"large\"\n svg={checkbox.icon}\n className={cx(styles[\"checkbox\"], checkbox.class)}\n />\n )}\n </div>\n )}\n <Flex grow={1} shrink={1} direction=\"column\" gap=\"1\">\n <Text size=\"medium\">\n {item.original.content?.title ?? item.original.label}\n </Text>\n {item.original.content?.description && (\n <Text size=\"small\">{item.original.content?.description}</Text>\n )}\n </Flex>\n {selectionType === \"single\" && checked === \"checked\" && (\n <Icon\n size=\"medium\"\n svg={Check}\n className={cx(styles[\"checkbox\"], styles[\"checked\"])}\n />\n )}\n </li>\n );\n};\n","import { ReactNode } from \"react\";\nimport { useIntersectionObserver } from \"../../../../internal/hooks\";\n\n/**\n * Props for the InView component\n * @property {ReactNode} children - The content to render inside the visibility-tracked container\n * @property {(isVisible: boolean) => void} [onVisibilityChange] - Callback fired when visibility changes\n */\ntype InViewProps = {\n /**\n * The content to render inside the visibility-tracked container\n */\n children?: ReactNode;\n /**\n * Callback fired when the element's visibility in the viewport changes\n */\n onVisibilityChange?: (isVisible: boolean) => void;\n /**\n * The root margin for the intersection observer\n */\n rootMargin?: string;\n};\n\n/**\n * Internal component that detects when its content is visible in the viewport.\n *\n * Features:\n * - Uses Intersection Observer API for efficient visibility detection\n * - Fires callback when visibility state changes\n * - Handles browser compatibility gracefully\n * - Automatically cleans up observer on unmount\n *\n * @param props - Component props\n * @returns Wrapped children with visibility detection\n */\nexport const InView = ({\n children,\n onVisibilityChange,\n rootMargin,\n}: InViewProps) => {\n const { ref } = useIntersectionObserver({\n onChange: (isIntersecting) => {\n onVisibilityChange?.(isIntersecting);\n },\n rootMargin,\n });\n\n return <div ref={ref}>{children}</div>;\n};\n","import { UseComboboxPropGetters } from \"downshift\";\nimport { SelectFieldDownshiftItem } from \"../types\";\nimport Spinner from \"../../../../components/Spinner\";\nimport Button from \"../../../../components/Button\";\nimport styles from \"./SelectFieldList.module.scss\";\nimport cx from \"classnames\";\nimport { CSSProperties, ReactNode, useId, useMemo } from \"react\";\nimport { SelectFieldListItem } from \"./SelectFieldListItem\";\nimport { InView } from \"./InView\";\nimport { Text } from \"../../../../components/Text\";\nimport { SrOnly } from \"../../../../components\";\nimport Divider from \"../../../../components/Divider\";\nimport { CheckState } from \"../../../../types\";\nimport { SectionMeta } from \"./types\";\n\ntype PinnedSection = {\n type: \"pinned\";\n label: string;\n items: { item: SelectFieldDownshiftItem; index: number }[];\n loading?: boolean;\n};\n\ntype GroupSection = {\n type: \"group\";\n label: string;\n items: { item: SelectFieldDownshiftItem; index: number }[];\n};\n\ntype FlatSection = {\n type: \"flat\";\n items: { item: SelectFieldDownshiftItem; index: number }[];\n};\n\ntype Section = PinnedSection | GroupSection | FlatSection;\n\nexport type FieldListBaseProps = {\n isOpen: boolean;\n items: SelectFieldDownshiftItem[];\n getMenuProps: UseComboboxPropGetters<SelectFieldDownshiftItem>[\"getMenuProps\"];\n getItemProps: UseComboboxPropGetters<SelectFieldDownshiftItem>[\"getItemProps\"];\n highlightedIndex: number;\n getCheckedState: (item: SelectFieldDownshiftItem) => CheckState;\n selectionType: \"single\" | \"multiple\";\n hasMore: boolean;\n onLoadMore: () => void;\n loading: boolean;\n loadingMore: boolean;\n disableAutoLoadMore?: boolean;\n disabled?: boolean;\n className?: string;\n style?: CSSProperties;\n sectionsMeta?: SectionMeta[];\n};\n\nexport const FieldListBase = ({\n isOpen,\n items,\n getMenuProps,\n getItemProps,\n highlightedIndex,\n getCheckedState,\n selectionType,\n hasMore,\n onLoadMore,\n loading,\n loadingMore,\n disableAutoLoadMore,\n disabled,\n className,\n style,\n sectionsMeta = [],\n}: FieldListBaseProps) => {\n const baseId = useId();\n\n // Check if any pinned section is still loading its options.\n // If so, show the main list loading indicator to avoid layout shift.\n const anyPinnedLoading = sectionsMeta.some(\n (s) => s.type === \"pinned\" && s.loading,\n );\n\n const handleLoaderVisibilityChange = (visible: boolean) => {\n if (visible && !disableAutoLoadMore) {\n onLoadMore();\n }\n };\n\n // Group items into sections for proper semantic structure\n const sections = useMemo((): Section[] => {\n if (sectionsMeta.length === 0) {\n // No sections - all items are flat\n return [\n {\n type: \"flat\",\n items: items.map((item, index) => ({ item, index })),\n },\n ];\n }\n\n const result: Section[] = [];\n\n // Find the minimum start index of all sections (items before this are flat, e.g. select-all)\n const firstSectionStartIndex = Math.min(\n ...sectionsMeta.map((s) => s.startIndex),\n );\n\n // Add flat items before first section (e.g., select-all)\n if (firstSectionStartIndex > 0) {\n const flatItems: {\n item: SelectFieldDownshiftItem;\n index: number;\n }[] = [];\n for (let i = 0; i < firstSectionStartIndex; i++) {\n if (items[i]) {\n flatItems.push({ item: items[i], index: i });\n }\n }\n if (flatItems.length > 0) {\n result.push({ type: \"flat\", items: flatItems });\n }\n }\n\n // Add sections (pinned or group)\n sectionsMeta.forEach((meta) => {\n const sectionItems: {\n item: SelectFieldDownshiftItem;\n index: number;\n }[] = [];\n for (let i = meta.startIndex; i < meta.endIndex; i++) {\n if (items[i]) {\n sectionItems.push({ item: items[i], index: i });\n }\n }\n if (meta.type === \"pinned\") {\n // Always show pinned sections while loading (even with 0 items)\n if (sectionItems.length > 0 || meta.loading) {\n result.push({\n type: \"pinned\",\n label: meta.label,\n items: sectionItems,\n loading: meta.loading,\n });\n }\n } else if (sectionItems.length > 0) {\n result.push({\n type: \"group\",\n label: meta.label,\n items: sectionItems,\n });\n }\n });\n\n // Find where sectioned items end\n const lastSectionIndex =\n sectionsMeta.length > 0\n ? Math.max(...sectionsMeta.map((s) => s.endIndex))\n : 0;\n\n // Add flat items (non-sectioned) after all sections\n if (lastSectionIndex < items.length) {\n const flatItems: {\n item: SelectFieldDownshiftItem;\n index: number;\n }[] = [];\n for (let i = lastSectionIndex; i < items.length; i++) {\n flatItems.push({ item: items[i], index: i });\n }\n if (flatItems.length > 0) {\n result.push({ type: \"flat\", items: flatItems });\n }\n }\n\n return result;\n }, [items, sectionsMeta]);\n\n const renderItem = (\n item: SelectFieldDownshiftItem,\n index: number,\n ): ReactNode => (\n <SelectFieldListItem\n key={item.id}\n item={item}\n index={index}\n getItemProps={getItemProps}\n selectionType={selectionType}\n checked={getCheckedState(item)}\n highlighted={highlightedIndex === index}\n disabled={(disabled || item.disabled) ?? false}\n />\n );\n\n const renderSections = (): ReactNode[] => {\n const result: ReactNode[] = [];\n\n sections.forEach((section, sectionIndex) => {\n const isLastSection = sectionIndex === sections.length - 1;\n\n if (section.type === \"pinned\" || section.type === \"group\") {\n const labelId = `${baseId}-section-${sectionIndex}`;\n\n result.push(\n <li\n key={`section-${sectionIndex}`}\n role=\"group\"\n aria-labelledby={labelId}\n className={styles[\"pinned-section\"]}\n >\n <span id={labelId} className={styles[\"pinned-section-header\"]}>\n <Text variant=\"eyebrow\">{section.label}</Text>\n </span>\n <ul className={styles[\"pinned-section-list\"]}>\n {section.items.map(({ item, index }) => renderItem(item, index))}\n </ul>\n </li>,\n );\n if (!isLastSection) {\n result.push(\n <li\n key={`divider-${sectionIndex}`}\n role=\"separator\"\n className={styles[\"divider\"]}\n >\n <Divider />\n </li>,\n );\n }\n } else {\n // Flat items - render directly\n section.items.forEach(({ item, index }) => {\n result.push(renderItem(item, index));\n });\n }\n });\n\n return result;\n };\n\n return (\n <div\n {...getMenuProps({\n className: cx(styles[\"scroller\"], className),\n style,\n })}\n >\n <ul className={cx(styles[\"select-field-list\"])}>\n {isOpen && (\n <>\n {loading || anyPinnedLoading ? (\n <li role=\"presentation\" className={styles[\"empty\"]}>\n <Spinner size=\"medium\" />\n </li>\n ) : items.length > 0 ? (\n renderSections()\n ) : (\n <li role=\"presentation\" className={styles[\"empty\"]}>\n <Text subdued size=\"small\">\n No match found\n </Text>\n </li>\n )}\n </>\n )}\n </ul>\n {loadingMore ? (\n <div className={styles[\"load-more\"]}>\n <Spinner size=\"small\" />\n <SrOnly>Loading more...</SrOnly>\n </div>\n ) : hasMore && !loading ? (\n <InView\n onVisibilityChange={handleLoaderVisibilityChange}\n rootMargin=\"0px 0px -100px 0px\"\n >\n <div className={styles[\"load-more\"]}>\n <Button appearance=\"secondary\" size=\"small\" onClick={onLoadMore}>\n Load more\n </Button>\n </div>\n </InView>\n ) : null}\n </div>\n );\n};\n\nFieldListBase.displayName = \"FieldListBase\";\n","import { ReactNode } from \"react\";\nimport { UseComboboxPropGetters } from \"downshift\";\nimport { SelectFieldDownshiftItem } from \"../types\";\nimport { FieldLabel } from \"../../../../components/FieldLabel\";\nimport { SrOnly } from \"../../../../components/SrOnly\";\n\ntype GetLabelProps =\n UseComboboxPropGetters<SelectFieldDownshiftItem>[\"getLabelProps\"];\n\n/**\n * Props for the SelectFieldLabel component\n * @property {string} label - The text content to display as the label\n * @property {GetLabelProps} getLabelProps - Downshift getter function that returns accessibility props for the label\n * @property {boolean} [required] - Whether the field is required. Shows a red asterisk (*) when true.\n * @property {ReactNode} [moreInfo] - Additional information to display in a tooltip\n * @property {boolean} [moreInfoOpen] - Controls the open state of the more info tooltip\n * @property {boolean} [hideLabel] - Visually hides the label while keeping it accessible to screen readers\n * @property {ReactNode} [labelNode] - Custom ReactNode to render as the label, overriding the default label text\n */\nexport type SelectFieldLabelProps = {\n label: string;\n getLabelProps: GetLabelProps;\n hideLabel?: boolean;\n labelNode?: ReactNode;\n moreInfo?: ReactNode;\n moreInfoOpen?: boolean;\n required?: boolean;\n};\n\n/**\n * Internal label component for the SelectField that renders an accessible label element.\n *\n * Features:\n * - Renders a FieldLabel with proper accessibility attributes from Downshift\n * - Automatically associates the label with the combobox input\n * - Supports screen readers with proper labeling\n * - Optional required field indicator with red asterisk\n * - Help tooltip with info icon for additional context\n * - Can visually hide the label while maintaining accessibility\n * - Supports custom label content via labelNode\n *\n * @example\n * <SelectFieldLabel\n * label=\"Select an option\"\n * getLabelProps={getLabelProps}\n * required\n * moreInfo=\"Choose from available options\"\n * />\n */\nexport const SelectFieldLabel = ({\n label,\n getLabelProps,\n hideLabel = false,\n labelNode,\n moreInfo,\n moreInfoOpen,\n required,\n}: SelectFieldLabelProps) => {\n const labelContent = (\n <FieldLabel\n {...getLabelProps()}\n required={required}\n moreInfo={moreInfo}\n moreInfoOpen={moreInfoOpen}\n >\n {labelNode ?? label}\n </FieldLabel>\n );\n\n if (hideLabel) {\n return <SrOnly>{labelContent}</SrOnly>;\n }\n\n return labelContent;\n};\n","import { useRef, useEffect, useCallback } from \"react\";\n\n/**\n * Custom hook for creating a debounced version of a callback function.\n *\n * Features:\n * - Delays callback execution until after a specified delay period\n * - Cancels previous pending calls when a new one is made\n * - Maintains stable function reference (only changes when delay changes)\n * - Always uses the latest callback via ref (avoids stale closures)\n * - Properly cleans up timeouts on unmount and delay changes\n * - Supports async callbacks\n * - Type-safe with generics\n *\n * @param callback - The function to debounce\n * @param delay - Delay in milliseconds before executing the callback\n * @returns Debounced version of the callback with the same signature\n *\n * @example\n * const debouncedSearch = useDebouncedCallback(\n * (searchTerm: string) => {\n * performSearch(searchTerm);\n * },\n * 300\n * );\n *\n * // Later in event handler:\n * debouncedSearch(inputValue);\n */\n//eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function useDebouncedCallback<T extends (...args: any[]) => any>(\n callback: T,\n delay: number = 300,\n): T {\n const timeoutRef = useRef<NodeJS.Timeout | null>(null);\n const callbackRef = useRef(callback);\n\n // Update callback ref when it changes to always use the latest version\n useEffect(() => {\n callbackRef.current = callback;\n }, [callback]);\n\n // Cleanup timeout on unmount and when delay changes\n useEffect(() => {\n return () => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n timeoutRef.current = null;\n }\n };\n }, [delay]);\n\n const debouncedCallback = useCallback(\n ((...args: Parameters<T>) => {\n // Cancel any pending call\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n\n // Schedule new call\n timeoutRef.current = setTimeout(() => {\n callbackRef.current(...args);\n timeoutRef.current = null;\n }, delay);\n }) as T,\n [delay],\n );\n\n return debouncedCallback;\n}\n","import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport {\n SelectFieldOption,\n SelectFieldPinnedOptions,\n SelectFieldPinnedOptionsSection,\n} from \"../types\";\n\nconst DEFAULT_CACHE_SIZE = 15;\nconst STATIC_CACHE_KEY = \"__static__\";\n\n/**\n * Normalized pinned section structure used internally.\n * @property label - Section label (e.g., \"Recent\", \"Favorites\")\n * @property options - The pinned options for this section\n * @property loading - Whether this section is still loading its options\n */\nexport type NormalizedPinnedSection = {\n label: string;\n options: SelectFieldOption[];\n loading?: boolean;\n};\n\ntype UsePinnedOptionsResult = {\n pinnedSections: NormalizedPinnedSection[];\n};\n\ntype SectionConfig = {\n label: string;\n isDynamic: boolean;\n searchReactive: boolean;\n cacheSize: number;\n staticOptions: SelectFieldOption[] | undefined;\n loader:\n | ((sv: string) => SelectFieldOption[] | Promise<SelectFieldOption[]>)\n | undefined;\n};\n\n/**\n * Insert into a section's cache with max-size eviction.\n * Evicts the oldest entry (first key in Map) when the limit is exceeded.\n */\nfunction cacheSet(\n sectionCache: Map<string, SelectFieldOption[]>,\n key: string,\n value: SelectFieldOption[],\n maxSize: number,\n): void {\n // If this key already exists, delete it first so it moves to the end (most recent)\n if (sectionCache.has(key)) {\n sectionCache.delete(key);\n }\n sectionCache.set(key, value);\n // Evict oldest entries if over max size\n while (sectionCache.size > maxSize) {\n const oldest = sectionCache.keys().next().value;\n if (oldest !== undefined) {\n sectionCache.delete(oldest);\n }\n }\n}\n\n/**\n * Hook that normalizes and loads pinned options from various input formats.\n *\n * Handles:\n * - Labeled pinned options object\n * - Array of labeled pinned options objects\n *\n * Dynamic sections appear immediately with `loading: true` and empty options,\n * then transition to their resolved options once loaded. Results are cached\n * per section per search value so revisiting a previous search term is instant.\n *\n * Per-section configuration:\n * - `searchReactive` (default true): when false, loader is called once and the\n * result is reused for all search values.\n * - `cacheSize` (default 15): max number of search results cached per section.\n *\n * @param pinned - The pinned options configuration from props\n * @param searchValue - Current search input value\n * @returns Normalized pinned sections with per-section loading state\n */\nexport function usePinnedOptions(\n pinned: SelectFieldPinnedOptions | undefined,\n searchValue: string,\n): UsePinnedOptionsResult {\n const [dynamicResults, setDynamicResults] = useState<\n Record<number, SelectFieldOption[]>\n >({});\n const [loadingSet, setLoadingSet] = useState<Set<number>>(new Set());\n\n // Track the latest search value to avoid race conditions\n const latestSearchValueRef = useRef(searchValue);\n latestSearchValueRef.current = searchValue;\n\n // Per-section cache: sectionIndex -> Map<searchValue, options>\n const cacheRef = useRef<Map<number, Map<string, SelectFieldOption[]>>>(\n new Map(),\n );\n\n // Track non-reactive sections that have already been triggered to prevent\n // duplicate loader calls when search value changes during initial load\n const nonReactiveTriggeredRef = useRef<Set<number>>(new Set());\n\n // Normalize into an array of labeled sections\n const sections = useMemo((): SelectFieldPinnedOptionsSection[] => {\n if (!pinned) return [];\n return Array.isArray(pinned) ? pinned : [pinned];\n }, [pinned]);\n\n // Classify each section as static or dynamic, with per-section config\n const sectionConfig = useMemo((): SectionConfig[] => {\n return sections.map((section) => {\n const isDynamic = typeof section.options === \"function\";\n return {\n label: section.label,\n isDynamic,\n searchReactive: section.searchReactive ?? true,\n cacheSize: section.cacheSize ?? DEFAULT_CACHE_SIZE,\n staticOptions: isDynamic\n ? undefined\n : (section.options as SelectFieldOption[]),\n loader: isDynamic\n ? (section.options as (\n sv: string,\n ) => SelectFieldOption[] | Promise<SelectFieldOption[]>)\n : undefined,\n };\n });\n }, [sections]);\n\n // Clear cache and non-reactive tracking when section config changes.\n // Runs before the loader effect (declared first) so stale entries are\n // purged before any new loads read from the cache.\n useEffect(() => {\n cacheRef.current = new Map();\n nonReactiveTriggeredRef.current = new Set();\n }, [sectionConfig]);\n\n // Get or create a section's cache map\n const getSectionCache = useCallback(\n (index: number): Map<string, SelectFieldOption[]> => {\n let sectionCache = cacheRef.current.get(index);\n if (!sectionCache) {\n sectionCache = new Map();\n cacheRef.current.set(index, sectionCache);\n }\n return sectionCache;\n },\n [],\n );\n\n // Load a single dynamic section, updating state and cache on completion\n const loadSection = useCallback(\n (config: SectionConfig, index: number, loaderArg: string) => {\n const cacheKey = config.searchReactive ? loaderArg : STATIC_CACHE_KEY;\n\n const handleResult = (options: SelectFieldOption[]) => {\n // Non-reactive sections: always apply (no race condition, loaded once).\n // Reactive sections: only apply if this is still the latest search.\n if (\n !config.searchReactive ||\n latestSearchValueRef.current === loaderArg\n ) {\n const sectionCache = getSectionCache(index);\n cacheSet(sectionCache, cacheKey, options, config.cacheSize);\n setDynamicResults((prev) => ({ ...prev, [index]: options }));\n setLoadingSet((prev) => {\n const next = new Set(prev);\n next.delete(index);\n return next;\n });\n }\n };\n\n const handleError = (error: unknown) => {\n console.error(\"Failed to load pinned options:\", error);\n if (\n !config.searchReactive ||\n latestSearchValueRef.current === loaderArg\n ) {\n setDynamicResults((prev) => ({ ...prev, [index]: [] }));\n setLoadingSet((prev) => {\n const next = new Set(prev);\n next.delete(index);\n return next;\n });\n }\n };\n\n try {\n Promise.resolve(config.loader!(loaderArg))\n .then(handleResult)\n .catch(handleError);\n } catch (error) {\n handleError(error);\n }\n },\n [getSectionCache],\n );\n\n // Load dynamic options when searchValue or config changes\n useEffect(() => {\n const dynamicEntries = sectionConfig\n .map((config, index) => ({ config, index }))\n .filter(({ config }) => config.isDynamic);\n\n if (dynamicEntries.length === 0) return;\n\n const toLoad: { config: SectionConfig; index: number }[] = [];\n const preResolved: Record<number, SelectFieldOption[]> = {};\n\n dynamicEntries.forEach(({ config, index }) => {\n const sectionCache = getSectionCache(index);\n\n if (config.searchReactive) {\n // Reactive section: check cache for this specific search value\n const cached = sectionCache.get(searchValue);\n if (cached) {\n preResolved[index] = cached;\n } else {\n toLoad.push({ config, index });\n }\n } else {\n // Non-reactive section: use static cache entry, load at most once\n const cached = sectionCache.get(STATIC_CACHE_KEY);\n if (cached) {\n preResolved[index] = cached;\n } else if (!nonReactiveTriggeredRef.current.has(index)) {\n nonReactiveTriggeredRef.current.add(index);\n toLoad.push({ config, index });\n }\n // else: already triggered, still loading - shows as loading via fallthrough\n }\n });\n\n // If everything is cached, just set results immediately\n if (toLoad.length === 0) {\n setDynamicResults(preResolved);\n setLoadingSet(new Set());\n return;\n }\n\n // Set pre-resolved results and mark only uncached sections as loading\n const loadingIndices = toLoad.map(({ index }) => index);\n setDynamicResults(preResolved);\n setLoadingSet(new Set(loadingIndices));\n\n // Load each uncached dynamic section\n toLoad.forEach(({ config, index }) => {\n // Non-reactive sections always pass \"\" to the loader\n const loaderArg = config.searchReactive ? searchValue : \"\";\n loadSection(config, index, loaderArg);\n });\n }, [sectionConfig, searchValue, loadSection, getSectionCache]);\n\n // Build the final sections array with per-section loading state\n const pinnedSections = useMemo((): NormalizedPinnedSection[] => {\n return sectionConfig.map((config, index) => {\n if (!config.isDynamic) {\n return { label: config.label, options: config.staticOptions! };\n }\n // Dynamic section: show resolved results if available and not loading\n if (!loadingSet.has(index) && index in dynamicResults) {\n return {\n label: config.label,\n options: dynamicResults[index],\n };\n }\n // Otherwise it's still loading (or hasn't started yet)\n return { label: config.label, options: [], loading: true };\n });\n }, [sectionConfig, dynamicResults, loadingSet]);\n\n return { pinnedSections };\n}\n","import { useMemo } from \"react\";\nimport {\n SelectFieldDownshiftItem,\n SelectFieldGroupByValue,\n SelectFieldOption,\n} from \"../types\";\n\n/**\n * Normalized group section structure used internally.\n * @property label - The group label (derived from groupToString or String(groupValue))\n * @property options - The options belonging to this group\n */\nexport type NormalizedGroupSection = {\n label: string;\n options: SelectFieldOption[];\n};\n\ntype UseGroupedOptionsResult = {\n /** Options that have a group property, converted to downshift items */\n groupedItems: SelectFieldDownshiftItem[];\n /** Options that don't have a group property, converted to downshift items */\n ungroupedItems: SelectFieldDownshiftItem[];\n /** Metadata about each group section for rendering */\n groupSections: NormalizedGroupSection[];\n};\n\n/**\n * Hook that processes options and groups them by their `group` property.\n *\n * Groups are ordered by insertion order (first occurrence of a group value\n * defines its position in the list).\n *\n * @param options - The options to process\n * @param groupToString - Optional function to convert group values to display labels\n * @returns Grouped items, ungrouped items, and group section metadata\n */\nexport function useGroupedOptions(\n options: SelectFieldOption[],\n groupToString?: (groupValue: SelectFieldGroupByValue) => string,\n): UseGroupedOptionsResult {\n return useMemo(() => {\n const groupedItems: SelectFieldDownshiftItem[] = [];\n const ungroupedItems: SelectFieldDownshiftItem[] = [];\n const groupSections: NormalizedGroupSection[] = [];\n\n // Map to track groups by their value, preserving insertion order\n const groupMap = new Map<\n SelectFieldGroupByValue,\n { label: string; options: SelectFieldOption[] }\n >();\n\n options.forEach((option) => {\n if (option.group !== undefined) {\n // Option has a group\n const groupValue = option.group;\n\n if (!groupMap.has(groupValue)) {\n // First occurrence of this group - create new entry\n const label = groupToString\n ? groupToString(groupValue)\n : String(groupValue);\n groupMap.set(groupValue, { label, options: [] });\n }\n\n // Add option to its group\n groupMap.get(groupValue)!.options.push(option);\n\n // Add to grouped items\n groupedItems.push({\n id: option.id,\n type: \"grouped-option\",\n original: option,\n });\n } else {\n // Option has no group - add to ungrouped\n ungroupedItems.push({\n id: option.id,\n type: \"option\",\n original: option,\n });\n }\n });\n\n // Convert map to array (maintains insertion order)\n groupMap.forEach(({ label, options: groupOptions }) => {\n groupSections.push({ label, options: groupOptions });\n });\n\n return { groupedItems, ungroupedItems, groupSections };\n }, [options, groupToString]);\n}\n\n/**\n * Sorts group sections using the provided comparator function.\n * The group value is extracted from the first option in each section.\n *\n * @param sections - The group sections to sort\n * @param groupSorter - Comparator function for group values\n * @returns A new array of sorted sections\n */\nexport function sortGroupSections(\n sections: NormalizedGroupSection[],\n groupSorter: (\n a: SelectFieldGroupByValue,\n b: SelectFieldGroupByValue,\n ) => number,\n): NormalizedGroupSection[] {\n return [...sections].sort((a, b) => {\n const groupA = a.options[0]?.group;\n const groupB = b.options[0]?.group;\n if (groupA === undefined || groupB === undefined) return 0;\n return groupSorter(groupA, groupB);\n });\n}\n","import { ReactNode, RefObject, useCallback, useEffect, useRef } from \"react\";\n\nimport {\n autoPlacement,\n autoUpdate,\n computePosition,\n offset,\n size,\n} from \"@floating-ui/react\";\n\nimport { useOnClickOutside } from \"../../../../../internal/hooks/useOnClickOutside/useOnClickOutside\";\n\nimport styles from \"./FieldPopover.module.scss\";\n\nexport type FieldPopoverProps = {\n id: string;\n children: ReactNode;\n referenceElement: RefObject<HTMLElement>;\n open: boolean;\n onClickOutside: () => void;\n};\n\nexport const FieldPopover = (props: FieldPopoverProps) => {\n const ref = useRef<HTMLDivElement>(null);\n const { id, children, referenceElement, open, onClickOutside } = props;\n\n useOnClickOutside({\n targets: [ref.current ?? undefined, referenceElement.current ?? undefined],\n onClickOutside: onClickOutside,\n disable: !open,\n });\n\n useEffect(() => {\n if (open) {\n ref.current?.showPopover();\n } else {\n ref.current?.hidePopover();\n }\n }, [open]);\n\n const updatePosition = useCallback(async () => {\n if (!ref.current || !referenceElement.current) return;\n const position = await computePosition(\n referenceElement.current,\n ref.current,\n {\n placement: \"bottom-start\",\n middleware: [\n offset(8),\n autoPlacement({\n allowedPlacements: [\"bottom-start\", \"top-start\"],\n padding: 8,\n }),\n size({\n padding: 8,\n apply({ rects, elements, availableHeight }) {\n Object.assign(elements.floating.style, {\n width: `${rects.reference.width}px`,\n maxHeight: `${Math.max(0, availableHeight)}px`,\n });\n },\n }),\n ],\n },\n );\n ref.current.style.left = `${position.x}px`;\n ref.current.style.top = `${position.y}px`;\n }, [ref, referenceElement]);\n\n useEffect(() => {\n if (!ref.current || !referenceElement.current || !open) return;\n const cleanup = autoUpdate(\n referenceElement.current,\n ref.current,\n updatePosition,\n );\n return () => {\n cleanup();\n };\n }, [referenceElement, ref, updatePosition, open]);\n\n return (\n <div ref={ref} id={id} className={styles[\"field-popover\"]} popover=\"manual\">\n {children}\n </div>\n );\n};\n","import { useEffect, useState } from \"react\";\nimport { useBreakpoint } from \"../../../hooks\";\n\n/**\n * The type of view to render based on device characteristics.\n */\nexport type AdaptiveView = \"mobile\" | \"desktop\";\n\n/**\n * Return type for the useAdaptiveView hook.\n */\nexport interface UseAdaptiveViewReturn {\n /**\n * The current adaptive view type.\n */\n view: AdaptiveView;\n /**\n * True when the device should use mobile-optimized UI (Dialog).\n */\n isMobile: boolean;\n /**\n * True when the device should use desktop-optimized UI (Popover).\n */\n isDesktop: boolean;\n}\n\n/**\n * Detects whether the primary pointer is coarse (touch) using CSS media query.\n * Returns false during SSR or when matchMedia is unavailable.\n */\nfunction detectCoarsePointer(): boolean {\n if (typeof window === \"undefined\" || !window.matchMedia) {\n return false;\n }\n return window.matchMedia(\"(pointer: coarse)\").matches;\n}\n\n/**\n * Custom hook for detecting whether to use mobile or desktop UI patterns.\n *\n * This hook determines the optimal UI pattern (e.g., Dialog vs Popover) by combining:\n * - Screen size via useBreakpoint (viewport width)\n * - Pointer precision via CSS media query (pointer: coarse)\n *\n * A device is considered \"mobile\" when it has both:\n * - A small screen (below md breakpoint, < 768px)\n * - A coarse pointer (touch-primary input)\n *\n * This approach correctly identifies:\n * - Mobile phones → mobile view (Dialog)\n * - iPads/tablets → desktop view (Popover) due to larger screens\n * - Touch laptops → desktop view (Popover) due to fine pointer primary\n * - Desktop → desktop view (Popover)\n *\n * @returns Object containing view type and boolean flags for mobile/desktop\n *\n * @example\n * const { isMobile } = useAdaptiveView();\n *\n * return isMobile ? (\n * <Dialog>{children}</Dialog>\n * ) : (\n * <Popover>{children}</Popover>\n * );\n */\nexport function useAdaptiveView(): UseAdaptiveViewReturn {\n const breakpoint = useBreakpoint();\n const [hasCoarsePointer, setHasCoarsePointer] = useState(detectCoarsePointer);\n\n useEffect(() => {\n setHasCoarsePointer(detectCoarsePointer());\n\n // Listen for pointer capability changes (e.g., connecting/disconnecting a mouse)\n const mediaQuery = window.matchMedia(\"(pointer: coarse)\");\n const handleChange = (e: MediaQueryListEvent) => {\n setHasCoarsePointer(e.matches);\n };\n\n mediaQuery.addEventListener(\"change\", handleChange);\n return () => mediaQuery.removeEventListener(\"change\", handleChange);\n }, []);\n\n const isSmallScreen = !breakpoint?.md;\n const isMobile = isSmallScreen && hasCoarsePointer;\n\n return {\n view: isMobile ? \"mobile\" : \"desktop\",\n isMobile,\n isDesktop: !isMobile,\n };\n}\n","import { useCallback, useEffect, useRef } from \"react\";\nimport { Flex, FocusableElement, Text } from \"../../../../..\";\nimport { DialogCancelButton } from \"../../../../../components/Dialog/DialogCancelButton\";\nimport styles from \"./FieldDialog.module.scss\";\nimport Close from \"@servicetitan/hammer-icon/mdi/round/close.svg\";\nimport { DialogContext } from \"../../../../../components/Dialog/internal/DialogContext\";\nimport { useDialogScrollLock } from \"../../../../../internal\";\nimport { tabbable } from \"tabbable\";\n\nexport const FieldDialog = ({\n id,\n isOpen,\n onClose,\n field,\n children,\n title,\n initialFocusResolver,\n}: {\n id: string;\n isOpen: boolean;\n onClose: () => void;\n title: string;\n field: React.ReactNode;\n children: React.ReactNode;\n initialFocusResolver?: (focusables: FocusableElement[]) => FocusableElement;\n}) => {\n const elRef = useRef<HTMLDialogElement>(null);\n const visualViewportHeightRef = useRef<HTMLDivElement>(null);\n\n useDialogScrollLock({\n open: isOpen,\n id,\n enableScrollChaining: false,\n elementRef: elRef,\n });\n\n const computeFocus = useCallback(\n (focusables: FocusableElement[]) => {\n if (initialFocusResolver) {\n return initialFocusResolver(focusables);\n }\n return (\n focusables.find(\n (focusable) => focusable.dataset.anv !== \"dialog-cancel-button\",\n ) || focusables[0]\n );\n },\n [initialFocusResolver],\n );\n\n useEffect(() => {\n if (isOpen) {\n elRef.current?.showModal();\n if (elRef.current) {\n computeFocus(tabbable(elRef.current)).focus();\n }\n } else {\n elRef.current?.close();\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps -- Omitting computeFocus because we don't want to show/close the dialog on computeFocus change\n }, [isOpen]);\n\n useEffect(() => {\n if (isOpen) {\n const handleResize = () => {\n if (!visualViewportHeightRef.current) return;\n visualViewportHeightRef.current.style.height = `${window.visualViewport?.height ?? 0}px`;\n visualViewportHeightRef.current.style.maxHeight = `${window.visualViewport?.height ?? 0}px`;\n };\n window.visualViewport?.addEventListener(\"resize\", handleResize);\n return () => {\n window.visualViewport?.removeEventListener(\"resize\", handleResize);\n };\n }\n }, [isOpen]);\n\n return (\n <dialog\n ref={elRef}\n id={id}\n data-anv=\"field-dialog\"\n className={styles[\"field-dialog\"]}\n onKeyDown={(e) => {\n if (e.code === \"Escape\") {\n e.preventDefault();\n onClose();\n }\n }}\n >\n <div\n className={styles[\"field-dialog-visual-viewport-height\"]}\n ref={visualViewportHeightRef}\n >\n <Flex direction=\"row\" className={styles[\"header\"]}>\n <Text variant=\"headline\" el=\"h1\">\n {title}\n </Text>\n <span className={styles[\"close-container\"]}>\n <DialogContext.Provider value={{ close: onClose }}>\n <DialogCancelButton\n className={styles[\"close-button\"]}\n size=\"small\"\n appearance=\"ghost\"\n aria-label=\"Close dialog\"\n icon={Close}\n />\n </DialogContext.Provider>\n </span>\n </Flex>\n <Flex direction=\"column\" className={styles[\"field\"]}>\n {field}\n </Flex>\n <Flex direction=\"column\" className={styles[\"content\"]}>\n {children}\n </Flex>\n </div>\n </dialog>\n );\n};\n"],"names":["options","CheckboxChecked","styles","CheckboxOutline","CheckboxIndeterminate","Check","Close"],"mappings":"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"}
|
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
2
|
-
import { forwardRef } from 'react';
|
|
3
|
-
import { c as cx } from './index-SvGbrGuT.js';
|
|
4
|
-
import { I as Icon } from './Icon-Bcil6aBo.js';
|
|
5
|
-
import { S as SvgError } from './error-DR_wWdYY.js';
|
|
6
|
-
|
|
7
|
-
import './FieldMessage.css';const messages = "_messages_1hr9l_1";
|
|
8
|
-
const styles = {
|
|
9
|
-
messages: messages,
|
|
10
|
-
"error-container": "_error-container_1hr9l_19",
|
|
11
|
-
"error-icon": "_error-icon_1hr9l_26"
|
|
12
|
-
};
|
|
13
|
-
|
|
14
|
-
const FieldMessage = forwardRef(
|
|
15
|
-
(props, ref) => {
|
|
16
|
-
const {
|
|
17
|
-
id,
|
|
18
|
-
hint,
|
|
19
|
-
description,
|
|
20
|
-
errorAriaLive = "assertive",
|
|
21
|
-
errorMessage,
|
|
22
|
-
className,
|
|
23
|
-
...rest
|
|
24
|
-
} = props;
|
|
25
|
-
return /* @__PURE__ */ jsxs(
|
|
26
|
-
"div",
|
|
27
|
-
{
|
|
28
|
-
...rest,
|
|
29
|
-
className: cx(styles["messages"], className),
|
|
30
|
-
ref,
|
|
31
|
-
id,
|
|
32
|
-
children: [
|
|
33
|
-
errorMessage ? /* @__PURE__ */ jsxs("div", { className: styles["error-container"], children: [
|
|
34
|
-
/* @__PURE__ */ jsx(
|
|
35
|
-
Icon,
|
|
36
|
-
{
|
|
37
|
-
inherit: true,
|
|
38
|
-
className: styles["error-icon"],
|
|
39
|
-
"aria-hidden": true,
|
|
40
|
-
svg: SvgError
|
|
41
|
-
}
|
|
42
|
-
),
|
|
43
|
-
/* @__PURE__ */ jsx("span", { className: styles["error-message"], "aria-live": errorAriaLive, children: errorMessage })
|
|
44
|
-
] }) : hint ?? null,
|
|
45
|
-
description ? /* @__PURE__ */ jsx("div", { className: styles["description-container"], children: description ? /* @__PURE__ */ jsx("span", { children: description }) : null }) : null
|
|
46
|
-
]
|
|
47
|
-
}
|
|
48
|
-
);
|
|
49
|
-
}
|
|
50
|
-
);
|
|
51
|
-
FieldMessage.displayName = "FieldMessage";
|
|
52
|
-
|
|
53
|
-
export { FieldMessage as F };
|
|
54
|
-
//# sourceMappingURL=FieldMessage-tEr6rWXS.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"FieldMessage-tEr6rWXS.js","sources":["../src/components/FieldMessage/FieldMessage.tsx"],"sourcesContent":["import {\n forwardRef,\n type AriaAttributes,\n type ReactElement,\n type ComponentPropsWithoutRef,\n} from \"react\";\nimport cx from \"classnames\";\nimport styles from \"./FieldMessage.module.scss\";\nimport { Icon } from \"../Icon\";\nimport Error from \"@servicetitan/hammer-icon/mdi/round/error.svg\";\n\n/**\n * Props for the FieldMessage component\n * @extends ComponentPropsWithoutRef<\"div\">\n */\nexport type FieldMessageProps = ComponentPropsWithoutRef<\"div\"> & {\n /**\n * Unique identifier for the field message container.\n */\n id?: string;\n /**\n * Hint text or element to display when there's no error.\n */\n hint?: ReactElement | string;\n /**\n * Description text or element to display below the main message.\n */\n description?: ReactElement | string;\n /**\n * Error message or element to display when there's an error.\n */\n errorMessage?: ReactElement | string;\n /**\n * aria-live attribute value for the error message.\n * @default assertive\n * @remarks Controls how screen readers announce error messages. \"assertive\" interrupts current speech, \"polite\" waits for current speech to finish.\n * @link https://www.w3.org/WAI/tutorials/forms/notifications/\n */\n errorAriaLive?: AriaAttributes[\"aria-live\"];\n};\n\n/**\n * FieldMessage component for displaying hints, descriptions, and error messages for form fields.\n *\n * Features:\n * - Displays hint text when no error is present\n * - Shows error messages with warning icon when errors occur\n * - Supports both string and React element content\n * - Configurable aria-live behavior for screen readers\n * - Optional description text for additional context\n * - Accessible with proper ARIA attributes\n * - Visual error indicators with warning icons\n * - Conditional rendering based on error state\n * - Supports layout utilities for positioning and spacing\n *\n * @example\n * <FieldMessage\n * hint=\"Enter your email address\"\n * description=\"We'll use this to send you updates\"\n * errorMessage=\"Please enter a valid email address\"\n * />\n */\nexport const FieldMessage = forwardRef<HTMLDivElement, FieldMessageProps>(\n (props, ref) => {\n const {\n id,\n hint,\n description,\n errorAriaLive = \"assertive\",\n errorMessage,\n className,\n ...rest\n } = props;\n\n return (\n <div\n {...rest}\n className={cx(styles[\"messages\"], className)}\n ref={ref}\n id={id}\n >\n {errorMessage ? (\n <div className={styles[\"error-container\"]}>\n <Icon\n inherit\n className={styles[\"error-icon\"]}\n aria-hidden\n svg={Error}\n />\n <span className={styles[\"error-message\"]} aria-live={errorAriaLive}>\n {errorMessage}\n </span>\n </div>\n ) : (\n (hint ?? null)\n )}\n {description ? (\n <div className={styles[\"description-container\"]}>\n {description ? <span>{description}</span> : null}\n </div>\n ) : null}\n </div>\n );\n },\n);\n\nFieldMessage.displayName = \"FieldMessage\";\n"],"names":["Error"],"mappings":";;;;;;;;;;;;;AA8DO,MAAM,YAAA,GAAe,UAAA;AAAA,EAC1B,CAAC,OAAO,GAAA,KAAQ;AACd,IAAA,MAAM;AAAA,MACJ,EAAA;AAAA,MACA,IAAA;AAAA,MACA,WAAA;AAAA,MACA,aAAA,GAAgB,WAAA;AAAA,MAChB,YAAA;AAAA,MACA,SAAA;AAAA,MACA,GAAG;AAAA,KACL,GAAI,KAAA;AAEJ,IAAA,uBACE,IAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACE,GAAG,IAAA;AAAA,QACJ,SAAA,EAAW,EAAA,CAAG,MAAA,CAAO,UAAU,GAAG,SAAS,CAAA;AAAA,QAC3C,GAAA;AAAA,QACA,EAAA;AAAA,QAEC,QAAA,EAAA;AAAA,UAAA,YAAA,mBACC,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,MAAA,CAAO,iBAAiB,CAAA,EACtC,QAAA,EAAA;AAAA,4BAAA,GAAA;AAAA,cAAC,IAAA;AAAA,cAAA;AAAA,gBACC,OAAA,EAAO,IAAA;AAAA,gBACP,SAAA,EAAW,OAAO,YAAY,CAAA;AAAA,gBAC9B,aAAA,EAAW,IAAA;AAAA,gBACX,GAAA,EAAKA;AAAA;AAAA,aACP;AAAA,4BACA,GAAA,CAAC,UAAK,SAAA,EAAW,MAAA,CAAO,eAAe,CAAA,EAAG,WAAA,EAAW,eAClD,QAAA,EAAA,YAAA,EACH;AAAA,WAAA,EACF,IAEC,IAAA,IAAQ,IAAA;AAAA,UAEV,WAAA,mBACC,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,MAAA,CAAO,uBAAuB,CAAA,EAC3C,QAAA,EAAA,WAAA,mBAAc,GAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,WAAA,EAAY,CAAA,GAAU,MAC9C,CAAA,GACE;AAAA;AAAA;AAAA,KACN;AAAA,EAEJ;AACF;AAEA,YAAA,CAAa,WAAA,GAAc,cAAA;;;;"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Helper-CK-XjpR3.js","sources":["../src/internal/components/Helper/Helper.tsx"],"sourcesContent":["import { forwardRef, AriaAttributes, ReactElement } from \"react\";\nimport styles from \"./Helper.module.scss\";\nimport { FieldMessage } from \"../../../components/FieldMessage\";\nimport { SrOnly } from \"../../../components/SrOnly\";\n\nexport type HelperProps = {\n id?: string;\n // required?: boolean;\n hint?: ReactElement | string;\n description?: ReactElement | string;\n errorMessage?: ReactElement | string;\n /**\n * aria-live for the error message\n * @default assertive\n * @link https://www.w3.org/WAI/tutorials/forms/notifications/\n */\n errorAriaLive?: AriaAttributes[\"aria-live\"];\n maxLength?: number;\n inputLength?: number;\n isTyping?: boolean;\n showCounter?: boolean;\n};\n\nexport const Helper = forwardRef<HTMLDivElement, HelperProps>((props, ref) => {\n const {\n id,\n hint,\n description,\n errorAriaLive = \"assertive\",\n errorMessage,\n maxLength,\n isTyping,\n inputLength = 0,\n showCounter,\n } = props;\n\n return (\n <div className={styles[\"helper\"]} ref={ref} id={id}>\n <FieldMessage\n className={styles[\"messages\"]}\n hint={hint}\n description={description}\n errorAriaLive={errorAriaLive}\n errorMessage={errorMessage}\n />\n\n {showCounter ? (\n <div className={styles[\"counter\"]}>\n <span aria-hidden=\"true\">\n {inputLength}/{maxLength}\n </span>\n </div>\n ) : null}\n {isTyping && !!maxLength ? (\n maxLength - inputLength >= 1 ? (\n <SrOnly>\n {/* TODO: potential localization */}\n <span aria-live=\"polite\" aria-atomic=\"true\">{`${\n maxLength - inputLength\n } character${maxLength - inputLength !== 1 ? \"s\" : \"\"} left`}</span>\n </SrOnly>\n ) : (\n <SrOnly>\n {/* TODO: potential localization */}\n <span role=\"alert\">Maximum characters count reached</span>\n </SrOnly>\n )\n ) : null}\n </div>\n );\n});\n\nHelper.displayName = \"Helper\";\n"],"names":[],"mappings":";;;;;;;;;;;AAuBO,MAAM,MAAA,GAAS,UAAA,CAAwC,CAAC,KAAA,EAAO,GAAA,KAAQ;AAC5E,EAAA,MAAM;AAAA,IACJ,EAAA;AAAA,IACA,IAAA;AAAA,IACA,WAAA;AAAA,IACA,aAAA,GAAgB,WAAA;AAAA,IAChB,YAAA;AAAA,IACA,SAAA;AAAA,IACA,QAAA;AAAA,IACA,WAAA,GAAc,CAAA;AAAA,IACd;AAAA,GACF,GAAI,KAAA;AAEJ,EAAA,4BACG,KAAA,EAAA,EAAI,SAAA,EAAW,OAAO,QAAQ,CAAA,EAAG,KAAU,EAAA,EAC1C,QAAA,EAAA;AAAA,oBAAA,GAAA;AAAA,MAAC,YAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAW,OAAO,UAAU,CAAA;AAAA,QAC5B,IAAA;AAAA,QACA,WAAA;AAAA,QACA,aAAA;AAAA,QACA;AAAA;AAAA,KACF;AAAA,IAEC,WAAA,mBACC,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,MAAA,CAAO,SAAS,CAAA,EAC9B,QAAA,kBAAA,IAAA,CAAC,MAAA,EAAA,EAAK,aAAA,EAAY,MAAA,EACf,QAAA,EAAA;AAAA,MAAA,WAAA;AAAA,MAAY,GAAA;AAAA,MAAE;AAAA,KAAA,EACjB,GACF,CAAA,GACE,IAAA;AAAA,IACH,QAAA,IAAY,CAAC,CAAC,SAAA,GACb,YAAY,WAAA,IAAe,CAAA,mBACzB,GAAA,CAAC,MAAA,EAAA,EAEC,8BAAC,MAAA,EAAA,EAAK,WAAA,EAAU,QAAA,EAAS,aAAA,EAAY,QAAQ,QAAA,EAAA,CAAA,EAC3C,SAAA,GAAY,WACd,CAAA,UAAA,EAAa,YAAY,WAAA,KAAgB,CAAA,GAAI,GAAA,GAAM,EAAE,SAAQ,CAAA,EAC/D,CAAA,mBAEA,GAAA,CAAC,MAAA,EAAA,EAEC,8BAAC,MAAA,EAAA,EAAK,IAAA,EAAK,OAAA,EAAQ,QAAA,EAAA,kCAAA,EAAgC,GACrD,CAAA,GAEA;AAAA,GAAA,EACN,CAAA;AAEJ,CAAC;AAED,MAAA,CAAO,WAAA,GAAc,QAAA;;;;"}
|