@leafygreen-ui/combobox 6.0.3 → 6.0.5
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 +29 -0
- package/dist/esm/index.js +1 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +12 -12
- package/src/Combobox.story.tsx +42 -28
- package/src/index.ts +1 -0
- package/stories.js +1 -1
- package/tsconfig.tsbuildinfo +1 -1
package/dist/esm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../src/Combobox.types.ts","../../src/Chip/Chip.styles.ts","../../src/Combobox/Combobox.styles.ts","../../src/ComboboxGroup/ComboboxGroup.styles.ts","../../src/ComboboxContext/ComboboxContext.tsx","../../src/Chip/Chip.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/Combobox/Combobox.tsx"],"sourcesContent":["import { ComponentPropsWithoutRef, ReactElement, ReactNode } from 'react';\n\nimport { Either, HTMLElementProps } from '@leafygreen-ui/lib';\n\n/**\n * Prop Enums & Types\n */\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 * Prop types\n */\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\nexport const TruncationLocation = {\n start: 'start',\n middle: 'middle',\n end: 'end',\n none: 'none',\n} as const;\nexport type TruncationLocation =\n typeof TruncationLocation[keyof typeof TruncationLocation];\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\nexport const State = {\n error: 'error',\n none: 'none',\n} as const;\nexport type State = typeof State[keyof typeof State];\n\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 * Generic Typing\n */\n\nexport type SelectValueType<M extends boolean> = M extends true\n ? Array<string>\n : string | null;\n\nexport type onChangeType<M extends boolean> = M extends true\n ? (value: SelectValueType<true>) => void\n : (value: SelectValueType<false>) => void;\n\n// Returns the correct empty state for multiselcect / single select\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\n/**\n * Combobox Props\n */\n\nexport interface ComboboxMultiselectProps<M extends boolean> {\n /**\n * Defines whether a user can select multiple options, or only a single option.\n * When using TypeScript, `multiselect` affects the valid values of `initialValue`, `value`, and `onChange`\n */\n multiselect?: M;\n /**\n * The initial selection.\n * Must be a string (or array of strings) that matches the `value` prop of a `ComboboxOption`.\n * Changing the `initialValue` after initial render will not change the selection.\n */\n initialValue?: SelectValueType<M>;\n /**\n * A callback called when the selection changes.\n * Callback receives a single argument that is the new selection, either string, or string array\n */\n onChange?: onChangeType<M>;\n /**\n * The controlled value of the Combobox.\n * Must be a string (or array of strings) that matches the `value` prop of a `ComboboxOption`.\n * Changing `value` after initial render _will_ affect the selection.\n * `value` will always take precedence over `initialValue` if both are provided.\n */\n value?: SelectValueType<M>;\n\n /**\n * Defines the overflow behavior of a multiselect combobox.\n *\n * `expand-y`: Combobox has fixed width, and additional selections will cause the element to grow in the block direction.\n *\n * `expand-x`: Combobox has fixed height, and additional selections will cause the element to grow in the inline direction.\n *\n * `scroll-x`: Combobox has fixed height and width, and additional selections will cause the element to be scrollable in the x (horizontal) direction.\n */\n overflow?: M extends true ? Overflow : undefined;\n}\n\nexport interface BaseComboboxProps\n extends Omit<HTMLElementProps<'div'>, 'onChange'> {\n /**\n * Defines the Combobox Options by passing children. Must be `ComboboxOption` or `ComboboxGroup`\n */\n children?: ReactNode;\n\n /**\n * An accessible label for the input, rendered in a <label> to the DOM\n */\n label?: string;\n\n /**\n * An accessible label for the input, used only for screen-readers\n */\n 'aria-label'?: string;\n\n /**\n * A description for the input\n */\n description?: string;\n\n /**\n * A placeholder for the input element. Uses the native `placeholder` attribute.\n */\n placeholder?: string;\n\n /**\n * Disables all interaction with the component\n */\n disabled?: boolean;\n\n /**\n * Defines the visual size of the component\n */\n size?: ComboboxSize;\n\n /**\n * Toggles Dark Mode\n */\n darkMode?: boolean;\n\n /**\n * The error state of the component. Defines whether the error message is displayed.\n */\n state?: State;\n\n /**\n * The message shown below the input when state is `error`\n */\n errorMessage?: string;\n\n /**\n * The state of search results. Toggles search messages within the menu.\n */\n searchState?: SearchState;\n\n /**\n * A message shown within the menu when there are no options passed in as children, or `filteredOptions` is an empty array\n */\n searchEmptyMessage?: string;\n\n /**\n * A message shown within the menu when searchState is `error`\n */\n searchErrorMessage?: string;\n\n /**\n * A message shown within the menu when searchState is `loading`\n */\n searchLoadingMessage?: string;\n\n /**\n * A callback called when the search input changes.\n * Receives a single argument that is the current input value.\n * Use this callback to set `searchState` and/or `filteredOptions` appropriately\n */\n onFilter?: (value: string) => void;\n\n /**\n * Defines whether the Clear button appears to the right of the input.\n */\n clearable?: boolean;\n\n /**\n * A callback fired when the Clear button is pressed.\n * Fired _after_ `onChange`, and _before_ `onFilter`\n */\n onClear?: (e: React.MouseEvent<HTMLButtonElement, MouseEvent>) => void;\n\n /**\n * An array used to define which options are displayed.\n * Do not remove options from the JSX children, as this will affect the selected options\n */\n filteredOptions?: Array<string>;\n\n /**\n * Defines where the ellipses appear in a Chip when the length exceeds the `chipCharacterLimit`\n */\n chipTruncationLocation?: TruncationLocation;\n\n /**\n * Defined the character limit of a multiselect Chip before they start truncating.\n * Note: the three ellipses dots are included in the character limit.\n */\n chipCharacterLimit?: number;\n\n /**\n * Specifies that the popover content should be rendered at the end of the DOM,\n * rather than in the DOM tree.\n *\n * default: `true`\n */\n usePortal?: boolean;\n\n /**\n * When usePortal is `true`, specifies a class name to apply to the root element of the portal.\n */\n portalClassName?: undefined;\n\n /**\n * When usePortal is `true`, specifies an element to portal within. The default behavior is to generate a div at the end of the document to render within.\n */\n portalContainer?: null;\n\n /**\n * When usePortal is `true`, specifies the scrollable element to position relative to.\n */\n scrollContainer?: null;\n\n /**\n * Number that controls the z-index of the popover element directly.\n */\n popoverZIndex?: number;\n}\n\nexport type ComboboxProps<M extends boolean> = Either<\n BaseComboboxProps & ComboboxMultiselectProps<M>,\n 'label' | 'aria-label'\n>;\n\n/**\n * Combobox Option Props\n */\n\ntype ListItemProps = Omit<ComponentPropsWithoutRef<'li'>, 'onClick' | 'value'>;\n\ninterface SharedComboboxOptionProps {\n /**\n * The internal value of the option. Used as the identifier in Combobox `initialValue`, value and filteredOptions.\n * When undefined, this is set to `_.kebabCase(displayName)`\n */\n value?: string;\n\n /**\n * The display value of the option. Used as the rendered string within the menu and chips.\n * When undefined, this is set to `value`\n */\n displayName?: string;\n\n /**\n * The icon to display to the left of the option in the menu.\n */\n glyph?: ReactElement;\n\n /**\n * Defines whether the option is disabled.\n * Node: disabled options are still rendered in the menu, but not selectable.\n */\n disabled?: boolean;\n\n /**\n * Styling Prop\n */\n className?: string;\n\n /**\n * Optional descriptive text under the displayName.\n */\n description?: string;\n\n /**\n * Callback fired when an option is clicked.\n */\n onClick?: (\n event: React.SyntheticEvent<HTMLLIElement, Event>,\n value: string,\n ) => void;\n}\n\ntype RequiredComboboxOptionProps = Required<\n Pick<SharedComboboxOptionProps, 'value' | 'displayName'>\n>;\n\ntype BaseComboboxOptionProps = ListItemProps & SharedComboboxOptionProps;\n\nexport type ComboboxOptionProps = Either<\n BaseComboboxOptionProps,\n 'value' | 'displayName'\n>;\n\nexport interface OptionObject\n extends Pick<SharedComboboxOptionProps, 'description' | 'onClick'>,\n RequiredComboboxOptionProps {\n isDisabled: boolean;\n hasGlyph?: boolean;\n}\n\nexport interface InternalComboboxOptionProps\n extends ListItemProps,\n Omit<SharedComboboxOptionProps, 'value' | 'displayName'>,\n RequiredComboboxOptionProps {\n isSelected: boolean;\n isFocused: boolean;\n setSelected: () => void;\n index: number;\n}\n\n/**\n * Combobox Group Props\n */\n\nexport interface ComboboxGroupProps {\n /**\n * Label for the group of options\n */\n label: string;\n\n /**\n * Options in the group. Must be one or more `ComboboxOption` components\n */\n children: React.ReactNode;\n\n /**\n * Styling prop\n */\n className?: string;\n}\n\n/**\n * Combobox Chip\n */\n\nexport interface ChipProps {\n displayName: string;\n isFocused: boolean;\n onRemove: () => void;\n onFocus: () => void;\n}\n","import { css } from '@leafygreen-ui/emotion';\nimport { Theme } from '@leafygreen-ui/lib';\nimport { palette } from '@leafygreen-ui/palette';\nimport { transitionDuration, typeScales } from '@leafygreen-ui/tokens';\n\nimport { ComboboxSize } from '../Combobox.types';\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 * Util to get the chip height\n * `lineHeight + (2 * paddingY)`\n */\nexport const getChipHeight = (size: ComboboxSize) => {\n return lineHeight[size] + 2 * chipWrapperPaddingY[size];\n};\n\nexport const chipWrapperBaseStyle = css`\n display: inline-flex;\n align-items: center;\n overflow: hidden;\n white-space: nowrap;\n box-sizing: border-box;\n border-radius: 4px;\n`;\n\nexport const chipWrapperSizeStyle = (size: ComboboxSize) => css`\n font-size: ${fontSize[size]}px;\n line-height: ${lineHeight[size]}px;\n`;\n\nexport const chipWrapperThemeStyle: Record<Theme, string> = {\n [Theme.Light]: css`\n color: ${palette.black};\n background-color: ${palette.gray.light2};\n\n // TODO: - refine these styles with Design\n &:focus-within {\n background-color: ${palette.blue.light2};\n }\n `,\n [Theme.Dark]: css`\n color: ${palette.gray.light2};\n background-color: ${palette.gray.dark2};\n\n &:focus-within {\n background-color: ${palette.blue.dark2};\n }\n `,\n};\n\nexport const disabledBaseChipWrapperStyles = css`\n cursor: not-allowed;\n pointer-events: none;\n`;\n\nexport const disabledChipWrapperStyle: Record<Theme, string> = {\n [Theme.Light]: css`\n color: ${palette.gray.base};\n background-color: ${palette.gray.light3};\n `,\n [Theme.Dark]: css`\n color: ${palette.gray.dark2};\n background-color: ${palette.gray.dark4};\n box-shadow: inset 0 0 1px 1px ${palette.gray.dark2};\n `,\n};\n\nexport const chipTextSizeStyle: Record<ComboboxSize, string> = {\n [ComboboxSize.XSmall]: css`\n padding-inline-start: 6px;\n padding-inline-end: 2px;\n padding-block: ${chipWrapperPaddingY[ComboboxSize.XSmall]}px;\n `,\n [ComboboxSize.Small]: css`\n padding-inline-start: 6px;\n padding-inline-end: 2px;\n padding-block: ${chipWrapperPaddingY[ComboboxSize.Small]}px;\n `,\n [ComboboxSize.Default]: css`\n padding-inline-start: 6px;\n padding-inline-end: 2px;\n padding-block: ${chipWrapperPaddingY[ComboboxSize.Default]}px;\n `,\n [ComboboxSize.Large]: css`\n padding-inline: 10px;\n padding-block: ${chipWrapperPaddingY[ComboboxSize.Large]}px;\n `,\n};\n\nexport const chipButtonStyle = css`\n position: relative;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 100%;\n outline: none;\n border: none;\n background-color: transparent;\n cursor: pointer;\n transition: background-color ${transitionDuration.faster}ms ease-in-out;\n padding: 0 2px;\n`;\n\nexport const chipButtonSizeStyle = (size: ComboboxSize) => css`\n height: ${getChipHeight(size)}px;\n`;\n\nexport const chipButtonThemeStyle: Record<Theme, string> = {\n [Theme.Light]: css`\n color: ${palette.gray.dark2};\n\n &:hover {\n color: ${palette.black};\n background-color: ${palette.gray.light1};\n }\n `,\n [Theme.Dark]: css`\n color: ${palette.gray.light1};\n\n &:hover {\n color: ${palette.gray.light3};\n background-color: ${palette.gray.dark1};\n }\n `,\n};\n\nexport const chipButtonBaseDisabledStyles = css`\n cursor: not-allowed;\n &:hover {\n color: inherit;\n background-color: unset;\n }\n`;\n\nexport const chipButtonDisabledStyle: Record<Theme, string> = {\n [Theme.Light]: css`\n color: ${palette.gray.light1};\n `,\n [Theme.Dark]: css`\n color: ${palette.gray.dark2};\n `,\n};\n","import { transparentize } from 'polished';\n\nimport { css } from '@leafygreen-ui/emotion';\nimport { createUniqueClassName, Theme } from '@leafygreen-ui/lib';\nimport { palette } from '@leafygreen-ui/palette';\nimport {\n focusRing,\n fontFamilies,\n hoverRing,\n spacing,\n transitionDuration,\n typeScales,\n} from '@leafygreen-ui/tokens';\n\nimport { fontSize, getChipHeight, lineHeight } from '../Chip/Chip.styles';\nimport { ComboboxSize as Size, Overflow } from '../Combobox.types';\n\n// Rename the variable defined in chip styles\nconst inputHeight = getChipHeight;\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 chipClassName = createUniqueClassName('combobox-chip');\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 &:hover {\n box-shadow: ${hoverRing[Theme.Light].gray};\n }\n `,\n [Theme.Dark]: css`\n color: ${palette.gray.light2};\n background-color: ${palette.gray.dark4};\n border-color: ${palette.gray.base};\n\n &:hover {\n box-shadow: ${hoverRing[Theme.Dark].gray};\n }\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((${getChipHeight(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.dark2,\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 { createContext } from 'react';\n\nimport {\n ComboboxSize,\n Overflow,\n SearchState,\n State,\n TruncationLocation,\n} from '../Combobox.types';\n\ninterface 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 ComboboxContext = createContext<ComboboxData>({\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","import React, { useContext, useEffect, useMemo, useRef } from 'react';\n\nimport { cx } from '@leafygreen-ui/emotion';\nimport Icon from '@leafygreen-ui/icon';\nimport InlineDefinition from '@leafygreen-ui/inline-definition';\nimport { useDarkMode } from '@leafygreen-ui/leafygreen-provider';\nimport { keyMap } from '@leafygreen-ui/lib';\n\nimport { ChipProps, Overflow } from '../Combobox.types';\nimport { chipClassName } from '../Combobox/Combobox.styles';\nimport { ComboboxContext } from '../ComboboxContext';\n\nimport {\n chipButtonBaseDisabledStyles,\n chipButtonDisabledStyle,\n chipButtonSizeStyle,\n chipButtonStyle,\n chipButtonThemeStyle,\n chipTextSizeStyle,\n chipWrapperBaseStyle,\n chipWrapperSizeStyle,\n chipWrapperThemeStyle,\n disabledBaseChipWrapperStyles,\n disabledChipWrapperStyle,\n} from './Chip.styles';\n\nexport const Chip = React.forwardRef<HTMLSpanElement, ChipProps>(\n ({ displayName, isFocused, onRemove, onFocus }: ChipProps, forwardedRef) => {\n const { darkMode, theme } = useDarkMode();\n const {\n size,\n disabled,\n overflow,\n chipTruncationLocation = 'end',\n chipCharacterLimit = 12,\n popoverZIndex,\n } = useContext(ComboboxContext);\n\n const isTruncated =\n overflow !== Overflow.scrollX &&\n !!chipCharacterLimit &&\n !!chipTruncationLocation &&\n chipTruncationLocation !== 'none' &&\n displayName.length > chipCharacterLimit;\n\n const buttonRef = useRef<HTMLButtonElement>(null);\n\n const truncatedName = useMemo(() => {\n if (isTruncated) {\n const ellipsis = '…';\n const chars = chipCharacterLimit - 3; // ellipsis dots included in the char limit\n\n switch (chipTruncationLocation) {\n case 'start': {\n const end = displayName\n .substring(displayName.length - chars)\n .trim();\n return ellipsis + end;\n }\n\n case 'middle': {\n const start = displayName.substring(0, chars / 2).trim();\n const end = displayName\n .substring(displayName.length - chars / 2)\n .trim();\n return start + ellipsis + end;\n }\n\n case 'end': {\n const start = displayName.substring(0, chars).trim();\n return start + ellipsis;\n }\n\n default: {\n return displayName;\n }\n }\n }\n\n return false;\n }, [chipCharacterLimit, chipTruncationLocation, displayName, isTruncated]);\n\n useEffect(() => {\n if (isFocused && !disabled) {\n buttonRef?.current?.focus();\n }\n }, [disabled, forwardedRef, isFocused]);\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (\n !disabled &&\n (e.keyCode === keyMap.Delete ||\n e.keyCode === keyMap.Backspace ||\n e.keyCode === keyMap.Enter ||\n e.keyCode === keyMap.Space)\n ) {\n onRemove();\n }\n };\n\n const handleChipClick = (e: React.MouseEvent) => {\n // Did not click button\n if (!buttonRef.current?.contains(e.target as Node)) {\n onFocus();\n }\n };\n\n const handleButtonClick = () => {\n if (!disabled) {\n onRemove();\n }\n };\n\n return (\n // eslint-disable-next-line jsx-a11y/click-events-have-key-events\n <span\n role=\"option\"\n aria-selected={isFocused}\n data-testid=\"lg-combobox-chip\"\n ref={forwardedRef}\n className={cx(\n chipClassName,\n chipWrapperBaseStyle,\n chipWrapperThemeStyle[theme],\n chipWrapperSizeStyle(size),\n {\n [cx(\n disabledChipWrapperStyle[theme],\n disabledBaseChipWrapperStyles,\n )]: disabled,\n },\n )}\n onClick={handleChipClick}\n onKeyDown={handleKeyDown}\n tabIndex={-1}\n >\n <span className={cx(chipTextSizeStyle[size])}>\n {truncatedName ? (\n <InlineDefinition\n darkMode={darkMode}\n definition={displayName}\n align=\"bottom\"\n popoverZIndex={popoverZIndex}\n >\n {truncatedName}\n </InlineDefinition>\n ) : (\n displayName\n )}\n </span>\n <button\n aria-label={`Deselect ${displayName}`}\n aria-disabled={disabled}\n disabled={disabled}\n ref={buttonRef}\n className={cx(\n chipButtonStyle,\n chipButtonThemeStyle[theme],\n chipButtonSizeStyle(size),\n {\n [cx(\n chipButtonDisabledStyle[theme],\n chipButtonBaseDisabledStyles,\n )]: disabled,\n },\n )}\n onClick={handleButtonClick}\n >\n <Icon glyph=\"X\" />\n </button>\n </span>\n );\n },\n);\nChip.displayName = 'Chip';\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 '../Chip/Chip.styles';\nimport { ComboboxSize as Size } from '../Combobox.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.dark3};\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 { ComboboxGroupProps } from '../Combobox.types';\n\nimport {\n comboboxGroupLabel,\n comboboxGroupLabelThemeStyle,\n comboboxGroupStyle,\n} from './ComboboxGroup.styles';\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 from '@leafygreen-ui/popover';\nimport { Error } from '@leafygreen-ui/typography';\n\nimport { ComboboxProps } from '../Combobox.types';\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} & Pick<\n ComboboxProps<any>,\n | 'searchLoadingMessage'\n | 'searchErrorMessage'\n | 'searchEmptyMessage'\n | 'usePortal'\n | 'portalClassName'\n | 'portalContainer'\n | 'scrollContainer'\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.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 '../Chip/Chip.styles';\nimport { ComboboxSize } from '../Combobox.types';\nimport {\n getMenuItemHeight,\n menuItemPadding,\n} from '../ComboboxMenu/Menu.styles';\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 '../Combobox.types';\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, keyMap as _keyMap } from '@leafygreen-ui/lib';\n\nimport { OptionObject } from '../Combobox.types';\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 '../Combobox.types';\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 {\n ComboboxOptionProps,\n ComboboxSize,\n InternalComboboxOptionProps,\n} from '../Combobox.types';\nimport { ComboboxContext } from '../ComboboxContext';\nimport { wrapJSX } from '../utils';\n\nimport {\n comboboxOptionSizeStyle,\n displayNameStyle,\n multiselectIconLargePosition,\n multiselectIconPosition,\n} from './ComboboxOption.styles';\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 '../Combobox.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 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 { Chip } from '../Chip';\nimport {\n ComboboxElement,\n ComboboxProps,\n ComboboxSize,\n getNullSelection,\n onChangeType,\n OptionObject,\n Overflow,\n SearchState,\n SelectValueType,\n State,\n TruncationLocation,\n} from '../Combobox.types';\nimport { ComboboxContext } from '../ComboboxContext';\nimport { InternalComboboxGroup } from '../ComboboxGroup';\nimport { ComboboxMenu } from '../ComboboxMenu';\nimport { InternalComboboxOption } from '../ComboboxOption';\nimport {\n checkScrollPosition,\n flattenChildren,\n getDisplayNameForValue,\n getNameAndValue,\n getOptionObjectFromValue,\n getValueForDisplayName,\n} from '../utils';\n\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';\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 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>('');\n const prevValue = usePrevious(inputValue);\n const [focusedChip, setFocusedChip] = useState<string | null>(null);\n const [shouldShowOverflowShadow, setShouldShowOverflowShadow] =\n useState<boolean>(false);\n\n const doesSelectionExist =\n !isNull(selection) &&\n ((isArray(selection) && selection.length > 0) || isString(selection));\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\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 // clear text\n setInputValue('');\n }\n }\n setSelection(newSelection as SelectValueType<M>);\n (onChange as onChangeType<true>)?.(\n newSelection as SelectValueType<true>,\n );\n } else {\n const newSelection: SelectValueType<M> = value as SelectValueType<M>;\n setSelection(newSelection);\n (onChange as onChangeType<false>)?.(\n newSelection as SelectValueType<false>,\n );\n }\n },\n [isMultiselect, onChange, selection],\n );\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 */\n const isValueCurrentSelection = useCallback(\n (value: string): boolean => {\n return isMultiselect(selection)\n ? selection.includes(value)\n : value === selection;\n },\n [isMultiselect, 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);\n },\n [allOptions, isValueCurrentSelection],\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 <Chip\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 // Single select, and no change to selection\n if (!isMultiselect(selection) && selection === prevSelection) {\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 (exactMatchedOption && !value) {\n setSelection(exactMatchedOption.value as SelectValueType<M>);\n } else {\n // Revert the value to the previous selection\n const displayName =\n getDisplayNameForValue(\n selection as SelectValueType<false>,\n allOptions,\n ) ?? '';\n setInputValue(displayName);\n }\n }\n }, [\n allOptions,\n inputValue,\n isMultiselect,\n prevSelection,\n selection,\n value,\n visibleOptions,\n ]);\n\n const onSelect = useCallback(() => {\n if (doesSelectionExist) {\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 setInputValue(displayName);\n closeMenu();\n }\n } else {\n setInputValue('');\n }\n }, [doesSelectionExist, 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 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 if (!isEqual(selection, prevSelection)) {\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 target: { value },\n }: React.ChangeEvent<HTMLInputElement>) => {\n setInputValue(value);\n // fire any filter function passed in\n onFilter?.(value);\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.keyCode) {\n case keyMap.Tab: {\n switch (focusedElementName) {\n case 'Input': {\n if (!doesSelectionExist) {\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 (\n // Select the highlighted option iff\n // the menu is open,\n // we're focused on input element,\n // and the highlighted option is not disabled\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 && !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"],"names":["_lineHeight","_fontSize","_chipWrapperPaddingY","_templateObject","_templateObject2","_templateObject3","_templateObject4","_chipWrapperThemeStyl","_templateObject5","_templateObject6","_templateObject7","_disabledChipWrapperS","_templateObject8","_templateObject9","_templateObject10","_templateObject11","_chipTextSizeStyle","_templateObject12","_templateObject13","_templateObject14","_templateObject15","_chipButtonThemeStyle","_templateObject16","_templateObject17","_templateObject18","_chipButtonDisabledSt","ComboboxElement","ComboboxSize","XSmall","Small","Default","Large","Overflow","expandY","scrollX","expandX","State","error","none","SearchState","unset","loading","_wrapperHeight","_comboboxPadding","_comboboxThemeStyles","_comboboxDisabledStyl","_comboboxErrorStyles","_comboboxFocusStyle","_iconsWrapperSizeStyl","_templateObject19","_templateObject20","_templateObject21","_templateObject22","_inputElementThemeSty","_templateObject23","_templateObject24","_inputElementDisabled","_templateObject25","_templateObject26","_templateObject27","_templateObject28","_templateObject29","_templateObject30","_templateObject31","_errorMessageThemeSty","_templateObject32","_templateObject33","_templateObject34","_templateObject35","_templateObject36","_comboboxOverflowShad","_errorIconThemeStyles","_caretIconThemeStyles","_caretIconDisabledSty","_comboboxGroupStyle","_comboboxGroupLabelTh","lineHeight","_defineProperty","typeScales","body1","body2","fontSize","chipWrapperPaddingY","getChipHeight","size","chipWrapperBaseStyle","css","_taggedTemplateLiteral","chipWrapperSizeStyle","chipWrapperThemeStyle","Theme","Light","palette","black","gray","light2","blue","Dark","dark2","disabledBaseChipWrapperStyles","disabledChipWrapperStyle","base","light3","dark4","chipTextSizeStyle","chipButtonStyle","transitionDuration","faster","chipButtonSizeStyle","chipButtonThemeStyle","light1","dark1","chipButtonBaseDisabledStyles","chipButtonDisabledStyle","inputHeight","wrapperHeight","Size","getYPadding","comboboxPadding","y","xLeftWithChip","xLeftWithoutChip","xRight","spacing","caretIconSize","chipClassName","createUniqueClassName","comboboxParentStyle","fontFamilies","default","baseComboboxStyles","comboboxThemeStyles","dark3","white","hoverRing","comboboxSizeStyles","isMultiselectWithSelections","concat","comboboxDisabledStyles","comboboxErrorStyles","red","comboboxFocusStyle","focusRing","input","iconsWrapperBaseStyles","iconsWrapperSizeStyles","inputWrapperStyle","_ref","overflow","baseWrapperStyle","baseInputElementStyle","inputElementThemeStyle","inputElementDisabledThemeStyle","inputElementSizeStyle","inputElementTransitionStyles","isOpen","multiselectInputElementStyle","inputValue","_inputValue$length","inputLength","length","clearButtonStyle","endIconStyle","errorMessageThemeStyle","errorMessageSizeStyle","labelDescriptionContainerStyle","labelDescriptionLargeStyles","large","comboboxOverflowShadowStyles","transparentize","errorIconThemeStyles","caretIconThemeStyles","caretIconDisabledStyles","ComboboxContext","createContext","multiselect","withIcons","disabled","state","searchState","Chip","React","forwardRef","forwardedRef","displayName","isFocused","onRemove","onFocus","_useDarkMode","useDarkMode","darkMode","theme","_useContext","useContext","_useContext$chipTrunc","chipTruncationLocation","_useContext$chipChara","chipCharacterLimit","popoverZIndex","isTruncated","buttonRef","useRef","truncatedName","useMemo","chars","substring","trim","useEffect","_buttonRef$current","current","focus","createElement","role","ref","className","cx","onClick","e","_buttonRef$current2","contains","target","onKeyDown","keyCode","keyMap","Delete","Backspace","Enter","Space","tabIndex","InlineDefinition","definition","align","Icon","glyph","_menuItemPadding","_popoverThemeStyle","_menuThemeStyle","_menuMessageThemeStyl","comboboxGroupStyle","comboboxGroupLabel","fontWeights","bold","comboboxGroupLabelThemeStyle","InternalComboboxGroup","label","children","groupId","useIdAllocator","prefix","Children","count","id","Fragment","ComboboxGroup","_","Error","propTypes","PropTypes","string","node","isRequired","menuItemPadding","x","getMenuItemHeight","popoverStyle","width","arguments","undefined","popoverThemeStyle","menuBaseStyle","menuThemeStyle","menuList","menuMessageBaseStyle","menuMessageThemeStyle","menuMessageSizeStyle","loadingIconAnimation","keyframes","loadingIconStyle","_excluded","ComboboxMenu","refEl","labelId","menuWidth","searchLoadingMessage","searchErrorMessage","searchEmptyMessage","popoverProps","_objectWithoutProperties","useForwardedRef","availableSpace","useAvailableSpace","maxHeightValue","isUndefined","Math","min","renderedMenuContents","messageStyles","errorMessageStyles","color","_typeof","Popover","_extends","active","justify","adjustOnMutation","onMouseDownCapture","preventDefault","_checkMarkSizeStyle","_iconThemeStyles","_iconHighlightedStyle","_iconDisabledStyles","_checkMarkThemeStyles","_checkMarkDisabledSty","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","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","key","replacement","fill","splice","apply","wrapJSX","ComboboxOption","bool","func","_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","onChange","_ref$chipCharacterLim","_ref$usePortal","usePortal","portalClassName","portalContainer","scrollContainer","getOptionRef","useDynamicRefs","getChipRef","inputId","menuId","comboboxRef","clearButtonRef","inputWrapperRef","inputRef","menuRef","_useState2","_slicedToArray","useState","setOpen","wasOpen","usePrevious","_useState4","highlightedOption","setHighlightedOption","_useState6","selection","setSelection","prevSelection","_useState8","setInputValue","prevValue","_useState10","focusedChip","setFocusedChip","_useState12","shouldShowOverflowShadow","setShouldShowOverflowShadow","doesSelectionExist","isNull","isArray","isString","placeholderValue","closeMenu","openMenu","allOptions","isMultiselect","val","consoleOnce","setInputFocus","cursorPos","setSelectionRange","updateSelection","newSelection","clone","includes","indexOf","push","_newSelection","isValueCurrentSelection","isTextCurrentSelection","text","_options$find$value","_options$find","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","chipRef","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","start","middle","end","elementType"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../src/Combobox.types.ts","../../src/Chip/Chip.styles.ts","../../src/Combobox/Combobox.styles.ts","../../src/ComboboxGroup/ComboboxGroup.styles.ts","../../src/ComboboxContext/ComboboxContext.tsx","../../src/Chip/Chip.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/Combobox/Combobox.tsx"],"sourcesContent":["import { ComponentPropsWithoutRef, ReactElement, ReactNode } from 'react';\n\nimport { Either, HTMLElementProps } from '@leafygreen-ui/lib';\n\n/**\n * Prop Enums & Types\n */\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 * Prop types\n */\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\nexport const TruncationLocation = {\n start: 'start',\n middle: 'middle',\n end: 'end',\n none: 'none',\n} as const;\nexport type TruncationLocation =\n typeof TruncationLocation[keyof typeof TruncationLocation];\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\nexport const State = {\n error: 'error',\n none: 'none',\n} as const;\nexport type State = typeof State[keyof typeof State];\n\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 * Generic Typing\n */\n\nexport type SelectValueType<M extends boolean> = M extends true\n ? Array<string>\n : string | null;\n\nexport type onChangeType<M extends boolean> = M extends true\n ? (value: SelectValueType<true>) => void\n : (value: SelectValueType<false>) => void;\n\n// Returns the correct empty state for multiselcect / single select\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\n/**\n * Combobox Props\n */\n\nexport interface ComboboxMultiselectProps<M extends boolean> {\n /**\n * Defines whether a user can select multiple options, or only a single option.\n * When using TypeScript, `multiselect` affects the valid values of `initialValue`, `value`, and `onChange`\n */\n multiselect?: M;\n /**\n * The initial selection.\n * Must be a string (or array of strings) that matches the `value` prop of a `ComboboxOption`.\n * Changing the `initialValue` after initial render will not change the selection.\n */\n initialValue?: SelectValueType<M>;\n /**\n * A callback called when the selection changes.\n * Callback receives a single argument that is the new selection, either string, or string array\n */\n onChange?: onChangeType<M>;\n /**\n * The controlled value of the Combobox.\n * Must be a string (or array of strings) that matches the `value` prop of a `ComboboxOption`.\n * Changing `value` after initial render _will_ affect the selection.\n * `value` will always take precedence over `initialValue` if both are provided.\n */\n value?: SelectValueType<M>;\n\n /**\n * Defines the overflow behavior of a multiselect combobox.\n *\n * `expand-y`: Combobox has fixed width, and additional selections will cause the element to grow in the block direction.\n *\n * `expand-x`: Combobox has fixed height, and additional selections will cause the element to grow in the inline direction.\n *\n * `scroll-x`: Combobox has fixed height and width, and additional selections will cause the element to be scrollable in the x (horizontal) direction.\n */\n overflow?: M extends true ? Overflow : undefined;\n}\n\nexport interface BaseComboboxProps\n extends Omit<HTMLElementProps<'div'>, 'onChange'> {\n /**\n * Defines the Combobox Options by passing children. Must be `ComboboxOption` or `ComboboxGroup`\n */\n children?: ReactNode;\n\n /**\n * An accessible label for the input, rendered in a <label> to the DOM\n */\n label?: string;\n\n /**\n * An accessible label for the input, used only for screen-readers\n */\n 'aria-label'?: string;\n\n /**\n * A description for the input\n */\n description?: string;\n\n /**\n * A placeholder for the input element. Uses the native `placeholder` attribute.\n */\n placeholder?: string;\n\n /**\n * Disables all interaction with the component\n */\n disabled?: boolean;\n\n /**\n * Defines the visual size of the component\n */\n size?: ComboboxSize;\n\n /**\n * Toggles Dark Mode\n */\n darkMode?: boolean;\n\n /**\n * The error state of the component. Defines whether the error message is displayed.\n */\n state?: State;\n\n /**\n * The message shown below the input when state is `error`\n */\n errorMessage?: string;\n\n /**\n * The state of search results. Toggles search messages within the menu.\n */\n searchState?: SearchState;\n\n /**\n * A message shown within the menu when there are no options passed in as children, or `filteredOptions` is an empty array\n */\n searchEmptyMessage?: string;\n\n /**\n * A message shown within the menu when searchState is `error`\n */\n searchErrorMessage?: string;\n\n /**\n * A message shown within the menu when searchState is `loading`\n */\n searchLoadingMessage?: string;\n\n /**\n * A callback called when the search input changes.\n * Receives a single argument that is the current input value.\n * Use this callback to set `searchState` and/or `filteredOptions` appropriately\n */\n onFilter?: (value: string) => void;\n\n /**\n * Defines whether the Clear button appears to the right of the input.\n */\n clearable?: boolean;\n\n /**\n * A callback fired when the Clear button is pressed.\n * Fired _after_ `onChange`, and _before_ `onFilter`\n */\n onClear?: (e: React.MouseEvent<HTMLButtonElement, MouseEvent>) => void;\n\n /**\n * An array used to define which options are displayed.\n * Do not remove options from the JSX children, as this will affect the selected options\n */\n filteredOptions?: Array<string>;\n\n /**\n * Defines where the ellipses appear in a Chip when the length exceeds the `chipCharacterLimit`\n */\n chipTruncationLocation?: TruncationLocation;\n\n /**\n * Defined the character limit of a multiselect Chip before they start truncating.\n * Note: the three ellipses dots are included in the character limit.\n */\n chipCharacterLimit?: number;\n\n /**\n * Specifies that the popover content should be rendered at the end of the DOM,\n * rather than in the DOM tree.\n *\n * default: `true`\n */\n usePortal?: boolean;\n\n /**\n * When usePortal is `true`, specifies a class name to apply to the root element of the portal.\n */\n portalClassName?: undefined;\n\n /**\n * When usePortal is `true`, specifies an element to portal within. The default behavior is to generate a div at the end of the document to render within.\n */\n portalContainer?: null;\n\n /**\n * When usePortal is `true`, specifies the scrollable element to position relative to.\n */\n scrollContainer?: null;\n\n /**\n * Number that controls the z-index of the popover element directly.\n */\n popoverZIndex?: number;\n}\n\nexport type ComboboxProps<M extends boolean> = Either<\n BaseComboboxProps & ComboboxMultiselectProps<M>,\n 'label' | 'aria-label'\n>;\n\n/**\n * Combobox Option Props\n */\n\ntype ListItemProps = Omit<ComponentPropsWithoutRef<'li'>, 'onClick' | 'value'>;\n\ninterface SharedComboboxOptionProps {\n /**\n * The internal value of the option. Used as the identifier in Combobox `initialValue`, value and filteredOptions.\n * When undefined, this is set to `_.kebabCase(displayName)`\n */\n value?: string;\n\n /**\n * The display value of the option. Used as the rendered string within the menu and chips.\n * When undefined, this is set to `value`\n */\n displayName?: string;\n\n /**\n * The icon to display to the left of the option in the menu.\n */\n glyph?: ReactElement;\n\n /**\n * Defines whether the option is disabled.\n * Node: disabled options are still rendered in the menu, but not selectable.\n */\n disabled?: boolean;\n\n /**\n * Styling Prop\n */\n className?: string;\n\n /**\n * Optional descriptive text under the displayName.\n */\n description?: string;\n\n /**\n * Callback fired when an option is clicked.\n */\n onClick?: (\n event: React.SyntheticEvent<HTMLLIElement, Event>,\n value: string,\n ) => void;\n}\n\ntype RequiredComboboxOptionProps = Required<\n Pick<SharedComboboxOptionProps, 'value' | 'displayName'>\n>;\n\ntype BaseComboboxOptionProps = ListItemProps & SharedComboboxOptionProps;\n\nexport type ComboboxOptionProps = Either<\n BaseComboboxOptionProps,\n 'value' | 'displayName'\n>;\n\nexport interface OptionObject\n extends Pick<SharedComboboxOptionProps, 'description' | 'onClick'>,\n RequiredComboboxOptionProps {\n isDisabled: boolean;\n hasGlyph?: boolean;\n}\n\nexport interface InternalComboboxOptionProps\n extends ListItemProps,\n Omit<SharedComboboxOptionProps, 'value' | 'displayName'>,\n RequiredComboboxOptionProps {\n isSelected: boolean;\n isFocused: boolean;\n setSelected: () => void;\n index: number;\n}\n\n/**\n * Combobox Group Props\n */\n\nexport interface ComboboxGroupProps {\n /**\n * Label for the group of options\n */\n label: string;\n\n /**\n * Options in the group. Must be one or more `ComboboxOption` components\n */\n children: React.ReactNode;\n\n /**\n * Styling prop\n */\n className?: string;\n}\n\n/**\n * Combobox Chip\n */\n\nexport interface ChipProps {\n displayName: string;\n isFocused: boolean;\n onRemove: () => void;\n onFocus: () => void;\n}\n","import { css } from '@leafygreen-ui/emotion';\nimport { Theme } from '@leafygreen-ui/lib';\nimport { palette } from '@leafygreen-ui/palette';\nimport { transitionDuration, typeScales } from '@leafygreen-ui/tokens';\n\nimport { ComboboxSize } from '../Combobox.types';\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 * Util to get the chip height\n * `lineHeight + (2 * paddingY)`\n */\nexport const getChipHeight = (size: ComboboxSize) => {\n return lineHeight[size] + 2 * chipWrapperPaddingY[size];\n};\n\nexport const chipWrapperBaseStyle = css`\n display: inline-flex;\n align-items: center;\n overflow: hidden;\n white-space: nowrap;\n box-sizing: border-box;\n border-radius: 4px;\n`;\n\nexport const chipWrapperSizeStyle = (size: ComboboxSize) => css`\n font-size: ${fontSize[size]}px;\n line-height: ${lineHeight[size]}px;\n`;\n\nexport const chipWrapperThemeStyle: Record<Theme, string> = {\n [Theme.Light]: css`\n color: ${palette.black};\n background-color: ${palette.gray.light2};\n\n // TODO: - refine these styles with Design\n &:focus-within {\n background-color: ${palette.blue.light2};\n }\n `,\n [Theme.Dark]: css`\n color: ${palette.gray.light2};\n background-color: ${palette.gray.dark2};\n\n &:focus-within {\n background-color: ${palette.blue.dark2};\n }\n `,\n};\n\nexport const disabledBaseChipWrapperStyles = css`\n cursor: not-allowed;\n pointer-events: none;\n`;\n\nexport const disabledChipWrapperStyle: Record<Theme, string> = {\n [Theme.Light]: css`\n color: ${palette.gray.base};\n background-color: ${palette.gray.light3};\n `,\n [Theme.Dark]: css`\n color: ${palette.gray.dark2};\n background-color: ${palette.gray.dark4};\n box-shadow: inset 0 0 1px 1px ${palette.gray.dark2};\n `,\n};\n\nexport const chipTextSizeStyle: Record<ComboboxSize, string> = {\n [ComboboxSize.XSmall]: css`\n padding-inline-start: 6px;\n padding-inline-end: 2px;\n padding-block: ${chipWrapperPaddingY[ComboboxSize.XSmall]}px;\n `,\n [ComboboxSize.Small]: css`\n padding-inline-start: 6px;\n padding-inline-end: 2px;\n padding-block: ${chipWrapperPaddingY[ComboboxSize.Small]}px;\n `,\n [ComboboxSize.Default]: css`\n padding-inline-start: 6px;\n padding-inline-end: 2px;\n padding-block: ${chipWrapperPaddingY[ComboboxSize.Default]}px;\n `,\n [ComboboxSize.Large]: css`\n padding-inline: 10px;\n padding-block: ${chipWrapperPaddingY[ComboboxSize.Large]}px;\n `,\n};\n\nexport const chipButtonStyle = css`\n position: relative;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 100%;\n outline: none;\n border: none;\n background-color: transparent;\n cursor: pointer;\n transition: background-color ${transitionDuration.faster}ms ease-in-out;\n padding: 0 2px;\n`;\n\nexport const chipButtonSizeStyle = (size: ComboboxSize) => css`\n height: ${getChipHeight(size)}px;\n`;\n\nexport const chipButtonThemeStyle: Record<Theme, string> = {\n [Theme.Light]: css`\n color: ${palette.gray.dark2};\n\n &:hover {\n color: ${palette.black};\n background-color: ${palette.gray.light1};\n }\n `,\n [Theme.Dark]: css`\n color: ${palette.gray.light1};\n\n &:hover {\n color: ${palette.gray.light3};\n background-color: ${palette.gray.dark1};\n }\n `,\n};\n\nexport const chipButtonBaseDisabledStyles = css`\n cursor: not-allowed;\n &:hover {\n color: inherit;\n background-color: unset;\n }\n`;\n\nexport const chipButtonDisabledStyle: Record<Theme, string> = {\n [Theme.Light]: css`\n color: ${palette.gray.light1};\n `,\n [Theme.Dark]: css`\n color: ${palette.gray.dark2};\n `,\n};\n","import { transparentize } from 'polished';\n\nimport { css } from '@leafygreen-ui/emotion';\nimport { createUniqueClassName, Theme } from '@leafygreen-ui/lib';\nimport { palette } from '@leafygreen-ui/palette';\nimport {\n focusRing,\n fontFamilies,\n hoverRing,\n spacing,\n transitionDuration,\n typeScales,\n} from '@leafygreen-ui/tokens';\n\nimport { fontSize, getChipHeight, lineHeight } from '../Chip/Chip.styles';\nimport { ComboboxSize as Size, Overflow } from '../Combobox.types';\n\n// Rename the variable defined in chip styles\nconst inputHeight = getChipHeight;\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 chipClassName = createUniqueClassName('combobox-chip');\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 &:hover {\n box-shadow: ${hoverRing[Theme.Light].gray};\n }\n `,\n [Theme.Dark]: css`\n color: ${palette.gray.light2};\n background-color: ${palette.gray.dark4};\n border-color: ${palette.gray.base};\n\n &:hover {\n box-shadow: ${hoverRing[Theme.Dark].gray};\n }\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((${getChipHeight(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.dark2,\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 { createContext } from 'react';\n\nimport {\n ComboboxSize,\n Overflow,\n SearchState,\n State,\n TruncationLocation,\n} from '../Combobox.types';\n\ninterface 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 ComboboxContext = createContext<ComboboxData>({\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","import React, { useContext, useEffect, useMemo, useRef } from 'react';\n\nimport { cx } from '@leafygreen-ui/emotion';\nimport Icon from '@leafygreen-ui/icon';\nimport InlineDefinition from '@leafygreen-ui/inline-definition';\nimport { useDarkMode } from '@leafygreen-ui/leafygreen-provider';\nimport { keyMap } from '@leafygreen-ui/lib';\n\nimport { ChipProps, Overflow } from '../Combobox.types';\nimport { chipClassName } from '../Combobox/Combobox.styles';\nimport { ComboboxContext } from '../ComboboxContext';\n\nimport {\n chipButtonBaseDisabledStyles,\n chipButtonDisabledStyle,\n chipButtonSizeStyle,\n chipButtonStyle,\n chipButtonThemeStyle,\n chipTextSizeStyle,\n chipWrapperBaseStyle,\n chipWrapperSizeStyle,\n chipWrapperThemeStyle,\n disabledBaseChipWrapperStyles,\n disabledChipWrapperStyle,\n} from './Chip.styles';\n\nexport const Chip = React.forwardRef<HTMLSpanElement, ChipProps>(\n ({ displayName, isFocused, onRemove, onFocus }: ChipProps, forwardedRef) => {\n const { darkMode, theme } = useDarkMode();\n const {\n size,\n disabled,\n overflow,\n chipTruncationLocation = 'end',\n chipCharacterLimit = 12,\n popoverZIndex,\n } = useContext(ComboboxContext);\n\n const isTruncated =\n overflow !== Overflow.scrollX &&\n !!chipCharacterLimit &&\n !!chipTruncationLocation &&\n chipTruncationLocation !== 'none' &&\n displayName.length > chipCharacterLimit;\n\n const buttonRef = useRef<HTMLButtonElement>(null);\n\n const truncatedName = useMemo(() => {\n if (isTruncated) {\n const ellipsis = '…';\n const chars = chipCharacterLimit - 3; // ellipsis dots included in the char limit\n\n switch (chipTruncationLocation) {\n case 'start': {\n const end = displayName\n .substring(displayName.length - chars)\n .trim();\n return ellipsis + end;\n }\n\n case 'middle': {\n const start = displayName.substring(0, chars / 2).trim();\n const end = displayName\n .substring(displayName.length - chars / 2)\n .trim();\n return start + ellipsis + end;\n }\n\n case 'end': {\n const start = displayName.substring(0, chars).trim();\n return start + ellipsis;\n }\n\n default: {\n return displayName;\n }\n }\n }\n\n return false;\n }, [chipCharacterLimit, chipTruncationLocation, displayName, isTruncated]);\n\n useEffect(() => {\n if (isFocused && !disabled) {\n buttonRef?.current?.focus();\n }\n }, [disabled, forwardedRef, isFocused]);\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (\n !disabled &&\n (e.keyCode === keyMap.Delete ||\n e.keyCode === keyMap.Backspace ||\n e.keyCode === keyMap.Enter ||\n e.keyCode === keyMap.Space)\n ) {\n onRemove();\n }\n };\n\n const handleChipClick = (e: React.MouseEvent) => {\n // Did not click button\n if (!buttonRef.current?.contains(e.target as Node)) {\n onFocus();\n }\n };\n\n const handleButtonClick = () => {\n if (!disabled) {\n onRemove();\n }\n };\n\n return (\n // eslint-disable-next-line jsx-a11y/click-events-have-key-events\n <span\n role=\"option\"\n aria-selected={isFocused}\n data-testid=\"lg-combobox-chip\"\n ref={forwardedRef}\n className={cx(\n chipClassName,\n chipWrapperBaseStyle,\n chipWrapperThemeStyle[theme],\n chipWrapperSizeStyle(size),\n {\n [cx(\n disabledChipWrapperStyle[theme],\n disabledBaseChipWrapperStyles,\n )]: disabled,\n },\n )}\n onClick={handleChipClick}\n onKeyDown={handleKeyDown}\n tabIndex={-1}\n >\n <span className={cx(chipTextSizeStyle[size])}>\n {truncatedName ? (\n <InlineDefinition\n darkMode={darkMode}\n definition={displayName}\n align=\"bottom\"\n popoverZIndex={popoverZIndex}\n >\n {truncatedName}\n </InlineDefinition>\n ) : (\n displayName\n )}\n </span>\n <button\n aria-label={`Deselect ${displayName}`}\n aria-disabled={disabled}\n disabled={disabled}\n ref={buttonRef}\n className={cx(\n chipButtonStyle,\n chipButtonThemeStyle[theme],\n chipButtonSizeStyle(size),\n {\n [cx(\n chipButtonDisabledStyle[theme],\n chipButtonBaseDisabledStyles,\n )]: disabled,\n },\n )}\n onClick={handleButtonClick}\n >\n <Icon glyph=\"X\" />\n </button>\n </span>\n );\n },\n);\nChip.displayName = 'Chip';\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 '../Chip/Chip.styles';\nimport { ComboboxSize as Size } from '../Combobox.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.dark3};\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 { ComboboxGroupProps } from '../Combobox.types';\n\nimport {\n comboboxGroupLabel,\n comboboxGroupLabelThemeStyle,\n comboboxGroupStyle,\n} from './ComboboxGroup.styles';\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 from '@leafygreen-ui/popover';\nimport { Error } from '@leafygreen-ui/typography';\n\nimport { ComboboxProps } from '../Combobox.types';\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} & Pick<\n ComboboxProps<any>,\n | 'searchLoadingMessage'\n | 'searchErrorMessage'\n | 'searchEmptyMessage'\n | 'usePortal'\n | 'portalClassName'\n | 'portalContainer'\n | 'scrollContainer'\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.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 '../Chip/Chip.styles';\nimport { ComboboxSize } from '../Combobox.types';\nimport {\n getMenuItemHeight,\n menuItemPadding,\n} from '../ComboboxMenu/Menu.styles';\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 '../Combobox.types';\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, keyMap as _keyMap } from '@leafygreen-ui/lib';\n\nimport { OptionObject } from '../Combobox.types';\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 '../Combobox.types';\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 {\n ComboboxOptionProps,\n ComboboxSize,\n InternalComboboxOptionProps,\n} from '../Combobox.types';\nimport { ComboboxContext } from '../ComboboxContext';\nimport { wrapJSX } from '../utils';\n\nimport {\n comboboxOptionSizeStyle,\n displayNameStyle,\n multiselectIconLargePosition,\n multiselectIconPosition,\n} from './ComboboxOption.styles';\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 '../Combobox.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 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 { Chip } from '../Chip';\nimport {\n ComboboxElement,\n ComboboxProps,\n ComboboxSize,\n getNullSelection,\n onChangeType,\n OptionObject,\n Overflow,\n SearchState,\n SelectValueType,\n State,\n TruncationLocation,\n} from '../Combobox.types';\nimport { ComboboxContext } from '../ComboboxContext';\nimport { InternalComboboxGroup } from '../ComboboxGroup';\nimport { ComboboxMenu } from '../ComboboxMenu';\nimport { InternalComboboxOption } from '../ComboboxOption';\nimport {\n checkScrollPosition,\n flattenChildren,\n getDisplayNameForValue,\n getNameAndValue,\n getOptionObjectFromValue,\n getValueForDisplayName,\n} from '../utils';\n\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';\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 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>('');\n const prevValue = usePrevious(inputValue);\n const [focusedChip, setFocusedChip] = useState<string | null>(null);\n const [shouldShowOverflowShadow, setShouldShowOverflowShadow] =\n useState<boolean>(false);\n\n const doesSelectionExist =\n !isNull(selection) &&\n ((isArray(selection) && selection.length > 0) || isString(selection));\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\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 // clear text\n setInputValue('');\n }\n }\n setSelection(newSelection as SelectValueType<M>);\n (onChange as onChangeType<true>)?.(\n newSelection as SelectValueType<true>,\n );\n } else {\n const newSelection: SelectValueType<M> = value as SelectValueType<M>;\n setSelection(newSelection);\n (onChange as onChangeType<false>)?.(\n newSelection as SelectValueType<false>,\n );\n }\n },\n [isMultiselect, onChange, selection],\n );\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 */\n const isValueCurrentSelection = useCallback(\n (value: string): boolean => {\n return isMultiselect(selection)\n ? selection.includes(value)\n : value === selection;\n },\n [isMultiselect, 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);\n },\n [allOptions, isValueCurrentSelection],\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 <Chip\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 // Single select, and no change to selection\n if (!isMultiselect(selection) && selection === prevSelection) {\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 (exactMatchedOption && !value) {\n setSelection(exactMatchedOption.value as SelectValueType<M>);\n } else {\n // Revert the value to the previous selection\n const displayName =\n getDisplayNameForValue(\n selection as SelectValueType<false>,\n allOptions,\n ) ?? '';\n setInputValue(displayName);\n }\n }\n }, [\n allOptions,\n inputValue,\n isMultiselect,\n prevSelection,\n selection,\n value,\n visibleOptions,\n ]);\n\n const onSelect = useCallback(() => {\n if (doesSelectionExist) {\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 setInputValue(displayName);\n closeMenu();\n }\n } else {\n setInputValue('');\n }\n }, [doesSelectionExist, 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 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 if (!isEqual(selection, prevSelection)) {\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 target: { value },\n }: React.ChangeEvent<HTMLInputElement>) => {\n setInputValue(value);\n // fire any filter function passed in\n onFilter?.(value);\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.keyCode) {\n case keyMap.Tab: {\n switch (focusedElementName) {\n case 'Input': {\n if (!doesSelectionExist) {\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 (\n // Select the highlighted option iff\n // the menu is open,\n // we're focused on input element,\n // and the highlighted option is not disabled\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 && !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"],"names":["_lineHeight","_fontSize","_chipWrapperPaddingY","_templateObject","_templateObject2","_templateObject3","_templateObject4","_chipWrapperThemeStyl","_templateObject5","_templateObject6","_templateObject7","_disabledChipWrapperS","_templateObject8","_templateObject9","_templateObject10","_templateObject11","_chipTextSizeStyle","_templateObject12","_templateObject13","_templateObject14","_templateObject15","_chipButtonThemeStyle","_templateObject16","_templateObject17","_templateObject18","_chipButtonDisabledSt","ComboboxElement","ComboboxSize","XSmall","Small","Default","Large","Overflow","expandY","scrollX","expandX","State","error","none","SearchState","unset","loading","_wrapperHeight","_comboboxPadding","_comboboxThemeStyles","_comboboxDisabledStyl","_comboboxErrorStyles","_comboboxFocusStyle","_iconsWrapperSizeStyl","_templateObject19","_templateObject20","_templateObject21","_templateObject22","_inputElementThemeSty","_templateObject23","_templateObject24","_inputElementDisabled","_templateObject25","_templateObject26","_templateObject27","_templateObject28","_templateObject29","_templateObject30","_templateObject31","_errorMessageThemeSty","_templateObject32","_templateObject33","_templateObject34","_templateObject35","_templateObject36","_comboboxOverflowShad","_errorIconThemeStyles","_caretIconThemeStyles","_caretIconDisabledSty","_comboboxGroupStyle","_comboboxGroupLabelTh","lineHeight","_defineProperty","typeScales","body1","body2","fontSize","chipWrapperPaddingY","getChipHeight","size","chipWrapperBaseStyle","css","_taggedTemplateLiteral","chipWrapperSizeStyle","chipWrapperThemeStyle","Theme","Light","palette","black","gray","light2","blue","Dark","dark2","disabledBaseChipWrapperStyles","disabledChipWrapperStyle","base","light3","dark4","chipTextSizeStyle","chipButtonStyle","transitionDuration","faster","chipButtonSizeStyle","chipButtonThemeStyle","light1","dark1","chipButtonBaseDisabledStyles","chipButtonDisabledStyle","inputHeight","wrapperHeight","Size","getYPadding","comboboxPadding","y","xLeftWithChip","xLeftWithoutChip","xRight","spacing","caretIconSize","chipClassName","createUniqueClassName","comboboxParentStyle","fontFamilies","default","baseComboboxStyles","comboboxThemeStyles","dark3","white","hoverRing","comboboxSizeStyles","isMultiselectWithSelections","concat","comboboxDisabledStyles","comboboxErrorStyles","red","comboboxFocusStyle","focusRing","input","iconsWrapperBaseStyles","iconsWrapperSizeStyles","inputWrapperStyle","_ref","overflow","baseWrapperStyle","baseInputElementStyle","inputElementThemeStyle","inputElementDisabledThemeStyle","inputElementSizeStyle","inputElementTransitionStyles","isOpen","multiselectInputElementStyle","inputValue","_inputValue$length","inputLength","length","clearButtonStyle","endIconStyle","errorMessageThemeStyle","errorMessageSizeStyle","labelDescriptionContainerStyle","labelDescriptionLargeStyles","large","comboboxOverflowShadowStyles","transparentize","errorIconThemeStyles","caretIconThemeStyles","caretIconDisabledStyles","ComboboxContext","createContext","multiselect","withIcons","disabled","state","searchState","Chip","React","forwardRef","forwardedRef","displayName","isFocused","onRemove","onFocus","_useDarkMode","useDarkMode","darkMode","theme","_useContext","useContext","_useContext$chipTrunc","chipTruncationLocation","_useContext$chipChara","chipCharacterLimit","popoverZIndex","isTruncated","buttonRef","useRef","truncatedName","useMemo","chars","substring","trim","useEffect","_buttonRef$current","current","focus","createElement","role","ref","className","cx","onClick","e","_buttonRef$current2","contains","target","onKeyDown","keyCode","keyMap","Delete","Backspace","Enter","Space","tabIndex","InlineDefinition","definition","align","Icon","glyph","_menuItemPadding","_popoverThemeStyle","_menuThemeStyle","_menuMessageThemeStyl","comboboxGroupStyle","comboboxGroupLabel","fontWeights","bold","comboboxGroupLabelThemeStyle","InternalComboboxGroup","label","children","groupId","useIdAllocator","prefix","Children","count","id","Fragment","ComboboxGroup","_","Error","propTypes","PropTypes","string","node","isRequired","menuItemPadding","x","getMenuItemHeight","popoverStyle","width","arguments","undefined","popoverThemeStyle","menuBaseStyle","menuThemeStyle","menuList","menuMessageBaseStyle","menuMessageThemeStyle","menuMessageSizeStyle","loadingIconAnimation","keyframes","loadingIconStyle","_excluded","ComboboxMenu","refEl","labelId","menuWidth","searchLoadingMessage","searchErrorMessage","searchEmptyMessage","popoverProps","_objectWithoutProperties","useForwardedRef","availableSpace","useAvailableSpace","maxHeightValue","isUndefined","Math","min","renderedMenuContents","messageStyles","errorMessageStyles","color","_typeof","Popover","_extends","active","justify","adjustOnMutation","onMouseDownCapture","preventDefault","_checkMarkSizeStyle","_iconThemeStyles","_iconHighlightedStyle","_iconDisabledStyles","_checkMarkThemeStyles","_checkMarkDisabledSty","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","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","key","replacement","fill","splice","apply","wrapJSX","ComboboxOption","bool","func","_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","onChange","_ref$chipCharacterLim","_ref$usePortal","usePortal","portalClassName","portalContainer","scrollContainer","getOptionRef","useDynamicRefs","getChipRef","inputId","menuId","comboboxRef","clearButtonRef","inputWrapperRef","inputRef","menuRef","_useState2","_slicedToArray","useState","setOpen","wasOpen","usePrevious","_useState4","highlightedOption","setHighlightedOption","_useState6","selection","setSelection","prevSelection","_useState8","setInputValue","prevValue","_useState10","focusedChip","setFocusedChip","_useState12","shouldShowOverflowShadow","setShouldShowOverflowShadow","doesSelectionExist","isNull","isArray","isString","placeholderValue","closeMenu","openMenu","allOptions","isMultiselect","val","consoleOnce","setInputFocus","cursorPos","setSelectionRange","updateSelection","newSelection","clone","includes","indexOf","push","_newSelection","isValueCurrentSelection","isTextCurrentSelection","text","_options$find$value","_options$find","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","chipRef","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","start","middle","end","elementType"],"mappings":"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"}
|