@razorpay/blade 12.53.0 → 12.54.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (92) hide show
  1. package/build/lib/native/components/Box/BaseBox/types/propsTypes.js.map +1 -1
  2. package/build/lib/native/components/Dropdown/dropdownUtils.js +1 -1
  3. package/build/lib/native/components/Dropdown/dropdownUtils.js.map +1 -1
  4. package/build/lib/native/components/Input/BaseInput/BaseInput.js +1 -1
  5. package/build/lib/native/components/Input/BaseInput/BaseInput.js.map +1 -1
  6. package/build/lib/native/components/Input/DropdownInputTriggers/AutoComplete.js +1 -1
  7. package/build/lib/native/components/Input/DropdownInputTriggers/AutoComplete.js.map +1 -1
  8. package/build/lib/native/components/TimePicker/TimePicker.native.js +7 -0
  9. package/build/lib/native/components/TimePicker/TimePicker.native.js.map +1 -0
  10. package/build/lib/native/components/index.js +1 -0
  11. package/build/lib/native/components/index.js.map +1 -1
  12. package/build/lib/native/tokens/global/size.js +1 -1
  13. package/build/lib/native/tokens/global/size.js.map +1 -1
  14. package/build/lib/native/utils/metaAttribute/metaConstants.js +1 -1
  15. package/build/lib/native/utils/metaAttribute/metaConstants.js.map +1 -1
  16. package/build/lib/web/development/components/BottomSheet/BottomSheet.web.js +14 -1
  17. package/build/lib/web/development/components/BottomSheet/BottomSheet.web.js.map +1 -1
  18. package/build/lib/web/development/components/Box/BaseBox/types/propsTypes.js.map +1 -1
  19. package/build/lib/web/development/components/DatePicker/usePopup.js.map +1 -1
  20. package/build/lib/web/development/components/Dropdown/dropdownUtils.js +1 -1
  21. package/build/lib/web/development/components/Dropdown/dropdownUtils.js.map +1 -1
  22. package/build/lib/web/development/components/Input/BaseInput/BaseInput.js +4 -2
  23. package/build/lib/web/development/components/Input/BaseInput/BaseInput.js.map +1 -1
  24. package/build/lib/web/development/components/Input/BaseInput/StyledBaseInput.web.js +41 -2
  25. package/build/lib/web/development/components/Input/BaseInput/StyledBaseInput.web.js.map +1 -1
  26. package/build/lib/web/development/components/Input/DropdownInputTriggers/AutoComplete.js +1 -1
  27. package/build/lib/web/development/components/Input/DropdownInputTriggers/AutoComplete.js.map +1 -1
  28. package/build/lib/web/development/components/TimePicker/BaseTimePicker.web.js +262 -0
  29. package/build/lib/web/development/components/TimePicker/BaseTimePicker.web.js.map +1 -0
  30. package/build/lib/web/development/components/TimePicker/SpinWheel.web.js +188 -0
  31. package/build/lib/web/development/components/TimePicker/SpinWheel.web.js.map +1 -0
  32. package/build/lib/web/development/components/TimePicker/TimeInput.web.js +256 -0
  33. package/build/lib/web/development/components/TimePicker/TimeInput.web.js.map +1 -0
  34. package/build/lib/web/development/components/TimePicker/TimePicker.web.js +13 -0
  35. package/build/lib/web/development/components/TimePicker/TimePicker.web.js.map +1 -0
  36. package/build/lib/web/development/components/TimePicker/TimePickerContent.web.js +200 -0
  37. package/build/lib/web/development/components/TimePicker/TimePickerContent.web.js.map +1 -0
  38. package/build/lib/web/development/components/TimePicker/TimePickerFooter.web.js +49 -0
  39. package/build/lib/web/development/components/TimePicker/TimePickerFooter.web.js.map +1 -0
  40. package/build/lib/web/development/components/TimePicker/index.js +2 -0
  41. package/build/lib/web/development/components/TimePicker/index.js.map +1 -0
  42. package/build/lib/web/development/components/TimePicker/useTimePickerState.js +146 -0
  43. package/build/lib/web/development/components/TimePicker/useTimePickerState.js.map +1 -0
  44. package/build/lib/web/development/components/TimePicker/utils.js +252 -0
  45. package/build/lib/web/development/components/TimePicker/utils.js.map +1 -0
  46. package/build/lib/web/development/components/index.js +2 -0
  47. package/build/lib/web/development/components/index.js.map +1 -1
  48. package/build/lib/web/development/tokens/global/size.js +16 -0
  49. package/build/lib/web/development/tokens/global/size.js.map +1 -1
  50. package/build/lib/web/development/utils/metaAttribute/metaConstants.js +2 -1
  51. package/build/lib/web/development/utils/metaAttribute/metaConstants.js.map +1 -1
  52. package/build/lib/web/production/components/BottomSheet/BottomSheet.web.js +14 -1
  53. package/build/lib/web/production/components/BottomSheet/BottomSheet.web.js.map +1 -1
  54. package/build/lib/web/production/components/Box/BaseBox/types/propsTypes.js.map +1 -1
  55. package/build/lib/web/production/components/DatePicker/usePopup.js.map +1 -1
  56. package/build/lib/web/production/components/Dropdown/dropdownUtils.js +1 -1
  57. package/build/lib/web/production/components/Dropdown/dropdownUtils.js.map +1 -1
  58. package/build/lib/web/production/components/Input/BaseInput/BaseInput.js +4 -2
  59. package/build/lib/web/production/components/Input/BaseInput/BaseInput.js.map +1 -1
  60. package/build/lib/web/production/components/Input/BaseInput/StyledBaseInput.web.js +41 -2
  61. package/build/lib/web/production/components/Input/BaseInput/StyledBaseInput.web.js.map +1 -1
  62. package/build/lib/web/production/components/Input/DropdownInputTriggers/AutoComplete.js +1 -1
  63. package/build/lib/web/production/components/Input/DropdownInputTriggers/AutoComplete.js.map +1 -1
  64. package/build/lib/web/production/components/TimePicker/BaseTimePicker.web.js +262 -0
  65. package/build/lib/web/production/components/TimePicker/BaseTimePicker.web.js.map +1 -0
  66. package/build/lib/web/production/components/TimePicker/SpinWheel.web.js +188 -0
  67. package/build/lib/web/production/components/TimePicker/SpinWheel.web.js.map +1 -0
  68. package/build/lib/web/production/components/TimePicker/TimeInput.web.js +256 -0
  69. package/build/lib/web/production/components/TimePicker/TimeInput.web.js.map +1 -0
  70. package/build/lib/web/production/components/TimePicker/TimePicker.web.js +13 -0
  71. package/build/lib/web/production/components/TimePicker/TimePicker.web.js.map +1 -0
  72. package/build/lib/web/production/components/TimePicker/TimePickerContent.web.js +200 -0
  73. package/build/lib/web/production/components/TimePicker/TimePickerContent.web.js.map +1 -0
  74. package/build/lib/web/production/components/TimePicker/TimePickerFooter.web.js +49 -0
  75. package/build/lib/web/production/components/TimePicker/TimePickerFooter.web.js.map +1 -0
  76. package/build/lib/web/production/components/TimePicker/index.js +2 -0
  77. package/build/lib/web/production/components/TimePicker/index.js.map +1 -0
  78. package/build/lib/web/production/components/TimePicker/useTimePickerState.js +146 -0
  79. package/build/lib/web/production/components/TimePicker/useTimePickerState.js.map +1 -0
  80. package/build/lib/web/production/components/TimePicker/utils.js +252 -0
  81. package/build/lib/web/production/components/TimePicker/utils.js.map +1 -0
  82. package/build/lib/web/production/components/index.js +2 -0
  83. package/build/lib/web/production/components/index.js.map +1 -1
  84. package/build/lib/web/production/tokens/global/size.js +16 -0
  85. package/build/lib/web/production/tokens/global/size.js.map +1 -1
  86. package/build/lib/web/production/utils/metaAttribute/metaConstants.js +2 -1
  87. package/build/lib/web/production/utils/metaAttribute/metaConstants.js.map +1 -1
  88. package/build/types/components/index.d.ts +426 -242
  89. package/build/types/components/index.native.d.ts +148 -144
  90. package/build/types/tokens/index.d.ts +16 -0
  91. package/build/types/tokens/index.native.d.ts +16 -0
  92. package/package.json +5 -1
@@ -1 +1 @@
1
- {"version":3,"file":"AutoComplete.js","sources":["../../../../../../../src/components/Input/DropdownInputTriggers/AutoComplete.tsx"],"sourcesContent":["import React from 'react';\nimport { useDropdown } from '../../Dropdown/useDropdown';\nimport type { AutoCompleteProps, BaseDropdownInputTriggerProps } from './types';\nimport { BaseDropdownInputTrigger } from './BaseDropdownInputTrigger';\nimport { assignWithoutSideEffects } from '~utils/assignWithoutSideEffects';\nimport BaseBox from '~components/Box/BaseBox';\nimport type { BladeElementRef } from '~utils/types';\nimport { dropdownComponentIds } from '~components/Dropdown/dropdownComponentIds';\nimport { isReactNative } from '~utils';\n\nconst useAutoComplete = ({\n props,\n inputValue,\n setInputValue,\n getOptionValues,\n}: {\n props: AutoCompleteProps;\n setInputValue: (inputValue: string) => void;\n inputValue: string;\n getOptionValues: () => string[];\n}): {\n onTriggerKeydown: BaseDropdownInputTriggerProps['onTriggerKeydown'];\n onSelectionChange: BaseDropdownInputTriggerProps['onChange'];\n onInputValueChange: BaseDropdownInputTriggerProps['onInputValueChange'];\n} => {\n const {\n onTriggerKeydown: onBaseDropdownInputKeydown,\n isOpen,\n setIsOpen,\n selectedIndices,\n setSelectedIndices,\n setControlledValueIndices,\n isControlled,\n options,\n setFilteredValues: setGlobalFilteredValues,\n activeTagIndex,\n setActiveTagIndex,\n setActiveIndex,\n filteredValues: globalFilteredValues,\n selectionType,\n triggererRef,\n hasAutoCompleteInHeader,\n } = useDropdown();\n\n const resetFilters = (): void => setGlobalFilteredValues(getOptionValues());\n\n // Makes sure that first item is always in focus\n React.useEffect((): void => {\n const firstItemOptionIndex = options.findIndex(\n (option) => option.value === globalFilteredValues[0],\n );\n\n if (firstItemOptionIndex >= 0) {\n setActiveIndex(firstItemOptionIndex);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [globalFilteredValues.length, options.length]);\n\n // When input is empty or its single select, we want all items to be shown in filter on open of dropdown\n React.useEffect(() => {\n if (isOpen && !inputValue) {\n resetFilters();\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [isOpen, options]);\n\n React.useEffect(() => {\n if (isOpen && selectionType === 'single') {\n resetFilters();\n }\n\n // Just setting autoFocus is setting the input in focus state but its not showing keyboard active.\n // We do this in web to get around that\n if (hasAutoCompleteInHeader && isOpen && !isReactNative()) {\n triggererRef.current?.focus();\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [isOpen]);\n\n const onInputValueChange: BaseDropdownInputTriggerProps['onInputValueChange'] = ({\n name,\n value,\n }) => {\n setInputValue(value ?? '');\n props.onInputValueChange?.({ name, value });\n setActiveTagIndex(-1);\n\n if (!isOpen) {\n setIsOpen(true);\n }\n\n // default filtering when filteredValues is uncontrolled\n if (!props.filteredValues) {\n // eslint-disable-next-line no-lonely-if\n if (value && options && options.length > 0) {\n const filteredOptions = getOptionValues().filter((optionValue) =>\n optionValue.toLowerCase().includes(value.toLowerCase()),\n );\n setGlobalFilteredValues(filteredOptions);\n } else {\n resetFilters();\n }\n }\n };\n\n const onTriggerKeydown: BaseDropdownInputTriggerProps['onTriggerKeydown'] = (e) => {\n // Pressing backspace on empty input should remove the last tag\n if (e.key === 'Backspace' && !inputValue && activeTagIndex < 0 && selectedIndices.length > 0) {\n if (isControlled) {\n setControlledValueIndices(selectedIndices.slice(0, -1));\n } else {\n setSelectedIndices(selectedIndices.slice(0, -1));\n }\n }\n onBaseDropdownInputKeydown?.(e);\n };\n\n const onSelectionChange: BaseDropdownInputTriggerProps['onChange'] = ({ values }) => {\n console.log('selection change', values);\n if (selectionType === 'multiple') {\n setInputValue('');\n props.onInputValueChange?.({ name: props.name, value: '' });\n setActiveTagIndex(-1);\n resetFilters();\n } else {\n const displayText = options.find((option) => option.value === values[0])?.title;\n props.onInputValueChange?.({\n name: props.name,\n value: displayText,\n });\n // Use displayText as inputValue only if its not controlled by user\n if (hasAutoCompleteInHeader) {\n setInputValue('');\n } else if (typeof props.value === 'undefined') {\n setInputValue(displayText ?? '');\n }\n }\n props.onChange?.({ name: props.name, values });\n };\n return {\n onSelectionChange,\n onTriggerKeydown,\n onInputValueChange,\n };\n};\n\nconst _AutoComplete = (\n props: AutoCompleteProps,\n ref: React.ForwardedRef<BladeElementRef>,\n): React.ReactElement => {\n const [uncontrolledInputValue, setInputValue] = React.useState('');\n const inputValue = props.inputValue ?? uncontrolledInputValue;\n\n const {\n options,\n setFilteredValues: setGlobalFilteredValues,\n hasAutoCompleteInHeader,\n setHasAutoCompleteInHeader,\n onTriggerClick,\n dropdownTriggerer,\n } = useDropdown();\n\n const getOptionValues = React.useCallback(() => {\n return options.map((option) => option.value);\n }, [options]);\n\n const { onSelectionChange, onTriggerKeydown, onInputValueChange } = useAutoComplete({\n props,\n inputValue,\n setInputValue,\n getOptionValues,\n });\n\n React.useEffect(() => {\n if (dropdownTriggerer !== dropdownComponentIds.triggers.AutoComplete) {\n // When AutoComplete is mounted but not as trigger,\n // it has to be somewhere in the BottomSheet (most likely header based on UI but works in other parts too)\n setHasAutoCompleteInHeader(true);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // handles controlled filteredValues state (syncs it with our global filteredValues)\n React.useEffect(() => {\n if (props.filteredValues) {\n setGlobalFilteredValues(props.filteredValues);\n }\n }, [props.filteredValues, setGlobalFilteredValues]);\n\n // set autoFocus to true when used inside bottomsheet\n const defaultAutoFocusState = hasAutoCompleteInHeader ? true : undefined;\n\n return (\n <BaseBox position=\"relative\">\n <BaseDropdownInputTrigger\n {...props}\n // eslint-disable-next-line jsx-a11y/no-autofocus\n autoFocus={props.autoFocus ?? defaultAutoFocusState}\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ref={ref as any}\n onChange={onSelectionChange}\n isSelectInput={false}\n inputValue={inputValue}\n syncInputValueWithSelection={(value) => {\n if (!value) {\n setInputValue('');\n return;\n }\n const selectedOption = options.find((option) => option.value === value);\n setInputValue(selectedOption?.title ?? '');\n }}\n onTriggerKeydown={onTriggerKeydown}\n onInputValueChange={onInputValueChange}\n onTriggerClick={(triggerEvent) => {\n if (!hasAutoCompleteInHeader) {\n // we don't want clicking on autocomplete to open / close Dropdown when it is used inside BottomSheet's header\n onTriggerClick();\n }\n props?.onClick?.(triggerEvent);\n }}\n />\n </BaseBox>\n );\n};\n\n/**\n * ### AutoComplete\n *\n * Extension on top of SelectInput which allows you type and filter between ActionList items\n *\n * To be used in combination of `Dropdown` and `ActionList` component\n *\n * ---\n *\n * #### Usage in Desktop\n *\n * ```diff\n * <Dropdown>\n * + <AutoComplete label=\"Select Fruits\" />\n * <DropdownOverlay>\n * <ActionList>\n * <ActionListItem title=\"Mango\" value=\"mango\" />\n * <ActionListItem title=\"Apple\" value=\"apple\" />\n * </ActionList>\n * </DropdownOverlay>\n * </Dropdown>\n * ```\n *\n * #### Usage in Mobile\n *\n * ```diff\n * <Dropdown>\n * + <SelectInput label=\"Select Fruits\" />\n * <BottomSheet>\n * <BottomSheetHeader>\n * + <AutoComplete label=\"Select Fruits\" />\n * </BottomSheetHeader>\n * <BottomSheetBody>\n * <ActionList>\n * <ActionListItem title=\"Mango\" value=\"mango\" />\n * <ActionListItem title=\"Apple\" value=\"apple\" />\n * </ActionList>\n * </BottomSheetBody>\n * </BottomSheet>\n * </Dropdown>\n * ```\n *\n * ---\n *\n * Checkout {@link https://blade.razorpay.com/?path=/docs/components-dropdown-with-autocomplete--with-single-select AutoComplete Documentation}.\n */\nconst AutoComplete = assignWithoutSideEffects(React.forwardRef(_AutoComplete), {\n componentId: dropdownComponentIds.triggers.AutoComplete,\n});\n\nexport { AutoComplete };\n"],"names":["useAutoComplete","_ref","props","inputValue","setInputValue","getOptionValues","_useDropdown","useDropdown","onBaseDropdownInputKeydown","onTriggerKeydown","isOpen","setIsOpen","selectedIndices","setSelectedIndices","setControlledValueIndices","isControlled","options","setGlobalFilteredValues","setFilteredValues","activeTagIndex","setActiveTagIndex","setActiveIndex","globalFilteredValues","filteredValues","selectionType","triggererRef","hasAutoCompleteInHeader","resetFilters","React","useEffect","firstItemOptionIndex","findIndex","option","value","length","isReactNative","_triggererRef$current","current","focus","onInputValueChange","_ref2","_props$onInputValueCh","name","call","filteredOptions","filter","optionValue","toLowerCase","includes","e","key","slice","onSelectionChange","_ref3","_props$onChange","values","console","log","_props$onInputValueCh2","_options$find","_props$onInputValueCh3","displayText","find","title","onChange","_AutoComplete","ref","_props$inputValue","_props$autoFocus","_React$useState","useState","_React$useState2","_slicedToArray","uncontrolledInputValue","_useDropdown2","setHasAutoCompleteInHeader","onTriggerClick","dropdownTriggerer","useCallback","map","_useAutoComplete","dropdownComponentIds","triggers","AutoComplete","defaultAutoFocusState","undefined","_jsx","BaseBox","position","children","BaseDropdownInputTrigger","_objectSpread","autoFocus","isSelectInput","syncInputValueWithSelection","_selectedOption$title","selectedOption","triggerEvent","_props$onClick","onClick","assignWithoutSideEffects","forwardRef","componentId"],"mappings":"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"}
1
+ {"version":3,"file":"AutoComplete.js","sources":["../../../../../../../src/components/Input/DropdownInputTriggers/AutoComplete.tsx"],"sourcesContent":["import React from 'react';\nimport { useDropdown } from '../../Dropdown/useDropdown';\nimport type { AutoCompleteProps, BaseDropdownInputTriggerProps } from './types';\nimport { BaseDropdownInputTrigger } from './BaseDropdownInputTrigger';\nimport { assignWithoutSideEffects } from '~utils/assignWithoutSideEffects';\nimport BaseBox from '~components/Box/BaseBox';\nimport type { BladeElementRef } from '~utils/types';\nimport { dropdownComponentIds } from '~components/Dropdown/dropdownComponentIds';\nimport { isReactNative } from '~utils';\n\nconst useAutoComplete = ({\n props,\n inputValue,\n setInputValue,\n getOptionValues,\n}: {\n props: AutoCompleteProps;\n setInputValue: (inputValue: string) => void;\n inputValue: string;\n getOptionValues: () => string[];\n}): {\n onTriggerKeydown: BaseDropdownInputTriggerProps['onTriggerKeydown'];\n onSelectionChange: BaseDropdownInputTriggerProps['onChange'];\n onInputValueChange: BaseDropdownInputTriggerProps['onInputValueChange'];\n} => {\n const {\n onTriggerKeydown: onBaseDropdownInputKeydown,\n isOpen,\n setIsOpen,\n selectedIndices,\n setSelectedIndices,\n setControlledValueIndices,\n isControlled,\n options,\n setFilteredValues: setGlobalFilteredValues,\n activeTagIndex,\n setActiveTagIndex,\n setActiveIndex,\n filteredValues: globalFilteredValues,\n selectionType,\n triggererRef,\n hasAutoCompleteInHeader,\n } = useDropdown();\n\n const resetFilters = (): void => setGlobalFilteredValues(getOptionValues());\n\n // Makes sure that first item is always in focus\n React.useEffect((): void => {\n const firstItemOptionIndex = options.findIndex(\n (option) => option.value === globalFilteredValues[0],\n );\n\n if (firstItemOptionIndex >= 0) {\n setActiveIndex(firstItemOptionIndex);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [globalFilteredValues.length, options.length]);\n\n // When input is empty or its single select, we want all items to be shown in filter on open of dropdown\n React.useEffect(() => {\n if (isOpen && !inputValue) {\n resetFilters();\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [isOpen, options]);\n\n React.useEffect(() => {\n if (isOpen && selectionType === 'single') {\n resetFilters();\n }\n\n // Just setting autoFocus is setting the input in focus state but its not showing keyboard active.\n // We do this in web to get around that\n if (hasAutoCompleteInHeader && isOpen && !isReactNative()) {\n triggererRef.current?.focus();\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [isOpen]);\n\n const onInputValueChange: BaseDropdownInputTriggerProps['onInputValueChange'] = ({\n name,\n value,\n }) => {\n setInputValue(value ?? '');\n props.onInputValueChange?.({ name, value });\n setActiveTagIndex(-1);\n\n if (!isOpen) {\n setIsOpen(true);\n }\n\n // default filtering when filteredValues is uncontrolled\n if (!props.filteredValues) {\n // eslint-disable-next-line no-lonely-if\n if (value && options && options.length > 0) {\n const filteredOptions = getOptionValues().filter((optionValue) =>\n String(optionValue).toLowerCase().includes(value.toLowerCase()),\n );\n setGlobalFilteredValues(filteredOptions);\n } else {\n resetFilters();\n }\n }\n };\n\n const onTriggerKeydown: BaseDropdownInputTriggerProps['onTriggerKeydown'] = (e) => {\n // Pressing backspace on empty input should remove the last tag\n if (e.key === 'Backspace' && !inputValue && activeTagIndex < 0 && selectedIndices.length > 0) {\n if (isControlled) {\n setControlledValueIndices(selectedIndices.slice(0, -1));\n } else {\n setSelectedIndices(selectedIndices.slice(0, -1));\n }\n }\n onBaseDropdownInputKeydown?.(e);\n };\n\n const onSelectionChange: BaseDropdownInputTriggerProps['onChange'] = ({ values }) => {\n console.log('selection change', values);\n if (selectionType === 'multiple') {\n setInputValue('');\n props.onInputValueChange?.({ name: props.name, value: '' });\n setActiveTagIndex(-1);\n resetFilters();\n } else {\n const displayText = options.find((option) => option.value === values[0])?.title;\n props.onInputValueChange?.({\n name: props.name,\n value: displayText,\n });\n // Use displayText as inputValue only if its not controlled by user\n if (hasAutoCompleteInHeader) {\n setInputValue('');\n } else if (typeof props.value === 'undefined') {\n setInputValue(displayText ?? '');\n }\n }\n props.onChange?.({ name: props.name, values });\n };\n return {\n onSelectionChange,\n onTriggerKeydown,\n onInputValueChange,\n };\n};\n\nconst _AutoComplete = (\n props: AutoCompleteProps,\n ref: React.ForwardedRef<BladeElementRef>,\n): React.ReactElement => {\n const [uncontrolledInputValue, setInputValue] = React.useState('');\n const inputValue = props.inputValue ?? uncontrolledInputValue;\n\n const {\n options,\n setFilteredValues: setGlobalFilteredValues,\n hasAutoCompleteInHeader,\n setHasAutoCompleteInHeader,\n onTriggerClick,\n dropdownTriggerer,\n } = useDropdown();\n\n const getOptionValues = React.useCallback(() => {\n return options.map((option) => option.value);\n }, [options]);\n\n const { onSelectionChange, onTriggerKeydown, onInputValueChange } = useAutoComplete({\n props,\n inputValue,\n setInputValue,\n getOptionValues,\n });\n\n React.useEffect(() => {\n if (dropdownTriggerer !== dropdownComponentIds.triggers.AutoComplete) {\n // When AutoComplete is mounted but not as trigger,\n // it has to be somewhere in the BottomSheet (most likely header based on UI but works in other parts too)\n setHasAutoCompleteInHeader(true);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // handles controlled filteredValues state (syncs it with our global filteredValues)\n React.useEffect(() => {\n if (props.filteredValues) {\n setGlobalFilteredValues(props.filteredValues);\n }\n }, [props.filteredValues, setGlobalFilteredValues]);\n\n // set autoFocus to true when used inside bottomsheet\n const defaultAutoFocusState = hasAutoCompleteInHeader ? true : undefined;\n\n return (\n <BaseBox position=\"relative\">\n <BaseDropdownInputTrigger\n {...props}\n // eslint-disable-next-line jsx-a11y/no-autofocus\n autoFocus={props.autoFocus ?? defaultAutoFocusState}\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ref={ref as any}\n onChange={onSelectionChange}\n isSelectInput={false}\n inputValue={inputValue}\n syncInputValueWithSelection={(value) => {\n if (!value) {\n setInputValue('');\n return;\n }\n const selectedOption = options.find((option) => option.value === value);\n setInputValue(selectedOption?.title ?? '');\n }}\n onTriggerKeydown={onTriggerKeydown}\n onInputValueChange={onInputValueChange}\n onTriggerClick={(triggerEvent) => {\n if (!hasAutoCompleteInHeader) {\n // we don't want clicking on autocomplete to open / close Dropdown when it is used inside BottomSheet's header\n onTriggerClick();\n }\n props?.onClick?.(triggerEvent);\n }}\n />\n </BaseBox>\n );\n};\n\n/**\n * ### AutoComplete\n *\n * Extension on top of SelectInput which allows you type and filter between ActionList items\n *\n * To be used in combination of `Dropdown` and `ActionList` component\n *\n * ---\n *\n * #### Usage in Desktop\n *\n * ```diff\n * <Dropdown>\n * + <AutoComplete label=\"Select Fruits\" />\n * <DropdownOverlay>\n * <ActionList>\n * <ActionListItem title=\"Mango\" value=\"mango\" />\n * <ActionListItem title=\"Apple\" value=\"apple\" />\n * </ActionList>\n * </DropdownOverlay>\n * </Dropdown>\n * ```\n *\n * #### Usage in Mobile\n *\n * ```diff\n * <Dropdown>\n * + <SelectInput label=\"Select Fruits\" />\n * <BottomSheet>\n * <BottomSheetHeader>\n * + <AutoComplete label=\"Select Fruits\" />\n * </BottomSheetHeader>\n * <BottomSheetBody>\n * <ActionList>\n * <ActionListItem title=\"Mango\" value=\"mango\" />\n * <ActionListItem title=\"Apple\" value=\"apple\" />\n * </ActionList>\n * </BottomSheetBody>\n * </BottomSheet>\n * </Dropdown>\n * ```\n *\n * ---\n *\n * Checkout {@link https://blade.razorpay.com/?path=/docs/components-dropdown-with-autocomplete--with-single-select AutoComplete Documentation}.\n */\nconst AutoComplete = assignWithoutSideEffects(React.forwardRef(_AutoComplete), {\n componentId: dropdownComponentIds.triggers.AutoComplete,\n});\n\nexport { AutoComplete };\n"],"names":["useAutoComplete","_ref","props","inputValue","setInputValue","getOptionValues","_useDropdown","useDropdown","onBaseDropdownInputKeydown","onTriggerKeydown","isOpen","setIsOpen","selectedIndices","setSelectedIndices","setControlledValueIndices","isControlled","options","setGlobalFilteredValues","setFilteredValues","activeTagIndex","setActiveTagIndex","setActiveIndex","globalFilteredValues","filteredValues","selectionType","triggererRef","hasAutoCompleteInHeader","resetFilters","React","useEffect","firstItemOptionIndex","findIndex","option","value","length","isReactNative","_triggererRef$current","current","focus","onInputValueChange","_ref2","_props$onInputValueCh","name","call","filteredOptions","filter","optionValue","String","toLowerCase","includes","e","key","slice","onSelectionChange","_ref3","_props$onChange","values","console","log","_props$onInputValueCh2","_options$find","_props$onInputValueCh3","displayText","find","title","onChange","_AutoComplete","ref","_props$inputValue","_props$autoFocus","_React$useState","useState","_React$useState2","_slicedToArray","uncontrolledInputValue","_useDropdown2","setHasAutoCompleteInHeader","onTriggerClick","dropdownTriggerer","useCallback","map","_useAutoComplete","dropdownComponentIds","triggers","AutoComplete","defaultAutoFocusState","undefined","_jsx","BaseBox","position","children","BaseDropdownInputTrigger","_objectSpread","autoFocus","isSelectInput","syncInputValueWithSelection","_selectedOption$title","selectedOption","triggerEvent","_props$onClick","onClick","assignWithoutSideEffects","forwardRef","componentId"],"mappings":"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"}
@@ -0,0 +1,262 @@
1
+ import _defineProperty from '@babel/runtime/helpers/defineProperty';
2
+ import _objectWithoutProperties from '@babel/runtime/helpers/objectWithoutProperties';
3
+ import React__default, { useRef } from 'react';
4
+ import { FloatingPortal, FloatingFocusManager } from '@floating-ui/react';
5
+ import { TimeInput } from './TimeInput.web.js';
6
+ import { useTimePickerState } from './useTimePickerState.js';
7
+ import { TimePickerContent } from './TimePickerContent.web.js';
8
+ import '../BottomSheet/index.js';
9
+ import '../Box/BaseBox/index.js';
10
+ import '../../utils/assignWithoutSideEffects/index.js';
11
+ import '../../utils/makeAccessible/index.js';
12
+ import { useId } from '../../utils/useId.js';
13
+ import { useIsMobile } from '../../utils/useIsMobile.js';
14
+ import '../../utils/index.js';
15
+ import { usePopup } from '../DatePicker/usePopup.js';
16
+ import '../Box/styledProps/index.js';
17
+ import '../../utils/metaAttribute/index.js';
18
+ import '../../tokens/global/index.js';
19
+ import { jsx, jsxs } from 'react/jsx-runtime';
20
+ import useTheme from '../BladeProvider/useTheme.js';
21
+ import { size } from '../../tokens/global/size.js';
22
+ import { BaseBox } from '../Box/BaseBox/BaseBox.web.js';
23
+ import { getStyledProps } from '../Box/styledProps/getStyledProps.js';
24
+ import { metaAttribute } from '../../utils/metaAttribute/metaAttribute.web.js';
25
+ import { MetaConstants } from '../../utils/metaAttribute/metaConstants.js';
26
+ import { makeAccessible } from '../../utils/makeAccessible/makeAccessible.web.js';
27
+ import { BottomSheet } from '../BottomSheet/BottomSheet.web.js';
28
+ import { BottomSheetHeader } from '../BottomSheet/BottomSheetHeader.web.js';
29
+ import { BottomSheetBody } from '../BottomSheet/BottomSheetBody.web.js';
30
+ import { assignWithoutSideEffects } from '../../utils/assignWithoutSideEffects/assignWithoutSideEffects.js';
31
+
32
+ var _excluded = ["value", "defaultValue", "onChange", "onApply", "isOpen", "defaultIsOpen", "onOpenChange", "label", "labelPosition", "accessibilityLabel", "errorText", "helpText", "isDisabled", "isRequired", "successText", "validationState", "size", "autoFocus", "necessityIndicator", "name", "placeholder", "showFooterActions", "timeFormat", "minuteStep", "labelSuffix", "labelTrailing", "testID"];
33
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
34
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
35
+ var _BaseTimePicker = function _BaseTimePicker(_ref) {
36
+ var value = _ref.value,
37
+ defaultValue = _ref.defaultValue,
38
+ onChange = _ref.onChange,
39
+ onApply = _ref.onApply,
40
+ isOpen = _ref.isOpen,
41
+ defaultIsOpen = _ref.defaultIsOpen,
42
+ onOpenChange = _ref.onOpenChange,
43
+ label = _ref.label,
44
+ _ref$labelPosition = _ref.labelPosition,
45
+ labelPosition = _ref$labelPosition === void 0 ? 'top' : _ref$labelPosition,
46
+ accessibilityLabel = _ref.accessibilityLabel,
47
+ errorText = _ref.errorText,
48
+ helpText = _ref.helpText,
49
+ isDisabled = _ref.isDisabled,
50
+ isRequired = _ref.isRequired,
51
+ successText = _ref.successText,
52
+ validationState = _ref.validationState,
53
+ _ref$size = _ref.size,
54
+ size$1 = _ref$size === void 0 ? 'medium' : _ref$size,
55
+ autoFocus = _ref.autoFocus,
56
+ necessityIndicator = _ref.necessityIndicator,
57
+ name = _ref.name,
58
+ placeholder = _ref.placeholder,
59
+ _ref$showFooterAction = _ref.showFooterActions,
60
+ showFooterActions = _ref$showFooterAction === void 0 ? true : _ref$showFooterAction,
61
+ _ref$timeFormat = _ref.timeFormat,
62
+ timeFormat = _ref$timeFormat === void 0 ? '12h' : _ref$timeFormat,
63
+ _ref$minuteStep = _ref.minuteStep,
64
+ minuteStep = _ref$minuteStep === void 0 ? 1 : _ref$minuteStep,
65
+ labelSuffix = _ref.labelSuffix,
66
+ labelTrailing = _ref.labelTrailing,
67
+ testID = _ref.testID,
68
+ props = _objectWithoutProperties(_ref, _excluded);
69
+ var referenceRef = useRef(null);
70
+ var isMobile = useIsMobile();
71
+ var _useTheme = useTheme(),
72
+ theme = _useTheme.theme;
73
+ var titleId = useId('timepicker-title');
74
+ var _useTimePickerState = useTimePickerState({
75
+ value: value,
76
+ defaultValue: defaultValue,
77
+ onChange: onChange,
78
+ isOpen: isOpen,
79
+ defaultIsOpen: defaultIsOpen,
80
+ onOpenChange: onOpenChange,
81
+ timeFormat: timeFormat,
82
+ showFooterActions: showFooterActions,
83
+ onApply: onApply
84
+ }),
85
+ timeValue = _useTimePickerState.timeValue,
86
+ setTimeValue = _useTimePickerState.setTimeValue,
87
+ internalTimeValue = _useTimePickerState.internalTimeValue,
88
+ setInternalTimeValue = _useTimePickerState.setInternalTimeValue,
89
+ selectedHour = _useTimePickerState.selectedHour,
90
+ selectedMinute = _useTimePickerState.selectedMinute,
91
+ selectedPeriod = _useTimePickerState.selectedPeriod,
92
+ isDropdownOpen = _useTimePickerState.isOpen,
93
+ setIsDropdownOpen = _useTimePickerState.setIsOpen,
94
+ handleApply = _useTimePickerState.onApply,
95
+ handleCancel = _useTimePickerState.onCancel,
96
+ createCompleteTime = _useTimePickerState.createCompleteTime;
97
+ var _usePopup = usePopup({
98
+ enabled: !isMobile,
99
+ placement: 'bottom-start',
100
+ open: isDropdownOpen,
101
+ onOpenChange: function onOpenChange(isOpen, _, reason) {
102
+ if (isDisabled) return;
103
+ setIsDropdownOpen(isOpen);
104
+ if (reason === 'escape-key') {
105
+ handleCancel();
106
+ }
107
+ },
108
+ referenceRef: referenceRef,
109
+ // crossAxisOffset calculation for left label positioning:
110
+ // Medium: 120px (label width) + 12px (padding) = 132px
111
+ // Large: 176px (label width) + 16px (padding) = 192px
112
+ crossAxisOffset: labelPosition === 'left' ? size$1 === 'large' ? size[192] : size[132] : 0
113
+ }),
114
+ refs = _usePopup.refs,
115
+ context = _usePopup.context,
116
+ isMounted = _usePopup.isMounted,
117
+ floatingStyles = _usePopup.floatingStyles,
118
+ animationStyles = _usePopup.animationStyles,
119
+ getReferenceProps = _usePopup.getReferenceProps,
120
+ getFloatingProps = _usePopup.getFloatingProps;
121
+
122
+ // Fix for React Aria contentEditable focus issue with Floating UI
123
+ // React Aria's contentEditable segments don't properly trigger Floating UI's dismiss
124
+ // See: https://github.com/adobe/react-spectrum/issues/3164
125
+ React__default.useEffect(function () {
126
+ var handleClick = function handleClick(e) {
127
+ var _referenceRef$current, _refs$floating$curren, _closest, _ref2;
128
+ var target = e.target;
129
+ var isClickOnInput = (_referenceRef$current = referenceRef.current) === null || _referenceRef$current === void 0 ? void 0 : _referenceRef$current.contains(target);
130
+ var isClickOnDropdown = (_refs$floating$curren = refs.floating.current) === null || _refs$floating$curren === void 0 ? void 0 : _refs$floating$curren.contains(target);
131
+
132
+ // On mobile, also check if click is inside TimePicker content (BottomSheet)
133
+ var isClickOnTimePickerContent = (_closest = (_ref2 = target).closest) === null || _closest === void 0 ? void 0 : _closest.call(_ref2, '.timepicker-content');
134
+
135
+ // Only close dropdown if click is outside input, dropdown, and TimePicker content
136
+ // This ensures clicking different segments within the input keeps dropdown open
137
+ if (isDropdownOpen && !isClickOnInput && !isClickOnDropdown) {
138
+ if (isClickOnTimePickerContent && showFooterActions) {
139
+ // Inside TimePicker with footer actions - don't close
140
+ return;
141
+ }
142
+ handleApply();
143
+ }
144
+ };
145
+ if (isDropdownOpen) {
146
+ document.addEventListener('click', handleClick);
147
+ return function () {
148
+ return document.removeEventListener('click', handleClick);
149
+ };
150
+ }
151
+ return undefined;
152
+ }, [isDropdownOpen, showFooterActions, handleCancel, handleApply]);
153
+
154
+ // Mobile: Blur input when bottom sheet opens
155
+ React__default.useEffect(function () {
156
+ if (isMobile && isDropdownOpen) {
157
+ // Find the currently focused time segment and blur it
158
+
159
+ var activeElement = document.activeElement;
160
+ if (activeElement && 'blur' in activeElement && typeof activeElement.blur === 'function') {
161
+ setTimeout(function () {
162
+ activeElement.blur();
163
+ }, 0);
164
+ }
165
+ }
166
+ }, [isMobile, isDropdownOpen]);
167
+ var content = /*#__PURE__*/jsx(TimePickerContent, {
168
+ selectedTime: timeValue,
169
+ setSelectedTime: setTimeValue,
170
+ selectedHour: selectedHour,
171
+ selectedMinute: selectedMinute,
172
+ selectedPeriod: selectedPeriod,
173
+ timeFormat: timeFormat,
174
+ minuteStep: minuteStep,
175
+ showFooterActions: showFooterActions,
176
+ onApply: handleApply,
177
+ onCancel: handleCancel
178
+ });
179
+ return /*#__PURE__*/jsxs(BaseBox, _objectSpread(_objectSpread(_objectSpread({
180
+ width: "100%"
181
+ }, getStyledProps(props)), metaAttribute({
182
+ name: MetaConstants.TimePicker
183
+ })), {}, {
184
+ children: [/*#__PURE__*/jsx(TimeInput, _objectSpread({
185
+ ref: referenceRef,
186
+ inputRef: refs.setReference,
187
+ referenceProps: getReferenceProps(),
188
+ timeValue: timeValue,
189
+ internalTimeValue: internalTimeValue,
190
+ onChange: setTimeValue,
191
+ onTimeValueChange: function onTimeValueChange(timeValue) {
192
+ if (timeValue) {
193
+ setInternalTimeValue(timeValue);
194
+ }
195
+ },
196
+ createCompleteTime: createCompleteTime,
197
+ label: label,
198
+ helpText: helpText,
199
+ errorText: errorText,
200
+ successText: successText,
201
+ validationState: validationState,
202
+ isDisabled: isDisabled,
203
+ isRequired: isRequired,
204
+ necessityIndicator: necessityIndicator,
205
+ autoFocus: autoFocus // eslint-disable-line jsx-a11y/no-autofocus
206
+ ,
207
+ name: name,
208
+ placeholder: placeholder,
209
+ size: size$1,
210
+ labelPosition: labelPosition,
211
+ labelSuffix: labelSuffix,
212
+ labelTrailing: labelTrailing,
213
+ timeFormat: timeFormat,
214
+ isDropdownOpen: isDropdownOpen,
215
+ setIsDropdownOpen: setIsDropdownOpen,
216
+ testID: testID,
217
+ accessibilityLabel: accessibilityLabel
218
+ }, props)), !isMobile && isMounted && /*#__PURE__*/jsx(FloatingPortal, {
219
+ children: /*#__PURE__*/jsx(FloatingFocusManager, {
220
+ initialFocus: -1,
221
+ context: context,
222
+ guards: false,
223
+ order: ['reference', 'content'],
224
+ children: /*#__PURE__*/jsx(BaseBox, _objectSpread(_objectSpread(_objectSpread({
225
+ ref: refs.setFloating,
226
+ style: floatingStyles
227
+ }, getFloatingProps()), makeAccessible({
228
+ labelledBy: titleId
229
+ })), {}, {
230
+ children: /*#__PURE__*/jsx(BaseBox, {
231
+ backgroundColor: "popup.background.subtle",
232
+ borderColor: "popup.border.subtle",
233
+ borderWidth: "thin",
234
+ borderStyle: "solid",
235
+ borderRadius: "large",
236
+ overflow: "hidden",
237
+ style: _objectSpread(_objectSpread({}, animationStyles), {}, {
238
+ boxShadow: "".concat(theme.elevation.midRaised)
239
+ }),
240
+ children: content
241
+ })
242
+ }))
243
+ })
244
+ }), isMobile && !isDisabled && /*#__PURE__*/jsxs(BottomSheet, {
245
+ snapPoints: [0.6, 0.6, 1],
246
+ isOpen: isDropdownOpen,
247
+ onDismiss: handleCancel,
248
+ children: [/*#__PURE__*/jsx(BottomSheetHeader, {
249
+ title: "Select Time"
250
+ }), /*#__PURE__*/jsx(BottomSheetBody, {
251
+ children: content
252
+ })]
253
+ })]
254
+ }));
255
+ };
256
+ var BaseTimePicker = /*#__PURE__*/assignWithoutSideEffects(_BaseTimePicker, {
257
+ displayName: 'BaseTimePicker',
258
+ componentId: 'BaseTimePicker'
259
+ });
260
+
261
+ export { BaseTimePicker };
262
+ //# sourceMappingURL=BaseTimePicker.web.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BaseTimePicker.web.js","sources":["../../../../../../src/components/TimePicker/BaseTimePicker.web.tsx"],"sourcesContent":["import React, { useRef } from 'react';\nimport { FloatingFocusManager, FloatingPortal } from '@floating-ui/react';\nimport type { TimePickerProps } from './types';\nimport { TimeInput } from './TimeInput.web';\nimport { useTimePickerState } from './useTimePickerState';\nimport { TimePickerContent } from './TimePickerContent';\nimport type { DataAnalyticsAttribute } from '~utils/types';\nimport type { StyledPropsBlade } from '~components/Box/styledProps';\nimport { BottomSheet, BottomSheetBody, BottomSheetHeader } from '~components/BottomSheet';\nimport BaseBox from '~components/Box/BaseBox';\nimport { assignWithoutSideEffects } from '~utils/assignWithoutSideEffects';\nimport { makeAccessible } from '~utils/makeAccessible';\nimport { useId } from '~utils/useId';\nimport { useIsMobile } from '~utils/useIsMobile';\nimport { useTheme } from '~utils';\nimport { usePopup } from '~components/DatePicker/usePopup';\nimport { getStyledProps } from '~components/Box/styledProps';\nimport { metaAttribute, MetaConstants } from '~utils/metaAttribute';\nimport { size as sizeTokens } from '~tokens/global';\n\nconst _BaseTimePicker = ({\n value,\n defaultValue,\n onChange,\n onApply,\n isOpen,\n defaultIsOpen,\n onOpenChange,\n label,\n labelPosition = 'top',\n accessibilityLabel,\n errorText,\n helpText,\n isDisabled,\n isRequired,\n successText,\n validationState,\n size = 'medium',\n autoFocus,\n necessityIndicator,\n name,\n placeholder,\n showFooterActions = true,\n timeFormat = '12h',\n minuteStep = 1,\n labelSuffix,\n labelTrailing,\n testID,\n ...props\n}: TimePickerProps & StyledPropsBlade & DataAnalyticsAttribute): React.ReactElement => {\n const referenceRef = useRef<HTMLElement>(null);\n const isMobile = useIsMobile();\n const { theme } = useTheme();\n const titleId = useId('timepicker-title');\n\n const {\n timeValue,\n setTimeValue,\n internalTimeValue,\n setInternalTimeValue,\n selectedHour,\n selectedMinute,\n selectedPeriod,\n isOpen: isDropdownOpen,\n setIsOpen: setIsDropdownOpen,\n onApply: handleApply,\n onCancel: handleCancel,\n createCompleteTime,\n } = useTimePickerState({\n value,\n defaultValue,\n onChange,\n isOpen,\n defaultIsOpen,\n onOpenChange,\n timeFormat,\n showFooterActions,\n onApply,\n });\n\n const {\n refs,\n context,\n isMounted,\n floatingStyles,\n animationStyles,\n getReferenceProps,\n getFloatingProps,\n } = usePopup({\n enabled: !isMobile,\n placement: 'bottom-start',\n open: isDropdownOpen,\n onOpenChange: (isOpen, _, reason) => {\n if (isDisabled) return;\n setIsDropdownOpen(isOpen);\n if (reason === 'escape-key') {\n handleCancel();\n }\n },\n referenceRef,\n // crossAxisOffset calculation for left label positioning:\n // Medium: 120px (label width) + 12px (padding) = 132px\n // Large: 176px (label width) + 16px (padding) = 192px\n crossAxisOffset:\n labelPosition === 'left' ? (size === 'large' ? sizeTokens[192] : sizeTokens[132]) : 0,\n });\n\n // Fix for React Aria contentEditable focus issue with Floating UI\n // React Aria's contentEditable segments don't properly trigger Floating UI's dismiss\n // See: https://github.com/adobe/react-spectrum/issues/3164\n React.useEffect(() => {\n const handleClick = (e: MouseEvent): void => {\n const target = e.target as Node;\n const isClickOnInput = referenceRef.current?.contains(target);\n const isClickOnDropdown = refs.floating.current?.contains(target);\n\n // On mobile, also check if click is inside TimePicker content (BottomSheet)\n const isClickOnTimePickerContent = (target as Element).closest?.('.timepicker-content');\n\n // Only close dropdown if click is outside input, dropdown, and TimePicker content\n // This ensures clicking different segments within the input keeps dropdown open\n if (isDropdownOpen && !isClickOnInput && !isClickOnDropdown) {\n if (isClickOnTimePickerContent && showFooterActions) {\n // Inside TimePicker with footer actions - don't close\n return;\n }\n handleApply();\n }\n };\n\n if (isDropdownOpen) {\n document.addEventListener('click', handleClick);\n return () => document.removeEventListener('click', handleClick);\n }\n return undefined;\n }, [isDropdownOpen, showFooterActions, handleCancel, handleApply]);\n\n // Mobile: Blur input when bottom sheet opens\n React.useEffect(() => {\n if (isMobile && isDropdownOpen) {\n // Find the currently focused time segment and blur it\n\n const activeElement = document.activeElement as HTMLElement | null;\n if (activeElement && 'blur' in activeElement && typeof activeElement.blur === 'function') {\n setTimeout(() => {\n activeElement.blur();\n }, 0);\n }\n }\n }, [isMobile, isDropdownOpen]);\n\n const content = (\n <TimePickerContent\n selectedTime={timeValue}\n setSelectedTime={setTimeValue}\n selectedHour={selectedHour}\n selectedMinute={selectedMinute}\n selectedPeriod={selectedPeriod}\n timeFormat={timeFormat}\n minuteStep={minuteStep}\n showFooterActions={showFooterActions}\n onApply={handleApply}\n onCancel={handleCancel}\n />\n );\n\n return (\n <BaseBox\n width=\"100%\"\n {...getStyledProps(props)}\n {...metaAttribute({ name: MetaConstants.TimePicker })}\n >\n <TimeInput\n ref={referenceRef}\n inputRef={refs.setReference}\n referenceProps={getReferenceProps()}\n timeValue={timeValue}\n internalTimeValue={internalTimeValue}\n onChange={setTimeValue}\n onTimeValueChange={(timeValue) => {\n if (timeValue) {\n setInternalTimeValue(timeValue);\n }\n }}\n createCompleteTime={createCompleteTime}\n label={label}\n helpText={helpText}\n errorText={errorText}\n successText={successText}\n validationState={validationState}\n isDisabled={isDisabled}\n isRequired={isRequired}\n necessityIndicator={necessityIndicator}\n autoFocus={autoFocus} // eslint-disable-line jsx-a11y/no-autofocus\n name={name}\n placeholder={placeholder}\n size={size}\n labelPosition={labelPosition}\n labelSuffix={labelSuffix}\n labelTrailing={labelTrailing}\n timeFormat={timeFormat}\n isDropdownOpen={isDropdownOpen}\n setIsDropdownOpen={setIsDropdownOpen}\n testID={testID}\n accessibilityLabel={accessibilityLabel}\n {...props}\n />\n\n {!isMobile && isMounted && (\n <FloatingPortal>\n <FloatingFocusManager\n initialFocus={-1}\n context={context}\n guards={false}\n order={['reference', 'content']}\n >\n <BaseBox\n ref={refs.setFloating}\n style={floatingStyles}\n {...getFloatingProps()}\n {...makeAccessible({ labelledBy: titleId })}\n >\n <BaseBox\n backgroundColor=\"popup.background.subtle\"\n borderColor=\"popup.border.subtle\"\n borderWidth=\"thin\"\n borderStyle=\"solid\"\n borderRadius=\"large\"\n overflow=\"hidden\"\n style={{\n ...animationStyles,\n boxShadow: `${theme.elevation.midRaised}`,\n }}\n >\n {content}\n </BaseBox>\n </BaseBox>\n </FloatingFocusManager>\n </FloatingPortal>\n )}\n\n {/* Mobile Bottom Sheet */}\n {isMobile && !isDisabled && (\n <BottomSheet snapPoints={[0.6, 0.6, 1]} isOpen={isDropdownOpen} onDismiss={handleCancel}>\n <BottomSheetHeader title=\"Select Time\" />\n <BottomSheetBody>{content}</BottomSheetBody>\n </BottomSheet>\n )}\n </BaseBox>\n );\n};\n\nconst BaseTimePicker = assignWithoutSideEffects(_BaseTimePicker, {\n displayName: 'BaseTimePicker',\n componentId: 'BaseTimePicker',\n});\n\nexport { BaseTimePicker };\n"],"names":["_BaseTimePicker","_ref","value","defaultValue","onChange","onApply","isOpen","defaultIsOpen","onOpenChange","label","_ref$labelPosition","labelPosition","accessibilityLabel","errorText","helpText","isDisabled","isRequired","successText","validationState","_ref$size","size","autoFocus","necessityIndicator","name","placeholder","_ref$showFooterAction","showFooterActions","_ref$timeFormat","timeFormat","_ref$minuteStep","minuteStep","labelSuffix","labelTrailing","testID","props","_objectWithoutProperties","_excluded","referenceRef","useRef","isMobile","useIsMobile","_useTheme","useTheme","theme","titleId","useId","_useTimePickerState","useTimePickerState","timeValue","setTimeValue","internalTimeValue","setInternalTimeValue","selectedHour","selectedMinute","selectedPeriod","isDropdownOpen","setIsDropdownOpen","setIsOpen","handleApply","handleCancel","onCancel","createCompleteTime","_usePopup","usePopup","enabled","placement","open","_","reason","crossAxisOffset","sizeTokens","refs","context","isMounted","floatingStyles","animationStyles","getReferenceProps","getFloatingProps","React","useEffect","handleClick","e","_referenceRef$current","_refs$floating$curren","_closest","_ref2","target","isClickOnInput","current","contains","isClickOnDropdown","floating","isClickOnTimePickerContent","closest","call","document","addEventListener","removeEventListener","undefined","activeElement","blur","setTimeout","content","_jsx","TimePickerContent","selectedTime","setSelectedTime","_jsxs","BaseBox","_objectSpread","width","getStyledProps","metaAttribute","MetaConstants","TimePicker","children","TimeInput","ref","inputRef","setReference","referenceProps","onTimeValueChange","FloatingPortal","FloatingFocusManager","initialFocus","guards","order","setFloating","style","makeAccessible","labelledBy","backgroundColor","borderColor","borderWidth","borderStyle","borderRadius","overflow","boxShadow","concat","elevation","midRaised","BottomSheet","snapPoints","onDismiss","BottomSheetHeader","title","BottomSheetBody","BaseTimePicker","assignWithoutSideEffects","displayName","componentId"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoBA,IAAMA,eAAe,GAAG,SAAlBA,eAAeA,CAAAC,IAAA,EA6BkE;AAAA,EAAA,IA5BrFC,KAAK,GAAAD,IAAA,CAALC,KAAK;IACLC,YAAY,GAAAF,IAAA,CAAZE,YAAY;IACZC,QAAQ,GAAAH,IAAA,CAARG,QAAQ;IACRC,OAAO,GAAAJ,IAAA,CAAPI,OAAO;IACPC,MAAM,GAAAL,IAAA,CAANK,MAAM;IACNC,aAAa,GAAAN,IAAA,CAAbM,aAAa;IACbC,YAAY,GAAAP,IAAA,CAAZO,YAAY;IACZC,KAAK,GAAAR,IAAA,CAALQ,KAAK;IAAAC,kBAAA,GAAAT,IAAA,CACLU,aAAa;AAAbA,IAAAA,aAAa,GAAAD,kBAAA,KAAG,KAAA,CAAA,GAAA,KAAK,GAAAA,kBAAA;IACrBE,kBAAkB,GAAAX,IAAA,CAAlBW,kBAAkB;IAClBC,SAAS,GAAAZ,IAAA,CAATY,SAAS;IACTC,QAAQ,GAAAb,IAAA,CAARa,QAAQ;IACRC,UAAU,GAAAd,IAAA,CAAVc,UAAU;IACVC,UAAU,GAAAf,IAAA,CAAVe,UAAU;IACVC,WAAW,GAAAhB,IAAA,CAAXgB,WAAW;IACXC,eAAe,GAAAjB,IAAA,CAAfiB,eAAe;IAAAC,SAAA,GAAAlB,IAAA,CACfmB,IAAI;AAAJA,IAAAA,MAAI,GAAAD,SAAA,KAAG,KAAA,CAAA,GAAA,QAAQ,GAAAA,SAAA;IACfE,SAAS,GAAApB,IAAA,CAAToB,SAAS;IACTC,kBAAkB,GAAArB,IAAA,CAAlBqB,kBAAkB;IAClBC,IAAI,GAAAtB,IAAA,CAAJsB,IAAI;IACJC,WAAW,GAAAvB,IAAA,CAAXuB,WAAW;IAAAC,qBAAA,GAAAxB,IAAA,CACXyB,iBAAiB;AAAjBA,IAAAA,iBAAiB,GAAAD,qBAAA,KAAG,KAAA,CAAA,GAAA,IAAI,GAAAA,qBAAA;IAAAE,eAAA,GAAA1B,IAAA,CACxB2B,UAAU;AAAVA,IAAAA,UAAU,GAAAD,eAAA,KAAG,KAAA,CAAA,GAAA,KAAK,GAAAA,eAAA;IAAAE,eAAA,GAAA5B,IAAA,CAClB6B,UAAU;AAAVA,IAAAA,UAAU,GAAAD,eAAA,KAAG,KAAA,CAAA,GAAA,CAAC,GAAAA,eAAA;IACdE,WAAW,GAAA9B,IAAA,CAAX8B,WAAW;IACXC,aAAa,GAAA/B,IAAA,CAAb+B,aAAa;IACbC,MAAM,GAAAhC,IAAA,CAANgC,MAAM;AACHC,IAAAA,KAAK,GAAAC,wBAAA,CAAAlC,IAAA,EAAAmC,SAAA,CAAA,CAAA;AAER,EAAA,IAAMC,YAAY,GAAGC,MAAM,CAAc,IAAI,CAAC,CAAA;AAC9C,EAAA,IAAMC,QAAQ,GAAGC,WAAW,EAAE,CAAA;AAC9B,EAAA,IAAAC,SAAA,GAAkBC,QAAQ,EAAE;IAApBC,KAAK,GAAAF,SAAA,CAALE,KAAK,CAAA;AACb,EAAA,IAAMC,OAAO,GAAGC,KAAK,CAAC,kBAAkB,CAAC,CAAA;EAEzC,IAAAC,mBAAA,GAaIC,kBAAkB,CAAC;AACrB7C,MAAAA,KAAK,EAALA,KAAK;AACLC,MAAAA,YAAY,EAAZA,YAAY;AACZC,MAAAA,QAAQ,EAARA,QAAQ;AACRE,MAAAA,MAAM,EAANA,MAAM;AACNC,MAAAA,aAAa,EAAbA,aAAa;AACbC,MAAAA,YAAY,EAAZA,YAAY;AACZoB,MAAAA,UAAU,EAAVA,UAAU;AACVF,MAAAA,iBAAiB,EAAjBA,iBAAiB;AACjBrB,MAAAA,OAAO,EAAPA,OAAAA;AACF,KAAC,CAAC;IAtBA2C,SAAS,GAAAF,mBAAA,CAATE,SAAS;IACTC,YAAY,GAAAH,mBAAA,CAAZG,YAAY;IACZC,iBAAiB,GAAAJ,mBAAA,CAAjBI,iBAAiB;IACjBC,oBAAoB,GAAAL,mBAAA,CAApBK,oBAAoB;IACpBC,YAAY,GAAAN,mBAAA,CAAZM,YAAY;IACZC,cAAc,GAAAP,mBAAA,CAAdO,cAAc;IACdC,cAAc,GAAAR,mBAAA,CAAdQ,cAAc;IACNC,cAAc,GAAAT,mBAAA,CAAtBxC,MAAM;IACKkD,iBAAiB,GAAAV,mBAAA,CAA5BW,SAAS;IACAC,WAAW,GAAAZ,mBAAA,CAApBzC,OAAO;IACGsD,YAAY,GAAAb,mBAAA,CAAtBc,QAAQ;IACRC,kBAAkB,GAAAf,mBAAA,CAAlBe,kBAAkB,CAAA;EAapB,IAAAC,SAAA,GAQIC,QAAQ,CAAC;MACXC,OAAO,EAAE,CAACzB,QAAQ;AAClB0B,MAAAA,SAAS,EAAE,cAAc;AACzBC,MAAAA,IAAI,EAAEX,cAAc;MACpB/C,YAAY,EAAE,SAAdA,YAAYA,CAAGF,MAAM,EAAE6D,CAAC,EAAEC,MAAM,EAAK;AACnC,QAAA,IAAIrD,UAAU,EAAE,OAAA;QAChByC,iBAAiB,CAAClD,MAAM,CAAC,CAAA;QACzB,IAAI8D,MAAM,KAAK,YAAY,EAAE;AAC3BT,UAAAA,YAAY,EAAE,CAAA;AAChB,SAAA;OACD;AACDtB,MAAAA,YAAY,EAAZA,YAAY;AACZ;AACA;AACA;AACAgC,MAAAA,eAAe,EACb1D,aAAa,KAAK,MAAM,GAAIS,MAAI,KAAK,OAAO,GAAGkD,IAAU,CAAC,GAAG,CAAC,GAAGA,IAAU,CAAC,GAAG,CAAC,GAAI,CAAA;AACxF,KAAC,CAAC;IAxBAC,IAAI,GAAAT,SAAA,CAAJS,IAAI;IACJC,OAAO,GAAAV,SAAA,CAAPU,OAAO;IACPC,SAAS,GAAAX,SAAA,CAATW,SAAS;IACTC,cAAc,GAAAZ,SAAA,CAAdY,cAAc;IACdC,eAAe,GAAAb,SAAA,CAAfa,eAAe;IACfC,iBAAiB,GAAAd,SAAA,CAAjBc,iBAAiB;IACjBC,gBAAgB,GAAAf,SAAA,CAAhBe,gBAAgB,CAAA;;AAoBlB;AACA;AACA;EACAC,cAAK,CAACC,SAAS,CAAC,YAAM;AACpB,IAAA,IAAMC,WAAW,GAAG,SAAdA,WAAWA,CAAIC,CAAa,EAAW;AAAA,MAAA,IAAAC,qBAAA,EAAAC,qBAAA,EAAAC,QAAA,EAAAC,KAAA,CAAA;AAC3C,MAAA,IAAMC,MAAM,GAAGL,CAAC,CAACK,MAAc,CAAA;AAC/B,MAAA,IAAMC,cAAc,GAAA,CAAAL,qBAAA,GAAG7C,YAAY,CAACmD,OAAO,MAAAN,IAAAA,IAAAA,qBAAA,uBAApBA,qBAAA,CAAsBO,QAAQ,CAACH,MAAM,CAAC,CAAA;AAC7D,MAAA,IAAMI,iBAAiB,GAAAP,CAAAA,qBAAA,GAAGZ,IAAI,CAACoB,QAAQ,CAACH,OAAO,MAAA,IAAA,IAAAL,qBAAA,KAArBA,KAAAA,CAAAA,GAAAA,KAAAA,CAAAA,GAAAA,qBAAA,CAAuBM,QAAQ,CAACH,MAAM,CAAC,CAAA;;AAEjE;MACA,IAAMM,0BAA0B,IAAAR,QAAA,GAAG,CAAAC,KAAA,GAACC,MAAM,EAAaO,OAAO,cAAAT,QAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAA3BA,QAAA,CAAAU,IAAA,CAAAT,KAAA,EAA8B,qBAAqB,CAAC,CAAA;;AAEvF;AACA;AACA,MAAA,IAAI9B,cAAc,IAAI,CAACgC,cAAc,IAAI,CAACG,iBAAiB,EAAE;QAC3D,IAAIE,0BAA0B,IAAIlE,iBAAiB,EAAE;AACnD;AACA,UAAA,OAAA;AACF,SAAA;AACAgC,QAAAA,WAAW,EAAE,CAAA;AACf,OAAA;KACD,CAAA;AAED,IAAA,IAAIH,cAAc,EAAE;AAClBwC,MAAAA,QAAQ,CAACC,gBAAgB,CAAC,OAAO,EAAEhB,WAAW,CAAC,CAAA;MAC/C,OAAO,YAAA;AAAA,QAAA,OAAMe,QAAQ,CAACE,mBAAmB,CAAC,OAAO,EAAEjB,WAAW,CAAC,CAAA;AAAA,OAAA,CAAA;AACjE,KAAA;AACA,IAAA,OAAOkB,SAAS,CAAA;GACjB,EAAE,CAAC3C,cAAc,EAAE7B,iBAAiB,EAAEiC,YAAY,EAAED,WAAW,CAAC,CAAC,CAAA;;AAElE;EACAoB,cAAK,CAACC,SAAS,CAAC,YAAM;IACpB,IAAIxC,QAAQ,IAAIgB,cAAc,EAAE;AAC9B;;AAEA,MAAA,IAAM4C,aAAa,GAAGJ,QAAQ,CAACI,aAAmC,CAAA;AAClE,MAAA,IAAIA,aAAa,IAAI,MAAM,IAAIA,aAAa,IAAI,OAAOA,aAAa,CAACC,IAAI,KAAK,UAAU,EAAE;AACxFC,QAAAA,UAAU,CAAC,YAAM;UACfF,aAAa,CAACC,IAAI,EAAE,CAAA;SACrB,EAAE,CAAC,CAAC,CAAA;AACP,OAAA;AACF,KAAA;AACF,GAAC,EAAE,CAAC7D,QAAQ,EAAEgB,cAAc,CAAC,CAAC,CAAA;AAE9B,EAAA,IAAM+C,OAAO,gBACXC,GAAA,CAACC,iBAAiB,EAAA;AAChBC,IAAAA,YAAY,EAAEzD,SAAU;AACxB0D,IAAAA,eAAe,EAAEzD,YAAa;AAC9BG,IAAAA,YAAY,EAAEA,YAAa;AAC3BC,IAAAA,cAAc,EAAEA,cAAe;AAC/BC,IAAAA,cAAc,EAAEA,cAAe;AAC/B1B,IAAAA,UAAU,EAAEA,UAAW;AACvBE,IAAAA,UAAU,EAAEA,UAAW;AACvBJ,IAAAA,iBAAiB,EAAEA,iBAAkB;AACrCrB,IAAAA,OAAO,EAAEqD,WAAY;AACrBE,IAAAA,QAAQ,EAAED,YAAAA;AAAa,GACxB,CACF,CAAA;EAED,oBACEgD,IAAA,CAACC,OAAO,EAAAC,aAAA,CAAAA,aAAA,CAAAA,aAAA,CAAA;AACNC,IAAAA,KAAK,EAAC,MAAA;AAAM,GAAA,EACRC,cAAc,CAAC7E,KAAK,CAAC,CAAA,EACrB8E,aAAa,CAAC;IAAEzF,IAAI,EAAE0F,aAAa,CAACC,UAAAA;AAAW,GAAC,CAAC,CAAA,EAAA,EAAA,EAAA;AAAAC,IAAAA,QAAA,EAErDZ,cAAAA,GAAA,CAACa,SAAS,EAAAP,aAAA,CAAA;AACRQ,MAAAA,GAAG,EAAEhF,YAAa;MAClBiF,QAAQ,EAAE/C,IAAI,CAACgD,YAAa;MAC5BC,cAAc,EAAE5C,iBAAiB,EAAG;AACpC5B,MAAAA,SAAS,EAAEA,SAAU;AACrBE,MAAAA,iBAAiB,EAAEA,iBAAkB;AACrC9C,MAAAA,QAAQ,EAAE6C,YAAa;AACvBwE,MAAAA,iBAAiB,EAAE,SAAnBA,iBAAiBA,CAAGzE,SAAS,EAAK;AAChC,QAAA,IAAIA,SAAS,EAAE;UACbG,oBAAoB,CAACH,SAAS,CAAC,CAAA;AACjC,SAAA;OACA;AACFa,MAAAA,kBAAkB,EAAEA,kBAAmB;AACvCpD,MAAAA,KAAK,EAAEA,KAAM;AACbK,MAAAA,QAAQ,EAAEA,QAAS;AACnBD,MAAAA,SAAS,EAAEA,SAAU;AACrBI,MAAAA,WAAW,EAAEA,WAAY;AACzBC,MAAAA,eAAe,EAAEA,eAAgB;AACjCH,MAAAA,UAAU,EAAEA,UAAW;AACvBC,MAAAA,UAAU,EAAEA,UAAW;AACvBM,MAAAA,kBAAkB,EAAEA,kBAAmB;MACvCD,SAAS,EAAEA,SAAU;AAAC;AACtBE,MAAAA,IAAI,EAAEA,IAAK;AACXC,MAAAA,WAAW,EAAEA,WAAY;AACzBJ,MAAAA,IAAI,EAAEA,MAAK;AACXT,MAAAA,aAAa,EAAEA,aAAc;AAC7BoB,MAAAA,WAAW,EAAEA,WAAY;AACzBC,MAAAA,aAAa,EAAEA,aAAc;AAC7BJ,MAAAA,UAAU,EAAEA,UAAW;AACvB2B,MAAAA,cAAc,EAAEA,cAAe;AAC/BC,MAAAA,iBAAiB,EAAEA,iBAAkB;AACrCvB,MAAAA,MAAM,EAAEA,MAAO;AACfrB,MAAAA,kBAAkB,EAAEA,kBAAAA;KAChBsB,EAAAA,KAAK,CACV,CAAC,EAED,CAACK,QAAQ,IAAIkC,SAAS,iBACrB8B,GAAA,CAACmB,cAAc,EAAA;MAAAP,QAAA,eACbZ,GAAA,CAACoB,oBAAoB,EAAA;QACnBC,YAAY,EAAE,CAAC,CAAE;AACjBpD,QAAAA,OAAO,EAAEA,OAAQ;AACjBqD,QAAAA,MAAM,EAAE,KAAM;AACdC,QAAAA,KAAK,EAAE,CAAC,WAAW,EAAE,SAAS,CAAE;QAAAX,QAAA,eAEhCZ,GAAA,CAACK,OAAO,EAAAC,aAAA,CAAAA,aAAA,CAAAA,aAAA,CAAA;UACNQ,GAAG,EAAE9C,IAAI,CAACwD,WAAY;AACtBC,UAAAA,KAAK,EAAEtD,cAAAA;AAAe,SAAA,EAClBG,gBAAgB,EAAE,CAAA,EAClBoD,cAAc,CAAC;AAAEC,UAAAA,UAAU,EAAEtF,OAAAA;AAAQ,SAAC,CAAC,CAAA,EAAA,EAAA,EAAA;UAAAuE,QAAA,eAE3CZ,GAAA,CAACK,OAAO,EAAA;AACNuB,YAAAA,eAAe,EAAC,yBAAyB;AACzCC,YAAAA,WAAW,EAAC,qBAAqB;AACjCC,YAAAA,WAAW,EAAC,MAAM;AAClBC,YAAAA,WAAW,EAAC,OAAO;AACnBC,YAAAA,YAAY,EAAC,OAAO;AACpBC,YAAAA,QAAQ,EAAC,QAAQ;AACjBR,YAAAA,KAAK,EAAAnB,aAAA,CAAAA,aAAA,KACAlC,eAAe,CAAA,EAAA,EAAA,EAAA;AAClB8D,cAAAA,SAAS,KAAAC,MAAA,CAAK/F,KAAK,CAACgG,SAAS,CAACC,SAAS,CAAA;aACvC,CAAA;AAAAzB,YAAAA,QAAA,EAEDb,OAAAA;WACM,CAAA;SACF,CAAA,CAAA;OACW,CAAA;KACR,CACjB,EAGA/D,QAAQ,IAAI,CAACxB,UAAU,iBACtB4F,IAAA,CAACkC,WAAW,EAAA;AAACC,MAAAA,UAAU,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,CAAE;AAACxI,MAAAA,MAAM,EAAEiD,cAAe;AAACwF,MAAAA,SAAS,EAAEpF,YAAa;MAAAwD,QAAA,EAAA,cACtFZ,GAAA,CAACyC,iBAAiB,EAAA;AAACC,QAAAA,KAAK,EAAC,aAAA;AAAa,OAAE,CAAC,eACzC1C,GAAA,CAAC2C,eAAe,EAAA;AAAA/B,QAAAA,QAAA,EAAEb,OAAAA;AAAO,OAAkB,CAAC,CAAA;AAAA,KACjC,CACd,CAAA;AAAA,GAAA,CACM,CAAC,CAAA;AAEd,CAAC,CAAA;AAED,IAAM6C,cAAc,gBAAGC,wBAAwB,CAACpJ,eAAe,EAAE;AAC/DqJ,EAAAA,WAAW,EAAE,gBAAgB;AAC7BC,EAAAA,WAAW,EAAE,gBAAA;AACf,CAAC;;;;"}
@@ -0,0 +1,188 @@
1
+ import { useRef, useMemo, useEffect } from 'react';
2
+ import styled from 'styled-components';
3
+ import '../Typography/index.js';
4
+ import '../Box/BaseBox/index.js';
5
+ import { useIsMobile } from '../../utils/useIsMobile.js';
6
+ import '../../tokens/global/index.js';
7
+ import '../../utils/makeSize/index.js';
8
+ import debounce from '../../utils/lodashButBetter/debounce.js';
9
+ import { jsx, jsxs } from 'react/jsx-runtime';
10
+ import { BaseBox } from '../Box/BaseBox/BaseBox.web.js';
11
+ import { makeSize } from '../../utils/makeSize/makeSize.js';
12
+ import { size } from '../../tokens/global/size.js';
13
+ import { Text } from '../Typography/Text/Text.js';
14
+
15
+ var StyledScrollContainer = /*#__PURE__*/styled(BaseBox).withConfig({
16
+ displayName: "SpinWheelweb__StyledScrollContainer",
17
+ componentId: "sc-1gjdbly-0"
18
+ })(["scroll-snap-type:y proximity;scroll-behavior:smooth;&::-webkit-scrollbar{display:none;}scrollbar-width:none;"]);
19
+
20
+ // Styled scroll item with scroll snap
21
+ var StyledScrollItem = /*#__PURE__*/styled(BaseBox).withConfig({
22
+ displayName: "SpinWheelweb__StyledScrollItem",
23
+ componentId: "sc-1gjdbly-1"
24
+ })(["scroll-snap-align:center;"]);
25
+
26
+ /**
27
+ * Reusable SpinWheel component for time selection
28
+ * Creates a scrollable column of values where the center item is selected.
29
+ */
30
+ var SpinWheel = function SpinWheel(_ref) {
31
+ var className = _ref.className,
32
+ values = _ref.values,
33
+ selectedValue = _ref.selectedValue,
34
+ onChange = _ref.onChange,
35
+ activeIndex = _ref.activeIndex,
36
+ onActiveIndexChange = _ref.onActiveIndexChange,
37
+ displayValue = _ref.displayValue,
38
+ scrollContainerRef = _ref.scrollContainerRef,
39
+ tabIndex = _ref.tabIndex;
40
+ var containerRef = useRef(null);
41
+ var itemRefs = useRef([]);
42
+ var programmaticScrollTimeoutRef = useRef(null);
43
+ var isMobile = useIsMobile();
44
+
45
+ // Memoized debounced onChange to avoid jerky scrolling and prevent memory leaks
46
+ var debouncedOnChange = useMemo(function () {
47
+ return debounce(function (value, index) {
48
+ onChange(value, index);
49
+ }, 150);
50
+ }, [onChange]);
51
+
52
+ // Flag to prevent onValueChange from being triggered during auto-positioning
53
+ // Problem: When minuteStep > 1 and user types "03", we auto-position to nearest step "00"
54
+ // This programmatic scroll triggers handleScroll -> onValueChange -> changes value from "03" to "00"
55
+ // But we want to preserve the typed value "03" and only visually position at "00"
56
+ // Solution: Set this flag during programmatic scrolls to prevent onValueChange calls
57
+ // preserving user's typed value while showing correct visual positioning
58
+ var isProgrammaticScroll = useRef(false);
59
+
60
+ // Use displayValue for visual positioning, selectedValue for actual data
61
+ // This supports minute steps: user types "03", displayValue shows "00" for positioning,
62
+ // but selectedValue preserves "03" for form submission
63
+ var positioningValue = displayValue !== null && displayValue !== void 0 ? displayValue : selectedValue;
64
+
65
+ // Auto-scroll to positioned item when dropdown opens or positioning value changes
66
+ useEffect(function () {
67
+ // Clear any existing programmatic scroll timeout
68
+ if (programmaticScrollTimeoutRef.current) {
69
+ clearTimeout(programmaticScrollTimeoutRef.current);
70
+ }
71
+ var positionIndex = values.findIndex(function (val) {
72
+ return String(val) === String(positioningValue);
73
+ });
74
+ if (positionIndex >= 0 && itemRefs.current[positionIndex]) {
75
+ var _itemRefs$current$pos;
76
+ isProgrammaticScroll.current = true;
77
+ (_itemRefs$current$pos = itemRefs.current[positionIndex]) === null || _itemRefs$current$pos === void 0 || _itemRefs$current$pos.scrollIntoView({
78
+ behavior: 'smooth',
79
+ block: 'center'
80
+ });
81
+
82
+ // Reset flag after scroll finishes
83
+ programmaticScrollTimeoutRef.current = setTimeout(function () {
84
+ isProgrammaticScroll.current = false;
85
+ }, 300);
86
+ }
87
+ }, [positioningValue, values]);
88
+
89
+ // Cleanup timeouts on unmount
90
+ useEffect(function () {
91
+ return function () {
92
+ if (programmaticScrollTimeoutRef.current) {
93
+ clearTimeout(programmaticScrollTimeoutRef.current);
94
+ }
95
+ };
96
+ }, []);
97
+
98
+ // Scroll event handler to update selection based on center position
99
+ var handleScroll = function handleScroll() {
100
+ if (isProgrammaticScroll.current || !containerRef.current) return;
101
+
102
+ // Use document.elementFromPoint for efficient center detection (similar to Carousel)
103
+ var containerBB = containerRef.current.getBoundingClientRect();
104
+ var pointX = containerBB.left + containerBB.width * 0.5; // Center horizontally
105
+ var pointY = containerBB.top + containerBB.height * 0.5; // Center vertically
106
+
107
+ var element = document.elementFromPoint(pointX, pointY);
108
+ var spinWheelItem = element === null || element === void 0 ? void 0 : element.closest('[data-item-index]');
109
+ if (!spinWheelItem) return;
110
+ var itemIndex = Number(spinWheelItem.getAttribute('data-item-index'));
111
+ if (isNaN(itemIndex) || itemIndex < 0 || itemIndex >= values.length) return;
112
+
113
+ // Update active index immediately for visual feedback
114
+ onActiveIndexChange === null || onActiveIndexChange === void 0 || onActiveIndexChange(itemIndex);
115
+
116
+ // Debounce the actual value change to avoid jerky scrolling
117
+ debouncedOnChange(values[itemIndex], itemIndex);
118
+ };
119
+ var handleItemClick = function handleItemClick(value, index) {
120
+ // Always allow explicit user selection via click, even when displayValue is present
121
+ // This lets users choose to override their typed value with a step value if desired
122
+ onChange(value, index);
123
+ onActiveIndexChange === null || onActiveIndexChange === void 0 || onActiveIndexChange(index);
124
+ };
125
+ return /*#__PURE__*/jsx(BaseBox, {
126
+ className: className,
127
+ display: "flex",
128
+ flexDirection: "column",
129
+ alignItems: "center",
130
+ width: isMobile ? makeSize(size[82]) : makeSize(size[66]),
131
+ height: makeSize(size[172]),
132
+ children: /*#__PURE__*/jsx(BaseBox, {
133
+ position: "relative",
134
+ width: "100%",
135
+ overflow: "hidden",
136
+ children: /*#__PURE__*/jsxs(StyledScrollContainer, {
137
+ ref: function ref(node) {
138
+ containerRef.current = node;
139
+ if (typeof scrollContainerRef === 'function') {
140
+ scrollContainerRef(node);
141
+ } else if (scrollContainerRef && 'current' in scrollContainerRef) {
142
+ scrollContainerRef.current = node;
143
+ }
144
+ },
145
+ height: "100%",
146
+ overflowY: "auto",
147
+ onScroll: handleScroll,
148
+ tabIndex: typeof tabIndex === 'number' ? tabIndex : undefined,
149
+ children: [/*#__PURE__*/jsx(BaseBox, {
150
+ height: "68px"
151
+ }), values.map(function (value, index) {
152
+ // Show visual selection based on positioning value (for smooth minute steps)
153
+ // but preserve actual selectedValue for form data integrity
154
+ var isVisuallySelected = activeIndex === index || String(value) === String(positioningValue);
155
+ return /*#__PURE__*/jsx(StyledScrollItem, {
156
+ ref: function ref(el) {
157
+ return itemRefs.current[index] = el;
158
+ },
159
+ height: "34px",
160
+ display: "flex",
161
+ alignItems: "center",
162
+ justifyContent: "center",
163
+ onClick: function onClick() {
164
+ return handleItemClick(value, index);
165
+ },
166
+ style: {
167
+ cursor: 'pointer'
168
+ },
169
+ "data-item-index": index,
170
+ children: /*#__PURE__*/jsx(Text, {
171
+ variant: "body",
172
+ size: isVisuallySelected ? 'large' : 'medium',
173
+ weight: isVisuallySelected ? 'semibold' : 'regular',
174
+ color: isVisuallySelected ? 'interactive.text.gray.normal' : 'interactive.text.gray.muted',
175
+ textAlign: "center",
176
+ children: String(value).padStart(2, '0')
177
+ })
178
+ }, "".concat(value, "-").concat(index));
179
+ }), /*#__PURE__*/jsx(BaseBox, {
180
+ height: "68px"
181
+ })]
182
+ })
183
+ })
184
+ });
185
+ };
186
+
187
+ export { SpinWheel };
188
+ //# sourceMappingURL=SpinWheel.web.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SpinWheel.web.js","sources":["../../../../../../src/components/TimePicker/SpinWheel.web.tsx"],"sourcesContent":["import React, { useRef, useEffect, useMemo } from 'react';\nimport styled from 'styled-components';\nimport type { SpinWheelProps } from './types';\nimport { Text } from '~components/Typography';\nimport BaseBox from '~components/Box/BaseBox';\nimport { useIsMobile } from '~utils/useIsMobile';\nimport { size } from '~tokens/global';\nimport { makeSize } from '~utils/makeSize';\nimport debounce from '~utils/lodashButBetter/debounce';\n\n// Styled scroll container with scroll snap\nconst StyledScrollContainer = styled(BaseBox)`\n scroll-snap-type: y proximity; /* Changed from mandatory to proximity for smoother scrolling */\n scroll-behavior: smooth;\n &::-webkit-scrollbar {\n display: none;\n }\n scrollbar-width: none;\n`;\n\n// Styled scroll item with scroll snap\nconst StyledScrollItem = styled(BaseBox)`\n scroll-snap-align: center;\n /* Removed scroll-snap-stop: always for smoother interaction */\n`;\n\n/**\n * Reusable SpinWheel component for time selection\n * Creates a scrollable column of values where the center item is selected.\n */\nconst SpinWheel = ({\n className,\n values,\n selectedValue,\n onChange,\n activeIndex,\n onActiveIndexChange,\n displayValue,\n scrollContainerRef,\n tabIndex,\n}: SpinWheelProps): React.ReactElement => {\n const containerRef = useRef<HTMLDivElement | null>(null);\n const itemRefs = useRef<(HTMLDivElement | null)[]>([]);\n const programmaticScrollTimeoutRef = useRef<NodeJS.Timeout | null>(null);\n const isMobile = useIsMobile();\n\n // Memoized debounced onChange to avoid jerky scrolling and prevent memory leaks\n const debouncedOnChange = useMemo(\n () =>\n debounce((value: string | number, index: number) => {\n onChange(value, index);\n }, 150),\n [onChange],\n );\n\n // Flag to prevent onValueChange from being triggered during auto-positioning\n // Problem: When minuteStep > 1 and user types \"03\", we auto-position to nearest step \"00\"\n // This programmatic scroll triggers handleScroll -> onValueChange -> changes value from \"03\" to \"00\"\n // But we want to preserve the typed value \"03\" and only visually position at \"00\"\n // Solution: Set this flag during programmatic scrolls to prevent onValueChange calls\n // preserving user's typed value while showing correct visual positioning\n const isProgrammaticScroll = useRef(false);\n\n // Use displayValue for visual positioning, selectedValue for actual data\n // This supports minute steps: user types \"03\", displayValue shows \"00\" for positioning,\n // but selectedValue preserves \"03\" for form submission\n const positioningValue = displayValue ?? selectedValue;\n\n // Auto-scroll to positioned item when dropdown opens or positioning value changes\n useEffect(() => {\n // Clear any existing programmatic scroll timeout\n if (programmaticScrollTimeoutRef.current) {\n clearTimeout(programmaticScrollTimeoutRef.current);\n }\n\n const positionIndex = values.findIndex((val) => String(val) === String(positioningValue));\n if (positionIndex >= 0 && itemRefs.current[positionIndex]) {\n isProgrammaticScroll.current = true;\n\n itemRefs.current[positionIndex]?.scrollIntoView({\n behavior: 'smooth',\n block: 'center',\n });\n\n // Reset flag after scroll finishes\n programmaticScrollTimeoutRef.current = setTimeout(() => {\n isProgrammaticScroll.current = false;\n }, 300);\n }\n }, [positioningValue, values]);\n\n // Cleanup timeouts on unmount\n useEffect(() => {\n return () => {\n if (programmaticScrollTimeoutRef.current) {\n clearTimeout(programmaticScrollTimeoutRef.current);\n }\n };\n }, []);\n\n // Scroll event handler to update selection based on center position\n const handleScroll = (): void => {\n if (isProgrammaticScroll.current || !containerRef.current) return;\n\n // Use document.elementFromPoint for efficient center detection (similar to Carousel)\n const containerBB = containerRef.current.getBoundingClientRect();\n const pointX = containerBB.left + containerBB.width * 0.5; // Center horizontally\n const pointY = containerBB.top + containerBB.height * 0.5; // Center vertically\n\n const element = document.elementFromPoint(pointX, pointY);\n const spinWheelItem = element?.closest('[data-item-index]');\n\n if (!spinWheelItem) return;\n\n const itemIndex = Number(spinWheelItem.getAttribute('data-item-index'));\n if (isNaN(itemIndex) || itemIndex < 0 || itemIndex >= values.length) return;\n\n // Update active index immediately for visual feedback\n onActiveIndexChange?.(itemIndex);\n\n // Debounce the actual value change to avoid jerky scrolling\n debouncedOnChange(values[itemIndex], itemIndex);\n };\n\n const handleItemClick = (value: string | number, index: number): void => {\n // Always allow explicit user selection via click, even when displayValue is present\n // This lets users choose to override their typed value with a step value if desired\n onChange(value, index);\n onActiveIndexChange?.(index);\n };\n\n return (\n <BaseBox\n className={className}\n display=\"flex\"\n flexDirection=\"column\"\n alignItems=\"center\"\n width={isMobile ? makeSize(size[82]) : makeSize(size[66])}\n height={makeSize(size[172])}\n >\n <BaseBox position=\"relative\" width=\"100%\" overflow=\"hidden\">\n {/* Scrollable container */}\n <StyledScrollContainer\n ref={(node: HTMLDivElement | null) => {\n containerRef.current = node;\n if (typeof scrollContainerRef === 'function') {\n scrollContainerRef(node);\n } else if (scrollContainerRef && 'current' in scrollContainerRef) {\n (scrollContainerRef as React.MutableRefObject<HTMLDivElement | null>).current = node;\n }\n }}\n height=\"100%\"\n overflowY=\"auto\"\n onScroll={handleScroll}\n tabIndex={typeof tabIndex === 'number' ? tabIndex : undefined}\n >\n {/* Invisible spacer at top - allows first item to scroll to center */}\n <BaseBox height=\"68px\" />\n\n {values.map((value, index) => {\n // Show visual selection based on positioning value (for smooth minute steps)\n // but preserve actual selectedValue for form data integrity\n const isVisuallySelected =\n activeIndex === index || String(value) === String(positioningValue);\n\n return (\n <StyledScrollItem\n key={`${value}-${index}`}\n ref={(el) => (itemRefs.current[index] = el)}\n height=\"34px\"\n display=\"flex\"\n alignItems=\"center\"\n justifyContent=\"center\"\n onClick={() => handleItemClick(value, index)}\n style={{ cursor: 'pointer' }}\n data-item-index={index}\n >\n <Text\n variant=\"body\"\n size={isVisuallySelected ? 'large' : 'medium'}\n weight={isVisuallySelected ? 'semibold' : 'regular'}\n color={\n isVisuallySelected\n ? 'interactive.text.gray.normal'\n : 'interactive.text.gray.muted'\n }\n textAlign=\"center\"\n >\n {String(value).padStart(2, '0')}\n </Text>\n </StyledScrollItem>\n );\n })}\n\n {/* Invisible spacer at bottom - allows last item to scroll to center */}\n <BaseBox height=\"68px\" />\n </StyledScrollContainer>\n </BaseBox>\n </BaseBox>\n );\n};\n\nexport { SpinWheel };\n"],"names":["StyledScrollContainer","styled","BaseBox","withConfig","displayName","componentId","StyledScrollItem","SpinWheel","_ref","className","values","selectedValue","onChange","activeIndex","onActiveIndexChange","displayValue","scrollContainerRef","tabIndex","containerRef","useRef","itemRefs","programmaticScrollTimeoutRef","isMobile","useIsMobile","debouncedOnChange","useMemo","debounce","value","index","isProgrammaticScroll","positioningValue","useEffect","current","clearTimeout","positionIndex","findIndex","val","String","_itemRefs$current$pos","scrollIntoView","behavior","block","setTimeout","handleScroll","containerBB","getBoundingClientRect","pointX","left","width","pointY","top","height","element","document","elementFromPoint","spinWheelItem","closest","itemIndex","Number","getAttribute","isNaN","length","handleItemClick","_jsx","display","flexDirection","alignItems","makeSize","size","children","position","overflow","_jsxs","ref","node","overflowY","onScroll","undefined","map","isVisuallySelected","el","justifyContent","onClick","style","cursor","Text","variant","weight","color","textAlign","padStart","concat"],"mappings":"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"}