@lifesg/react-design-system 3.5.0-canary.1 → 3.5.0-canary.2
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/cjs/footer/footer-helper.js +1 -1
- package/cjs/footer/footer-helper.js.map +1 -1
- package/cjs/index.js +1 -1
- package/cjs/navbar/drawer.js +1 -1
- package/cjs/navbar/drawer.js.map +1 -1
- package/cjs/navbar/navbar-logo-data.js +1 -1
- package/cjs/navbar/navbar-logo-data.js.map +1 -1
- package/cjs/navbar/navbar.js +1 -1
- package/cjs/navbar/navbar.js.map +1 -1
- package/cjs/shared/internal-calendar/calendar-manager.style.js +18 -17
- package/cjs/shared/internal-calendar/calendar-manager.style.js.map +1 -1
- package/cjs/theme/colour-primitive/specs/toteboard-colour-set.js +2 -0
- package/cjs/theme/colour-primitive/specs/toteboard-colour-set.js.map +1 -0
- package/cjs/theme/colour-primitive/theme-helper.js +1 -1
- package/cjs/theme/colour-primitive/theme-helper.js.map +1 -1
- package/cjs/theme/colour-semantic/theme-helper.js +1 -1
- package/cjs/theme/colour-semantic/theme-helper.js.map +1 -1
- package/cjs/theme/font/specs/toteboard-font-set.js +2 -0
- package/cjs/theme/font/specs/toteboard-font-set.js.map +1 -0
- package/cjs/theme/font/theme-helper.js +1 -1
- package/cjs/theme/font/theme-helper.js.map +1 -1
- package/cjs/theme/font-spec/specs/toteboard-font-spec-set.js +2 -0
- package/cjs/theme/font-spec/specs/toteboard-font-spec-set.js.map +1 -0
- package/cjs/theme/font-spec/theme-helper.js +1 -1
- package/cjs/theme/font-spec/theme-helper.js.map +1 -1
- package/cjs/theme/index.js +1 -1
- package/cjs/theme/index.js.map +1 -1
- package/cjs/time-range-picker/combobox-picker/combobox-picker.js +1 -1
- package/cjs/time-range-picker/combobox-picker/combobox-picker.js.map +1 -1
- package/cjs/time-range-picker/common.styles.js +7 -3
- package/cjs/time-range-picker/common.styles.js.map +1 -1
- package/cjs/time-range-picker/dial-picker/dial-picker.js +1 -1
- package/cjs/time-range-picker/dial-picker/dial-picker.js.map +1 -1
- package/cjs/timepicker/timepicker.styles.js +7 -3
- package/cjs/timepicker/timepicker.styles.js.map +1 -1
- package/cjs/util/merge-refs.js +1 -1
- package/cjs/util/merge-refs.js.map +1 -1
- package/footer/footer-helper.js +1 -1
- package/footer/footer-helper.js.map +1 -1
- package/index.js +1 -1
- package/navbar/drawer.js +1 -1
- package/navbar/drawer.js.map +1 -1
- package/navbar/navbar-logo-data.js +1 -1
- package/navbar/navbar-logo-data.js.map +1 -1
- package/navbar/navbar.js +1 -1
- package/navbar/navbar.js.map +1 -1
- package/package.json +1 -1
- package/shared/internal-calendar/calendar-manager.style.js +18 -17
- package/shared/internal-calendar/calendar-manager.style.js.map +1 -1
- package/theme/colour-primitive/specs/toteboard-colour-set.d.ts +2 -0
- package/theme/colour-primitive/specs/toteboard-colour-set.js +2 -0
- package/theme/colour-primitive/specs/toteboard-colour-set.js.map +1 -0
- package/theme/colour-primitive/theme-helper.js +1 -1
- package/theme/colour-primitive/theme-helper.js.map +1 -1
- package/theme/colour-semantic/theme-helper.js +1 -1
- package/theme/colour-semantic/theme-helper.js.map +1 -1
- package/theme/font/specs/toteboard-font-set.d.ts +2 -0
- package/theme/font/specs/toteboard-font-set.js +2 -0
- package/theme/font/specs/toteboard-font-set.js.map +1 -0
- package/theme/font/theme-helper.js +1 -1
- package/theme/font/theme-helper.js.map +1 -1
- package/theme/font-spec/specs/toteboard-font-spec-set.d.ts +2 -0
- package/theme/font-spec/specs/toteboard-font-spec-set.js +2 -0
- package/theme/font-spec/specs/toteboard-font-spec-set.js.map +1 -0
- package/theme/font-spec/theme-helper.js +1 -1
- package/theme/font-spec/theme-helper.js.map +1 -1
- package/theme/index.d.ts +19 -0
- package/theme/index.js +1 -1
- package/theme/index.js.map +1 -1
- package/theme/types.d.ts +3 -3
- package/time-range-picker/combobox-picker/combobox-picker.js +1 -1
- package/time-range-picker/combobox-picker/combobox-picker.js.map +1 -1
- package/time-range-picker/common.styles.d.ts +6 -2
- package/time-range-picker/common.styles.js +9 -5
- package/time-range-picker/common.styles.js.map +1 -1
- package/time-range-picker/dial-picker/dial-picker.js +1 -1
- package/time-range-picker/dial-picker/dial-picker.js.map +1 -1
- package/timepicker/timepicker.styles.js +7 -3
- package/timepicker/timepicker.styles.js.map +1 -1
- package/util/merge-refs.d.ts +1 -1
- package/util/merge-refs.js +1 -1
- package/util/merge-refs.js.map +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"combobox-picker.js","sources":["../../../../src/time-range-picker/combobox-picker/combobox-picker.tsx"],"sourcesContent":["import { OpenChangeReason } from \"@floating-ui/react\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport {\n ErrorIcon,\n ErrorMessage,\n ErrorMessageContainer,\n} from \"../../form/form-label.style\";\nimport { ClearIconContainer } from \"../../input-range-select/input-range-select.style\";\nimport { ClearIcon } from \"../../input/input.style\";\nimport { VisuallyHidden, concatIds } from \"../../shared/accessibility\";\nimport { DropdownListState } from \"../../shared/dropdown-list\";\nimport { DropdownList } from \"../../shared/dropdown-list/dropdown-list\";\nimport { ElementWithDropdown } from \"../../shared/dropdown-wrapper\";\nimport { RangeInputInnerContainer } from \"../../shared/range-input-inner-container\";\nimport { useId } from \"../../util\";\nimport { TimeHelper } from \"../../util/time-helper\";\nimport { SelectorInput, Wrapper } from \"../common.styles\";\nimport { TimeRangePickerProps, TimeRangePickerValue } from \"../types\";\nimport { TimeFieldContainer } from \"./combobox-picker.styles\";\n\ntype TimeRangeInputType = \"start\" | \"end\";\ninterface TimeChangeOptions {\n goToNextInput?: boolean | undefined;\n triggerOnBlur?: boolean | undefined;\n}\n\nexport const ComboboxPicker = ({\n id,\n disabled = false,\n error,\n value,\n format = \"12hr\",\n readOnly,\n onChange,\n onFocus,\n onBlur,\n alignment = \"left\",\n dropdownZIndex,\n startLimit,\n endLimit,\n initialScrollStartTime,\n initialScrollEndTime,\n interval = 15,\n dropdownRootNode,\n \"aria-labelledby\": ariaLabelledBy,\n \"aria-describedby\": ariaDescribedBy,\n \"aria-invalid\": ariaInvalid,\n ...otherProps\n}: TimeRangePickerProps) => {\n // =============================================================================\n // CONST, STATE, REF\n // =============================================================================\n const internalId = useId();\n const [activeTimeSelector, setActiveTimeSelector] =\n useState<TimeRangeInputType | null>(null);\n const [dropdownOpen, setDropdownOpen] = useState<boolean>(false);\n const [validationError, setValidationError] = useState<string>(\"\");\n\n const [startTimeVal, setStartTimeVal] = useState<string>(\"\");\n const [endTimeVal, setEndTimeVal] = useState<string>(\"\");\n const [initialStartTimeVal, setInitialStartTimeVal] = useState<string>(\"\");\n const [initialEndTimeVal, setInitialEndTimeVal] = useState<string>(\"\");\n\n const nodeRef = useRef<HTMLDivElement>(null);\n const startInputRef = useRef<HTMLInputElement>(null);\n const endInputRef = useRef<HTMLInputElement>(null);\n\n const listboxId = `${internalId}-listbox`;\n const startLabelId = `${internalId}-start-label`;\n const endLabelId = `${internalId}-end-label`;\n const errorId = `${internalId}-error-message`;\n\n const startOptions = useMemo(\n () =>\n TimeHelper.generateTimings(interval, format, startLimit, endLimit),\n [interval, format, startLimit, endLimit]\n );\n const endOptions = useMemo(() => {\n if (initialStartTimeVal === \"\") return startOptions;\n\n const flooredStartVal = TimeHelper.findClosestFlooredTime(\n initialStartTimeVal,\n startOptions\n );\n return flooredStartVal\n ? startOptions.slice(startOptions.indexOf(flooredStartVal))\n : [];\n }, [startOptions, initialStartTimeVal]);\n\n // =========================================================================\n // EFFECTS\n // =========================================================================\n const parseInput = useCallback(\n (input: string | undefined): string | undefined => {\n return TimeHelper.parseInput(input, format);\n },\n [format]\n );\n\n const parsedInitialStartScrollTime = useMemo(\n () => parseInput(initialScrollStartTime) ?? \"\",\n [initialScrollStartTime, parseInput]\n );\n\n const parsedInitialEndScrollTime = useMemo(\n () => parseInput(initialScrollEndTime) ?? \"\",\n [initialScrollEndTime, parseInput]\n );\n\n useEffect(() => {\n if (value) {\n const start = parseInput(value.start) ?? \"\";\n const end = parseInput(value.end) ?? \"\";\n\n setStartTimeVal(start);\n setEndTimeVal(end);\n setInitialStartTimeVal(start);\n setInitialEndTimeVal(end);\n }\n }, [value, parseInput]);\n\n // Validation for keyboard input\n useEffect(() => {\n if (error) {\n setDropdownOpen(false);\n return;\n }\n\n const start = parseInput(startTimeVal);\n const end = parseInput(endTimeVal);\n\n if (start === undefined) {\n setValidationError(\"Invalid start time\");\n } else if (end === undefined) {\n setValidationError(\"Invalid end time\");\n } else if (\n start !== \"\" &&\n end !== \"\" &&\n TimeHelper.to24Hour(end) < TimeHelper.to24Hour(start)\n ) {\n setValidationError(\"End time must be after start time\");\n } else {\n setValidationError(\"\");\n // Re-open dropdown if error was corrected\n if (\n document.activeElement === startInputRef.current ||\n document.activeElement === endInputRef.current\n ) {\n setDropdownOpen(true);\n }\n return;\n }\n\n // Hide dropdown so error message is visible\n setDropdownOpen(false);\n }, [startTimeVal, endTimeVal, parseInput, error]);\n\n // =============================================================================\n // HELPERS\n // =============================================================================\n const getDropdownAriaLabel = () => {\n if (activeTimeSelector === \"start\") {\n return \"Selecting for: Start time\";\n }\n\n if (activeTimeSelector === \"end\") {\n return \"Selecting for: End time\";\n }\n\n return undefined;\n };\n\n const getInputLabelledBy = (type: TimeRangeInputType) => {\n return concatIds(\n ariaLabelledBy,\n type === \"start\" ? startLabelId : endLabelId\n );\n };\n\n const getInputDescribedBy = () => {\n return concatIds(\n ariaDescribedBy,\n !error && validationError ? errorId : undefined\n );\n };\n\n // =============================================================================\n // EVENT HANDLERS\n // =============================================================================\n const handleInputFocus = (selector: TimeRangeInputType) => {\n if (disabled || readOnly) return;\n\n // Only run onFocus if not already focused\n if (!activeTimeSelector && !dropdownOpen) onFocus?.();\n\n setActiveTimeSelector(selector);\n setDropdownOpen(true);\n };\n\n const handleInputClick = (selector: TimeRangeInputType) => {\n if (disabled || readOnly) return;\n\n setActiveTimeSelector(selector);\n setDropdownOpen(true);\n (selector === \"start\" ? startInputRef : endInputRef).current?.select();\n };\n\n function handleKeyDownEvent(event: React.KeyboardEvent<HTMLInputElement>) {\n switch (event.code) {\n case \"Enter\":\n if (activeTimeSelector === \"start\") {\n handleStartTime(startTimeVal);\n } else if (activeTimeSelector === \"end\") {\n // Let handleBlur call handleTimeChange instead\n if (dropdownOpen) handleEndTime(endTimeVal);\n endInputRef.current?.blur();\n }\n break;\n case \"Tab\":\n handleTimeChange(startTimeVal, endTimeVal, {});\n break;\n default:\n break;\n }\n }\n\n const handleStartTime = (input: string) => {\n handleTimeChange(input, endTimeVal, { goToNextInput: true });\n };\n\n const handleEndTime = (input: string) => {\n handleTimeChange(startTimeVal, input, { triggerOnBlur: true });\n };\n\n const handleTimeChange = (\n startInput: string,\n endInput: string,\n {\n goToNextInput, // Used by handleStart to move to end input automatically\n triggerOnBlur, // Used by handleEnd/handleClear to trigger onBlur\n }: TimeChangeOptions\n ) => {\n const start = parseInput(startInput) ?? initialStartTimeVal;\n const end = parseInput(endInput) ?? initialEndTimeVal;\n\n setStartTimeVal(start);\n setEndTimeVal(end);\n\n const timeValue: TimeRangePickerValue = { start, end };\n\n // Trigger onChange if values have changed\n if (start !== initialStartTimeVal || end !== initialEndTimeVal) {\n onChange?.(timeValue);\n }\n\n // Go to end input only if start is a valid time\n if (goToNextInput && parseInput(startInput) !== undefined) {\n setActiveTimeSelector(\"end\");\n endInputRef.current?.select();\n }\n\n if (triggerOnBlur) {\n setActiveTimeSelector(null);\n setDropdownOpen(false);\n onBlur?.();\n }\n\n setInitialStartTimeVal(start);\n setInitialEndTimeVal(end);\n };\n\n const handleClear = (event: React.MouseEvent) => {\n event.stopPropagation();\n setStartTimeVal(\"\");\n setEndTimeVal(\"\");\n setInitialStartTimeVal(\"\");\n setInitialEndTimeVal(\"\");\n\n const timeValue: TimeRangePickerValue = {\n start: \"\",\n end: \"\",\n };\n\n onChange?.(timeValue);\n setActiveTimeSelector(null);\n setDropdownOpen(false);\n };\n\n const handleDismiss = () => {\n (activeTimeSelector === \"start\"\n ? startInputRef\n : endInputRef\n ).current?.focus();\n setDropdownOpen(false);\n };\n\n const handleBlur = (event: React.FocusEvent<HTMLDivElement, Element>) => {\n const target = event.relatedTarget as HTMLElement;\n\n const isFloatingElement =\n target?.matches?.(\"[data-floating-ui-focusable]\") ||\n target?.matches?.(\"[data-floating-ui-focus-guard]\");\n const isInsideNode =\n nodeRef.current && nodeRef.current.contains(target);\n\n // Condition when the calendar is closed and focus moved outside the component\n const shouldBlurWhenClosed =\n activeTimeSelector &&\n !dropdownOpen &&\n !isInsideNode &&\n !isFloatingElement;\n\n if (shouldBlurWhenClosed) {\n handleTimeChange(startTimeVal, endTimeVal, { triggerOnBlur: true });\n }\n };\n\n // NOTE: Dropdown dismissal (esc) does not trigger onClose\n const handleClose = (reason: OpenChangeReason | undefined) => {\n if (reason === \"outside-press\") {\n // No handleTimeChange to avoid duplicate call from handleBlur\n setActiveTimeSelector(null);\n setDropdownOpen(false);\n onBlur?.();\n } else {\n // Dropdown closed via exiting component (eg. tab)\n handleTimeChange(startTimeVal, endTimeVal, { triggerOnBlur: true });\n }\n };\n\n // =============================================================================\n // RENDER FUNCTIONS\n // =============================================================================\n const renderClearButton = () => {\n if (\n !readOnly &&\n !disabled &&\n (startTimeVal?.length > 0 || endTimeVal?.length > 0)\n ) {\n return (\n <ClearIconContainer\n onClick={handleClear}\n type=\"button\"\n aria-label=\"Clear\"\n >\n <ClearIcon aria-hidden />\n </ClearIconContainer>\n );\n }\n };\n\n const renderDropdown = () => {\n if (activeTimeSelector === \"start\") {\n // Prioritise start time value. If non existent, use initial scroll time\n // If both are non existent, DropdownList will default to first option\n const startScrollTime =\n parseInput(startTimeVal) || parsedInitialStartScrollTime;\n\n return (\n <DropdownList\n listItems={startOptions}\n onSelectItem={handleStartTime}\n selectedItems={[startTimeVal]}\n topScrollItem={TimeHelper.findClosestFlooredTime(\n startScrollTime,\n startOptions\n )}\n listboxId={listboxId}\n ariaLabel={getDropdownAriaLabel()}\n disableItemFocus\n matchElementWidth\n />\n );\n } else {\n const endScrollTime =\n parseInput(endTimeVal) || parsedInitialEndScrollTime;\n\n return (\n <DropdownList\n listItems={endOptions}\n onSelectItem={handleEndTime}\n selectedItems={[endTimeVal]}\n topScrollItem={TimeHelper.findClosestFlooredTime(\n endScrollTime,\n endOptions\n )}\n listboxId={listboxId}\n ariaLabel={getDropdownAriaLabel()}\n disableItemFocus\n matchElementWidth\n />\n );\n }\n };\n\n const renderElement = () => (\n <TimeFieldContainer\n ref={nodeRef}\n $disabled={disabled}\n $error={error || !!validationError}\n $readOnly={readOnly}\n onBlur={handleBlur}\n role=\"group\"\n >\n <VisuallyHidden id={startLabelId}>Start time</VisuallyHidden>\n <VisuallyHidden id={endLabelId}>End time</VisuallyHidden>\n\n <RangeInputInnerContainer\n error={error || !!validationError}\n currentActive={\n activeTimeSelector === null ? \"none\" : activeTimeSelector\n }\n >\n {/* From */}\n <SelectorInput\n ref={startInputRef}\n onFocus={() => handleInputFocus(\"start\")}\n placeholder={\n activeTimeSelector === \"start\" ? \"hh:mm\" : \"From\"\n }\n onChange={(e) => setStartTimeVal(e.target.value)}\n value={startTimeVal}\n readOnly={readOnly}\n data-testid={\n otherProps[\"data-testid\"]\n ? `${otherProps[\"data-testid\"]}-timepicker-selector-start`\n : \"timepicker-selector-start\"\n }\n onClick={() => handleInputClick(\"start\")}\n onKeyDown={handleKeyDownEvent}\n autoComplete=\"off\"\n type=\"text\"\n role=\"combobox\"\n aria-labelledby={getInputLabelledBy(\"start\")}\n aria-describedby={getInputDescribedBy()}\n aria-expanded={\n dropdownOpen && activeTimeSelector === \"start\"\n }\n aria-controls={listboxId}\n aria-autocomplete=\"list\"\n aria-invalid={error || ariaInvalid || !!validationError}\n aria-disabled={disabled}\n aria-readonly={readOnly}\n />\n {/* To */}\n <SelectorInput\n ref={endInputRef}\n onFocus={() => handleInputFocus(\"end\")}\n placeholder={activeTimeSelector === \"end\" ? \"hh:mm\" : \"To\"}\n onChange={(e) => setEndTimeVal(e.target.value)}\n value={endTimeVal}\n readOnly={readOnly}\n data-testid={\n otherProps[\"data-testid\"]\n ? `${otherProps[\"data-testid\"]}-timepicker-selector-end`\n : \"timepicker-selector-end\"\n }\n onClick={() => handleInputClick(\"end\")}\n onKeyDown={handleKeyDownEvent}\n autoComplete=\"off\"\n type=\"text\"\n role=\"combobox\"\n aria-labelledby={getInputLabelledBy(\"end\")}\n aria-describedby={getInputDescribedBy()}\n aria-expanded={dropdownOpen && activeTimeSelector === \"end\"}\n aria-controls={listboxId}\n aria-autocomplete=\"list\"\n aria-invalid={\n error || ariaInvalid || !!validationError || undefined\n }\n aria-disabled={disabled || undefined}\n aria-readonly={readOnly || undefined}\n />\n </RangeInputInnerContainer>\n {renderClearButton()}\n </TimeFieldContainer>\n );\n\n const renderError = () =>\n // Only display internal error message if user does not provide one\n !error &&\n validationError && (\n <ErrorMessageContainer>\n <ErrorIcon aria-hidden />\n <ErrorMessage\n id={errorId}\n tabIndex={0}\n data-testid={id ? `${id}-error-message` : \"error-message\"}\n >\n {validationError}\n </ErrorMessage>\n </ErrorMessageContainer>\n );\n\n return (\n <Wrapper id={id} {...otherProps}>\n <DropdownListState>\n <ElementWithDropdown\n enabled={!readOnly && !disabled}\n isOpen={dropdownOpen}\n renderElement={renderElement}\n renderDropdown={renderDropdown}\n onClose={handleClose}\n onDismiss={handleDismiss}\n offset={8}\n alignment={alignment}\n fitAvailableHeight\n customZIndex={dropdownZIndex}\n rootNode={dropdownRootNode}\n />\n </DropdownListState>\n {renderError()}\n </Wrapper>\n );\n};\n"],"names":["_a","id","disabled","error","value","format","readOnly","onChange","onFocus","onBlur","alignment","dropdownZIndex","startLimit","endLimit","initialScrollStartTime","initialScrollEndTime","interval","dropdownRootNode","ariaLabelledBy","ariaDescribedBy","ariaInvalid","otherProps","__rest","internalId","useId","activeTimeSelector","setActiveTimeSelector","useState","dropdownOpen","setDropdownOpen","validationError","setValidationError","startTimeVal","setStartTimeVal","endTimeVal","setEndTimeVal","initialStartTimeVal","setInitialStartTimeVal","initialEndTimeVal","setInitialEndTimeVal","nodeRef","useRef","startInputRef","endInputRef","listboxId","startLabelId","endLabelId","errorId","startOptions","useMemo","TimeHelper","generateTimings","endOptions","flooredStartVal","findClosestFlooredTime","slice","indexOf","parseInput","useCallback","input","parsedInitialStartScrollTime","parsedInitialEndScrollTime","useEffect","start","end","_b","undefined","to24Hour","document","activeElement","current","getDropdownAriaLabel","getInputLabelledBy","type","concatIds","getInputDescribedBy","handleInputFocus","selector","handleInputClick","select","handleKeyDownEvent","event","code","handleStartTime","handleEndTime","blur","handleTimeChange","goToNextInput","triggerOnBlur","startInput","endInput","_c","handleClear","stopPropagation","handleBlur","target","relatedTarget","isFloatingElement","matches","call","isInsideNode","contains","renderClearButton","length","_jsx","ClearIconContainer","onClick","children","ClearIcon","_jsxs","Wrapper","Object","assign","DropdownListState","ElementWithDropdown","enabled","isOpen","renderElement","TimeFieldContainer","ref","$disabled","$error","$readOnly","role","VisuallyHidden","RangeInputInnerContainer","currentActive","SelectorInput","placeholder","e","onKeyDown","autoComplete","renderDropdown","startScrollTime","DropdownList","listItems","onSelectItem","selectedItems","topScrollItem","ariaLabel","disableItemFocus","matchElementWidth","endScrollTime","onClose","reason","onDismiss","focus","offset","fitAvailableHeight","customZIndex","rootNode","ErrorMessageContainer","ErrorIcon","ErrorMessage","tabIndex"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"combobox-picker.js","sources":["../../../../src/time-range-picker/combobox-picker/combobox-picker.tsx"],"sourcesContent":["import { OpenChangeReason } from \"@floating-ui/react\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport {\n ErrorIcon,\n ErrorMessage,\n ErrorMessageContainer,\n} from \"../../form/form-label.style\";\nimport { ClearIconContainer } from \"../../input-range-select/input-range-select.style\";\nimport { ClearIcon } from \"../../input/input.style\";\nimport { VisuallyHidden, concatIds } from \"../../shared/accessibility\";\nimport { DropdownListState } from \"../../shared/dropdown-list\";\nimport { DropdownList } from \"../../shared/dropdown-list/dropdown-list\";\nimport { ElementWithDropdown } from \"../../shared/dropdown-wrapper\";\nimport { RangeInputInnerContainer } from \"../../shared/range-input-inner-container\";\nimport { useId } from \"../../util\";\nimport { TimeHelper } from \"../../util/time-helper\";\nimport { SelectorInput, Wrapper } from \"../common.styles\";\nimport { TimeRangePickerProps, TimeRangePickerValue } from \"../types\";\nimport { TimeFieldContainer } from \"./combobox-picker.styles\";\n\ntype TimeRangeInputType = \"start\" | \"end\";\ninterface TimeChangeOptions {\n goToNextInput?: boolean | undefined;\n triggerOnBlur?: boolean | undefined;\n}\n\nexport const ComboboxPicker = ({\n id,\n disabled = false,\n error,\n value,\n format = \"12hr\",\n readOnly,\n onChange,\n onFocus,\n onBlur,\n alignment = \"left\",\n dropdownZIndex,\n startLimit,\n endLimit,\n initialScrollStartTime,\n initialScrollEndTime,\n interval = 15,\n dropdownRootNode,\n \"aria-labelledby\": ariaLabelledBy,\n \"aria-describedby\": ariaDescribedBy,\n \"aria-invalid\": ariaInvalid,\n ...otherProps\n}: TimeRangePickerProps) => {\n // =============================================================================\n // CONST, STATE, REF\n // =============================================================================\n const internalId = useId();\n const [activeTimeSelector, setActiveTimeSelector] =\n useState<TimeRangeInputType | null>(null);\n const [dropdownOpen, setDropdownOpen] = useState<boolean>(false);\n const [validationError, setValidationError] = useState<string>(\"\");\n\n const [startTimeVal, setStartTimeVal] = useState<string>(\"\");\n const [endTimeVal, setEndTimeVal] = useState<string>(\"\");\n const [initialStartTimeVal, setInitialStartTimeVal] = useState<string>(\"\");\n const [initialEndTimeVal, setInitialEndTimeVal] = useState<string>(\"\");\n\n const nodeRef = useRef<HTMLDivElement>(null);\n const startInputRef = useRef<HTMLInputElement>(null);\n const endInputRef = useRef<HTMLInputElement>(null);\n\n const listboxId = `${internalId}-listbox`;\n const startLabelId = `${internalId}-start-label`;\n const endLabelId = `${internalId}-end-label`;\n const errorId = `${internalId}-error-message`;\n\n const startOptions = useMemo(\n () =>\n TimeHelper.generateTimings(interval, format, startLimit, endLimit),\n [interval, format, startLimit, endLimit]\n );\n const endOptions = useMemo(() => {\n if (initialStartTimeVal === \"\") return startOptions;\n\n const flooredStartVal = TimeHelper.findClosestFlooredTime(\n initialStartTimeVal,\n startOptions\n );\n return flooredStartVal\n ? startOptions.slice(startOptions.indexOf(flooredStartVal))\n : [];\n }, [startOptions, initialStartTimeVal]);\n\n // =========================================================================\n // EFFECTS\n // =========================================================================\n const parseInput = useCallback(\n (input: string | undefined): string | undefined => {\n return TimeHelper.parseInput(input, format);\n },\n [format]\n );\n\n const parsedInitialStartScrollTime = useMemo(\n () => parseInput(initialScrollStartTime) ?? \"\",\n [initialScrollStartTime, parseInput]\n );\n\n const parsedInitialEndScrollTime = useMemo(\n () => parseInput(initialScrollEndTime) ?? \"\",\n [initialScrollEndTime, parseInput]\n );\n\n useEffect(() => {\n if (value) {\n const start = parseInput(value.start) ?? \"\";\n const end = parseInput(value.end) ?? \"\";\n\n setStartTimeVal(start);\n setEndTimeVal(end);\n setInitialStartTimeVal(start);\n setInitialEndTimeVal(end);\n }\n }, [value, parseInput]);\n\n // Validation for keyboard input\n useEffect(() => {\n if (error) {\n setDropdownOpen(false);\n return;\n }\n\n const start = parseInput(startTimeVal);\n const end = parseInput(endTimeVal);\n\n if (start === undefined) {\n setValidationError(\"Invalid start time\");\n } else if (end === undefined) {\n setValidationError(\"Invalid end time\");\n } else if (\n start !== \"\" &&\n end !== \"\" &&\n TimeHelper.to24Hour(end) < TimeHelper.to24Hour(start)\n ) {\n setValidationError(\"End time must be after start time\");\n } else {\n setValidationError(\"\");\n // Re-open dropdown if error was corrected\n if (\n document.activeElement === startInputRef.current ||\n document.activeElement === endInputRef.current\n ) {\n setDropdownOpen(true);\n }\n return;\n }\n\n // Hide dropdown so error message is visible\n setDropdownOpen(false);\n }, [startTimeVal, endTimeVal, parseInput, error]);\n\n // =============================================================================\n // HELPERS\n // =============================================================================\n const getDropdownAriaLabel = () => {\n if (activeTimeSelector === \"start\") {\n return \"Selecting for: Start time\";\n }\n\n if (activeTimeSelector === \"end\") {\n return \"Selecting for: End time\";\n }\n\n return undefined;\n };\n\n const getInputLabelledBy = (type: TimeRangeInputType) => {\n return concatIds(\n ariaLabelledBy,\n type === \"start\" ? startLabelId : endLabelId\n );\n };\n\n const getInputDescribedBy = () => {\n return concatIds(\n ariaDescribedBy,\n !error && validationError ? errorId : undefined\n );\n };\n\n // =============================================================================\n // EVENT HANDLERS\n // =============================================================================\n const handleInputFocus = (selector: TimeRangeInputType) => {\n if (disabled || readOnly) return;\n\n // Only run onFocus if not already focused\n if (!activeTimeSelector && !dropdownOpen) onFocus?.();\n\n setActiveTimeSelector(selector);\n setDropdownOpen(true);\n };\n\n const handleInputClick = (selector: TimeRangeInputType) => {\n if (disabled || readOnly) return;\n\n setActiveTimeSelector(selector);\n setDropdownOpen(true);\n (selector === \"start\" ? startInputRef : endInputRef).current?.select();\n };\n\n function handleKeyDownEvent(event: React.KeyboardEvent<HTMLInputElement>) {\n switch (event.code) {\n case \"Enter\":\n if (activeTimeSelector === \"start\") {\n handleStartTime(startTimeVal);\n } else if (activeTimeSelector === \"end\") {\n // Let handleBlur call handleTimeChange instead\n if (dropdownOpen) handleEndTime(endTimeVal);\n endInputRef.current?.blur();\n }\n break;\n case \"Tab\":\n handleTimeChange(startTimeVal, endTimeVal, {});\n break;\n default:\n break;\n }\n }\n\n const handleStartTime = (input: string) => {\n handleTimeChange(input, endTimeVal, { goToNextInput: true });\n };\n\n const handleEndTime = (input: string) => {\n handleTimeChange(startTimeVal, input, { triggerOnBlur: true });\n };\n\n const handleTimeChange = (\n startInput: string,\n endInput: string,\n {\n goToNextInput, // Used by handleStart to move to end input automatically\n triggerOnBlur, // Used by handleEnd/handleClear to trigger onBlur\n }: TimeChangeOptions\n ) => {\n const start = parseInput(startInput) ?? initialStartTimeVal;\n const end = parseInput(endInput) ?? initialEndTimeVal;\n\n setStartTimeVal(start);\n setEndTimeVal(end);\n\n const timeValue: TimeRangePickerValue = { start, end };\n\n // Trigger onChange if values have changed\n if (start !== initialStartTimeVal || end !== initialEndTimeVal) {\n onChange?.(timeValue);\n }\n\n // Go to end input only if start is a valid time\n if (goToNextInput && parseInput(startInput) !== undefined) {\n setActiveTimeSelector(\"end\");\n endInputRef.current?.select();\n }\n\n if (triggerOnBlur) {\n setActiveTimeSelector(null);\n setDropdownOpen(false);\n onBlur?.();\n }\n\n setInitialStartTimeVal(start);\n setInitialEndTimeVal(end);\n };\n\n const handleClear = (event: React.MouseEvent) => {\n event.stopPropagation();\n setStartTimeVal(\"\");\n setEndTimeVal(\"\");\n setInitialStartTimeVal(\"\");\n setInitialEndTimeVal(\"\");\n\n const timeValue: TimeRangePickerValue = {\n start: \"\",\n end: \"\",\n };\n\n onChange?.(timeValue);\n setActiveTimeSelector(null);\n setDropdownOpen(false);\n };\n\n const handleDismiss = () => {\n (activeTimeSelector === \"start\"\n ? startInputRef\n : endInputRef\n ).current?.focus();\n setDropdownOpen(false);\n };\n\n const handleBlur = (event: React.FocusEvent<HTMLDivElement, Element>) => {\n const target = event.relatedTarget as HTMLElement;\n\n const isFloatingElement =\n target?.matches?.(\"[data-floating-ui-focusable]\") ||\n target?.matches?.(\"[data-floating-ui-focus-guard]\");\n const isInsideNode =\n nodeRef.current && nodeRef.current.contains(target);\n\n // Condition when the calendar is closed and focus moved outside the component\n const shouldBlurWhenClosed =\n activeTimeSelector &&\n !dropdownOpen &&\n !isInsideNode &&\n !isFloatingElement;\n\n if (shouldBlurWhenClosed) {\n handleTimeChange(startTimeVal, endTimeVal, { triggerOnBlur: true });\n }\n };\n\n // NOTE: Dropdown dismissal (esc) does not trigger onClose\n const handleClose = (reason: OpenChangeReason | undefined) => {\n if (reason === \"outside-press\") {\n // No handleTimeChange to avoid duplicate call from handleBlur\n setActiveTimeSelector(null);\n setDropdownOpen(false);\n onBlur?.();\n } else {\n // Dropdown closed via exiting component (eg. tab)\n handleTimeChange(startTimeVal, endTimeVal, { triggerOnBlur: true });\n }\n };\n\n // =============================================================================\n // RENDER FUNCTIONS\n // =============================================================================\n const renderClearButton = () => {\n if (\n !readOnly &&\n !disabled &&\n (startTimeVal?.length > 0 || endTimeVal?.length > 0)\n ) {\n return (\n <ClearIconContainer\n onClick={handleClear}\n type=\"button\"\n aria-label=\"Clear\"\n >\n <ClearIcon aria-hidden />\n </ClearIconContainer>\n );\n }\n };\n\n const renderDropdown = () => {\n if (activeTimeSelector === \"start\") {\n // Prioritise start time value. If non existent, use initial scroll time\n // If both are non existent, DropdownList will default to first option\n const startScrollTime =\n parseInput(startTimeVal) || parsedInitialStartScrollTime;\n\n return (\n <DropdownList\n listItems={startOptions}\n onSelectItem={handleStartTime}\n selectedItems={[startTimeVal]}\n topScrollItem={TimeHelper.findClosestFlooredTime(\n startScrollTime,\n startOptions\n )}\n listboxId={listboxId}\n ariaLabel={getDropdownAriaLabel()}\n disableItemFocus\n matchElementWidth\n />\n );\n } else {\n const endScrollTime =\n parseInput(endTimeVal) || parsedInitialEndScrollTime;\n\n return (\n <DropdownList\n listItems={endOptions}\n onSelectItem={handleEndTime}\n selectedItems={[endTimeVal]}\n topScrollItem={TimeHelper.findClosestFlooredTime(\n endScrollTime,\n endOptions\n )}\n listboxId={listboxId}\n ariaLabel={getDropdownAriaLabel()}\n disableItemFocus\n matchElementWidth\n />\n );\n }\n };\n\n const renderElement = () => (\n <TimeFieldContainer\n ref={nodeRef}\n $disabled={disabled}\n $error={error || !!validationError}\n $readOnly={readOnly}\n onBlur={handleBlur}\n role=\"group\"\n >\n <VisuallyHidden id={startLabelId}>Start time</VisuallyHidden>\n <VisuallyHidden id={endLabelId}>End time</VisuallyHidden>\n\n <RangeInputInnerContainer\n error={error || !!validationError}\n currentActive={\n activeTimeSelector === null ? \"none\" : activeTimeSelector\n }\n >\n {/* From */}\n <SelectorInput\n ref={startInputRef}\n onFocus={() => handleInputFocus(\"start\")}\n placeholder={\n activeTimeSelector === \"start\" ? \"hh:mm\" : \"From\"\n }\n onChange={(e) => setStartTimeVal(e.target.value)}\n value={startTimeVal}\n readOnly={readOnly || disabled}\n data-testid={\n otherProps[\"data-testid\"]\n ? `${otherProps[\"data-testid\"]}-timepicker-selector-start`\n : \"timepicker-selector-start\"\n }\n onClick={() => handleInputClick(\"start\")}\n onKeyDown={handleKeyDownEvent}\n autoComplete=\"off\"\n type=\"text\"\n role=\"combobox\"\n aria-labelledby={getInputLabelledBy(\"start\")}\n aria-describedby={getInputDescribedBy()}\n aria-expanded={\n dropdownOpen && activeTimeSelector === \"start\"\n }\n aria-controls={listboxId}\n aria-autocomplete=\"list\"\n aria-invalid={error || ariaInvalid || !!validationError}\n aria-disabled={disabled}\n aria-readonly={readOnly}\n $disabled={disabled}\n />\n {/* To */}\n <SelectorInput\n ref={endInputRef}\n onFocus={() => handleInputFocus(\"end\")}\n placeholder={activeTimeSelector === \"end\" ? \"hh:mm\" : \"To\"}\n onChange={(e) => setEndTimeVal(e.target.value)}\n value={endTimeVal}\n readOnly={readOnly || disabled}\n data-testid={\n otherProps[\"data-testid\"]\n ? `${otherProps[\"data-testid\"]}-timepicker-selector-end`\n : \"timepicker-selector-end\"\n }\n onClick={() => handleInputClick(\"end\")}\n onKeyDown={handleKeyDownEvent}\n autoComplete=\"off\"\n type=\"text\"\n role=\"combobox\"\n aria-labelledby={getInputLabelledBy(\"end\")}\n aria-describedby={getInputDescribedBy()}\n aria-expanded={dropdownOpen && activeTimeSelector === \"end\"}\n aria-controls={listboxId}\n aria-autocomplete=\"list\"\n aria-invalid={\n error || ariaInvalid || !!validationError || undefined\n }\n aria-disabled={disabled || undefined}\n aria-readonly={readOnly || undefined}\n $disabled={disabled}\n />\n </RangeInputInnerContainer>\n {renderClearButton()}\n </TimeFieldContainer>\n );\n\n const renderError = () =>\n // Only display internal error message if user does not provide one\n !error &&\n validationError && (\n <ErrorMessageContainer>\n <ErrorIcon aria-hidden />\n <ErrorMessage\n id={errorId}\n tabIndex={0}\n data-testid={id ? `${id}-error-message` : \"error-message\"}\n >\n {validationError}\n </ErrorMessage>\n </ErrorMessageContainer>\n );\n\n return (\n <Wrapper id={id} {...otherProps}>\n <DropdownListState>\n <ElementWithDropdown\n enabled={!readOnly && !disabled}\n isOpen={dropdownOpen}\n renderElement={renderElement}\n renderDropdown={renderDropdown}\n onClose={handleClose}\n onDismiss={handleDismiss}\n offset={8}\n alignment={alignment}\n fitAvailableHeight\n customZIndex={dropdownZIndex}\n rootNode={dropdownRootNode}\n />\n </DropdownListState>\n {renderError()}\n </Wrapper>\n );\n};\n"],"names":["_a","id","disabled","error","value","format","readOnly","onChange","onFocus","onBlur","alignment","dropdownZIndex","startLimit","endLimit","initialScrollStartTime","initialScrollEndTime","interval","dropdownRootNode","ariaLabelledBy","ariaDescribedBy","ariaInvalid","otherProps","__rest","internalId","useId","activeTimeSelector","setActiveTimeSelector","useState","dropdownOpen","setDropdownOpen","validationError","setValidationError","startTimeVal","setStartTimeVal","endTimeVal","setEndTimeVal","initialStartTimeVal","setInitialStartTimeVal","initialEndTimeVal","setInitialEndTimeVal","nodeRef","useRef","startInputRef","endInputRef","listboxId","startLabelId","endLabelId","errorId","startOptions","useMemo","TimeHelper","generateTimings","endOptions","flooredStartVal","findClosestFlooredTime","slice","indexOf","parseInput","useCallback","input","parsedInitialStartScrollTime","parsedInitialEndScrollTime","useEffect","start","end","_b","undefined","to24Hour","document","activeElement","current","getDropdownAriaLabel","getInputLabelledBy","type","concatIds","getInputDescribedBy","handleInputFocus","selector","handleInputClick","select","handleKeyDownEvent","event","code","handleStartTime","handleEndTime","blur","handleTimeChange","goToNextInput","triggerOnBlur","startInput","endInput","_c","handleClear","stopPropagation","handleBlur","target","relatedTarget","isFloatingElement","matches","call","isInsideNode","contains","renderClearButton","length","_jsx","ClearIconContainer","onClick","children","ClearIcon","_jsxs","Wrapper","Object","assign","DropdownListState","ElementWithDropdown","enabled","isOpen","renderElement","TimeFieldContainer","ref","$error","$readOnly","role","VisuallyHidden","RangeInputInnerContainer","currentActive","SelectorInput","placeholder","e","onKeyDown","autoComplete","$disabled","renderDropdown","startScrollTime","DropdownList","listItems","onSelectItem","selectedItems","topScrollItem","ariaLabel","disableItemFocus","matchElementWidth","endScrollTime","onClose","reason","onDismiss","focus","offset","fitAvailableHeight","customZIndex","rootNode","ErrorMessageContainer","ErrorIcon","ErrorMessage","tabIndex"],"mappings":"g3DA0B+BA,QAAAC,GAC3BA,EAAEC,SACFA,GAAW,EAAKC,MAChBA,EAAKC,MACLA,EAAKC,OACLA,EAAS,OAAMC,SACfA,EAAQC,SACRA,EAAQC,QACRA,EAAOC,OACPA,EAAMC,UACNA,EAAY,OAAMC,eAClBA,EAAcC,WACdA,EAAUC,SACVA,EAAQC,uBACRA,EAAsBC,qBACtBA,EAAoBC,SACpBA,EAAW,GAAEC,iBACbA,EACA,kBAAmBC,EACnB,mBAAoBC,EACpB,eAAgBC,GAAWpB,EACxBqB,EAAUC,EAAAA,OAAAtB,EArBc,CAAA,KAAA,WAAA,QAAA,QAAA,SAAA,WAAA,WAAA,UAAA,SAAA,YAAA,iBAAA,aAAA,WAAA,yBAAA,uBAAA,WAAA,mBAAA,kBAAA,mBAAA,iBA0B3B,MAAMuB,EAAaC,EAAAA,SACZC,EAAoBC,GACvBC,EAAAA,SAAoC,OACjCC,EAAcC,GAAmBF,EAAAA,UAAkB,IACnDG,EAAiBC,GAAsBJ,EAAAA,SAAiB,KAExDK,EAAcC,GAAmBN,EAAAA,SAAiB,KAClDO,EAAYC,GAAiBR,EAAAA,SAAiB,KAC9CS,EAAqBC,GAA0BV,EAAAA,SAAiB,KAChEW,EAAmBC,GAAwBZ,EAAAA,SAAiB,IAE7Da,EAAUC,EAAAA,OAAuB,MACjCC,EAAgBD,EAAAA,OAAyB,MACzCE,GAAcF,EAAAA,OAAyB,MAEvCG,GAAY,GAAGrB,YACfsB,GAAe,GAAGtB,gBAClBuB,GAAa,GAAGvB,cAChBwB,GAAU,GAAGxB,kBAEbyB,GAAeC,EAAAA,SACjB,IACIC,EAAAA,WAAWC,gBAAgBnC,EAAUX,EAAQO,EAAYC,IAC7D,CAACG,EAAUX,EAAQO,EAAYC,IAE7BuC,GAAaH,EAAAA,SAAQ,KACvB,GAA4B,KAAxBb,EAA4B,OAAOY,GAEvC,MAAMK,EAAkBH,EAAAA,WAAWI,uBAC/BlB,EACAY,IAEJ,OAAOK,EACDL,GAAaO,MAAMP,GAAaQ,QAAQH,IACxC,EAAE,GACT,CAACL,GAAcZ,IAKZqB,GAAaC,eACdC,GACUT,aAAWO,WAAWE,EAAOtD,IAExC,CAACA,IAGCuD,GAA+BX,EAAAA,SACjC,KAAK,IAAAjD,EAAC,OAAkC,QAAlCA,EAAAyD,GAAW3C,UAAuB,IAAAd,EAAAA,EAAI,EAAE,GAC9C,CAACc,EAAwB2C,KAGvBI,GAA6BZ,EAAAA,SAC/B,KAAK,IAAAjD,EAAC,OAAgC,QAAhCA,EAAAyD,GAAW1C,UAAqB,IAAAf,EAAAA,EAAI,EAAE,GAC5C,CAACe,EAAsB0C,KAG3BK,EAAAA,WAAU,aACN,GAAI1D,EAAO,CACP,MAAM2D,EAA+B,QAAvB/D,EAAAyD,GAAWrD,EAAM2D,cAAM,IAAA/D,EAAAA,EAAI,GACnCgE,EAA2B,QAArBC,EAAAR,GAAWrD,EAAM4D,YAAI,IAAAC,EAAAA,EAAI,GAErChC,EAAgB8B,GAChB5B,EAAc6B,GACd3B,EAAuB0B,GACvBxB,EAAqByB,EACzB,IACD,CAAC5D,EAAOqD,KAGXK,EAAAA,WAAU,KACN,GAAI3D,EAEA,YADA0B,GAAgB,GAIpB,MAAMkC,EAAQN,GAAWzB,GACnBgC,EAAMP,GAAWvB,GAEvB,QAAcgC,IAAVH,EACAhC,EAAmB,2BAChB,QAAYmC,IAARF,EACPjC,EAAmB,wBAChB,MACO,KAAVgC,GACQ,KAARC,GACAd,EAAAA,WAAWiB,SAASH,GAAOd,EAAAA,WAAWiB,SAASJ,IAY/C,OARAhC,EAAmB,SAGfqC,SAASC,gBAAkB3B,EAAc4B,SACzCF,SAASC,gBAAkB1B,GAAY2B,SAEvCzC,GAAgB,IARpBE,EAAmB,oCAWvB,CAGAF,GAAgB,EAAM,GACvB,CAACG,EAAcE,EAAYuB,GAAYtD,IAK1C,MAAMoE,GAAuB,IACE,UAAvB9C,EACO,4BAGgB,QAAvBA,EACO,+BADX,EAOE+C,GAAsBC,GACjBC,EAAAA,UACHxD,EACS,UAATuD,EAAmB5B,GAAeC,IAIpC6B,GAAsB,IACjBD,EAAAA,UACHvD,GACChB,GAAS2B,EAAkBiB,QAAUmB,GAOxCU,GAAoBC,IAClB3E,GAAYI,IAGXmB,GAAuBG,GAAcpB,SAAAA,IAE1CkB,EAAsBmD,GACtBhD,GAAgB,GAAK,EAGnBiD,GAAoBD,UAClB3E,GAAYI,IAEhBoB,EAAsBmD,GACtBhD,GAAgB,GAC4C,QAA5D7B,GAAc,UAAb6E,EAAuBnC,EAAgBC,IAAa2B,eAAO,IAAAtE,GAAAA,EAAE+E,SAAQ,EAG1E,SAASC,GAAmBC,SACxB,OAAQA,EAAMC,MACV,IAAK,QAC0B,UAAvBzD,EACA0D,GAAgBnD,GACc,QAAvBP,IAEHG,GAAcwD,GAAclD,GACb,QAAnBlC,EAAA2C,GAAY2B,eAAO,IAAAtE,GAAAA,EAAEqF,QAEzB,MACJ,IAAK,MACDC,GAAiBtD,EAAcE,EAAY,IAKvD,CAEA,MAAMiD,GAAmBxB,IACrB2B,GAAiB3B,EAAOzB,EAAY,CAAEqD,eAAe,GAAO,EAG1DH,GAAiBzB,IACnB2B,GAAiBtD,EAAc2B,EAAO,CAAE6B,eAAe,GAAO,EAG5DF,GAAmB,CACrBG,EACAC,GAEIH,gBACAC,8BAGJ,MAAMzB,EAA8B,QAAtB/D,EAAAyD,GAAWgC,UAAW,IAAAzF,EAAAA,EAAIoC,EAClC4B,EAA0B,QAApBC,EAAAR,GAAWiC,UAAS,IAAAzB,EAAAA,EAAI3B,EAEpCL,EAAgB8B,GAChB5B,EAAc6B,GAKVD,IAAU3B,GAAuB4B,IAAQ1B,GACzC/B,SAAAA,EAJoC,CAAEwD,QAAOC,QAQ7CuB,QAA4CrB,IAA3BT,GAAWgC,KAC5B/D,EAAsB,OACH,QAAnBiE,EAAAhD,GAAY2B,eAAO,IAAAqB,GAAAA,EAAEZ,UAGrBS,IACA9D,EAAsB,MACtBG,GAAgB,GAChBpB,SAAAA,KAGJ4B,EAAuB0B,GACvBxB,EAAqByB,EAAI,EAGvB4B,GAAeX,IACjBA,EAAMY,kBACN5D,EAAgB,IAChBE,EAAc,IACdE,EAAuB,IACvBE,EAAqB,IAOrBhC,SAAAA,EALwC,CACpCwD,MAAO,GACPC,IAAK,KAITtC,EAAsB,MACtBG,GAAgB,EAAM,EAWpBiE,GAAcb,YAChB,MAAMc,EAASd,EAAMe,cAEfC,GACa,QAAfjG,EAAA+F,aAAM,EAANA,EAAQG,eAAO,IAAAlG,OAAA,EAAAA,EAAAmG,KAAAJ,EAAG,mCACH,QAAf9B,EAAA8B,aAAM,EAANA,EAAQG,eAAO,IAAAjC,OAAA,EAAAA,EAAAkC,KAAAJ,EAAG,mCAChBK,EACF5D,EAAQ8B,SAAW9B,EAAQ8B,QAAQ+B,SAASN,GAI5CtE,IACCG,IACAwE,IACAH,GAGDX,GAAiBtD,EAAcE,EAAY,CAAEsD,eAAe,GAChE,EAmBEc,GAAoB,KACtB,IACKhG,IACAJ,KACA8B,eAAAA,EAAcuE,QAAS,IAAKrE,aAAU,EAAVA,EAAYqE,QAAS,GAElD,OACIC,EAAAA,IAACC,EAAAA,oBACGC,QAASd,GACTnB,KAAK,SAAQ,aACF,QAAOkC,SAElBH,EAAAA,IAACI,EAAAA,UAAS,CAAA,eAAA,KAGtB,EAoJJ,OACIC,EAAAA,KAACC,UAAOC,OAAAC,OAAA,CAAC/G,GAAIA,GAAQoB,EAAU,CAAAsF,SAAA,CAC3BH,MAACS,EAAAA,kBAAiB,CAAAN,SACdH,EAAAA,IAACU,sBAAmB,CAChBC,SAAU7G,IAAaJ,EACvBkH,OAAQxF,EACRyF,cA3GM,IAClBR,OAACS,EAAAA,mBAAkB,CACfC,IAAK/E,YACMtC,EAAQsH,OACXrH,KAAW2B,EAAe2F,UACvBnH,EACXG,OAAQqF,GACR4B,KAAK,QAAOf,SAAA,CAEZH,EAAAA,IAACmB,iBAAc,CAAC1H,GAAI4C,GAAY8D,SAAA,eAChCH,EAAAA,IAACmB,iBAAc,CAAC1H,GAAI6C,GAAU6D,SAAA,aAE9BE,EAAAA,KAACe,2BAAwB,CACrBzH,MAAOA,KAAW2B,EAClB+F,cAC2B,OAAvBpG,EAA8B,OAASA,EAAkBkF,SAAA,CAI7DH,MAACsB,EAAAA,cAAa,CACVP,IAAK7E,EACLlC,QAAS,IAAMoE,GAAiB,SAChCmD,YAC2B,UAAvBtG,EAAiC,QAAU,OAE/ClB,SAAWyH,GAAM/F,EAAgB+F,EAAEjC,OAAO3F,OAC1CA,MAAO4B,EACP1B,SAAUA,GAAYJ,EAAQ,cAE1BmB,EAAW,eACL,GAAGA,EAAW,2CACd,4BAEVqF,QAAS,IAAM5B,GAAiB,SAChCmD,UAAWjD,GACXkD,aAAa,MACbzD,KAAK,OACLiD,KAAK,WAAU,kBACElD,GAAmB,SAAQ,mBAC1BG,KAAqB,gBAEnC/C,GAAuC,UAAvBH,EAA8B,gBAEnCmB,GAAS,oBACN,OAAM,eACVzC,GAASiB,KAAiBU,EAAe,gBACxC5B,EAAQ,gBACRI,EAAQ6H,UACZjI,IAGfsG,EAAAA,IAACsB,gBAAa,CACVP,IAAK5E,GACLnC,QAAS,IAAMoE,GAAiB,OAChCmD,YAAoC,QAAvBtG,EAA+B,QAAU,KACtDlB,SAAWyH,GAAM7F,EAAc6F,EAAEjC,OAAO3F,OACxCA,MAAO8B,EACP5B,SAAUA,GAAYJ,EAAQ,cAE1BmB,EAAW,eACL,GAAGA,EAAW,yCACd,0BAEVqF,QAAS,IAAM5B,GAAiB,OAChCmD,UAAWjD,GACXkD,aAAa,MACbzD,KAAK,OACLiD,KAAK,6BACYlD,GAAmB,0BAClBG,KAAqB,gBACxB/C,GAAuC,QAAvBH,kBAChBmB,GAAS,oBACN,OAAM,eAEpBzC,GAASiB,KAAiBU,QAAmBoC,EAAS,gBAE3ChE,QAAYgE,EAAS,gBACrB5D,QAAY4D,EAASiE,UACzBjI,OAGlBoG,QA2BO8B,eAxJO,KACnB,GAA2B,UAAvB3G,EAAgC,CAGhC,MAAM4G,EACF5E,GAAWzB,IAAiB4B,GAEhC,OACI4C,MAAC8B,EAAAA,cACGC,UAAWvF,GACXwF,aAAcrD,GACdsD,cAAe,CAACzG,GAChB0G,cAAexF,EAAAA,WAAWI,uBACtB+E,EACArF,IAEJJ,UAAWA,GACX+F,UAAWpE,KACXqE,oBACAC,mBAAiB,GAG7B,CAAO,CACH,MAAMC,EACFrF,GAAWvB,IAAe2B,GAE9B,OACI2C,MAAC8B,EAAAA,cACGC,UAAWnF,GACXoF,aAAcpD,GACdqD,cAAe,CAACvG,GAChBwG,cAAexF,EAAAA,WAAWI,uBACtBwF,EACA1F,IAEJR,UAAWA,GACX+F,UAAWpE,KACXqE,oBACAC,mBAAiB,GAG7B,GAgHYE,QA1LKC,IACF,kBAAXA,GAEAtH,EAAsB,MACtBG,GAAgB,GAChBpB,SAAAA,KAGA6E,GAAiBtD,EAAcE,EAAY,CAAEsD,eAAe,GAChE,EAkLYyD,UAzNM,WAIT,QAHTjJ,GAAwB,UAAvByB,EACKiB,EACAC,IACJ2B,eAAO,IAAAtE,GAAAA,EAAEkJ,QACXrH,GAAgB,EAAM,EAqNVsH,OAAQ,EACRzI,UAAWA,EACX0I,oBAAkB,EAClBC,aAAc1I,EACd2I,SAAUrI,OA5BrBd,GACD2B,GACI+E,EAAAA,KAAC0C,EAAAA,sBAAqB,CAAA5C,SAAA,CAClBH,EAAAA,IAACgD,YAAS,CAAA,eAAA,IACVhD,EAAAA,IAACiD,EAAAA,aAAY,CACTxJ,GAAI8C,GACJ2G,SAAU,EAAC,cACEzJ,EAAK,GAAGA,kBAAqB,gBAAe0G,SAExD7E,UAuBH"}
|
|
@@ -1,11 +1,15 @@
|
|
|
1
1
|
"use strict";var e=require("styled-components"),t=require("../shared/input-wrapper/input-wrapper.js"),r=require("../theme/index.js");function p(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var i=p(e);const a=i.default.div`
|
|
2
2
|
position: relative;
|
|
3
|
-
`,
|
|
3
|
+
`,o=i.default(t.InputWrapper)`
|
|
4
4
|
height: 3rem;
|
|
5
5
|
gap: ${r.Spacing["spacing-8"]};
|
|
6
|
-
`,
|
|
6
|
+
`,s=i.default(t.BasicInput)`
|
|
7
7
|
display: block;
|
|
8
8
|
width: 100%;
|
|
9
9
|
flex: 1;
|
|
10
|
-
|
|
10
|
+
${t=>t.$disabled&&e.css`
|
|
11
|
+
color: ${r.Colour["text-subtler"]};
|
|
12
|
+
cursor: not-allowed;
|
|
13
|
+
`}
|
|
14
|
+
`;exports.SelectorInput=s,exports.TimeContainer=o,exports.Wrapper=a;
|
|
11
15
|
//# sourceMappingURL=common.styles.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"common.styles.js","sources":["../../../src/time-range-picker/common.styles.tsx"],"sourcesContent":["import styled from \"styled-components\";\nimport {\n BasicInput,\n InputWrapper,\n} from \"../shared/input-wrapper/input-wrapper\";\nimport { Spacing } from \"../theme\";\n\n// =============================================================================\n// STYLING\n// =============================================================================\nexport const Wrapper = styled.div`\n position: relative;\n`;\n\nexport const TimeContainer = styled(InputWrapper)`\n height: 3rem;\n gap: ${Spacing[\"spacing-8\"]};\n`;\n\nexport const SelectorInput = styled(BasicInput)
|
|
1
|
+
{"version":3,"file":"common.styles.js","sources":["../../../src/time-range-picker/common.styles.tsx"],"sourcesContent":["import styled, { css } from \"styled-components\";\nimport {\n BasicInput,\n InputWrapper,\n} from \"../shared/input-wrapper/input-wrapper\";\nimport { Colour, Spacing } from \"../theme\";\n\n// =============================================================================\n// STYLING\n// =============================================================================\nexport const Wrapper = styled.div`\n position: relative;\n`;\n\nexport const TimeContainer = styled(InputWrapper)`\n height: 3rem;\n gap: ${Spacing[\"spacing-8\"]};\n`;\n\nexport const SelectorInput = styled(BasicInput)<{\n $disabled?: boolean | undefined;\n}>`\n display: block;\n width: 100%;\n flex: 1;\n ${(props) =>\n props.$disabled &&\n css`\n color: ${Colour[\"text-subtler\"]};\n cursor: not-allowed;\n `}\n`;\n"],"names":["Wrapper","styled","div","TimeContainer","InputWrapper","Spacing","SelectorInput","BasicInput","props","$disabled","css","Colour"],"mappings":"wNAUO,MAAMA,EAAUC,EAAAA,QAAOC,GAAG;;EAIpBC,EAAgBF,EAAAA,QAAOG,EAAAA,aAAa;;WAEtCC,EAAAA,QAAQ;EAGNC,EAAgBL,EAAAA,QAAOM,EAAAA,WAElC;;;;MAIKC,GACCA,EAAMC,WACNC,KAAG;qBACUC,EAAAA,OAAO;;;"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var e=require("../../_virtual/_tslib.js"),r=require("react/jsx-runtime"),a=require("react"),i=require("../../shared/accessibility/index.js"),t=require("../../shared/dropdown-wrapper/element-with-dropdown.js"),n=require("../../shared/range-input-inner-container/range-input-inner-container.js"),
|
|
1
|
+
"use strict";var e=require("../../_virtual/_tslib.js"),r=require("react/jsx-runtime"),a=require("react"),i=require("../../shared/accessibility/index.js"),t=require("../../shared/dropdown-wrapper/element-with-dropdown.js"),n=require("../../shared/range-input-inner-container/range-input-inner-container.js"),l=require("../../shared/timepicker-dropdown/timepicker-dropdown.js");require("../../util/calendar-helper.js"),require("../../util/date-helper.js"),require("../../util/date-input-helper.js");var o=require("../../util/simple-id-generator.js");require("../../util/string-helper.js"),require("@react-aria/live-announcer");var d=require("../../util/time-helper.js"),s=require("../common.styles.js");exports.DialPicker=u=>{var{id:c,disabled:p=!1,error:m,value:v,format:b="24hr",readOnly:g,onChange:f,onFocus:h,onBlur:j,alignment:y="left",dropdownZIndex:x,dropdownRootNode:k,"aria-labelledby":w,"aria-describedby":q,"aria-invalid":F}=u,$=e.__rest(u,["id","disabled","error","value","format","readOnly","onChange","onFocus","onBlur","alignment","dropdownZIndex","dropdownRootNode","aria-labelledby","aria-describedby","aria-invalid"]);const[C,I]=a.useState(!1),[S,T]=a.useState("none"),[D,O]=a.useState(""),[R,B]=a.useState(""),[E,_]=a.useState(!1),N=!g&&!p,Z=a.useRef(null),H=o.useId(),P=`${H}-start-label`,V=`${H}-end-label`,W=e=>i.concatIds(w,"start"===e?P:V),A=()=>i.concatIds(q);a.useEffect((()=>{v&&(O(v.start),B(v.end))}),[v]);const z=e=>{N&&(E||C||null==h||h(),_(!0),T(e),I(!0))},G=e=>{var r,a;const i=!!(null==e?void 0:e.keepFocus),t=null!==(r=null==e?void 0:e.triggerBlur)&&void 0!==r?r:!i;I(!1),T("none"),_(i),t&&(null==j||j()),i&&(null===(a=Z.current)||void 0===a||a.focus())},J=e=>{var r,a,i;if(!E||C)return;const t=e.relatedTarget,n=(null===(r=null==t?void 0:t.matches)||void 0===r?void 0:r.call(t,"[data-floating-ui-focusable]"))||(null===(a=null==t?void 0:t.matches)||void 0===a?void 0:a.call(t,"[data-floating-ui-focus-guard]"));!(!t||!(null===(i=Z.current)||void 0===i?void 0:i.contains(t)))||n||(_(!1),null==j||j())},K=e=>{O(e),null==f||f({start:e,end:R}),T("end"),I(!0),_(!0)},L=e=>{B(e),null==f||f({start:D,end:e}),""===D?(T("start"),I(!0),_(!0)):G({keepFocus:!0})};return r.jsx(s.Wrapper,Object.assign({id:c},$,{children:r.jsx(t.ElementWithDropdown,{enabled:N,isOpen:C,renderElement:()=>r.jsx(s.TimeContainer,{ref:Z,tabIndex:-1,onBlur:J,"data-testid":"timepicker-container",role:"group",$disabled:p,$error:m,$readOnly:g,$focused:E,children:r.jsxs(n.RangeInputInnerContainer,{error:m,currentActive:S,children:[r.jsx(s.SelectorInput,{onFocus:()=>z("start"),onClick:()=>z("start"),readOnly:!0,placeholder:"From",value:d.TimeHelper.formatDisplayValue(D,b),"data-testid":$["data-testid"]?`${$["data-testid"]}-timepicker-selector-from`:"timepicker-selector-from",role:"combobox","aria-expanded":!p&&!g&&C,"aria-invalid":m||F,"aria-disabled":p,"aria-readonly":g,"aria-labelledby":W("start"),"aria-describedby":A(),$disabled:p}),r.jsx(s.SelectorInput,{onClick:()=>z("end"),readOnly:!0,placeholder:"To",value:d.TimeHelper.formatDisplayValue(R,b),"data-testid":$["data-testid"]?`${$["data-testid"]}-timepicker-selector-to`:"timepicker-selector-to",role:"combobox","aria-expanded":!p&&!g&&C,"aria-invalid":m||F||void 0,"aria-disabled":p||void 0,"aria-readonly":g||void 0,"aria-labelledby":W("end"),"aria-describedby":A(),$disabled:p})]})}),renderDropdown:({styles:e,setFloatingRef:a,getFloatingProps:i})=>C?r.jsxs("div",Object.assign({ref:a,style:e,role:"dialog","aria-label":"start"===S?"Selecting for: Start time":"end"===S?"Selecting for: End time":void 0},i(),{children:["start"===S&&r.jsx(l.TimepickerDropdown,{id:c?`${c}-start`:void 0,show:!0,value:D,format:b,onCancel:()=>G({keepFocus:!0}),onChange:K}),"end"===S&&r.jsx(l.TimepickerDropdown,{id:c?`${c}-end`:void 0,show:!0,value:R,format:b,onCancel:()=>G({keepFocus:!1}),onChange:L})]}),S):null,onClose:()=>G({keepFocus:!1}),onDismiss:()=>G({keepFocus:!0}),clickToToggle:!1,offset:8,alignment:y,customZIndex:x,rootNode:k})}))};
|
|
2
2
|
//# sourceMappingURL=dial-picker.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dial-picker.js","sources":["../../../../src/time-range-picker/dial-picker/dial-picker.tsx"],"sourcesContent":["import { useEffect, useRef, useState } from \"react\";\nimport { concatIds } from \"../../shared/accessibility\";\nimport {\n DropdownRenderProps,\n ElementWithDropdown,\n} from \"../../shared/dropdown-wrapper\";\nimport { RangeInputInnerContainer } from \"../../shared/range-input-inner-container\";\nimport { TimepickerDropdown } from \"../../shared/timepicker-dropdown/timepicker-dropdown\";\nimport { useId } from \"../../util\";\nimport { TimeHelper } from \"../../util/time-helper\";\nimport { SelectorInput, TimeContainer, Wrapper } from \"../common.styles\";\nimport { TimeRangePickerProps, TimeRangePickerValue } from \"../types\";\n\ntype Active = \"start\" | \"end\" | \"none\";\n\nexport const DialPicker = ({\n id,\n disabled = false,\n error,\n value,\n format = \"24hr\",\n readOnly,\n onChange,\n onFocus,\n onBlur,\n alignment = \"left\",\n dropdownZIndex,\n dropdownRootNode,\n \"aria-labelledby\": ariaLabelledBy,\n \"aria-describedby\": ariaDescribedBy,\n \"aria-invalid\": ariaInvalid,\n ...otherProps\n}: TimeRangePickerProps) => {\n // =============================================================================\n // CONST, STATE, REF\n // =============================================================================\n const [isOpen, setIsOpen] = useState(false);\n const [active, setActive] = useState<Active>(\"none\");\n const [startTimeVal, setStartTimeVal] = useState(\"\");\n const [endTimeVal, setEndTimeVal] = useState(\"\");\n const [focused, setFocused] = useState(false);\n\n const enabled = !readOnly && !disabled;\n const nodeRef = useRef<HTMLDivElement>(null);\n const internalId = useId();\n const startLabelId = `${internalId}-start-label`;\n const endLabelId = `${internalId}-end-label`;\n\n // =============================================================================\n // HELPER FUNCTIONS\n // =============================================================================\n const getDropdownAriaLabel = () => {\n if (active === \"start\") {\n return \"Selecting for: Start time\";\n }\n\n if (active === \"end\") {\n return \"Selecting for: End time\";\n }\n\n return undefined;\n };\n\n const getInputLabelledBy = (type: Exclude<Active, \"none\">) => {\n return concatIds(\n ariaLabelledBy,\n type === \"start\" ? startLabelId : endLabelId\n );\n };\n\n const getInputDescribedBy = () => {\n return concatIds(ariaDescribedBy);\n };\n // =============================================================================\n // EFFECTS\n // =============================================================================\n useEffect(() => {\n if (value) {\n setStartTimeVal(value.start);\n setEndTimeVal(value.end);\n }\n }, [value]);\n\n // =============================================================================\n // EVENT HANDLERS\n // =============================================================================\n const handleOpen = (next: Exclude<Active, \"none\">) => {\n if (!enabled) return;\n if (!focused && !isOpen) onFocus?.();\n setFocused(true);\n setActive(next);\n setIsOpen(true);\n };\n\n const handleClose = (opts?: {\n keepFocus?: boolean;\n triggerBlur?: boolean;\n }) => {\n const keepFocus = !!opts?.keepFocus;\n const triggerBlur = opts?.triggerBlur ?? !keepFocus;\n\n setIsOpen(false);\n setActive(\"none\");\n setFocused(keepFocus);\n\n if (triggerBlur) onBlur?.();\n\n if (keepFocus) nodeRef.current?.focus();\n };\n\n const handleContainerBlur = (\n event: React.FocusEvent<HTMLDivElement, Element>\n ) => {\n if (!focused || isOpen) return;\n\n const target = event.relatedTarget as HTMLElement | null;\n\n const isFloatingElement =\n target?.matches?.(\"[data-floating-ui-focusable]\") ||\n target?.matches?.(\"[data-floating-ui-focus-guard]\");\n const isInsideNode = !!(target && nodeRef.current?.contains(target));\n\n if (!isInsideNode && !isFloatingElement) {\n setFocused(false);\n onBlur?.();\n }\n };\n\n const handleStartTime = (value: string) => {\n setStartTimeVal(value);\n onChange?.({ start: value, end: endTimeVal } as TimeRangePickerValue);\n\n setActive(\"end\");\n setIsOpen(true);\n setFocused(true);\n };\n\n const handleEndTime = (value: string) => {\n setEndTimeVal(value);\n onChange?.({ start: startTimeVal, end: value } as TimeRangePickerValue);\n\n if (startTimeVal === \"\") {\n setActive(\"start\");\n setIsOpen(true);\n setFocused(true);\n } else {\n handleClose({ keepFocus: true });\n }\n };\n\n const renderElement = () => (\n <TimeContainer\n ref={nodeRef}\n tabIndex={-1}\n onBlur={handleContainerBlur}\n data-testid=\"timepicker-container\"\n role=\"group\"\n $disabled={disabled}\n $error={error}\n $readOnly={readOnly}\n $focused={focused}\n >\n <RangeInputInnerContainer error={error} currentActive={active}>\n <SelectorInput\n onFocus={() => handleOpen(\"start\")}\n onClick={() => handleOpen(\"start\")}\n readOnly\n placeholder=\"From\"\n value={TimeHelper.formatDisplayValue(startTimeVal, format)}\n data-testid={\n otherProps[\"data-testid\"]\n ? `${otherProps[\"data-testid\"]}-timepicker-selector-from`\n : \"timepicker-selector-from\"\n }\n role=\"combobox\"\n aria-expanded={!disabled && !readOnly ? isOpen : false}\n aria-invalid={error || ariaInvalid}\n aria-disabled={disabled}\n aria-readonly={readOnly}\n aria-labelledby={getInputLabelledBy(\"start\")}\n aria-describedby={getInputDescribedBy()}\n />\n <SelectorInput\n onClick={() => handleOpen(\"end\")}\n readOnly\n placeholder=\"To\"\n value={TimeHelper.formatDisplayValue(endTimeVal, format)}\n data-testid={\n otherProps[\"data-testid\"]\n ? `${otherProps[\"data-testid\"]}-timepicker-selector-to`\n : \"timepicker-selector-to\"\n }\n role=\"combobox\"\n aria-expanded={!disabled && !readOnly ? isOpen : false}\n aria-invalid={error || ariaInvalid || undefined}\n aria-disabled={disabled || undefined}\n aria-readonly={readOnly || undefined}\n aria-labelledby={getInputLabelledBy(\"end\")}\n aria-describedby={getInputDescribedBy()}\n />\n </RangeInputInnerContainer>\n </TimeContainer>\n );\n\n const renderDropdown = ({\n styles,\n setFloatingRef,\n getFloatingProps,\n }: DropdownRenderProps) => {\n if (!isOpen) return null;\n\n return (\n <div\n ref={setFloatingRef}\n style={styles}\n role=\"dialog\"\n key={active}\n aria-label={getDropdownAriaLabel()}\n {...getFloatingProps()}\n >\n {active === \"start\" && (\n <TimepickerDropdown\n id={id ? `${id}-start` : undefined}\n show\n value={startTimeVal}\n format={format}\n onCancel={() => handleClose({ keepFocus: true })}\n onChange={handleStartTime}\n />\n )}\n {active === \"end\" && (\n <TimepickerDropdown\n id={id ? `${id}-end` : undefined}\n show\n value={endTimeVal}\n format={format}\n onCancel={() => handleClose({ keepFocus: false })}\n onChange={handleEndTime}\n />\n )}\n </div>\n );\n };\n\n return (\n <Wrapper id={id} {...otherProps}>\n <ElementWithDropdown\n enabled={enabled}\n isOpen={isOpen}\n renderElement={renderElement}\n renderDropdown={renderDropdown}\n onClose={() => handleClose({ keepFocus: false })}\n onDismiss={() => handleClose({ keepFocus: true })}\n clickToToggle={false}\n offset={8}\n alignment={alignment}\n customZIndex={dropdownZIndex}\n rootNode={dropdownRootNode}\n />\n </Wrapper>\n );\n};\n"],"names":["_a","id","disabled","error","value","format","readOnly","onChange","onFocus","onBlur","alignment","dropdownZIndex","dropdownRootNode","ariaLabelledBy","ariaDescribedBy","ariaInvalid","otherProps","__rest","isOpen","setIsOpen","useState","active","setActive","startTimeVal","setStartTimeVal","endTimeVal","setEndTimeVal","focused","setFocused","enabled","nodeRef","useRef","internalId","useId","startLabelId","endLabelId","getInputLabelledBy","type","concatIds","getInputDescribedBy","useEffect","start","end","handleOpen","next","handleClose","opts","keepFocus","triggerBlur","_b","current","focus","handleContainerBlur","event","target","relatedTarget","isFloatingElement","matches","call","_c","contains","handleStartTime","handleEndTime","_jsx","Wrapper","Object","assign","children","ElementWithDropdown","renderElement","TimeContainer","ref","tabIndex","role","$error","$readOnly","_jsxs","RangeInputInnerContainer","currentActive","SelectorInput","onClick","placeholder","TimeHelper","formatDisplayValue","undefined","renderDropdown","styles","setFloatingRef","getFloatingProps","style","TimepickerDropdown","show","onCancel","onClose","onDismiss","clickToToggle","offset","customZIndex","rootNode"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"dial-picker.js","sources":["../../../../src/time-range-picker/dial-picker/dial-picker.tsx"],"sourcesContent":["import { useEffect, useRef, useState } from \"react\";\nimport { concatIds } from \"../../shared/accessibility\";\nimport {\n DropdownRenderProps,\n ElementWithDropdown,\n} from \"../../shared/dropdown-wrapper\";\nimport { RangeInputInnerContainer } from \"../../shared/range-input-inner-container\";\nimport { TimepickerDropdown } from \"../../shared/timepicker-dropdown/timepicker-dropdown\";\nimport { useId } from \"../../util\";\nimport { TimeHelper } from \"../../util/time-helper\";\nimport { SelectorInput, TimeContainer, Wrapper } from \"../common.styles\";\nimport { TimeRangePickerProps, TimeRangePickerValue } from \"../types\";\n\ntype Active = \"start\" | \"end\" | \"none\";\n\nexport const DialPicker = ({\n id,\n disabled = false,\n error,\n value,\n format = \"24hr\",\n readOnly,\n onChange,\n onFocus,\n onBlur,\n alignment = \"left\",\n dropdownZIndex,\n dropdownRootNode,\n \"aria-labelledby\": ariaLabelledBy,\n \"aria-describedby\": ariaDescribedBy,\n \"aria-invalid\": ariaInvalid,\n ...otherProps\n}: TimeRangePickerProps) => {\n // =============================================================================\n // CONST, STATE, REF\n // =============================================================================\n const [isOpen, setIsOpen] = useState(false);\n const [active, setActive] = useState<Active>(\"none\");\n const [startTimeVal, setStartTimeVal] = useState(\"\");\n const [endTimeVal, setEndTimeVal] = useState(\"\");\n const [focused, setFocused] = useState(false);\n\n const enabled = !readOnly && !disabled;\n const nodeRef = useRef<HTMLDivElement>(null);\n const internalId = useId();\n const startLabelId = `${internalId}-start-label`;\n const endLabelId = `${internalId}-end-label`;\n\n // =============================================================================\n // HELPER FUNCTIONS\n // =============================================================================\n const getDropdownAriaLabel = () => {\n if (active === \"start\") {\n return \"Selecting for: Start time\";\n }\n\n if (active === \"end\") {\n return \"Selecting for: End time\";\n }\n\n return undefined;\n };\n\n const getInputLabelledBy = (type: Exclude<Active, \"none\">) => {\n return concatIds(\n ariaLabelledBy,\n type === \"start\" ? startLabelId : endLabelId\n );\n };\n\n const getInputDescribedBy = () => {\n return concatIds(ariaDescribedBy);\n };\n // =============================================================================\n // EFFECTS\n // =============================================================================\n useEffect(() => {\n if (value) {\n setStartTimeVal(value.start);\n setEndTimeVal(value.end);\n }\n }, [value]);\n\n // =============================================================================\n // EVENT HANDLERS\n // =============================================================================\n const handleOpen = (next: Exclude<Active, \"none\">) => {\n if (!enabled) return;\n if (!focused && !isOpen) onFocus?.();\n setFocused(true);\n setActive(next);\n setIsOpen(true);\n };\n\n const handleClose = (opts?: {\n keepFocus?: boolean;\n triggerBlur?: boolean;\n }) => {\n const keepFocus = !!opts?.keepFocus;\n const triggerBlur = opts?.triggerBlur ?? !keepFocus;\n\n setIsOpen(false);\n setActive(\"none\");\n setFocused(keepFocus);\n\n if (triggerBlur) onBlur?.();\n\n if (keepFocus) nodeRef.current?.focus();\n };\n\n const handleContainerBlur = (\n event: React.FocusEvent<HTMLDivElement, Element>\n ) => {\n if (!focused || isOpen) return;\n\n const target = event.relatedTarget as HTMLElement | null;\n\n const isFloatingElement =\n target?.matches?.(\"[data-floating-ui-focusable]\") ||\n target?.matches?.(\"[data-floating-ui-focus-guard]\");\n const isInsideNode = !!(target && nodeRef.current?.contains(target));\n\n if (!isInsideNode && !isFloatingElement) {\n setFocused(false);\n onBlur?.();\n }\n };\n\n const handleStartTime = (value: string) => {\n setStartTimeVal(value);\n onChange?.({ start: value, end: endTimeVal } as TimeRangePickerValue);\n\n setActive(\"end\");\n setIsOpen(true);\n setFocused(true);\n };\n\n const handleEndTime = (value: string) => {\n setEndTimeVal(value);\n onChange?.({ start: startTimeVal, end: value } as TimeRangePickerValue);\n\n if (startTimeVal === \"\") {\n setActive(\"start\");\n setIsOpen(true);\n setFocused(true);\n } else {\n handleClose({ keepFocus: true });\n }\n };\n\n const renderElement = () => (\n <TimeContainer\n ref={nodeRef}\n tabIndex={-1}\n onBlur={handleContainerBlur}\n data-testid=\"timepicker-container\"\n role=\"group\"\n $disabled={disabled}\n $error={error}\n $readOnly={readOnly}\n $focused={focused}\n >\n <RangeInputInnerContainer error={error} currentActive={active}>\n <SelectorInput\n onFocus={() => handleOpen(\"start\")}\n onClick={() => handleOpen(\"start\")}\n readOnly\n placeholder=\"From\"\n value={TimeHelper.formatDisplayValue(startTimeVal, format)}\n data-testid={\n otherProps[\"data-testid\"]\n ? `${otherProps[\"data-testid\"]}-timepicker-selector-from`\n : \"timepicker-selector-from\"\n }\n role=\"combobox\"\n aria-expanded={!disabled && !readOnly ? isOpen : false}\n aria-invalid={error || ariaInvalid}\n aria-disabled={disabled}\n aria-readonly={readOnly}\n aria-labelledby={getInputLabelledBy(\"start\")}\n aria-describedby={getInputDescribedBy()}\n $disabled={disabled}\n />\n <SelectorInput\n onClick={() => handleOpen(\"end\")}\n readOnly\n placeholder=\"To\"\n value={TimeHelper.formatDisplayValue(endTimeVal, format)}\n data-testid={\n otherProps[\"data-testid\"]\n ? `${otherProps[\"data-testid\"]}-timepicker-selector-to`\n : \"timepicker-selector-to\"\n }\n role=\"combobox\"\n aria-expanded={!disabled && !readOnly ? isOpen : false}\n aria-invalid={error || ariaInvalid || undefined}\n aria-disabled={disabled || undefined}\n aria-readonly={readOnly || undefined}\n aria-labelledby={getInputLabelledBy(\"end\")}\n aria-describedby={getInputDescribedBy()}\n $disabled={disabled}\n />\n </RangeInputInnerContainer>\n </TimeContainer>\n );\n\n const renderDropdown = ({\n styles,\n setFloatingRef,\n getFloatingProps,\n }: DropdownRenderProps) => {\n if (!isOpen) return null;\n\n return (\n <div\n ref={setFloatingRef}\n style={styles}\n role=\"dialog\"\n key={active}\n aria-label={getDropdownAriaLabel()}\n {...getFloatingProps()}\n >\n {active === \"start\" && (\n <TimepickerDropdown\n id={id ? `${id}-start` : undefined}\n show\n value={startTimeVal}\n format={format}\n onCancel={() => handleClose({ keepFocus: true })}\n onChange={handleStartTime}\n />\n )}\n {active === \"end\" && (\n <TimepickerDropdown\n id={id ? `${id}-end` : undefined}\n show\n value={endTimeVal}\n format={format}\n onCancel={() => handleClose({ keepFocus: false })}\n onChange={handleEndTime}\n />\n )}\n </div>\n );\n };\n\n return (\n <Wrapper id={id} {...otherProps}>\n <ElementWithDropdown\n enabled={enabled}\n isOpen={isOpen}\n renderElement={renderElement}\n renderDropdown={renderDropdown}\n onClose={() => handleClose({ keepFocus: false })}\n onDismiss={() => handleClose({ keepFocus: true })}\n clickToToggle={false}\n offset={8}\n alignment={alignment}\n customZIndex={dropdownZIndex}\n rootNode={dropdownRootNode}\n />\n </Wrapper>\n );\n};\n"],"names":["_a","id","disabled","error","value","format","readOnly","onChange","onFocus","onBlur","alignment","dropdownZIndex","dropdownRootNode","ariaLabelledBy","ariaDescribedBy","ariaInvalid","otherProps","__rest","isOpen","setIsOpen","useState","active","setActive","startTimeVal","setStartTimeVal","endTimeVal","setEndTimeVal","focused","setFocused","enabled","nodeRef","useRef","internalId","useId","startLabelId","endLabelId","getInputLabelledBy","type","concatIds","getInputDescribedBy","useEffect","start","end","handleOpen","next","handleClose","opts","keepFocus","triggerBlur","_b","current","focus","handleContainerBlur","event","target","relatedTarget","isFloatingElement","matches","call","_c","contains","handleStartTime","handleEndTime","_jsx","Wrapper","Object","assign","children","ElementWithDropdown","renderElement","TimeContainer","ref","tabIndex","role","$error","$readOnly","_jsxs","RangeInputInnerContainer","currentActive","SelectorInput","onClick","placeholder","TimeHelper","formatDisplayValue","$disabled","undefined","renderDropdown","styles","setFloatingRef","getFloatingProps","style","TimepickerDropdown","show","onCancel","onClose","onDismiss","clickToToggle","offset","customZIndex","rootNode"],"mappings":"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"}
|
|
@@ -1,7 +1,11 @@
|
|
|
1
|
-
"use strict";var e=require("styled-components"),t=require("../shared/input-wrapper/input-wrapper.js");function
|
|
1
|
+
"use strict";var e=require("styled-components"),t=require("../shared/input-wrapper/input-wrapper.js"),r=require("../theme/index.js");function o(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var u=o(e);u.default.div`
|
|
2
2
|
position: relative;
|
|
3
|
-
`;const
|
|
3
|
+
`;const i=u.default(t.BasicInput)`
|
|
4
4
|
height: calc(3rem - 2px); // exclude top and bottom borders
|
|
5
5
|
cursor: inherit;
|
|
6
|
-
|
|
6
|
+
${t=>t.$disabled&&e.css`
|
|
7
|
+
color: ${r.Colour["text-subtler"]};
|
|
8
|
+
cursor: not-allowed;
|
|
9
|
+
`}
|
|
10
|
+
`;exports.InputSelectorElement=i;
|
|
7
11
|
//# sourceMappingURL=timepicker.styles.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"timepicker.styles.js","sources":["../../../src/timepicker/timepicker.styles.tsx"],"sourcesContent":["import styled from \"styled-components\";\nimport { BasicInput } from \"../shared/input-wrapper/input-wrapper\";\n\n// =============================================================================\n// STYLING\n// =============================================================================\nexport const Wrapper = styled.div`\n position: relative;\n`;\n\nexport const InputSelectorElement = styled(BasicInput)<{\n $disabled?: boolean | undefined;\n}>`\n height: calc(3rem - 2px); // exclude top and bottom borders\n cursor: inherit;\n`;\n"],"names":["styled","div","InputSelectorElement","BasicInput"],"mappings":"
|
|
1
|
+
{"version":3,"file":"timepicker.styles.js","sources":["../../../src/timepicker/timepicker.styles.tsx"],"sourcesContent":["import styled, { css } from \"styled-components\";\nimport { BasicInput } from \"../shared/input-wrapper/input-wrapper\";\nimport { Colour } from \"../theme\";\n\n// =============================================================================\n// STYLING\n// =============================================================================\nexport const Wrapper = styled.div`\n position: relative;\n`;\n\nexport const InputSelectorElement = styled(BasicInput)<{\n $disabled?: boolean | undefined;\n}>`\n height: calc(3rem - 2px); // exclude top and bottom borders\n cursor: inherit;\n ${(props) =>\n props.$disabled &&\n css`\n color: ${Colour[\"text-subtler\"]};\n cursor: not-allowed;\n `}\n`;\n"],"names":["styled","div","InputSelectorElement","BasicInput","props","$disabled","css","Colour"],"mappings":"wNAOuBA,EAAAA,QAAOC,GAAG;;QAIpBC,EAAuBF,EAAAA,QAAOG,EAAAA,WAEzC;;;MAGKC,GACCA,EAAMC,WACNC,KAAG;qBACUC,EAAAA,OAAO;;;"}
|
package/cjs/util/merge-refs.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var e=require("./version.js");exports.mergeRefs=(...r)=>t=>{const n=[];for(const e of r)if("function"==typeof e){const r=e(t),o="function"==typeof r;n.push(o?r:()=>e(null))}else e.current=t,n.push((()=>{e.current=null}));if(e.isReact19())return()=>{for(const e of n)e()}};
|
|
1
|
+
"use strict";var e=require("./version.js");exports.mergeRefs=(...r)=>t=>{const n=[];for(const e of r)if("function"==typeof e){const r=e(t),o="function"==typeof r;n.push(o?r:()=>e(null))}else e&&(e.current=t,n.push((()=>{e.current=null})));if(e.isReact19())return()=>{for(const e of n)e()}};
|
|
2
2
|
//# sourceMappingURL=merge-refs.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"merge-refs.js","sources":["../../../src/util/merge-refs.ts"],"sourcesContent":["import { MutableRefObject, Ref } from \"react\";\nimport { isReact19 } from \"./version\";\n\nexport const mergeRefs = <T>(...refs: Ref<T>[]) => {\n return (value: T | null) => {\n const cleanups: (() => void)[] = [];\n\n for (const ref of refs) {\n if (typeof ref === \"function\") {\n const cleanup = ref(value);\n const isCleanup = typeof cleanup === \"function\";\n cleanups.push(isCleanup ? cleanup : () => ref(null));\n } else {\n (ref as MutableRefObject<T | null>).current = value;\n cleanups.push(() => {\n (ref as MutableRefObject<T | null>).current = null;\n });\n }\n }\n\n if (isReact19()) {\n return () => {\n for (const cleanup of cleanups) cleanup();\n };\n }\n };\n};\n"],"names":["refs","value","cleanups","ref","cleanup","isCleanup","push","current","isReact19"],"mappings":"
|
|
1
|
+
{"version":3,"file":"merge-refs.js","sources":["../../../src/util/merge-refs.ts"],"sourcesContent":["import type { MutableRefObject, Ref } from \"react\";\n\nimport { isReact19 } from \"./version\";\n\nexport const mergeRefs = <T>(...refs: Ref<T>[]) => {\n return (value: T | null) => {\n const cleanups: (() => void)[] = [];\n\n for (const ref of refs) {\n if (typeof ref === \"function\") {\n const cleanup = ref(value);\n const isCleanup = typeof cleanup === \"function\";\n cleanups.push(isCleanup ? cleanup : () => ref(null));\n } else if (ref) {\n (ref as MutableRefObject<T | null>).current = value;\n cleanups.push(() => {\n (ref as MutableRefObject<T | null>).current = null;\n });\n }\n }\n\n if (isReact19()) {\n return () => {\n for (const cleanup of cleanups) cleanup();\n };\n }\n };\n};\n"],"names":["refs","value","cleanups","ref","cleanup","isCleanup","push","current","isReact19"],"mappings":"6DAIyB,IAAOA,IACpBC,IACJ,MAAMC,EAA2B,GAEjC,IAAK,MAAMC,KAAOH,EACd,GAAmB,mBAARG,EAAoB,CAC3B,MAAMC,EAAUD,EAAIF,GACdI,EAA+B,mBAAZD,EACzBF,EAASI,KAAKD,EAAYD,EAAU,IAAMD,EAAI,MAClD,MAAWA,IACNA,EAAmCI,QAAUN,EAC9CC,EAASI,MAAK,KACTH,EAAmCI,QAAU,IAAI,KAK9D,GAAIC,EAAAA,YACA,MAAO,KACH,IAAK,MAAMJ,KAAWF,EAAUE,GAAS,CAEjD"}
|
package/footer/footer-helper.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import e from"../external/dayjs/dayjs.min.js";import{getDefaultDisclaimerLinks as t}from"./footer-disclaimer-links-data.js";var
|
|
1
|
+
import e from"../external/dayjs/dayjs.min.js";import{getDefaultDisclaimerLinks as t}from"./footer-disclaimer-links-data.js";var s;!function(s){s.getCopyrightInfo=(t=new Date,s)=>{const o=r(s);return`${`${(new Date).getFullYear()} ${o}`} Last updated ${e(t).format("D MMMM YYYY")}`};const r=e=>{switch(e){case"lifesg":return"LifeSG, Government of Singapore.";case"bookingsg":return"BookingSG, Government of Singapore.";case"mylegacy":return"MyLegacy@LifeSG, Government of Singapore.";case"ccube":return"Citizen Collective Common, Government of Singapore.";case"imda":return"IMDA, Government of Singapore.";default:return"Government of Singapore."}};s.getFooterLogoAttribute=e=>{switch(e){case"lifesg":return{src:"https://assets.life.gov.sg/react-design-system/img/logo/lifesg-primary-logo.svg",alt:"LifeSG",style:{width:"4rem"}};case"bookingsg":return{src:"https://home.booking.gov.sg/images/bookingsg/footer.svg",alt:"BookingSG",style:{width:"4rem"}};case"mylegacy":return{src:"https://mylegacy.life.gov.sg/images/site-logo.png",alt:"MyLegacy",style:{width:"10rem",maxHeight:"2rem"}};case"ccube":return{src:"https://assets.life.gov.sg/ccube/logo-ccube.svg",alt:"Citizen Collective Common",style:{width:"10rem"}};case"supportgowhere":return{src:"https://assets.life.gov.sg/react-design-system/img/logo/sgw-logo.png",alt:"SupportGoWhere",style:{width:"10rem"}};case"toteboard":return{src:"https://assets.life.gov.sg/react-design-system/img/logo/tote-board-logo.svg",alt:"Tote Board",style:{width:"4rem"}};default:return{}}},s.getDisclaimerLinks=(e,s)=>{const r=t(e);return{privacy:Object.assign(Object.assign(Object.assign({},r.privacy),s&&s.privacy?s.privacy:{}),{children:"Privacy Statement"}),termsOfUse:Object.assign(Object.assign(Object.assign({},r.termsOfUse),s&&s.termsOfUse?s.termsOfUse:{}),{children:"Terms of Use"}),reportVulnerability:Object.assign(Object.assign(Object.assign({},r.reportVulnerability),s&&s.reportVulnerability?s.reportVulnerability:{}),{children:"Report Vulnerability"})}}}(s||(s={}));export{s as FooterHelper};
|
|
2
2
|
//# sourceMappingURL=footer-helper.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"footer-helper.js","sources":["../../src/footer/footer-helper.ts"],"sourcesContent":["import dayjs from \"dayjs\";\nimport { ResourceScheme } from \"../theme/types\";\nimport { TypographyLinkProps } from \"../typography\";\nimport { getDefaultDisclaimerLinks } from \"./footer-disclaimer-links-data\";\nimport { DisclaimerLinks } from \"./types\";\n\n/* Internally used. Not to be exported */\nexport interface InternalDisclaimerLinks {\n privacy?: TypographyLinkProps | undefined;\n termsOfUse?: TypographyLinkProps | undefined;\n reportVulnerability?: TypographyLinkProps | undefined;\n}\n\nexport namespace FooterHelper {\n export const getCopyrightInfo = (\n lastUpdated: Date = new Date(),\n resourceScheme: ResourceScheme | undefined\n ): string => {\n const copyrightText = getCopyrightText(resourceScheme);\n const copyright = `${new Date().getFullYear()} ${copyrightText}`;\n const lastUpdatedDateString = dayjs(lastUpdated).format(\"D MMMM YYYY\");\n\n return `${copyright} Last updated ${lastUpdatedDateString}`;\n };\n\n const getCopyrightText = (resourceScheme: ResourceScheme | undefined) => {\n switch (resourceScheme) {\n case \"lifesg\":\n return \"LifeSG, Government of Singapore.\";\n case \"bookingsg\":\n return \"BookingSG, Government of Singapore.\";\n case \"mylegacy\":\n return \"MyLegacy@LifeSG, Government of Singapore.\";\n case \"ccube\":\n return \"Citizen Collective Common, Government of Singapore.\";\n case \"imda\":\n return \"IMDA, Government of Singapore.\";\n default:\n return \"Government of Singapore.\";\n }\n };\n\n export const getFooterLogoAttribute = (\n resourceScheme?: ResourceScheme\n ): React.ImgHTMLAttributes<HTMLImageElement> => {\n switch (resourceScheme) {\n case \"lifesg\":\n return {\n src: \"https://assets.life.gov.sg/react-design-system/img/logo/lifesg-primary-logo.svg\",\n alt: \"LifeSG\",\n style: { width: \"4rem\" },\n };\n\n case \"bookingsg\":\n return {\n src: \"https://home.booking.gov.sg/images/bookingsg/footer.svg\",\n alt: \"BookingSG\",\n style: { width: \"4rem\" },\n };\n case \"mylegacy\":\n return {\n src: \"https://mylegacy.life.gov.sg/images/site-logo.png\",\n alt: \"MyLegacy\",\n style: { width: \"10rem\", maxHeight: \"2rem\" },\n };\n case \"ccube\":\n return {\n src: \"https://assets.life.gov.sg/ccube/logo-ccube.svg\",\n alt: \"Citizen Collective Common\",\n style: { width: \"10rem\" },\n };\n case \"supportgowhere\":\n return {\n src: \"https://assets.life.gov.sg/react-design-system/img/logo/sgw-logo.png\",\n alt: \"SupportGoWhere\",\n style: { width: \"10rem\" },\n };\n\n default:\n return {};\n }\n };\n\n export const getDisclaimerLinks = (\n resourceScheme: ResourceScheme | undefined,\n customDisclaimerLinks: DisclaimerLinks | undefined\n ): InternalDisclaimerLinks => {\n const defaultDisclaimerLinks =\n getDefaultDisclaimerLinks(resourceScheme);\n return {\n privacy: {\n ...defaultDisclaimerLinks.privacy,\n ...(customDisclaimerLinks && customDisclaimerLinks.privacy\n ? customDisclaimerLinks.privacy\n : {}),\n children: \"Privacy Statement\",\n },\n termsOfUse: {\n ...defaultDisclaimerLinks.termsOfUse,\n ...(customDisclaimerLinks && customDisclaimerLinks.termsOfUse\n ? customDisclaimerLinks.termsOfUse\n : {}),\n children: \"Terms of Use\",\n },\n reportVulnerability: {\n ...defaultDisclaimerLinks.reportVulnerability,\n ...(customDisclaimerLinks &&\n customDisclaimerLinks.reportVulnerability\n ? customDisclaimerLinks.reportVulnerability\n : {}),\n children: \"Report Vulnerability\",\n },\n };\n };\n}\n"],"names":["FooterHelper","getCopyrightInfo","lastUpdated","Date","resourceScheme","copyrightText","getCopyrightText","getFullYear","dayjs","format","getFooterLogoAttribute","src","alt","style","width","maxHeight","getDisclaimerLinks","customDisclaimerLinks","defaultDisclaimerLinks","getDefaultDisclaimerLinks","privacy","Object","assign","children","termsOfUse","reportVulnerability"],"mappings":"4HAaM,IAAWA,GAAjB,SAAiBA,GACAA,EAAAC,iBAAmB,CAC5BC,EAAoB,IAAIC,KACxBC,KAEA,MAAMC,EAAgBC,EAAiBF,GAIvC,MAAO,GAHW,IAAG,IAAID,MAAOI,iBAAiBF,oBACnBG,EAAMN,GAAaO,OAAO,gBAEG,EAG/D,MAAMH,EAAoBF,IACtB,OAAQA,GACJ,IAAK,SACD,MAAO,mCACX,IAAK,YACD,MAAO,sCACX,IAAK,WACD,MAAO,4CACX,IAAK,QACD,MAAO,sDACX,IAAK,OACD,MAAO,iCACX,QACI,MAAO,6BAINJ,EAAAU,uBACTN,IAEA,OAAQA,GACJ,IAAK,SACD,MAAO,CACHO,IAAK,kFACLC,IAAK,SACLC,MAAO,CAAEC,MAAO,SAGxB,IAAK,YACD,MAAO,CACHH,IAAK,0DACLC,IAAK,YACLC,MAAO,CAAEC,MAAO,SAExB,IAAK,WACD,MAAO,CACHH,IAAK,oDACLC,IAAK,WACLC,MAAO,CAAEC,MAAO,QAASC,UAAW,SAE5C,IAAK,QACD,MAAO,CACHJ,IAAK,kDACLC,IAAK,4BACLC,MAAO,CAAEC,MAAO,UAExB,IAAK,iBACD,MAAO,CACHH,IAAK,uEACLC,IAAK,iBACLC,MAAO,CAAEC,MAAO,
|
|
1
|
+
{"version":3,"file":"footer-helper.js","sources":["../../src/footer/footer-helper.ts"],"sourcesContent":["import dayjs from \"dayjs\";\nimport { ResourceScheme } from \"../theme/types\";\nimport { TypographyLinkProps } from \"../typography\";\nimport { getDefaultDisclaimerLinks } from \"./footer-disclaimer-links-data\";\nimport { DisclaimerLinks } from \"./types\";\n\n/* Internally used. Not to be exported */\nexport interface InternalDisclaimerLinks {\n privacy?: TypographyLinkProps | undefined;\n termsOfUse?: TypographyLinkProps | undefined;\n reportVulnerability?: TypographyLinkProps | undefined;\n}\n\nexport namespace FooterHelper {\n export const getCopyrightInfo = (\n lastUpdated: Date = new Date(),\n resourceScheme: ResourceScheme | undefined\n ): string => {\n const copyrightText = getCopyrightText(resourceScheme);\n const copyright = `${new Date().getFullYear()} ${copyrightText}`;\n const lastUpdatedDateString = dayjs(lastUpdated).format(\"D MMMM YYYY\");\n\n return `${copyright} Last updated ${lastUpdatedDateString}`;\n };\n\n const getCopyrightText = (resourceScheme: ResourceScheme | undefined) => {\n switch (resourceScheme) {\n case \"lifesg\":\n return \"LifeSG, Government of Singapore.\";\n case \"bookingsg\":\n return \"BookingSG, Government of Singapore.\";\n case \"mylegacy\":\n return \"MyLegacy@LifeSG, Government of Singapore.\";\n case \"ccube\":\n return \"Citizen Collective Common, Government of Singapore.\";\n case \"imda\":\n return \"IMDA, Government of Singapore.\";\n default:\n return \"Government of Singapore.\";\n }\n };\n\n export const getFooterLogoAttribute = (\n resourceScheme?: ResourceScheme\n ): React.ImgHTMLAttributes<HTMLImageElement> => {\n switch (resourceScheme) {\n case \"lifesg\":\n return {\n src: \"https://assets.life.gov.sg/react-design-system/img/logo/lifesg-primary-logo.svg\",\n alt: \"LifeSG\",\n style: { width: \"4rem\" },\n };\n\n case \"bookingsg\":\n return {\n src: \"https://home.booking.gov.sg/images/bookingsg/footer.svg\",\n alt: \"BookingSG\",\n style: { width: \"4rem\" },\n };\n case \"mylegacy\":\n return {\n src: \"https://mylegacy.life.gov.sg/images/site-logo.png\",\n alt: \"MyLegacy\",\n style: { width: \"10rem\", maxHeight: \"2rem\" },\n };\n case \"ccube\":\n return {\n src: \"https://assets.life.gov.sg/ccube/logo-ccube.svg\",\n alt: \"Citizen Collective Common\",\n style: { width: \"10rem\" },\n };\n case \"supportgowhere\":\n return {\n src: \"https://assets.life.gov.sg/react-design-system/img/logo/sgw-logo.png\",\n alt: \"SupportGoWhere\",\n style: { width: \"10rem\" },\n };\n case \"toteboard\":\n return {\n src: \"https://assets.life.gov.sg/react-design-system/img/logo/tote-board-logo.svg\",\n alt: \"Tote Board\",\n style: { width: \"4rem\" },\n };\n\n default:\n return {};\n }\n };\n\n export const getDisclaimerLinks = (\n resourceScheme: ResourceScheme | undefined,\n customDisclaimerLinks: DisclaimerLinks | undefined\n ): InternalDisclaimerLinks => {\n const defaultDisclaimerLinks =\n getDefaultDisclaimerLinks(resourceScheme);\n return {\n privacy: {\n ...defaultDisclaimerLinks.privacy,\n ...(customDisclaimerLinks && customDisclaimerLinks.privacy\n ? customDisclaimerLinks.privacy\n : {}),\n children: \"Privacy Statement\",\n },\n termsOfUse: {\n ...defaultDisclaimerLinks.termsOfUse,\n ...(customDisclaimerLinks && customDisclaimerLinks.termsOfUse\n ? customDisclaimerLinks.termsOfUse\n : {}),\n children: \"Terms of Use\",\n },\n reportVulnerability: {\n ...defaultDisclaimerLinks.reportVulnerability,\n ...(customDisclaimerLinks &&\n customDisclaimerLinks.reportVulnerability\n ? customDisclaimerLinks.reportVulnerability\n : {}),\n children: \"Report Vulnerability\",\n },\n };\n };\n}\n"],"names":["FooterHelper","getCopyrightInfo","lastUpdated","Date","resourceScheme","copyrightText","getCopyrightText","getFullYear","dayjs","format","getFooterLogoAttribute","src","alt","style","width","maxHeight","getDisclaimerLinks","customDisclaimerLinks","defaultDisclaimerLinks","getDefaultDisclaimerLinks","privacy","Object","assign","children","termsOfUse","reportVulnerability"],"mappings":"4HAaM,IAAWA,GAAjB,SAAiBA,GACAA,EAAAC,iBAAmB,CAC5BC,EAAoB,IAAIC,KACxBC,KAEA,MAAMC,EAAgBC,EAAiBF,GAIvC,MAAO,GAHW,IAAG,IAAID,MAAOI,iBAAiBF,oBACnBG,EAAMN,GAAaO,OAAO,gBAEG,EAG/D,MAAMH,EAAoBF,IACtB,OAAQA,GACJ,IAAK,SACD,MAAO,mCACX,IAAK,YACD,MAAO,sCACX,IAAK,WACD,MAAO,4CACX,IAAK,QACD,MAAO,sDACX,IAAK,OACD,MAAO,iCACX,QACI,MAAO,6BAINJ,EAAAU,uBACTN,IAEA,OAAQA,GACJ,IAAK,SACD,MAAO,CACHO,IAAK,kFACLC,IAAK,SACLC,MAAO,CAAEC,MAAO,SAGxB,IAAK,YACD,MAAO,CACHH,IAAK,0DACLC,IAAK,YACLC,MAAO,CAAEC,MAAO,SAExB,IAAK,WACD,MAAO,CACHH,IAAK,oDACLC,IAAK,WACLC,MAAO,CAAEC,MAAO,QAASC,UAAW,SAE5C,IAAK,QACD,MAAO,CACHJ,IAAK,kDACLC,IAAK,4BACLC,MAAO,CAAEC,MAAO,UAExB,IAAK,iBACD,MAAO,CACHH,IAAK,uEACLC,IAAK,iBACLC,MAAO,CAAEC,MAAO,UAExB,IAAK,YACD,MAAO,CACHH,IAAK,8EACLC,IAAK,aACLC,MAAO,CAAEC,MAAO,SAGxB,QACI,MAAO,CAAA,IAINd,EAAAgB,mBAAqB,CAC9BZ,EACAa,KAEA,MAAMC,EACFC,EAA0Bf,GAC9B,MAAO,CACHgB,QAAOC,OAAAC,OAAAD,OAAAC,OAAAD,OAAAC,OAAA,CAAA,EACAJ,EAAuBE,SACtBH,GAAyBA,EAAsBG,QAC7CH,EAAsBG,QACtB,CAAA,IACNG,SAAU,sBAEdC,WAAUH,OAAAC,OAAAD,OAAAC,OAAAD,OAAAC,OAAA,CAAA,EACHJ,EAAuBM,YACtBP,GAAyBA,EAAsBO,WAC7CP,EAAsBO,WACtB,CAAA,IACND,SAAU,iBAEdE,iEACOP,EAAuBO,qBACtBR,GACJA,EAAsBQ,oBAChBR,EAAsBQ,oBACtB,CAAA,IACNF,SAAU,yBAEjB,CAER,CA3GD,CAAiBvB,IAAAA,EAAY,CAAA"}
|
package/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export{Accordion}from"./accordion/accordion.js";export{Alert}from"./alert/alert.js";export{LoadingSpinner}from"./animations/loading-spinner/loading-spinner.js";export{LoadingDots}from"./animations/loading-dots/loading-dots.js";export{LoadingDotsSpinner}from"./animations/loading-dots-spinner/loading-dots-spinner.js";export{ThemedLoadingSpinner}from"./animations/themed-loading-spinner/themed-loading-spinner.js";export{Avatar}from"./avatar/avatar.js";export{Badge}from"./badge/badge.js";export{BoxContainer}from"./box-container/box-container.js";export{Breadcrumb}from"./breadcrumb/breadcrumb.js";export{Button}from"./button/button.js";export{ButtonWithIcon}from"./button-with-icon/button-with-icon.js";export{Calendar}from"./calendar/calendar.js";export{Card}from"./card/card.js";export{Checkbox}from"./checkbox/checkbox.js";export{CountdownTimer}from"./countdown-timer/countdown-timer.js";export{DataTable}from"./data-table/data-table.js";export{DateInput}from"./date-input/date-input.js";export{DateNavigator}from"./date-navigator/date-navigator.js";export{DateRangeInput}from"./date-range-input/date-range-input.js";export{Divider}from"./divider/divider.js";export{Drawer}from"./drawer/drawer.js";export{ESignature}from"./e-signature/e-signature.js";export{ErrorDisplay}from"./error-display/error-display.js";export{ErrorDisplayHelper}from"./error-display/helper.js";export{FeedbackRating}from"./feedback-rating/feedback-rating.js";export{FileDownload}from"./file-download/file-download.js";export{FileUpload}from"./file-upload/file-upload.js";export{Filter}from"./filter/filter.js";export{Footer}from"./footer/footer.js";export{Form}from"./form/index.js";export{Component,FullscreenImageCarousel}from"./fullscreen-image-carousel/fullscreen-image-carousel.js";export{HistogramSlider}from"./histogram-slider/histogram-slider.js";export{IconButton}from"./icon-button/icon-button.js";export{ImageButton}from"./image-button/image-button.js";export{Input}from"./input/input.js";export{InputGroup}from"./input-group/input-group.js";export{InputMultiSelect}from"./input-multi-select/input-multi-select.js";export{InputNestedMultiSelect}from"./input-nested-multi-select/input-nested-multi-select.js";export{InputNestedSelect}from"./input-nested-select/input-nested-select.js";export{InputRangeSelect}from"./input-range-select/input-range-select.js";export{InputRangeSlider}from"./input-range-slider/input-range-slider.js";export{InputSelect}from"./input-select/input-select.js";export{InputSlider}from"./input-slider/input-slider.js";export{Textarea}from"./input-textarea/textarea.js";export{LanguageSwitcher}from"./language-switcher/language-switcher.js";export{Layout}from"./layout/index.js";export{LinkList}from"./link-list/link-list.js";export{Markup}from"./markup/markup.js";export{MaskedInput}from"./masked-input/masked-input.js";export{Masonry}from"./masonry/masonry.js";export{Masthead}from"./masthead/masthead.js";export{Menu,MenuTrigger}from"./menu/menu.js";export{Modal}from"./modal/index.js";export{ModalV2}from"./modal-v2/index.js";export{Navbar}from"./navbar/navbar.js";export{NBComponent,NotificationBanner}from"./notification-banner/notification-banner.js";export{withNotificationBanner}from"./notification-banner/notification-banner-hoc.js";export{OtpInput}from"./otp-input/otp-input.js";export{Overlay}from"./overlay/overlay.js";export{Pagination}from"./pagination/pagination.js";export{PhoneNumberInput}from"./phone-number-input/phone-number-input.js";export{Pill}from"./pill/pill.js";export{withPopover}from"./popover/popover-hoc.js";export{Popover}from"./popover/popover.js";export{PopoverV2}from"./popover-v2/popover.js";export{PopoverInline}from"./popover-v2/popover-inline/popover-inline.js";export{PopoverTrigger}from"./popover-v2/popover-trigger.js";export{PredictiveTextInput}from"./predictive-text-input/predictive-text-input.js";export{ProgressIndicator}from"./progress-indicator/progress-indicator.js";export{RadioButton}from"./radio-button/radio-button.js";export{SelectHistogram}from"./select-histogram/select-histogram.js";export{Sidenav}from"./sidenav/sidenav.js";export{SingpassButton}from"./singpass-button/singpass-button.js";export{SmartAppBanner}from"./smart-app-banner/smart-app-banner.js";export{Tab}from"./tab/tab.js";export{Table}from"./table/table.js";export{Tag}from"./tag/tag.js";export{TextList}from"./text-list/index.js";export{A11yPlaygroundTheme,BookingSGTheme,Border,Breakpoint,CCubeTheme,CareerCompassTheme,Colour,Font,IMDATheme,LifeSGTheme,MediaQuery,Motion,MyLegacyTheme,OneServiceTheme,PATheme,RBSTheme,Radius,SGWDigitalLobbyTheme,SGWDigitalLobbyThemeBase,SMGSTheme,SPFTheme,Shadow,Spacing,SupportGoWhereTheme,SupportGoWhereThemeBase,ThemeComponent}from"./theme/index.js";export{TimeRangePicker}from"./time-range-picker/time-range-picker.js";export{TimeSlotBar}from"./time-slot-bar/time-slot-bar.js";export{TimeSlotBarWeek}from"./time-slot-bar-week/time-slot-bar-week.js";export{TimeSlotWeekView}from"./time-slot-week-view/time-slot-week-view.js";export{Timeline}from"./timeline/timeline.js";export{Timepicker}from"./timepicker/timepicker.js";export{TimeTable}from"./timetable/timetable.js";export{Toast}from"./toast/toast.js";export{Toggle}from"./toggle/toggle.js";export{Tooltip}from"./tooltip/tooltip.js";export{withTooltip}from"./tooltip/tooltip-hoc.js";export{Typography}from"./typography/typography.js";export{UneditableSection}from"./uneditable-section/index.js";export{UnitNumberInput}from"./unit-number/unit-number-input.js";export{V2_Color}from"./v2_color/color.js";export{V2_DesignToken}from"./v2_design-token/design-token.js";export{V2_Layout}from"./v2_layout/index.js";export{V2_MediaQuery,V2_MediaWidths}from"./v2_media/media.js";export{V2_TextStyleHelper}from"./v2_text/helper.js";export{V2_TextStyle}from"./v2_text/text-style.js";export{V2_Text}from"./v2_text/text.js";export{RedirectScope}from"./v2_text/types.js";export{V2_TextList}from"./v2_text-list/index.js";export{V2_BaseTheme,V2_BookingSGTheme,V2_CCubeTheme,V2_MyLegacyTheme,V2_OneServiceTheme,V2_RBSTheme}from"./v2_theme/index.js";export{V2_Transition}from"./v2_transition/index.js";export{DSThemeProvider}from"./theme/ds-theme-provider.js";export{V2_ThemeContextKeys}from"./v2_theme/types.js";export{createThemeWithColourMode,getSystemColourMode,useDSTheme}from"./theme/use-theme-mode.js";
|
|
1
|
+
export{Accordion}from"./accordion/accordion.js";export{Alert}from"./alert/alert.js";export{LoadingSpinner}from"./animations/loading-spinner/loading-spinner.js";export{LoadingDots}from"./animations/loading-dots/loading-dots.js";export{LoadingDotsSpinner}from"./animations/loading-dots-spinner/loading-dots-spinner.js";export{ThemedLoadingSpinner}from"./animations/themed-loading-spinner/themed-loading-spinner.js";export{Avatar}from"./avatar/avatar.js";export{Badge}from"./badge/badge.js";export{BoxContainer}from"./box-container/box-container.js";export{Breadcrumb}from"./breadcrumb/breadcrumb.js";export{Button}from"./button/button.js";export{ButtonWithIcon}from"./button-with-icon/button-with-icon.js";export{Calendar}from"./calendar/calendar.js";export{Card}from"./card/card.js";export{Checkbox}from"./checkbox/checkbox.js";export{CountdownTimer}from"./countdown-timer/countdown-timer.js";export{DataTable}from"./data-table/data-table.js";export{DateInput}from"./date-input/date-input.js";export{DateNavigator}from"./date-navigator/date-navigator.js";export{DateRangeInput}from"./date-range-input/date-range-input.js";export{Divider}from"./divider/divider.js";export{Drawer}from"./drawer/drawer.js";export{ESignature}from"./e-signature/e-signature.js";export{ErrorDisplay}from"./error-display/error-display.js";export{ErrorDisplayHelper}from"./error-display/helper.js";export{FeedbackRating}from"./feedback-rating/feedback-rating.js";export{FileDownload}from"./file-download/file-download.js";export{FileUpload}from"./file-upload/file-upload.js";export{Filter}from"./filter/filter.js";export{Footer}from"./footer/footer.js";export{Form}from"./form/index.js";export{Component,FullscreenImageCarousel}from"./fullscreen-image-carousel/fullscreen-image-carousel.js";export{HistogramSlider}from"./histogram-slider/histogram-slider.js";export{IconButton}from"./icon-button/icon-button.js";export{ImageButton}from"./image-button/image-button.js";export{Input}from"./input/input.js";export{InputGroup}from"./input-group/input-group.js";export{InputMultiSelect}from"./input-multi-select/input-multi-select.js";export{InputNestedMultiSelect}from"./input-nested-multi-select/input-nested-multi-select.js";export{InputNestedSelect}from"./input-nested-select/input-nested-select.js";export{InputRangeSelect}from"./input-range-select/input-range-select.js";export{InputRangeSlider}from"./input-range-slider/input-range-slider.js";export{InputSelect}from"./input-select/input-select.js";export{InputSlider}from"./input-slider/input-slider.js";export{Textarea}from"./input-textarea/textarea.js";export{LanguageSwitcher}from"./language-switcher/language-switcher.js";export{Layout}from"./layout/index.js";export{LinkList}from"./link-list/link-list.js";export{Markup}from"./markup/markup.js";export{MaskedInput}from"./masked-input/masked-input.js";export{Masonry}from"./masonry/masonry.js";export{Masthead}from"./masthead/masthead.js";export{Menu,MenuTrigger}from"./menu/menu.js";export{Modal}from"./modal/index.js";export{ModalV2}from"./modal-v2/index.js";export{Navbar}from"./navbar/navbar.js";export{NBComponent,NotificationBanner}from"./notification-banner/notification-banner.js";export{withNotificationBanner}from"./notification-banner/notification-banner-hoc.js";export{OtpInput}from"./otp-input/otp-input.js";export{Overlay}from"./overlay/overlay.js";export{Pagination}from"./pagination/pagination.js";export{PhoneNumberInput}from"./phone-number-input/phone-number-input.js";export{Pill}from"./pill/pill.js";export{withPopover}from"./popover/popover-hoc.js";export{Popover}from"./popover/popover.js";export{PopoverV2}from"./popover-v2/popover.js";export{PopoverInline}from"./popover-v2/popover-inline/popover-inline.js";export{PopoverTrigger}from"./popover-v2/popover-trigger.js";export{PredictiveTextInput}from"./predictive-text-input/predictive-text-input.js";export{ProgressIndicator}from"./progress-indicator/progress-indicator.js";export{RadioButton}from"./radio-button/radio-button.js";export{SelectHistogram}from"./select-histogram/select-histogram.js";export{Sidenav}from"./sidenav/sidenav.js";export{SingpassButton}from"./singpass-button/singpass-button.js";export{SmartAppBanner}from"./smart-app-banner/smart-app-banner.js";export{Tab}from"./tab/tab.js";export{Table}from"./table/table.js";export{Tag}from"./tag/tag.js";export{TextList}from"./text-list/index.js";export{A11yPlaygroundTheme,BookingSGTheme,Border,Breakpoint,CCubeTheme,CareerCompassTheme,Colour,Font,IMDATheme,LifeSGTheme,MediaQuery,Motion,MyLegacyTheme,OneServiceTheme,PATheme,RBSTheme,Radius,SGWDigitalLobbyTheme,SGWDigitalLobbyThemeBase,SMGSTheme,SPFTheme,Shadow,Spacing,SupportGoWhereTheme,SupportGoWhereThemeBase,ThemeComponent,ToteBoardTheme}from"./theme/index.js";export{TimeRangePicker}from"./time-range-picker/time-range-picker.js";export{TimeSlotBar}from"./time-slot-bar/time-slot-bar.js";export{TimeSlotBarWeek}from"./time-slot-bar-week/time-slot-bar-week.js";export{TimeSlotWeekView}from"./time-slot-week-view/time-slot-week-view.js";export{Timeline}from"./timeline/timeline.js";export{Timepicker}from"./timepicker/timepicker.js";export{TimeTable}from"./timetable/timetable.js";export{Toast}from"./toast/toast.js";export{Toggle}from"./toggle/toggle.js";export{Tooltip}from"./tooltip/tooltip.js";export{withTooltip}from"./tooltip/tooltip-hoc.js";export{Typography}from"./typography/typography.js";export{UneditableSection}from"./uneditable-section/index.js";export{UnitNumberInput}from"./unit-number/unit-number-input.js";export{V2_Color}from"./v2_color/color.js";export{V2_DesignToken}from"./v2_design-token/design-token.js";export{V2_Layout}from"./v2_layout/index.js";export{V2_MediaQuery,V2_MediaWidths}from"./v2_media/media.js";export{V2_TextStyleHelper}from"./v2_text/helper.js";export{V2_TextStyle}from"./v2_text/text-style.js";export{V2_Text}from"./v2_text/text.js";export{RedirectScope}from"./v2_text/types.js";export{V2_TextList}from"./v2_text-list/index.js";export{V2_BaseTheme,V2_BookingSGTheme,V2_CCubeTheme,V2_MyLegacyTheme,V2_OneServiceTheme,V2_RBSTheme}from"./v2_theme/index.js";export{V2_Transition}from"./v2_transition/index.js";export{DSThemeProvider}from"./theme/ds-theme-provider.js";export{V2_ThemeContextKeys}from"./v2_theme/types.js";export{createThemeWithColourMode,getSystemColourMode,useDSTheme}from"./theme/use-theme-mode.js";
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
package/navbar/drawer.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{jsx as
|
|
1
|
+
import{jsx as e,jsxs as r,Fragment as i}from"react/jsx-runtime";import{useFloating as n,FloatingFocusManager as t}from"@floating-ui/react";import o,{useState as a,useRef as d,useEffect as s,useLayoutEffect as l}from"react";import"../util/calendar-helper.js";import"../util/date-helper.js";import"../util/date-input-helper.js";import{mergeRefs as c}from"../util/merge-refs.js";import"../util/simple-id-generator.js";import"../util/string-helper.js";import"@react-aria/live-announcer";import{Brand as m}from"./brand.js";import{Wrapper as u,Container as p,Content as h,TopBar as f,CloseButton as w,CloseIcon as b}from"./drawer.styles.js";import{NavBrandContainer as v,NavSeparator as y}from"./navbar.styles.js";const g=o.forwardRef(((o,g)=>{const{show:j,resources:C={},children:k,hideNavBranding:x,onClose:_,onBrandClick:E,drawerLabel:F="Mobile navigation menu",mobileMenuRef:H}=o,[L,T]=a(0),z=d(null),{primary:B,secondary:D}=C,{context:M,refs:R}=n({open:j,onOpenChange:e=>{!e&&_&&_()}}),$=()=>{if(window){const e=.01*window.innerHeight;T(e)}};s((()=>($(),window.addEventListener("resize",$),()=>{window.removeEventListener("resize",$)})),[]),l((()=>{if(j){const e=setTimeout((()=>{z.current&&z.current.focus({preventScroll:!0})}),550);return()=>clearTimeout(e)}}),[j]);return e(t,{context:M,initialFocus:-1,returnFocus:!0,disabled:!j,children:e(u,{ref:c(g,R.setFloating),"data-testid":"drawer",children:e(p,{ref:z,$show:j,$viewHeight:L,onKeyDown:e=>{j&&"Escape"===e.key&&(e.preventDefault(),null==_||_(),setTimeout((()=>{var e;null===(e=null==H?void 0:H.current)||void 0===e||e.focus()}),300))},tabIndex:-1,"aria-label":F,children:r(h,{children:[r(f,{children:[e(v,{"data-id":"drawer-brand-container",children:!x&&r(i,{children:[B&&e(m,{resources:B,compress:!0,onClick:E,"data-id":"drawer-brand-primary","data-testid":"drawer__brand",type:"primary"}),D&&r(i,{children:[e(y,{}),e(m,{resources:D,compress:!0,onClick:E,"data-id":"drawer-brand-secondary","data-testid":"drawer__brand-secondary",type:"secondary"})]})]})}),e(w,{onClick:_,focusHighlight:!1,"aria-label":"Close nav menu",children:e(b,{})})]}),k]})})})})}));export{g as Drawer};
|
|
2
2
|
//# sourceMappingURL=drawer.js.map
|
package/navbar/drawer.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"drawer.js","sources":["../../src/navbar/drawer.tsx"],"sourcesContent":["import React, { useEffect, useLayoutEffect, useRef, useState } from \"react\";\nimport { Brand } from \"./brand\";\nimport {\n CloseButton,\n CloseIcon,\n Container,\n Content,\n TopBar,\n Wrapper,\n} from \"./drawer.styles\";\nimport { NavBrandContainer, NavSeparator } from \"./navbar.styles\";\nimport { NavbarDrawerProps } from \"./types\";\n\nconst Component = (\n props: NavbarDrawerProps,\n ref: React.Ref<HTMLDivElement>\n) => {\n // =============================================================================\n // CONST, STATE, REFS\n // =============================================================================\n const {\n show,\n resources = {},\n children,\n hideNavBranding,\n onClose,\n onBrandClick,\n drawerLabel = \"Mobile navigation menu\",\n mobileMenuRef,\n } = props;\n const [viewHeight, setViewHeight] = useState<number>(0);\n const containerRef = useRef<HTMLDivElement>(null);\n\n const { primary, secondary } = resources;\n\n // =============================================================================\n // EVENT HANDLERS\n // =============================================================================\n const handleResize = () => {\n /**\n * Reference:\n * https://css-tricks.com/the-trick-to-viewport-units-on-mobile/\n */\n if (window) {\n const viewHeight = window.innerHeight * 0.01;\n setViewHeight(viewHeight);\n }\n };\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (!show) return;\n\n if (event.key === \"Escape\") {\n event.preventDefault();\n onClose?.();\n // Return focus to the hamburger menu button\n setTimeout(() => {\n mobileMenuRef?.current?.focus();\n }, 300);\n }\n };\n\n // =============================================================================\n // EFFECTS\n // =============================================================================\n useEffect(() => {\n handleResize();\n window.addEventListener(\"resize\", handleResize);\n\n return () => {\n window.removeEventListener(\"resize\", handleResize);\n };\n }, []);\n\n // Focus management when drawer opens\n useLayoutEffect(() => {\n if (show) {\n const timer = setTimeout(() => {\n if (containerRef.current) {\n containerRef.current.focus({ preventScroll: true });\n }\n }, 550);\n\n return () => clearTimeout(timer);\n }\n }, [show]);\n\n // =============================================================================\n // RENDER FUNCTIONS\n // =============================================================================\n const renderBrand = () => {\n return (\n <>\n {primary && (\n <Brand\n resources={primary}\n compress\n onClick={onBrandClick}\n data-id=\"drawer-brand-primary\"\n data-testid=\"drawer__brand\"\n type=\"primary\"\n />\n )}\n {secondary && (\n <>\n <NavSeparator />\n <Brand\n resources={secondary}\n compress\n onClick={onBrandClick}\n data-id=\"drawer-brand-secondary\"\n data-testid=\"drawer__brand-secondary\"\n type=\"secondary\"\n />\n </>\n )}\n </>\n );\n };\n\n const renderTopBar = () => (\n <TopBar>\n <NavBrandContainer data-id=\"drawer-brand-container\">\n {!hideNavBranding && renderBrand()}\n </NavBrandContainer>\n <CloseButton\n onClick={onClose}\n focusHighlight={false}\n aria-label=\"Close nav menu\"\n >\n <CloseIcon />\n </CloseButton>\n </TopBar>\n );\n\n return (\n <Wrapper
|
|
1
|
+
{"version":3,"file":"drawer.js","sources":["../../src/navbar/drawer.tsx"],"sourcesContent":["import { FloatingFocusManager, useFloating } from \"@floating-ui/react\";\nimport React, { useEffect, useLayoutEffect, useRef, useState } from \"react\";\n\nimport { mergeRefs } from \"../util\";\nimport { Brand } from \"./brand\";\nimport {\n CloseButton,\n CloseIcon,\n Container,\n Content,\n TopBar,\n Wrapper,\n} from \"./drawer.styles\";\nimport { NavBrandContainer, NavSeparator } from \"./navbar.styles\";\nimport { NavbarDrawerProps } from \"./types\";\n\nconst Component = (\n props: NavbarDrawerProps,\n ref: React.Ref<HTMLDivElement>\n) => {\n // =============================================================================\n // CONST, STATE, REFS\n // =============================================================================\n const {\n show,\n resources = {},\n children,\n hideNavBranding,\n onClose,\n onBrandClick,\n drawerLabel = \"Mobile navigation menu\",\n mobileMenuRef,\n } = props;\n const [viewHeight, setViewHeight] = useState<number>(0);\n const containerRef = useRef<HTMLDivElement>(null);\n\n const { primary, secondary } = resources;\n\n // =========================================================================\n // FLOATING UI CONFIG\n // =========================================================================\n const { context, refs: floatingRefs } = useFloating({\n open: show,\n onOpenChange: (open) => {\n if (!open && onClose) {\n onClose();\n }\n },\n });\n\n // =============================================================================\n // EVENT HANDLERS\n // =============================================================================\n const handleResize = () => {\n /**\n * Reference:\n * https://css-tricks.com/the-trick-to-viewport-units-on-mobile/\n */\n if (window) {\n const viewHeight = window.innerHeight * 0.01;\n setViewHeight(viewHeight);\n }\n };\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (!show) return;\n\n if (event.key === \"Escape\") {\n event.preventDefault();\n onClose?.();\n // Return focus to the hamburger menu button\n setTimeout(() => {\n mobileMenuRef?.current?.focus();\n }, 300);\n }\n };\n\n // =============================================================================\n // EFFECTS\n // =============================================================================\n useEffect(() => {\n handleResize();\n window.addEventListener(\"resize\", handleResize);\n\n return () => {\n window.removeEventListener(\"resize\", handleResize);\n };\n }, []);\n\n // Focus management when drawer opens\n useLayoutEffect(() => {\n if (show) {\n const timer = setTimeout(() => {\n if (containerRef.current) {\n containerRef.current.focus({ preventScroll: true });\n }\n }, 550);\n\n return () => clearTimeout(timer);\n }\n }, [show]);\n\n // =============================================================================\n // RENDER FUNCTIONS\n // =============================================================================\n const renderBrand = () => {\n return (\n <>\n {primary && (\n <Brand\n resources={primary}\n compress\n onClick={onBrandClick}\n data-id=\"drawer-brand-primary\"\n data-testid=\"drawer__brand\"\n type=\"primary\"\n />\n )}\n {secondary && (\n <>\n <NavSeparator />\n <Brand\n resources={secondary}\n compress\n onClick={onBrandClick}\n data-id=\"drawer-brand-secondary\"\n data-testid=\"drawer__brand-secondary\"\n type=\"secondary\"\n />\n </>\n )}\n </>\n );\n };\n\n const renderTopBar = () => (\n <TopBar>\n <NavBrandContainer data-id=\"drawer-brand-container\">\n {!hideNavBranding && renderBrand()}\n </NavBrandContainer>\n <CloseButton\n onClick={onClose}\n focusHighlight={false}\n aria-label=\"Close nav menu\"\n >\n <CloseIcon />\n </CloseButton>\n </TopBar>\n );\n\n return (\n <FloatingFocusManager\n context={context}\n initialFocus={-1}\n returnFocus={true}\n disabled={!show}\n >\n <Wrapper\n ref={mergeRefs(ref, floatingRefs.setFloating)}\n data-testid=\"drawer\"\n >\n <Container\n ref={containerRef}\n $show={show}\n $viewHeight={viewHeight}\n onKeyDown={handleKeyDown}\n tabIndex={-1}\n aria-label={drawerLabel}\n >\n <Content>\n {renderTopBar()}\n {children}\n </Content>\n </Container>\n </Wrapper>\n </FloatingFocusManager>\n );\n};\n\nexport const Drawer = React.forwardRef(Component);\n"],"names":["Drawer","React","forwardRef","props","ref","show","resources","children","hideNavBranding","onClose","onBrandClick","drawerLabel","mobileMenuRef","viewHeight","setViewHeight","useState","containerRef","useRef","primary","secondary","context","refs","floatingRefs","useFloating","open","onOpenChange","handleResize","window","innerHeight","useEffect","addEventListener","removeEventListener","useLayoutEffect","timer","setTimeout","current","focus","preventScroll","clearTimeout","_jsx","FloatingFocusManager","initialFocus","returnFocus","disabled","Wrapper","mergeRefs","setFloating","Container","$show","$viewHeight","onKeyDown","event","key","preventDefault","_a","tabIndex","_jsxs","Content","TopBar","NavBrandContainer","_Fragment","Brand","compress","onClick","type","NavSeparator","CloseButton","focusHighlight","CloseIcon"],"mappings":"osBAgBA,MAmKaA,EAASC,EAAMC,YAnKV,CACdC,EACAC,KAKA,MAAMC,KACFA,EAAIC,UACJA,EAAY,CAAA,EAAEC,SACdA,EAAQC,gBACRA,EAAeC,QACfA,EAAOC,aACPA,EAAYC,YACZA,EAAc,yBAAwBC,cACtCA,GACAT,GACGU,EAAYC,GAAiBC,EAAiB,GAC/CC,EAAeC,EAAuB,OAEtCC,QAAEA,EAAOC,UAAEA,GAAcb,GAKzBc,QAAEA,EAASC,KAAMC,GAAiBC,EAAY,CAChDC,KAAMnB,EACNoB,aAAeD,KACNA,GAAQf,GACTA,GACJ,IAOFiB,EAAe,KAKjB,GAAIC,OAAQ,CACR,MAAMd,EAAkC,IAArBc,OAAOC,YAC1Bd,EAAcD,EAClB,GAmBJgB,GAAU,KACNH,IACAC,OAAOG,iBAAiB,SAAUJ,GAE3B,KACHC,OAAOI,oBAAoB,SAAUL,EAAa,IAEvD,IAGHM,GAAgB,KACZ,GAAI3B,EAAM,CACN,MAAM4B,EAAQC,YAAW,KACjBlB,EAAamB,SACbnB,EAAamB,QAAQC,MAAM,CAAEC,eAAe,GAChD,GACD,KAEH,MAAO,IAAMC,aAAaL,EAC9B,IACD,CAAC5B,IAkDJ,OACIkC,EAACC,EAAoB,CACjBpB,QAASA,EACTqB,cAAc,EACdC,aAAa,EACbC,UAAWtC,EAAIE,SAEfgC,EAACK,EAAO,CACJxC,IAAKyC,EAAUzC,EAAKkB,EAAawB,aAAY,cACjC,SAAQvC,SAEpBgC,EAACQ,EAAS,CACN3C,IAAKY,EAAYgC,MACV3C,EAAI4C,YACEpC,EACbqC,UArGOC,IACd9C,GAEa,WAAd8C,EAAMC,MACND,EAAME,iBACN5C,SAAAA,IAEAyB,YAAW,WACe,QAAtBoB,EAAA1C,aAAa,EAAbA,EAAeuB,eAAO,IAAAmB,GAAAA,EAAElB,OAAO,GAChC,KACP,EA4FYmB,UAAU,EAAE,aACA5C,EAAWJ,SAEvBiD,EAACC,EAAO,CAAAlD,SAAA,CAjCpBiD,EAACE,EAAM,CAAAnD,SAAA,CACHgC,EAACoB,aAA0B,yBAAwBpD,UAC7CC,GA/BNgD,EAAAI,EAAA,CAAArD,SAAA,CACKW,GACGqB,EAACsB,EAAK,CACFvD,UAAWY,EACX4C,UAAQ,EACRC,QAASrD,EAAY,UACb,uBAAsB,cAClB,gBACZsD,KAAK,YAGZ7C,GACGqC,EAAAI,EAAA,CAAArD,SAAA,CACIgC,EAAC0B,EAAY,IACb1B,EAACsB,EAAK,CACFvD,UAAWa,EACX2C,UAAQ,EACRC,QAASrD,EAAY,UACb,yBAAwB,cACpB,0BACZsD,KAAK,sBAarBzB,EAAC2B,EAAW,CACRH,QAAStD,EACT0D,gBAAgB,EAAK,aACV,0BAEX5B,EAAC6B,WA0BQ7D,UAIM"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const
|
|
1
|
+
const e={primary:{brandName:"LifeSG",logoSrc:"https://assets.life.gov.sg/lifesg/logo-lifesg.svg"}},s={primary:{brandName:"BookingSG",logoSrc:"https://www.booking.gov.sg/logo.svg"}},o={primary:{brandName:"CCube",logoSrc:"https://assets.life.gov.sg/ccube/logo-ccube.svg"}},g={primary:{brandName:"IMDA",logoSrc:"https://assets.life.gov.sg/react-design-system/img/logo/imda-logo.svg"}},r={primary:{brandName:"MyLegacy",logoSrc:"https://mylegacy.life.gov.sg/images/site-logo.png"}},a={primary:{brandName:"SPF",logoSrc:"https://assets.life.gov.sg/react-design-system/img/logo/spf-logo.png"}},t={primary:{brandName:"SupportGoWhere",logoSrc:"https://assets.life.gov.sg/react-design-system/img/logo/sgw-logo.png"}},i={primary:{brandName:"ToteBoard",logoSrc:"https://assets.life.gov.sg/react-design-system/img/logo/tote-board-logo.svg"}},l=l=>{switch(l){case"bookingsg":return s;case"mylegacy":return r;case"ccube":return o;case"spf":return a;case"supportgowhere":return t;case"imda":return g;case"toteboard":return i;default:return e}};export{l as getDefaultResourceLogo};
|
|
2
2
|
//# sourceMappingURL=navbar-logo-data.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"navbar-logo-data.js","sources":["../../src/navbar/navbar-logo-data.ts"],"sourcesContent":["import { ResourceScheme } from \"../theme/types\";\nimport { NavbarResourcesProps } from \"./types\";\n\nconst DEFAULT_RESOURCES_LOGO: NavbarResourcesProps = {\n primary: {\n brandName: \"LifeSG\",\n logoSrc: \"https://assets.life.gov.sg/lifesg/logo-lifesg.svg\",\n },\n};\n\nconst BOOKINGSG_RESOURCES_LOGO: NavbarResourcesProps = {\n primary: {\n brandName: \"BookingSG\",\n logoSrc: \"https://www.booking.gov.sg/logo.svg\",\n },\n};\n\nconst CCUBE_RESOURCES_LOGO: NavbarResourcesProps = {\n primary: {\n brandName: \"CCube\",\n logoSrc: \"https://assets.life.gov.sg/ccube/logo-ccube.svg\",\n },\n};\n\nconst IMDA_RESOURCE_LOGO: NavbarResourcesProps = {\n primary: {\n brandName: \"IMDA\",\n logoSrc:\n \"https://assets.life.gov.sg/react-design-system/img/logo/imda-logo.svg\",\n },\n};\n\nconst MYLEGACY_RESOURCES_LOGO: NavbarResourcesProps = {\n primary: {\n brandName: \"MyLegacy\",\n logoSrc: \"https://mylegacy.life.gov.sg/images/site-logo.png\",\n },\n};\n\nconst SPF_RESOURCE_LOGO: NavbarResourcesProps = {\n primary: {\n brandName: \"SPF\",\n logoSrc:\n \"https://assets.life.gov.sg/react-design-system/img/logo/spf-logo.png\",\n },\n};\n\nconst SUPPORTGOWHERE_RESOURCE_LOGO: NavbarResourcesProps = {\n primary: {\n brandName: \"SupportGoWhere\",\n logoSrc:\n \"https://assets.life.gov.sg/react-design-system/img/logo/sgw-logo.png\",\n },\n};\n\nexport const getDefaultResourceLogo = (resourceScheme?: ResourceScheme) => {\n switch (resourceScheme) {\n case \"bookingsg\":\n return BOOKINGSG_RESOURCES_LOGO;\n case \"mylegacy\":\n return MYLEGACY_RESOURCES_LOGO;\n case \"ccube\":\n return CCUBE_RESOURCES_LOGO;\n case \"spf\":\n return SPF_RESOURCE_LOGO;\n case \"supportgowhere\":\n return SUPPORTGOWHERE_RESOURCE_LOGO;\n case \"imda\":\n return IMDA_RESOURCE_LOGO;\n default:\n return DEFAULT_RESOURCES_LOGO;\n }\n};\n"],"names":["DEFAULT_RESOURCES_LOGO","primary","brandName","logoSrc","BOOKINGSG_RESOURCES_LOGO","CCUBE_RESOURCES_LOGO","IMDA_RESOURCE_LOGO","MYLEGACY_RESOURCES_LOGO","SPF_RESOURCE_LOGO","SUPPORTGOWHERE_RESOURCE_LOGO","getDefaultResourceLogo","resourceScheme"],"mappings":"AAGA,MAAMA,EAA+C,CACjDC,QAAS,CACLC,UAAW,SACXC,QAAS,sDAIXC,EAAiD,CACnDH,QAAS,CACLC,UAAW,YACXC,QAAS,wCAIXE,EAA6C,CAC/CJ,QAAS,CACLC,UAAW,QACXC,QAAS,oDAIXG,EAA2C,CAC7CL,QAAS,CACLC,UAAW,OACXC,QACI,0EAINI,EAAgD,CAClDN,QAAS,CACLC,UAAW,WACXC,QAAS,sDAIXK,EAA0C,CAC5CP,QAAS,CACLC,UAAW,MACXC,QACI,yEAINM,EAAqD,CACvDR,QAAS,CACLC,UAAW,iBACXC,QACI,
|
|
1
|
+
{"version":3,"file":"navbar-logo-data.js","sources":["../../src/navbar/navbar-logo-data.ts"],"sourcesContent":["import { ResourceScheme } from \"../theme/types\";\nimport { NavbarResourcesProps } from \"./types\";\n\nconst DEFAULT_RESOURCES_LOGO: NavbarResourcesProps = {\n primary: {\n brandName: \"LifeSG\",\n logoSrc: \"https://assets.life.gov.sg/lifesg/logo-lifesg.svg\",\n },\n};\n\nconst BOOKINGSG_RESOURCES_LOGO: NavbarResourcesProps = {\n primary: {\n brandName: \"BookingSG\",\n logoSrc: \"https://www.booking.gov.sg/logo.svg\",\n },\n};\n\nconst CCUBE_RESOURCES_LOGO: NavbarResourcesProps = {\n primary: {\n brandName: \"CCube\",\n logoSrc: \"https://assets.life.gov.sg/ccube/logo-ccube.svg\",\n },\n};\n\nconst IMDA_RESOURCE_LOGO: NavbarResourcesProps = {\n primary: {\n brandName: \"IMDA\",\n logoSrc:\n \"https://assets.life.gov.sg/react-design-system/img/logo/imda-logo.svg\",\n },\n};\n\nconst MYLEGACY_RESOURCES_LOGO: NavbarResourcesProps = {\n primary: {\n brandName: \"MyLegacy\",\n logoSrc: \"https://mylegacy.life.gov.sg/images/site-logo.png\",\n },\n};\n\nconst SPF_RESOURCE_LOGO: NavbarResourcesProps = {\n primary: {\n brandName: \"SPF\",\n logoSrc:\n \"https://assets.life.gov.sg/react-design-system/img/logo/spf-logo.png\",\n },\n};\n\nconst SUPPORTGOWHERE_RESOURCE_LOGO: NavbarResourcesProps = {\n primary: {\n brandName: \"SupportGoWhere\",\n logoSrc:\n \"https://assets.life.gov.sg/react-design-system/img/logo/sgw-logo.png\",\n },\n};\n\nconst TOTEBOARD_RESOURCE_LOGO: NavbarResourcesProps = {\n primary: {\n brandName: \"ToteBoard\",\n logoSrc:\n \"https://assets.life.gov.sg/react-design-system/img/logo/tote-board-logo.svg\",\n },\n};\n\nexport const getDefaultResourceLogo = (resourceScheme?: ResourceScheme) => {\n switch (resourceScheme) {\n case \"bookingsg\":\n return BOOKINGSG_RESOURCES_LOGO;\n case \"mylegacy\":\n return MYLEGACY_RESOURCES_LOGO;\n case \"ccube\":\n return CCUBE_RESOURCES_LOGO;\n case \"spf\":\n return SPF_RESOURCE_LOGO;\n case \"supportgowhere\":\n return SUPPORTGOWHERE_RESOURCE_LOGO;\n case \"imda\":\n return IMDA_RESOURCE_LOGO;\n case \"toteboard\":\n return TOTEBOARD_RESOURCE_LOGO;\n default:\n return DEFAULT_RESOURCES_LOGO;\n }\n};\n"],"names":["DEFAULT_RESOURCES_LOGO","primary","brandName","logoSrc","BOOKINGSG_RESOURCES_LOGO","CCUBE_RESOURCES_LOGO","IMDA_RESOURCE_LOGO","MYLEGACY_RESOURCES_LOGO","SPF_RESOURCE_LOGO","SUPPORTGOWHERE_RESOURCE_LOGO","TOTEBOARD_RESOURCE_LOGO","getDefaultResourceLogo","resourceScheme"],"mappings":"AAGA,MAAMA,EAA+C,CACjDC,QAAS,CACLC,UAAW,SACXC,QAAS,sDAIXC,EAAiD,CACnDH,QAAS,CACLC,UAAW,YACXC,QAAS,wCAIXE,EAA6C,CAC/CJ,QAAS,CACLC,UAAW,QACXC,QAAS,oDAIXG,EAA2C,CAC7CL,QAAS,CACLC,UAAW,OACXC,QACI,0EAINI,EAAgD,CAClDN,QAAS,CACLC,UAAW,WACXC,QAAS,sDAIXK,EAA0C,CAC5CP,QAAS,CACLC,UAAW,MACXC,QACI,yEAINM,EAAqD,CACvDR,QAAS,CACLC,UAAW,iBACXC,QACI,yEAINO,EAAgD,CAClDT,QAAS,CACLC,UAAW,YACXC,QACI,gFAICQ,EAA0BC,IACnC,OAAQA,GACJ,IAAK,YACD,OAAOR,EACX,IAAK,WACD,OAAOG,EACX,IAAK,QACD,OAAOF,EACX,IAAK,MACD,OAAOG,EACX,IAAK,iBACD,OAAOC,EACX,IAAK,OACD,OAAOH,EACX,IAAK,YACD,OAAOI,EACX,QACI,OAAOV"}
|
package/navbar/navbar.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{__rest as e}from"../_virtual/_tslib.js";import{jsxs as i,jsx as n,Fragment as r}from"react/jsx-runtime";import{forwardRef as t,useState as a,useRef as o,useContext as s,useImperativeHandle as d,useEffect as l}from"react";import{ThemeContext as c}from"styled-components";import{Layout as m}from"../layout/index.js";import{Masthead as u}from"../masthead/masthead.js";import{Overlay as p}from"../overlay/overlay.js";import{Breakpoint as h}from"../theme/index.js";import{Brand as b}from"./brand.js";import{Drawer as v}from"./drawer.js";import{NavbarActionButtons as k}from"./navbar-action-buttons.js";import{NavbarHelper as f}from"./navbar-helper.js";import{NavbarItems as C}from"./navbar-items.js";import{getDefaultResourceLogo as y}from"./navbar-logo-data.js";import{Wrapper as w,Nav as B,NavElementsContainer as g,NavBrandContainer as j,NavSeparator as I,MobileMenuButton as x,MobileMenuIcon as L}from"./navbar.styles.js";const N=t(((t,N)=>{var{items:_,className:E,id:D,selectedId:O,compress:$=!1,fixed:A=!0,resources:M,hideNavElements:z=!1,hideNavBranding:H=!1,hideLinkIndicator:R=!1,drawerDismissalExclusions:S=[],actionButtons:T,onItemClick:W,onActionButtonClick:q,onBrandClick:F,masthead:G=!0,layout:J="default",headerLabel:K="Main navigation menu",drawerLabel:P}=t,Q=e(t,["items","className","id","selectedId","compress","fixed","resources","hideNavElements","hideNavBranding","hideLinkIndicator","drawerDismissalExclusions","actionButtons","onItemClick","onActionButtonClick","onBrandClick","masthead","layout","headerLabel","drawerLabel"]);const[U,V]=a(!1),[X,Y]=a(!1),Z=o(null),ee="stretch"===J,ie=o(null),ne=s(c),re=y(null==ne?void 0:ne.resourceScheme),te=h["lg-max"]({theme:ne}),ae=(null==M?void 0:M.primary)||re.primary,oe=null==M?void 0:M.secondary;d(N,(()=>Object.assign(ie.current,{dismissDrawer:()=>{se()}})),[U]),l((()=>(le(),window.addEventListener("resize",le),()=>{window.removeEventListener("resize",le)})),[]);const se=()=>{V(!1),setTimeout((()=>{Y(!1)}),550)},de=e=>U&&-1===S.indexOf(e),le=()=>{window.innerWidth<=te&&U&&se()},ce=(e,i)=>{F&&F(i),de("brand-click")&&se()},me=(e,i)=>{f.isNavItemCommon(i)&&i.onClick?i.onClick(e):W&&(e.preventDefault(),W(i)),f.isNavItemLink(i)&&!i.subMenu&&de("item-click")&&se()},ue=(e,i)=>{var n;"button"!==i.type&&"download"!==i.type||!(null===(n=i.args)||void 0===n?void 0:n.onClick)?q&&(e.preventDefault(),q(i)):i.args.onClick(e),de("item-click")&&se()},pe=()=>{V(!0),Y(!0)},he=()=>{de("close-button-click")&&se()},be=()=>{const e=_.mobile||_.desktop;return e&&e.length>0||T&&(e=>{const i=e.mobile||e.desktop;return!!i&&i.length&&i.some((e=>!e.uncollapsible))})(T)?n(x,{ref:Z,"aria-label":U?"Close nav menu":"Open nav menu","aria-expanded":U,"data-testid":"button__mobile-menu",onClick:pe,focusHighlight:!
|
|
1
|
+
import{__rest as e}from"../_virtual/_tslib.js";import{jsxs as i,jsx as n,Fragment as r}from"react/jsx-runtime";import{forwardRef as t,useState as a,useRef as o,useContext as s,useImperativeHandle as d,useEffect as l}from"react";import{ThemeContext as c}from"styled-components";import{Layout as m}from"../layout/index.js";import{Masthead as u}from"../masthead/masthead.js";import{Overlay as p}from"../overlay/overlay.js";import{Breakpoint as h}from"../theme/index.js";import{Brand as b}from"./brand.js";import{Drawer as v}from"./drawer.js";import{NavbarActionButtons as k}from"./navbar-action-buttons.js";import{NavbarHelper as f}from"./navbar-helper.js";import{NavbarItems as C}from"./navbar-items.js";import{getDefaultResourceLogo as y}from"./navbar-logo-data.js";import{Wrapper as w,Nav as B,NavElementsContainer as g,NavBrandContainer as j,NavSeparator as I,MobileMenuButton as x,MobileMenuIcon as L}from"./navbar.styles.js";const N=t(((t,N)=>{var{items:_,className:E,id:D,selectedId:O,compress:$=!1,fixed:A=!0,resources:M,hideNavElements:z=!1,hideNavBranding:H=!1,hideLinkIndicator:R=!1,drawerDismissalExclusions:S=[],actionButtons:T,onItemClick:W,onActionButtonClick:q,onBrandClick:F,masthead:G=!0,layout:J="default",headerLabel:K="Main navigation menu",drawerLabel:P}=t,Q=e(t,["items","className","id","selectedId","compress","fixed","resources","hideNavElements","hideNavBranding","hideLinkIndicator","drawerDismissalExclusions","actionButtons","onItemClick","onActionButtonClick","onBrandClick","masthead","layout","headerLabel","drawerLabel"]);const[U,V]=a(!1),[X,Y]=a(!1),Z=o(null),ee="stretch"===J,ie=o(null),ne=s(c),re=y(null==ne?void 0:ne.resourceScheme),te=h["lg-max"]({theme:ne}),ae=(null==M?void 0:M.primary)||re.primary,oe=null==M?void 0:M.secondary;d(N,(()=>Object.assign(ie.current,{dismissDrawer:()=>{se()}})),[U]),l((()=>(le(),window.addEventListener("resize",le),()=>{window.removeEventListener("resize",le)})),[]);const se=()=>{V(!1),setTimeout((()=>{Y(!1)}),550)},de=e=>U&&-1===S.indexOf(e),le=()=>{window.innerWidth<=te&&U&&se()},ce=(e,i)=>{F&&F(i),de("brand-click")&&se()},me=(e,i)=>{f.isNavItemCommon(i)&&i.onClick?i.onClick(e):W&&(e.preventDefault(),W(i)),f.isNavItemLink(i)&&!i.subMenu&&de("item-click")&&se()},ue=(e,i)=>{var n;"button"!==i.type&&"download"!==i.type||!(null===(n=i.args)||void 0===n?void 0:n.onClick)?q&&(e.preventDefault(),q(i)):i.args.onClick(e),de("item-click")&&se()},pe=()=>{V(!0),Y(!0)},he=()=>{de("close-button-click")&&se()},be=()=>{const e=_.mobile||_.desktop;return e&&e.length>0||T&&(e=>{const i=e.mobile||e.desktop;return!!i&&i.length&&i.some((e=>!e.uncollapsible))})(T)?n(x,{ref:Z,"aria-label":U?"Close nav menu":"Open nav menu","aria-expanded":U,"data-testid":"button__mobile-menu",onClick:pe,focusHighlight:!0,children:n(L,{})}):null};return i(w,{ref:ie,$fixed:A,className:E,id:D||"navbar-wrapper","data-testid":Q["data-testid"]||"navbar-wrapper",children:[G&&n(u,{stretch:ee}),i(m.Content,{stretch:ee,children:[i(B,{$compress:$,"aria-label":K,children:[!H&&i(j,{$compress:$,"data-id":"brand-container",children:[ae&&n(b,{resources:ae,onClick:ce,"data-id":"brand-primary","data-testid":"main__brand",type:"primary"}),oe&&i(r,{children:[n(I,{$compress:$}),n(b,{resources:oe,onClick:ce,"data-id":"brand-secondary","data-testid":"main__brand-secondary",type:"secondary"})]})]}),!z&&i(g,{$hideNavBranding:H,children:[n(C,{items:_.desktop,onItemClick:me,selectedId:O,hideNavBranding:H,hideLinkIndicator:R}),n(k,{actionButtons:T,onActionButtonClick:ue}),be()]})]}),!z&&n(p,{show:X,enableOverlayClick:!0,onOverlayClick:he,children:i(v,{show:U,resources:{primary:ae,secondary:oe},onClose:he,onBrandClick:ce,actionButtons:T,hideNavBranding:H,mobileMenuRef:Z,drawerLabel:P,children:[n(C,{items:_.mobile||_.desktop,onItemClick:me,selectedId:O,mobile:!0,hideLinkIndicator:R}),n(k,{actionButtons:T,onActionButtonClick:ue,mobile:!0})]})})]})]})}));export{N as Navbar};
|
|
2
2
|
//# sourceMappingURL=navbar.js.map
|