@leafygreen-ui/combobox 8.1.2 → 8.1.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +35 -0
- package/dist/Combobox/Combobox.d.ts +2 -2
- package/dist/Combobox/Combobox.types.d.ts +3 -3
- package/dist/Combobox/Combobox.types.d.ts.map +1 -1
- package/dist/ComboboxGroup/ComboboxGroup.d.ts +1 -1
- package/dist/ComboboxMenu/ComboboxMenu.d.ts +1 -1
- package/dist/ComboboxMenu/ComboboxMenu.d.ts.map +1 -1
- package/dist/ComboboxOption/ComboboxOption.types.d.ts +4 -4
- package/dist/ComboboxOption/ComboboxOption.types.d.ts.map +1 -1
- package/dist/esm/index.js +1 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/types/Combobox.types.d.ts +7 -7
- package/dist/types/Combobox.types.d.ts.map +1 -1
- package/dist/utils/ComboboxTestUtils.d.ts +2 -2
- package/dist/utils/ComboboxTestUtils.d.ts.map +1 -1
- package/package.json +17 -17
- package/src/Combobox.stories.tsx +5 -5
- package/src/ComboboxChip/ComboboxChip.stories.tsx +1 -1
- package/src/ComboboxGroup/ComboboxGroup.stories.tsx +1 -1
- package/src/ComboboxMenu/ComboboxMenu.stories.tsx +1 -1
- package/src/ComboboxOption/ComboboxOption.stories.tsx +1 -1
- package/stories.js +1 -1
package/dist/esm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../src/types/Combobox.types.ts","../../src/ComboboxContext/ComboboxContext.tsx","../../src/ComboboxChip/ComboboxChip.styles.ts","../../src/ComboboxGroup/ComboboxGroup.styles.ts","../../src/ComboboxChip/ComboboxChip.tsx","../../src/ComboboxMenu/Menu.styles.ts","../../src/ComboboxGroup/ComboboxGroup.tsx","../../src/ComboboxMenu/ComboboxMenu.tsx","../../src/utils/checkScrollPosition.tsx","../../src/ComboboxOption/ComboboxOption.styles.ts","../../src/utils/getNameAndValue.ts","../../src/utils/flattenChildren.tsx","../../src/utils/OptionObjectUtils.ts","../../src/ComboboxOption/ComboboxOption.tsx","../../src/ComboboxOption/getGlyphs.tsx","../../src/utils/wrapJSX.tsx","../../src/utils/doesSelectionExist.ts","../../src/Combobox/Combobox.styles.ts","../../src/Combobox/Combobox.tsx","../../src/Combobox/utils/isValueCurrentSelection.ts"],"sourcesContent":["/**\n * Identifier for individual component elements within the Combobox\n */\nexport const ComboboxElement = {\n Input: 'Input',\n ClearButton: 'ClearButton',\n FirstChip: 'FirstChip',\n LastChip: 'LastChip',\n MiddleChip: 'MiddleChip',\n Combobox: 'Combobox',\n Menu: 'Menu',\n} as const;\nexport type ComboboxElement =\n (typeof ComboboxElement)[keyof typeof ComboboxElement];\n\n/**\n * The rendered size of the Combobox\n */\nexport const ComboboxSize = {\n XSmall: 'xsmall',\n Small: 'small',\n Default: 'default',\n Large: 'large',\n} as const;\nexport type ComboboxSize = (typeof ComboboxSize)[keyof typeof ComboboxSize];\n\n/**\n * Defines the behavior of the Combobox when there are more selected chips than will fit in the input\n */\nexport const Overflow = {\n /**\n * Combobox will be set to a fixed width, and will expand its height based on the number of Chips selected\n */\n expandY: 'expand-y',\n /**\n * Combobox will be set to a fixed height and width (default 100% of container). Chips will be scrollable left-right\n */\n scrollX: 'scroll-x',\n /**\n * @deprecated\n */\n expandX: 'expand-x',\n} as const;\nexport type Overflow = (typeof Overflow)[keyof typeof Overflow];\n\n/** The error state of the Combobox */\nexport const State = {\n none: 'none',\n error: 'error',\n} as const;\nexport type State = (typeof State)[keyof typeof State];\n\n/** The search state of the Combobox */\nexport const SearchState = {\n unset: 'unset',\n error: 'error',\n loading: 'loading',\n} as const;\nexport type SearchState = (typeof SearchState)[keyof typeof SearchState];\n\n/**\n * The type expected in the `value` or `initialValue` prop.\n * Also the type passed as an argument to `onChange`.\n *\n * Type varies depending on the value of `multiselect`\n */\nexport type SelectValueType<M extends boolean> = M extends true\n ? Array<string>\n : string | null;\n\n/** Represents an element that was added or removed from the multiselect value array */\nexport interface DiffObject {\n diffType: 'insert' | 'delete';\n value: string | Array<string>;\n}\n\n/**\n * Callback event fired when the value changes\n *\n * Type varies depending on the value of `multiselect`\n */\n// TODO: onChange signature should match the native event handler signature\nexport type onChangeType<M extends boolean> = M extends true\n ? (value: SelectValueType<true>, diff?: DiffObject) => void\n : (value: SelectValueType<false>) => void;\n\n/**\n * Returns the correct empty state for multiselect / single select\n */\nexport function getNullSelection<M extends boolean>(\n multiselect: M,\n): SelectValueType<M> {\n if (multiselect) {\n return [] as Array<string> as SelectValueType<M>;\n } else {\n return null as SelectValueType<M>;\n }\n}\n","import { createContext } from 'react';\n\nimport {\n ComboboxSize,\n Overflow,\n SearchState,\n State,\n TruncationLocation,\n} from '../types';\n\nexport interface ComboboxData {\n multiselect: boolean;\n size: ComboboxSize;\n withIcons: boolean;\n disabled: boolean;\n isOpen: boolean;\n state: State;\n searchState: SearchState;\n overflow: Overflow;\n chipTruncationLocation?: TruncationLocation;\n chipCharacterLimit?: number;\n inputValue?: string;\n popoverZIndex?: number;\n}\n\nexport const defaultContext = {\n multiselect: false,\n size: ComboboxSize.Default,\n withIcons: false,\n disabled: false,\n isOpen: false,\n state: State.none,\n searchState: SearchState.unset,\n overflow: Overflow.expandY,\n};\n\nexport const ComboboxContext = createContext<ComboboxData>(defaultContext);\n","import { chipTextClassName } from '@leafygreen-ui/chip';\nimport { css } from '@leafygreen-ui/emotion';\nimport { createUniqueClassName } from '@leafygreen-ui/lib';\nimport { typeScales } from '@leafygreen-ui/tokens';\n\nimport { ComboboxSize } from '../types';\n\nexport const chipClassName = createUniqueClassName('combobox-chip');\n\n/**\n * The line-height of the combobox.\n */\nexport const lineHeight: Record<ComboboxSize, number> = {\n [ComboboxSize.XSmall]: 16,\n [ComboboxSize.Small]: typeScales.body1.lineHeight,\n [ComboboxSize.Default]: typeScales.body1.lineHeight,\n [ComboboxSize.Large]: typeScales.body2.lineHeight,\n};\n\n/**\n * The font-size of the combobox.\n */\nexport const fontSize: Record<ComboboxSize, number> = {\n [ComboboxSize.XSmall]: typeScales.body1.fontSize,\n [ComboboxSize.Small]: typeScales.body1.fontSize,\n [ComboboxSize.Default]: typeScales.body1.fontSize,\n [ComboboxSize.Large]: typeScales.body2.fontSize,\n};\n\n/**\n * Vertical padding on a chip (in px)\n */\nexport const chipWrapperPaddingY = {\n [ComboboxSize.XSmall]: 1,\n [ComboboxSize.Small]: 0,\n [ComboboxSize.Default]: 2,\n [ComboboxSize.Large]: 4,\n} as const;\n\n/**\n * Override chip sizes\n */\nexport const chipSizeStyles: Record<ComboboxSize, string> = {\n [ComboboxSize.XSmall]: css`\n font-size: ${fontSize[ComboboxSize.XSmall]}px;\n line-height: ${lineHeight[ComboboxSize.XSmall]}px;\n\n .${chipTextClassName} {\n padding-block: ${chipWrapperPaddingY[ComboboxSize.XSmall]}px;\n }\n `,\n [ComboboxSize.Small]: css`\n font-size: ${fontSize[ComboboxSize.Small]}px;\n line-height: ${lineHeight[ComboboxSize.Small]}px;\n\n .${chipTextClassName} {\n padding-block: ${chipWrapperPaddingY[ComboboxSize.Small]}px;\n }\n `,\n [ComboboxSize.Default]: css`\n font-size: ${fontSize[ComboboxSize.Default]}px;\n line-height: ${lineHeight[ComboboxSize.Default]}px;\n\n .${chipTextClassName} {\n padding-block: ${chipWrapperPaddingY[ComboboxSize.Default]}px;\n }\n `,\n [ComboboxSize.Large]: css`\n font-size: ${fontSize[ComboboxSize.Large]}px;\n line-height: ${lineHeight[ComboboxSize.Large]}px;\n\n .${chipTextClassName} {\n padding-inline-end: 10px;\n padding-block: ${chipWrapperPaddingY[ComboboxSize.Large]}px;\n }\n `,\n};\n","import { css } from '@leafygreen-ui/emotion';\nimport { Theme } from '@leafygreen-ui/lib';\nimport { palette } from '@leafygreen-ui/palette';\nimport { fontWeights, spacing } from '@leafygreen-ui/tokens';\n\nexport const comboboxGroupStyle: Record<Theme, string> = {\n [Theme.Light]: css`\n padding-top: ${spacing[2]}px;\n `,\n [Theme.Dark]: css`\n padding-top: ${spacing[2]}px;\n `,\n};\n\nexport const comboboxGroupLabel = css`\n cursor: default;\n width: 100%;\n padding: 0 12px 2px;\n outline: none;\n overflow-wrap: anywhere;\n font-size: 12px;\n line-height: 16px;\n font-weight: ${fontWeights.bold};\n text-transform: uppercase;\n letter-spacing: 0.4px;\n`;\n\nexport const comboboxGroupLabelThemeStyle: Record<Theme, string> = {\n [Theme.Light]: css`\n color: ${palette.gray.dark1};\n `,\n [Theme.Dark]: css`\n color: ${palette.gray.light1};\n `,\n};\n","import React, { useContext, useEffect } from 'react';\n\nimport { BaseFontSize, Chip, Variant } from '@leafygreen-ui/chip';\nimport { cx } from '@leafygreen-ui/emotion';\nimport { useForwardedRef } from '@leafygreen-ui/hooks';\nimport { keyMap } from '@leafygreen-ui/lib';\n\nimport { ComboboxContext } from '../ComboboxContext';\nimport { Overflow, TruncationLocation } from '../types';\n\nimport { chipClassName, chipSizeStyles } from './ComboboxChip.styles';\nimport { ComboboxChipProps } from './ComboboxChip.types';\n\nexport const ComboboxChip = React.forwardRef<\n HTMLSpanElement,\n ComboboxChipProps\n>(\n (\n { displayName, isFocused, onRemove, onFocus }: ComboboxChipProps,\n forwardedRef,\n ) => {\n const {\n size,\n disabled,\n overflow,\n chipTruncationLocation = TruncationLocation.End,\n chipCharacterLimit = 12,\n popoverZIndex,\n } = useContext(ComboboxContext);\n\n const updatedChipTruncationLocation =\n overflow === Overflow.scrollX\n ? TruncationLocation.None\n : chipTruncationLocation;\n\n const chipRef = useForwardedRef(forwardedRef, null);\n const buttonRef = chipRef.current?.querySelector('button');\n\n useEffect(() => {\n if (isFocused && !disabled) {\n buttonRef?.focus();\n }\n }, [disabled, buttonRef, isFocused]);\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (\n !disabled &&\n (e.key === keyMap.Delete ||\n e.key === keyMap.Backspace ||\n e.key === keyMap.Enter ||\n e.key === keyMap.Space)\n ) {\n onRemove();\n }\n };\n\n const handleChipClick = (e: React.MouseEvent) => {\n // Did not click button\n if (!buttonRef?.contains(e.target as Node)) {\n onFocus();\n }\n };\n\n const handleButtonClick = () => {\n if (!disabled) {\n onRemove();\n }\n };\n\n return (\n <Chip\n label={displayName}\n className={cx(chipClassName, chipSizeStyles[size])}\n role=\"option\"\n aria-selected={isFocused}\n data-testid=\"lg-combobox-chip\"\n onClick={handleChipClick}\n onKeyDown={handleKeyDown}\n onDismiss={handleButtonClick}\n baseFontSize={BaseFontSize.Body1}\n chipCharacterLimit={chipCharacterLimit}\n chipTruncationLocation={updatedChipTruncationLocation}\n popoverZIndex={popoverZIndex}\n variant={Variant.Gray}\n ref={chipRef}\n disabled={disabled}\n tabIndex={-1}\n />\n );\n },\n);\nComboboxChip.displayName = 'ComboboxChip';\n","import { transparentize } from 'polished';\n\nimport { css, keyframes } from '@leafygreen-ui/emotion';\nimport { Theme } from '@leafygreen-ui/lib';\nimport { palette } from '@leafygreen-ui/palette';\nimport { fontFamilies, spacing } from '@leafygreen-ui/tokens';\n\nimport { fontSize, lineHeight } from '../ComboboxChip/ComboboxChip.styles';\nimport { ComboboxSize as Size } from '../types';\n\nexport const menuItemPadding: Record<Size, { x: number; y: number }> = {\n [Size.XSmall]: { x: 12, y: 8 },\n [Size.Small]: { x: 12, y: 8 },\n [Size.Default]: { x: 12, y: 8 },\n [Size.Large]: { x: 12, y: 8 },\n};\n\n/** Util that returns the height of a menu item (in px) */\nexport const getMenuItemHeight = (size: Size) => {\n return lineHeight[size] + 2 * menuItemPadding[size].y;\n};\n\n/**\n * Menu styles\n */\n\nexport const popoverStyle = (width = 384) => css`\n width: ${width}px;\n overflow: hidden;\n border-radius: 12px;\n border: 1px solid;\n`;\n\nexport const popoverThemeStyle: Record<Theme, string> = {\n [Theme.Light]: css`\n box-shadow: 0px 4px 7px ${transparentize(0.85, palette.black)};\n border-color: ${palette.gray.light2};\n `,\n [Theme.Dark]: css`\n box-shadow: 0px 4px 7px ${transparentize(0.85, palette.black)};\n border-color: ${palette.gray.dark2};\n `,\n};\n\nexport const menuBaseStyle = css`\n position: relative;\n width: 100%;\n margin: 0;\n padding: ${spacing[2]}px 0;\n font-family: ${fontFamilies.default};\n border-radius: inherit;\n overflow-y: auto;\n scroll-behavior: smooth;\n`;\n\nexport const menuThemeStyle: Record<Theme, string> = {\n [Theme.Light]: css`\n color: ${palette.black};\n background-color: ${palette.white};\n `,\n [Theme.Dark]: css`\n color: ${palette.gray.light1};\n background-color: ${palette.gray.dark3};\n `,\n};\n\nexport const menuList = css`\n position: relative;\n margin: 0;\n padding: 0;\n`;\n\nexport const menuMessageBaseStyle = css`\n font-family: inherit;\n display: inline-flex;\n align-items: center;\n gap: 8px;\n`;\n\nexport const menuMessageThemeStyle: Record<Theme, string> = {\n [Theme.Light]: css`\n color: ${palette.gray.dark3};\n `,\n [Theme.Dark]: css`\n color: ${palette.gray.light3};\n `,\n};\n\nexport const menuMessageSizeStyle = (size: Size) => css`\n font-size: ${fontSize[size]}px;\n line-height: ${lineHeight[size]}px;\n padding: ${menuItemPadding[size].y}px ${menuItemPadding[size].x}px;\n`;\n\nconst loadingIconAnimation = keyframes`\n 0% {\n transform: rotate(0deg);\n }\n 100% {\n transform: rotate(360deg);\n }\n`;\n\nexport const loadingIconStyle = css`\n animation: ${loadingIconAnimation} 1.5s linear infinite;\n`;\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nimport { cx } from '@leafygreen-ui/emotion';\nimport { useIdAllocator } from '@leafygreen-ui/hooks';\nimport { useDarkMode } from '@leafygreen-ui/leafygreen-provider';\n\nimport {\n comboboxGroupLabel,\n comboboxGroupLabelThemeStyle,\n comboboxGroupStyle,\n} from './ComboboxGroup.styles';\nimport { ComboboxGroupProps } from './ComboboxGroup.types';\n\n/**\n * @internal\n */\nexport function InternalComboboxGroup({\n label,\n className,\n children,\n}: ComboboxGroupProps): JSX.Element {\n const { theme } = useDarkMode();\n\n const groupId = useIdAllocator({ prefix: 'combobox-group' });\n const childCount = React.Children.count(children);\n\n return childCount > 0 ? (\n <div className={cx(comboboxGroupStyle[theme], className)}>\n <div\n className={cx(comboboxGroupLabel, comboboxGroupLabelThemeStyle[theme])}\n id={groupId}\n >\n {label}\n </div>\n <div role=\"group\" aria-labelledby={groupId}>\n {children}\n </div>\n </div>\n ) : (\n <></>\n );\n}\n\nComboboxGroup.displayName = 'ComboboxGroup';\n\nComboboxGroup.propTypes = {\n className: PropTypes.string,\n children: PropTypes.node.isRequired,\n label: PropTypes.string.isRequired,\n};\n\nexport function ComboboxGroup(_: ComboboxGroupProps): JSX.Element {\n throw Error('`ComboboxGroup` must be a child of a `Combobox` instance');\n}\n","import React, { useContext, useMemo } from 'react';\nimport isUndefined from 'lodash/isUndefined';\n\nimport { css, cx } from '@leafygreen-ui/emotion';\nimport { useAvailableSpace, useForwardedRef } from '@leafygreen-ui/hooks';\nimport Icon from '@leafygreen-ui/icon';\nimport { useDarkMode } from '@leafygreen-ui/leafygreen-provider';\nimport { palette } from '@leafygreen-ui/palette';\nimport Popover, { PortalControlProps } from '@leafygreen-ui/popover';\nimport { Error } from '@leafygreen-ui/typography';\n\nimport { ComboboxProps } from '../Combobox';\nimport { ComboboxContext } from '../ComboboxContext';\n\nimport {\n loadingIconStyle,\n menuBaseStyle,\n menuList,\n menuMessageBaseStyle,\n menuMessageSizeStyle,\n menuMessageThemeStyle,\n menuThemeStyle,\n popoverStyle,\n popoverThemeStyle,\n} from './Menu.styles';\n\ntype ComboboxMenuProps = {\n children?: React.ReactNode;\n refEl: React.RefObject<HTMLDivElement>;\n id: string;\n labelId: string;\n menuWidth: number;\n} & PortalControlProps &\n Pick<\n ComboboxProps<any>,\n | 'searchLoadingMessage'\n | 'searchErrorMessage'\n | 'searchEmptyMessage'\n | 'popoverZIndex'\n >;\n\nexport const ComboboxMenu = React.forwardRef<HTMLDivElement, ComboboxMenuProps>(\n (\n {\n children,\n id,\n refEl,\n labelId,\n menuWidth,\n searchLoadingMessage,\n searchErrorMessage,\n searchEmptyMessage,\n ...popoverProps\n }: ComboboxMenuProps,\n forwardedRef,\n ) => {\n const { darkMode, theme } = useDarkMode();\n const { disabled, size, isOpen, searchState } = useContext(ComboboxContext);\n const ref = useForwardedRef(forwardedRef, null);\n\n /** The max height of the menu element */\n const availableSpace = useAvailableSpace(refEl);\n const maxHeightValue = !isUndefined(availableSpace)\n ? `${Math.min(availableSpace, 256)}px`\n : 'unset';\n\n /**\n * The rendered menu JSX contents\n * Includes error, empty, search and default states\n */\n const renderedMenuContents = useMemo((): JSX.Element => {\n const messageStyles = cx(\n menuMessageBaseStyle,\n menuMessageThemeStyle[theme],\n menuMessageSizeStyle(size),\n );\n\n const errorMessageStyles = cx(\n menuMessageBaseStyle,\n menuMessageSizeStyle(size),\n );\n\n switch (searchState) {\n case 'loading': {\n return (\n <span className={messageStyles}>\n <Icon\n glyph=\"Refresh\"\n color={darkMode ? palette.blue.light1 : palette.blue.base}\n className={loadingIconStyle}\n />\n {searchLoadingMessage}\n </span>\n );\n }\n\n case 'error': {\n return (\n <Error className={errorMessageStyles}>\n <Icon\n glyph=\"Warning\"\n color={darkMode ? palette.red.light1 : palette.red.base}\n />\n <span>{searchErrorMessage}</span>\n </Error>\n );\n }\n\n case 'unset':\n default: {\n if (\n children &&\n typeof children === 'object' &&\n 'length' in children &&\n (children as Array<React.ReactNode>).length > 0\n ) {\n return <ul className={menuList}>{children}</ul>;\n }\n\n return <span className={messageStyles}>{searchEmptyMessage}</span>;\n }\n }\n }, [\n theme,\n size,\n searchState,\n darkMode,\n searchLoadingMessage,\n searchErrorMessage,\n children,\n searchEmptyMessage,\n ]);\n\n return (\n <Popover\n active={isOpen && !disabled}\n spacing={4}\n align=\"bottom\"\n justify=\"middle\"\n refEl={refEl}\n adjustOnMutation={true}\n className={cx(popoverStyle(menuWidth), popoverThemeStyle[theme])}\n {...popoverProps}\n >\n <div\n ref={ref}\n id={id}\n role=\"listbox\"\n aria-labelledby={labelId}\n aria-expanded={isOpen}\n className={cx(\n menuBaseStyle,\n menuThemeStyle[theme],\n css`\n max-height: ${maxHeightValue};\n `,\n )}\n onMouseDownCapture={e => e.preventDefault()}\n >\n {renderedMenuContents}\n </div>\n </Popover>\n );\n },\n);\n\nComboboxMenu.displayName = 'ComboboxMenu';\n","/**\n *\n * Checks if a bottom overflow shadow should be visible when overflow === expand-y\n *\n * @param element\n * @returns `boolean`\n * @internal\n */\nexport const checkScrollPosition = (element: HTMLElement) => {\n const { scrollHeight, scrollTop, clientHeight } = element;\n // Position when the container is scrolled all the way to the bottom\n const maxScrollPosition = scrollHeight - clientHeight;\n\n // If the scrollTop position is less than the maxScrollPosition then we will show the shadow.\n if (scrollTop < maxScrollPosition) {\n return true;\n }\n\n return false;\n};\n","import { css } from '@leafygreen-ui/emotion';\nimport { leftGlyphClassName } from '@leafygreen-ui/input-option';\nimport { Theme } from '@leafygreen-ui/lib';\nimport { palette } from '@leafygreen-ui/palette';\nimport { fontWeights, spacing } from '@leafygreen-ui/tokens';\n\nimport { fontSize, lineHeight } from '../ComboboxChip/ComboboxChip.styles';\nimport {\n getMenuItemHeight,\n menuItemPadding,\n} from '../ComboboxMenu/Menu.styles';\nimport { ComboboxSize } from '../types';\n\n/**\n * Styles\n */\n\nexport const comboboxOptionSizeStyle = (size: ComboboxSize) => css`\n font-size: ${fontSize[size]}px;\n line-height: ${lineHeight[size]}px;\n min-height: ${getMenuItemHeight(size)}px;\n padding: ${menuItemPadding[size].y}px ${menuItemPadding[size].x}px;\n gap: ${spacing[1]}px;\n\n &:before {\n max-height: ${getMenuItemHeight(size)}px;\n }\n`;\n\nexport const checkMarkSizeStyle: Record<ComboboxSize, string> = {\n [ComboboxSize.XSmall]: css`\n min-width: ${spacing[3]}px;\n `,\n [ComboboxSize.Small]: css`\n min-width: ${spacing[3]}px;\n `,\n [ComboboxSize.Default]: css`\n min-width: ${spacing[3]}px;\n `,\n [ComboboxSize.Large]: css`\n min-width: ${spacing[4]}px;\n `,\n};\n\nexport const checkBoxBaseStyles = css`\n pointer-events: none;\n gap: 0;\n\n label {\n gap: 0;\n align-items: center;\n }\n`;\n\nexport const disallowPointer = css`\n pointer-events: none;\n`;\n\nexport const displayNameStyle = (isSelected: boolean) => css`\n font-weight: ${isSelected ? fontWeights.bold : fontWeights.regular};\n`;\n\nexport const iconThemeStyles: Record<Theme, string> = {\n [Theme.Light]: css`\n color: ${palette.gray.dark1};\n `,\n [Theme.Dark]: css`\n color: ${palette.gray.base};\n `,\n};\n\nexport const iconHighlightedStyles: Record<Theme, string> = {\n [Theme.Light]: css`\n color: ${palette.blue.dark1};\n `,\n [Theme.Dark]: css`\n color: ${palette.blue.light3};\n `,\n};\n\nexport const iconDisabledStyles: Record<Theme, string> = {\n [Theme.Light]: css`\n color: ${palette.gray.light1};\n `,\n [Theme.Dark]: css`\n color: ${palette.gray.dark1};\n `,\n};\n\nexport const checkMarkThemeStyles: Record<Theme, string> = {\n [Theme.Light]: css`\n color: ${palette.blue.base};\n `,\n [Theme.Dark]: css`\n color: ${palette.blue.light1};\n `,\n};\n\nexport const checkMarkDisabledStyles: Record<Theme, string> = {\n [Theme.Light]: css`\n color: ${palette.gray.light1};\n `,\n [Theme.Dark]: css`\n color: ${palette.gray.dark1};\n `,\n};\n\nexport const multiselectIconPosition = css`\n .${leftGlyphClassName} {\n align-self: baseline;\n }\n`;\nexport const multiselectIconLargePosition = css`\n .${leftGlyphClassName} {\n height: 28px;\n }\n`;\n","import kebabCase from 'lodash/kebabCase';\n\nimport { ComboboxOptionProps } from '../ComboboxOption';\n\n/**\n *\n * Returns an object with properties `value` & `displayName`\n * based on the props provided\n *\n * @property value: string\n * @property displayName: string\n * @internal\n */\nexport const getNameAndValue = ({\n value: valProp,\n displayName: nameProp,\n}: ComboboxOptionProps): {\n value: string;\n displayName: string;\n} => {\n return {\n value: valProp ?? kebabCase(nameProp),\n displayName: nameProp ?? valProp ?? '', // TODO consider adding a prop to customize displayName => startCase(valProp),\n };\n};\n","import React from 'react';\n\nimport { isComponentType } from '@leafygreen-ui/lib';\n\nimport { OptionObject } from '../ComboboxOption';\n\nimport { getNameAndValue } from './getNameAndValue';\n\n/**\n *\n * Flattens multiple nested ComboboxOptions into a 1D array\n *\n * @param _children\n * @returns `Array<OptionObject>`\n * @internal\n */\nexport const flattenChildren = (\n _children: React.ReactNode,\n): Array<OptionObject> => {\n // TS doesn't like .reduce\n // @ts-expect-error\n return React.Children.toArray(_children).reduce(\n // @ts-expect-error\n (\n acc: Array<OptionObject>,\n child: React.ReactNode,\n ): Array<OptionObject> | undefined => {\n if (isComponentType(child, 'ComboboxOption')) {\n const { value, displayName } = getNameAndValue(child.props);\n const { glyph, disabled } = child.props;\n\n return [\n ...acc,\n {\n value,\n displayName,\n isDisabled: !!disabled,\n hasGlyph: !!glyph,\n },\n ];\n } else if (isComponentType(child, 'ComboboxGroup')) {\n const { children } = child.props;\n\n if (children) {\n return [...acc, ...flattenChildren(children)];\n }\n }\n },\n [] as Array<OptionObject>,\n );\n};\n","import { OptionObject } from '../ComboboxOption';\n/**\n *\n * @param value\n * @param options\n * @internal\n */\nexport const getOptionObjectFromValue = (\n value: string | null,\n options: Array<OptionObject>,\n): OptionObject | undefined => {\n if (value) return options.find(opt => opt.value === value);\n};\n\n/**\n *\n * @param value\n * @param options\n * @internal\n */\nexport const getDisplayNameForValue = (\n value: string | null,\n options: Array<OptionObject>,\n): string => {\n return value\n ? getOptionObjectFromValue(value, options)?.displayName ?? value\n : '';\n};\n\n/**\n *\n * @param value\n * @param options\n * @internal\n */\nexport const getValueForDisplayName = (\n displayName: string | null,\n options: Array<OptionObject>,\n): string => {\n return displayName\n ? options.find(opt => opt.displayName === displayName)?.value ?? displayName\n : '';\n};\n","import React, { useCallback, useContext, useMemo } from 'react';\nimport PropTypes from 'prop-types';\n\nimport { cx } from '@leafygreen-ui/emotion';\nimport { useForwardedRef, useIdAllocator } from '@leafygreen-ui/hooks';\nimport { InputOption, InputOptionContent } from '@leafygreen-ui/input-option';\nimport { useDarkMode } from '@leafygreen-ui/leafygreen-provider';\n\nimport { ComboboxContext } from '../ComboboxContext';\nimport { ComboboxSize } from '../types';\nimport { wrapJSX } from '../utils';\n\nimport {\n comboboxOptionSizeStyle,\n displayNameStyle,\n multiselectIconLargePosition,\n multiselectIconPosition,\n} from './ComboboxOption.styles';\nimport {\n ComboboxOptionProps,\n InternalComboboxOptionProps,\n} from './ComboboxOption.types';\nimport { getGlyphs } from './getGlyphs';\n\n/**\n * Internal ComboboxOption Component for use within Combobox only.\n *\n * Prefer using {@link ComboboxOption}\n * @internal\n */\nexport const InternalComboboxOption = React.forwardRef<\n HTMLLIElement,\n InternalComboboxOptionProps\n>(\n (\n {\n glyph,\n isSelected,\n displayName,\n isFocused,\n setSelected,\n className,\n description,\n value,\n onClick,\n disabled = false,\n ...rest\n }: InternalComboboxOptionProps,\n forwardedRef,\n ) => {\n const { darkMode, theme } = useDarkMode();\n const { multiselect, size, withIcons, inputValue } =\n useContext(ComboboxContext);\n const optionRef = useForwardedRef(forwardedRef, null);\n const optionTextId = useIdAllocator({ prefix: 'combobox-option-text' });\n\n const handleOptionClick = useCallback(\n (e: React.SyntheticEvent<HTMLLIElement, Event>) => {\n // stopPropagation will not stop the keyDown event (only click)\n // since the option is never `focused`, only `aria-selected`\n // the keyDown event does not actually fire on the option element\n e.stopPropagation();\n\n if (!disabled) {\n setSelected();\n onClick?.(e, value);\n }\n },\n [disabled, onClick, setSelected, value],\n );\n\n const { leftGlyph, rightGlyph } = useMemo(\n () =>\n getGlyphs({\n withIcons,\n isSelected,\n glyph,\n theme,\n darkMode,\n size,\n disabled,\n multiselect,\n optionTextId,\n isFocused,\n }),\n [\n darkMode,\n disabled,\n glyph,\n isSelected,\n multiselect,\n optionTextId,\n size,\n theme,\n withIcons,\n isFocused,\n ],\n );\n\n // When multiselect and withoutIcons the Checkbox is aligned to the top instead of centered.\n const multiSelectWithoutIcons = multiselect && !withIcons;\n\n return (\n <InputOption\n {...rest}\n as=\"li\"\n ref={optionRef}\n highlighted={isFocused}\n disabled={disabled}\n aria-label={displayName}\n darkMode={darkMode}\n className={cx(\n comboboxOptionSizeStyle(size),\n {\n [multiselectIconPosition]: multiSelectWithoutIcons,\n [multiselectIconLargePosition]:\n multiSelectWithoutIcons && size === ComboboxSize.Large,\n },\n className,\n )}\n onClick={handleOptionClick}\n onKeyDown={handleOptionClick}\n >\n <InputOptionContent\n leftGlyph={leftGlyph}\n rightGlyph={rightGlyph}\n description={description}\n >\n <span id={optionTextId} className={displayNameStyle(isSelected)}>\n {wrapJSX(displayName, inputValue, 'strong')}\n </span>\n </InputOptionContent>\n </InputOption>\n );\n },\n);\nInternalComboboxOption.displayName = 'ComboboxOption';\n\nexport function ComboboxOption(_: ComboboxOptionProps): JSX.Element {\n throw Error('`ComboboxOption` must be a child of a `Combobox` instance');\n}\nComboboxOption.displayName = 'ComboboxOption';\n\nComboboxOption.propTypes = {\n displayName: PropTypes.string,\n value: PropTypes.string,\n glyph: PropTypes.node,\n disabled: PropTypes.bool,\n className: PropTypes.string,\n description: PropTypes.string,\n onClick: PropTypes.func,\n};\n","import React, { ReactElement } from 'react';\n\nimport Checkbox from '@leafygreen-ui/checkbox';\nimport { cx } from '@leafygreen-ui/emotion';\nimport Icon, { isComponentGlyph } from '@leafygreen-ui/icon';\nimport { Theme } from '@leafygreen-ui/lib';\n\nimport { ComboboxSize } from '../types';\n\nimport {\n checkBoxBaseStyles,\n checkMarkDisabledStyles,\n checkMarkSizeStyle,\n checkMarkThemeStyles,\n iconDisabledStyles,\n iconHighlightedStyles,\n iconThemeStyles,\n} from './ComboboxOption.styles';\n\n/**\n * Util that returns the leftGlyph and rightGlyph.\n */\nexport const getGlyphs = ({\n withIcons,\n isSelected,\n glyph,\n optionTextId,\n disabled,\n darkMode,\n size,\n multiselect,\n theme,\n isFocused,\n}: {\n withIcons: boolean;\n isSelected: boolean;\n glyph?: ReactElement;\n optionTextId: string;\n disabled: boolean;\n darkMode: boolean;\n size: ComboboxSize;\n multiselect: boolean;\n theme: Theme;\n isFocused: boolean;\n}) => {\n if (glyph && !isComponentGlyph(glyph)) {\n console.error(\n '`ComboboxOption` instance did not render icon because it is not a known glyph element.',\n glyph,\n );\n }\n\n const icon =\n glyph && isComponentGlyph(glyph) ? (\n React.cloneElement(glyph, {\n ...glyph.props,\n className: cx(\n iconThemeStyles[theme],\n {\n [iconHighlightedStyles[theme]]: isFocused,\n [iconDisabledStyles[theme]]: disabled,\n },\n glyph.props.className,\n ),\n })\n ) : (\n <></>\n );\n\n const checkBox = (\n <Checkbox\n aria-labelledby={optionTextId}\n checked={isSelected}\n tabIndex={-1}\n disabled={disabled}\n darkMode={darkMode}\n className={checkBoxBaseStyles}\n />\n );\n\n const checkMark = (\n <Icon\n glyph=\"Checkmark\"\n className={cx(checkMarkSizeStyle[size], checkMarkThemeStyles[theme], {\n [checkMarkDisabledStyles[theme]]: disabled,\n })}\n />\n );\n\n const multiSelectLeftGlyph = withIcons ? icon : checkBox;\n const multiSelectRightGlyph = withIcons && checkBox;\n\n const singleSelectLeftGlyph = withIcons\n ? icon\n : isSelected\n ? checkMark\n : null;\n const singleSelectRightGlyph = withIcons && isSelected && checkMark;\n\n const leftGlyph = multiselect ? multiSelectLeftGlyph : singleSelectLeftGlyph;\n const rightGlyph = multiselect\n ? multiSelectRightGlyph\n : singleSelectRightGlyph;\n\n return {\n leftGlyph,\n rightGlyph,\n };\n};\n","import React, { ReactChild } from 'react';\nimport escapeRegExp from 'lodash/escapeRegExp';\n\n/**\n *\n * Wraps every instance of `wrap` found in `str` in the provided `element`.\n *\n * E.g. `wrapJSX('Apple', 'ap', 'em') => <em>Ap</em>ple`\n *\n * @param str\n * @param wrap\n * @param element\n * @returns `JSX.Element`\n * @internal\n */\nexport const wrapJSX = (\n str: string,\n wrap?: string,\n element?: keyof HTMLElementTagNameMap,\n): JSX.Element => {\n if (wrap && element) {\n const cleanWrap = escapeRegExp(wrap);\n const regex = new RegExp(cleanWrap, 'gi');\n const matches = str.matchAll(regex);\n\n if (matches) {\n const outArray = str.split('') as Array<ReactChild>;\n\n /**\n * For every match, splice it into the \"string\",\n * wrapped in the React element\n */\n // Consider adding --downlevelIteration TS flag so we don't need Array.from\n for (const match of Array.from(matches)) {\n const matchIndex = match.index ?? -1;\n const matchContent = match[0];\n const matchLength = matchContent.length;\n const key = matchIndex + matchContent + matchLength;\n\n // We create a replacement array that's\n // the same length as the match we're deleting,\n // in order to keep the matchIndexes aligned\n // with the indexes of the output array\n const replacement = new Array<ReactChild>(matchLength).fill('');\n replacement[0] = React.createElement(element, { key }, matchContent);\n\n outArray.splice(matchIndex, matchLength, ...replacement);\n }\n\n return <>{outArray}</>;\n }\n\n return <>{str}</>;\n }\n\n return <>{str}</>;\n};\n","import isArray from 'lodash/isArray';\nimport isNull from 'lodash/isNull';\nimport isString from 'lodash/isString';\nimport isUndefined from 'lodash/isUndefined';\n\nimport { SelectValueType } from '../types';\n\nexport const doesSelectionExist = <M extends boolean>(\n selection?: SelectValueType<M> | null,\n): boolean => {\n return (\n !isUndefined(selection) &&\n !isNull(selection) &&\n (isString(selection) || (isArray(selection) && selection.length > 0))\n );\n};\n","import { transparentize } from 'polished';\n\nimport { css } from '@leafygreen-ui/emotion';\nimport { Theme } from '@leafygreen-ui/lib';\nimport { palette } from '@leafygreen-ui/palette';\nimport {\n focusRing,\n fontFamilies,\n spacing,\n transitionDuration,\n typeScales,\n} from '@leafygreen-ui/tokens';\n\nimport {\n chipClassName,\n chipWrapperPaddingY,\n fontSize,\n lineHeight,\n} from '../ComboboxChip/ComboboxChip.styles';\nimport { ComboboxSize as Size, Overflow } from '../types';\n\n/**\n * Util to get the chip height\n * `lineHeight + (2 * paddingY)`\n */\n// Rename the variable defined in chip styles\nconst inputHeight = (size: Size) => {\n return lineHeight[size] + 2 * chipWrapperPaddingY[size];\n};\n\n// Gap between each chip\nconst flexGap = 4;\n\n/**\n * The min-height of the combobox.\n */\nexport const wrapperHeight: Record<Size, number> = {\n [Size.XSmall]: 22,\n [Size.Small]: 28,\n [Size.Default]: 36,\n [Size.Large]: 48,\n};\n\n/**\n * Util that calculates the Y padding.\n * `(wrapperHeight - inputHeight(- (borderTop + borderBottom)) / 2`\n */\nconst getYPadding = (size: Size) => {\n return (wrapperHeight[size] - inputHeight(size) - 2) / 2;\n};\n\n/**\n * Size of combobox x & y padding (in px)\n * (wrapperHeight - inputHeight(- (borderTop + borderBottom)) / 2\n */\nexport const comboboxPadding: Record<\n Size,\n {\n y: number;\n xLeftWithChip: number;\n xLeftWithoutChip: number;\n xRight: number;\n }\n> = {\n [Size.XSmall]: {\n y: getYPadding(Size.XSmall),\n xLeftWithChip: 1,\n xLeftWithoutChip: 10,\n xRight: 4,\n },\n [Size.Small]: {\n y: getYPadding(Size.Small),\n xLeftWithChip: 4,\n xLeftWithoutChip: 10,\n xRight: 8,\n },\n [Size.Default]: {\n y: getYPadding(Size.Default),\n xLeftWithChip: 6,\n xLeftWithoutChip: 12,\n xRight: 12,\n },\n [Size.Large]: {\n y: getYPadding(Size.Large),\n xLeftWithChip: spacing[2] - 1,\n xLeftWithoutChip: spacing[2] - 1,\n xRight: spacing[2] - 1,\n },\n};\n\n/** Width of the clear icon (in px) */\nexport const clearButtonIconSize = 28;\n\n/** Width of the dropdown caret icon (in px) */\nexport const caretIconSize = spacing[3];\n\nexport const comboboxParentStyle = (size: Size): string => {\n return css`\n font-family: ${fontFamilies.default};\n width: 100%;\n min-width: ${fontSize[size] +\n 2 * comboboxPadding[size].xLeftWithChip +\n caretIconSize +\n 2}px;\n `;\n};\n\nexport const baseComboboxStyles = css`\n display: flex;\n align-items: center;\n gap: ${spacing[2]}px;\n cursor: text;\n transition: ${transitionDuration.default}ms ease-in-out;\n transition-property: background-color, box-shadow, border-color;\n border: 1px solid;\n width: 100%;\n max-width: 100%;\n border-radius: 6px;\n position: relative;\n overflow: hidden;\n\n // Overflow shadow\n ::after {\n content: '';\n position: absolute;\n width: 100%;\n height: 20px;\n bottom: -21px;\n left: 50%;\n translate: -50% 0%;\n border-radius: 20%;\n box-shadow: 0 0 0 0 rgb(255 255 255 / 0%);\n transition: ${transitionDuration.default}ms linear;\n transition-property: box-shadow;\n }\n`;\n\nexport const comboboxThemeStyles: Record<Theme, string> = {\n [Theme.Light]: css`\n color: ${palette.gray.dark3};\n background-color: ${palette.white};\n border-color: ${palette.gray.base};\n `,\n [Theme.Dark]: css`\n color: ${palette.gray.light2};\n background-color: ${palette.gray.dark4};\n border-color: ${palette.gray.base};\n `,\n};\n\nexport const comboboxSizeStyles = (\n size: Size,\n isMultiselectWithSelections: boolean,\n) => css`\n padding-top: ${comboboxPadding[size].y}px;\n padding-bottom: ${comboboxPadding[size].y}px;\n padding-left: ${isMultiselectWithSelections\n ? `${comboboxPadding[size].xLeftWithChip}px`\n : `${comboboxPadding[size].xLeftWithoutChip}px`};\n padding-right: ${comboboxPadding[size].xRight}px;\n`;\n\nexport const comboboxDisabledStyles: Record<Theme, string> = {\n [Theme.Light]: css`\n cursor: not-allowed;\n color: ${palette.gray.dark1};\n background-color: ${palette.gray.light2};\n border-color: ${palette.gray.light1};\n `,\n [Theme.Dark]: css`\n cursor: not-allowed;\n color: ${palette.gray.dark1};\n background-color: ${palette.gray.dark3};\n border-color: ${palette.gray.dark2};\n `,\n};\n\nexport const comboboxErrorStyles: Record<Theme, string> = {\n [Theme.Light]: css`\n border-color: ${palette.red.base};\n `,\n [Theme.Dark]: css`\n border-color: ${palette.red.light1};\n `,\n};\n\nexport const comboboxFocusStyle: Record<Theme, string> = {\n [Theme.Light]: css`\n &:focus-within {\n border-color: transparent;\n box-shadow: ${focusRing[Theme.Light].input};\n }\n `,\n [Theme.Dark]: css`\n &:focus-within {\n border-color: transparent;\n box-shadow: ${focusRing[Theme.Dark].input};\n }\n `,\n};\n\nexport const iconsWrapperBaseStyles = css`\n display: flex;\n align-items: center;\n`;\n\nexport const iconsWrapperSizeStyles: Record<Size, string> = {\n [Size.XSmall]: css`\n gap: ${spacing[1]}px;\n `,\n [Size.Small]: css`\n gap: ${spacing[2]}px;\n `,\n [Size.Default]: css`\n gap: ${spacing[2]}px;\n `,\n [Size.Large]: css`\n gap: ${spacing[2]}px;\n `,\n};\n\nexport const inputWrapperStyle = ({\n overflow,\n size,\n}: {\n overflow: Overflow;\n size: Size;\n}) => {\n const baseWrapperStyle = css`\n flex-grow: 1;\n width: 100%;\n `;\n\n switch (overflow) {\n case Overflow.scrollX: {\n return css`\n ${baseWrapperStyle}\n display: block;\n height: ${inputHeight(size)}px;\n white-space: nowrap;\n overflow-x: scroll;\n scroll-behavior: smooth;\n scrollbar-width: none;\n line-height: 1;\n\n &::-webkit-scrollbar {\n display: none;\n }\n\n & > .${chipClassName} {\n margin-inline: 2px;\n\n &:first-child {\n margin-inline-start: 0;\n }\n\n &:last-child {\n margin-inline-end: 0;\n }\n }\n `;\n }\n\n // TODO - look into animating input element height on wrap\n case Overflow.expandY: {\n return css`\n ${baseWrapperStyle}\n display: flex;\n flex-wrap: wrap;\n gap: ${flexGap}px;\n overflow-x: hidden;\n min-height: ${inputHeight(size)}px;\n max-height: calc((${inputHeight(size) * 3}px) + (${flexGap}px * 2));\n `;\n }\n }\n};\n\nexport const baseInputElementStyle = css`\n font-family: ${fontFamilies.default};\n width: 100%;\n border: none;\n cursor: inherit;\n background-color: inherit;\n color: inherit;\n box-sizing: content-box;\n padding: 0;\n margin: 0;\n text-overflow: ellipsis;\n vertical-align: top;\n\n // Only add padding if there are chips\n &:not(:first-child) {\n padding-left: ${spacing[1]}px;\n }\n\n &:placeholder-shown {\n min-width: 100%;\n }\n &:focus {\n outline: none;\n }\n`;\n\nexport const inputElementThemeStyle: Record<Theme, string> = {\n [Theme.Light]: css`\n &::placeholder {\n color: ${palette.gray.dark1};\n }\n `,\n [Theme.Dark]: css`\n &::placeholder {\n color: ${palette.gray.light1};\n }\n `,\n};\n\nexport const inputElementDisabledThemeStyle: Record<Theme, string> = {\n [Theme.Light]: css`\n &::placeholder {\n color: ${palette.gray.dark1};\n }\n `,\n [Theme.Dark]: css`\n &::placeholder {\n color: ${palette.gray.dark1};\n }\n `,\n};\n\nexport const inputElementSizeStyle = (size: Size) => css`\n height: ${inputHeight(size)}px;\n font-size: ${fontSize[size]}px;\n line-height: ${lineHeight[size]}px;\n min-width: ${fontSize[size]}px;\n`;\n\nexport const inputElementTransitionStyles = (isOpen: boolean) => css`\n /*\n * Immediate transition in, slow transition out. \n * '-in' transition is handled by \\`scroll-behavior\\` \n */\n transition: width ease-in-out ${isOpen ? '0s' : '100ms'};\n`;\n\n// Previously defined in inputWrapperStyle\n/** Should only be applied to a multiselect */\nexport const multiselectInputElementStyle = (\n size: Size,\n inputValue?: string,\n) => {\n const inputLength = inputValue?.length ?? 0;\n return css`\n width: ${inputLength * fontSize[size]}px;\n max-width: 100%;\n `;\n};\n\nexport const clearButtonStyle = css`\n // Add a negative margin so the button takes up the same space as the regular icons\n margin-block: calc(${caretIconSize / 2}px - 100%);\n margin-inline: -6px;\n`;\n\nexport const endIconStyle = css`\n height: ${caretIconSize}px;\n width: ${caretIconSize}px;\n`;\n\nexport const errorMessageThemeStyle: Record<Theme, string> = {\n [Theme.Light]: css`\n color: ${palette.red.base};\n `,\n [Theme.Dark]: css`\n color: ${palette.red.light1};\n `,\n};\n\nexport const errorMessageSizeStyle = (size: Size) => css`\n font-size: ${fontSize[size]}px;\n line-height: ${lineHeight[size]}px;\n padding-top: ${comboboxPadding[size].y}px;\n`;\n\nexport const labelDescriptionContainerStyle = css`\n margin-bottom: ${spacing[1]}px;\n display: flex;\n flex-direction: column;\n`;\n\nexport const labelDescriptionLargeStyles = css`\n font-size: ${typeScales.large.fontSize}px;\n line-height: ${typeScales.large.lineHeight}px;\n`;\n\nexport const comboboxOverflowShadowStyles: Record<Theme, string> = {\n [Theme.Light]: css`\n ::after {\n box-shadow: 0px 0px 7px 5px ${transparentize(0.85, palette.black)};\n }\n `,\n [Theme.Dark]: css`\n ::after {\n width: 95%;\n box-shadow: 0px -7px 12px 5px rgb(0 0 0 / 50%);\n }\n `,\n};\n\nexport const errorIconThemeStyles: Record<Theme, string> = {\n [Theme.Light]: palette.red.base,\n [Theme.Dark]: palette.red.light1,\n};\n\nexport const caretIconThemeStyles: Record<Theme, string> = {\n [Theme.Light]: palette.gray.dark2,\n [Theme.Dark]: palette.gray.light1,\n};\n\nexport const caretIconDisabledStyles: Record<Theme, string> = {\n [Theme.Light]: palette.gray.base,\n [Theme.Dark]: palette.gray.dark1,\n};\n","import React, {\n ChangeEventHandler,\n FocusEventHandler,\n KeyboardEventHandler,\n MouseEventHandler,\n TransitionEventHandler,\n UIEvent,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport clone from 'lodash/clone';\nimport debounce from 'lodash/debounce';\nimport isArray from 'lodash/isArray';\nimport isEqual from 'lodash/isEqual';\nimport isNull from 'lodash/isNull';\nimport isString from 'lodash/isString';\nimport isUndefined from 'lodash/isUndefined';\nimport PropTypes from 'prop-types';\n\nimport { cx } from '@leafygreen-ui/emotion';\nimport {\n useAutoScroll,\n useBackdropClick,\n useDynamicRefs,\n useIdAllocator,\n usePrevious,\n} from '@leafygreen-ui/hooks';\nimport Icon from '@leafygreen-ui/icon';\nimport IconButton from '@leafygreen-ui/icon-button';\nimport LeafyGreenProvider, {\n useDarkMode,\n} from '@leafygreen-ui/leafygreen-provider';\nimport { consoleOnce, isComponentType, keyMap } from '@leafygreen-ui/lib';\nimport { Description, Label } from '@leafygreen-ui/typography';\n\nimport { ComboboxChip } from '../ComboboxChip';\nimport { ComboboxContext } from '../ComboboxContext';\nimport { InternalComboboxGroup } from '../ComboboxGroup';\nimport { ComboboxMenu } from '../ComboboxMenu';\nimport { OptionObject } from '../ComboboxOption';\nimport { InternalComboboxOption } from '../ComboboxOption';\nimport {\n ComboboxElement,\n ComboboxSize,\n DiffObject,\n getNullSelection,\n onChangeType,\n Overflow,\n SearchState,\n SelectValueType,\n State,\n TruncationLocation,\n} from '../types';\nimport {\n checkScrollPosition,\n flattenChildren,\n getDisplayNameForValue,\n getNameAndValue,\n getOptionObjectFromValue,\n getValueForDisplayName,\n} from '../utils';\nimport { doesSelectionExist } from '../utils/doesSelectionExist';\n\nimport { isValueCurrentSelection } from './utils/isValueCurrentSelection';\nimport {\n baseComboboxStyles,\n baseInputElementStyle,\n caretIconDisabledStyles,\n caretIconThemeStyles,\n clearButtonStyle,\n comboboxDisabledStyles,\n comboboxErrorStyles,\n comboboxFocusStyle,\n comboboxOverflowShadowStyles,\n comboboxParentStyle,\n comboboxSizeStyles,\n comboboxThemeStyles,\n endIconStyle,\n errorIconThemeStyles,\n errorMessageSizeStyle,\n errorMessageThemeStyle,\n iconsWrapperBaseStyles,\n iconsWrapperSizeStyles,\n inputElementDisabledThemeStyle,\n inputElementSizeStyle,\n inputElementThemeStyle,\n inputElementTransitionStyles,\n inputWrapperStyle,\n labelDescriptionContainerStyle,\n labelDescriptionLargeStyles,\n multiselectInputElementStyle,\n} from './Combobox.styles';\nimport { ComboboxProps } from './Combobox.types';\n\n/**\n * Combobox is a combination of a Select and TextInput,\n * allowing the user to either type a value directly or select a value from the list.\n * Can be configured to select a single or multiple options.\n */\nexport function Combobox<M extends boolean>({\n children,\n label,\n description,\n placeholder = 'Select',\n 'aria-label': ariaLabel,\n disabled = false,\n size = ComboboxSize.Default,\n darkMode: darkModeProp,\n state = 'none',\n errorMessage,\n searchState = 'unset',\n searchEmptyMessage = 'No results found',\n searchErrorMessage = 'Could not get results!',\n searchLoadingMessage = 'Loading results...',\n filteredOptions,\n onFilter,\n clearable = true,\n onClear,\n overflow = Overflow.expandY,\n multiselect = false as M,\n initialValue,\n inputValue: inputValueProp,\n onInputChange,\n onChange,\n value,\n chipTruncationLocation,\n chipCharacterLimit = 12,\n className,\n usePortal = true,\n portalClassName,\n portalContainer,\n scrollContainer,\n popoverZIndex,\n ...rest\n}: ComboboxProps<M>) {\n const { darkMode, theme } = useDarkMode(darkModeProp);\n const getOptionRef = useDynamicRefs<HTMLLIElement>({ prefix: 'option' });\n const getChipRef = useDynamicRefs<HTMLSpanElement>({ prefix: 'chip' });\n\n const inputId = useIdAllocator({ prefix: 'combobox-input' });\n const labelId = useIdAllocator({ prefix: 'combobox-label' });\n const menuId = useIdAllocator({ prefix: 'combobox-menu' });\n\n const comboboxRef = useRef<HTMLDivElement>(null);\n const clearButtonRef = useRef<HTMLButtonElement>(null);\n const inputWrapperRef = useRef<HTMLDivElement>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n const menuRef = useRef<HTMLDivElement>(null);\n\n const [isOpen, setOpen] = useState(false);\n const wasOpen = usePrevious(isOpen);\n const [highlightedOption, setHighlightedOption] = useState<string | null>(\n null,\n );\n const [selection, setSelection] = useState<SelectValueType<M> | null>(null);\n const prevSelection = usePrevious(selection);\n const [inputValue, setInputValue] = useState<string>(inputValueProp ?? '');\n\n useEffect(() => {\n if (!isUndefined(inputValueProp)) {\n setInputValue(inputValueProp);\n }\n }, [inputValueProp]);\n\n const updateInputValue = (newInputVal: string) => {\n setInputValue(newInputVal);\n };\n\n const prevValue = usePrevious(inputValue);\n const [focusedChip, setFocusedChip] = useState<string | null>(null);\n const [shouldShowOverflowShadow, setShouldShowOverflowShadow] =\n useState<boolean>(false);\n\n const placeholderValue =\n multiselect && isArray(selection) && selection.length > 0\n ? undefined\n : placeholder;\n\n const closeMenu = () => setOpen(false);\n const openMenu = () => setOpen(true);\n\n /**\n * Array of all of the options objects\n */\n const allOptions: Array<OptionObject> = useMemo(\n () => flattenChildren(children),\n [children],\n );\n\n /**\n * Utility function that tells Typescript whether selection is multiselect\n */\n const isMultiselect = useCallback(\n <T extends string>(val?: Array<T> | T | null): val is Array<T> => {\n if (multiselect && (typeof val == 'string' || typeof val == 'number')) {\n consoleOnce.error(\n `Error in Combobox: multiselect is set to \\`true\\`, but received a ${typeof val} value: \"${val}\"`,\n );\n } else if (!multiselect && isArray(val)) {\n consoleOnce.error(\n 'Error in Combobox: multiselect is set to `false`, but received an Array value',\n );\n }\n\n return multiselect && isArray(val);\n },\n [multiselect],\n );\n\n /**\n * Forces focus of input box\n * @param cursorPos index the cursor should be set to\n */\n const setInputFocus = useCallback(\n (cursorPos?: number) => {\n if (!disabled && inputRef && inputRef.current) {\n inputRef.current.focus();\n if (!isUndefined(cursorPos)) {\n inputRef.current.setSelectionRange(cursorPos, cursorPos);\n }\n }\n },\n [disabled],\n );\n\n /**\n * Update selection.\n * This behaves differently in multi. vs single select.\n * @param value option value the selection should be set to\n */\n const updateSelection = useCallback(\n (value: string | null) => {\n if (isMultiselect(selection)) {\n // We know M is true here\n const newSelection: SelectValueType<true> = clone(selection);\n const multiselectOnChange = onChange as onChangeType<true>;\n const diff: DiffObject = {\n diffType: 'delete',\n value: value ?? selection,\n };\n\n if (isNull(value)) {\n newSelection.length = 0;\n } else {\n if (selection.includes(value)) {\n // remove from array\n newSelection.splice(newSelection.indexOf(value), 1);\n } else {\n // add to array\n newSelection.push(value);\n diff.diffType = 'insert';\n // clear text\n updateInputValue('');\n }\n }\n setSelection(newSelection as SelectValueType<M>);\n multiselectOnChange?.(newSelection, diff);\n } else {\n const newSelection: SelectValueType<false> = value;\n const singleSelectOnChange = onChange as onChangeType<false>;\n setSelection(newSelection as SelectValueType<M>);\n singleSelectOnChange?.(newSelection);\n }\n },\n [isMultiselect, onChange, selection],\n );\n\n /**\n * Returns whether given text is included in, or equal to, the current selection.\n * Similar to `isValueCurrentSelection`, but assumes the text argument is the `displayName` for the selection\n * @param text the text to check\n */\n const isTextCurrentSelection = useCallback(\n (text: string): boolean => {\n const value = getValueForDisplayName(text, allOptions);\n return isValueCurrentSelection(value, selection);\n },\n [allOptions, selection],\n );\n\n /**\n * Returns whether the provided option is disabled\n * @param option the option value or OptionObject to check\n */\n const isOptionDisabled = (option: string | OptionObject): boolean => {\n if (typeof option === 'string') {\n const optionObj = getOptionObjectFromValue(option, allOptions);\n return !!optionObj?.isDisabled;\n } else {\n return !!option.isDisabled;\n }\n };\n\n /**\n * Computes whether the option is visible based on the current input\n * @param option the option value or OptionObject to compute\n */\n const shouldOptionBeVisible = useCallback(\n (option: string | OptionObject): boolean => {\n const value = typeof option === 'string' ? option : option.value;\n\n // If filtered options are provided\n if (filteredOptions && filteredOptions.length > 0) {\n return filteredOptions.includes(value);\n }\n\n // If the text input value is the current selection\n // (or included in the selection)\n // then all options should be visible\n if (isTextCurrentSelection(inputValue)) {\n return true;\n }\n\n // otherwise, we do our own filtering\n const displayName =\n typeof option === 'string'\n ? getDisplayNameForValue(value, allOptions)\n : option.displayName;\n\n const isValueInDisplayName = displayName\n .toLowerCase()\n .includes(inputValue.toLowerCase());\n\n return isValueInDisplayName;\n },\n [filteredOptions, isTextCurrentSelection, inputValue, allOptions],\n );\n\n /**\n * The array of visible options objects\n */\n const visibleOptions: Array<OptionObject> = useMemo(\n () => allOptions.filter(shouldOptionBeVisible),\n [allOptions, shouldOptionBeVisible],\n );\n\n /**\n * Returns whether the given value is in the options array\n * @param value the value to check\n */\n const isValueValid = useCallback(\n (value: string | null): boolean => {\n return value ? !!allOptions.find(opt => opt.value === value) : false;\n },\n [allOptions],\n );\n\n /**\n * Returns the index of a given value in the array of visible (filtered) options\n * @param value the option value to get the index of\n */\n const getIndexOfValue = useCallback(\n (value: string | null): number => {\n return visibleOptions\n ? visibleOptions.findIndex(option => option.value === value)\n : -1;\n },\n [visibleOptions],\n );\n\n /**\n * Returns the option value of a given index in the array of visible (filtered) options\n * @param index the option index to get the value of\n */\n const getValueAtIndex = useCallback(\n (index: number): string | undefined => {\n if (visibleOptions && visibleOptions.length >= index) {\n const option = visibleOptions[index];\n return option ? option.value : undefined;\n }\n },\n [visibleOptions],\n );\n\n /**\n * Returns the index of the active chip in the selection array\n */\n const getActiveChipIndex = useCallback(\n () =>\n isMultiselect(selection)\n ? selection.findIndex(value =>\n getChipRef(value)?.current?.contains(document.activeElement),\n )\n : -1,\n [getChipRef, isMultiselect, selection],\n );\n\n /**\n *\n * Focus Management\n *\n */\n\n const [focusedElementName, trackFocusedElement] = useState<\n ComboboxElement | undefined\n >();\n const isElementFocused = (elementName: ComboboxElement) =>\n elementName === focusedElementName;\n\n type Direction = 'next' | 'prev' | 'first' | 'last';\n\n /**\n * Updates the highlighted menu option based on the provided direction\n * @param direction the direction to move the focus. `'next' | 'prev' | 'first' | 'last'`\n */\n const updateHighlightedOption = useCallback(\n (direction: Direction) => {\n const optionsCount = visibleOptions?.length ?? 0;\n const lastIndex = optionsCount - 1 > 0 ? optionsCount - 1 : 0;\n const indexOfHighlight = getIndexOfValue(highlightedOption);\n\n // Remove focus from chip\n if (direction && isOpen) {\n setFocusedChip(null);\n setInputFocus();\n }\n\n switch (direction) {\n case 'next': {\n const newValue =\n indexOfHighlight + 1 < optionsCount\n ? getValueAtIndex(indexOfHighlight + 1)\n : getValueAtIndex(0);\n\n setHighlightedOption(newValue ?? null);\n break;\n }\n\n case 'prev': {\n const newValue =\n indexOfHighlight - 1 >= 0\n ? getValueAtIndex(indexOfHighlight - 1)\n : getValueAtIndex(lastIndex);\n\n setHighlightedOption(newValue ?? null);\n break;\n }\n\n case 'last': {\n const newValue = getValueAtIndex(lastIndex);\n setHighlightedOption(newValue ?? null);\n break;\n }\n\n case 'first':\n default: {\n const newValue = getValueAtIndex(0);\n setHighlightedOption(newValue ?? null);\n }\n }\n },\n [\n highlightedOption,\n getIndexOfValue,\n getValueAtIndex,\n isOpen,\n setInputFocus,\n visibleOptions?.length,\n ],\n );\n\n /**\n * Updates the focused chip based on the provided direction\n * @param direction the direction to move the focus. `'next' | 'prev' | 'first' | 'last'`\n * @param relativeToIndex the chip index to move focus relative to\n */\n const updateFocusedChip = useCallback(\n (direction: Direction | null, relativeToIndex?: number) => {\n if (isMultiselect(selection)) {\n switch (direction) {\n case 'next': {\n const referenceChipIndex = relativeToIndex ?? getActiveChipIndex();\n const nextChipIndex =\n referenceChipIndex + 1 < selection.length\n ? referenceChipIndex + 1\n : selection.length - 1;\n const nextChipValue = selection[nextChipIndex];\n setFocusedChip(nextChipValue);\n break;\n }\n\n case 'prev': {\n const referenceChipIndex = relativeToIndex ?? getActiveChipIndex();\n const prevChipIndex =\n referenceChipIndex > 0\n ? referenceChipIndex - 1\n : referenceChipIndex < 0\n ? selection.length - 1\n : 0;\n const prevChipValue = selection[prevChipIndex];\n setFocusedChip(prevChipValue);\n break;\n }\n\n case 'first': {\n const firstChipValue = selection[0];\n setFocusedChip(firstChipValue);\n break;\n }\n\n case 'last': {\n const lastChipValue = selection[selection.length - 1];\n setFocusedChip(lastChipValue);\n break;\n }\n\n default:\n setFocusedChip(null);\n break;\n }\n }\n },\n [getActiveChipIndex, isMultiselect, selection],\n );\n\n /**\n * Handles an arrow key press\n */\n const handleArrowKey = useCallback(\n (direction: 'left' | 'right', event: React.KeyboardEvent<Element>) => {\n // Remove focus from menu\n if (direction) setHighlightedOption(null);\n\n switch (direction) {\n case 'right':\n switch (focusedElementName) {\n case ComboboxElement.Input: {\n // If cursor is at the end of the input\n if (\n inputRef.current?.selectionEnd ===\n inputRef.current?.value.length\n ) {\n clearButtonRef.current?.focus();\n }\n break;\n }\n\n case ComboboxElement.FirstChip:\n case ComboboxElement.MiddleChip:\n case ComboboxElement.LastChip: {\n if (\n focusedElementName === ComboboxElement.LastChip ||\n // the first chip is also the last chip (i.e. only one)\n selection?.length === 1\n ) {\n // if focus is on last chip, go to input\n setInputFocus(0);\n updateFocusedChip(null);\n event.preventDefault();\n break;\n }\n // First/middle chips\n updateFocusedChip('next');\n break;\n }\n\n case ComboboxElement.ClearButton:\n default:\n break;\n }\n break;\n\n case 'left':\n switch (focusedElementName) {\n case ComboboxElement.ClearButton: {\n event.preventDefault();\n setInputFocus(inputRef?.current?.value.length);\n break;\n }\n\n case ComboboxElement.Input:\n case ComboboxElement.MiddleChip:\n case ComboboxElement.LastChip: {\n if (isMultiselect(selection)) {\n // Break if cursor is not at the start of the input\n if (\n focusedElementName === ComboboxElement.Input &&\n inputRef.current?.selectionStart !== 0\n ) {\n break;\n }\n\n updateFocusedChip('prev');\n }\n break;\n }\n\n case ComboboxElement.FirstChip:\n default:\n break;\n }\n break;\n default:\n updateFocusedChip(null);\n break;\n }\n },\n [\n focusedElementName,\n isMultiselect,\n selection,\n setInputFocus,\n updateFocusedChip,\n ],\n );\n\n // When the input value changes (or when the menu opens)\n // Update the focused option\n useEffect(() => {\n if (inputValue !== prevValue) {\n updateHighlightedOption('first');\n }\n }, [inputValue, isOpen, prevValue, updateHighlightedOption]);\n\n // When the focused option changes, update the menu scroll if necessary\n useAutoScroll(\n highlightedOption ? getOptionRef(highlightedOption) : undefined,\n menuRef,\n );\n\n /**\n * Rendering\n */\n\n /**\n * Callback to render a child as an <InternalComboboxOption> element\n */\n const renderOption = useCallback(\n (child: React.ReactNode) => {\n if (isComponentType(child, 'ComboboxOption')) {\n const { value, displayName } = getNameAndValue(child.props);\n\n if (shouldOptionBeVisible(value)) {\n const { className, glyph, disabled, ...rest } = child.props;\n const index = allOptions.findIndex(opt => opt.value === value);\n\n const isFocused = highlightedOption === value;\n const isSelected = isMultiselect(selection)\n ? selection.includes(value)\n : selection === value;\n\n const setSelected = () => {\n setHighlightedOption(value);\n updateSelection(value);\n setInputFocus();\n\n if (value === selection) {\n closeMenu();\n }\n };\n\n const optionRef = getOptionRef(value);\n\n return (\n <InternalComboboxOption\n {...rest}\n value={value}\n displayName={displayName}\n isFocused={isFocused}\n isSelected={isSelected}\n disabled={disabled}\n setSelected={setSelected}\n glyph={glyph}\n className={className}\n index={index}\n ref={optionRef}\n />\n );\n }\n } else if (isComponentType(child, 'ComboboxGroup')) {\n const nestedChildren = React.Children.map(\n child.props.children,\n renderOption,\n );\n\n if (nestedChildren && nestedChildren?.length > 0) {\n return (\n <InternalComboboxGroup\n label={child.props.label}\n className={child.props.className}\n >\n {React.Children.map(nestedChildren, renderOption)}\n </InternalComboboxGroup>\n );\n }\n }\n },\n [\n allOptions,\n getOptionRef,\n highlightedOption,\n isMultiselect,\n selection,\n setInputFocus,\n shouldOptionBeVisible,\n updateSelection,\n ],\n );\n\n /**\n * The rendered JSX elements for the options\n */\n const renderedOptionsJSX = useMemo(\n () => React.Children.map(children, renderOption),\n [children, renderOption],\n );\n\n /**\n * The rendered JSX for the selection Chips\n */\n const renderedChips = useMemo(() => {\n if (isMultiselect(selection)) {\n return selection.filter(isValueValid).map((value, index) => {\n const displayName = getDisplayNameForValue(value, allOptions);\n const isFocused = focusedChip === value;\n const chipRef = getChipRef(value);\n const isLastChip = index >= selection.length - 1;\n\n const onRemove = () => {\n if (isLastChip) {\n // Focus the input if this is the last chip in the set\n setInputFocus();\n updateFocusedChip(null);\n } else {\n updateFocusedChip('next', index);\n }\n updateSelection(value);\n };\n\n const onFocus = () => {\n setFocusedChip(value);\n };\n\n return (\n <ComboboxChip\n key={value}\n displayName={displayName}\n isFocused={isFocused}\n onRemove={onRemove}\n onFocus={onFocus}\n ref={chipRef}\n />\n );\n });\n }\n }, [\n isMultiselect,\n selection,\n isValueValid,\n allOptions,\n focusedChip,\n getChipRef,\n updateSelection,\n setInputFocus,\n updateFocusedChip,\n ]);\n\n /**\n * Flag to determine whether the rendered options have icons\n */\n const withIcons = useMemo(\n () => allOptions.some(opt => opt.hasGlyph),\n [allOptions],\n );\n\n /**\n *`\n * Selection Management\n *\n */\n\n const onCloseMenu = useCallback(() => {\n const exactMatchedOption = visibleOptions.find(\n option =>\n option.displayName === inputValue || option.value === inputValue,\n );\n\n // check if inputValue is matches a valid option\n // Set the selection to that value if the component is not controlled\n if (!value && exactMatchedOption) {\n updateSelection(exactMatchedOption.value);\n } else {\n if (!isMultiselect(selection)) {\n // Revert the value to the previous selection\n const displayName =\n getDisplayNameForValue(\n selection as SelectValueType<false>,\n allOptions,\n ) ?? prevSelection;\n updateInputValue(displayName);\n }\n }\n }, [\n allOptions,\n inputValue,\n isMultiselect,\n prevSelection,\n selection,\n updateSelection,\n value,\n visibleOptions,\n ]);\n\n /**\n * Side effects to run when the selection changes\n */\n const onSelect = useCallback(() => {\n if (doesSelectionExist(selection)) {\n if (isMultiselect(selection)) {\n scrollInputToEnd(overflow);\n } else if (!isMultiselect(selection)) {\n // Update the text input\n const displayName =\n getDisplayNameForValue(\n selection as SelectValueType<false>,\n allOptions,\n ) ?? '';\n updateInputValue(displayName);\n closeMenu();\n }\n } else {\n updateInputValue('');\n }\n }, [allOptions, isMultiselect, selection, overflow]);\n\n // Set the initialValue\n useEffect(() => {\n if (initialValue) {\n if (isArray(initialValue)) {\n // Ensure the values we set are real options\n const filteredValue =\n initialValue.filter(value => isValueValid(value)) ?? [];\n setSelection(filteredValue as SelectValueType<M>);\n } else {\n if (isValueValid(initialValue as string)) {\n setSelection(initialValue);\n }\n }\n } else {\n setSelection(getNullSelection(multiselect));\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // When controlled value changes, update the selection\n // TODO: use useControlledValue\n useEffect(() => {\n if (!isUndefined(value) && value !== prevValue) {\n if (isNull(value)) {\n setSelection(null);\n } else if (isMultiselect(value)) {\n // Ensure the value(s) passed in are valid options\n const newSelection = value.filter(isValueValid) as SelectValueType<M>;\n setSelection(newSelection);\n } else {\n setSelection(\n isValueValid(value as SelectValueType<false>) ? value : null,\n );\n }\n }\n }, [isMultiselect, isValueValid, prevValue, value]);\n\n // onSelect\n // Side effects to run when the selection changes\n useEffect(() => {\n const hasSelectionChanged =\n !isUndefined(prevSelection) &&\n ((isArray(selection) && !isNull(prevSelection)) ||\n isString(selection) ||\n isNull(selection)) &&\n !isEqual(selection, prevSelection);\n\n if (hasSelectionChanged) {\n onSelect();\n }\n }, [onSelect, prevSelection, selection]);\n\n // when the menu closes, update the value if needed\n useEffect(() => {\n if (!isOpen && wasOpen) {\n onCloseMenu();\n }\n }, [isOpen, wasOpen, onCloseMenu]);\n\n /**\n *\n * Menu management\n *\n */\n\n const [menuWidth, setMenuWidth] = useState(0);\n\n // When the menu opens, or the selection changes, or the focused option changes\n // update the menu width\n useEffect(() => {\n setMenuWidth(comboboxRef.current?.clientWidth ?? 0);\n }, [comboboxRef, isOpen, highlightedOption, selection]);\n\n /**\n *\n * Event Handlers\n *\n */\n\n // Handler fired when the menu has finished transitioning in/out\n const handleTransitionEnd: TransitionEventHandler<HTMLDivElement> = () => {\n setMenuWidth(comboboxRef.current?.clientWidth ?? 0);\n };\n\n // Prevent combobox from gaining focus by default\n const handleInputWrapperMousedown: MouseEventHandler<HTMLDivElement> = e => {\n if (disabled) {\n e.preventDefault();\n }\n };\n\n // Set focus to the input element on click\n const handleComboboxClick: MouseEventHandler<HTMLDivElement> = e => {\n // If we clicked the wrapper, not the input itself.\n // (Focus is set automatically if the click is on the input)\n if (e.target !== inputRef.current) {\n let cursorPos = 0;\n\n if (inputRef.current) {\n const mouseX = e.nativeEvent.offsetX;\n const inputRight =\n inputRef.current.offsetLeft + inputRef.current.clientWidth;\n cursorPos = mouseX > inputRight ? inputValue.length : 0;\n }\n\n setInputFocus(cursorPos);\n }\n\n // Only open the menu in response to a click\n openMenu();\n };\n\n // Fired whenever the wrapper gains focus,\n // and any time the focus within changes\n const handleComboboxFocus: FocusEventHandler<HTMLDivElement> = e => {\n scrollInputToEnd(overflow);\n trackFocusedElement(getNameFromElement(e.target));\n };\n\n // Fired onChange\n const handleInputChange: ChangeEventHandler<HTMLInputElement> = (\n e: React.ChangeEvent<HTMLInputElement>,\n ) => {\n updateInputValue(e.target.value);\n // fire any filter function passed in\n onFilter?.(e.target.value);\n onInputChange?.(e);\n };\n\n const handleClearButtonFocus: FocusEventHandler<HTMLButtonElement> = () => {\n setHighlightedOption(null);\n };\n\n const handleClearButtonClick: MouseEventHandler<HTMLButtonElement> = e => {\n if (!disabled) {\n // Prevents triggering the setOpen function called by clicking anywhere within the input wrapper.\n e.stopPropagation();\n updateSelection(null);\n onClear?.(e);\n onFilter?.('');\n setInputFocus();\n }\n };\n\n const handleKeyDown: KeyboardEventHandler<HTMLDivElement> = event => {\n const isFocusInMenu = menuRef.current?.contains(document.activeElement);\n const isFocusOnCombobox = comboboxRef.current?.contains(\n document.activeElement,\n );\n\n const isFocusInComponent = isFocusOnCombobox || isFocusInMenu;\n\n // Only run if the focus is in the component\n if (isFocusInComponent) {\n // No support for modifiers yet\n // TODO - Handle support for multiple chip selection\n if (event.ctrlKey || event.shiftKey || event.altKey) {\n return;\n }\n\n switch (event.key) {\n case keyMap.Tab: {\n switch (focusedElementName) {\n case 'Input': {\n if (!doesSelectionExist(selection)) {\n closeMenu();\n updateHighlightedOption('first');\n updateFocusedChip(null);\n }\n // else use default behavior\n break;\n }\n\n case 'LastChip': {\n // use default behavior\n updateFocusedChip(null);\n break;\n }\n\n case 'FirstChip':\n case 'MiddleChip': {\n // use default behavior\n break;\n }\n\n case 'ClearButton':\n default:\n break;\n }\n\n break;\n }\n\n case keyMap.Escape: {\n closeMenu();\n updateHighlightedOption('first');\n break;\n }\n\n case keyMap.Enter: {\n if (!isOpen) {\n openMenu();\n } else if (\n // Select the highlighted option if\n // the menu is open,\n // we're focused on input element,\n // and the highlighted option is not disabled\n isOpen &&\n focusedElementName === ComboboxElement.Input &&\n !isNull(highlightedOption) &&\n !isOptionDisabled(highlightedOption)\n ) {\n updateSelection(highlightedOption);\n } else if (\n // Focused on clear button\n focusedElementName === ComboboxElement.ClearButton\n ) {\n updateSelection(null);\n setInputFocus();\n }\n break;\n }\n\n case keyMap.Backspace: {\n // Backspace key focuses last chip if the input is focused\n // Note: Chip removal behavior is handled in `onRemove` defined in `renderChips`\n if (isMultiselect(selection)) {\n if (\n focusedElementName === 'Input' &&\n inputRef.current?.selectionStart === 0\n ) {\n updateFocusedChip('last');\n }\n }\n // Open the menu regardless\n openMenu();\n break;\n }\n\n case keyMap.ArrowDown: {\n if (isOpen) {\n // Prevent the page from scrolling\n event.preventDefault();\n // only change option if the menu is already open\n updateHighlightedOption('next');\n } else {\n openMenu();\n }\n break;\n }\n\n case keyMap.ArrowUp: {\n if (isOpen) {\n // Prevent the page from scrolling\n event.preventDefault();\n // only change option if the menu is already open\n updateHighlightedOption('prev');\n } else {\n openMenu();\n }\n break;\n }\n\n case keyMap.ArrowRight: {\n handleArrowKey('right', event);\n break;\n }\n\n case keyMap.ArrowLeft: {\n handleArrowKey('left', event);\n break;\n }\n\n default: {\n if (!isOpen) {\n openMenu();\n }\n }\n }\n }\n };\n\n /**\n *\n * Global Event Handler\n *\n */\n\n useBackdropClick(closeMenu, [menuRef, comboboxRef], isOpen);\n\n /**\n * Checks if multi-select and if there are chips selected. The left padding of the wrapper changes when there are chips selected so we use this to conditionally change the padding.\n */\n const isMultiselectWithSelections =\n isMultiselect(selection) && !!selection.length;\n\n /**\n * Function that calls the `checkScrollPosition` util to check the scroll position\n */\n const handleInputWrapperScroll = (e: UIEvent<HTMLDivElement>) => {\n setShouldShowOverflowShadow(checkScrollPosition(e.target as HTMLElement));\n };\n\n const debounceScroll = debounce(handleInputWrapperScroll, 50, {\n leading: true,\n });\n\n /**\n * Function called on scroll of the inputWrapperRef container\n */\n const handleOnScroll = useCallback(\n (e: React.UIEvent<HTMLDivElement>) => {\n if (overflow === Overflow.expandY) {\n debounceScroll(e);\n }\n },\n [debounceScroll, overflow],\n );\n\n /**\n * On load check if an overflow shadow should be visible\n */\n useEffect(() => {\n if (inputWrapperRef.current) {\n setShouldShowOverflowShadow(checkScrollPosition(inputWrapperRef.current));\n }\n }, []);\n\n const popoverProps = {\n popoverZIndex,\n ...(usePortal\n ? {\n usePortal,\n portalClassName,\n portalContainer,\n scrollContainer,\n }\n : { usePortal }),\n } as const;\n\n return (\n <LeafyGreenProvider darkMode={darkMode}>\n <ComboboxContext.Provider\n value={{\n multiselect,\n size,\n withIcons,\n disabled,\n isOpen,\n state,\n searchState,\n chipTruncationLocation,\n chipCharacterLimit,\n inputValue,\n overflow,\n popoverZIndex,\n }}\n >\n <div className={cx(comboboxParentStyle(size), className)} {...rest}>\n {(label || description) && (\n <div className={labelDescriptionContainerStyle}>\n {label && (\n <Label\n id={labelId}\n htmlFor={inputId}\n darkMode={darkMode}\n disabled={disabled}\n className={cx({\n [labelDescriptionLargeStyles]: size === ComboboxSize.Large,\n })}\n >\n {label}\n </Label>\n )}\n {description && (\n <Description\n darkMode={darkMode}\n disabled={disabled}\n className={cx({\n [labelDescriptionLargeStyles]: size === ComboboxSize.Large,\n })}\n >\n {description}\n </Description>\n )}\n </div>\n )}\n\n {/* Disable eslint: onClick sets focus. Key events would already have focus */}\n {/* eslint-disable-next-line jsx-a11y/click-events-have-key-events */}\n <div\n ref={comboboxRef}\n role=\"combobox\"\n aria-expanded={isOpen}\n aria-controls={menuId}\n aria-owns={menuId}\n tabIndex={-1}\n onMouseDown={handleInputWrapperMousedown}\n onClick={handleComboboxClick}\n onFocus={handleComboboxFocus}\n onKeyDown={handleKeyDown}\n onTransitionEnd={handleTransitionEnd}\n className={cx(\n baseComboboxStyles,\n comboboxThemeStyles[theme],\n comboboxSizeStyles(size, isMultiselectWithSelections),\n {\n [comboboxDisabledStyles[theme]]: disabled,\n [comboboxErrorStyles[theme]]: state === State.error,\n [comboboxFocusStyle[theme]]: isElementFocused(\n ComboboxElement.Input,\n ),\n [comboboxOverflowShadowStyles[theme]]: shouldShowOverflowShadow,\n },\n )}\n >\n <div\n onScroll={handleOnScroll}\n ref={inputWrapperRef}\n className={inputWrapperStyle({\n size,\n overflow,\n })}\n >\n {renderedChips}\n <input\n aria-label={ariaLabel ?? label}\n aria-autocomplete=\"list\"\n aria-controls={menuId}\n aria-labelledby={labelId}\n ref={inputRef}\n id={inputId}\n className={cx(\n baseInputElementStyle,\n inputElementSizeStyle(size),\n inputElementThemeStyle[theme],\n inputElementTransitionStyles(isOpen),\n {\n [multiselectInputElementStyle(size, inputValue)]:\n isMultiselect(selection),\n [inputElementDisabledThemeStyle[theme]]: disabled,\n },\n )}\n placeholder={placeholderValue}\n disabled={disabled ?? undefined}\n onChange={handleInputChange}\n value={inputValue}\n autoComplete=\"off\"\n />\n </div>\n <div\n className={cx(\n iconsWrapperBaseStyles,\n iconsWrapperSizeStyles[size],\n )}\n >\n {state === 'error' && (\n <Icon\n glyph=\"Warning\"\n fill={errorIconThemeStyles[theme]}\n className={endIconStyle}\n />\n )}\n {clearable && doesSelectionExist(selection) && !disabled && (\n <IconButton\n aria-label=\"Clear selection\"\n aria-disabled={disabled}\n disabled={disabled}\n ref={clearButtonRef}\n onClick={handleClearButtonClick}\n onFocus={handleClearButtonFocus}\n className={cx(clearButtonStyle)}\n darkMode={darkMode}\n >\n <Icon glyph=\"XWithCircle\" />\n </IconButton>\n )}\n <Icon\n glyph=\"CaretDown\"\n className={endIconStyle}\n fill={cx({\n [caretIconThemeStyles[theme]]: !disabled,\n [caretIconDisabledStyles[theme]]: disabled,\n })}\n />\n </div>\n </div>\n\n {state === 'error' && errorMessage && (\n <div\n className={cx(\n errorMessageThemeStyle[theme],\n errorMessageSizeStyle(size),\n )}\n >\n {errorMessage}\n </div>\n )}\n\n {/******* /\n * Menu *\n / *******/}\n\n <ComboboxMenu\n id={menuId}\n labelId={labelId}\n refEl={comboboxRef}\n ref={menuRef}\n menuWidth={menuWidth}\n searchLoadingMessage={searchLoadingMessage}\n searchErrorMessage={searchErrorMessage}\n searchEmptyMessage={searchEmptyMessage}\n {...popoverProps}\n >\n {renderedOptionsJSX}\n </ComboboxMenu>\n </div>\n </ComboboxContext.Provider>\n </LeafyGreenProvider>\n );\n\n // Closure-dependant utils\n\n /**\n * Scrolls the combobox to the far right if overflow === scroll-x\n * Scrolls the combobox to the bottom if overflow === expand-y\n */\n function scrollInputToEnd(overflow: Overflow) {\n if (inputWrapperRef && inputWrapperRef.current) {\n // TODO - consider converting to .scrollTo(). This is not yet supported in IE or jsdom\n if (overflow === Overflow.scrollX) {\n inputWrapperRef.current.scrollLeft =\n inputWrapperRef.current.scrollWidth;\n }\n\n if (overflow === Overflow.expandY) {\n inputWrapperRef.current.scrollTop =\n inputWrapperRef.current.scrollHeight;\n }\n }\n }\n\n /**\n * Returns the provided element as a ComboboxElement string\n */\n function getNameFromElement(\n element?: Element | null,\n ): ComboboxElement | undefined {\n if (!element) return;\n if (inputRef.current?.contains(element)) return ComboboxElement.Input;\n if (clearButtonRef.current?.contains(element))\n return ComboboxElement.ClearButton;\n\n const activeChipIndex = isMultiselect(selection)\n ? selection.findIndex(value =>\n getChipRef(value)?.current?.contains(element),\n )\n : -1;\n\n if (isMultiselect(selection)) {\n if (activeChipIndex === 0) return ComboboxElement.FirstChip;\n if (activeChipIndex === selection.length - 1)\n return ComboboxElement.LastChip;\n if (activeChipIndex > 0) return ComboboxElement.MiddleChip;\n }\n\n if (menuRef.current?.contains(element)) return ComboboxElement.Menu;\n if (comboboxRef.current?.contains(element)) return ComboboxElement.Combobox;\n }\n}\n\nCombobox.propTypes = {\n // Multiselect props\n multiselect: PropTypes.bool,\n value: PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.arrayOf(PropTypes.string),\n ]),\n initialValue: PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.arrayOf(PropTypes.string),\n ]),\n overflow: PropTypes.oneOf(Object.values(Overflow)),\n\n // Standard Props\n darkMode: PropTypes.bool,\n label: PropTypes.string,\n 'aria-label': PropTypes.string,\n children: PropTypes.node,\n onChange: PropTypes.func,\n chipCharacterLimit: PropTypes.number,\n chipTruncationLocation: PropTypes.oneOf(Object.values(TruncationLocation)),\n onClear: PropTypes.func,\n onFilter: PropTypes.func,\n clearable: PropTypes.bool,\n searchLoadingMessage: PropTypes.string,\n searchErrorMessage: PropTypes.string,\n searchEmptyMessage: PropTypes.string,\n searchState: PropTypes.oneOf(Object.values(SearchState)),\n errorMessage: PropTypes.string,\n state: PropTypes.oneOf(Object.values(State)),\n size: PropTypes.oneOf(Object.values(ComboboxSize)),\n disabled: PropTypes.bool,\n description: PropTypes.string,\n placeholder: PropTypes.string,\n filteredOptions: PropTypes.arrayOf(PropTypes.string),\n // Popover Props\n popoverZIndex: PropTypes.number,\n usePortal: PropTypes.bool,\n scrollContainer: PropTypes.elementType,\n portalContainer: PropTypes.elementType,\n portalClassName: PropTypes.string,\n};\n\n/**\n * Why'd you have to go and make things so complicated?\n * - Avril; and also me to myself about this component\n */\n","import { SelectValueType } from '../../types';\n\n/**\n * Returns whether a given value is included in, or equal to, the current selection\n * @param value the option value to check\n */\nexport const isValueCurrentSelection = (\n value: string,\n selection: SelectValueType<boolean> | null,\n): boolean => {\n return Array.isArray(selection)\n ? selection.includes(value)\n : value === selection;\n};\n"],"names":["ComboboxElement","ComboboxSize","XSmall","Small","Default","Large","Overflow","expandY","scrollX","expandX","State","none","error","SearchState","unset","loading","_lineHeight","_fontSize","_chipWrapperPaddingY","_templateObject","_templateObject2","_templateObject3","_templateObject4","_chipSizeStyles","_comboboxGroupStyle","_templateObject5","_comboboxGroupLabelTh","ComboboxContext","createContext","multiselect","size","withIcons","disabled","isOpen","state","searchState","overflow","chipClassName","createUniqueClassName","lineHeight","_defineProperty","typeScales","body1","body2","fontSize","chipWrapperPaddingY","chipSizeStyles","css","_taggedTemplateLiteral","chipTextClassName","ComboboxChip","React","forwardRef","_ref","forwardedRef","_chipRef$current","displayName","isFocused","onRemove","onFocus","_useContext","useContext","_useContext$chipTrunc","chipTruncationLocation","TruncationLocation","End","_useContext$chipChara","chipCharacterLimit","popoverZIndex","updatedChipTruncationLocation","None","chipRef","useForwardedRef","buttonRef","current","querySelector","useEffect","focus","createElement","Chip","label","className","cx","role","onClick","e","contains","target","onKeyDown","key","keyMap","Delete","Backspace","Enter","Space","onDismiss","baseFontSize","BaseFontSize","Body1","variant","Variant","Gray","ref","tabIndex","_menuItemPadding","_popoverThemeStyle","_templateObject6","_menuThemeStyle","_templateObject7","_templateObject8","_templateObject9","_templateObject10","_menuMessageThemeStyl","_templateObject11","_templateObject12","_templateObject13","comboboxGroupStyle","Theme","Light","spacing","Dark","comboboxGroupLabel","fontWeights","bold","comboboxGroupLabelThemeStyle","palette","gray","dark1","light1","InternalComboboxGroup","children","theme","useDarkMode","groupId","useIdAllocator","prefix","Children","count","id","Fragment","ComboboxGroup","_","Error","propTypes","PropTypes","string","node","isRequired","menuItemPadding","Size","x","y","getMenuItemHeight","popoverStyle","width","arguments","length","undefined","popoverThemeStyle","transparentize","black","light2","dark2","menuBaseStyle","fontFamilies","default","menuThemeStyle","white","dark3","menuList","menuMessageBaseStyle","menuMessageThemeStyle","light3","menuMessageSizeStyle","loadingIconAnimation","keyframes","loadingIconStyle","_excluded","ComboboxMenu","refEl","labelId","menuWidth","searchLoadingMessage","searchErrorMessage","searchEmptyMessage","popoverProps","_objectWithoutProperties","_useDarkMode","darkMode","availableSpace","useAvailableSpace","maxHeightValue","isUndefined","concat","Math","min","renderedMenuContents","useMemo","messageStyles","errorMessageStyles","Icon","glyph","color","blue","base","red","_typeof","Popover","_extends","active","align","justify","adjustOnMutation","onMouseDownCapture","preventDefault","_checkMarkSizeStyle","_iconThemeStyles","_iconHighlightedStyle","_templateObject14","_iconDisabledStyles","_templateObject15","_templateObject16","_checkMarkThemeStyles","_templateObject17","_templateObject18","_checkMarkDisabledSty","_templateObject19","_templateObject20","checkScrollPosition","element","scrollHeight","scrollTop","clientHeight","getNameAndValue","_ref2","valProp","value","nameProp","kebabCase","flattenChildren","_children","toArray","reduce","acc","child","isComponentType","_getNameAndValue","props","_child$props","_toConsumableArray","isDisabled","hasGlyph","getOptionObjectFromValue","options","find","opt","getDisplayNameForValue","_getOptionObjectFromV","_getOptionObjectFromV2","comboboxOptionSizeStyle","checkMarkSizeStyle","checkBoxBaseStyles","displayNameStyle","isSelected","regular","iconThemeStyles","iconHighlightedStyles","iconDisabledStyles","checkMarkThemeStyles","checkMarkDisabledStyles","multiselectIconPosition","leftGlyphClassName","multiselectIconLargePosition","InternalComboboxOption","_cx","setSelected","description","_ref$disabled","rest","inputValue","optionRef","optionTextId","handleOptionClick","useCallback","stopPropagation","_useMemo","isComponentGlyph","console","icon","cloneElement","_objectSpread","checkBox","Checkbox","checked","checkMark","leftGlyph","rightGlyph","getGlyphs","multiSelectWithoutIcons","InputOption","as","highlighted","InputOptionContent","str","wrap","cleanWrap","escapeRegExp","regex","RegExp","matches","matchAll","outArray","split","_i","_Array$from","Array","from","_match$index","match","matchIndex","index","matchContent","matchLength","replacement","fill","splice","apply","wrapJSX","ComboboxOption","bool","func","_wrapperHeight","_comboboxPadding","_comboboxThemeStyles","_comboboxDisabledStyl","_comboboxErrorStyles","_comboboxFocusStyle","_iconsWrapperSizeStyl","_templateObject21","_templateObject22","_inputElementThemeSty","_templateObject23","_templateObject24","_inputElementDisabled","_templateObject25","_templateObject26","_templateObject27","_templateObject28","_templateObject29","_templateObject30","_templateObject31","_errorMessageThemeSty","_templateObject32","_templateObject33","_templateObject34","_templateObject35","_templateObject36","_comboboxOverflowShad","_errorIconThemeStyles","_caretIconThemeStyles","_caretIconDisabledSty","doesSelectionExist","selection","isNull","isString","isArray","inputHeight","wrapperHeight","getYPadding","comboboxPadding","xLeftWithChip","xLeftWithoutChip","xRight","caretIconSize","comboboxParentStyle","baseComboboxStyles","transitionDuration","comboboxThemeStyles","dark4","comboboxSizeStyles","isMultiselectWithSelections","comboboxDisabledStyles","comboboxErrorStyles","comboboxFocusStyle","focusRing","input","iconsWrapperBaseStyles","iconsWrapperSizeStyles","inputWrapperStyle","baseWrapperStyle","baseInputElementStyle","inputElementThemeStyle","inputElementDisabledThemeStyle","inputElementSizeStyle","inputElementTransitionStyles","multiselectInputElementStyle","_inputValue$length","inputLength","clearButtonStyle","endIconStyle","errorMessageThemeStyle","errorMessageSizeStyle","labelDescriptionContainerStyle","labelDescriptionLargeStyles","large","comboboxOverflowShadowStyles","errorIconThemeStyles","caretIconThemeStyles","caretIconDisabledStyles","_excluded2","Combobox","_cx3","_cx4","_cx5","_ref$placeholder","placeholder","ariaLabel","_ref$size","darkModeProp","_ref$state","errorMessage","_ref$searchState","_ref$searchEmptyMessa","_ref$searchErrorMessa","_ref$searchLoadingMes","filteredOptions","onFilter","_ref$clearable","clearable","onClear","_ref$overflow","_ref$multiselect","initialValue","inputValueProp","onInputChange","onChange","_ref$chipCharacterLim","_ref$usePortal","usePortal","portalClassName","portalContainer","scrollContainer","getOptionRef","useDynamicRefs","getChipRef","inputId","menuId","comboboxRef","useRef","clearButtonRef","inputWrapperRef","inputRef","menuRef","_useState2","_slicedToArray","useState","setOpen","wasOpen","usePrevious","_useState4","highlightedOption","setHighlightedOption","_useState6","setSelection","prevSelection","_useState8","setInputValue","updateInputValue","newInputVal","prevValue","_useState10","focusedChip","setFocusedChip","_useState12","shouldShowOverflowShadow","setShouldShowOverflowShadow","placeholderValue","closeMenu","openMenu","allOptions","isMultiselect","val","consoleOnce","setInputFocus","cursorPos","setSelectionRange","updateSelection","newSelection","clone","multiselectOnChange","diff","diffType","includes","indexOf","push","_newSelection","singleSelectOnChange","isTextCurrentSelection","text","_options$find$value","_options$find","isValueCurrentSelection","shouldOptionBeVisible","option","toLowerCase","visibleOptions","filter","isValueValid","getIndexOfValue","findIndex","getValueAtIndex","getActiveChipIndex","_getChipRef","_getChipRef$current","document","activeElement","_useState14","focusedElementName","trackFocusedElement","updateHighlightedOption","direction","_visibleOptions$lengt","optionsCount","lastIndex","indexOfHighlight","newValue","_newValue","_newValue2","_newValue3","updateFocusedChip","relativeToIndex","referenceChipIndex","nextChipIndex","nextChipValue","_referenceChipIndex","prevChipIndex","prevChipValue","firstChipValue","lastChipValue","handleArrowKey","event","_inputRef$current","_inputRef$current2","_clearButtonRef$curre","selectionEnd","_inputRef$current3","_inputRef$current4","selectionStart","useAutoScroll","renderOption","_value","_className","_disabled","_rest","nestedChildren","map","renderedOptionsJSX","renderedChips","isLastChip","some","onCloseMenu","exactMatchedOption","_getDisplayNameForVal","onSelect","scrollInputToEnd","_getDisplayNameForVal2","_initialValue$filter","filteredValue","getNullSelection","isEqual","_useState16","setMenuWidth","_comboboxRef$current$","_comboboxRef$current","clientWidth","useBackdropClick","debounceScroll","debounce","leading","handleOnScroll","elementName","LeafyGreenProvider","Provider","Label","htmlFor","Description","onMouseDown","nativeEvent","offsetX","offsetLeft","_inputRef$current6","_clearButtonRef$curre2","_menuRef$current2","_comboboxRef$current4","activeChipIndex","_getChipRef2","_getChipRef2$current","getNameFromElement","_menuRef$current","_comboboxRef$current3","isFocusInMenu","ctrlKey","shiftKey","altKey","Tab","Escape","optionObj","isOptionDisabled","_inputRef$current5","ArrowDown","ArrowUp","ArrowRight","ArrowLeft","onTransitionEnd","_comboboxRef$current$2","_comboboxRef$current2","onScroll","autoComplete","IconButton","scrollLeft","scrollWidth","oneOfType","arrayOf","oneOf","Object","values","number","elementType"],"mappings":"43JAGO,IAAIA,GACF,QADEA,GAEI,cAFJA,GAGE,YAHFA,GAIC,WAJDA,GAKG,aALHA,GAMC,WANDA,GAOH,OAKGC,GAAe,CACxBC,OAAQ,SACRC,MAAO,QACPC,QAAS,UACTC,MAAO,SAKEC,GAAW,CAIpBC,QAAS,WAITC,QAAS,WAITC,QAAS,YAGAC,GAAQ,CACjBC,KAAM,OACNC,MAAO,SAGEC,GAAc,CACvBC,MAAO,QACPF,MAAO,QACPG,QAAS,WC7CJ,ICAHC,GAAaC,GAAWC,GAAsBC,GAAiBC,GAAkBC,GAAkBC,GAAkBC,GCArHJ,GAAiBC,GAAkBI,GAAqBH,GAAkBC,GAAkBG,GAAkBC,GFUvGC,GAA+BC,EAVd,CAC1BC,aAAa,EACbC,KAAM7B,GAAaG,QACnB2B,WAAW,EACXC,UAAU,EACVC,QAAQ,EACRC,MAAOxB,GAAMC,KACbwB,YAAatB,GAAYC,MACzBsB,SAAU9B,GAASC,UCFV8B,GAAgBC,EAAsB,iBAKtCC,IAAgCC,GAAlBxB,GAAc,CAAE,EAA+Bf,GAAaC,OAAQ,IAAKsC,GAAgBxB,GAAaf,GAAaE,MAAOsC,EAAWC,MAAMH,YAAaC,GAAgBxB,GAAaf,GAAaG,QAASqC,EAAWC,MAAMH,YAAaC,GAAgBxB,GAAaf,GAAaI,MAAOoC,EAAWE,MAAMJ,YAAavB,IAKtU4B,IAA4BJ,GAAhBvB,GAAY,GAA+BhB,GAAaC,OAAQuC,EAAWC,MAAME,UAAWJ,GAAgBvB,GAAWhB,GAAaE,MAAOsC,EAAWC,MAAME,UAAWJ,GAAgBvB,GAAWhB,GAAaG,QAASqC,EAAWC,MAAME,UAAWJ,GAAgBvB,GAAWhB,GAAaI,MAAOoC,EAAWE,MAAMC,UAAW3B,IAK3U4B,IAAkDL,GAA3BtB,GAAuB,CAAA,EAA0CjB,GAAaC,OAAQ,GAAIsC,GAAgBtB,GAAsBjB,GAAaE,MAAO,GAAIqC,GAAgBtB,GAAsBjB,GAAaG,QAAS,GAAIoC,GAAgBtB,GAAsBjB,GAAaI,MAAO,GAAIa,IAK7S4B,IAAwCN,GAAtBjB,GAAkB,CAAA,EAAqCtB,GAAaC,OAAQ6C,EAAI5B,KAAoBA,GAAkB6B,GAAuB,CAAC,oBAAqB,yBAA0B,eAAgB,4BAA6B,oBAAqBJ,GAAS3C,GAAaC,QAASqC,GAAWtC,GAAaC,QAAS+C,EAAmBJ,GAAoB5C,GAAaC,UAAWsC,GAAgBjB,GAAiBtB,GAAaE,MAAO4C,EAAI3B,KAAqBA,GAAmB4B,GAAuB,CAAC,oBAAqB,yBAA0B,eAAgB,4BAA6B,oBAAqBJ,GAAS3C,GAAaE,OAAQoC,GAAWtC,GAAaE,OAAQ8C,EAAmBJ,GAAoB5C,GAAaE,SAAUqC,GAAgBjB,GAAiBtB,GAAaG,QAAS2C,EAAI1B,KAAqBA,GAAmB2B,GAAuB,CAAC,oBAAqB,yBAA0B,eAAgB,4BAA6B,oBAAqBJ,GAAS3C,GAAaG,SAAUmC,GAAWtC,GAAaG,SAAU6C,EAAmBJ,GAAoB5C,GAAaG,WAAYoC,GAAgBjB,GAAiBtB,GAAaI,MAAO0C,EAAIzB,KAAqBA,GAAmB0B,GAAuB,CAAC,oBAAqB,yBAA0B,eAAgB,6DAA8D,oBAAqBJ,GAAS3C,GAAaI,OAAQkC,GAAWtC,GAAaI,OAAQ4C,EAAmBJ,GAAoB5C,GAAaI,SAAUkB,IEpB3+C2B,GAA4BC,EAAMC,YAAW,SAAUC,EAAMC,GACtE,IAAIC,EACAC,EAAcH,EAAKG,YACrBC,EAAYJ,EAAKI,UACjBC,EAAWL,EAAKK,SAChBC,EAAUN,EAAKM,QACbC,EAAcC,EAAWlC,IAC3BG,EAAO8B,EAAY9B,KACnBE,EAAW4B,EAAY5B,SACvBI,EAAWwB,EAAYxB,SACvB0B,EAAwBF,EAAYG,uBACpCA,OAAmD,IAA1BD,EAAmCE,EAAmBC,IAAMH,EACrFI,EAAwBN,EAAYO,mBACpCA,OAA+C,IAA1BD,EAAmC,GAAKA,EAC7DE,EAAgBR,EAAYQ,cAC1BC,EAAgCjC,IAAa9B,GAASE,QAAUwD,EAAmBM,KAAOP,EAC1FQ,EAAUC,EAAgBlB,EAAc,MACxCmB,EAAqD,QAAxClB,EAAmBgB,EAAQG,eAA0C,IAArBnB,OAA8B,EAASA,EAAiBoB,cAAc,UACvIC,GAAU,WACJnB,IAAczB,IAChByC,SAAsDA,EAAUI,QAEnE,GAAE,CAAC7C,EAAUyC,EAAWhB,IAiBzB,OAAoBN,EAAM2B,cAAcC,EAAM,CAC5CC,MAAOxB,EACPyB,UAAWC,EAAG7C,GAAeS,GAAehB,IAC5CqD,KAAM,SACN,gBAAiB1B,EACjB,cAAe,mBACf2B,QAjBoB,SAAyBC,GAEvCZ,SAA8CA,EAAUa,SAASD,EAAEE,SACvE5B,GAEN,EAaI6B,UAvBkB,SAAuBH,GACpCrD,GAAaqD,EAAEI,MAAQC,EAAOC,QAAUN,EAAEI,MAAQC,EAAOE,WAAaP,EAAEI,MAAQC,EAAOG,OAASR,EAAEI,MAAQC,EAAOI,OACpHpC,GAEN,EAoBIqC,UAbsB,WACjB/D,GACH0B,GAEN,EAUIsC,aAAcC,EAAaC,MAC3B/B,mBAAoBA,EACpBJ,uBAAwBM,EACxBD,cAAeA,EACf+B,QAASC,EAAQC,KACjBC,IAAK/B,EACLvC,SAAUA,EACVuE,UAAW,GAEf,IACArD,GAAaM,YAAc,eD3DpB,IELHgD,GAAkBrF,GAAiBC,GAAkBC,GAAkBoF,GAAoBnF,GAAkBG,GAAkBiF,GAAkBC,GAAiBC,GAAkBC,GAAkBC,GAAkBC,GAAmBC,GAAuBC,GAAmBC,GAAmBC,GFKjSC,IAAgD5E,GAA1BhB,GAAsB,GAAyC6F,EAAMC,MAAOvE,EAAI5B,KAAoBA,GAAkB6B,GAAuB,CAAC,sBAAuB,aAAcuE,EAAQ,KAAM/E,GAAgBhB,GAAqB6F,EAAMG,KAAMzE,EAAI3B,KAAqBA,GAAmB4B,GAAuB,CAAC,sBAAuB,aAAcuE,EAAQ,KAAM/F,IAC/XiG,GAAqB1E,EAAI1B,KAAqBA,GAAmB2B,GAAuB,CAAC,wKAAyK,iEAAkE0E,EAAYC,MAChVC,IAA4DpF,GAA5Bd,GAAwB,GAA2C2F,EAAMC,MAAOvE,EAAIzB,KAAqBA,GAAmB0B,GAAuB,CAAC,gBAAiB,WAAY6E,EAAQC,KAAKC,QAASvF,GAAgBd,GAAuB2F,EAAMG,KAAMzE,EAAItB,KAAqBA,GAAmBuB,GAAuB,CAAC,gBAAiB,WAAY6E,EAAQC,KAAKE,SAAUtG,IGAtZ,SAASuG,GAAsB5E,GACpC,IAAI2B,EAAQ3B,EAAK2B,MACfC,EAAY5B,EAAK4B,UACjBiD,EAAW7E,EAAK6E,SAEhBC,EADiBC,IACID,MACnBE,EAAUC,EAAe,CAC3BC,OAAQ,mBAGV,OADiBpF,EAAMqF,SAASC,MAAMP,GAClB,EAAiB/E,EAAM2B,cAAc,MAAO,CAC9DG,UAAWC,EAAGkC,GAAmBe,GAAQlD,IAC3B9B,EAAM2B,cAAc,MAAO,CACzCG,UAAWC,EAAGuC,GAAoBG,GAA6BO,IAC/DO,GAAIL,GACHrD,GAAqB7B,EAAM2B,cAAc,MAAO,CACjDK,KAAM,QACN,kBAAmBkD,GAClBH,IAA0B/E,EAAM2B,cAAc3B,EAAMwF,SAAU,KACnE,CAOO,SAASC,GAAcC,GAC5B,MAAMC,MAAM,2DACd,CARAF,GAAcpF,YAAc,gBAC5BoF,GAAcG,UAAY,CACxB9D,UAAW+D,EAAUC,OACrBf,SAAUc,EAAUE,KAAKC,WACzBnE,MAAOgE,EAAUC,OAAOE,YDvBnB,IENHhI,GFMOiI,IAA0C5G,GAAvBgE,GAAmB,CAAE,EAAoC6C,GAAKnJ,OAAQ,CAClGoJ,EAAG,GACHC,EAAG,IACD/G,GAAgBgE,GAAkB6C,GAAKlJ,MAAO,CAChDmJ,EAAG,GACHC,EAAG,IACD/G,GAAgBgE,GAAkB6C,GAAKjJ,QAAS,CAClDkJ,EAAG,GACHC,EAAG,IACD/G,GAAgBgE,GAAkB6C,GAAKhJ,MAAO,CAChDiJ,EAAG,GACHC,EAAG,IACD/C,IAGOgD,GAAoB,SAA2B1H,GACxD,OAAOS,GAAWT,GAAQ,EAAIsH,GAAgBtH,GAAMyH,CACtD,EAMWE,GAAe,WACxB,IAAIC,EAAQC,UAAUC,OAAS,QAAsBC,IAAjBF,UAAU,GAAmBA,UAAU,GAAK,IAChF,OAAO5G,EAAI5B,KAAoBA,GAAkB6B,GAAuB,CAAC,cAAe,8EAA+E0G,EACzK,EACWI,IAA8CtH,GAAzBiE,GAAqB,GAAwCY,EAAMC,MAAOvE,EAAI3B,KAAqBA,GAAmB4B,GAAuB,CAAC,iCAAkC,wBAAyB,WAAY+G,EAAe,IAAMlC,EAAQmC,OAAQnC,EAAQC,KAAKmC,SAAUzH,GAAgBiE,GAAoBY,EAAMG,KAAMzE,EAAI1B,KAAqBA,GAAmB2B,GAAuB,CAAC,iCAAkC,wBAAyB,WAAY+G,EAAe,IAAMlC,EAAQmC,OAAQnC,EAAQC,KAAKoC,QAASzD,IAC5hB0D,GAAgBpH,EAAIzB,KAAqBA,GAAmB0B,GAAuB,CAAC,qEAAsE,yBAA0B,qFAAsFuE,EAAQ,GAAI6C,EAAaC,SACnSC,IAAwC9H,GAAtBmE,GAAkB,CAAE,EAAmCU,EAAMC,MAAOvE,EAAItB,KAAqBA,GAAmBuB,GAAuB,CAAC,gBAAiB,4BAA6B,WAAY6E,EAAQmC,MAAOnC,EAAQ0C,QAAS/H,GAAgBmE,GAAiBU,EAAMG,KAAMzE,EAAI2D,KAAqBA,GAAmB1D,GAAuB,CAAC,gBAAiB,4BAA6B,WAAY6E,EAAQC,KAAKE,OAAQH,EAAQC,KAAK0C,QAAS7D,IAC1c8D,GAAW1H,EAAI6D,KAAqBA,GAAmB5D,GAAuB,CAAC,6DAC/E0H,GAAuB3H,EAAI8D,KAAqBA,GAAmB7D,GAAuB,CAAC,gGAC3F2H,IAAqDnI,GAA5BwE,GAAwB,GAA2CK,EAAMC,MAAOvE,EAAI+D,KAAqBA,GAAmB9D,GAAuB,CAAC,gBAAiB,WAAY6E,EAAQC,KAAK0C,QAAShI,GAAgBwE,GAAuBK,EAAMG,KAAMzE,EAAIgE,KAAsBA,GAAoB/D,GAAuB,CAAC,gBAAiB,WAAY6E,EAAQC,KAAK8C,SAAU5D,IAC7Y6D,GAAuB,SAA8B/I,GAC9D,OAAOiB,EAAIkE,KAAsBA,GAAoBjE,GAAuB,CAAC,kBAAmB,uBAAwB,mBAAoB,MAAO,WAAYJ,GAASd,GAAOS,GAAWT,GAAOsH,GAAgBtH,GAAMyH,EAAGH,GAAgBtH,GAAMwH,EAClP,EACIwB,GAAuBC,EAAU7D,KAAsBA,GAAoBlE,GAAuB,CAAC,mGAC5FgI,GAAmBjI,EAAIoE,KAAsBA,GAAoBnE,GAAuB,CAAC,kBAAmB,8BAA+B8H,IE1ClJG,GAAY,CAAC,WAAY,KAAM,QAAS,UAAW,YAAa,uBAAwB,qBAAsB,sBAYvGC,GAA4B/H,EAAMC,YAAW,SAAUC,EAAMC,GACtE,IAAI4E,EAAW7E,EAAK6E,SAClBQ,EAAKrF,EAAKqF,GACVyC,EAAQ9H,EAAK8H,MACbC,EAAU/H,EAAK+H,QACfC,EAAYhI,EAAKgI,UACjBC,EAAuBjI,EAAKiI,qBAC5BC,EAAqBlI,EAAKkI,mBAC1BC,EAAqBnI,EAAKmI,mBAC1BC,EAAeC,GAAyBrI,EAAM4H,IAC5CU,EAAevD,IACjBwD,EAAWD,EAAaC,SACxBzD,EAAQwD,EAAaxD,MACnBvE,EAAcC,EAAWlC,IAC3BK,EAAW4B,EAAY5B,SACvBF,EAAO8B,EAAY9B,KACnBG,EAAS2B,EAAY3B,OACrBE,EAAcyB,EAAYzB,YACxBmE,EAAM9B,EAAgBlB,EAAc,MAGpCuI,EAAiBC,EAAkBX,GACnCY,EAAkBC,EAAYH,GAAmE,QAAjD,GAAGI,OAAOC,KAAKC,IAAIN,EAAgB,KAAM,MAMzFO,EAAuBC,GAAQ,WACjC,IAAIC,EAAgBpH,EAAGwF,GAAsBC,GAAsBxC,GAAQ0C,GAAqB/I,IAC5FyK,EAAqBrH,EAAGwF,GAAsBG,GAAqB/I,IACvE,OAAQK,GACN,IAAK,UAED,OAAoBgB,EAAM2B,cAAc,OAAQ,CAC9CG,UAAWqH,GACGnJ,EAAM2B,cAAc0H,EAAM,CACxCC,MAAO,UACPC,MAAOd,EAAW/D,EAAQ8E,KAAK3E,OAASH,EAAQ8E,KAAKC,KACrD3H,UAAW+F,KACTM,GAER,IAAK,QAED,OAAoBnI,EAAM2B,cAAcgE,EAAO,CAC7C7D,UAAWsH,GACGpJ,EAAM2B,cAAc0H,EAAM,CACxCC,MAAO,UACPC,MAAOd,EAAW/D,EAAQgF,IAAI7E,OAASH,EAAQgF,IAAID,OACpCzJ,EAAM2B,cAAc,OAAQ,KAAMyG,IAGvD,QAEI,OAAIrD,GAAkC,WAAtB4E,GAAQ5E,IAA0B,WAAYA,GAAYA,EAAS0B,OAAS,EACtEzG,EAAM2B,cAAc,KAAM,CAC5CG,UAAWwF,IACVvC,GAEe/E,EAAM2B,cAAc,OAAQ,CAC9CG,UAAWqH,GACVd,GAGb,GAAK,CAACrD,EAAOrG,EAAMK,EAAayJ,EAAUN,EAAsBC,EAAoBrD,EAAUsD,IAC5F,OAAoBrI,EAAM2B,cAAciI,EAASC,GAAS,CACxDC,OAAQhL,IAAWD,EACnBuF,QAAS,EACT2F,MAAO,SACPC,QAAS,SACThC,MAAOA,EACPiC,kBAAkB,EAClBnI,UAAWC,EAAGuE,GAAa4B,GAAYvB,GAAkB3B,KACxDsD,GAA4BtI,EAAM2B,cAAc,MAAO,CACxDwB,IAAKA,EACLoC,GAAIA,EACJvD,KAAM,UACN,kBAAmBiG,EACnB,gBAAiBnJ,EACjBgD,UAAWC,EAAGiF,GAAeG,GAAenC,GAAQpF,EAAI5B,KAAoBA,GAAkB6B,GAAuB,CAAC,+BAAgC,qBAAsB+I,IAC5KsB,mBAAoB,SAA4BhI,GAC9C,OAAOA,EAAEiI,gBACV,GACAlB,GACL,IACAlB,GAAa1H,YAAc,eC9FpB,ICNHrC,GAAiBC,GAAkBC,GAAkBC,GAAkBG,GAAkB8L,GAAqB7G,GAAkBE,GAAkBC,GAAkBC,GAAkBC,GAAmByG,GAAkBvG,GAAmBC,GAAmBuG,GAAuBtG,GAAmBuG,GAAmBC,GAAqBC,GAAmBC,GAAmBC,GAAuBC,GAAmBC,GAAmBC,GAAuBC,GAAmBC,GDMzdC,GAAsB,SAA6BC,GAC5D,IAAIC,EAAeD,EAAQC,aAO3B,OANcD,EAAQE,UAGED,EAFPD,EAAQG,YAS3B,EEVWC,GAAkB,SAAyBpL,GACpD,IAAIqL,EACAC,EAAUtL,EAAKuL,MACjBC,EAAWxL,EAAKG,YAClB,MAAO,CACLoL,MAAOD,QAAyCA,EAAUG,GAAUD,GACpErL,YAAyF,QAA3EkL,EAAQG,QAA2CA,EAAWF,SAA+B,IAAVD,EAAmBA,EAAQ,GAEhI,ECLWK,GAAkB,SAASA,EAAgBC,GAGpD,OAAO7L,EAAMqF,SAASyG,QAAQD,GAAWE,QAEzC,SAAUC,EAAKC,GACb,GAAIC,EAAgBD,EAAO,kBAAmB,CAC5C,IAAIE,EAAmBb,GAAgBW,EAAMG,OAC3CX,EAAQU,EAAiBV,MACzBpL,EAAc8L,EAAiB9L,YAC7BgM,EAAeJ,EAAMG,MACvB9C,EAAQ+C,EAAa/C,MACrBzK,EAAWwN,EAAaxN,SAC1B,MAAO,GAAGiK,OAAOwD,GAAmBN,GAAM,CAAC,CACzCP,MAAOA,EACPpL,YAAaA,EACbkM,aAAc1N,EACd2N,WAAYlD,IAEf,CAAM,GAAI4C,EAAgBD,EAAO,iBAAkB,CAClD,IAAIlH,EAAWkH,EAAMG,MAAMrH,SAC3B,GAAIA,EACF,MAAO,GAAG+D,OAAOwD,GAAmBN,GAAMM,GAAmBV,EAAgB7G,IAEhF,CACF,GAAE,GACL,ECjCW0H,GAA2B,SAAkChB,EAAOiB,GAC7E,GAAIjB,EAAO,OAAOiB,EAAQC,MAAK,SAAUC,GACvC,OAAOA,EAAInB,QAAUA,CACzB,GACA,EAQWoB,GAAyB,SAAgCpB,EAAOiB,GACzE,IAAII,EAAuBC,EAC3B,OAAOtB,EAAsM,QAA7LqB,EAAgG,QAAvEC,EAAyBN,GAAyBhB,EAAOiB,UAAiD,IAA3BK,OAAoC,EAASA,EAAuB1M,mBAAmD,IAA1ByM,EAAmCA,EAAwBrB,EAAQ,EAC1R,EHLWuB,GAA0B,SAAiCrO,GACpE,OAAOiB,EAAI5B,KAAoBA,GAAkB6B,GAAuB,CAAC,kBAAmB,uBAAwB,sBAAuB,mBAAoB,MAAO,eAAgB,wCAAyC,gBAAiBJ,GAASd,GAAOS,GAAWT,GAAO0H,GAAkB1H,GAAOsH,GAAgBtH,GAAMyH,EAAGH,GAAgBtH,GAAMwH,EAAG/B,EAAQ,GAAIiC,GAAkB1H,GAC7X,EACWsO,IAAgD5N,GAA1B+K,GAAsB,CAAE,EAAuCtN,GAAaC,OAAQ6C,EAAI3B,KAAqBA,GAAmB4B,GAAuB,CAAC,oBAAqB,aAAcuE,EAAQ,KAAM/E,GAAgB+K,GAAqBtN,GAAaE,MAAO4C,EAAI1B,KAAqBA,GAAmB2B,GAAuB,CAAC,oBAAqB,aAAcuE,EAAQ,KAAM/E,GAAgB+K,GAAqBtN,GAAaG,QAAS2C,EAAIzB,KAAqBA,GAAmB0B,GAAuB,CAAC,oBAAqB,aAAcuE,EAAQ,KAAM/E,GAAgB+K,GAAqBtN,GAAaI,MAAO0C,EAAItB,KAAqBA,GAAmBuB,GAAuB,CAAC,oBAAqB,aAAcuE,EAAQ,KAAMgG,IAC3uB8C,GAAqBtN,EAAI2D,KAAqBA,GAAmB1D,GAAuB,CAAC,sGACvED,EAAI6D,KAAqBA,GAAmB5D,GAAuB,CAAC,kCAC1F,IAAIsN,GAAmB,SAA0BC,GACtD,OAAOxN,EAAI8D,KAAqBA,GAAmB7D,GAAuB,CAAC,oBAAqB,SAAUuN,EAAa7I,EAAYC,KAAOD,EAAY8I,QACxJ,EACWC,IAA0CjO,GAAvBgL,GAAmB,GAAsCnG,EAAMC,MAAOvE,EAAI+D,KAAqBA,GAAmB9D,GAAuB,CAAC,gBAAiB,WAAY6E,EAAQC,KAAKC,QAASvF,GAAgBgL,GAAkBnG,EAAMG,KAAMzE,EAAIgE,KAAsBA,GAAoB/D,GAAuB,CAAC,gBAAiB,WAAY6E,EAAQC,KAAK8E,OAAQY,IACtXkD,IAAqDlO,GAA5BiL,GAAwB,GAA2CpG,EAAMC,MAAOvE,EAAIkE,KAAsBA,GAAoBjE,GAAuB,CAAC,gBAAiB,WAAY6E,EAAQ8E,KAAK5E,QAASvF,GAAgBiL,GAAuBpG,EAAMG,KAAMzE,EAAImE,KAAsBA,GAAoBlE,GAAuB,CAAC,gBAAiB,WAAY6E,EAAQ8E,KAAK/B,SAAU6C,IAC/YkD,IAAgDnO,GAA1BmL,GAAsB,GAAyCtG,EAAMC,MAAOvE,EAAIoE,KAAsBA,GAAoBnE,GAAuB,CAAC,gBAAiB,WAAY6E,EAAQC,KAAKE,SAAUxF,GAAgBmL,GAAqBtG,EAAMG,KAAMzE,EAAI2K,KAAsBA,GAAoB1K,GAAuB,CAAC,gBAAiB,WAAY6E,EAAQC,KAAKC,QAAS4F,IACtYiD,IAAoDpO,GAA5BsL,GAAwB,GAA2CzG,EAAMC,MAAOvE,EAAI6K,KAAsBA,GAAoB5K,GAAuB,CAAC,gBAAiB,WAAY6E,EAAQ8E,KAAKC,OAAQpK,GAAgBsL,GAAuBzG,EAAMG,KAAMzE,EAAI8K,KAAsBA,GAAoB7K,GAAuB,CAAC,gBAAiB,WAAY6E,EAAQ8E,KAAK3E,SAAU8F,IAC7Y+C,IAAuDrO,GAA5ByL,GAAwB,GAA2C5G,EAAMC,MAAOvE,EAAIgL,KAAsBA,GAAoB/K,GAAuB,CAAC,gBAAiB,WAAY6E,EAAQC,KAAKE,SAAUxF,GAAgByL,GAAuB5G,EAAMG,KAAMzE,EAAIiL,KAAsBA,GAAoBhL,GAAuB,CAAC,gBAAiB,WAAY6E,EAAQC,KAAKC,QAASkG,IACjZ6C,GAA0B/N,EAAImL,KAAsBA,GAAoBlL,GAAuB,CAAC,QAAS,0CAA2C+N,GACpJC,GAA+BjO,EAAIoL,KAAsBA,GAAoBnL,GAAuB,CAAC,QAAS,kCAAmC+N,GI5BxJ9F,GAAY,CAAC,QAAS,aAAc,cAAe,YAAa,cAAe,YAAa,cAAe,QAAS,UAAW,YAmBxHgG,GAAsC9N,EAAMC,YAAW,SAAUC,EAAMC,GAChF,IAAI4N,EACAzE,EAAQpJ,EAAKoJ,MACf8D,EAAalN,EAAKkN,WAClB/M,EAAcH,EAAKG,YACnBC,EAAYJ,EAAKI,UACjB0N,EAAc9N,EAAK8N,YACnBlM,EAAY5B,EAAK4B,UACjBmM,EAAc/N,EAAK+N,YACnBxC,EAAQvL,EAAKuL,MACbxJ,EAAU/B,EAAK+B,QACfiM,EAAgBhO,EAAKrB,SACrBA,OAA6B,IAAlBqP,GAAmCA,EAC9CC,EAAO5F,GAAyBrI,EAAM4H,IACpCU,EAAevD,IACjBwD,EAAWD,EAAaC,SACxBzD,EAAQwD,EAAaxD,MACnBvE,EAAcC,EAAWlC,IAC3BE,EAAc+B,EAAY/B,YAC1BC,EAAO8B,EAAY9B,KACnBC,EAAY6B,EAAY7B,UACxBwP,EAAa3N,EAAY2N,WACvBC,EAAYhN,EAAgBlB,EAAc,MAC1CmO,EAAenJ,EAAe,CAChCC,OAAQ,yBAENmJ,EAAoBC,GAAY,SAAUtM,GAI5CA,EAAEuM,kBACG5P,IACHmP,IACA/L,SAAkDA,EAAQC,EAAGuJ,GAEhE,GAAE,CAAC5M,EAAUoD,EAAS+L,EAAavC,IAChCiD,EAAWxF,GAAQ,WACnB,OChDiB,SAAmBhJ,GACxC,IAAI6N,EACAnP,EAAYsB,EAAKtB,UACnBwO,EAAalN,EAAKkN,WAClB9D,EAAQpJ,EAAKoJ,MACbgF,EAAepO,EAAKoO,aACpBzP,EAAWqB,EAAKrB,SAChB4J,EAAWvI,EAAKuI,SAChB9J,EAAOuB,EAAKvB,KACZD,EAAcwB,EAAKxB,YACnBsG,EAAQ9E,EAAK8E,MACb1E,EAAYJ,EAAKI,UACfgJ,IAAUqF,EAAiBrF,IAC7BsF,QAAQnR,MAAM,yFAA0F6L,GAE1G,IAAIuF,EAAOvF,GAASqF,EAAiBrF,GAAsBtJ,EAAM8O,aAAaxF,EAAOyF,GAAcA,GAAc,CAAE,EAAEzF,EAAM8C,OAAQ,CAAA,EAAI,CACrItK,UAAWC,EAAGuL,GAAgBtI,IAAS+I,EAAM,CAAE,EAAE1O,GAAgB0O,EAAKR,GAAsBvI,GAAQ1E,GAAYjB,GAAgB0O,EAAKP,GAAmBxI,GAAQnG,GAAWkP,GAAMzE,EAAM8C,MAAMtK,cAC5K9B,EAAM2B,cAAc3B,EAAMwF,SAAU,MACnDwJ,EAAwBhP,EAAM2B,cAAcsN,GAAU,CACxD,kBAAmBX,EACnBY,QAAS9B,EACThK,UAAW,EACXvE,SAAUA,EACV4J,SAAUA,EACV3G,UAAWoL,KAETiC,EAAyBnP,EAAM2B,cAAc0H,EAAM,CACrDC,MAAO,YACPxH,UAAWC,EAAGkL,GAAmBtO,GAAO8O,GAAqBzI,GAAQ3F,GAAgB,CAAA,EAAIqO,GAAwB1I,GAAQnG,MAQ3H,MAAO,CACLuQ,UAHc1Q,EAJWE,EAAYiQ,EAAOG,EAElBpQ,EAAYiQ,EAAOzB,EAAa+B,EAAY,KAMtEE,WAHe3Q,EAJWE,GAAaoQ,EAEZpQ,GAAawO,GAAc+B,EAO1D,CDQaG,CAAU,CACf1Q,UAAWA,EACXwO,WAAYA,EACZ9D,MAAOA,EACPtE,MAAOA,EACPyD,SAAUA,EACV9J,KAAMA,EACNE,SAAUA,EACVH,YAAaA,EACb4P,aAAcA,EACdhO,UAAWA,GAEd,GAAE,CAACmI,EAAU5J,EAAUyK,EAAO8D,EAAY1O,EAAa4P,EAAc3P,EAAMqG,EAAOpG,EAAW0B,IAC9F8O,EAAYV,EAASU,UACrBC,EAAaX,EAASW,WAGpBE,EAA0B7Q,IAAgBE,EAC9C,OAAoBoB,EAAM2B,cAAc6N,GAAa3F,GAAS,CAAA,EAAIsE,EAAM,CACtEsB,GAAI,KACJtM,IAAKkL,EACLqB,YAAapP,EACbzB,SAAUA,EACV,aAAcwB,EACdoI,SAAUA,EACV3G,UAAWC,EAAGiL,GAAwBrO,IAAQoP,EAAM,GAAI1O,GAAgB0O,EAAKJ,GAAyB4B,GAA0BlQ,GAAgB0O,EAAKF,GAA8B0B,GAA2B5Q,IAAS7B,GAAaI,OAAQ6Q,GAAMjM,GAClPG,QAASsM,EACTlM,UAAWkM,IACIvO,EAAM2B,cAAcgO,GAAoB,CACvDP,UAAWA,EACXC,WAAYA,EACZpB,YAAaA,GACCjO,EAAM2B,cAAc,OAAQ,CAC1C4D,GAAI+I,EACJxM,UAAWqL,GAAiBC,IE7EX,SAAiBwC,EAAKC,EAAM3E,GAC/C,GAAI2E,GAAQ3E,EAAS,CACnB,IAAI4E,EAAYC,GAAaF,GACzBG,EAAQ,IAAIC,OAAOH,EAAW,MAC9BI,EAAUN,EAAIO,SAASH,GAC3B,GAAIE,EAAS,CAQX,IAPA,IAAIE,EAAWR,EAAIS,MAAM,IAOhBC,EAAK,EAAGC,EAAcC,MAAMC,KAAKP,GAAUI,EAAKC,EAAY9J,OAAQ6J,IAAM,CACjF,IAAII,EACAC,EAAQJ,EAAYD,GACpBM,EAA8C,QAAhCF,EAAeC,EAAME,aAAoC,IAAjBH,EAA0BA,GAAgB,EAChGI,EAAeH,EAAM,GACrBI,EAAcD,EAAarK,OAC3BnE,EAAMsO,EAAaE,EAAeC,EAMlCC,EAAc,IAAIR,MAAMO,GAAaE,KAAK,IAC9CD,EAAY,GAAkBhR,EAAM2B,cAAcuJ,EAAS,CACzD5I,IAAKA,GACJwO,GACHV,EAASc,OAAOC,MAAMf,EAAU,CAACQ,EAAYG,GAAajI,OAAOwD,GAAmB0E,IACrF,CACD,OAAoBhR,EAAM2B,cAAc3B,EAAMwF,SAAU,KAAM4K,EAC/D,CACD,OAAoBpQ,EAAM2B,cAAc3B,EAAMwF,SAAU,KAAMoK,EAC/D,CACD,OAAoB5P,EAAM2B,cAAc3B,EAAMwF,SAAU,KAAMoK,EAChE,CF0CKwB,CAAQ/Q,EAAa+N,EAAY,YACtC,IAEO,SAASiD,GAAe3L,GAC7B,MAAMC,MAAM,4DACd,CAHAmI,GAAuBzN,YAAc,iBAIrCgR,GAAehR,YAAc,iBAC7BgR,GAAezL,UAAY,CACzBvF,YAAawF,EAAUC,OACvB2F,MAAO5F,EAAUC,OACjBwD,MAAOzD,EAAUE,KACjBlH,SAAUgH,EAAUyL,KACpBxP,UAAW+D,EAAUC,OACrBmI,YAAapI,EAAUC,OACvB7D,QAAS4D,EAAU0L,MGxGd,ICFHC,GAAgBC,GAAkBzT,GAAiBC,GAAkBC,GAAkBC,GAAkBuT,GAAsBpT,GAAkBiF,GAAkBE,GAAkBkO,GAAuBjO,GAAkBC,GAAkBiO,GAAsBhO,GAAmBE,GAAmB+N,GAAqB9N,GAAmBC,GAAmBuG,GAAmBE,GAAmBC,GAAmBoH,GAAuBlH,GAAmBC,GAAmBE,GAAmBC,GAAmB+G,GAAmBC,GAAmBC,GAAuBC,GAAmBC,GAAmBC,GAAuBC,GAAmBC,GAAmBC,GAAmBC,GAAmBC,GAAmBC,GAAmBC,GAAmBC,GAAuBC,GAAmBC,GAAmBC,GAAmBC,GAAmBC,GAAmBC,GAAuBC,GAAuBC,GAAuBC,GDEt7BC,GAAqB,SAA4BC,GAC1D,OAAQ1K,EAAY0K,KAAeC,EAAOD,KAAeE,EAASF,IAAcG,EAAQH,IAAcA,EAAU9M,OAAS,EAC3H,ECUIkN,GAAc,SAAqBhV,GACrC,OAAOS,GAAWT,GAAQ,EAAIe,GAAoBf,EACpD,EAQWiV,IAAsCvU,GAArBmS,GAAiB,CAAA,EAAoCtL,GAAKnJ,OAAQ,IAAKsC,GAAgBmS,GAAgBtL,GAAKlJ,MAAO,IAAKqC,GAAgBmS,GAAgBtL,GAAKjJ,QAAS,IAAKoC,GAAgBmS,GAAgBtL,GAAKhJ,MAAO,IAAKsU,IAMpPqC,GAAc,SAAqBlV,GACrC,OAAQiV,GAAcjV,GAAQgV,GAAYhV,GAAQ,GAAK,CACzD,EAMWmV,IAA0CzU,GAAvBoS,GAAmB,CAAE,EAAoCvL,GAAKnJ,OAAQ,CAClGqJ,EAAGyN,GAAY3N,GAAKnJ,QACpBgX,cAAe,EACfC,iBAAkB,GAClBC,OAAQ,IACN5U,GAAgBoS,GAAkBvL,GAAKlJ,MAAO,CAChDoJ,EAAGyN,GAAY3N,GAAKlJ,OACpB+W,cAAe,EACfC,iBAAkB,GAClBC,OAAQ,IACN5U,GAAgBoS,GAAkBvL,GAAKjJ,QAAS,CAClDmJ,EAAGyN,GAAY3N,GAAKjJ,SACpB8W,cAAe,EACfC,iBAAkB,GAClBC,OAAQ,KACN5U,GAAgBoS,GAAkBvL,GAAKhJ,MAAO,CAChDkJ,EAAGyN,GAAY3N,GAAKhJ,OACpB6W,cAAe3P,EAAQ,GAAK,EAC5B4P,iBAAkB5P,EAAQ,GAAK,EAC/B6P,OAAQ7P,EAAQ,GAAK,IACnBqN,IAMOyC,GAAgB9P,EAAQ,GACxB+P,GAAsB,SAA6BxV,GAC5D,OAAOiB,EAAI5B,KAAoBA,GAAkB6B,GAAuB,CAAC,sBAAuB,uCAAwC,aAAcoH,EAAaC,QAASzH,GAASd,GAAQ,EAAImV,GAAgBnV,GAAMoV,cAAgBG,GAAgB,EACzP,EACWE,GAAqBxU,EAAI3B,KAAqBA,GAAmB4B,GAAuB,CAAC,sDAAuD,uCAAwC,geAAie,6DAA8DuE,EAAQ,GAAIiQ,EAAmBnN,QAASmN,EAAmBnN,SAClxBoN,IAAkDjV,GAA3BqS,GAAuB,GAA0CxN,EAAMC,MAAOvE,EAAI1B,KAAqBA,GAAmB2B,GAAuB,CAAC,gBAAiB,4BAA6B,wBAAyB,WAAY6E,EAAQC,KAAK0C,MAAO3C,EAAQ0C,MAAO1C,EAAQC,KAAK8E,OAAQpK,GAAgBqS,GAAsBxN,EAAMG,KAAMzE,EAAIzB,KAAqBA,GAAmB0B,GAAuB,CAAC,gBAAiB,4BAA6B,wBAAyB,WAAY6E,EAAQC,KAAKmC,OAAQpC,EAAQC,KAAK4P,MAAO7P,EAAQC,KAAK8E,OAAQiI,IAC3jB8C,GAAqB,SAA4B7V,EAAM8V,GAChE,OAAO7U,EAAItB,KAAqBA,GAAmBuB,GAAuB,CAAC,oBAAqB,0BAA2B,wBAAyB,uBAAwB,WAAYiU,GAAgBnV,GAAMyH,EAAG0N,GAAgBnV,GAAMyH,EAAiC,GAAG0C,OAAjC2L,EAAwCX,GAAgBnV,GAAMoV,cAAiCD,GAAgBnV,GAAMqV,iBAAxC,MAAiEF,GAAgBnV,GAAMsV,OAChZ,EACWS,IAAsDrV,GAA5BsS,GAAwB,GAA2CzN,EAAMC,MAAOvE,EAAI2D,KAAqBA,GAAmB1D,GAAuB,CAAC,0CAA2C,4BAA6B,wBAAyB,WAAY6E,EAAQC,KAAKC,MAAOF,EAAQC,KAAKmC,OAAQpC,EAAQC,KAAKE,SAAUxF,GAAgBsS,GAAuBzN,EAAMG,KAAMzE,EAAI6D,KAAqBA,GAAmB5D,GAAuB,CAAC,0CAA2C,4BAA6B,wBAAyB,WAAY6E,EAAQC,KAAKC,MAAOF,EAAQC,KAAK0C,MAAO3C,EAAQC,KAAKoC,QAAS4K,IAC7nBgD,IAAkDtV,GAA3BuS,GAAuB,GAA0C1N,EAAMC,MAAOvE,EAAI8D,KAAqBA,GAAmB7D,GAAuB,CAAC,uBAAwB,WAAY6E,EAAQgF,IAAID,OAAQpK,GAAgBuS,GAAsB1N,EAAMG,KAAMzE,EAAI+D,KAAqBA,GAAmB9D,GAAuB,CAAC,uBAAwB,WAAY6E,EAAQgF,IAAI7E,SAAU+M,IACjZgD,IAAgDvV,GAA1BwS,GAAsB,CAAA,EAAyC3N,EAAMC,MAAOvE,EAAIgE,KAAsBA,GAAoB/D,GAAuB,CAAC,+EAAgF,kBAAmBgV,EAAU3Q,EAAMC,OAAO2Q,QAASzV,GAAgBwS,GAAqB3N,EAAMG,KAAMzE,EAAIkE,KAAsBA,GAAoBjE,GAAuB,CAAC,+EAAgF,kBAAmBgV,EAAU3Q,EAAMG,MAAMyQ,QAASjD,IACpiBkD,GAAyBnV,EAAImE,KAAsBA,GAAoBlE,GAAuB,CAAC,mDAC/FmV,IAAsD3V,GAA5ByS,GAAwB,CAAE,EAAyC5L,GAAKnJ,OAAQ6C,EAAIoE,KAAsBA,GAAoBnE,GAAuB,CAAC,cAAe,aAAcuE,EAAQ,KAAM/E,GAAgByS,GAAuB5L,GAAKlJ,MAAO4C,EAAI2K,KAAsBA,GAAoB1K,GAAuB,CAAC,cAAe,aAAcuE,EAAQ,KAAM/E,GAAgByS,GAAuB5L,GAAKjJ,QAAS2C,EAAI6K,KAAsBA,GAAoB5K,GAAuB,CAAC,cAAe,aAAcuE,EAAQ,KAAM/E,GAAgByS,GAAuB5L,GAAKhJ,MAAO0C,EAAI8K,KAAsBA,GAAoB7K,GAAuB,CAAC,cAAe,aAAcuE,EAAQ,KAAM0N,IACzsBmD,GAAoB,SAA2B/U,GACxD,IAAIjB,EAAWiB,EAAKjB,SAClBN,EAAOuB,EAAKvB,KACVuW,EAAmBtV,EAAIgL,KAAsBA,GAAoB/K,GAAuB,CAAC,gDAC7F,OAAQZ,GACN,KAAK9B,GAASE,QAEV,OAAOuC,EAAIiL,KAAsBA,GAAoBhL,GAAuB,CAAC,aAAc,8CAA+C,oPAAqP,qNAAsNqV,EAAkBvB,GAAYhV,GAAOO,IAI9nB,KAAK/B,GAASC,QAEV,OAAOwC,EAAImL,KAAsBA,GAAoBlL,GAAuB,CAAC,aAAc,oEAAqE,yDAA0D,kCAAmC,UAAW,uBAAwBqV,EAxE1R,EAwEqTvB,GAAYhV,GAA2B,EAApBgV,GAAYhV,GAxEpV,GA2Ed,EACWwW,GAAwBvV,EAAIoL,KAAsBA,GAAoBnL,GAAuB,CAAC,oBAAqB,gTAAiT,4GAA6GoH,EAAaC,QAAS9C,EAAQ,IAC/iBgR,IAAsD/V,GAA5B4S,GAAwB,GAA2C/N,EAAMC,MAAOvE,EAAImS,KAAsBA,GAAoBlS,GAAuB,CAAC,wCAAyC,kBAAmB6E,EAAQC,KAAKC,QAASvF,GAAgB4S,GAAuB/N,EAAMG,KAAMzE,EAAIoS,KAAsBA,GAAoBnS,GAAuB,CAAC,wCAAyC,kBAAmB6E,EAAQC,KAAKE,SAAUoN,IAC9coD,IAA8DhW,GAA5B+S,GAAwB,GAA2ClO,EAAMC,MAAOvE,EAAIsS,KAAsBA,GAAoBrS,GAAuB,CAAC,wCAAyC,kBAAmB6E,EAAQC,KAAKC,QAASvF,GAAgB+S,GAAuBlO,EAAMG,KAAMzE,EAAIuS,KAAsBA,GAAoBtS,GAAuB,CAAC,wCAAyC,kBAAmB6E,EAAQC,KAAKC,QAASwN,IACrdkD,GAAwB,SAA+B3W,GAChE,OAAOiB,EAAIyS,KAAsBA,GAAoBxS,GAAuB,CAAC,eAAgB,qBAAsB,uBAAwB,qBAAsB,WAAY8T,GAAYhV,GAAOc,GAASd,GAAOS,GAAWT,GAAOc,GAASd,GAC7O,EACW4W,GAA+B,SAAsCzW,GAC9E,OAAOc,EAAI0S,KAAsBA,GAAoBzS,GAAuB,CAAC,4JAA6J,OAAQ,CAAC,gKAAiK,SAAUf,EAAS,KAAO,QAChb,EAIW0W,GAA+B,SAAsC7W,EAAMyP,GACpF,IAAIqH,EACAC,EAAmH,QAApGD,EAAqBrH,aAA+C,EAASA,EAAW3H,cAA2C,IAAvBgP,EAAgCA,EAAqB,EACpL,OAAO7V,EAAI2S,KAAsBA,GAAoB1S,GAAuB,CAAC,gBAAiB,mCAAoC6V,EAAcjW,GAASd,GAC3J,EACWgX,GAAmB/V,EAAI4S,KAAsBA,GAAoB3S,GAAuB,CAAC,iHAAkH,2CAA4CqU,GAAgB,GACvQ0B,GAAehW,EAAI6S,KAAsBA,GAAoB5S,GAAuB,CAAC,eAAgB,iBAAkB,WAAYqU,GAAeA,IAClJ2B,IAAsDxW,GAA5BuT,GAAwB,GAA2C1O,EAAMC,MAAOvE,EAAI8S,KAAsBA,GAAoB7S,GAAuB,CAAC,gBAAiB,WAAY6E,EAAQgF,IAAID,OAAQpK,GAAgBuT,GAAuB1O,EAAMG,KAAMzE,EAAI+S,KAAsBA,GAAoB9S,GAAuB,CAAC,gBAAiB,WAAY6E,EAAQgF,IAAI7E,SAAU+N,IAC7YkD,GAAwB,SAA+BnX,GAChE,OAAOiB,EAAIiT,KAAsBA,GAAoBhT,GAAuB,CAAC,kBAAmB,uBAAwB,uBAAwB,WAAYJ,GAASd,GAAOS,GAAWT,GAAOmV,GAAgBnV,GAAMyH,EACtN,EACW2P,GAAiCnW,EAAIkT,KAAsBA,GAAoBjT,GAAuB,CAAC,sBAAuB,wDAAyDuE,EAAQ,IAC/L4R,GAA8BpW,EAAImT,KAAsBA,GAAoBlT,GAAuB,CAAC,kBAAmB,uBAAwB,WAAYP,EAAW2W,MAAMxW,SAAUH,EAAW2W,MAAM7W,YACvM8W,IAA4D7W,GAA5B6T,GAAwB,CAAE,EAAyChP,EAAMC,MAAOvE,EAAIoT,KAAsBA,GAAoBnT,GAAuB,CAAC,sDAAuD,kBAAmB+G,EAAe,IAAMlC,EAAQmC,SAAUxH,GAAgB6T,GAAuBhP,EAAMG,KAAMzE,EAAIqT,KAAsBA,GAAoBpT,GAAuB,CAAC,4GAA6GqT,IAC7gBiD,IAAoD9W,GAA5B8T,GAAwB,CAAA,EAA2CjP,EAAMC,MAAOO,EAAQgF,IAAID,MAAOpK,GAAgB8T,GAAuBjP,EAAMG,KAAMK,EAAQgF,IAAI7E,QAASsO,IACnMiD,IAAoD/W,GAA5B+T,GAAwB,CAAA,EAA2ClP,EAAMC,MAAOO,EAAQC,KAAKoC,OAAQ1H,GAAgB+T,GAAuBlP,EAAMG,KAAMK,EAAQC,KAAKE,QAASuO,IACtMiD,IAAuDhX,GAA5BgU,GAAwB,CAAA,EAA2CnP,EAAMC,MAAOO,EAAQC,KAAK8E,MAAOpK,GAAgBgU,GAAuBnP,EAAMG,KAAMK,EAAQC,KAAKC,OAAQyO,ICvH9MvL,GAAY,CAAC,WAAY,QAAS,cAAe,cAAe,aAAc,WAAY,OAAQ,WAAY,QAAS,eAAgB,cAAe,qBAAsB,qBAAsB,uBAAwB,kBAAmB,WAAY,YAAa,UAAW,WAAY,cAAe,eAAgB,aAAc,gBAAiB,WAAY,QAAS,yBAA0B,qBAAsB,YAAa,YAAa,kBAAmB,kBAAmB,kBAAmB,iBACrfwO,GAAa,CAAC,YAAa,QAAS,YAgC/B,SAASC,GAASrW,GACvB,IAAIsW,EAAMC,EAAMC,EACZ3R,EAAW7E,EAAK6E,SAClBlD,EAAQ3B,EAAK2B,MACboM,EAAc/N,EAAK+N,YACnB0I,EAAmBzW,EAAK0W,YACxBA,OAAmC,IAArBD,EAA8B,SAAWA,EACvDE,EAAY3W,EAAK,cACjBgO,EAAgBhO,EAAKrB,SACrBA,OAA6B,IAAlBqP,GAAmCA,EAC9C4I,EAAY5W,EAAKvB,KACjBA,OAAqB,IAAdmY,EAAuBha,GAAaG,QAAU6Z,EACrDC,EAAe7W,EAAKuI,SACpBuO,EAAa9W,EAAKnB,MAClBA,OAAuB,IAAfiY,EAAwB,OAASA,EACzCC,EAAe/W,EAAK+W,aACpBC,EAAmBhX,EAAKlB,YACxBA,OAAmC,IAArBkY,EAA8B,QAAUA,EACtDC,EAAwBjX,EAAKmI,mBAC7BA,OAA+C,IAA1B8O,EAAmC,mBAAqBA,EAC7EC,EAAwBlX,EAAKkI,mBAC7BA,OAA+C,IAA1BgP,EAAmC,yBAA2BA,EACnFC,EAAwBnX,EAAKiI,qBAC7BA,OAAiD,IAA1BkP,EAAmC,qBAAuBA,EACjFC,GAAkBpX,EAAKoX,gBACvBC,GAAWrX,EAAKqX,SAChBC,GAAiBtX,EAAKuX,UACtBA,QAA+B,IAAnBD,IAAmCA,GAC/CE,GAAUxX,EAAKwX,QACfC,GAAgBzX,EAAKjB,SACrBA,QAA6B,IAAlB0Y,GAA2Bxa,GAASC,QAAUua,GACzDC,GAAmB1X,EAAKxB,YACxBA,QAAmC,IAArBkZ,IAAsCA,GACpDC,GAAe3X,EAAK2X,aACpBC,GAAiB5X,EAAKkO,WACtB2J,GAAgB7X,EAAK6X,cACrBC,GAAW9X,EAAK8X,SAChBvM,GAAQvL,EAAKuL,MACb7K,GAAyBV,EAAKU,uBAC9BqX,GAAwB/X,EAAKc,mBAC7BA,QAA+C,IAA1BiX,GAAmC,GAAKA,GAC7DnW,GAAY5B,EAAK4B,UACjBoW,GAAiBhY,EAAKiY,UACtBA,QAA+B,IAAnBD,IAAmCA,GAC/CE,GAAkBlY,EAAKkY,gBACvBC,GAAkBnY,EAAKmY,gBACvBC,GAAkBpY,EAAKoY,gBACvBrX,GAAgBf,EAAKe,cACrBkN,GAAO5F,GAAyBrI,EAAM4H,IACpCU,GAAevD,EAAY8R,GAC7BtO,GAAWD,GAAaC,SACxBzD,GAAQwD,GAAaxD,MACnBuT,GAAeC,EAAe,CAChCpT,OAAQ,WAENqT,GAAaD,EAAe,CAC9BpT,OAAQ,SAENsT,GAAUvT,EAAe,CAC3BC,OAAQ,mBAEN6C,GAAU9C,EAAe,CAC3BC,OAAQ,mBAENuT,GAASxT,EAAe,CAC1BC,OAAQ,kBAENwT,GAAcC,EAAO,MACrBC,GAAiBD,EAAO,MACxBE,GAAkBF,EAAO,MACzBG,GAAWH,EAAO,MAClBI,GAAUJ,EAAO,MAEnBK,GAAaC,GADCC,GAAS,GACgB,GACvCta,GAASoa,GAAW,GACpBG,GAAUH,GAAW,GACnBI,GAAUC,EAAYza,IAExB0a,GAAaL,GADEC,EAAS,MACgB,GACxCK,GAAoBD,GAAW,GAC/BE,GAAuBF,GAAW,GAElCG,GAAaR,GADEC,EAAS,MACgB,GACxC7F,GAAYoG,GAAW,GACvBC,GAAeD,GAAW,GACxBE,GAAgBN,EAAYhG,IAE9BuG,GAAaX,GADEC,EAAStB,SAAuDA,GAAiB,IACxD,GACxC1J,GAAa0L,GAAW,GACxBC,GAAgBD,GAAW,GAC7BrY,GAAU,WACHoH,EAAYiP,KACfiC,GAAcjC,GAEpB,GAAK,CAACA,KACJ,IAAIkC,GAAmB,SAA0BC,GAC/CF,GAAcE,EAClB,EACMC,GAAYX,EAAYnL,IAE1B+L,GAAchB,GADCC,EAAS,MACiB,GACzCgB,GAAcD,GAAY,GAC1BE,GAAiBF,GAAY,GAE7BG,GAAcnB,GADEC,GAAS,GACiB,GAC1CmB,GAA2BD,GAAY,GACvCE,GAA8BF,GAAY,GACxCG,GAAmB/b,IAAegV,EAAQH,KAAcA,GAAU9M,OAAS,OAAIC,EAAYkQ,EAC3F8D,GAAY,WACd,OAAOrB,IAAQ,EACnB,EACMsB,GAAW,WACb,OAAOtB,IAAQ,EACnB,EAKMuB,GAAa1R,GAAQ,WACvB,OAAO0C,GAAgB7G,EAC3B,GAAK,CAACA,IAKA8V,GAAgBrM,GAAY,SAAUsM,GAMxC,OALIpc,IAA8B,iBAAPoc,GAAiC,iBAAPA,GAEzCpc,IAAegV,EAAQoH,IACjCC,EAAYtd,MAAM,iFAFlBsd,EAAYtd,MAAM,mEAAmEqL,OAAOa,GAAQmR,GAAM,aAAchS,OAAOgS,EAAK,MAI/Hpc,IAAegV,EAAQoH,EAClC,GAAK,CAACpc,KAMAsc,GAAgBxM,GAAY,SAAUyM,IACnCpc,GAAYma,IAAYA,GAASzX,UACpCyX,GAASzX,QAAQG,QACZmH,EAAYoS,IACfjC,GAASzX,QAAQ2Z,kBAAkBD,EAAWA,GAGtD,GAAK,CAACpc,IAOAsc,GAAkB3M,GAAY,SAAU/C,GAC1C,GAAIoP,GAActH,IAAY,CAE5B,IAAI6H,EAAeC,EAAM9H,IACrB+H,EAAsBtD,GACtBuD,EAAO,CACTC,SAAU,SACV/P,MAAOA,QAAqCA,EAAQ8H,IAElDC,EAAO/H,GACT2P,EAAa3U,OAAS,EAElB8M,GAAUkI,SAAShQ,GAErB2P,EAAalK,OAAOkK,EAAaM,QAAQjQ,GAAQ,IAGjD2P,EAAaO,KAAKlQ,GAClB8P,EAAKC,SAAW,SAEhBxB,GAAiB,KAGrBJ,GAAawB,GACbE,SAA0EA,EAAoBF,EAAcG,EAClH,KAAW,CACL,IAAIK,EAAgBnQ,EAChBoQ,EAAuB7D,GAC3B4B,GAAagC,GACbC,SAA4EA,EAAqBD,EAClG,CACF,GAAE,CAACf,GAAe7C,GAAUzE,KAOzBuI,GAAyBtN,GAAY,SAAUuN,GACjD,INzMgE1b,EAAaqM,EAC3EsP,EAAqBC,EMyMvB,OCnOiC,SAAiCxQ,EAAO8H,GAC3E,OAAO/C,MAAMkD,QAAQH,GAAaA,EAAUkI,SAAShQ,GAASA,IAAU8H,CAC1E,CDiOW2I,EN1MsExP,EMyMpCkO,INzMuBva,EMyM7B0b,GNrMwC,QAFvDC,EAEd,QAFqCC,EAAgBvP,EAAQC,MAAK,SAAUC,GAClF,OAAOA,EAAIvM,cAAgBA,CAC/B,WAAoC,IAAlB4b,OAA2B,EAASA,EAAcxQ,aAA2C,IAAxBuQ,EAAiCA,EAAsB3b,EAAc,IMsMlHkT,GAC1C,GAAK,CAACqH,GAAYrH,KAmBZ4I,GAAwB3N,GAAY,SAAU4N,GAChD,IAAI3Q,EAA0B,iBAAX2Q,EAAsBA,EAASA,EAAO3Q,MAGzD,OAAI6L,IAAmBA,GAAgB7Q,OAAS,EACvC6Q,GAAgBmE,SAAShQ,KAM9BqQ,GAAuB1N,MAKS,iBAAXgO,EAAsBvP,GAAuBpB,EAAOmP,IAAcwB,EAAO/b,aAC3Dgc,cAAcZ,SAASrN,GAAWiO,cAE1E,GAAE,CAAC/E,GAAiBwE,GAAwB1N,GAAYwM,KAKrD0B,GAAiBpT,GAAQ,WAC3B,OAAO0R,GAAW2B,OAAOJ,GAC7B,GAAK,CAACvB,GAAYuB,KAMZK,GAAehO,GAAY,SAAU/C,GACvC,QAAOA,KAAUmP,GAAWjO,MAAK,SAAUC,GACzC,OAAOA,EAAInB,QAAUA,CACtB,GACL,GAAK,CAACmP,KAMA6B,GAAkBjO,GAAY,SAAU/C,GAC1C,OAAO6Q,GAAiBA,GAAeI,WAAU,SAAUN,GACzD,OAAOA,EAAO3Q,QAAUA,CAC9B,KAAU,CACV,GAAK,CAAC6Q,KAMAK,GAAkBnO,GAAY,SAAUqC,GAC1C,GAAIyL,IAAkBA,GAAe7V,QAAUoK,EAAO,CACpD,IAAIuL,EAASE,GAAezL,GAC5B,OAAOuL,EAASA,EAAO3Q,WAAQ/E,CAChC,CACL,GAAK,CAAC4V,KAKAM,GAAqBpO,GAAY,WACnC,OAAOqM,GAActH,IAAaA,GAAUmJ,WAAU,SAAUjR,GAC9D,IAAIoR,EAAaC,EACjB,OAA6C,QAArCD,EAAcpE,GAAWhN,UAAoC,IAAhBoR,GAAkF,QAA/CC,EAAsBD,EAAYtb,eAA6C,IAAxBub,OAAjE,EAA2GA,EAAoB3a,SAAS4a,SAASC,cACrO,KAAU,CACP,GAAE,CAACvE,GAAYoC,GAAetH,KAS7B0J,GAAc9D,GADEC,IAC0B,GAC1C8D,GAAqBD,GAAY,GACjCE,GAAsBF,GAAY,GAQhCG,GAA0B5O,GAAY,SAAU6O,GAClD,IAAIC,EACAC,EAAmI,QAAnHD,EAAwBhB,cAAuD,EAASA,GAAe7V,cAA8C,IAA1B6W,EAAmCA,EAAwB,EACtME,EAAYD,EAAe,EAAI,EAAIA,EAAe,EAAI,EACtDE,EAAmBhB,GAAgBhD,IAOvC,OAJI4D,GAAave,KACfub,GAAe,MACfW,MAEMqC,GACN,IAAK,OAED,IAAIK,EAAiDf,GAAtCc,EAAmB,EAAIF,EAA+BE,EAAmB,EAAqB,GAC7G/D,GAAqBgE,QAA2CA,EAAW,MAC3E,MAEJ,IAAK,OAED,IAAIC,EAAwChB,GAA5Bc,EAAmB,GAAK,EAAoBA,EAAmB,EAAqBD,GACpG9D,GAAqBiE,QAA6CA,EAAY,MAC9E,MAEJ,IAAK,OAED,IAAIC,EAAajB,GAAgBa,GACjC9D,GAAqBkE,QAA+CA,EAAa,MACjF,MAGJ,QAEI,IAAIC,EAAalB,GAAgB,GACjCjD,GAAqBmE,QAA+CA,EAAa,MAG3F,GAAK,CAACpE,GAAmBgD,GAAiBE,GAAiB7d,GAAQkc,GAAesB,cAAuD,EAASA,GAAe7V,SAO3JqX,GAAoBtP,GAAY,SAAU6O,EAAWU,GACvD,GAAIlD,GAActH,IAChB,OAAQ8J,GACN,IAAK,OAED,IAAIW,EAAqBD,QAAyDA,EAAkBnB,KAChGqB,EAAgBD,EAAqB,EAAIzK,GAAU9M,OAASuX,EAAqB,EAAIzK,GAAU9M,OAAS,EACxGyX,EAAgB3K,GAAU0K,GAC9B5D,GAAe6D,GACf,MAEJ,IAAK,OAED,IAAIC,EAAsBJ,QAAyDA,EAAkBnB,KACjGwB,EAAgBD,EAAsB,EAAIA,EAAsB,EAAIA,EAAsB,EAAI5K,GAAU9M,OAAS,EAAI,EACrH4X,EAAgB9K,GAAU6K,GAC9B/D,GAAegE,GACf,MAEJ,IAAK,QAED,IAAIC,EAAiB/K,GAAU,GAC/B8G,GAAeiE,GACf,MAEJ,IAAK,OAED,IAAIC,EAAgBhL,GAAUA,GAAU9M,OAAS,GACjD4T,GAAekE,GACf,MAEJ,QACElE,GAAe,MAItB,GAAE,CAACuC,GAAoB/B,GAAetH,KAKnCiL,GAAiBhQ,GAAY,SAAU6O,EAAWoB,GAGpD,OADIpB,GAAW3D,GAAqB,MAC5B2D,GACN,IAAK,QACH,OAAQH,IACN,KAAKrgB,GAED,IAAI6hB,EAAmBC,EAGjBC,EADN,IAAgD,QAA1CF,EAAoB1F,GAASzX,eAA2C,IAAtBmd,OAA+B,EAASA,EAAkBG,iBAA+D,QAA3CF,EAAqB3F,GAASzX,eAA4C,IAAvBod,OAAgC,EAASA,EAAmBlT,MAAMhF,QAEpM,QAApDmY,EAAwB9F,GAAevX,eAA+C,IAA1Bqd,GAA4CA,EAAsBld,QAEjI,MAEJ,KAAK7E,GACL,KAAKA,GACL,KAAKA,GAED,GAAIqgB,KAAuBrgB,IAEkD,KAA5E0W,cAA6C,EAASA,GAAU9M,QAAe,CAE9EuU,GAAc,GACd8C,GAAkB,MAClBW,EAAMtU,iBACN,KACD,CAED2T,GAAkB,QAOxB,MACF,IAAK,OACH,OAAQZ,IACN,KAAKrgB,GAED,IAAIiiB,EACJL,EAAMtU,iBACN6Q,GAAchC,UAAgG,QAA3C8F,EAAqB9F,GAASzX,eAA4C,IAAvBud,OAA7D,EAAsGA,EAAmBrT,MAAMhF,QACxL,MAEJ,KAAK5J,GACL,KAAKA,GACL,KAAKA,GAED,GAAIge,GAActH,IAAY,CAC5B,IAAIwL,EAEJ,GAAI7B,KAAuBrgB,IAA8J,KAAxF,QAA3CkiB,EAAqB/F,GAASzX,eAA4C,IAAvBwd,OAAgC,EAASA,EAAmBC,gBACnK,MAEFlB,GAAkB,OACnB,EAOP,MACF,QACEA,GAAkB,MAG1B,GAAK,CAACZ,GAAoBrC,GAAetH,GAAWyH,GAAe8C,KAIjErc,GAAU,WACJ2M,KAAe8L,IACjBkD,GAAwB,QAE3B,GAAE,CAAChP,GAAYtP,GAAQob,GAAWkD,KAGnC6B,EAAcxF,GAAoBlB,GAAakB,SAAqB/S,EAAWuS,IAS/E,IAAIiG,GAAe1Q,GAAY,SAAUvC,GACvC,GAAIC,EAAgBD,EAAO,kBAAmB,CAC5C,IAAIE,EAAmBb,GAAgBW,EAAMG,OAC3C+S,EAAShT,EAAiBV,MAC1BpL,EAAc8L,EAAiB9L,YACjC,GAAI8b,GAAsBgD,GAAS,CACjC,IAAI9S,EAAeJ,EAAMG,MACvBgT,EAAa/S,EAAavK,UAC1BwH,EAAQ+C,EAAa/C,MACrB+V,EAAYhT,EAAaxN,SACzBygB,EAAQ/W,GAAyB8D,EAAciK,IAC7CzF,EAAQ+J,GAAW8B,WAAU,SAAU9P,GACzC,OAAOA,EAAInB,QAAU0T,CAC/B,IACY7e,EAAYmZ,KAAsB0F,EAClC/R,EAAayN,GAActH,IAAaA,GAAUkI,SAAS0D,GAAU5L,KAAc4L,EASnF9Q,EAAYkK,GAAa4G,GAC7B,OAAoBnf,EAAM2B,cAAcmM,GAAwBjE,GAAS,CAAA,EAAIyV,EAAO,CAClF7T,MAAO0T,EACP9e,YAAaA,EACbC,UAAWA,EACX8M,WAAYA,EACZvO,SAAUwgB,EACVrR,YAfgB,WAChB0L,GAAqByF,GACrBhE,GAAgBgE,GAChBnE,KACImE,IAAW5L,IACbmH,IAEZ,EASUpR,MAAOA,EACPxH,UAAWsd,EACXvO,MAAOA,EACP1N,IAAKkL,IAER,CACF,MAAM,GAAInC,EAAgBD,EAAO,iBAAkB,CAClD,IAAIsT,EAAiBvf,EAAMqF,SAASma,IAAIvT,EAAMG,MAAMrH,SAAUma,IAC9D,GAAIK,IAAmBA,aAAuD,EAASA,EAAe9Y,QAAU,EAC9G,OAAoBzG,EAAM2B,cAAcmD,GAAuB,CAC7DjD,MAAOoK,EAAMG,MAAMvK,MACnBC,UAAWmK,EAAMG,MAAMtK,WACtB9B,EAAMqF,SAASma,IAAID,EAAgBL,IAEzC,CACL,GAAK,CAACtE,GAAYrC,GAAckB,GAAmBoB,GAAetH,GAAWyH,GAAemB,GAAuBhB,KAK7GsE,GAAqBvW,GAAQ,WAC/B,OAAOlJ,EAAMqF,SAASma,IAAIza,EAAUma,GACxC,GAAK,CAACna,EAAUma,KAKVQ,GAAgBxW,GAAQ,WAC1B,GAAI2R,GAActH,IAChB,OAAOA,GAAUgJ,OAAOC,IAAcgD,KAAI,SAAU/T,EAAOoF,GACzD,IAAIxQ,EAAcwM,GAAuBpB,EAAOmP,IAC5Cta,EAAY8Z,KAAgB3O,EAC5BrK,EAAUqX,GAAWhN,GACrBkU,EAAa9O,GAAS0C,GAAU9M,OAAS,EAc7C,OAAoBzG,EAAM2B,cAAc5B,GAAc,CACpDuC,IAAKmJ,EACLpL,YAAaA,EACbC,UAAWA,EACXC,SAjBa,WACTof,GAEF3E,KACA8C,GAAkB,OAElBA,GAAkB,OAAQjN,GAE5BsK,GAAgB1P,EAC1B,EASUjL,QARY,WACZ6Z,GAAe5O,EACzB,EAOUtI,IAAK/B,GAEf,GAEG,GAAE,CAACyZ,GAAetH,GAAWiJ,GAAc5B,GAAYR,GAAa3B,GAAY0C,GAAiBH,GAAe8C,KAK7Glf,GAAYsK,GAAQ,WACtB,OAAO0R,GAAWgF,MAAK,SAAUhT,GAC/B,OAAOA,EAAIJ,QACjB,GACA,GAAK,CAACoO,KAQAiF,GAAcrR,GAAY,WAC5B,IAAIsR,EAAqBxD,GAAe3P,MAAK,SAAUyP,GACrD,OAAOA,EAAO/b,cAAgB+N,IAAcgO,EAAO3Q,QAAU2C,EACnE,IAII,IAAK3C,IAASqU,EACZ3E,GAAgB2E,EAAmBrU,YAEnC,IAAKoP,GAActH,IAAY,CAC7B,IAAIwM,EAEA1f,EAA0F,QAA3E0f,EAAwBlT,GAAuB0G,GAAWqH,WAAmD,IAA1BmF,EAAmCA,EAAwBlG,GACjKG,GAAiB3Z,EAClB,CAEP,GAAK,CAACua,GAAYxM,GAAYyM,GAAehB,GAAetG,GAAW4H,GAAiB1P,GAAO6Q,KAKzF0D,GAAWxR,GAAY,WACzB,GAAI8E,GAAmBC,KACrB,GAAIsH,GAActH,IAChB0M,GAAiBhhB,SACZ,IAAK4b,GAActH,IAAY,CACpC,IAAI2M,EAEA7f,EAA2F,QAA5E6f,EAAyBrT,GAAuB0G,GAAWqH,WAAoD,IAA3BsF,EAAoCA,EAAyB,GACpKlG,GAAiB3Z,GACjBqa,IACD,OAEDV,GAAiB,GAEpB,GAAE,CAACY,GAAYC,GAAetH,GAAWtU,KAG1CwC,GAAU,WACR,GAAIoW,GACF,GAAInE,EAAQmE,IAAe,CACzB,IAAIsI,EAEAC,EAEI,QAFaD,EAAuBtI,GAAa0E,QAAO,SAAU9Q,GACxE,OAAO+Q,GAAa/Q,EAC9B,WAAiD,IAAzB0U,EAAkCA,EAAuB,GACzEvG,GAAawG,EACrB,MACY5D,GAAa3E,KACf+B,GAAa/B,SAIjB+B,GlB7lBC,SAA0Blb,GAC/B,OAAIA,EACK,GAEA,IAEX,CkBulBmB2hB,CAAiB3hB,IAGjC,GAAE,IAIH+C,GAAU,WACR,IAAKoH,EAAY4C,KAAUA,KAAUyO,GACnC,GAAI1G,EAAO/H,IACTmO,GAAa,WACR,GAAIiB,GAAcpP,IAAQ,CAE/B,IAAI2P,EAAe3P,GAAM8Q,OAAOC,IAChC5C,GAAawB,EACrB,MACQxB,GAAa4C,GAAa/Q,IAASA,GAAQ,KAGhD,GAAE,CAACoP,GAAe2B,GAActC,GAAWzO,KAI5ChK,GAAU,YACmBoH,EAAYgR,MAAmBnG,EAAQH,MAAeC,EAAOqG,KAAkBpG,EAASF,KAAcC,EAAOD,OAAgB+M,EAAQ/M,GAAWsG,KAEzKmG,IAEH,GAAE,CAACA,GAAUnG,GAAetG,KAG7B9R,GAAU,YACH3C,IAAUwa,IACbuG,IAEH,GAAE,CAAC/gB,GAAQwa,GAASuG,KAQrB,IACEU,GAAcpH,GADEC,EAAS,GACiB,GAC1ClR,GAAYqY,GAAY,GACxBC,GAAeD,GAAY,GAI7B9e,GAAU,WACR,IAAIgf,EAAuBC,EAC3BF,GAAgL,QAAlKC,EAAyE,QAAhDC,EAAuB9H,GAAYrX,eAA8C,IAAzBmf,OAAkC,EAASA,EAAqBC,mBAAmD,IAA1BF,EAAmCA,EAAwB,EACpP,GAAE,CAAC7H,GAAa9Z,GAAQ2a,GAAmBlG,KAwM5CqN,EAAiBlG,GAAW,CAACzB,GAASL,IAAc9Z,IAKpD,IAAI2V,GAA8BoG,GAActH,OAAgBA,GAAU9M,OAQtEoa,GAAiBC,GAHU,SAAkC5e,GAC/DsY,GAA4BvP,GAAoB/I,EAAEE,QACtD,GAC0D,GAAI,CAC1D2e,SAAS,IAMPC,GAAiBxS,GAAY,SAAUtM,GACrCjD,KAAa9B,GAASC,SACxByjB,GAAe3e,EAErB,GAAK,CAAC2e,GAAgB5hB,KAKpBwC,GAAU,WACJsX,GAAgBxX,SAClBiZ,GAA4BvP,GAAoB8N,GAAgBxX,SAEnE,GAAE,IACH,IArnBiD0f,GAqnB7C3Y,GAAeyG,GAAc,CAC/B9N,cAAeA,IACdkX,GAAY,CACbA,UAAWA,GACXC,gBAAiBA,GACjBC,gBAAiBA,GACjBC,gBAAiBA,IACf,CACFH,UAAWA,KAEb,OAAoBnY,EAAM2B,cAAcuf,EAAoB,CAC1DzY,SAAUA,IACIzI,EAAM2B,cAAcnD,GAAgB2iB,SAAU,CAC5D1V,MAAO,CACL/M,YAAaA,GACbC,KAAMA,EACNC,UAAWA,GACXC,SAAUA,EACVC,OAAQA,GACRC,MAAOA,EACPC,YAAaA,EACb4B,uBAAwBA,GACxBI,mBAAoBA,GACpBoN,WAAYA,GACZnP,SAAUA,GACVgC,cAAeA,KAEHjB,EAAM2B,cAAc,MAAOkI,GAAS,CAClD/H,UAAWC,EAAGoS,GAAoBxV,GAAOmD,KACxCqM,KAAQtM,GAASoM,IAA6BjO,EAAM2B,cAAc,MAAO,CAC1EG,UAAWiU,IACVlU,GAAsB7B,EAAM2B,cAAcyf,EAAO,CAClD7b,GAAI0C,GACJoZ,QAAS3I,GACTjQ,SAAUA,GACV5J,SAAUA,EACViD,UAAWC,EAAG1C,GAAgB,CAAE,EAAE2W,GAA6BrX,IAAS7B,GAAaI,SACpF2E,GAAQoM,GAA4BjO,EAAM2B,cAAc2f,EAAa,CACtE7Y,SAAUA,GACV5J,SAAUA,EACViD,UAAWC,EAAG1C,GAAgB,CAAE,EAAE2W,GAA6BrX,IAAS7B,GAAaI,SACpF+Q,IAA4BjO,EAAM2B,cAAc,MAAO,CACxDwB,IAAKyV,GACL5W,KAAM,WACN,gBAAiBlD,GACjB,gBAAiB6Z,GACjB,YAAaA,GACbvV,UAAW,EACXme,YA3QgC,SAAqCrf,GACjErD,GACFqD,EAAEiI,gBAER,EAwQIlI,QArQwB,SAA6BC,GAGrD,GAAIA,EAAEE,SAAW4W,GAASzX,QAAS,CACjC,IAAI0Z,EAAY,EAChB,GAAIjC,GAASzX,QAGX0Z,EAFa/Y,EAAEsf,YAAYC,QACVzI,GAASzX,QAAQmgB,WAAa1I,GAASzX,QAAQof,YAC9BvS,GAAW3H,OAAS,EAExDuU,GAAcC,EACf,CAGDN,IACJ,EAuPIna,QAnPwB,SAA6B0B,GACrD+d,GAAiBhhB,IACjBke,GAgUF,SAA4BjS,GAC1B,IAAIyW,EAAoBC,EAAwBC,EAAmBC,EACnE,IAAK5W,EAAS,OACd,GAAgD,QAA3CyW,EAAqB3I,GAASzX,eAA4C,IAAvBogB,GAAiCA,EAAmBxf,SAAS+I,GAAU,OAAOrO,GACtI,GAA0D,QAArD+kB,EAAyB9I,GAAevX,eAAgD,IAA3BqgB,GAAqCA,EAAuBzf,SAAS+I,GAAU,OAAOrO,GACxJ,IAAIklB,EAAkBlH,GAActH,IAAaA,GAAUmJ,WAAU,SAAUjR,GAC7E,IAAIuW,EAAcC,EAClB,OAA8C,QAAtCD,EAAevJ,GAAWhN,UAAqC,IAAjBuW,GAAqF,QAAjDC,EAAuBD,EAAazgB,eAA8C,IAAzB0gB,OAAnE,EAA8GA,EAAqB9f,SAAS+I,EAClO,KAAU,EACN,GAAI2P,GAActH,IAAY,CAC5B,GAAwB,IAApBwO,EAAuB,OAAOllB,GAClC,GAAIklB,IAAoBxO,GAAU9M,OAAS,EAAG,OAAO5J,GACrD,GAAIklB,EAAkB,EAAG,OAAOllB,EACjC,CACD,GAA8C,QAAzCglB,EAAoB5I,GAAQ1X,eAA2C,IAAtBsgB,GAAgCA,EAAkB1f,SAAS+I,GAAU,OAAOrO,GAClI,GAAsD,QAAjDilB,EAAwBlJ,GAAYrX,eAA+C,IAA1BugB,GAAoCA,EAAsB3f,SAAS+I,GAAU,OAAOrO,EACnJ,CAhVqBqlB,CAAmBhgB,EAAEE,QAC7C,EAiPIC,UA3NkB,SAAuBoc,GACzC,IAAI0D,EAAkBC,EAClBC,EAAyD,QAAxCF,EAAmBlJ,GAAQ1X,eAA0C,IAArB4gB,OAA8B,EAASA,EAAiBhgB,SAAS4a,SAASC,eAK/I,IAJ0E,QAAjDoF,EAAwBxJ,GAAYrX,eAA+C,IAA1B6gB,OAAmC,EAASA,EAAsBjgB,SAAS4a,SAASC,iBACxHqF,EAGtB,CAGtB,GAAI5D,EAAM6D,SAAW7D,EAAM8D,UAAY9D,EAAM+D,OAC3C,OAEF,OAAQ/D,EAAMnc,KACZ,KAAKC,EAAOkgB,IAER,OAAQvF,IACN,IAAK,QAEI5J,GAAmBC,MACtBmH,KACA0C,GAAwB,SACxBU,GAAkB,OAGpB,MAEJ,IAAK,WAGDA,GAAkB,MAaxB,MAEJ,KAAKvb,EAAOmgB,OAERhI,KACA0C,GAAwB,SACxB,MAEJ,KAAK7a,EAAOG,MAEH5D,IAOLA,IAAUoe,KAAuBrgB,IAA0B2W,EAAOiG,KArmBrD,SAA0B2C,GAC/C,GAAsB,iBAAXA,EAAqB,CAC9B,IAAIuG,EAAYlW,GAAyB2P,EAAQxB,IACjD,QAAU+H,UAA8CA,EAAUpW,WACxE,CACM,QAAS6P,EAAO7P,UAEtB,CA8lBqGqW,CAAiBnJ,IAI1GyD,KAAuBrgB,KACrBse,GAAgB,MAChBH,MALAG,GAAgB1B,IAPhBkB,KAcF,MAEJ,KAAKpY,EAAOE,UAKN,IAAIogB,EADN,GAAIhI,GAActH,IAEW,UAAvB2J,IAAuK,KAAxF,QAA3C2F,EAAqB7J,GAASzX,eAA4C,IAAvBshB,OAAgC,EAASA,EAAmB7D,iBACrJlB,GAAkB,QAItBnD,KACA,MAEJ,KAAKpY,EAAOugB,UAEJhkB,IAEF2f,EAAMtU,iBAENiT,GAAwB,SAExBzC,KAEF,MAEJ,KAAKpY,EAAOwgB,QAEJjkB,IAEF2f,EAAMtU,iBAENiT,GAAwB,SAExBzC,KAEF,MAEJ,KAAKpY,EAAOygB,WAERxE,GAAe,QAASC,GACxB,MAEJ,KAAKlc,EAAO0gB,UAERzE,GAAe,OAAQC,GACvB,MAEJ,QAES3f,IACH6b,KAIT,CACL,EA8FIuI,gBArRwB,WACxB,IAAIC,EAAwBC,EAC5B5C,GAAoL,QAAtK2C,EAA2E,QAAjDC,EAAwBxK,GAAYrX,eAA+C,IAA1B6hB,OAAmC,EAASA,EAAsBzC,mBAAoD,IAA3BwC,EAAoCA,EAAyB,EAC7P,EAmRIrhB,UAAWC,EAAGqS,GAAoBE,GAAoBtP,IAAQwP,GAAmB7V,EAAM8V,KAA+B+B,EAAO,CAAA,EAAInX,GAAgBmX,EAAM9B,GAAuB1P,IAAQnG,GAAWQ,GAAgBmX,EAAM7B,GAAoB3P,IAAQjG,IAAUxB,GAAME,OAAQ4B,GAAgBmX,EAAM5B,GAAmB5P,KA1qBrQic,GA0qB8RpkB,GAzqBtUokB,KAAgB/D,KAyqB+U7d,GAAgBmX,EAAMN,GAA6BlR,IAAQuV,IAA2B/D,KAC9axW,EAAM2B,cAAc,MAAO,CACzC0hB,SAAUrC,GACV7d,IAAK4V,GACLjX,UAAWmT,GAAkB,CAC3BtW,KAAMA,EACNM,SAAUA,MAEXygB,GAA4B1f,EAAM2B,cAAc,QAAS,CAC1D,aAAckV,QAA6CA,EAAYhV,EACvE,oBAAqB,OACrB,gBAAiB8W,GACjB,kBAAmB1Q,GACnB9E,IAAK6V,GACLzT,GAAImT,GACJ5W,UAAWC,EAAGoT,GAAuBG,GAAsB3W,GAAOyW,GAAuBpQ,IAAQuQ,GAA6BzW,KAAU2X,EAAO,CAAE,EAAEpX,GAAgBoX,EAAMjB,GAA6B7W,EAAMyP,IAAayM,GAActH,KAAalU,GAAgBoX,EAAMpB,GAA+BrQ,IAAQnG,GAAW4X,IAC5TG,YAAa6D,GACb5b,SAAUA,QAA2CA,OAAW6H,EAChEsR,SAlQsB,SAA2B9V,GACjD8X,GAAiB9X,EAAEE,OAAOqJ,OAE1B8L,UAAoDA,GAASrV,EAAEE,OAAOqJ,OACtEsM,UAA8DA,GAAc7V,EAChF,EA8PIuJ,MAAO2C,GACPkV,aAAc,SACEtjB,EAAM2B,cAAc,MAAO,CAC3CG,UAAWC,EAAGgT,GAAwBC,GAAuBrW,KAClD,UAAVI,GAAkCiB,EAAM2B,cAAc0H,EAAM,CAC7DC,MAAO,UACP2H,KAAMkF,GAAqBnR,IAC3BlD,UAAW8T,KACT6B,IAAanE,GAAmBC,MAAe1U,GAAyBmB,EAAM2B,cAAc4hB,EAAY,CAC1G,aAAc,kBACd,gBAAiB1kB,EACjBA,SAAUA,EACVsE,IAAK2V,GACL7W,QAvQ2B,SAAgCC,GACtDrD,IAEHqD,EAAEuM,kBACF0M,GAAgB,MAChBzD,UAAkDA,GAAQxV,GAC1DqV,UAAoDA,GAAS,IAC7DyD,KAEN,EA+PIxa,QA3Q2B,WAC3BkZ,GAAqB,KACzB,EA0QI5X,UAAWC,EAAG4T,IACdlN,SAAUA,IACIzI,EAAM2B,cAAc0H,EAAM,CACxCC,MAAO,iBACStJ,EAAM2B,cAAc0H,EAAM,CAC1CC,MAAO,YACPxH,UAAW8T,GACX3E,KAAMlP,GAAI2U,EAAO,CAAA,EAAIrX,GAAgBqX,EAAMN,GAAqBpR,KAASnG,GAAWQ,GAAgBqX,EAAML,GAAwBrR,IAAQnG,GAAW6X,QACvI,UAAV3X,GAAqBkY,GAA6BjX,EAAM2B,cAAc,MAAO,CACjFG,UAAWC,EAAG8T,GAAuB7Q,IAAQ8Q,GAAsBnX,KAClEsY,GAA4BjX,EAAM2B,cAAcoG,GAAc8B,GAAS,CACxEtE,GAAIoT,GACJ1Q,QAASA,GACTD,MAAO4Q,GACPzV,IAAK8V,GACL/Q,UAAWA,GACXC,qBAAsBA,EACtBC,mBAAoBA,EACpBC,mBAAoBA,GACnBC,IAAemX,OAQlB,SAASQ,GAAiBhhB,GACpB8Z,IAAmBA,GAAgBxX,UAEjCtC,IAAa9B,GAASE,UACxB0b,GAAgBxX,QAAQiiB,WAAazK,GAAgBxX,QAAQkiB,aAE3DxkB,IAAa9B,GAASC,UACxB2b,GAAgBxX,QAAQ6J,UAAY2N,GAAgBxX,QAAQ4J,cAGjE,CAsBH,CACAoL,GAAS3Q,UAAY,CAEnBlH,YAAamH,EAAUyL,KACvB7F,MAAO5F,EAAU6d,UAAU,CAAC7d,EAAUC,OAAQD,EAAU8d,QAAQ9d,EAAUC,UAC1E+R,aAAchS,EAAU6d,UAAU,CAAC7d,EAAUC,OAAQD,EAAU8d,QAAQ9d,EAAUC,UACjF7G,SAAU4G,EAAU+d,MAAMC,OAAOC,OAAO3mB,KAExCsL,SAAU5C,EAAUyL,KACpBzP,MAAOgE,EAAUC,OACjB,aAAcD,EAAUC,OACxBf,SAAUc,EAAUE,KACpBiS,SAAUnS,EAAU0L,KACpBvQ,mBAAoB6E,EAAUke,OAC9BnjB,uBAAwBiF,EAAU+d,MAAMC,OAAOC,OAAOjjB,IACtD6W,QAAS7R,EAAU0L,KACnBgG,SAAU1R,EAAU0L,KACpBkG,UAAW5R,EAAUyL,KACrBnJ,qBAAsBtC,EAAUC,OAChCsC,mBAAoBvC,EAAUC,OAC9BuC,mBAAoBxC,EAAUC,OAC9B9G,YAAa6G,EAAU+d,MAAMC,OAAOC,OAAOpmB,KAC3CuZ,aAAcpR,EAAUC,OACxB/G,MAAO8G,EAAU+d,MAAMC,OAAOC,OAAOvmB,KACrCoB,KAAMkH,EAAU+d,MAAMC,OAAOC,OAAOhnB,KACpC+B,SAAUgH,EAAUyL,KACpBrD,YAAapI,EAAUC,OACvB8Q,YAAa/Q,EAAUC,OACvBwR,gBAAiBzR,EAAU8d,QAAQ9d,EAAUC,QAE7C7E,cAAe4E,EAAUke,OACzB5L,UAAWtS,EAAUyL,KACrBgH,gBAAiBzS,EAAUme,YAC3B3L,gBAAiBxS,EAAUme,YAC3B5L,gBAAiBvS,EAAUC"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../src/types/Combobox.types.ts","../../src/ComboboxContext/ComboboxContext.tsx","../../src/ComboboxChip/ComboboxChip.styles.ts","../../src/ComboboxGroup/ComboboxGroup.styles.ts","../../src/ComboboxChip/ComboboxChip.tsx","../../src/ComboboxMenu/Menu.styles.ts","../../src/ComboboxGroup/ComboboxGroup.tsx","../../src/ComboboxMenu/ComboboxMenu.tsx","../../src/utils/checkScrollPosition.tsx","../../src/ComboboxOption/ComboboxOption.styles.ts","../../src/utils/getNameAndValue.ts","../../src/utils/flattenChildren.tsx","../../src/utils/OptionObjectUtils.ts","../../src/ComboboxOption/ComboboxOption.tsx","../../src/ComboboxOption/getGlyphs.tsx","../../src/utils/wrapJSX.tsx","../../src/utils/doesSelectionExist.ts","../../src/Combobox/Combobox.styles.ts","../../src/Combobox/Combobox.tsx","../../src/Combobox/utils/isValueCurrentSelection.ts"],"sourcesContent":["/**\n * Identifier for individual component elements within the Combobox\n */\nexport const ComboboxElement = {\n Input: 'Input',\n ClearButton: 'ClearButton',\n FirstChip: 'FirstChip',\n LastChip: 'LastChip',\n MiddleChip: 'MiddleChip',\n Combobox: 'Combobox',\n Menu: 'Menu',\n} as const;\nexport type ComboboxElement =\n (typeof ComboboxElement)[keyof typeof ComboboxElement];\n\n/**\n * The rendered size of the Combobox\n */\nexport const ComboboxSize = {\n XSmall: 'xsmall',\n Small: 'small',\n Default: 'default',\n Large: 'large',\n} as const;\nexport type ComboboxSize = (typeof ComboboxSize)[keyof typeof ComboboxSize];\n\n/**\n * Defines the behavior of the Combobox when there are more selected chips than will fit in the input\n */\nexport const Overflow = {\n /**\n * Combobox will be set to a fixed width, and will expand its height based on the number of Chips selected\n */\n expandY: 'expand-y',\n /**\n * Combobox will be set to a fixed height and width (default 100% of container). Chips will be scrollable left-right\n */\n scrollX: 'scroll-x',\n /**\n * @deprecated\n */\n expandX: 'expand-x',\n} as const;\nexport type Overflow = (typeof Overflow)[keyof typeof Overflow];\n\n/** The error state of the Combobox */\nexport const State = {\n none: 'none',\n error: 'error',\n} as const;\nexport type State = (typeof State)[keyof typeof State];\n\n/** The search state of the Combobox */\nexport const SearchState = {\n unset: 'unset',\n error: 'error',\n loading: 'loading',\n} as const;\nexport type SearchState = (typeof SearchState)[keyof typeof SearchState];\n\n/**\n * The type expected in the `value` or `initialValue` prop.\n * Also the type passed as an argument to `onChange`.\n *\n * Type varies depending on the value of `multiselect`\n */\nexport type SelectValueType<M extends boolean> = M extends true\n ? Array<string>\n : string | null;\n\n/** Represents an element that was added or removed from the multiselect value array */\nexport interface DiffObject {\n diffType: 'insert' | 'delete';\n value: string | Array<string>;\n}\n\n/**\n * Callback event fired when the value changes\n *\n * Type varies depending on the value of `multiselect`\n */\n// TODO: onChange signature should match the native event handler signature\nexport type onChangeType<M extends boolean> = M extends true\n ? (value: SelectValueType<true>, diff?: DiffObject) => void\n : (value: SelectValueType<false>) => void;\n\n/**\n * Returns the correct empty state for multiselect / single select\n */\nexport function getNullSelection<M extends boolean>(\n multiselect: M,\n): SelectValueType<M> {\n if (multiselect) {\n return [] as Array<string> as SelectValueType<M>;\n } else {\n return null as SelectValueType<M>;\n }\n}\n","import { createContext } from 'react';\n\nimport {\n ComboboxSize,\n Overflow,\n SearchState,\n State,\n TruncationLocation,\n} from '../types';\n\nexport interface ComboboxData {\n multiselect: boolean;\n size: ComboboxSize;\n withIcons: boolean;\n disabled: boolean;\n isOpen: boolean;\n state: State;\n searchState: SearchState;\n overflow: Overflow;\n chipTruncationLocation?: TruncationLocation;\n chipCharacterLimit?: number;\n inputValue?: string;\n popoverZIndex?: number;\n}\n\nexport const defaultContext = {\n multiselect: false,\n size: ComboboxSize.Default,\n withIcons: false,\n disabled: false,\n isOpen: false,\n state: State.none,\n searchState: SearchState.unset,\n overflow: Overflow.expandY,\n};\n\nexport const ComboboxContext = createContext<ComboboxData>(defaultContext);\n","import { chipTextClassName } from '@leafygreen-ui/chip';\nimport { css } from '@leafygreen-ui/emotion';\nimport { createUniqueClassName } from '@leafygreen-ui/lib';\nimport { typeScales } from '@leafygreen-ui/tokens';\n\nimport { ComboboxSize } from '../types';\n\nexport const chipClassName = createUniqueClassName('combobox-chip');\n\n/**\n * The line-height of the combobox.\n */\nexport const lineHeight: Record<ComboboxSize, number> = {\n [ComboboxSize.XSmall]: 16,\n [ComboboxSize.Small]: typeScales.body1.lineHeight,\n [ComboboxSize.Default]: typeScales.body1.lineHeight,\n [ComboboxSize.Large]: typeScales.body2.lineHeight,\n};\n\n/**\n * The font-size of the combobox.\n */\nexport const fontSize: Record<ComboboxSize, number> = {\n [ComboboxSize.XSmall]: typeScales.body1.fontSize,\n [ComboboxSize.Small]: typeScales.body1.fontSize,\n [ComboboxSize.Default]: typeScales.body1.fontSize,\n [ComboboxSize.Large]: typeScales.body2.fontSize,\n};\n\n/**\n * Vertical padding on a chip (in px)\n */\nexport const chipWrapperPaddingY = {\n [ComboboxSize.XSmall]: 1,\n [ComboboxSize.Small]: 0,\n [ComboboxSize.Default]: 2,\n [ComboboxSize.Large]: 4,\n} as const;\n\n/**\n * Override chip sizes\n */\nexport const chipSizeStyles: Record<ComboboxSize, string> = {\n [ComboboxSize.XSmall]: css`\n font-size: ${fontSize[ComboboxSize.XSmall]}px;\n line-height: ${lineHeight[ComboboxSize.XSmall]}px;\n\n .${chipTextClassName} {\n padding-block: ${chipWrapperPaddingY[ComboboxSize.XSmall]}px;\n }\n `,\n [ComboboxSize.Small]: css`\n font-size: ${fontSize[ComboboxSize.Small]}px;\n line-height: ${lineHeight[ComboboxSize.Small]}px;\n\n .${chipTextClassName} {\n padding-block: ${chipWrapperPaddingY[ComboboxSize.Small]}px;\n }\n `,\n [ComboboxSize.Default]: css`\n font-size: ${fontSize[ComboboxSize.Default]}px;\n line-height: ${lineHeight[ComboboxSize.Default]}px;\n\n .${chipTextClassName} {\n padding-block: ${chipWrapperPaddingY[ComboboxSize.Default]}px;\n }\n `,\n [ComboboxSize.Large]: css`\n font-size: ${fontSize[ComboboxSize.Large]}px;\n line-height: ${lineHeight[ComboboxSize.Large]}px;\n\n .${chipTextClassName} {\n padding-inline-end: 10px;\n padding-block: ${chipWrapperPaddingY[ComboboxSize.Large]}px;\n }\n `,\n};\n","import { css } from '@leafygreen-ui/emotion';\nimport { Theme } from '@leafygreen-ui/lib';\nimport { palette } from '@leafygreen-ui/palette';\nimport { fontWeights, spacing } from '@leafygreen-ui/tokens';\n\nexport const comboboxGroupStyle: Record<Theme, string> = {\n [Theme.Light]: css`\n padding-top: ${spacing[2]}px;\n `,\n [Theme.Dark]: css`\n padding-top: ${spacing[2]}px;\n `,\n};\n\nexport const comboboxGroupLabel = css`\n cursor: default;\n width: 100%;\n padding: 0 12px 2px;\n outline: none;\n overflow-wrap: anywhere;\n font-size: 12px;\n line-height: 16px;\n font-weight: ${fontWeights.bold};\n text-transform: uppercase;\n letter-spacing: 0.4px;\n`;\n\nexport const comboboxGroupLabelThemeStyle: Record<Theme, string> = {\n [Theme.Light]: css`\n color: ${palette.gray.dark1};\n `,\n [Theme.Dark]: css`\n color: ${palette.gray.light1};\n `,\n};\n","import React, { useContext, useEffect } from 'react';\n\nimport { BaseFontSize, Chip, Variant } from '@leafygreen-ui/chip';\nimport { cx } from '@leafygreen-ui/emotion';\nimport { useForwardedRef } from '@leafygreen-ui/hooks';\nimport { keyMap } from '@leafygreen-ui/lib';\n\nimport { ComboboxContext } from '../ComboboxContext';\nimport { Overflow, TruncationLocation } from '../types';\n\nimport { chipClassName, chipSizeStyles } from './ComboboxChip.styles';\nimport { ComboboxChipProps } from './ComboboxChip.types';\n\nexport const ComboboxChip = React.forwardRef<\n HTMLSpanElement,\n ComboboxChipProps\n>(\n (\n { displayName, isFocused, onRemove, onFocus }: ComboboxChipProps,\n forwardedRef,\n ) => {\n const {\n size,\n disabled,\n overflow,\n chipTruncationLocation = TruncationLocation.End,\n chipCharacterLimit = 12,\n popoverZIndex,\n } = useContext(ComboboxContext);\n\n const updatedChipTruncationLocation =\n overflow === Overflow.scrollX\n ? TruncationLocation.None\n : chipTruncationLocation;\n\n const chipRef = useForwardedRef(forwardedRef, null);\n const buttonRef = chipRef.current?.querySelector('button');\n\n useEffect(() => {\n if (isFocused && !disabled) {\n buttonRef?.focus();\n }\n }, [disabled, buttonRef, isFocused]);\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (\n !disabled &&\n (e.key === keyMap.Delete ||\n e.key === keyMap.Backspace ||\n e.key === keyMap.Enter ||\n e.key === keyMap.Space)\n ) {\n onRemove();\n }\n };\n\n const handleChipClick = (e: React.MouseEvent) => {\n // Did not click button\n if (!buttonRef?.contains(e.target as Node)) {\n onFocus();\n }\n };\n\n const handleButtonClick = () => {\n if (!disabled) {\n onRemove();\n }\n };\n\n return (\n <Chip\n label={displayName}\n className={cx(chipClassName, chipSizeStyles[size])}\n role=\"option\"\n aria-selected={isFocused}\n data-testid=\"lg-combobox-chip\"\n onClick={handleChipClick}\n onKeyDown={handleKeyDown}\n onDismiss={handleButtonClick}\n baseFontSize={BaseFontSize.Body1}\n chipCharacterLimit={chipCharacterLimit}\n chipTruncationLocation={updatedChipTruncationLocation}\n popoverZIndex={popoverZIndex}\n variant={Variant.Gray}\n ref={chipRef}\n disabled={disabled}\n tabIndex={-1}\n />\n );\n },\n);\nComboboxChip.displayName = 'ComboboxChip';\n","import { transparentize } from 'polished';\n\nimport { css, keyframes } from '@leafygreen-ui/emotion';\nimport { Theme } from '@leafygreen-ui/lib';\nimport { palette } from '@leafygreen-ui/palette';\nimport { fontFamilies, spacing } from '@leafygreen-ui/tokens';\n\nimport { fontSize, lineHeight } from '../ComboboxChip/ComboboxChip.styles';\nimport { ComboboxSize as Size } from '../types';\n\nexport const menuItemPadding: Record<Size, { x: number; y: number }> = {\n [Size.XSmall]: { x: 12, y: 8 },\n [Size.Small]: { x: 12, y: 8 },\n [Size.Default]: { x: 12, y: 8 },\n [Size.Large]: { x: 12, y: 8 },\n};\n\n/** Util that returns the height of a menu item (in px) */\nexport const getMenuItemHeight = (size: Size) => {\n return lineHeight[size] + 2 * menuItemPadding[size].y;\n};\n\n/**\n * Menu styles\n */\n\nexport const popoverStyle = (width = 384) => css`\n width: ${width}px;\n overflow: hidden;\n border-radius: 12px;\n border: 1px solid;\n`;\n\nexport const popoverThemeStyle: Record<Theme, string> = {\n [Theme.Light]: css`\n box-shadow: 0px 4px 7px ${transparentize(0.85, palette.black)};\n border-color: ${palette.gray.light2};\n `,\n [Theme.Dark]: css`\n box-shadow: 0px 4px 7px ${transparentize(0.85, palette.black)};\n border-color: ${palette.gray.dark2};\n `,\n};\n\nexport const menuBaseStyle = css`\n position: relative;\n width: 100%;\n margin: 0;\n padding: ${spacing[2]}px 0;\n font-family: ${fontFamilies.default};\n border-radius: inherit;\n overflow-y: auto;\n scroll-behavior: smooth;\n`;\n\nexport const menuThemeStyle: Record<Theme, string> = {\n [Theme.Light]: css`\n color: ${palette.black};\n background-color: ${palette.white};\n `,\n [Theme.Dark]: css`\n color: ${palette.gray.light1};\n background-color: ${palette.gray.dark3};\n `,\n};\n\nexport const menuList = css`\n position: relative;\n margin: 0;\n padding: 0;\n`;\n\nexport const menuMessageBaseStyle = css`\n font-family: inherit;\n display: inline-flex;\n align-items: center;\n gap: 8px;\n`;\n\nexport const menuMessageThemeStyle: Record<Theme, string> = {\n [Theme.Light]: css`\n color: ${palette.gray.dark3};\n `,\n [Theme.Dark]: css`\n color: ${palette.gray.light3};\n `,\n};\n\nexport const menuMessageSizeStyle = (size: Size) => css`\n font-size: ${fontSize[size]}px;\n line-height: ${lineHeight[size]}px;\n padding: ${menuItemPadding[size].y}px ${menuItemPadding[size].x}px;\n`;\n\nconst loadingIconAnimation = keyframes`\n 0% {\n transform: rotate(0deg);\n }\n 100% {\n transform: rotate(360deg);\n }\n`;\n\nexport const loadingIconStyle = css`\n animation: ${loadingIconAnimation} 1.5s linear infinite;\n`;\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nimport { cx } from '@leafygreen-ui/emotion';\nimport { useIdAllocator } from '@leafygreen-ui/hooks';\nimport { useDarkMode } from '@leafygreen-ui/leafygreen-provider';\n\nimport {\n comboboxGroupLabel,\n comboboxGroupLabelThemeStyle,\n comboboxGroupStyle,\n} from './ComboboxGroup.styles';\nimport { ComboboxGroupProps } from './ComboboxGroup.types';\n\n/**\n * @internal\n */\nexport function InternalComboboxGroup({\n label,\n className,\n children,\n}: ComboboxGroupProps): JSX.Element {\n const { theme } = useDarkMode();\n\n const groupId = useIdAllocator({ prefix: 'combobox-group' });\n const childCount = React.Children.count(children);\n\n return childCount > 0 ? (\n <div className={cx(comboboxGroupStyle[theme], className)}>\n <div\n className={cx(comboboxGroupLabel, comboboxGroupLabelThemeStyle[theme])}\n id={groupId}\n >\n {label}\n </div>\n <div role=\"group\" aria-labelledby={groupId}>\n {children}\n </div>\n </div>\n ) : (\n <></>\n );\n}\n\nComboboxGroup.displayName = 'ComboboxGroup';\n\nComboboxGroup.propTypes = {\n className: PropTypes.string,\n children: PropTypes.node.isRequired,\n label: PropTypes.string.isRequired,\n};\n\nexport function ComboboxGroup(_: ComboboxGroupProps): JSX.Element {\n throw Error('`ComboboxGroup` must be a child of a `Combobox` instance');\n}\n","import React, { useContext, useMemo } from 'react';\nimport isUndefined from 'lodash/isUndefined';\n\nimport { css, cx } from '@leafygreen-ui/emotion';\nimport { useAvailableSpace, useForwardedRef } from '@leafygreen-ui/hooks';\nimport Icon from '@leafygreen-ui/icon';\nimport { useDarkMode } from '@leafygreen-ui/leafygreen-provider';\nimport { palette } from '@leafygreen-ui/palette';\nimport Popover, { PortalControlProps } from '@leafygreen-ui/popover';\nimport { Error } from '@leafygreen-ui/typography';\n\nimport { ComboboxProps } from '../Combobox';\nimport { ComboboxContext } from '../ComboboxContext';\n\nimport {\n loadingIconStyle,\n menuBaseStyle,\n menuList,\n menuMessageBaseStyle,\n menuMessageSizeStyle,\n menuMessageThemeStyle,\n menuThemeStyle,\n popoverStyle,\n popoverThemeStyle,\n} from './Menu.styles';\n\ntype ComboboxMenuProps = {\n children?: React.ReactNode;\n refEl: React.RefObject<HTMLDivElement>;\n id: string;\n labelId: string;\n menuWidth: number;\n} & PortalControlProps &\n Pick<\n ComboboxProps<any>,\n | 'searchLoadingMessage'\n | 'searchErrorMessage'\n | 'searchEmptyMessage'\n | 'popoverZIndex'\n >;\n\nexport const ComboboxMenu = React.forwardRef<HTMLDivElement, ComboboxMenuProps>(\n (\n {\n children,\n id,\n refEl,\n labelId,\n menuWidth,\n searchLoadingMessage,\n searchErrorMessage,\n searchEmptyMessage,\n ...popoverProps\n }: ComboboxMenuProps,\n forwardedRef,\n ) => {\n const { darkMode, theme } = useDarkMode();\n const { disabled, size, isOpen, searchState } = useContext(ComboboxContext);\n const ref = useForwardedRef(forwardedRef, null);\n\n /** The max height of the menu element */\n const availableSpace = useAvailableSpace(refEl);\n const maxHeightValue = !isUndefined(availableSpace)\n ? `${Math.min(availableSpace, 256)}px`\n : 'unset';\n\n /**\n * The rendered menu JSX contents\n * Includes error, empty, search and default states\n */\n const renderedMenuContents = useMemo((): JSX.Element => {\n const messageStyles = cx(\n menuMessageBaseStyle,\n menuMessageThemeStyle[theme],\n menuMessageSizeStyle(size),\n );\n\n const errorMessageStyles = cx(\n menuMessageBaseStyle,\n menuMessageSizeStyle(size),\n );\n\n switch (searchState) {\n case 'loading': {\n return (\n <span className={messageStyles}>\n <Icon\n glyph=\"Refresh\"\n color={darkMode ? palette.blue.light1 : palette.blue.base}\n className={loadingIconStyle}\n />\n {searchLoadingMessage}\n </span>\n );\n }\n\n case 'error': {\n return (\n <Error className={errorMessageStyles}>\n <Icon\n glyph=\"Warning\"\n color={darkMode ? palette.red.light1 : palette.red.base}\n />\n <span>{searchErrorMessage}</span>\n </Error>\n );\n }\n\n case 'unset':\n default: {\n if (\n children &&\n typeof children === 'object' &&\n 'length' in children &&\n (children as Array<React.ReactNode>).length > 0\n ) {\n return <ul className={menuList}>{children}</ul>;\n }\n\n return <span className={messageStyles}>{searchEmptyMessage}</span>;\n }\n }\n }, [\n theme,\n size,\n searchState,\n darkMode,\n searchLoadingMessage,\n searchErrorMessage,\n children,\n searchEmptyMessage,\n ]);\n\n return (\n <Popover\n active={isOpen && !disabled}\n spacing={4}\n align=\"bottom\"\n justify=\"middle\"\n refEl={refEl}\n adjustOnMutation={true}\n className={cx(popoverStyle(menuWidth), popoverThemeStyle[theme])}\n {...popoverProps}\n >\n <div\n ref={ref}\n id={id}\n role=\"listbox\"\n aria-labelledby={labelId}\n aria-expanded={isOpen}\n className={cx(\n menuBaseStyle,\n menuThemeStyle[theme],\n css`\n max-height: ${maxHeightValue};\n `,\n )}\n onMouseDownCapture={e => e.preventDefault()}\n >\n {renderedMenuContents}\n </div>\n </Popover>\n );\n },\n);\n\nComboboxMenu.displayName = 'ComboboxMenu';\n","/**\n *\n * Checks if a bottom overflow shadow should be visible when overflow === expand-y\n *\n * @param element\n * @returns `boolean`\n * @internal\n */\nexport const checkScrollPosition = (element: HTMLElement) => {\n const { scrollHeight, scrollTop, clientHeight } = element;\n // Position when the container is scrolled all the way to the bottom\n const maxScrollPosition = scrollHeight - clientHeight;\n\n // If the scrollTop position is less than the maxScrollPosition then we will show the shadow.\n if (scrollTop < maxScrollPosition) {\n return true;\n }\n\n return false;\n};\n","import { css } from '@leafygreen-ui/emotion';\nimport { leftGlyphClassName } from '@leafygreen-ui/input-option';\nimport { Theme } from '@leafygreen-ui/lib';\nimport { palette } from '@leafygreen-ui/palette';\nimport { fontWeights, spacing } from '@leafygreen-ui/tokens';\n\nimport { fontSize, lineHeight } from '../ComboboxChip/ComboboxChip.styles';\nimport {\n getMenuItemHeight,\n menuItemPadding,\n} from '../ComboboxMenu/Menu.styles';\nimport { ComboboxSize } from '../types';\n\n/**\n * Styles\n */\n\nexport const comboboxOptionSizeStyle = (size: ComboboxSize) => css`\n font-size: ${fontSize[size]}px;\n line-height: ${lineHeight[size]}px;\n min-height: ${getMenuItemHeight(size)}px;\n padding: ${menuItemPadding[size].y}px ${menuItemPadding[size].x}px;\n gap: ${spacing[1]}px;\n\n &:before {\n max-height: ${getMenuItemHeight(size)}px;\n }\n`;\n\nexport const checkMarkSizeStyle: Record<ComboboxSize, string> = {\n [ComboboxSize.XSmall]: css`\n min-width: ${spacing[3]}px;\n `,\n [ComboboxSize.Small]: css`\n min-width: ${spacing[3]}px;\n `,\n [ComboboxSize.Default]: css`\n min-width: ${spacing[3]}px;\n `,\n [ComboboxSize.Large]: css`\n min-width: ${spacing[4]}px;\n `,\n};\n\nexport const checkBoxBaseStyles = css`\n pointer-events: none;\n gap: 0;\n\n label {\n gap: 0;\n align-items: center;\n }\n`;\n\nexport const disallowPointer = css`\n pointer-events: none;\n`;\n\nexport const displayNameStyle = (isSelected: boolean) => css`\n font-weight: ${isSelected ? fontWeights.bold : fontWeights.regular};\n`;\n\nexport const iconThemeStyles: Record<Theme, string> = {\n [Theme.Light]: css`\n color: ${palette.gray.dark1};\n `,\n [Theme.Dark]: css`\n color: ${palette.gray.base};\n `,\n};\n\nexport const iconHighlightedStyles: Record<Theme, string> = {\n [Theme.Light]: css`\n color: ${palette.blue.dark1};\n `,\n [Theme.Dark]: css`\n color: ${palette.blue.light3};\n `,\n};\n\nexport const iconDisabledStyles: Record<Theme, string> = {\n [Theme.Light]: css`\n color: ${palette.gray.light1};\n `,\n [Theme.Dark]: css`\n color: ${palette.gray.dark1};\n `,\n};\n\nexport const checkMarkThemeStyles: Record<Theme, string> = {\n [Theme.Light]: css`\n color: ${palette.blue.base};\n `,\n [Theme.Dark]: css`\n color: ${palette.blue.light1};\n `,\n};\n\nexport const checkMarkDisabledStyles: Record<Theme, string> = {\n [Theme.Light]: css`\n color: ${palette.gray.light1};\n `,\n [Theme.Dark]: css`\n color: ${palette.gray.dark1};\n `,\n};\n\nexport const multiselectIconPosition = css`\n .${leftGlyphClassName} {\n align-self: baseline;\n }\n`;\nexport const multiselectIconLargePosition = css`\n .${leftGlyphClassName} {\n height: 28px;\n }\n`;\n","import kebabCase from 'lodash/kebabCase';\n\nimport { ComboboxOptionProps } from '../ComboboxOption';\n\n/**\n *\n * Returns an object with properties `value` & `displayName`\n * based on the props provided\n *\n * @property value: string\n * @property displayName: string\n * @internal\n */\nexport const getNameAndValue = ({\n value: valProp,\n displayName: nameProp,\n}: ComboboxOptionProps): {\n value: string;\n displayName: string;\n} => {\n return {\n value: valProp ?? kebabCase(nameProp),\n displayName: nameProp ?? valProp ?? '', // TODO consider adding a prop to customize displayName => startCase(valProp),\n };\n};\n","import React from 'react';\n\nimport { isComponentType } from '@leafygreen-ui/lib';\n\nimport { OptionObject } from '../ComboboxOption';\n\nimport { getNameAndValue } from './getNameAndValue';\n\n/**\n *\n * Flattens multiple nested ComboboxOptions into a 1D array\n *\n * @param _children\n * @returns `Array<OptionObject>`\n * @internal\n */\nexport const flattenChildren = (\n _children: React.ReactNode,\n): Array<OptionObject> => {\n // TS doesn't like .reduce\n // @ts-expect-error\n return React.Children.toArray(_children).reduce(\n // @ts-expect-error\n (\n acc: Array<OptionObject>,\n child: React.ReactNode,\n ): Array<OptionObject> | undefined => {\n if (isComponentType(child, 'ComboboxOption')) {\n const { value, displayName } = getNameAndValue(child.props);\n const { glyph, disabled } = child.props;\n\n return [\n ...acc,\n {\n value,\n displayName,\n isDisabled: !!disabled,\n hasGlyph: !!glyph,\n },\n ];\n } else if (isComponentType(child, 'ComboboxGroup')) {\n const { children } = child.props;\n\n if (children) {\n return [...acc, ...flattenChildren(children)];\n }\n }\n },\n [] as Array<OptionObject>,\n );\n};\n","import { OptionObject } from '../ComboboxOption';\n/**\n *\n * @param value\n * @param options\n * @internal\n */\nexport const getOptionObjectFromValue = (\n value: string | null,\n options: Array<OptionObject>,\n): OptionObject | undefined => {\n if (value) return options.find(opt => opt.value === value);\n};\n\n/**\n *\n * @param value\n * @param options\n * @internal\n */\nexport const getDisplayNameForValue = (\n value: string | null,\n options: Array<OptionObject>,\n): string => {\n return value\n ? getOptionObjectFromValue(value, options)?.displayName ?? value\n : '';\n};\n\n/**\n *\n * @param value\n * @param options\n * @internal\n */\nexport const getValueForDisplayName = (\n displayName: string | null,\n options: Array<OptionObject>,\n): string => {\n return displayName\n ? options.find(opt => opt.displayName === displayName)?.value ?? displayName\n : '';\n};\n","import React, { useCallback, useContext, useMemo } from 'react';\nimport PropTypes from 'prop-types';\n\nimport { cx } from '@leafygreen-ui/emotion';\nimport { useForwardedRef, useIdAllocator } from '@leafygreen-ui/hooks';\nimport { InputOption, InputOptionContent } from '@leafygreen-ui/input-option';\nimport { useDarkMode } from '@leafygreen-ui/leafygreen-provider';\n\nimport { ComboboxContext } from '../ComboboxContext';\nimport { ComboboxSize } from '../types';\nimport { wrapJSX } from '../utils';\n\nimport {\n comboboxOptionSizeStyle,\n displayNameStyle,\n multiselectIconLargePosition,\n multiselectIconPosition,\n} from './ComboboxOption.styles';\nimport {\n ComboboxOptionProps,\n InternalComboboxOptionProps,\n} from './ComboboxOption.types';\nimport { getGlyphs } from './getGlyphs';\n\n/**\n * Internal ComboboxOption Component for use within Combobox only.\n *\n * Prefer using {@link ComboboxOption}\n * @internal\n */\nexport const InternalComboboxOption = React.forwardRef<\n HTMLLIElement,\n InternalComboboxOptionProps\n>(\n (\n {\n glyph,\n isSelected,\n displayName,\n isFocused,\n setSelected,\n className,\n description,\n value,\n onClick,\n disabled = false,\n ...rest\n }: InternalComboboxOptionProps,\n forwardedRef,\n ) => {\n const { darkMode, theme } = useDarkMode();\n const { multiselect, size, withIcons, inputValue } =\n useContext(ComboboxContext);\n const optionRef = useForwardedRef(forwardedRef, null);\n const optionTextId = useIdAllocator({ prefix: 'combobox-option-text' });\n\n const handleOptionClick = useCallback(\n (e: React.SyntheticEvent<HTMLLIElement, Event>) => {\n // stopPropagation will not stop the keyDown event (only click)\n // since the option is never `focused`, only `aria-selected`\n // the keyDown event does not actually fire on the option element\n e.stopPropagation();\n\n if (!disabled) {\n setSelected();\n onClick?.(e, value);\n }\n },\n [disabled, onClick, setSelected, value],\n );\n\n const { leftGlyph, rightGlyph } = useMemo(\n () =>\n getGlyphs({\n withIcons,\n isSelected,\n glyph,\n theme,\n darkMode,\n size,\n disabled,\n multiselect,\n optionTextId,\n isFocused,\n }),\n [\n darkMode,\n disabled,\n glyph,\n isSelected,\n multiselect,\n optionTextId,\n size,\n theme,\n withIcons,\n isFocused,\n ],\n );\n\n // When multiselect and withoutIcons the Checkbox is aligned to the top instead of centered.\n const multiSelectWithoutIcons = multiselect && !withIcons;\n\n return (\n <InputOption\n {...rest}\n as=\"li\"\n ref={optionRef}\n highlighted={isFocused}\n disabled={disabled}\n aria-label={displayName}\n darkMode={darkMode}\n className={cx(\n comboboxOptionSizeStyle(size),\n {\n [multiselectIconPosition]: multiSelectWithoutIcons,\n [multiselectIconLargePosition]:\n multiSelectWithoutIcons && size === ComboboxSize.Large,\n },\n className,\n )}\n onClick={handleOptionClick}\n onKeyDown={handleOptionClick}\n >\n <InputOptionContent\n leftGlyph={leftGlyph}\n rightGlyph={rightGlyph}\n description={description}\n >\n <span id={optionTextId} className={displayNameStyle(isSelected)}>\n {wrapJSX(displayName, inputValue, 'strong')}\n </span>\n </InputOptionContent>\n </InputOption>\n );\n },\n);\nInternalComboboxOption.displayName = 'ComboboxOption';\n\nexport function ComboboxOption(_: ComboboxOptionProps): JSX.Element {\n throw Error('`ComboboxOption` must be a child of a `Combobox` instance');\n}\nComboboxOption.displayName = 'ComboboxOption';\n\nComboboxOption.propTypes = {\n displayName: PropTypes.string,\n value: PropTypes.string,\n glyph: PropTypes.node,\n disabled: PropTypes.bool,\n className: PropTypes.string,\n description: PropTypes.string,\n onClick: PropTypes.func,\n};\n","import React, { ReactElement } from 'react';\n\nimport Checkbox from '@leafygreen-ui/checkbox';\nimport { cx } from '@leafygreen-ui/emotion';\nimport Icon, { isComponentGlyph } from '@leafygreen-ui/icon';\nimport { Theme } from '@leafygreen-ui/lib';\n\nimport { ComboboxSize } from '../types';\n\nimport {\n checkBoxBaseStyles,\n checkMarkDisabledStyles,\n checkMarkSizeStyle,\n checkMarkThemeStyles,\n iconDisabledStyles,\n iconHighlightedStyles,\n iconThemeStyles,\n} from './ComboboxOption.styles';\n\n/**\n * Util that returns the leftGlyph and rightGlyph.\n */\nexport const getGlyphs = ({\n withIcons,\n isSelected,\n glyph,\n optionTextId,\n disabled,\n darkMode,\n size,\n multiselect,\n theme,\n isFocused,\n}: {\n withIcons: boolean;\n isSelected: boolean;\n glyph?: ReactElement;\n optionTextId: string;\n disabled: boolean;\n darkMode: boolean;\n size: ComboboxSize;\n multiselect: boolean;\n theme: Theme;\n isFocused: boolean;\n}) => {\n if (glyph && !isComponentGlyph(glyph)) {\n console.error(\n '`ComboboxOption` instance did not render icon because it is not a known glyph element.',\n glyph,\n );\n }\n\n const icon =\n glyph && isComponentGlyph(glyph) ? (\n React.cloneElement(glyph, {\n ...glyph.props,\n className: cx(\n iconThemeStyles[theme],\n {\n [iconHighlightedStyles[theme]]: isFocused,\n [iconDisabledStyles[theme]]: disabled,\n },\n glyph.props.className,\n ),\n })\n ) : (\n <></>\n );\n\n const checkBox = (\n <Checkbox\n aria-labelledby={optionTextId}\n checked={isSelected}\n tabIndex={-1}\n disabled={disabled}\n darkMode={darkMode}\n className={checkBoxBaseStyles}\n />\n );\n\n const checkMark = (\n <Icon\n glyph=\"Checkmark\"\n className={cx(checkMarkSizeStyle[size], checkMarkThemeStyles[theme], {\n [checkMarkDisabledStyles[theme]]: disabled,\n })}\n />\n );\n\n const multiSelectLeftGlyph = withIcons ? icon : checkBox;\n const multiSelectRightGlyph = withIcons && checkBox;\n\n const singleSelectLeftGlyph = withIcons\n ? icon\n : isSelected\n ? checkMark\n : null;\n const singleSelectRightGlyph = withIcons && isSelected && checkMark;\n\n const leftGlyph = multiselect ? multiSelectLeftGlyph : singleSelectLeftGlyph;\n const rightGlyph = multiselect\n ? multiSelectRightGlyph\n : singleSelectRightGlyph;\n\n return {\n leftGlyph,\n rightGlyph,\n };\n};\n","import React, { ReactChild } from 'react';\nimport escapeRegExp from 'lodash/escapeRegExp';\n\n/**\n *\n * Wraps every instance of `wrap` found in `str` in the provided `element`.\n *\n * E.g. `wrapJSX('Apple', 'ap', 'em') => <em>Ap</em>ple`\n *\n * @param str\n * @param wrap\n * @param element\n * @returns `JSX.Element`\n * @internal\n */\nexport const wrapJSX = (\n str: string,\n wrap?: string,\n element?: keyof HTMLElementTagNameMap,\n): JSX.Element => {\n if (wrap && element) {\n const cleanWrap = escapeRegExp(wrap);\n const regex = new RegExp(cleanWrap, 'gi');\n const matches = str.matchAll(regex);\n\n if (matches) {\n const outArray = str.split('') as Array<ReactChild>;\n\n /**\n * For every match, splice it into the \"string\",\n * wrapped in the React element\n */\n // Consider adding --downlevelIteration TS flag so we don't need Array.from\n for (const match of Array.from(matches)) {\n const matchIndex = match.index ?? -1;\n const matchContent = match[0];\n const matchLength = matchContent.length;\n const key = matchIndex + matchContent + matchLength;\n\n // We create a replacement array that's\n // the same length as the match we're deleting,\n // in order to keep the matchIndexes aligned\n // with the indexes of the output array\n const replacement = new Array<ReactChild>(matchLength).fill('');\n replacement[0] = React.createElement(element, { key }, matchContent);\n\n outArray.splice(matchIndex, matchLength, ...replacement);\n }\n\n return <>{outArray}</>;\n }\n\n return <>{str}</>;\n }\n\n return <>{str}</>;\n};\n","import isArray from 'lodash/isArray';\nimport isNull from 'lodash/isNull';\nimport isString from 'lodash/isString';\nimport isUndefined from 'lodash/isUndefined';\n\nimport { SelectValueType } from '../types';\n\nexport const doesSelectionExist = <M extends boolean>(\n selection?: SelectValueType<M> | null,\n): boolean => {\n return (\n !isUndefined(selection) &&\n !isNull(selection) &&\n (isString(selection) || (isArray(selection) && selection.length > 0))\n );\n};\n","import { transparentize } from 'polished';\n\nimport { css } from '@leafygreen-ui/emotion';\nimport { Theme } from '@leafygreen-ui/lib';\nimport { palette } from '@leafygreen-ui/palette';\nimport {\n focusRing,\n fontFamilies,\n spacing,\n transitionDuration,\n typeScales,\n} from '@leafygreen-ui/tokens';\n\nimport {\n chipClassName,\n chipWrapperPaddingY,\n fontSize,\n lineHeight,\n} from '../ComboboxChip/ComboboxChip.styles';\nimport { ComboboxSize as Size, Overflow } from '../types';\n\n/**\n * Util to get the chip height\n * `lineHeight + (2 * paddingY)`\n */\n// Rename the variable defined in chip styles\nconst inputHeight = (size: Size) => {\n return lineHeight[size] + 2 * chipWrapperPaddingY[size];\n};\n\n// Gap between each chip\nconst flexGap = 4;\n\n/**\n * The min-height of the combobox.\n */\nexport const wrapperHeight: Record<Size, number> = {\n [Size.XSmall]: 22,\n [Size.Small]: 28,\n [Size.Default]: 36,\n [Size.Large]: 48,\n};\n\n/**\n * Util that calculates the Y padding.\n * `(wrapperHeight - inputHeight(- (borderTop + borderBottom)) / 2`\n */\nconst getYPadding = (size: Size) => {\n return (wrapperHeight[size] - inputHeight(size) - 2) / 2;\n};\n\n/**\n * Size of combobox x & y padding (in px)\n * (wrapperHeight - inputHeight(- (borderTop + borderBottom)) / 2\n */\nexport const comboboxPadding: Record<\n Size,\n {\n y: number;\n xLeftWithChip: number;\n xLeftWithoutChip: number;\n xRight: number;\n }\n> = {\n [Size.XSmall]: {\n y: getYPadding(Size.XSmall),\n xLeftWithChip: 1,\n xLeftWithoutChip: 10,\n xRight: 4,\n },\n [Size.Small]: {\n y: getYPadding(Size.Small),\n xLeftWithChip: 4,\n xLeftWithoutChip: 10,\n xRight: 8,\n },\n [Size.Default]: {\n y: getYPadding(Size.Default),\n xLeftWithChip: 6,\n xLeftWithoutChip: 12,\n xRight: 12,\n },\n [Size.Large]: {\n y: getYPadding(Size.Large),\n xLeftWithChip: spacing[2] - 1,\n xLeftWithoutChip: spacing[2] - 1,\n xRight: spacing[2] - 1,\n },\n};\n\n/** Width of the clear icon (in px) */\nexport const clearButtonIconSize = 28;\n\n/** Width of the dropdown caret icon (in px) */\nexport const caretIconSize = spacing[3];\n\nexport const comboboxParentStyle = (size: Size): string => {\n return css`\n font-family: ${fontFamilies.default};\n width: 100%;\n min-width: ${fontSize[size] +\n 2 * comboboxPadding[size].xLeftWithChip +\n caretIconSize +\n 2}px;\n `;\n};\n\nexport const baseComboboxStyles = css`\n display: flex;\n align-items: center;\n gap: ${spacing[2]}px;\n cursor: text;\n transition: ${transitionDuration.default}ms ease-in-out;\n transition-property: background-color, box-shadow, border-color;\n border: 1px solid;\n width: 100%;\n max-width: 100%;\n border-radius: 6px;\n position: relative;\n overflow: hidden;\n\n // Overflow shadow\n ::after {\n content: '';\n position: absolute;\n width: 100%;\n height: 20px;\n bottom: -21px;\n left: 50%;\n translate: -50% 0%;\n border-radius: 20%;\n box-shadow: 0 0 0 0 rgb(255 255 255 / 0%);\n transition: ${transitionDuration.default}ms linear;\n transition-property: box-shadow;\n }\n`;\n\nexport const comboboxThemeStyles: Record<Theme, string> = {\n [Theme.Light]: css`\n color: ${palette.gray.dark3};\n background-color: ${palette.white};\n border-color: ${palette.gray.base};\n `,\n [Theme.Dark]: css`\n color: ${palette.gray.light2};\n background-color: ${palette.gray.dark4};\n border-color: ${palette.gray.base};\n `,\n};\n\nexport const comboboxSizeStyles = (\n size: Size,\n isMultiselectWithSelections: boolean,\n) => css`\n padding-top: ${comboboxPadding[size].y}px;\n padding-bottom: ${comboboxPadding[size].y}px;\n padding-left: ${isMultiselectWithSelections\n ? `${comboboxPadding[size].xLeftWithChip}px`\n : `${comboboxPadding[size].xLeftWithoutChip}px`};\n padding-right: ${comboboxPadding[size].xRight}px;\n`;\n\nexport const comboboxDisabledStyles: Record<Theme, string> = {\n [Theme.Light]: css`\n cursor: not-allowed;\n color: ${palette.gray.dark1};\n background-color: ${palette.gray.light2};\n border-color: ${palette.gray.light1};\n `,\n [Theme.Dark]: css`\n cursor: not-allowed;\n color: ${palette.gray.dark1};\n background-color: ${palette.gray.dark3};\n border-color: ${palette.gray.dark2};\n `,\n};\n\nexport const comboboxErrorStyles: Record<Theme, string> = {\n [Theme.Light]: css`\n border-color: ${palette.red.base};\n `,\n [Theme.Dark]: css`\n border-color: ${palette.red.light1};\n `,\n};\n\nexport const comboboxFocusStyle: Record<Theme, string> = {\n [Theme.Light]: css`\n &:focus-within {\n border-color: transparent;\n box-shadow: ${focusRing[Theme.Light].input};\n }\n `,\n [Theme.Dark]: css`\n &:focus-within {\n border-color: transparent;\n box-shadow: ${focusRing[Theme.Dark].input};\n }\n `,\n};\n\nexport const iconsWrapperBaseStyles = css`\n display: flex;\n align-items: center;\n`;\n\nexport const iconsWrapperSizeStyles: Record<Size, string> = {\n [Size.XSmall]: css`\n gap: ${spacing[1]}px;\n `,\n [Size.Small]: css`\n gap: ${spacing[2]}px;\n `,\n [Size.Default]: css`\n gap: ${spacing[2]}px;\n `,\n [Size.Large]: css`\n gap: ${spacing[2]}px;\n `,\n};\n\nexport const inputWrapperStyle = ({\n overflow,\n size,\n}: {\n overflow: Overflow;\n size: Size;\n}) => {\n const baseWrapperStyle = css`\n flex-grow: 1;\n width: 100%;\n `;\n\n switch (overflow) {\n case Overflow.scrollX: {\n return css`\n ${baseWrapperStyle}\n display: block;\n height: ${inputHeight(size)}px;\n white-space: nowrap;\n overflow-x: scroll;\n scroll-behavior: smooth;\n scrollbar-width: none;\n line-height: 1;\n\n &::-webkit-scrollbar {\n display: none;\n }\n\n & > .${chipClassName} {\n margin-inline: 2px;\n\n &:first-child {\n margin-inline-start: 0;\n }\n\n &:last-child {\n margin-inline-end: 0;\n }\n }\n `;\n }\n\n // TODO - look into animating input element height on wrap\n case Overflow.expandY: {\n return css`\n ${baseWrapperStyle}\n display: flex;\n flex-wrap: wrap;\n gap: ${flexGap}px;\n overflow-x: hidden;\n min-height: ${inputHeight(size)}px;\n max-height: calc((${inputHeight(size) * 3}px) + (${flexGap}px * 2));\n `;\n }\n }\n};\n\nexport const baseInputElementStyle = css`\n font-family: ${fontFamilies.default};\n width: 100%;\n border: none;\n cursor: inherit;\n background-color: inherit;\n color: inherit;\n box-sizing: content-box;\n padding: 0;\n margin: 0;\n text-overflow: ellipsis;\n vertical-align: top;\n\n // Only add padding if there are chips\n &:not(:first-child) {\n padding-left: ${spacing[1]}px;\n }\n\n &:placeholder-shown {\n min-width: 100%;\n }\n &:focus {\n outline: none;\n }\n`;\n\nexport const inputElementThemeStyle: Record<Theme, string> = {\n [Theme.Light]: css`\n &::placeholder {\n color: ${palette.gray.dark1};\n }\n `,\n [Theme.Dark]: css`\n &::placeholder {\n color: ${palette.gray.light1};\n }\n `,\n};\n\nexport const inputElementDisabledThemeStyle: Record<Theme, string> = {\n [Theme.Light]: css`\n &::placeholder {\n color: ${palette.gray.dark1};\n }\n `,\n [Theme.Dark]: css`\n &::placeholder {\n color: ${palette.gray.dark1};\n }\n `,\n};\n\nexport const inputElementSizeStyle = (size: Size) => css`\n height: ${inputHeight(size)}px;\n font-size: ${fontSize[size]}px;\n line-height: ${lineHeight[size]}px;\n min-width: ${fontSize[size]}px;\n`;\n\nexport const inputElementTransitionStyles = (isOpen: boolean) => css`\n /*\n * Immediate transition in, slow transition out. \n * '-in' transition is handled by \\`scroll-behavior\\` \n */\n transition: width ease-in-out ${isOpen ? '0s' : '100ms'};\n`;\n\n// Previously defined in inputWrapperStyle\n/** Should only be applied to a multiselect */\nexport const multiselectInputElementStyle = (\n size: Size,\n inputValue?: string,\n) => {\n const inputLength = inputValue?.length ?? 0;\n return css`\n width: ${inputLength * fontSize[size]}px;\n max-width: 100%;\n `;\n};\n\nexport const clearButtonStyle = css`\n // Add a negative margin so the button takes up the same space as the regular icons\n margin-block: calc(${caretIconSize / 2}px - 100%);\n margin-inline: -6px;\n`;\n\nexport const endIconStyle = css`\n height: ${caretIconSize}px;\n width: ${caretIconSize}px;\n`;\n\nexport const errorMessageThemeStyle: Record<Theme, string> = {\n [Theme.Light]: css`\n color: ${palette.red.base};\n `,\n [Theme.Dark]: css`\n color: ${palette.red.light1};\n `,\n};\n\nexport const errorMessageSizeStyle = (size: Size) => css`\n font-size: ${fontSize[size]}px;\n line-height: ${lineHeight[size]}px;\n padding-top: ${comboboxPadding[size].y}px;\n`;\n\nexport const labelDescriptionContainerStyle = css`\n margin-bottom: ${spacing[1]}px;\n display: flex;\n flex-direction: column;\n`;\n\nexport const labelDescriptionLargeStyles = css`\n font-size: ${typeScales.large.fontSize}px;\n line-height: ${typeScales.large.lineHeight}px;\n`;\n\nexport const comboboxOverflowShadowStyles: Record<Theme, string> = {\n [Theme.Light]: css`\n ::after {\n box-shadow: 0px 0px 7px 5px ${transparentize(0.85, palette.black)};\n }\n `,\n [Theme.Dark]: css`\n ::after {\n width: 95%;\n box-shadow: 0px -7px 12px 5px rgb(0 0 0 / 50%);\n }\n `,\n};\n\nexport const errorIconThemeStyles: Record<Theme, string> = {\n [Theme.Light]: palette.red.base,\n [Theme.Dark]: palette.red.light1,\n};\n\nexport const caretIconThemeStyles: Record<Theme, string> = {\n [Theme.Light]: palette.gray.dark2,\n [Theme.Dark]: palette.gray.light1,\n};\n\nexport const caretIconDisabledStyles: Record<Theme, string> = {\n [Theme.Light]: palette.gray.base,\n [Theme.Dark]: palette.gray.dark1,\n};\n","import React, {\n ChangeEventHandler,\n FocusEventHandler,\n KeyboardEventHandler,\n MouseEventHandler,\n TransitionEventHandler,\n UIEvent,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport clone from 'lodash/clone';\nimport debounce from 'lodash/debounce';\nimport isArray from 'lodash/isArray';\nimport isEqual from 'lodash/isEqual';\nimport isNull from 'lodash/isNull';\nimport isString from 'lodash/isString';\nimport isUndefined from 'lodash/isUndefined';\nimport PropTypes from 'prop-types';\n\nimport { cx } from '@leafygreen-ui/emotion';\nimport {\n useAutoScroll,\n useBackdropClick,\n useDynamicRefs,\n useIdAllocator,\n usePrevious,\n} from '@leafygreen-ui/hooks';\nimport Icon from '@leafygreen-ui/icon';\nimport IconButton from '@leafygreen-ui/icon-button';\nimport LeafyGreenProvider, {\n useDarkMode,\n} from '@leafygreen-ui/leafygreen-provider';\nimport { consoleOnce, isComponentType, keyMap } from '@leafygreen-ui/lib';\nimport { Description, Label } from '@leafygreen-ui/typography';\n\nimport { ComboboxChip } from '../ComboboxChip';\nimport { ComboboxContext } from '../ComboboxContext';\nimport { InternalComboboxGroup } from '../ComboboxGroup';\nimport { ComboboxMenu } from '../ComboboxMenu';\nimport { OptionObject } from '../ComboboxOption';\nimport { InternalComboboxOption } from '../ComboboxOption';\nimport {\n ComboboxElement,\n ComboboxSize,\n DiffObject,\n getNullSelection,\n onChangeType,\n Overflow,\n SearchState,\n SelectValueType,\n State,\n TruncationLocation,\n} from '../types';\nimport {\n checkScrollPosition,\n flattenChildren,\n getDisplayNameForValue,\n getNameAndValue,\n getOptionObjectFromValue,\n getValueForDisplayName,\n} from '../utils';\nimport { doesSelectionExist } from '../utils/doesSelectionExist';\n\nimport { isValueCurrentSelection } from './utils/isValueCurrentSelection';\nimport {\n baseComboboxStyles,\n baseInputElementStyle,\n caretIconDisabledStyles,\n caretIconThemeStyles,\n clearButtonStyle,\n comboboxDisabledStyles,\n comboboxErrorStyles,\n comboboxFocusStyle,\n comboboxOverflowShadowStyles,\n comboboxParentStyle,\n comboboxSizeStyles,\n comboboxThemeStyles,\n endIconStyle,\n errorIconThemeStyles,\n errorMessageSizeStyle,\n errorMessageThemeStyle,\n iconsWrapperBaseStyles,\n iconsWrapperSizeStyles,\n inputElementDisabledThemeStyle,\n inputElementSizeStyle,\n inputElementThemeStyle,\n inputElementTransitionStyles,\n inputWrapperStyle,\n labelDescriptionContainerStyle,\n labelDescriptionLargeStyles,\n multiselectInputElementStyle,\n} from './Combobox.styles';\nimport { ComboboxProps } from './Combobox.types';\n\n/**\n * Combobox is a combination of a Select and TextInput,\n * allowing the user to either type a value directly or select a value from the list.\n * Can be configured to select a single or multiple options.\n */\nexport function Combobox<M extends boolean>({\n children,\n label,\n description,\n placeholder = 'Select',\n 'aria-label': ariaLabel,\n disabled = false,\n size = ComboboxSize.Default,\n darkMode: darkModeProp,\n state = 'none',\n errorMessage,\n searchState = 'unset',\n searchEmptyMessage = 'No results found',\n searchErrorMessage = 'Could not get results!',\n searchLoadingMessage = 'Loading results...',\n filteredOptions,\n onFilter,\n clearable = true,\n onClear,\n overflow = Overflow.expandY,\n multiselect = false as M,\n initialValue,\n inputValue: inputValueProp,\n onInputChange,\n onChange,\n value,\n chipTruncationLocation,\n chipCharacterLimit = 12,\n className,\n usePortal = true,\n portalClassName,\n portalContainer,\n scrollContainer,\n popoverZIndex,\n ...rest\n}: ComboboxProps<M>) {\n const { darkMode, theme } = useDarkMode(darkModeProp);\n const getOptionRef = useDynamicRefs<HTMLLIElement>({ prefix: 'option' });\n const getChipRef = useDynamicRefs<HTMLSpanElement>({ prefix: 'chip' });\n\n const inputId = useIdAllocator({ prefix: 'combobox-input' });\n const labelId = useIdAllocator({ prefix: 'combobox-label' });\n const menuId = useIdAllocator({ prefix: 'combobox-menu' });\n\n const comboboxRef = useRef<HTMLDivElement>(null);\n const clearButtonRef = useRef<HTMLButtonElement>(null);\n const inputWrapperRef = useRef<HTMLDivElement>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n const menuRef = useRef<HTMLDivElement>(null);\n\n const [isOpen, setOpen] = useState(false);\n const wasOpen = usePrevious(isOpen);\n const [highlightedOption, setHighlightedOption] = useState<string | null>(\n null,\n );\n const [selection, setSelection] = useState<SelectValueType<M> | null>(null);\n const prevSelection = usePrevious(selection);\n const [inputValue, setInputValue] = useState<string>(inputValueProp ?? '');\n\n useEffect(() => {\n if (!isUndefined(inputValueProp)) {\n setInputValue(inputValueProp);\n }\n }, [inputValueProp]);\n\n const updateInputValue = (newInputVal: string) => {\n setInputValue(newInputVal);\n };\n\n const prevValue = usePrevious(inputValue);\n const [focusedChip, setFocusedChip] = useState<string | null>(null);\n const [shouldShowOverflowShadow, setShouldShowOverflowShadow] =\n useState<boolean>(false);\n\n const placeholderValue =\n multiselect && isArray(selection) && selection.length > 0\n ? undefined\n : placeholder;\n\n const closeMenu = () => setOpen(false);\n const openMenu = () => setOpen(true);\n\n /**\n * Array of all of the options objects\n */\n const allOptions: Array<OptionObject> = useMemo(\n () => flattenChildren(children),\n [children],\n );\n\n /**\n * Utility function that tells Typescript whether selection is multiselect\n */\n const isMultiselect = useCallback(\n <T extends string>(val?: Array<T> | T | null): val is Array<T> => {\n if (multiselect && (typeof val == 'string' || typeof val == 'number')) {\n consoleOnce.error(\n `Error in Combobox: multiselect is set to \\`true\\`, but received a ${typeof val} value: \"${val}\"`,\n );\n } else if (!multiselect && isArray(val)) {\n consoleOnce.error(\n 'Error in Combobox: multiselect is set to `false`, but received an Array value',\n );\n }\n\n return multiselect && isArray(val);\n },\n [multiselect],\n );\n\n /**\n * Forces focus of input box\n * @param cursorPos index the cursor should be set to\n */\n const setInputFocus = useCallback(\n (cursorPos?: number) => {\n if (!disabled && inputRef && inputRef.current) {\n inputRef.current.focus();\n if (!isUndefined(cursorPos)) {\n inputRef.current.setSelectionRange(cursorPos, cursorPos);\n }\n }\n },\n [disabled],\n );\n\n /**\n * Update selection.\n * This behaves differently in multi. vs single select.\n * @param value option value the selection should be set to\n */\n const updateSelection = useCallback(\n (value: string | null) => {\n if (isMultiselect(selection)) {\n // We know M is true here\n const newSelection: SelectValueType<true> = clone(selection);\n const multiselectOnChange = onChange as onChangeType<true>;\n const diff: DiffObject = {\n diffType: 'delete',\n value: value ?? selection,\n };\n\n if (isNull(value)) {\n newSelection.length = 0;\n } else {\n if (selection.includes(value)) {\n // remove from array\n newSelection.splice(newSelection.indexOf(value), 1);\n } else {\n // add to array\n newSelection.push(value);\n diff.diffType = 'insert';\n // clear text\n updateInputValue('');\n }\n }\n setSelection(newSelection as SelectValueType<M>);\n multiselectOnChange?.(newSelection, diff);\n } else {\n const newSelection: SelectValueType<false> = value;\n const singleSelectOnChange = onChange as onChangeType<false>;\n setSelection(newSelection as SelectValueType<M>);\n singleSelectOnChange?.(newSelection);\n }\n },\n [isMultiselect, onChange, selection],\n );\n\n /**\n * Returns whether given text is included in, or equal to, the current selection.\n * Similar to `isValueCurrentSelection`, but assumes the text argument is the `displayName` for the selection\n * @param text the text to check\n */\n const isTextCurrentSelection = useCallback(\n (text: string): boolean => {\n const value = getValueForDisplayName(text, allOptions);\n return isValueCurrentSelection(value, selection);\n },\n [allOptions, selection],\n );\n\n /**\n * Returns whether the provided option is disabled\n * @param option the option value or OptionObject to check\n */\n const isOptionDisabled = (option: string | OptionObject): boolean => {\n if (typeof option === 'string') {\n const optionObj = getOptionObjectFromValue(option, allOptions);\n return !!optionObj?.isDisabled;\n } else {\n return !!option.isDisabled;\n }\n };\n\n /**\n * Computes whether the option is visible based on the current input\n * @param option the option value or OptionObject to compute\n */\n const shouldOptionBeVisible = useCallback(\n (option: string | OptionObject): boolean => {\n const value = typeof option === 'string' ? option : option.value;\n\n // If filtered options are provided\n if (filteredOptions && filteredOptions.length > 0) {\n return filteredOptions.includes(value);\n }\n\n // If the text input value is the current selection\n // (or included in the selection)\n // then all options should be visible\n if (isTextCurrentSelection(inputValue)) {\n return true;\n }\n\n // otherwise, we do our own filtering\n const displayName =\n typeof option === 'string'\n ? getDisplayNameForValue(value, allOptions)\n : option.displayName;\n\n const isValueInDisplayName = displayName\n .toLowerCase()\n .includes(inputValue.toLowerCase());\n\n return isValueInDisplayName;\n },\n [filteredOptions, isTextCurrentSelection, inputValue, allOptions],\n );\n\n /**\n * The array of visible options objects\n */\n const visibleOptions: Array<OptionObject> = useMemo(\n () => allOptions.filter(shouldOptionBeVisible),\n [allOptions, shouldOptionBeVisible],\n );\n\n /**\n * Returns whether the given value is in the options array\n * @param value the value to check\n */\n const isValueValid = useCallback(\n (value: string | null): boolean => {\n return value ? !!allOptions.find(opt => opt.value === value) : false;\n },\n [allOptions],\n );\n\n /**\n * Returns the index of a given value in the array of visible (filtered) options\n * @param value the option value to get the index of\n */\n const getIndexOfValue = useCallback(\n (value: string | null): number => {\n return visibleOptions\n ? visibleOptions.findIndex(option => option.value === value)\n : -1;\n },\n [visibleOptions],\n );\n\n /**\n * Returns the option value of a given index in the array of visible (filtered) options\n * @param index the option index to get the value of\n */\n const getValueAtIndex = useCallback(\n (index: number): string | undefined => {\n if (visibleOptions && visibleOptions.length >= index) {\n const option = visibleOptions[index];\n return option ? option.value : undefined;\n }\n },\n [visibleOptions],\n );\n\n /**\n * Returns the index of the active chip in the selection array\n */\n const getActiveChipIndex = useCallback(\n () =>\n isMultiselect(selection)\n ? selection.findIndex(value =>\n getChipRef(value)?.current?.contains(document.activeElement),\n )\n : -1,\n [getChipRef, isMultiselect, selection],\n );\n\n /**\n *\n * Focus Management\n *\n */\n\n const [focusedElementName, trackFocusedElement] = useState<\n ComboboxElement | undefined\n >();\n const isElementFocused = (elementName: ComboboxElement) =>\n elementName === focusedElementName;\n\n type Direction = 'next' | 'prev' | 'first' | 'last';\n\n /**\n * Updates the highlighted menu option based on the provided direction\n * @param direction the direction to move the focus. `'next' | 'prev' | 'first' | 'last'`\n */\n const updateHighlightedOption = useCallback(\n (direction: Direction) => {\n const optionsCount = visibleOptions?.length ?? 0;\n const lastIndex = optionsCount - 1 > 0 ? optionsCount - 1 : 0;\n const indexOfHighlight = getIndexOfValue(highlightedOption);\n\n // Remove focus from chip\n if (direction && isOpen) {\n setFocusedChip(null);\n setInputFocus();\n }\n\n switch (direction) {\n case 'next': {\n const newValue =\n indexOfHighlight + 1 < optionsCount\n ? getValueAtIndex(indexOfHighlight + 1)\n : getValueAtIndex(0);\n\n setHighlightedOption(newValue ?? null);\n break;\n }\n\n case 'prev': {\n const newValue =\n indexOfHighlight - 1 >= 0\n ? getValueAtIndex(indexOfHighlight - 1)\n : getValueAtIndex(lastIndex);\n\n setHighlightedOption(newValue ?? null);\n break;\n }\n\n case 'last': {\n const newValue = getValueAtIndex(lastIndex);\n setHighlightedOption(newValue ?? null);\n break;\n }\n\n case 'first':\n default: {\n const newValue = getValueAtIndex(0);\n setHighlightedOption(newValue ?? null);\n }\n }\n },\n [\n highlightedOption,\n getIndexOfValue,\n getValueAtIndex,\n isOpen,\n setInputFocus,\n visibleOptions?.length,\n ],\n );\n\n /**\n * Updates the focused chip based on the provided direction\n * @param direction the direction to move the focus. `'next' | 'prev' | 'first' | 'last'`\n * @param relativeToIndex the chip index to move focus relative to\n */\n const updateFocusedChip = useCallback(\n (direction: Direction | null, relativeToIndex?: number) => {\n if (isMultiselect(selection)) {\n switch (direction) {\n case 'next': {\n const referenceChipIndex = relativeToIndex ?? getActiveChipIndex();\n const nextChipIndex =\n referenceChipIndex + 1 < selection.length\n ? referenceChipIndex + 1\n : selection.length - 1;\n const nextChipValue = selection[nextChipIndex];\n setFocusedChip(nextChipValue);\n break;\n }\n\n case 'prev': {\n const referenceChipIndex = relativeToIndex ?? getActiveChipIndex();\n const prevChipIndex =\n referenceChipIndex > 0\n ? referenceChipIndex - 1\n : referenceChipIndex < 0\n ? selection.length - 1\n : 0;\n const prevChipValue = selection[prevChipIndex];\n setFocusedChip(prevChipValue);\n break;\n }\n\n case 'first': {\n const firstChipValue = selection[0];\n setFocusedChip(firstChipValue);\n break;\n }\n\n case 'last': {\n const lastChipValue = selection[selection.length - 1];\n setFocusedChip(lastChipValue);\n break;\n }\n\n default:\n setFocusedChip(null);\n break;\n }\n }\n },\n [getActiveChipIndex, isMultiselect, selection],\n );\n\n /**\n * Handles an arrow key press\n */\n const handleArrowKey = useCallback(\n (direction: 'left' | 'right', event: React.KeyboardEvent<Element>) => {\n // Remove focus from menu\n if (direction) setHighlightedOption(null);\n\n switch (direction) {\n case 'right':\n switch (focusedElementName) {\n case ComboboxElement.Input: {\n // If cursor is at the end of the input\n if (\n inputRef.current?.selectionEnd ===\n inputRef.current?.value.length\n ) {\n clearButtonRef.current?.focus();\n }\n break;\n }\n\n case ComboboxElement.FirstChip:\n case ComboboxElement.MiddleChip:\n case ComboboxElement.LastChip: {\n if (\n focusedElementName === ComboboxElement.LastChip ||\n // the first chip is also the last chip (i.e. only one)\n selection?.length === 1\n ) {\n // if focus is on last chip, go to input\n setInputFocus(0);\n updateFocusedChip(null);\n event.preventDefault();\n break;\n }\n // First/middle chips\n updateFocusedChip('next');\n break;\n }\n\n case ComboboxElement.ClearButton:\n default:\n break;\n }\n break;\n\n case 'left':\n switch (focusedElementName) {\n case ComboboxElement.ClearButton: {\n event.preventDefault();\n setInputFocus(inputRef?.current?.value.length);\n break;\n }\n\n case ComboboxElement.Input:\n case ComboboxElement.MiddleChip:\n case ComboboxElement.LastChip: {\n if (isMultiselect(selection)) {\n // Break if cursor is not at the start of the input\n if (\n focusedElementName === ComboboxElement.Input &&\n inputRef.current?.selectionStart !== 0\n ) {\n break;\n }\n\n updateFocusedChip('prev');\n }\n break;\n }\n\n case ComboboxElement.FirstChip:\n default:\n break;\n }\n break;\n default:\n updateFocusedChip(null);\n break;\n }\n },\n [\n focusedElementName,\n isMultiselect,\n selection,\n setInputFocus,\n updateFocusedChip,\n ],\n );\n\n // When the input value changes (or when the menu opens)\n // Update the focused option\n useEffect(() => {\n if (inputValue !== prevValue) {\n updateHighlightedOption('first');\n }\n }, [inputValue, isOpen, prevValue, updateHighlightedOption]);\n\n // When the focused option changes, update the menu scroll if necessary\n useAutoScroll(\n highlightedOption ? getOptionRef(highlightedOption) : undefined,\n menuRef,\n );\n\n /**\n * Rendering\n */\n\n /**\n * Callback to render a child as an <InternalComboboxOption> element\n */\n const renderOption = useCallback(\n (child: React.ReactNode) => {\n if (isComponentType(child, 'ComboboxOption')) {\n const { value, displayName } = getNameAndValue(child.props);\n\n if (shouldOptionBeVisible(value)) {\n const { className, glyph, disabled, ...rest } = child.props;\n const index = allOptions.findIndex(opt => opt.value === value);\n\n const isFocused = highlightedOption === value;\n const isSelected = isMultiselect(selection)\n ? selection.includes(value)\n : selection === value;\n\n const setSelected = () => {\n setHighlightedOption(value);\n updateSelection(value);\n setInputFocus();\n\n if (value === selection) {\n closeMenu();\n }\n };\n\n const optionRef = getOptionRef(value);\n\n return (\n <InternalComboboxOption\n {...rest}\n value={value}\n displayName={displayName}\n isFocused={isFocused}\n isSelected={isSelected}\n disabled={disabled}\n setSelected={setSelected}\n glyph={glyph}\n className={className}\n index={index}\n ref={optionRef}\n />\n );\n }\n } else if (isComponentType(child, 'ComboboxGroup')) {\n const nestedChildren = React.Children.map(\n child.props.children,\n renderOption,\n );\n\n if (nestedChildren && nestedChildren?.length > 0) {\n return (\n <InternalComboboxGroup\n label={child.props.label}\n className={child.props.className}\n >\n {React.Children.map(nestedChildren, renderOption)}\n </InternalComboboxGroup>\n );\n }\n }\n },\n [\n allOptions,\n getOptionRef,\n highlightedOption,\n isMultiselect,\n selection,\n setInputFocus,\n shouldOptionBeVisible,\n updateSelection,\n ],\n );\n\n /**\n * The rendered JSX elements for the options\n */\n const renderedOptionsJSX = useMemo(\n () => React.Children.map(children, renderOption),\n [children, renderOption],\n );\n\n /**\n * The rendered JSX for the selection Chips\n */\n const renderedChips = useMemo(() => {\n if (isMultiselect(selection)) {\n return selection.filter(isValueValid).map((value, index) => {\n const displayName = getDisplayNameForValue(value, allOptions);\n const isFocused = focusedChip === value;\n const chipRef = getChipRef(value);\n const isLastChip = index >= selection.length - 1;\n\n const onRemove = () => {\n if (isLastChip) {\n // Focus the input if this is the last chip in the set\n setInputFocus();\n updateFocusedChip(null);\n } else {\n updateFocusedChip('next', index);\n }\n updateSelection(value);\n };\n\n const onFocus = () => {\n setFocusedChip(value);\n };\n\n return (\n <ComboboxChip\n key={value}\n displayName={displayName}\n isFocused={isFocused}\n onRemove={onRemove}\n onFocus={onFocus}\n ref={chipRef}\n />\n );\n });\n }\n }, [\n isMultiselect,\n selection,\n isValueValid,\n allOptions,\n focusedChip,\n getChipRef,\n updateSelection,\n setInputFocus,\n updateFocusedChip,\n ]);\n\n /**\n * Flag to determine whether the rendered options have icons\n */\n const withIcons = useMemo(\n () => allOptions.some(opt => opt.hasGlyph),\n [allOptions],\n );\n\n /**\n *`\n * Selection Management\n *\n */\n\n const onCloseMenu = useCallback(() => {\n const exactMatchedOption = visibleOptions.find(\n option =>\n option.displayName === inputValue || option.value === inputValue,\n );\n\n // check if inputValue is matches a valid option\n // Set the selection to that value if the component is not controlled\n if (!value && exactMatchedOption) {\n updateSelection(exactMatchedOption.value);\n } else {\n if (!isMultiselect(selection)) {\n // Revert the value to the previous selection\n const displayName =\n getDisplayNameForValue(\n selection as SelectValueType<false>,\n allOptions,\n ) ?? prevSelection;\n updateInputValue(displayName);\n }\n }\n }, [\n allOptions,\n inputValue,\n isMultiselect,\n prevSelection,\n selection,\n updateSelection,\n value,\n visibleOptions,\n ]);\n\n /**\n * Side effects to run when the selection changes\n */\n const onSelect = useCallback(() => {\n if (doesSelectionExist(selection)) {\n if (isMultiselect(selection)) {\n scrollInputToEnd(overflow);\n } else if (!isMultiselect(selection)) {\n // Update the text input\n const displayName =\n getDisplayNameForValue(\n selection as SelectValueType<false>,\n allOptions,\n ) ?? '';\n updateInputValue(displayName);\n closeMenu();\n }\n } else {\n updateInputValue('');\n }\n }, [allOptions, isMultiselect, selection, overflow]);\n\n // Set the initialValue\n useEffect(() => {\n if (initialValue) {\n if (isArray(initialValue)) {\n // Ensure the values we set are real options\n const filteredValue =\n initialValue.filter(value => isValueValid(value)) ?? [];\n setSelection(filteredValue as SelectValueType<M>);\n } else {\n if (isValueValid(initialValue as string)) {\n setSelection(initialValue);\n }\n }\n } else {\n setSelection(getNullSelection(multiselect));\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // When controlled value changes, update the selection\n // TODO: use useControlledValue\n useEffect(() => {\n if (!isUndefined(value) && value !== prevValue) {\n if (isNull(value)) {\n setSelection(null);\n } else if (isMultiselect(value)) {\n // Ensure the value(s) passed in are valid options\n const newSelection = value.filter(isValueValid) as SelectValueType<M>;\n setSelection(newSelection);\n } else {\n setSelection(\n isValueValid(value as SelectValueType<false>) ? value : null,\n );\n }\n }\n }, [isMultiselect, isValueValid, prevValue, value]);\n\n // onSelect\n // Side effects to run when the selection changes\n useEffect(() => {\n const hasSelectionChanged =\n !isUndefined(prevSelection) &&\n ((isArray(selection) && !isNull(prevSelection)) ||\n isString(selection) ||\n isNull(selection)) &&\n !isEqual(selection, prevSelection);\n\n if (hasSelectionChanged) {\n onSelect();\n }\n }, [onSelect, prevSelection, selection]);\n\n // when the menu closes, update the value if needed\n useEffect(() => {\n if (!isOpen && wasOpen) {\n onCloseMenu();\n }\n }, [isOpen, wasOpen, onCloseMenu]);\n\n /**\n *\n * Menu management\n *\n */\n\n const [menuWidth, setMenuWidth] = useState(0);\n\n // When the menu opens, or the selection changes, or the focused option changes\n // update the menu width\n useEffect(() => {\n setMenuWidth(comboboxRef.current?.clientWidth ?? 0);\n }, [comboboxRef, isOpen, highlightedOption, selection]);\n\n /**\n *\n * Event Handlers\n *\n */\n\n // Handler fired when the menu has finished transitioning in/out\n const handleTransitionEnd: TransitionEventHandler<HTMLDivElement> = () => {\n setMenuWidth(comboboxRef.current?.clientWidth ?? 0);\n };\n\n // Prevent combobox from gaining focus by default\n const handleInputWrapperMousedown: MouseEventHandler<HTMLDivElement> = e => {\n if (disabled) {\n e.preventDefault();\n }\n };\n\n // Set focus to the input element on click\n const handleComboboxClick: MouseEventHandler<HTMLDivElement> = e => {\n // If we clicked the wrapper, not the input itself.\n // (Focus is set automatically if the click is on the input)\n if (e.target !== inputRef.current) {\n let cursorPos = 0;\n\n if (inputRef.current) {\n const mouseX = e.nativeEvent.offsetX;\n const inputRight =\n inputRef.current.offsetLeft + inputRef.current.clientWidth;\n cursorPos = mouseX > inputRight ? inputValue.length : 0;\n }\n\n setInputFocus(cursorPos);\n }\n\n // Only open the menu in response to a click\n openMenu();\n };\n\n // Fired whenever the wrapper gains focus,\n // and any time the focus within changes\n const handleComboboxFocus: FocusEventHandler<HTMLDivElement> = e => {\n scrollInputToEnd(overflow);\n trackFocusedElement(getNameFromElement(e.target));\n };\n\n // Fired onChange\n const handleInputChange: ChangeEventHandler<HTMLInputElement> = (\n e: React.ChangeEvent<HTMLInputElement>,\n ) => {\n updateInputValue(e.target.value);\n // fire any filter function passed in\n onFilter?.(e.target.value);\n onInputChange?.(e);\n };\n\n const handleClearButtonFocus: FocusEventHandler<HTMLButtonElement> = () => {\n setHighlightedOption(null);\n };\n\n const handleClearButtonClick: MouseEventHandler<HTMLButtonElement> = e => {\n if (!disabled) {\n // Prevents triggering the setOpen function called by clicking anywhere within the input wrapper.\n e.stopPropagation();\n updateSelection(null);\n onClear?.(e);\n onFilter?.('');\n setInputFocus();\n }\n };\n\n const handleKeyDown: KeyboardEventHandler<HTMLDivElement> = event => {\n const isFocusInMenu = menuRef.current?.contains(document.activeElement);\n const isFocusOnCombobox = comboboxRef.current?.contains(\n document.activeElement,\n );\n\n const isFocusInComponent = isFocusOnCombobox || isFocusInMenu;\n\n // Only run if the focus is in the component\n if (isFocusInComponent) {\n // No support for modifiers yet\n // TODO - Handle support for multiple chip selection\n if (event.ctrlKey || event.shiftKey || event.altKey) {\n return;\n }\n\n switch (event.key) {\n case keyMap.Tab: {\n switch (focusedElementName) {\n case 'Input': {\n if (!doesSelectionExist(selection)) {\n closeMenu();\n updateHighlightedOption('first');\n updateFocusedChip(null);\n }\n // else use default behavior\n break;\n }\n\n case 'LastChip': {\n // use default behavior\n updateFocusedChip(null);\n break;\n }\n\n case 'FirstChip':\n case 'MiddleChip': {\n // use default behavior\n break;\n }\n\n case 'ClearButton':\n default:\n break;\n }\n\n break;\n }\n\n case keyMap.Escape: {\n closeMenu();\n updateHighlightedOption('first');\n break;\n }\n\n case keyMap.Enter: {\n if (!isOpen) {\n openMenu();\n } else if (\n // Select the highlighted option if\n // the menu is open,\n // we're focused on input element,\n // and the highlighted option is not disabled\n isOpen &&\n focusedElementName === ComboboxElement.Input &&\n !isNull(highlightedOption) &&\n !isOptionDisabled(highlightedOption)\n ) {\n updateSelection(highlightedOption);\n } else if (\n // Focused on clear button\n focusedElementName === ComboboxElement.ClearButton\n ) {\n updateSelection(null);\n setInputFocus();\n }\n break;\n }\n\n case keyMap.Backspace: {\n // Backspace key focuses last chip if the input is focused\n // Note: Chip removal behavior is handled in `onRemove` defined in `renderChips`\n if (isMultiselect(selection)) {\n if (\n focusedElementName === 'Input' &&\n inputRef.current?.selectionStart === 0\n ) {\n updateFocusedChip('last');\n }\n }\n // Open the menu regardless\n openMenu();\n break;\n }\n\n case keyMap.ArrowDown: {\n if (isOpen) {\n // Prevent the page from scrolling\n event.preventDefault();\n // only change option if the menu is already open\n updateHighlightedOption('next');\n } else {\n openMenu();\n }\n break;\n }\n\n case keyMap.ArrowUp: {\n if (isOpen) {\n // Prevent the page from scrolling\n event.preventDefault();\n // only change option if the menu is already open\n updateHighlightedOption('prev');\n } else {\n openMenu();\n }\n break;\n }\n\n case keyMap.ArrowRight: {\n handleArrowKey('right', event);\n break;\n }\n\n case keyMap.ArrowLeft: {\n handleArrowKey('left', event);\n break;\n }\n\n default: {\n if (!isOpen) {\n openMenu();\n }\n }\n }\n }\n };\n\n /**\n *\n * Global Event Handler\n *\n */\n\n useBackdropClick(closeMenu, [menuRef, comboboxRef], isOpen);\n\n /**\n * Checks if multi-select and if there are chips selected. The left padding of the wrapper changes when there are chips selected so we use this to conditionally change the padding.\n */\n const isMultiselectWithSelections =\n isMultiselect(selection) && !!selection.length;\n\n /**\n * Function that calls the `checkScrollPosition` util to check the scroll position\n */\n const handleInputWrapperScroll = (e: UIEvent<HTMLDivElement>) => {\n setShouldShowOverflowShadow(checkScrollPosition(e.target as HTMLElement));\n };\n\n const debounceScroll = debounce(handleInputWrapperScroll, 50, {\n leading: true,\n });\n\n /**\n * Function called on scroll of the inputWrapperRef container\n */\n const handleOnScroll = useCallback(\n (e: React.UIEvent<HTMLDivElement>) => {\n if (overflow === Overflow.expandY) {\n debounceScroll(e);\n }\n },\n [debounceScroll, overflow],\n );\n\n /**\n * On load check if an overflow shadow should be visible\n */\n useEffect(() => {\n if (inputWrapperRef.current) {\n setShouldShowOverflowShadow(checkScrollPosition(inputWrapperRef.current));\n }\n }, []);\n\n const popoverProps = {\n popoverZIndex,\n ...(usePortal\n ? {\n usePortal,\n portalClassName,\n portalContainer,\n scrollContainer,\n }\n : { usePortal }),\n } as const;\n\n return (\n <LeafyGreenProvider darkMode={darkMode}>\n <ComboboxContext.Provider\n value={{\n multiselect,\n size,\n withIcons,\n disabled,\n isOpen,\n state,\n searchState,\n chipTruncationLocation,\n chipCharacterLimit,\n inputValue,\n overflow,\n popoverZIndex,\n }}\n >\n <div className={cx(comboboxParentStyle(size), className)} {...rest}>\n {(label || description) && (\n <div className={labelDescriptionContainerStyle}>\n {label && (\n <Label\n id={labelId}\n htmlFor={inputId}\n darkMode={darkMode}\n disabled={disabled}\n className={cx({\n [labelDescriptionLargeStyles]: size === ComboboxSize.Large,\n })}\n >\n {label}\n </Label>\n )}\n {description && (\n <Description\n darkMode={darkMode}\n disabled={disabled}\n className={cx({\n [labelDescriptionLargeStyles]: size === ComboboxSize.Large,\n })}\n >\n {description}\n </Description>\n )}\n </div>\n )}\n\n {/* Disable eslint: onClick sets focus. Key events would already have focus */}\n {/* eslint-disable-next-line jsx-a11y/click-events-have-key-events */}\n <div\n ref={comboboxRef}\n role=\"combobox\"\n aria-expanded={isOpen}\n aria-controls={menuId}\n aria-owns={menuId}\n tabIndex={-1}\n onMouseDown={handleInputWrapperMousedown}\n onClick={handleComboboxClick}\n onFocus={handleComboboxFocus}\n onKeyDown={handleKeyDown}\n onTransitionEnd={handleTransitionEnd}\n className={cx(\n baseComboboxStyles,\n comboboxThemeStyles[theme],\n comboboxSizeStyles(size, isMultiselectWithSelections),\n {\n [comboboxDisabledStyles[theme]]: disabled,\n [comboboxErrorStyles[theme]]: state === State.error,\n [comboboxFocusStyle[theme]]: isElementFocused(\n ComboboxElement.Input,\n ),\n [comboboxOverflowShadowStyles[theme]]: shouldShowOverflowShadow,\n },\n )}\n >\n <div\n onScroll={handleOnScroll}\n ref={inputWrapperRef}\n className={inputWrapperStyle({\n size,\n overflow,\n })}\n >\n {renderedChips}\n <input\n aria-label={ariaLabel ?? label}\n aria-autocomplete=\"list\"\n aria-controls={menuId}\n aria-labelledby={labelId}\n ref={inputRef}\n id={inputId}\n className={cx(\n baseInputElementStyle,\n inputElementSizeStyle(size),\n inputElementThemeStyle[theme],\n inputElementTransitionStyles(isOpen),\n {\n [multiselectInputElementStyle(size, inputValue)]:\n isMultiselect(selection),\n [inputElementDisabledThemeStyle[theme]]: disabled,\n },\n )}\n placeholder={placeholderValue}\n disabled={disabled ?? undefined}\n onChange={handleInputChange}\n value={inputValue}\n autoComplete=\"off\"\n />\n </div>\n <div\n className={cx(\n iconsWrapperBaseStyles,\n iconsWrapperSizeStyles[size],\n )}\n >\n {state === 'error' && (\n <Icon\n glyph=\"Warning\"\n fill={errorIconThemeStyles[theme]}\n className={endIconStyle}\n />\n )}\n {clearable && doesSelectionExist(selection) && !disabled && (\n <IconButton\n aria-label=\"Clear selection\"\n aria-disabled={disabled}\n disabled={disabled}\n ref={clearButtonRef}\n onClick={handleClearButtonClick}\n onFocus={handleClearButtonFocus}\n className={cx(clearButtonStyle)}\n darkMode={darkMode}\n >\n <Icon glyph=\"XWithCircle\" />\n </IconButton>\n )}\n <Icon\n glyph=\"CaretDown\"\n className={endIconStyle}\n fill={cx({\n [caretIconThemeStyles[theme]]: !disabled,\n [caretIconDisabledStyles[theme]]: disabled,\n })}\n />\n </div>\n </div>\n\n {state === 'error' && errorMessage && (\n <div\n className={cx(\n errorMessageThemeStyle[theme],\n errorMessageSizeStyle(size),\n )}\n >\n {errorMessage}\n </div>\n )}\n\n {/******* /\n * Menu *\n / *******/}\n\n <ComboboxMenu\n id={menuId}\n labelId={labelId}\n refEl={comboboxRef}\n ref={menuRef}\n menuWidth={menuWidth}\n searchLoadingMessage={searchLoadingMessage}\n searchErrorMessage={searchErrorMessage}\n searchEmptyMessage={searchEmptyMessage}\n {...popoverProps}\n >\n {renderedOptionsJSX}\n </ComboboxMenu>\n </div>\n </ComboboxContext.Provider>\n </LeafyGreenProvider>\n );\n\n // Closure-dependant utils\n\n /**\n * Scrolls the combobox to the far right if overflow === scroll-x\n * Scrolls the combobox to the bottom if overflow === expand-y\n */\n function scrollInputToEnd(overflow: Overflow) {\n if (inputWrapperRef && inputWrapperRef.current) {\n // TODO - consider converting to .scrollTo(). This is not yet supported in IE or jsdom\n if (overflow === Overflow.scrollX) {\n inputWrapperRef.current.scrollLeft =\n inputWrapperRef.current.scrollWidth;\n }\n\n if (overflow === Overflow.expandY) {\n inputWrapperRef.current.scrollTop =\n inputWrapperRef.current.scrollHeight;\n }\n }\n }\n\n /**\n * Returns the provided element as a ComboboxElement string\n */\n function getNameFromElement(\n element?: Element | null,\n ): ComboboxElement | undefined {\n if (!element) return;\n if (inputRef.current?.contains(element)) return ComboboxElement.Input;\n if (clearButtonRef.current?.contains(element))\n return ComboboxElement.ClearButton;\n\n const activeChipIndex = isMultiselect(selection)\n ? selection.findIndex(value =>\n getChipRef(value)?.current?.contains(element),\n )\n : -1;\n\n if (isMultiselect(selection)) {\n if (activeChipIndex === 0) return ComboboxElement.FirstChip;\n if (activeChipIndex === selection.length - 1)\n return ComboboxElement.LastChip;\n if (activeChipIndex > 0) return ComboboxElement.MiddleChip;\n }\n\n if (menuRef.current?.contains(element)) return ComboboxElement.Menu;\n if (comboboxRef.current?.contains(element)) return ComboboxElement.Combobox;\n }\n}\n\nCombobox.propTypes = {\n // Multiselect props\n multiselect: PropTypes.bool,\n value: PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.arrayOf(PropTypes.string),\n ]),\n initialValue: PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.arrayOf(PropTypes.string),\n ]),\n overflow: PropTypes.oneOf(Object.values(Overflow)),\n\n // Standard Props\n darkMode: PropTypes.bool,\n label: PropTypes.string,\n 'aria-label': PropTypes.string,\n children: PropTypes.node,\n onChange: PropTypes.func,\n chipCharacterLimit: PropTypes.number,\n chipTruncationLocation: PropTypes.oneOf(Object.values(TruncationLocation)),\n onClear: PropTypes.func,\n onFilter: PropTypes.func,\n clearable: PropTypes.bool,\n searchLoadingMessage: PropTypes.string,\n searchErrorMessage: PropTypes.string,\n searchEmptyMessage: PropTypes.string,\n searchState: PropTypes.oneOf(Object.values(SearchState)),\n errorMessage: PropTypes.string,\n state: PropTypes.oneOf(Object.values(State)),\n size: PropTypes.oneOf(Object.values(ComboboxSize)),\n disabled: PropTypes.bool,\n description: PropTypes.string,\n placeholder: PropTypes.string,\n filteredOptions: PropTypes.arrayOf(PropTypes.string),\n // Popover Props\n popoverZIndex: PropTypes.number,\n usePortal: PropTypes.bool,\n scrollContainer: PropTypes.elementType,\n portalContainer: PropTypes.elementType,\n portalClassName: PropTypes.string,\n};\n\n/**\n * Why'd you have to go and make things so complicated?\n * - Avril; and also me to myself about this component\n */\n","import { SelectValueType } from '../../types';\n\n/**\n * Returns whether a given value is included in, or equal to, the current selection\n * @param value the option value to check\n */\nexport const isValueCurrentSelection = (\n value: string,\n selection: SelectValueType<boolean> | null,\n): boolean => {\n return Array.isArray(selection)\n ? selection.includes(value)\n : value === selection;\n};\n"],"names":["ComboboxElement","ComboboxSize","XSmall","Small","Default","Large","Overflow","expandY","scrollX","expandX","State","none","error","SearchState","unset","loading","_templateObject","_templateObject2","_templateObject3","_templateObject4","_templateObject5","ComboboxContext","createContext","multiselect","size","withIcons","disabled","isOpen","state","searchState","overflow","chipClassName","createUniqueClassName","lineHeight","_defineProperty","typeScales","body1","body2","fontSize","chipWrapperPaddingY","chipSizeStyles","css","_taggedTemplateLiteral","chipTextClassName","ComboboxChip","React","forwardRef","_ref","forwardedRef","_chipRef$current","displayName","isFocused","onRemove","onFocus","_useContext","useContext","_useContext$chipTrunc","chipTruncationLocation","TruncationLocation","End","_useContext$chipChara","chipCharacterLimit","popoverZIndex","updatedChipTruncationLocation","None","chipRef","useForwardedRef","buttonRef","current","querySelector","useEffect","focus","createElement","Chip","label","className","cx","role","onClick","e","contains","target","onKeyDown","key","keyMap","Delete","Backspace","Enter","Space","onDismiss","baseFontSize","BaseFontSize","Body1","variant","Variant","Gray","ref","tabIndex","_templateObject6","_templateObject7","_templateObject8","_templateObject9","_templateObject10","_templateObject11","_templateObject12","_templateObject13","comboboxGroupStyle","Theme","Light","spacing","Dark","comboboxGroupLabel","fontWeights","bold","comboboxGroupLabelThemeStyle","palette","gray","dark1","light1","InternalComboboxGroup","children","theme","useDarkMode","groupId","useIdAllocator","prefix","Children","count","id","Fragment","ComboboxGroup","_","Error","propTypes","PropTypes","string","node","isRequired","menuItemPadding","Size","x","y","getMenuItemHeight","popoverStyle","width","arguments","length","undefined","popoverThemeStyle","transparentize","black","light2","dark2","menuBaseStyle","fontFamilies","default","menuThemeStyle","white","dark3","menuList","menuMessageBaseStyle","menuMessageThemeStyle","light3","menuMessageSizeStyle","loadingIconAnimation","keyframes","loadingIconStyle","_excluded","ComboboxMenu","refEl","labelId","menuWidth","searchLoadingMessage","searchErrorMessage","searchEmptyMessage","popoverProps","_objectWithoutProperties","_useDarkMode","darkMode","availableSpace","useAvailableSpace","maxHeightValue","isUndefined","concat","Math","min","renderedMenuContents","useMemo","messageStyles","errorMessageStyles","Icon","glyph","color","blue","base","red","_typeof","Popover","_extends","active","align","justify","adjustOnMutation","onMouseDownCapture","preventDefault","_templateObject14","_templateObject15","_templateObject16","_templateObject17","_templateObject18","_templateObject19","_templateObject20","checkScrollPosition","element","scrollHeight","scrollTop","clientHeight","getNameAndValue","_ref2","valProp","value","nameProp","kebabCase","flattenChildren","_children","toArray","reduce","acc","child","isComponentType","_getNameAndValue","props","_child$props","_toConsumableArray","isDisabled","hasGlyph","getOptionObjectFromValue","options","find","opt","getDisplayNameForValue","_getOptionObjectFromV","_getOptionObjectFromV2","comboboxOptionSizeStyle","checkMarkSizeStyle","checkBoxBaseStyles","displayNameStyle","isSelected","regular","iconThemeStyles","iconHighlightedStyles","iconDisabledStyles","checkMarkThemeStyles","checkMarkDisabledStyles","multiselectIconPosition","leftGlyphClassName","multiselectIconLargePosition","InternalComboboxOption","setSelected","description","_ref$disabled","rest","inputValue","optionRef","optionTextId","handleOptionClick","useCallback","stopPropagation","_useMemo","isComponentGlyph","console","icon","cloneElement","_objectSpread","checkBox","Checkbox","checked","checkMark","leftGlyph","rightGlyph","getGlyphs","multiSelectWithoutIcons","InputOption","as","highlighted","InputOptionContent","str","wrap","cleanWrap","escapeRegExp","regex","RegExp","matches","matchAll","outArray","split","_i","_Array$from","Array","from","_match$index","match","matchIndex","index","matchContent","matchLength","replacement","fill","splice","apply","wrapJSX","ComboboxOption","bool","func","_templateObject21","_templateObject22","_templateObject23","_templateObject24","_templateObject25","_templateObject26","_templateObject27","_templateObject28","_templateObject29","_templateObject30","_templateObject31","_templateObject32","_templateObject33","_templateObject34","_templateObject35","_templateObject36","doesSelectionExist","selection","isNull","isString","isArray","inputHeight","wrapperHeight","getYPadding","comboboxPadding","xLeftWithChip","xLeftWithoutChip","xRight","caretIconSize","comboboxParentStyle","baseComboboxStyles","transitionDuration","comboboxThemeStyles","dark4","comboboxSizeStyles","isMultiselectWithSelections","comboboxDisabledStyles","comboboxErrorStyles","comboboxFocusStyle","focusRing","input","iconsWrapperBaseStyles","iconsWrapperSizeStyles","inputWrapperStyle","baseWrapperStyle","baseInputElementStyle","inputElementThemeStyle","inputElementDisabledThemeStyle","inputElementSizeStyle","inputElementTransitionStyles","multiselectInputElementStyle","_inputValue$length","inputLength","clearButtonStyle","endIconStyle","errorMessageThemeStyle","errorMessageSizeStyle","labelDescriptionContainerStyle","labelDescriptionLargeStyles","large","comboboxOverflowShadowStyles","errorIconThemeStyles","caretIconThemeStyles","caretIconDisabledStyles","_excluded2","Combobox","_ref$placeholder","placeholder","ariaLabel","_ref$size","darkModeProp","_ref$state","errorMessage","_ref$searchState","_ref$searchEmptyMessa","_ref$searchErrorMessa","_ref$searchLoadingMes","filteredOptions","onFilter","_ref$clearable","clearable","onClear","_ref$overflow","_ref$multiselect","initialValue","inputValueProp","onInputChange","onChange","_ref$chipCharacterLim","_ref$usePortal","usePortal","portalClassName","portalContainer","scrollContainer","getOptionRef","useDynamicRefs","getChipRef","inputId","menuId","comboboxRef","useRef","clearButtonRef","inputWrapperRef","inputRef","menuRef","_useState2","_slicedToArray","useState","setOpen","wasOpen","usePrevious","_useState4","highlightedOption","setHighlightedOption","_useState6","setSelection","prevSelection","_useState8","setInputValue","updateInputValue","newInputVal","prevValue","_useState10","focusedChip","setFocusedChip","_useState12","shouldShowOverflowShadow","setShouldShowOverflowShadow","placeholderValue","closeMenu","openMenu","allOptions","isMultiselect","val","consoleOnce","setInputFocus","cursorPos","setSelectionRange","updateSelection","newSelection","clone","multiselectOnChange","diff","diffType","includes","indexOf","push","_newSelection","singleSelectOnChange","isTextCurrentSelection","text","_options$find$value","_options$find","isValueCurrentSelection","shouldOptionBeVisible","option","toLowerCase","visibleOptions","filter","isValueValid","getIndexOfValue","findIndex","getValueAtIndex","getActiveChipIndex","_getChipRef","document","activeElement","_useState14","focusedElementName","trackFocusedElement","updateHighlightedOption","direction","_visibleOptions$lengt","optionsCount","lastIndex","indexOfHighlight","newValue","_newValue","_newValue2","_newValue3","updateFocusedChip","relativeToIndex","referenceChipIndex","nextChipIndex","nextChipValue","_referenceChipIndex","prevChipIndex","prevChipValue","firstChipValue","lastChipValue","handleArrowKey","event","_inputRef$current","_inputRef$current2","_clearButtonRef$curre","selectionEnd","_inputRef$current3","_inputRef$current4","selectionStart","useAutoScroll","renderOption","_value","_className","_disabled","_rest","nestedChildren","map","renderedOptionsJSX","renderedChips","isLastChip","some","onCloseMenu","exactMatchedOption","_getDisplayNameForVal","onSelect","scrollInputToEnd","_getDisplayNameForVal2","_initialValue$filter","filteredValue","getNullSelection","isEqual","_useState16","setMenuWidth","_comboboxRef$current$","_comboboxRef$current","clientWidth","useBackdropClick","debounceScroll","debounce","leading","handleOnScroll","elementName","LeafyGreenProvider","Provider","Label","htmlFor","Description","onMouseDown","nativeEvent","offsetX","offsetLeft","_inputRef$current6","_clearButtonRef$curre2","_menuRef$current2","_comboboxRef$current4","activeChipIndex","_getChipRef2","getNameFromElement","_menuRef$current","_comboboxRef$current3","isFocusInMenu","ctrlKey","shiftKey","altKey","Tab","Escape","optionObj","isOptionDisabled","_inputRef$current5","ArrowDown","ArrowUp","ArrowRight","ArrowLeft","onTransitionEnd","_comboboxRef$current$2","_comboboxRef$current2","onScroll","autoComplete","IconButton","scrollLeft","scrollWidth","oneOfType","arrayOf","oneOf","Object","values","number","elementType"],"mappings":"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"}
|