@sproutsocial/seeds-react-menu 1.17.0 → 1.18.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +14 -22
- package/CHANGELOG.md +30 -0
- package/dist/esm/index.js +542 -229
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/v3/index.js +793 -1038
- package/dist/esm/v3/index.js.map +1 -1
- package/dist/v3/index.d.mts +64 -38
- package/dist/v3/index.d.ts +64 -38
- package/dist/v3/index.js +813 -1058
- package/dist/v3/index.js.map +1 -1
- package/dist/v3/menu.css +947 -0
- package/package.json +20 -21
- package/src/v3/ActionMenuStyles.tsx +169 -149
- package/src/v3/Common/ComboboxStyles.tsx +396 -511
- package/src/v3/Common/SelectIcons.tsx +17 -8
- package/src/v3/Common/SelectItem.tsx +25 -38
- package/src/v3/Common/SelectStyles.tsx +146 -144
- package/src/v3/Common/cn.ts +38 -0
- package/src/v3/MenuButtonStyles.tsx +55 -34
- package/src/v3/MultiSearchableSelect.tsx +8 -8
- package/src/v3/MultiSelect.tsx +11 -16
- package/src/v3/SingleSelect.tsx +13 -13
- package/src/v3/menu.css +947 -0
- package/tsup.config.ts +0 -1
- package/dist/esm/chunk-ROQATIB7.js +0 -357
- package/dist/esm/chunk-ROQATIB7.js.map +0 -1
- package/dist/esm/v2/index.js +0 -2089
- package/dist/esm/v2/index.js.map +0 -1
- package/dist/v2/index.d.mts +0 -108
- package/dist/v2/index.d.ts +0 -108
- package/dist/v2/index.js +0 -2280
- package/dist/v2/index.js.map +0 -1
- package/src/v2/Autocomplete/Autocomplete.stories.tsx +0 -645
- package/src/v2/Autocomplete/MultiAutocomplete.tsx +0 -487
- package/src/v2/Autocomplete/SingleAutocomplete.tsx +0 -366
- package/src/v2/Autocomplete/index.ts +0 -2
- package/src/v2/Common-V2/ComboboxContent.tsx +0 -457
- package/src/v2/Common-V2/MenuGroup.tsx +0 -60
- package/src/v2/Common-V2/MenuGroupTypes.ts +0 -30
- package/src/v2/Common-V2/MenuHeading.tsx +0 -83
- package/src/v2/Common-V2/MenuItem.tsx +0 -138
- package/src/v2/Common-V2/Popout.tsx +0 -124
- package/src/v2/Common-V2/PopoutTypes.tsx +0 -109
- package/src/v2/Common-V2/SelectToggleButton.tsx +0 -99
- package/src/v2/Common-V2/index.ts +0 -11
- package/src/v2/Common-V2/props.ts +0 -84
- package/src/v2/Common-V2/styles.tsx +0 -41
- package/src/v2/Common-V2/types.ts +0 -16
- package/src/v2/Common-V2/useHighlightedIndex.ts +0 -62
- package/src/v2/Common-V2/utils.ts +0 -238
- package/src/v2/SearchableSelect/AutocompleteContent.tsx +0 -325
- package/src/v2/SearchableSelect/SearchableMultiSelect.tsx +0 -527
- package/src/v2/SearchableSelect/SearchableSelect.tsx +0 -395
- package/src/v2/SearchableSelect/index.ts +0 -12
- package/src/v2/Select/MultiSelect.tsx +0 -417
- package/src/v2/Select/Select.stories.tsx +0 -593
- package/src/v2/Select/SingleSelect.tsx +0 -285
- package/src/v2/Select/index.ts +0 -2
- package/src/v2/index.ts +0 -2
package/dist/esm/v2/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/v2/Select/SingleSelect.tsx","../../../src/v2/Common-V2/utils.ts","../../../src/v2/Common-V2/Popout.tsx","../../../src/v2/Common-V2/PopoutTypes.tsx","../../../src/v2/Common-V2/SelectToggleButton.tsx","../../../src/v2/Common-V2/MenuItem.tsx","../../../src/v2/Common-V2/MenuHeading.tsx","../../../src/v2/Common-V2/MenuGroup.tsx","../../../src/v2/Common-V2/styles.tsx","../../../src/v2/Common-V2/useHighlightedIndex.ts","../../../src/v2/Common-V2/ComboboxContent.tsx","../../../src/v2/Select/MultiSelect.tsx","../../../src/v2/Autocomplete/SingleAutocomplete.tsx","../../../src/v2/Autocomplete/MultiAutocomplete.tsx"],"sourcesContent":["import { useState, useMemo } from \"react\";\nimport { useSelect } from \"downshift\";\nimport type { ReactNode } from \"react\";\nimport { Label } from \"@sproutsocial/seeds-react-label\";\n// This will eventually be imported from seeds-react-popout\nimport { Popout } from \"../Common-V2\";\nimport {\n isGroupHeading,\n isToggleItem,\n menuAnimationConfig,\n groupItemsWithHeadings,\n useHighlightedIndex,\n createItemToStringForDownshift,\n ComboboxContent,\n SelectToggleButton,\n} from \"../Common-V2\";\nimport {\n type DataWithId,\n type GroupedItem,\n type ToggleItem,\n type BaseSingleSelectProps,\n} from \"../Common-V2\";\n\nfunction defaultReducer(state, actionAndChanges) {\n const { changes, type } = actionAndChanges;\n\n switch (type) {\n case useSelect.stateChangeTypes.ItemClick:\n return {\n ...changes,\n isOpen: false, // close the menu after selection for single select\n highlightedIndex: 0, // reset highlight\n };\n default:\n return changes;\n }\n}\n\nexport interface SingleSelectProps<T extends DataWithId>\n extends BaseSingleSelectProps<T> {\n itemToSelection?: (item: T) => ReactNode;\n renderSelection?: (item: T | null) => ReactNode;\n triggerButtonProps?: any;\n}\n\nexport function SingleSelect<T extends DataWithId>({\n id,\n data,\n selectedItemId: controlledSelectedItemId,\n isOpen: controlledIsOpen,\n itemToKey = (item: T) => item?.id,\n itemToString,\n itemToSelection,\n renderSelection,\n renderItem,\n groupBy,\n renderGroupHeading,\n isVirtualized = false,\n estimatedItemHeight,\n placeholder,\n onSelectedItemIdChange,\n onIsOpenChange,\n stateReducer = defaultReducer,\n triggerButtonProps,\n menuProps,\n inputType = \"icon\",\n removePlaceholderItem = false,\n onPointerDownOutside,\n onInteractOutside,\n popoutPlacement,\n}: SingleSelectProps<T>) {\n const [uncontrolledSelectedItemId, setUncontrolledSelectedItemId] = useState<\n T[\"id\"] | null\n >(null);\n const [uncontrolledIsOpen, setUncontrolledIsOpen] = useState<boolean>(false);\n\n // Use controlled selectedItemId if provided, otherwise use internal state\n const isSelectedItemIdControlled = controlledSelectedItemId !== undefined;\n const selectedItemId = isSelectedItemIdControlled\n ? controlledSelectedItemId\n : uncontrolledSelectedItemId;\n\n // Convert selectedItemId to selectedItem for internal use\n const selectedItem = useMemo<T | null>(() => {\n if (selectedItemId === null || selectedItemId === undefined) {\n return null;\n }\n return data.find((item) => itemToKey(item) === selectedItemId) ?? null;\n }, [selectedItemId, data, itemToKey]);\n\n // Use controlled isOpen if provided, otherwise use internal state\n const isIsOpenControlled = controlledIsOpen !== undefined;\n const isOpen = isIsOpenControlled ? controlledIsOpen : uncontrolledIsOpen;\n\n const updateSelectedItem = (newSelectedItem: T | null) => {\n const newSelectedItemId = newSelectedItem\n ? itemToKey(newSelectedItem)\n : null;\n if (!isSelectedItemIdControlled) {\n setUncontrolledSelectedItemId(newSelectedItemId);\n }\n onSelectedItemIdChange?.(newSelectedItemId);\n };\n\n const updateIsOpen = (newIsOpen: boolean) => {\n if (!isIsOpenControlled) {\n setUncontrolledIsOpen(newIsOpen);\n }\n onIsOpenChange?.(newIsOpen);\n };\n\n // TODO: This could be made generic as a hook and used in other components\n // For Select, we show all items (no filtering)\n const items = useMemo<GroupedItem<T>[]>(() => {\n let groupedItems: GroupedItem<T>[];\n\n const placeholderItem: ToggleItem = {\n id: \"clear-selection\",\n label: placeholder,\n };\n\n if (groupBy) {\n // Group first, then add placeholderItem at the beginning\n groupedItems = groupItemsWithHeadings(data, groupBy, data, true);\n } else {\n groupedItems = data;\n }\n if (!removePlaceholderItem) {\n groupedItems = [placeholderItem, ...groupedItems];\n }\n\n return groupedItems;\n }, [data, groupBy, placeholder]);\n\n // Filter out headings for downshift\n const itemsForSelect = useMemo<(T | ToggleItem)[]>(() => {\n // This is unnecessary for single select because we don't have group headings\n return items.filter((item): item is T => !isGroupHeading(item));\n }, [items]);\n\n // Wrapper function to handle ToggleItem separately\n const itemToStringForDownshift = useMemo(\n () => createItemToStringForDownshift(itemToString),\n [itemToString]\n );\n\n const selectProps = useSelect<T | ToggleItem>({\n toggleButtonId: id,\n items: itemsForSelect,\n itemToString: itemToStringForDownshift,\n // defaultHighlightedIndex: 0,\n selectedItem: selectedItem,\n isOpen,\n stateReducer,\n onStateChange({ type, selectedItem: newSelectedItem, isOpen: newIsOpen }) {\n // Handle isOpen changes for any state change type\n if (newIsOpen !== undefined) {\n updateIsOpen(newIsOpen);\n }\n\n // Handle item selection for both click and keyboard (Enter/Space) interactions\n // When Enter/Space is pressed on a highlighted item, useSelect sets selectedItem\n // We detect selection when selectedItem changes and it's a user interaction\n const isSelectionEvent =\n type === useSelect.stateChangeTypes.ItemClick ||\n type === useSelect.stateChangeTypes.ToggleButtonKeyDownEnter;\n\n if (isSelectionEvent && newSelectedItem && newSelectedItem !== null) {\n // If placeholderItem is selected, set selectedItem to null\n // Note: placeholderItem won't be in itemsForSelect, so this check is for safety\n if (newSelectedItem.id === \"clear-selection\") {\n updateSelectedItem(null);\n } else {\n updateSelectedItem(newSelectedItem as T);\n }\n }\n },\n });\n\n const {\n isOpen: selectIsOpen,\n getToggleButtonProps,\n getLabelProps,\n getMenuProps,\n highlightedIndex: selectHighlightedIndex,\n getItemProps,\n } = selectProps;\n\n // Map the highlighted index from select (which only knows about items) to the full items array (which includes headings)\n const highlightedIndex = useHighlightedIndex(\n items,\n itemsForSelect,\n selectHighlightedIndex,\n !!groupBy,\n false // Single select components hardcode selectHeadings to false\n );\n\n const buttonContent = renderSelection\n ? renderSelection(selectedItem)\n : selectedItem\n ? itemToSelection\n ? itemToSelection(selectedItem)\n : itemToString(selectedItem)\n : placeholder;\n\n const toggleButtonProps = getToggleButtonProps();\n // Downshift adds aria-labelledby by default, which can conflict with our Label usage\n toggleButtonProps[\"aria-labelledby\"] = undefined;\n if (!selectIsOpen) {\n // Remove aria-controls when the menu is closed to avoid referencing a non-existent element\n // @ts-expect-error downshift types require aria-controls even though it is not required\n toggleButtonProps[\"aria-controls\"] = undefined;\n }\n\n return (\n <Popout\n open={selectIsOpen}\n onOpenChange={updateIsOpen}\n side={popoutPlacement}\n animationConfig={menuAnimationConfig}\n onOpenAutoFocus={(e) => {\n // Prevent default auto-focus behavior\n e.preventDefault();\n }}\n onCloseAutoFocus={(e) => {\n // Prevent default auto-focus behavior\n e.preventDefault();\n }}\n onPointerDownOutside={onPointerDownOutside}\n onInteractOutside={onInteractOutside}\n content={\n <ComboboxContent\n items={items}\n getMenuProps={getMenuProps}\n getItemProps={(props: { index: number }) => {\n // Only apply getItemProps to actual items, not headings or ToggleItems\n const item = items[props.index];\n if (isToggleItem(item)) {\n // Handle ToggleItem (placeholderItem) clicks manually\n return {\n onClick: () => {\n if (item.id === \"clear-selection\") {\n updateSelectedItem(null);\n }\n },\n };\n }\n const dataItem = item as T;\n // Find the index in itemsForSelect using itemToKey for safer comparison\n const itemIndex = itemsForSelect.findIndex((selectItem) => {\n if (isToggleItem(selectItem)) {\n return false;\n }\n return itemToKey(selectItem as T) === itemToKey(dataItem);\n });\n if (itemIndex === -1) {\n return {};\n }\n return getItemProps({ item: dataItem, index: itemIndex });\n }}\n selectedItems={selectedItem ? [selectedItem] : []}\n highlightedIndex={highlightedIndex ?? -1}\n renderItem={renderItem}\n renderGroupHeading={renderGroupHeading}\n itemToKey={itemToKey}\n itemToString={itemToString}\n inputType={inputType}\n isVirtualized={isVirtualized}\n estimatedItemHeight={estimatedItemHeight}\n groupBy={groupBy}\n selectHeadings={false}\n {...menuProps}\n />\n }\n >\n <SelectToggleButton\n {...toggleButtonProps}\n {...triggerButtonProps}\n isOpen={selectIsOpen}\n >\n {buttonContent}\n </SelectToggleButton>\n </Popout>\n );\n}\n","import React from \"react\";\nimport { MOTION_DURATION_FAST } from \"@sproutsocial/seeds-motion/unitless\";\nimport { type EnumPlacements } from \"@sproutsocial/seeds-react-popout\";\nimport type {\n DataWithId,\n GroupedItem,\n GroupHeading,\n ToggleItem,\n} from \"./types\";\n\nexport function isGroupHeading<T>(item: GroupedItem<T>): item is GroupHeading {\n return (\n typeof item === \"object\" &&\n item !== null &&\n \"type\" in item &&\n item.type === \"heading\"\n );\n}\n\nexport function isToggleItem<T>(\n item: GroupedItem<T> | T | ToggleItem | null\n): item is ToggleItem {\n return (\n typeof item === \"object\" &&\n item !== null &&\n \"label\" in item &&\n !(\"type\" in item) &&\n Object.keys(item).length === 2 && // ToggleItem only has id and label\n \"id\" in item\n );\n}\n\nexport const menuPlacementOrigin: {\n [key in EnumPlacements]?: { originX: number; originY: number };\n} = {\n top: { originX: 0.5, originY: 1 },\n [\"top-start\"]: { originX: 0, originY: 1 },\n [\"top-end\"]: { originX: 1, originY: 1 },\n bottom: { originX: 0.5, originY: 0 },\n [\"bottom-start\"]: { originX: 0, originY: 0 },\n [\"bottom-end\"]: { originX: 1, originY: 0 },\n left: { originX: 1, originY: 0.5 },\n [\"left-start\"]: { originX: 1, originY: 0 },\n [\"left-end\"]: { originX: 1, originY: 1 },\n right: { originX: 0, originY: 0.5 },\n [\"right-start\"]: { originX: 0, originY: 0 },\n [\"right-end\"]: { originX: 0, originY: 1 },\n};\n\nexport const menuAnimationConfig = {\n // Turning off layout true. This seems to be what causes the crazy animations when searching.\n // layout: true,\n variants: {\n initial: (\n custom: { placement: EnumPlacements } = { placement: \"bottom\" }\n ) => ({\n ...menuPlacementOrigin[custom.placement],\n scale: 0,\n opacity: 0,\n }),\n animate: (\n custom: { placement: EnumPlacements } = { placement: \"bottom\" }\n ) => ({\n ...menuPlacementOrigin[custom.placement],\n opacity: 1,\n scale: 1,\n\n transition: {\n type: \"tween\",\n duration: MOTION_DURATION_FAST,\n ease: \"circOut\",\n },\n }),\n exit: {\n opacity: 0,\n scale: 1,\n transition: {\n type: \"tween\",\n duration: MOTION_DURATION_FAST,\n ease: \"circIn\",\n },\n },\n },\n initial: \"initial\",\n whileInView: \"animate\",\n viewport: { once: true },\n exit: \"exit\",\n};\n\nexport function getFilteredItems<T extends DataWithId>(\n data: T[],\n inputValue: string,\n itemToSearchString: (item: T) => string,\n itemToString: (item: T) => string,\n options?: {\n selectedItems?: T[];\n selectedItem?: T | null;\n showSelectedItems?: boolean;\n }\n) {\n const lowerCasedInputValue = inputValue.toLowerCase();\n\n // If the item string exactly matches the input value, return for all values\n // This means an item was selected, and we should allow users to change easily\n if (\n options?.selectedItem &&\n itemToString(options?.selectedItem).toLowerCase() === lowerCasedInputValue\n ) {\n return data;\n }\n\n return data.filter(function filterItem(item) {\n // For multi-select: filter out selected items if showSelectedItems is false\n if (\n options?.selectedItems &&\n !options.showSelectedItems &&\n options.selectedItems.includes(item)\n ) {\n return false;\n }\n\n // Get the pipe-delimited search string for this item\n const searchString = itemToSearchString(item);\n // Split on '|' and check if any part matches the input value\n const searchableParts = searchString\n .split(\"|\")\n .map((part) => part.toLowerCase().trim());\n\n return searchableParts.some((part) => part.includes(lowerCasedInputValue));\n });\n}\n\nexport function groupItems<T extends DataWithId>(\n items: T[],\n groupBy: (item: T) => string,\n allData?: T[]\n): Map<string, T[]> {\n if (items.length === 0) {\n return new Map<string, T[]>();\n }\n\n // Determine group order from allData if provided, otherwise use items\n const dataForOrder = allData || items;\n const groupOrder: string[] = [];\n const seenGroups = new Set<string>();\n\n // First pass: determine group order from allData\n for (const item of dataForOrder) {\n let groupKey = groupBy(item);\n if (item.id === \"clear-selection\") {\n continue; // Skip placeholder item for group order\n }\n\n if (!seenGroups.has(groupKey)) {\n seenGroups.add(groupKey);\n groupOrder.push(groupKey);\n }\n }\n\n // Group filtered items by the groupBy function\n const grouped = new Map<string, T[]>();\n for (const item of items) {\n let groupKey = groupBy(item);\n if (item.id === \"clear-selection\") {\n continue; // Skip placeholder item for grouping\n }\n\n if (!grouped.has(groupKey)) {\n grouped.set(groupKey, []);\n }\n grouped.get(groupKey)!.push(item);\n }\n\n // Sort the groups by the group order\n const sortedGrouped = new Map<string, T[]>();\n for (const groupKey of groupOrder) {\n const groupItems = grouped.get(groupKey);\n if (groupItems) {\n sortedGrouped.set(groupKey, groupItems);\n }\n }\n\n return sortedGrouped;\n}\n\nexport function groupItemsWithHeadings<T extends DataWithId>(\n items: T[],\n groupBy: (item: T) => string,\n allData?: T[],\n selectHeadings = false\n): GroupedItem<T>[] {\n if (items.length === 0) {\n return [];\n }\n\n const grouped = groupItems(items, groupBy, allData);\n\n // Create the result array with headings and items in the determined order\n // Only include groups that have items in the filtered items\n const result: GroupedItem<T>[] = [];\n for (const groupKey of grouped.keys()) {\n const groupItems = grouped.get(groupKey);\n // Only include groups that have items in the filtered data\n if (groupItems && groupItems.length > 0) {\n // Add heading\n if (selectHeadings) {\n result.push({\n id: `heading-${groupKey}`,\n type: \"heading\",\n label: groupKey,\n });\n }\n // Add items in this group\n result.push(...groupItems);\n }\n }\n\n return result;\n}\n\n/**\n * Creates a wrapper function for itemToString that handles ToggleItem and GroupHeading separately.\n * These items are not selectable (only type T items can be selected), so they use their label property directly.\n */\nexport function createItemToStringForDownshift<T extends DataWithId>(\n itemToString: (item: T | null) => string\n) {\n return (item: T | ToggleItem | GroupHeading | null): string => {\n if (!item) return \"\";\n if (isToggleItem(item)) {\n return item.label;\n }\n if (isGroupHeading(item)) {\n return item.label;\n }\n return itemToString(item);\n };\n}\n","import * as React from \"react\";\nimport { AnimatePresence, motion } from \"motion/react\";\nimport * as Popover from \"@radix-ui/react-popover\";\nimport { MOTION_DURATION_FAST } from \"@sproutsocial/seeds-motion/unitless\";\nimport type { TypePopoutProps } from \"./PopoutTypes\";\nimport styled from \"styled-components\";\n\nconst defaultAnimationConfig = {\n initial: { opacity: 0 },\n animate: { opacity: 1 },\n exit: { opacity: 0 },\n transition: {\n ease: \"circOut\",\n type: \"tween\",\n duration: MOTION_DURATION_FAST,\n },\n};\n\nconst StyledContent = styled(Popover.Content)`\n width: var(--radix-popover-trigger-width);\n max-height: var(--radix-popover-content-available-height);\n // This should be a prop on the Popout component\n z-index: 7;\n`;\n\nconst StyledMotionDiv = styled(motion.div)`\n background-color: ${({ theme }) => theme.colors.container.background.base};\n border: ${({ theme }) => theme.borders[500]};\n border-color: ${({ theme }) => theme.colors.container.border.base};\n border-radius: ${({ theme }) => theme.radii[500]};\n box-shadow: ${({ theme }) => theme.shadows.medium};\n padding: ${({ theme }) => theme.space[400]};\n`;\n\nexport function Popout({\n children,\n content,\n open,\n defaultOpen,\n onOpenChange,\n animationConfig = defaultAnimationConfig,\n side = \"bottom\",\n sideOffset = 8,\n align = \"center\",\n alignOffset = 0,\n onOpenAutoFocus,\n onEscapeKeyDown,\n onCloseAutoFocus,\n onPointerDownOutside,\n onInteractOutside,\n ...rest\n}: TypePopoutProps) {\n const [isOpen, setIsOpen] = React.useState(defaultOpen ?? false);\n\n const handleOpenChange = React.useCallback(\n (newOpen: boolean) => {\n setIsOpen(newOpen);\n onOpenChange?.(newOpen);\n },\n [onOpenChange]\n );\n\n // Use controlled state if open prop is provided\n const isControlled = open !== undefined;\n const popoverOpen = isControlled ? open : isOpen;\n const popoverOnOpenChange = isControlled ? onOpenChange : handleOpenChange;\n\n // Handle ref forwarding for components that use innerRef instead of ref\n // (e.g., seeds-react-button)\n // Radix UI's asChild passes ref, but Button uses innerRef\n const radixRef = React.useRef<HTMLButtonElement | null>(null);\n\n // The popout needs its role and aria controls props to be overridden.\n // This should not be treated like a dialog when used in a menu.\n // The combobox itself needs aria-expanded and aria-controls\n // We could also likely try to collapse the popout and downshift props by merging them and their onclick\n // At the moment, if the popout content is the combobox the onclick gets overridden by the popout\n return (\n <Popover.Root open={popoverOpen} onOpenChange={popoverOnOpenChange}>\n {/*\n The Anchor provides the positioning reference for the popout content.\n We can't rely on Popover.Trigger's ref for positioning because the children\n (e.g. Input) are class components that don't support forwardRef — Radix's\n asChild would connect the ref to the class instance rather than the DOM node.\n The Anchor is absolutely positioned at the top or bottom edge of the wrapper\n so the popout content appears correctly above or below the trigger.\n */}\n <div style={{ position: \"relative\" }}>\n <Popover.Trigger ref={radixRef} asChild>\n {children}\n </Popover.Trigger>\n <Popover.Anchor\n style={{\n position: \"absolute\",\n top: side === \"top\" ? 0 : \"100%\",\n left: 0,\n right: 0,\n height: \"1px\",\n }}\n />\n </div>\n <Popover.Portal>\n <StyledContent\n side={side}\n sideOffset={sideOffset}\n align={align}\n alignOffset={alignOffset}\n onOpenAutoFocus={onOpenAutoFocus}\n onEscapeKeyDown={onEscapeKeyDown}\n onCloseAutoFocus={onCloseAutoFocus}\n onPointerDownOutside={onPointerDownOutside}\n onInteractOutside={onInteractOutside}\n // This only needs added to Popouts used in Menus\n // those do not need the dialog role which radix applies automatically\n role=\"presentation\"\n >\n <StyledMotionDiv {...animationConfig} {...rest}>\n {content}\n </StyledMotionDiv>\n </StyledContent>\n </Popover.Portal>\n </Popover.Root>\n );\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport * as React from \"react\";\nimport type {\n TypeSystemCommonProps,\n TypeSystemLayoutProps,\n TypeStyledComponentsCommonProps,\n} from \"@sproutsocial/seeds-react-system-props\";\nimport type { HTMLMotionProps } from \"motion/react\";\n\nexport interface TypePopoutProps\n extends TypeStyledComponentsCommonProps,\n TypeSystemCommonProps,\n TypeSystemLayoutProps,\n Omit<\n React.ComponentPropsWithoutRef<\"div\">,\n \"color\" | \"children\" | \"content\"\n > {\n /**\n * The content that the popout should be attached to (renders in Popover.Trigger)\n */\n children: React.ReactElement<any>;\n\n /**\n * The content to be shown in the popout (renders in Popover.Content)\n */\n content: React.ReactNode;\n\n /**\n * Whether the popout is open (controlled)\n */\n open?: boolean;\n\n /**\n * Default open state (uncontrolled)\n */\n defaultOpen?: boolean;\n\n /**\n * Callback fired when the open state changes\n */\n onOpenChange?: (open: boolean) => void;\n\n /**\n * Used to override the default Popout animations.\n * Any props that are valid for use on a Motion div can be passed here as an object.\n * See https://motion.dev/docs/react-motion-component#props\n */\n animationConfig?: Omit<HTMLMotionProps<\"div\">, \"children\">;\n\n /**\n * The preferred side of the trigger to render against when open.\n * @default \"bottom\"\n */\n side?: \"top\" | \"right\" | \"bottom\" | \"left\";\n\n /**\n * The distance in pixels from the trigger.\n * @default 8\n */\n sideOffset?: number;\n\n /**\n * The preferred alignment against the trigger.\n * @default \"center\"\n */\n align?: \"start\" | \"center\" | \"end\";\n\n /**\n * An offset in pixels from the \"start\" or \"end\" alignment options.\n * @default 0\n */\n alignOffset?: number;\n\n /**\n * Event handler called when the popout content tries to auto-focus on open.\n * Can be used to prevent the default auto-focus behavior or customize it.\n * If not provided, defaults to allowing auto-focus on the content.\n */\n onOpenAutoFocus?: (event: Event) => void;\n\n /**\n * Event handler called when the Escape key is pressed while the popout is open.\n * Can be used to prevent the default close behavior or customize it.\n */\n onEscapeKeyDown?: (event: KeyboardEvent) => void;\n\n /**\n * Event handler called when the popout tries to return focus to the trigger on close.\n * Can be used to prevent the default focus return behavior or customize it.\n */\n onCloseAutoFocus?: (event: Event) => void;\n\n /**\n * Event handler called when a pointer down event occurs outside the popout content.\n * Call `event.preventDefault()` to prevent the default dismiss behavior.\n * Useful when the Popout is nested inside a Radix Dialog (e.g. ModalV2) to\n * avoid conflicts between nested DismissableLayer instances.\n */\n onPointerDownOutside?: (\n event: CustomEvent<{ originalEvent: PointerEvent }>\n ) => void;\n\n /**\n * Event handler called when an interaction (pointer or focus) occurs outside\n * the popout content. Call `event.preventDefault()` to prevent the popout\n * from closing.\n */\n onInteractOutside?: (event: CustomEvent<{ originalEvent: Event }>) => void;\n}\n","import styled, { css } from \"styled-components\";\nimport { Icon } from \"@sproutsocial/seeds-react-icon\";\nimport {\n MenuToggleButton,\n type TypeMenuToggleButtonProps,\n} from \"../../MenuToggleButton\";\nimport Button from \"@sproutsocial/seeds-react-button\";\n\nexport interface TypeSelectToggleButtonProps extends TypeMenuToggleButtonProps {\n invalid?: boolean;\n isOpen?: boolean;\n shouldOverflow?: boolean;\n}\n\n// I don't think this needs to be a button.\n// Looking at https://www.w3.org/WAI/ARIA/apg/patterns/combobox/examples/combobox-select-only/\n// It appears that a div is acceptable.\nexport const StyledSelectToggleButton = styled(\n Button\n)<TypeSelectToggleButtonProps>`\n border-color: ${(props) => props.theme.colors.form.border.base};\n width: 100%;\n\n ${(props) =>\n props.invalid &&\n css`\n border-color: ${(props) => props.theme.colors.form.border.error};\n `}\n`;\n\nexport interface TypeStyledChevronProps {\n $isOpen?: boolean;\n invalid?: boolean;\n}\n\nconst StyledChevron = styled.div<TypeStyledChevronProps>`\n margin-left: ${({ theme }) => theme.space[300]};\n\n ${({ invalid }) =>\n invalid &&\n css`\n color: ${(props) => props.theme.colors.icon.error};\n `}\n`;\n\nconst RotatingIcon = styled(Icon)<{ $isOpen?: boolean }>`\n transition: transform 0.15s;\n\n ${({ $isOpen }) =>\n $isOpen &&\n `\n transform: rotate(-180deg);\n `}\n`;\n\nconst StyledInnerButton = styled.div`\n display: flex;\n justify-content: space-between;\n`;\n\nconst EllipsisContent = styled.div`\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n`;\n\nconst WrappedContent = styled.div`\n flex: 1;\n width: 100%;\n text-align: left;\n text-wrap: auto;\n`;\n\nexport const SelectToggleButton = ({\n children,\n isOpen,\n shouldOverflow,\n ...buttonProps\n}: TypeSelectToggleButtonProps) => {\n return (\n <StyledSelectToggleButton {...buttonProps}>\n <StyledInnerButton>\n {shouldOverflow ? (\n <WrappedContent>{children}</WrappedContent>\n ) : (\n <EllipsisContent>{children}</EllipsisContent>\n )}\n <StyledChevron $isOpen={isOpen} invalid={buttonProps.invalid}>\n <RotatingIcon\n name=\"chevron-down-outline\"\n fixedWidth\n aria-hidden\n $isOpen={isOpen}\n />\n </StyledChevron>\n </StyledInnerButton>\n </StyledSelectToggleButton>\n );\n};\n","import React, { useMemo } from \"react\";\nimport type { ReactNode, CSSProperties } from \"react\";\nimport { Icon } from \"@sproutsocial/seeds-react-icon\";\nimport { Checkbox } from \"@sproutsocial/seeds-react-checkbox\";\nimport { Switch } from \"@sproutsocial/seeds-react-switch\";\nimport { Radio } from \"@sproutsocial/seeds-react-radio\";\nimport { useTheme } from \"styled-components\";\nimport { Box } from \"@sproutsocial/seeds-react-box\";\nimport {\n StyledMenuItem,\n MenuItemActionLeft,\n MenuItemRow,\n MenuItemText,\n} from \"../../MenuItem/styles\";\nimport type { InputType } from \"../../MenuItem/MenuItemTypes\";\n\n/**\n * SelectionIndicator - handles logic for appropriate rendering of inputs\n * @returns Checkbox | Icon | Radio | Switch\n */\nconst SelectionIndicator = ({\n id,\n inputType = \"icon\",\n \"aria-labelledby\": labeledBy,\n selected,\n}: {\n id: string;\n \"aria-labelledby\": string;\n selected: boolean;\n inputType: InputType;\n}) => {\n const { space } = useTheme();\n\n const inputStub = (e: React.SyntheticEvent) => {\n e.stopPropagation();\n };\n\n switch (inputType) {\n case \"checkbox\":\n return (\n <Checkbox\n tabIndex={-1}\n onChange={() => {}}\n checked={selected}\n aria-labelledby={labeledBy}\n id={`MenuItem-${inputType}-${id}`}\n />\n );\n case \"switch\":\n return (\n <Switch\n tabIndex={-1}\n onClick={inputStub}\n checked={!!selected}\n aria-labelledby={labeledBy}\n id={`MenuItem-${inputType}-${id}`}\n />\n );\n case \"radio\":\n return (\n <Radio\n tabIndex={-1}\n checked={selected}\n id={`MenuItem-${inputType}-${id}`}\n name={`MenuItem-${inputType}`}\n aria-labelledby={labeledBy}\n />\n );\n case \"icon\":\n if (selected) {\n return <Icon name=\"check-solid\" aria-hidden size=\"small\" />;\n } else {\n return <Box width={space[\"400\"]}></Box>;\n }\n default:\n return null;\n }\n};\n\nexport interface MenuItemProps {\n children: ReactNode;\n $highlighted?: boolean;\n $active?: boolean;\n inputType?: InputType;\n selected?: boolean;\n id?: string | number;\n style?: CSSProperties;\n [key: string]: any; // For spreading getItemProps and other props\n}\n\nexport const MenuItem = ({\n children,\n $highlighted = false,\n $active = false,\n inputType,\n selected = false,\n id,\n style,\n ...props\n}: MenuItemProps) => {\n // Generate a label id for the menu item text\n const labelId = useMemo(\n () =>\n id\n ? `menu-item-child-${id}`\n : `menu-item-child-${Math.random().toString(36).substr(2, 9)}`,\n [id]\n );\n\n // If inputType is provided, wrap children with SelectionIndicator\n const content = inputType ? (\n <MenuItemRow>\n <MenuItemActionLeft>\n <SelectionIndicator\n id={String(id || \"\")}\n aria-labelledby={labelId}\n inputType={inputType}\n selected={selected}\n />\n </MenuItemActionLeft>\n <MenuItemText id={labelId}>{children}</MenuItemText>\n </MenuItemRow>\n ) : (\n children\n );\n\n return (\n <StyledMenuItem\n $highlighted={$highlighted}\n $active={$active}\n $selected={selected}\n style={style}\n {...props}\n >\n {content}\n </StyledMenuItem>\n );\n};\n","import type { ReactNode, CSSProperties } from \"react\";\nimport { MenuItem } from \"./MenuItem\";\nimport styled from \"styled-components\";\nimport Box from \"@sproutsocial/seeds-react-box\";\n\nexport interface MenuHeadingProps {\n label: string;\n renderGroupHeading?: (label: string) => string;\n virtualizedStyles?: {\n position: \"absolute\";\n top: number;\n left: number;\n width: string;\n height: string;\n transform: string;\n };\n style?: CSSProperties;\n selectable?: boolean;\n $highlighted?: boolean;\n selected?: boolean;\n id?: string | number;\n onClick?: () => void;\n [key: string]: any; // For spreading getItemProps and other props\n}\n\ninterface TypeMenuHeaderContainerProps {\n $leftAction?: boolean;\n}\n\nexport const MenuHeaderContainer = styled(Box)<TypeMenuHeaderContainerProps>`\n border-color: ${({ theme }) => theme.colors.container.border.base};\n border-bottom-width: 1px;\n border-bottom-style: solid;\n font-size: ${({ theme }) => theme.typography[200].fontSize};\n display: flex;\n flex-direction: column;\n padding: ${({ theme }) => theme.space[350]} ${({ theme }) => theme.space[400]};\n`;\n\nexport const MenuHeading = ({\n label,\n renderGroupHeading,\n style,\n selectable = false,\n $highlighted = false,\n selected = false,\n id,\n onClick,\n ...props\n}: MenuHeadingProps) => {\n const combinedStyle: CSSProperties = {\n fontWeight: \"bold\",\n ...style,\n };\n\n if (selectable) {\n return (\n <MenuItem\n style={combinedStyle}\n $highlighted={$highlighted}\n $active={false}\n inputType=\"checkbox\"\n selected={selected}\n id={id}\n onClick={onClick}\n {...props}\n >\n {renderGroupHeading ? renderGroupHeading(label) : label}\n </MenuItem>\n );\n }\n\n return (\n <MenuHeaderContainer\n style={combinedStyle}\n role=\"option\"\n aria-disabled={true}\n aria-selected={false}\n >\n {renderGroupHeading ? renderGroupHeading(label) : label}\n </MenuHeaderContainer>\n );\n};\n","import React from \"react\";\nimport type { MenuItemProps } from \"./MenuItem\";\nimport type { TypeMenuGroupProps } from \"./MenuGroupTypes\";\nimport { StyledMenuGroup, StyledTitle, StyledMenuGroupUl } from \"./styles\";\n\n/**\n * @link https://seeds.sproutsocial.com/components/seeds-react-menu/#menugroup\n *\n * @description MenuGroup is used to group lists of {@link https://seeds.sproutsocial.com/components/seeds-react-menu/#menuitem MenuItems}.\n *\n * @example\n * <ActionMenu>\n * <MenuContent>\n * <MenuGroup title=\"Group 1\" id=\"1\">\n * <MenuItem>Item 1</MenuItem>\n * </MenuGroup>\n * <MenuGroup title=\"Group 2\" id=\"2\">\n * <MenuItem>Item 2</MenuItem>\n * </MenuGroup>\n * </MenuContent>\n * </ActionMenu>\n *\n * @see {@link https://seeds.sproutsocial.com/components/seeds-react-menu/#menuitem MenuItem}\n * @see {@link https://seeds.sproutsocial.com/components/seeds-react-menu/#menucontent MenuContent}\n */\n\nconst MenuGroup = ({\n titleAs = \"h3\",\n children,\n title,\n color,\n id,\n ...rest\n}: TypeMenuGroupProps) => {\n // Generate a unique ID for the title\n const titleId = `menu-group-title-${Math.random().toString(36).slice(2, 11)}`;\n\n return (\n <StyledMenuGroup\n role=\"group\"\n id={id}\n aria-labelledby={title ? titleId : undefined}\n // TODO: fix this type since `color` should be valid here. TS can't resolve the correct type.\n // @ts-expect-error Copy Pasted from original MenuGroup\n color={color}\n {...rest}\n >\n {title && (\n <StyledTitle role=\"heading\" as={titleAs} id={titleId}>\n {title}\n </StyledTitle>\n )}\n <StyledMenuGroupUl>{children}</StyledMenuGroupUl>\n </StyledMenuGroup>\n );\n};\n\nMenuGroup.__MENU_PRIMITIVE_TYPE = \"MenuGroup\";\n\nexport { MenuGroup };\n","import styled from \"styled-components\";\nimport Text from \"@sproutsocial/seeds-react-text\";\nimport {\n border,\n layout,\n position,\n flexbox,\n grid,\n color,\n space,\n} from \"styled-system\";\nimport type { TypeStyledMenuGroupProps } from \"./MenuGroupTypes\";\n\nexport const StyledMenuGroup = styled.li<TypeStyledMenuGroupProps>`\n font-family: ${({ theme }) => theme.fontFamily};\n &:not(:last-child) {\n border-bottom: 1px solid\n ${({ theme }) => theme.colors.container.border.base};\n }\n list-style: none;\n margin: 0;\n\n ${border}\n ${position}\n ${color}\n ${flexbox}\n ${grid}\n ${layout}\n ${space}\n`;\n\nexport const StyledTitle = styled(Text.SmallSubHeadline)`\n font-size: ${({ theme }) => theme.typography[100].fontSize};\n margin: ${({ theme }) => theme.space[400]} ${({ theme }) => theme.space[400]}\n 0px ${({ theme }) => theme.space[400]};\n`;\n\nexport const StyledMenuGroupUl = styled.ul`\n margin: 0;\n padding: 0;\n`;\n","import { useMemo } from \"react\";\nimport { isGroupHeading } from \"./utils\";\nimport type { GroupedItem, DataWithId } from \"./types\";\n\n/**\n * Hook to map the highlighted index from Downshift (which only knows about filtered items)\n * to the full items array (which includes headings).\n *\n * @param items - The full items array (includes headings, toggle items, and data items)\n * @param itemsForDownshift - The filtered items array passed to Downshift (may exclude headings)\n * @param downshiftHighlightedIndex - The highlighted index from Downshift\n * @param hasGroups - Whether groupBy is provided (determines if we need to map indices)\n * @param selectHeadings - Whether headings are selectable (affects how we map indices)\n * @returns The highlighted index in the full items array, or null if invalid\n */\nexport function useHighlightedIndex<T extends DataWithId>(\n items: GroupedItem<T>[],\n itemsForDownshift: GroupedItem<T>[],\n downshiftHighlightedIndex: number | null | undefined,\n hasGroups: boolean,\n selectHeadings: boolean\n): number | null {\n return useMemo<number | null>(() => {\n if (\n downshiftHighlightedIndex === null ||\n downshiftHighlightedIndex === undefined ||\n downshiftHighlightedIndex < 0\n ) {\n return null;\n }\n\n // If no groups, the indices are the same\n if (!hasGroups) {\n return downshiftHighlightedIndex;\n }\n\n // Get the highlighted item from the downshift items array\n const highlightedItem = itemsForDownshift[downshiftHighlightedIndex];\n if (!highlightedItem) {\n return null;\n }\n\n // Find the index of this item in the full items array\n if (selectHeadings) {\n // When headings are selectable, itemsForDownshift === items,\n // so we can find the index directly in the items array\n return items.findIndex((item) => item === highlightedItem);\n } else {\n // When headings are not selectable, itemsForDownshift excludes headings,\n // so we need to find the item in the full items array, skipping headings\n return items.findIndex(\n (item) => !isGroupHeading(item) && item === highlightedItem\n );\n }\n }, [\n items,\n itemsForDownshift,\n downshiftHighlightedIndex,\n hasGroups,\n selectHeadings,\n ]);\n}\n","import { useRef, useEffect } from \"react\";\nimport { useVirtualizer } from \"@tanstack/react-virtual\";\nimport type { ReactNode, MouseEvent } from \"react\";\nimport { StyledMenuContent } from \"../../MenuContent/styles\";\nimport { MenuItem } from \"./MenuItem\";\nimport { MenuHeading } from \"./MenuHeading\";\nimport { MenuGroup } from \"./MenuGroup\";\nimport { groupItems, isGroupHeading, isToggleItem } from \"./utils\";\nimport type { DataWithId, GroupedItem, ToggleItem } from \"./types\";\nimport type { InputType } from \"../../MenuItem/MenuItemTypes\";\n\n// These types could use some cleanup\n// The normal, virutalized, and grouped content all have slightly different props\ninterface ComboboxContentProps<T extends DataWithId>\n extends React.HTMLAttributes<HTMLDivElement> {\n items: GroupedItem<T>[];\n getMenuProps: any;\n getItemProps: any;\n selectedItems: T[];\n highlightedIndex: number;\n renderItem: (item: T) => ReactNode;\n renderGroupHeading?: (label: string) => string;\n EmptyState?: ReactNode;\n itemToKey: (item: T) => string | number;\n itemToString: (item: T | null) => string;\n inputType: InputType;\n selectHeadings?: boolean;\n onHeadingClick?: (groupLabel: string, allSelected: boolean) => void;\n groupBy?: (item: T) => string;\n allData?: T[];\n selectAllItem?: ToggleItem;\n placeholderItem?: ToggleItem;\n estimatedItemHeight?: number;\n}\n\nexport const VirtualizedComboboxContent = <T extends DataWithId>({\n items,\n getMenuProps,\n getItemProps,\n selectedItems,\n highlightedIndex,\n renderItem,\n renderGroupHeading,\n EmptyState,\n itemToKey,\n inputType,\n selectHeadings = false,\n onHeadingClick,\n groupBy,\n allData,\n selectAllItem,\n estimatedItemHeight = 35,\n ...rest\n}: ComboboxContentProps<T>) => {\n const containerRef = useRef(null);\n\n // Check if there are any actual items (not just headings)\n const hasItems = items.some((item) => !isGroupHeading(item));\n\n const rowVirtualizer = useVirtualizer({\n count: items.length,\n getScrollElement: () => containerRef.current,\n estimateSize: (index) => {\n const item = items[index];\n return isGroupHeading(item) ? 40 : estimatedItemHeight;\n },\n });\n\n useEffect(() => {\n if (\n highlightedIndex !== undefined &&\n highlightedIndex !== null &&\n highlightedIndex >= 0\n ) {\n rowVirtualizer.scrollToIndex(highlightedIndex);\n }\n }, [highlightedIndex, rowVirtualizer]);\n\n const virtualItems = rowVirtualizer.getVirtualItems();\n\n const menuProps = getMenuProps(\n { ref: containerRef },\n { suppressRefError: true }\n );\n return (\n <div {...menuProps} {...rest} style={{ overflowY: \"auto\", ...rest.style }}>\n {!hasItems && EmptyState ? (\n <div style={{ padding: \"16px\" }}>{EmptyState}</div>\n ) : (\n <StyledMenuContent\n style={{\n height: `${rowVirtualizer.getTotalSize()}px`,\n position: \"relative\",\n overflow: \"hidden\",\n }}\n >\n <div\n style={{\n position: \"absolute\",\n top: 0,\n left: 0,\n width: \"100%\",\n transform: `translateY(${virtualItems[0]?.start ?? 0}px)`,\n }}\n >\n {virtualItems.map((virtualItem) => {\n const item = items[virtualItem.index];\n\n if (isGroupHeading(item)) {\n // Find all items in this group from the full data array (if groupBy is provided)\n const groupItems =\n groupBy && allData\n ? allData.filter(\n (dataItem) => groupBy(dataItem) === item.label\n )\n : [];\n\n // Check if all items in the group are selected\n const allSelected =\n groupItems.length > 0 &&\n groupItems.every((groupItem) =>\n selectedItems.includes(groupItem)\n );\n\n const headingItemProps = selectHeadings\n ? getItemProps({ index: virtualItem.index })\n : {};\n const handleHeadingClick = (e: MouseEvent) => {\n // Call Downshift's onClick if it exists\n headingItemProps.onClick?.(e);\n // Then call our custom handler\n if (onHeadingClick) {\n onHeadingClick(item.label, allSelected);\n }\n };\n\n return (\n <MenuHeading\n ref={rowVirtualizer.measureElement}\n key={virtualItem.key}\n {...headingItemProps}\n $highlighted={highlightedIndex === virtualItem.index}\n label={item.label}\n renderGroupHeading={renderGroupHeading}\n selectable={selectHeadings}\n selected={allSelected}\n id={item.id}\n onClick={selectHeadings ? handleHeadingClick : undefined}\n style={{\n width: \"100%\",\n }}\n />\n );\n }\n\n // Handle ToggleItem separately\n if (isToggleItem(item)) {\n const toggleItem = item as ToggleItem;\n const isItemSelected =\n selectAllItem && toggleItem.id === selectAllItem.id\n ? allData &&\n allData.length > 0 &&\n allData.every((item) => selectedItems.includes(item))\n : false;\n return (\n <MenuItem\n ref={rowVirtualizer.measureElement}\n key={virtualItem.key}\n inputType={inputType}\n selected={isItemSelected}\n id={toggleItem.id}\n {...getItemProps({ index: virtualItem.index })}\n style={{\n width: \"100%\",\n }}\n $highlighted={highlightedIndex === virtualItem.index}\n $active={false}\n >\n {toggleItem.label}\n </MenuItem>\n );\n }\n\n const dataItem = item as T;\n const isItemSelected = selectedItems.includes(dataItem);\n return (\n <MenuItem\n key={virtualItem.key}\n inputType={inputType}\n selected={isItemSelected}\n id={itemToKey(dataItem)}\n {...getItemProps({ index: virtualItem.index })}\n style={{\n width: \"100%\",\n }}\n $highlighted={highlightedIndex === virtualItem.index}\n $active={false}\n ref={rowVirtualizer.measureElement}\n >\n {renderItem(dataItem)}\n </MenuItem>\n );\n })}\n </div>\n </StyledMenuContent>\n )}\n </div>\n );\n};\n\nexport const NormalComboboxContent = <T extends DataWithId>({\n items,\n getMenuProps,\n getItemProps,\n selectedItems,\n highlightedIndex,\n renderItem,\n renderGroupHeading,\n EmptyState,\n itemToKey,\n inputType,\n selectHeadings = false,\n onHeadingClick,\n groupBy,\n allData,\n selectAllItem,\n ...rest\n}: ComboboxContentProps<T>) => {\n // Check if there are any actual items (not just headings)\n const hasItems = items.some((item) => !isGroupHeading(item));\n\n const menuProps = getMenuProps({}, { suppressRefError: true });\n\n return (\n <div {...menuProps} {...rest}>\n {!hasItems && EmptyState ? (\n <div style={{ padding: \"16px\" }}>{EmptyState}</div>\n ) : (\n <StyledMenuContent\n style={{\n position: \"relative\",\n }}\n >\n {items.map((item, index) => {\n if (isGroupHeading(item)) {\n // Find all items in this group from the full data array (if groupBy is provided)\n const groupItems =\n groupBy && allData\n ? allData.filter(\n (dataItem) => groupBy(dataItem) === item.label\n )\n : [];\n\n // Check if all items in the group are selected\n const allSelected =\n groupItems.length > 0 &&\n groupItems.every((groupItem) =>\n selectedItems.includes(groupItem)\n );\n\n const headingItemProps = selectHeadings\n ? getItemProps({ index })\n : {};\n const handleHeadingClick = (e: MouseEvent) => {\n // Call Downshift's onClick if it exists\n headingItemProps.onClick?.(e);\n // Then call our custom handler\n if (onHeadingClick) {\n onHeadingClick(item.label, allSelected);\n }\n };\n\n // This should be renamed MenuHeadingItem, it is always selectable\n return (\n <MenuHeading\n key={index}\n {...headingItemProps}\n $highlighted={highlightedIndex === index}\n label={item.label}\n renderGroupHeading={renderGroupHeading}\n selectable={selectHeadings}\n selected={allSelected}\n id={item.id}\n onClick={selectHeadings ? handleHeadingClick : undefined}\n />\n );\n }\n\n // Handle ToggleItem separately\n if (isToggleItem(item)) {\n const toggleItem = item as ToggleItem;\n const isItemSelected =\n selectAllItem && toggleItem.id === selectAllItem.id\n ? allData &&\n allData.length > 0 &&\n allData.every((item) => selectedItems.includes(item))\n : false;\n\n return (\n <MenuItem\n key={index}\n {...getItemProps({ index })}\n $highlighted={highlightedIndex === index}\n $active={false}\n inputType={inputType}\n selected={isItemSelected}\n id={toggleItem.id}\n >\n {toggleItem.label}\n </MenuItem>\n );\n }\n\n const dataItem = item as T;\n const isItemSelected = selectedItems.includes(dataItem);\n return (\n <MenuItem\n key={index}\n {...getItemProps({ index })}\n $highlighted={highlightedIndex === index}\n $active={false}\n inputType={inputType}\n selected={isItemSelected}\n id={itemToKey(dataItem)}\n >\n {renderItem(dataItem)}\n </MenuItem>\n );\n })}\n </StyledMenuContent>\n )}\n </div>\n );\n};\n\nexport const GroupedComboboxContent = <T extends DataWithId>({\n items,\n getMenuProps,\n getItemProps,\n highlightedIndex,\n selectedItems,\n renderItem,\n renderGroupHeading,\n EmptyState,\n itemToKey,\n itemToString,\n inputType,\n onHeadingClick,\n groupBy,\n allData,\n selectAllItem,\n placeholderItem,\n ...rest\n}: ComboboxContentProps<T>) => {\n // Check if there are any actual items (not just headings)\n const hasItems = items.some((item) => !isGroupHeading(item));\n\n const menuProps = getMenuProps({}, { suppressRefError: true });\n\n const groupedItems = groupItems(\n items as T[],\n groupBy as (item: T) => string,\n allData\n );\n // If we have a placeholder item, we need to account for it in the item indexing\n let actualItemIndex = placeholderItem ? 1 : 0;\n return (\n <div {...menuProps} {...rest}>\n {!hasItems && EmptyState ? (\n <div style={{ padding: \"16px\" }}>{EmptyState}</div>\n ) : (\n <StyledMenuContent style={{ position: \"relative\" }}>\n {placeholderItem && (\n <MenuItem\n key=\"placeholder-item\"\n {...getItemProps({ index: 0 })}\n $highlighted={highlightedIndex === 0}\n $active={false}\n inputType={inputType}\n selected={selectedItems.length === 0}\n id={placeholderItem.id}\n data-item-index={0}\n >\n {placeholderItem.label}\n </MenuItem>\n )}\n {Array.from(groupedItems.keys()).map((group, groupIndex) => {\n return (\n <MenuGroup\n id={`menu-group-${group}`}\n key={groupIndex}\n title={renderGroupHeading ? renderGroupHeading(group) : group}\n >\n {groupedItems.get(group)?.map((item) => {\n const isItemSelected = selectedItems.includes(item);\n const itemIndex = actualItemIndex;\n actualItemIndex += 1;\n return (\n <MenuItem\n key={itemIndex}\n {...getItemProps({ index: itemIndex })}\n $highlighted={highlightedIndex === itemIndex}\n $active={false}\n inputType={inputType}\n selected={isItemSelected}\n id={itemToKey(item)}\n data-item-index={itemIndex}\n >\n {renderItem(item)}\n </MenuItem>\n );\n })}\n </MenuGroup>\n );\n })}\n </StyledMenuContent>\n )}\n </div>\n );\n};\n\n// Combobox content is not rendered until the menu is open\n// The menus should be updated to only add aria-controls to the menu when it is open\n// Otherwise they should override it to undefined\nexport const ComboboxContent = <T extends DataWithId>({\n isVirtualized = false,\n groupBy,\n selectHeadings = false,\n ...props\n}: ComboboxContentProps<T> & { isVirtualized?: boolean }) => {\n if (isVirtualized) {\n return (\n <VirtualizedComboboxContent\n groupBy={groupBy}\n selectHeadings={selectHeadings}\n {...props}\n />\n );\n }\n if (groupBy && !selectHeadings) {\n return (\n <GroupedComboboxContent\n groupBy={groupBy}\n selectHeadings={selectHeadings}\n {...props}\n />\n );\n }\n\n return (\n <NormalComboboxContent\n selectHeadings={selectHeadings}\n groupBy={groupBy}\n {...props}\n />\n );\n};\n","import { useState, useMemo } from \"react\";\nimport { useSelect, useMultipleSelection } from \"downshift\";\nimport type { ReactNode } from \"react\";\nimport { Label } from \"@sproutsocial/seeds-react-label\";\n// This will eventually be imported from seeds-react-popout\nimport { Popout } from \"../Common-V2\";\nimport {\n isGroupHeading,\n isToggleItem,\n menuAnimationConfig,\n groupItemsWithHeadings,\n useHighlightedIndex,\n createItemToStringForDownshift,\n ComboboxContent,\n SelectToggleButton,\n} from \"../Common-V2\";\nimport {\n type DataWithId,\n type GroupedItem,\n type ToggleItem,\n type GroupHeading,\n type BaseMultiSelectProps,\n} from \"../Common-V2\";\n\nfunction defaultReducer(state, actionAndChanges) {\n const { changes, type } = actionAndChanges;\n\n switch (type) {\n case useSelect.stateChangeTypes.ItemClick:\n // If the item is already selected, don't set highlighted index to 0\n // We don't have access to selectedItems in the reducer\n return {\n ...changes,\n isOpen: true, // keep the menu open after selection.\n highlightedIndex: 0, // with the first option highlighted.\n };\n default:\n // For keyboard Enter/Space on menu items, keep menu open if an item is being selected\n if (changes.selectedItem && changes.isOpen === false) {\n return {\n ...changes,\n isOpen: true, // keep the menu open after keyboard selection.\n highlightedIndex: 0, // with the first option highlighted.\n };\n }\n return changes;\n }\n}\n\nexport interface MultiSelectProps<T extends DataWithId>\n extends BaseMultiSelectProps<T> {\n renderSelections?: (items: T[]) => ReactNode;\n triggerButtonProps?: any;\n shouldOverflow?: boolean;\n}\n\nexport function MultiSelect<T extends DataWithId>({\n id,\n data,\n selectedItemIds: controlledSelectedItemIds,\n isOpen: controlledIsOpen,\n itemToKey = (item: T) => item?.id,\n itemToString,\n renderSelections,\n renderItem,\n groupBy,\n renderGroupHeading,\n isVirtualized = false,\n estimatedItemHeight,\n showSelectedItems = false,\n selectHeadings = false,\n selectAllItem,\n placeholder,\n onSelectedItemIdsChange,\n onIsOpenChange,\n stateReducer = defaultReducer,\n triggerButtonProps,\n menuProps,\n inputType = \"checkbox\",\n shouldOverflow,\n onPointerDownOutside,\n onInteractOutside,\n popoutPlacement,\n}: MultiSelectProps<T>) {\n const [uncontrolledSelectedItemIds, setUncontrolledSelectedItemIds] =\n useState<T[\"id\"][]>([]);\n const [uncontrolledIsOpen, setUncontrolledIsOpen] = useState<boolean>(false);\n\n // Use controlled selectedItemIds if provided, otherwise use internal state\n const isSelectedItemIdsControlled = controlledSelectedItemIds !== undefined;\n const selectedItemIds = isSelectedItemIdsControlled\n ? controlledSelectedItemIds\n : uncontrolledSelectedItemIds;\n\n // Convert selectedItemIds to selectedItems for internal use\n const selectedItems = useMemo<T[]>(() => {\n return data.filter((item) => selectedItemIds.includes(itemToKey(item)));\n }, [selectedItemIds, data, itemToKey]);\n\n // Use controlled isOpen if provided, otherwise use internal state\n const isIsOpenControlled = controlledIsOpen !== undefined;\n const isOpen = isIsOpenControlled ? controlledIsOpen : uncontrolledIsOpen;\n\n const updateSelectedItems = (newSelectedItems: T[]) => {\n const newSelectedItemIds = newSelectedItems.map((item) => itemToKey(item));\n if (!isSelectedItemIdsControlled) {\n setUncontrolledSelectedItemIds(newSelectedItemIds);\n }\n onSelectedItemIdsChange?.(newSelectedItemIds);\n };\n\n const updateIsOpen = (newIsOpen: boolean) => {\n if (!isIsOpenControlled) {\n setUncontrolledIsOpen(newIsOpen);\n }\n onIsOpenChange?.(newIsOpen);\n };\n\n // For Select, we show all items (no filtering)\n // Filter out selected items if showSelectedItems is false\n const filteredData = useMemo<T[]>(() => {\n if (showSelectedItems) {\n return data;\n }\n return data.filter((item) => !selectedItems.includes(item));\n }, [data, selectedItems, showSelectedItems]);\n\n const items = useMemo<GroupedItem<T>[]>(() => {\n let groupedItems: GroupedItem<T>[];\n\n if (groupBy) {\n // Group first, then add selectAllItem at the beginning\n groupedItems = groupItemsWithHeadings(filteredData, groupBy, data, true);\n } else {\n groupedItems = filteredData;\n }\n\n // Add selectAllItem at the beginning if provided\n if (selectAllItem) {\n return [selectAllItem, ...groupedItems];\n }\n\n return groupedItems;\n }, [filteredData, groupBy, data, selectAllItem, selectHeadings]);\n\n // Handler for heading clicks - selects/deselects all items in a group\n const handleHeadingClick = useMemo(() => {\n if (!selectHeadings || !groupBy) {\n return undefined;\n }\n\n return (groupLabel: string, allSelected: boolean) => {\n // Find all items in this group from the full data array\n const groupItems = data.filter((item) => groupBy(item) === groupLabel);\n\n if (allSelected) {\n // Deselect all items in the group\n const newSelectedItems = selectedItems.filter(\n (item) => !groupItems.includes(item)\n );\n updateSelectedItems(newSelectedItems);\n } else {\n // Select all items in the group (add them if not already selected)\n const newSelectedItems = [...selectedItems];\n for (const groupItem of groupItems) {\n if (!newSelectedItems.includes(groupItem)) {\n newSelectedItems.push(groupItem);\n }\n }\n updateSelectedItems(newSelectedItems);\n }\n };\n }, [selectHeadings, groupBy, data, selectedItems, updateSelectedItems]);\n\n const { getSelectedItemProps, getDropdownProps, removeSelectedItem } =\n useMultipleSelection<T>({\n selectedItems,\n onStateChange({ selectedItems: newSelectedItems, type }) {\n switch (type) {\n case useMultipleSelection.stateChangeTypes\n .SelectedItemKeyDownBackspace:\n case useMultipleSelection.stateChangeTypes.SelectedItemKeyDownDelete:\n case useMultipleSelection.stateChangeTypes.DropdownKeyDownBackspace:\n case useMultipleSelection.stateChangeTypes.FunctionRemoveSelectedItem:\n if (newSelectedItems !== undefined) {\n updateSelectedItems(newSelectedItems);\n }\n break;\n default:\n break;\n }\n },\n });\n\n // Filter out headings for downshift unless selectHeadings is true\n const itemsForSelect = useMemo<(T | ToggleItem | GroupHeading)[]>(() => {\n if (selectHeadings) {\n // Include all items (headings, toggle items, and data items)\n return items;\n }\n return items.filter(\n (item): item is T | ToggleItem => !isGroupHeading(item)\n );\n }, [items, selectHeadings]);\n\n // Wrapper function to handle ToggleItem and GroupHeading separately\n const itemToStringForDownshift = useMemo(\n () => createItemToStringForDownshift(itemToString),\n [itemToString]\n );\n\n const selectProps = useSelect<T | ToggleItem | GroupHeading>({\n toggleButtonId: id,\n items: itemsForSelect,\n itemToString: itemToStringForDownshift,\n // defaultHighlightedIndex: 0, // after selection, highlight the first item.\n selectedItem: null,\n isOpen,\n stateReducer,\n // Could maybe let devs override this too?\n onStateChange({ type, selectedItem: newSelectedItem, isOpen: newIsOpen }) {\n // Handle isOpen changes for any state change type\n if (newIsOpen !== undefined) {\n updateIsOpen(newIsOpen);\n }\n\n // Handle item selection for both click and keyboard (Enter/Space) interactions\n // When Enter/Space is pressed on a highlighted item, useSelect sets selectedItem\n // We detect selection when selectedItem is set and menu is/was open\n if (newSelectedItem && newSelectedItem !== null) {\n // Check if this is a selection event (click or keyboard) and menu is open\n const isSelectionEvent =\n type === useSelect.stateChangeTypes.ItemClick ||\n type === useSelect.stateChangeTypes.ToggleButtonKeyDownEnter;\n\n if (isSelectionEvent) {\n // Handle selectAllItem selection\n if (\n selectAllItem &&\n isToggleItem(newSelectedItem) &&\n newSelectedItem.id === selectAllItem.id\n ) {\n // Check if all items are selected (excluding selectAllItem itself)\n const allSelected =\n data.length > 0 &&\n data.every((item) => selectedItems.includes(item));\n if (allSelected) {\n // Deselect all items\n updateSelectedItems([]);\n } else {\n // Select all items\n updateSelectedItems([...data]);\n }\n } else if (\n selectHeadings &&\n groupBy &&\n isGroupHeading(newSelectedItem)\n ) {\n // Handle heading selection - select/deselect all items in the group\n const groupLabel = newSelectedItem.label;\n const groupItems = data.filter(\n (item) => groupBy(item) === groupLabel\n );\n const allSelected =\n groupItems.length > 0 &&\n groupItems.every((item) => selectedItems.includes(item));\n\n if (allSelected) {\n // Deselect all items in the group\n updateSelectedItems(\n selectedItems.filter((item) => !groupItems.includes(item))\n );\n } else {\n // Select all items in the group\n const newItems = [\n ...selectedItems.filter((item) => !groupItems.includes(item)),\n ...groupItems,\n ];\n updateSelectedItems(newItems);\n }\n } else if (\n !isGroupHeading(newSelectedItem) &&\n !isToggleItem(newSelectedItem)\n ) {\n // Only handle regular data items\n const itemIndex = selectedItems.findIndex(\n (item) => itemToKey(item) === itemToKey(newSelectedItem as T)\n );\n\n if (itemIndex >= 0) {\n updateSelectedItems(\n selectedItems.filter((_, index) => index !== itemIndex)\n );\n } else {\n updateSelectedItems([...selectedItems, newSelectedItem as T]);\n }\n }\n }\n }\n },\n });\n\n const {\n isOpen: selectIsOpen,\n getToggleButtonProps,\n getLabelProps,\n getMenuProps,\n highlightedIndex: selectHighlightedIndex,\n getItemProps,\n } = selectProps;\n\n // Map the highlighted index from select (which only knows about items) to the full items array (which includes headings)\n const highlightedIndex = useHighlightedIndex(\n items,\n itemsForSelect,\n selectHighlightedIndex,\n !!groupBy,\n selectHeadings ?? false\n );\n\n const buttonText = renderSelections\n ? renderSelections(selectedItems)\n : selectedItems.length > 0\n ? selectedItems.map((item) => itemToString(item)).join(\", \")\n : placeholder;\n\n const toggleButtonIdProps = getToggleButtonProps();\n // Downshift adds aria-labelledby by default, which can conflict with our Label usage\n toggleButtonIdProps[\"aria-labelledby\"] = undefined;\n if (!selectIsOpen) {\n // Remove aria-controls when the menu is closed to avoid referencing a non-existent element\n // @ts-expect-error downshift types require aria-controls even though it is not required\n toggleButtonIdProps[\"aria-controls\"] = undefined;\n }\n\n return (\n <Popout\n open={selectIsOpen}\n onOpenChange={updateIsOpen}\n side={popoutPlacement}\n onOpenAutoFocus={(e) => {\n // Prevent default auto-focus behavior\n e.preventDefault();\n }}\n onCloseAutoFocus={(e) => {\n // Prevent default auto-focus behavior\n e.preventDefault();\n }}\n onPointerDownOutside={onPointerDownOutside}\n onInteractOutside={onInteractOutside}\n animationConfig={menuAnimationConfig}\n content={\n <ComboboxContent\n items={items}\n getMenuProps={getMenuProps}\n getItemProps={(props: { index: number }) => {\n // Only apply getItemProps to actual items, not headings or ToggleItems\n const item = items[props.index];\n if (isToggleItem(item)) {\n // Handle ToggleItem clicks manually\n return {\n onClick: () => {\n // This will be handled by the selection logic in onStateChange\n // We need to trigger the selection manually\n const allSelected =\n data.length > 0 &&\n data.every((item) => selectedItems.includes(item));\n if (allSelected) {\n updateSelectedItems([]);\n } else {\n updateSelectedItems([...data]);\n }\n },\n };\n }\n const dataItem = item as T;\n // Find the index in itemsForSelect using itemToKey for safer comparison\n const itemIndex = itemsForSelect.findIndex((selectItem) => {\n if (isGroupHeading(selectItem) || isToggleItem(selectItem)) {\n return false;\n }\n return itemToKey(selectItem as T) === itemToKey(dataItem);\n });\n if (itemIndex === -1) {\n return {};\n }\n return getItemProps({ item: dataItem, index: itemIndex });\n }}\n selectedItems={selectedItems}\n highlightedIndex={highlightedIndex ?? -1}\n renderItem={renderItem}\n renderGroupHeading={renderGroupHeading}\n itemToKey={itemToKey}\n itemToString={itemToString}\n inputType={inputType}\n selectHeadings={selectHeadings}\n onHeadingClick={handleHeadingClick}\n groupBy={groupBy}\n allData={data}\n selectAllItem={selectAllItem}\n isVirtualized={isVirtualized}\n estimatedItemHeight={estimatedItemHeight}\n {...menuProps}\n />\n }\n >\n <SelectToggleButton\n {...toggleButtonIdProps}\n {...triggerButtonProps}\n isOpen={selectIsOpen}\n shouldOverflow={shouldOverflow}\n >\n {buttonText}\n </SelectToggleButton>\n </Popout>\n );\n}\n","import { useState, useMemo, useEffect } from \"react\";\nimport { useCombobox } from \"downshift\";\nimport type { ReactNode } from \"react\";\nimport { Label } from \"@sproutsocial/seeds-react-label\";\nimport { Input } from \"@sproutsocial/seeds-react-input\";\n// This will eventually be imported from seeds-react-popout\nimport { Popout } from \"../Common-V2\";\nimport {\n isGroupHeading,\n isToggleItem,\n menuAnimationConfig,\n getFilteredItems,\n groupItemsWithHeadings,\n useHighlightedIndex,\n createItemToStringForDownshift,\n ComboboxContent,\n} from \"../Common-V2\";\nimport {\n type DataWithId,\n type GroupedItem,\n type ToggleItem,\n type BaseSingleAutocompleteProps,\n} from \"../Common-V2\";\n\nfunction defaultReducer(state, actionAndChanges) {\n const { changes, type } = actionAndChanges;\n\n switch (type) {\n case useCombobox.stateChangeTypes.InputKeyDownEnter:\n case useCombobox.stateChangeTypes.ItemClick:\n return {\n ...changes,\n isOpen: false, // close the menu after selection for single select\n highlightedIndex: 0, // reset highlight\n };\n default:\n return changes;\n }\n}\n\nexport interface SingleAutocompleteProps<T extends DataWithId>\n extends BaseSingleAutocompleteProps<T> {\n includePlaceholderItem?: boolean;\n}\n\nexport function SingleAutocomplete<T extends DataWithId>({\n id,\n data,\n selectedItemId: controlledSelectedItemId,\n inputValue: controlledInputValue,\n isOpen: controlledIsOpen,\n itemToKey = (item: T) => item?.id,\n itemToString,\n itemToSearchString,\n renderItem,\n groupBy,\n renderGroupHeading,\n isVirtualized = false,\n estimatedItemHeight,\n EmptyState,\n placeholder,\n onSelectedItemIdChange,\n onInputValueChange,\n onIsOpenChange,\n stateReducer = defaultReducer,\n menuProps,\n inputType = \"icon\",\n includePlaceholderItem = false,\n onPointerDownOutside,\n onInteractOutside,\n popoutPlacement,\n}: SingleAutocompleteProps<T>) {\n const [uncontrolledInputValue, setUncontrolledInputValue] =\n useState<string>(\"\");\n const [uncontrolledSelectedItemId, setUncontrolledSelectedItemId] = useState<\n T[\"id\"] | null\n >(null);\n const [uncontrolledIsOpen, setUncontrolledIsOpen] = useState<boolean>(false);\n\n // Use controlled selectedItemId if provided, otherwise use internal state\n const isSelectedItemIdControlled = controlledSelectedItemId !== undefined;\n const selectedItemId = isSelectedItemIdControlled\n ? controlledSelectedItemId\n : uncontrolledSelectedItemId;\n\n // Convert selectedItemId to selectedItem for internal use\n const selectedItem = useMemo<T | null>(() => {\n if (selectedItemId === null || selectedItemId === undefined) {\n return null;\n }\n return data.find((item) => itemToKey(item) === selectedItemId) ?? null;\n }, [selectedItemId, data, itemToKey]);\n\n // Use controlled inputValue if provided, otherwise use internal state\n const isInputValueControlled = controlledInputValue !== undefined;\n const inputValue = isInputValueControlled\n ? controlledInputValue\n : uncontrolledInputValue;\n\n // Use controlled isOpen if provided, otherwise use internal state\n const isIsOpenControlled = controlledIsOpen !== undefined;\n const isOpen = isIsOpenControlled ? controlledIsOpen : uncontrolledIsOpen;\n\n // Sync inputValue with selectedItem when selectedItem changes externally and menu is closed\n useEffect(() => {\n if (selectedItem && !isOpen) {\n // Only update if menu is closed - when open, user might be typing\n const selectedItemString = itemToString(selectedItem);\n if (!isInputValueControlled) {\n // For uncontrolled input, update internal state\n if (uncontrolledInputValue !== selectedItemString) {\n setUncontrolledInputValue(selectedItemString);\n }\n } else {\n // For controlled input, notify parent if value doesn't match\n // Parent is responsible for updating the controlled inputValue\n if (inputValue !== selectedItemString) {\n onInputValueChange?.(selectedItemString);\n }\n }\n }\n }, [\n selectedItem,\n isOpen,\n isInputValueControlled,\n itemToString,\n uncontrolledInputValue,\n inputValue,\n onInputValueChange,\n ]);\n\n const updateSelectedItem = (newSelectedItem: T | null) => {\n const newSelectedItemId = newSelectedItem\n ? itemToKey(newSelectedItem)\n : null;\n if (!isSelectedItemIdControlled) {\n setUncontrolledSelectedItemId(newSelectedItemId);\n }\n onSelectedItemIdChange?.(newSelectedItemId);\n };\n\n const updateInputValue = (newInputValue: string) => {\n if (!isInputValueControlled) {\n setUncontrolledInputValue(newInputValue);\n }\n onInputValueChange?.(newInputValue);\n };\n\n const updateIsOpen = (newIsOpen: boolean) => {\n if (!isIsOpenControlled) {\n setUncontrolledIsOpen(newIsOpen);\n }\n onIsOpenChange?.(newIsOpen);\n };\n\n // Use itemToSearchString if provided, otherwise fallback to itemToString\n const searchStringFn =\n itemToSearchString ?? ((item: T) => itemToString(item));\n\n const filteredItems = useMemo<T[]>(\n () =>\n getFilteredItems(data, inputValue, searchStringFn, itemToString, {\n selectedItem,\n }),\n [data, selectedItem, inputValue, searchStringFn, itemToString]\n );\n\n const placeholderItem: ToggleItem = {\n id: \"clear-selection\",\n label: placeholder,\n };\n\n const items = useMemo<GroupedItem<T>[]>(() => {\n let groupedItems: GroupedItem<T>[];\n\n if (groupBy) {\n groupedItems = groupItemsWithHeadings(\n filteredItems,\n groupBy,\n data,\n isVirtualized\n );\n } else {\n groupedItems = filteredItems;\n }\n\n // Add placeholder item at the start if needed\n groupedItems = includePlaceholderItem\n ? [placeholderItem, ...groupedItems]\n : groupedItems;\n\n return groupedItems;\n }, [\n filteredItems,\n placeholder,\n groupBy,\n data,\n includePlaceholderItem,\n isVirtualized,\n ]);\n\n // Filter out headings for downshift\n const itemsForCombobox = useMemo<(T | ToggleItem)[]>(() => {\n return items.filter(\n (item): item is T | ToggleItem => !isGroupHeading(item)\n );\n }, [items]);\n\n // Wrapper function to handle ToggleItem separately\n const itemToStringForDownshift = useMemo(\n () => createItemToStringForDownshift(itemToString),\n [itemToString]\n );\n\n const comboboxProps = useCombobox<T | ToggleItem>({\n inputId: id,\n items: itemsForCombobox,\n itemToString: itemToStringForDownshift,\n defaultHighlightedIndex: 0,\n selectedItem: selectedItem,\n inputValue,\n isOpen,\n stateReducer,\n onStateChange({\n inputValue: newInputValue,\n type,\n selectedItem: newSelectedItem,\n isOpen: newIsOpen,\n }) {\n // Handle isOpen changes for any state change type\n if (newIsOpen !== undefined) {\n updateIsOpen(newIsOpen);\n }\n\n switch (type) {\n case useCombobox.stateChangeTypes.InputKeyDownEnter:\n case useCombobox.stateChangeTypes.ItemClick:\n if (newSelectedItem) {\n updateSelectedItem(newSelectedItem as T);\n if (newSelectedItem.id === \"clear-selection\") {\n // Clear input if placeholder item is selected\n updateInputValue(\"\");\n return;\n }\n // Set input to selected item's string representation\n updateInputValue(itemToString(newSelectedItem as T));\n }\n break;\n\n case useCombobox.stateChangeTypes.InputChange:\n updateInputValue(newInputValue ?? \"\");\n if (newInputValue === \"\" && selectedItem && !isInputValueControlled) {\n // If the input is cleared and a selected item is present, clear the selection\n // This is to ensure that the input value is cleared when the selected item is cleared\n updateSelectedItem(null);\n }\n break;\n\n default:\n break;\n }\n },\n });\n const {\n isOpen: comboboxIsOpen,\n getToggleButtonProps,\n getLabelProps,\n getMenuProps,\n getInputProps,\n highlightedIndex: comboboxHighlightedIndex,\n getItemProps,\n selectedItem: comboboxSelectedItem,\n } = comboboxProps;\n\n // Map the highlighted index from combobox (which only knows about items) to the full items array (which includes headings)\n const highlightedIndex = useHighlightedIndex(\n items,\n itemsForCombobox,\n comboboxHighlightedIndex,\n !!groupBy,\n false // Single select components hardcode selectHeadings to false\n );\n\n const inputProps = getInputProps();\n // Downshift adds aria-labelledby by default, which can conflict with our Label usage\n inputProps[\"aria-labelledby\"] = undefined;\n if (!comboboxIsOpen) {\n // Remove aria-controls when the menu is closed to avoid referencing a non-existent element\n // @ts-expect-error downshift types require aria-controls even though it is not required\n inputProps[\"aria-controls\"] = undefined;\n }\n const { ref, id: inputId, ...restProps } = inputProps as any;\n\n return (\n <Popout\n open={comboboxIsOpen}\n onOpenChange={updateIsOpen}\n side={popoutPlacement}\n animationConfig={menuAnimationConfig}\n onOpenAutoFocus={(e) => {\n // Prevent default auto-focus behavior\n e.preventDefault();\n }}\n onCloseAutoFocus={(e) => {\n // Prevent default auto-focus behavior\n e.preventDefault();\n }}\n onPointerDownOutside={onPointerDownOutside}\n onInteractOutside={onInteractOutside}\n content={\n <ComboboxContent\n items={items}\n getMenuProps={getMenuProps}\n getItemProps={(props: { index: number }) => {\n // Only apply getItemProps to actual items, not headings or ToggleItems\n const item = items[props.index];\n const dataItem = item as T;\n // Find the index in itemsForCombobox using itemToKey for safer comparison\n const itemIndex = itemsForCombobox.findIndex((comboboxItem) => {\n if (isToggleItem(comboboxItem)) {\n return false;\n }\n return itemToKey(comboboxItem as T) === itemToKey(dataItem);\n });\n if (itemIndex === -1) {\n return {};\n }\n return getItemProps({ item: dataItem, index: itemIndex });\n }}\n selectedItems={selectedItem ? [selectedItem] : []}\n highlightedIndex={highlightedIndex ?? -1}\n renderItem={renderItem}\n renderGroupHeading={renderGroupHeading}\n EmptyState={EmptyState}\n itemToKey={itemToKey}\n itemToString={itemToString}\n inputType={inputType}\n selectHeadings={false}\n groupBy={groupBy}\n isVirtualized={isVirtualized}\n estimatedItemHeight={estimatedItemHeight}\n placeholderItem={includePlaceholderItem ? placeholderItem : undefined}\n {...menuProps}\n />\n }\n >\n <Input\n id={id}\n inputProps={{\n autoComplete: \"off\",\n }}\n innerRef={ref}\n placeholder={placeholder}\n elemAfter={!includePlaceholderItem ? <Input.ClearButton /> : undefined}\n clearButtonLabel=\"Clear selection\"\n onClear={() => {\n // Note, by default the input clear button re-focuses the input\n // We don't want to do that, but that would require a breaking change to Input\n updateSelectedItem(null);\n updateInputValue(\"\");\n }}\n {...restProps}\n />\n </Popout>\n );\n}\n","import { useState, useMemo, useRef } from \"react\";\nimport { useCombobox, useMultipleSelection } from \"downshift\";\nimport { TokenInput } from \"@sproutsocial/seeds-react-token-input\";\n// This will eventually be imported from seeds-react-popout\nimport { Popout } from \"../Common-V2\";\nimport {\n isGroupHeading,\n isToggleItem,\n menuAnimationConfig,\n getFilteredItems,\n groupItemsWithHeadings,\n useHighlightedIndex,\n createItemToStringForDownshift,\n ComboboxContent,\n} from \"../Common-V2\";\nimport {\n type DataWithId,\n type GroupedItem,\n type ToggleItem,\n type GroupHeading,\n type BaseMultiAutocompleteProps,\n} from \"../Common-V2\";\n\nfunction defaultReducer(state, actionAndChanges) {\n const { changes, type } = actionAndChanges;\n\n switch (type) {\n case useCombobox.stateChangeTypes.InputBlur:\n // Do not close the menu on blur from this event\n // There is a very brief blur when clicking an item, even though the input seemingly does not lose focus\n // Closing the menu is handled in the onBlur handler instead, which does not have this issue\n return {\n ...changes,\n isOpen: true,\n };\n case useCombobox.stateChangeTypes.InputKeyDownEnter:\n case useCombobox.stateChangeTypes.ItemClick:\n return {\n ...changes,\n isOpen: true, // keep the menu open after selection.\n highlightedIndex: state.highlightedIndex, // preserve the current position so the list doesn't jump.\n };\n default:\n return changes;\n }\n}\n\nexport interface MultiAutocompleteProps<T extends DataWithId>\n extends BaseMultiAutocompleteProps<T> {}\n\nexport function MultiAutocomplete<T extends DataWithId>({\n id,\n data,\n selectedItemIds: controlledSelectedItemIds,\n inputValue: controlledInputValue,\n isOpen: controlledIsOpen,\n itemToKey = (item: T) => item?.id,\n itemToString,\n itemToSearchString,\n renderItem,\n groupBy,\n renderGroupHeading,\n isVirtualized = false,\n estimatedItemHeight,\n showSelectedItems = false,\n selectHeadings = false,\n selectAllItem,\n EmptyState,\n placeholder,\n onSelectedItemIdsChange,\n onInputValueChange,\n onIsOpenChange,\n stateReducer = defaultReducer,\n menuProps,\n inputType = \"checkbox\",\n onPointerDownOutside,\n onInteractOutside,\n popoutPlacement,\n}: MultiAutocompleteProps<T>) {\n const mousedownInPopoverRef = useRef(false);\n\n const [uncontrolledInputValue, setUncontrolledInputValue] =\n useState<string>(\"\");\n const [uncontrolledSelectedItemIds, setUncontrolledSelectedItemIds] =\n useState<T[\"id\"][]>([]);\n const [uncontrolledIsOpen, setUncontrolledIsOpen] = useState<boolean>(false);\n\n // Use controlled selectedItemIds if provided, otherwise use internal state\n const isSelectedItemIdsControlled = controlledSelectedItemIds !== undefined;\n const selectedItemIds = isSelectedItemIdsControlled\n ? controlledSelectedItemIds\n : uncontrolledSelectedItemIds;\n\n // Convert selectedItemIds to selectedItems for internal use\n const selectedItems = useMemo<T[]>(() => {\n return data.filter((item) => selectedItemIds.includes(itemToKey(item)));\n }, [selectedItemIds, data, itemToKey]);\n\n // Use controlled inputValue if provided, otherwise use internal state\n const isInputValueControlled = controlledInputValue !== undefined;\n const inputValue = isInputValueControlled\n ? controlledInputValue\n : uncontrolledInputValue;\n\n // Use controlled isOpen if provided, otherwise use internal state\n const isIsOpenControlled = controlledIsOpen !== undefined;\n const isOpen = isIsOpenControlled ? controlledIsOpen : uncontrolledIsOpen;\n\n const updateSelectedItems = (newSelectedItems: T[]) => {\n const newSelectedItemIds = newSelectedItems.map((item) => itemToKey(item));\n if (!isSelectedItemIdsControlled) {\n setUncontrolledSelectedItemIds(newSelectedItemIds);\n }\n onSelectedItemIdsChange?.(newSelectedItemIds);\n };\n\n const updateInputValue = (newInputValue: string) => {\n if (!isInputValueControlled) {\n setUncontrolledInputValue(newInputValue);\n }\n onInputValueChange?.(newInputValue);\n };\n\n const updateIsOpen = (newIsOpen: boolean) => {\n if (!newIsOpen) {\n updateInputValue(\"\");\n }\n if (!isIsOpenControlled) {\n setUncontrolledIsOpen(newIsOpen);\n }\n onIsOpenChange?.(newIsOpen);\n };\n\n // Use itemToSearchString if provided, otherwise fallback to itemToString\n const searchStringFn =\n itemToSearchString ?? ((item: T) => itemToString(item));\n\n const filteredItems = useMemo<T[]>(\n () =>\n getFilteredItems(data, inputValue, searchStringFn, itemToString, {\n selectedItems,\n showSelectedItems,\n }),\n [data, selectedItems, inputValue, searchStringFn, showSelectedItems]\n );\n\n const items = useMemo<GroupedItem<T>[]>(() => {\n let listItems: GroupedItem<T>[];\n\n // If groupBy is provided and selectHeadings is true we need to add group heading items to the list\n if (groupBy) {\n // Group first, then add selectAllItem at the beginning\n // If headings are not selectable we will just reorder the items\n // If headings are selectable we will add them to the list\n listItems = groupItemsWithHeadings(\n filteredItems,\n groupBy,\n data,\n selectHeadings\n );\n } else {\n listItems = filteredItems;\n }\n\n // Add selectAllItem at the beginning if provided\n if (selectAllItem) {\n return [selectAllItem, ...listItems];\n }\n\n return listItems;\n }, [filteredItems, groupBy, selectAllItem, selectHeadings, data]);\n\n // Handler for heading clicks - selects/deselects all items in a group\n const handleHeadingClick = useMemo(() => {\n if (!selectHeadings || !groupBy) {\n return undefined;\n }\n\n return (groupLabel: string, allSelected: boolean) => {\n // Find all items in this group from the full data array\n const groupItems = data.filter((item) => groupBy(item) === groupLabel);\n\n if (allSelected) {\n // Deselect all items in the group\n const newSelectedItems = selectedItems.filter(\n (item) => !groupItems.includes(item)\n );\n updateSelectedItems(newSelectedItems);\n } else {\n // Select all items in the group (add them if not already selected)\n const newSelectedItems = [...selectedItems];\n for (const groupItem of groupItems) {\n if (!newSelectedItems.includes(groupItem)) {\n newSelectedItems.push(groupItem);\n }\n }\n updateSelectedItems(newSelectedItems);\n }\n };\n }, [selectHeadings, groupBy, data, selectedItems, updateSelectedItems]);\n\n const { getSelectedItemProps, getDropdownProps, removeSelectedItem } =\n useMultipleSelection<T>({\n selectedItems,\n onStateChange({ selectedItems: newSelectedItems, type }) {\n switch (type) {\n case useMultipleSelection.stateChangeTypes\n .SelectedItemKeyDownBackspace:\n case useMultipleSelection.stateChangeTypes.SelectedItemKeyDownDelete:\n case useMultipleSelection.stateChangeTypes.DropdownKeyDownBackspace:\n case useMultipleSelection.stateChangeTypes.FunctionRemoveSelectedItem:\n if (newSelectedItems !== undefined) {\n updateSelectedItems(newSelectedItems);\n }\n break;\n default:\n break;\n }\n },\n });\n\n // Filter out headings for downshift unless selectHeadings is true\n const itemsForCombobox = useMemo<(T | ToggleItem | GroupHeading)[]>(() => {\n if (selectHeadings) {\n // Include all items (headings, toggle items, and data items)\n return items;\n }\n return items.filter(\n (item): item is T | ToggleItem => !isGroupHeading(item)\n );\n }, [items, selectHeadings]);\n\n // Wrapper function to handle ToggleItem and GroupHeading separately\n const itemToStringForDownshift = useMemo(\n () => createItemToStringForDownshift(itemToString),\n [itemToString]\n );\n\n const comboboxProps = useCombobox<T | ToggleItem | GroupHeading>({\n inputId: id,\n items: itemsForCombobox,\n itemToString: itemToStringForDownshift,\n defaultHighlightedIndex: -1,\n selectedItem: null,\n inputValue,\n isOpen,\n stateReducer,\n // Could maybe let devs override this too?\n onStateChange({\n inputValue: newInputValue,\n type,\n selectedItem: newSelectedItem,\n isOpen: newIsOpen,\n }) {\n // Handle isOpen changes for any state change type\n if (newIsOpen !== undefined) {\n updateIsOpen(newIsOpen);\n }\n\n switch (type) {\n case useCombobox.stateChangeTypes.InputKeyDownEnter:\n case useCombobox.stateChangeTypes.ItemClick:\n if (newSelectedItem) {\n // Handle selectAllItem selection\n if (\n selectAllItem &&\n isToggleItem(newSelectedItem) &&\n newSelectedItem.id === selectAllItem.id\n ) {\n // Check if all items are selected (excluding selectAllItem itself)\n const allSelected =\n data.length > 0 &&\n data.every((item) => selectedItems.includes(item));\n if (allSelected) {\n // Deselect all items\n updateSelectedItems([]);\n } else {\n // Select all items\n updateSelectedItems([...data]);\n }\n } else if (\n selectHeadings &&\n groupBy &&\n isGroupHeading(newSelectedItem)\n ) {\n // Handle heading selection - select/deselect all items in the group\n const groupLabel = newSelectedItem.label;\n const groupItems = data.filter(\n (item) => groupBy(item) === groupLabel\n );\n const allSelected =\n groupItems.length > 0 &&\n groupItems.every((item) => selectedItems.includes(item));\n\n if (allSelected) {\n // Deselect all items in the group\n updateSelectedItems(\n selectedItems.filter((item) => !groupItems.includes(item))\n );\n } else {\n // Select all items in the group\n const newItems = [\n ...selectedItems.filter((item) => !groupItems.includes(item)),\n ...groupItems,\n ];\n updateSelectedItems(newItems);\n }\n } else if (\n !isGroupHeading(newSelectedItem) &&\n !isToggleItem(newSelectedItem)\n ) {\n // Only handle regular data items\n const itemIndex = selectedItems.findIndex(\n (item) => itemToKey(item) === itemToKey(newSelectedItem as T)\n );\n if (itemIndex >= 0) {\n updateSelectedItems(\n selectedItems.filter((_, index) => index !== itemIndex)\n );\n } else {\n updateSelectedItems([...selectedItems, newSelectedItem as T]);\n }\n }\n }\n break;\n\n case useCombobox.stateChangeTypes.InputChange:\n updateInputValue(newInputValue ?? \"\");\n break;\n\n default:\n break;\n }\n },\n });\n const {\n isOpen: comboboxIsOpen,\n getToggleButtonProps,\n getLabelProps,\n getMenuProps,\n getInputProps,\n highlightedIndex: comboboxHighlightedIndex,\n getItemProps,\n selectedItem,\n } = comboboxProps;\n\n // Map the highlighted index from combobox (which only knows about items) to the full items array (which includes headings)\n const highlightedIndex = useHighlightedIndex(\n items,\n itemsForCombobox,\n comboboxHighlightedIndex,\n !!groupBy,\n selectHeadings ?? false\n );\n\n const inputProps = getInputProps({ preventKeyAction: isOpen });\n // Downshift adds aria-labelledby by default, which can conflict with our Label usage\n inputProps[\"aria-labelledby\"] = undefined;\n if (!comboboxIsOpen) {\n // Remove aria-controls when the menu is closed to avoid referencing a non-existent element\n // @ts-expect-error downshift types require aria-controls even though it is not required\n inputProps[\"aria-controls\"] = undefined;\n }\n\n const handleBlur = (e: React.FocusEvent<HTMLInputElement>) => {\n // Call any provided onBlur handler\n if (inputProps.onBlur) {\n inputProps.onBlur(e);\n }\n // Don't close if the blur was caused by a mousedown inside the popover (e.g. clicking the scrollbar)\n // Re-focus the input so future blur events can still close the menu\n if (mousedownInPopoverRef.current) {\n mousedownInPopoverRef.current = false;\n e.target.focus();\n return;\n }\n // Need to figure why onblur is getting called when selecting select all item\n updateIsOpen(false);\n };\n\n const inputPropsToSpread = { ...inputProps };\n // Remove onBlur from inputProps\n // The blur event needs added to the root of token input\n delete inputPropsToSpread.onBlur;\n\n return (\n <Popout\n open={comboboxIsOpen}\n onOpenChange={updateIsOpen}\n side={popoutPlacement}\n onOpenAutoFocus={(e) => {\n // Prevent default auto-focus behavior\n e.preventDefault();\n }}\n onCloseAutoFocus={(e) => {\n // Prevent default auto-focus behavior\n e.preventDefault();\n }}\n onPointerDownOutside={onPointerDownOutside}\n onInteractOutside={onInteractOutside}\n animationConfig={menuAnimationConfig}\n onMouseDown={() => {\n mousedownInPopoverRef.current = true;\n }}\n onMouseUp={() => {\n mousedownInPopoverRef.current = false;\n }}\n content={\n <ComboboxContent\n items={items}\n getMenuProps={getMenuProps}\n getItemProps={(props: { index: number }) => {\n // Only apply getItemProps to actual items, not headings or ToggleItems\n const item = items[props.index];\n if (isToggleItem(item)) {\n // Handle ToggleItem clicks manually\n return {\n onClick: () => {\n const allSelected =\n data.length > 0 &&\n data.every((item) => selectedItems.includes(item));\n if (allSelected) {\n updateSelectedItems([]);\n } else {\n updateSelectedItems([...data]);\n }\n },\n };\n }\n const dataItem = item as T;\n // Find the index in itemsForCombobox by comparing keys\n const itemIndex = itemsForCombobox.indexOf(dataItem);\n if (itemIndex === -1) {\n return {};\n }\n return getItemProps({ item: dataItem, index: itemIndex });\n }}\n selectedItems={selectedItems}\n highlightedIndex={highlightedIndex ?? -1}\n renderItem={renderItem}\n renderGroupHeading={renderGroupHeading}\n EmptyState={EmptyState}\n itemToKey={itemToKey}\n itemToString={itemToString}\n inputType={inputType}\n selectHeadings={selectHeadings}\n onHeadingClick={handleHeadingClick}\n groupBy={groupBy}\n allData={data}\n selectAllItem={selectAllItem}\n isVirtualized={isVirtualized}\n estimatedItemHeight={estimatedItemHeight}\n {...menuProps}\n />\n }\n >\n <TokenInput\n placeholder={placeholder}\n inputProps={{\n ...inputPropsToSpread,\n autoComplete: \"off\", // Override with \"off\" to prevent browser autocomplete\n }}\n tokens={selectedItems.map((item) => ({\n id: String(itemToKey(item)),\n value: itemToString(item),\n }))}\n onRemoveToken={(tokenId) => {\n const itemToRemove = selectedItems.find(\n (item) => String(itemToKey(item)) === tokenId\n );\n if (itemToRemove) {\n removeSelectedItem(itemToRemove);\n }\n }}\n onClickToken={(e) => {\n e.stopPropagation();\n }}\n onBlur={handleBlur}\n aria-controls={undefined}\n aria-expanded={undefined}\n aria-haspopup={undefined}\n // @ts-expect-error Popout adds the type=button prop but TokenInput does not expect that\n type={undefined}\n />\n </Popout>\n );\n}\n"],"mappings":"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","names":["useState","useMemo","groupItems","React","MOTION_DURATION_FAST","styled","jsx","jsxs","styled","props","Icon","jsx","jsxs","space","Icon","styled","Box","jsx","styled","jsx","jsxs","color","useMemo","useMemo","useRef","jsx","jsxs","useRef","groupItems","dataItem","isItemSelected","item","jsx","useState","useMemo","useState","useMemo","useSelect","jsx","defaultReducer","useSelect","useState","useMemo","groupItems","item","useState","useMemo","useEffect","jsx","defaultReducer","useState","useMemo","useEffect","useState","useMemo","useRef","useCombobox","useMultipleSelection","jsx","defaultReducer","useCombobox","useRef","useState","useMemo","groupItems","useMultipleSelection","item"]}
|
package/dist/v2/index.d.mts
DELETED
|
@@ -1,108 +0,0 @@
|
|
|
1
|
-
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
-
import { ReactNode } from 'react';
|
|
3
|
-
|
|
4
|
-
interface DataWithId {
|
|
5
|
-
id: string | number;
|
|
6
|
-
}
|
|
7
|
-
interface ToggleItem {
|
|
8
|
-
id: "select-all" | "clear-selection";
|
|
9
|
-
label: string;
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
/**
|
|
13
|
-
* Base props common to all select/autocomplete components
|
|
14
|
-
*/
|
|
15
|
-
interface BaseSelectProps<T extends DataWithId> {
|
|
16
|
-
id: string;
|
|
17
|
-
data: T[];
|
|
18
|
-
isOpen?: boolean;
|
|
19
|
-
itemToKey?: (item: T) => string | number;
|
|
20
|
-
itemToString: (item: T | null) => string;
|
|
21
|
-
renderItem: (item: T) => ReactNode;
|
|
22
|
-
groupBy?: (item: T) => string;
|
|
23
|
-
renderGroupHeading?: (label: string) => string;
|
|
24
|
-
isVirtualized?: boolean;
|
|
25
|
-
estimatedItemHeight?: number;
|
|
26
|
-
placeholder: string;
|
|
27
|
-
onIsOpenChange?: (isOpen: boolean) => void;
|
|
28
|
-
stateReducer?: any;
|
|
29
|
-
menuProps?: React.HTMLAttributes<HTMLDivElement>;
|
|
30
|
-
onPointerDownOutside?: (event: CustomEvent<{
|
|
31
|
-
originalEvent: PointerEvent;
|
|
32
|
-
}>) => void;
|
|
33
|
-
onInteractOutside?: (event: CustomEvent<{
|
|
34
|
-
originalEvent: Event;
|
|
35
|
-
}>) => void;
|
|
36
|
-
/**
|
|
37
|
-
* Controls which side the popout appears relative to the trigger.
|
|
38
|
-
* @default "bottom"
|
|
39
|
-
*/
|
|
40
|
-
popoutPlacement?: "top" | "bottom";
|
|
41
|
-
}
|
|
42
|
-
/**
|
|
43
|
-
* Props common to all single-select components
|
|
44
|
-
*/
|
|
45
|
-
interface BaseSingleSelectProps<T extends DataWithId> extends BaseSelectProps<T> {
|
|
46
|
-
selectedItemId?: T["id"] | null;
|
|
47
|
-
onSelectedItemIdChange?: (itemId: T["id"] | null) => void;
|
|
48
|
-
placeholderItem?: ToggleItem;
|
|
49
|
-
inputType?: "radio" | "icon";
|
|
50
|
-
removePlaceholderItem?: boolean;
|
|
51
|
-
}
|
|
52
|
-
/**
|
|
53
|
-
* Props common to all multi-select components
|
|
54
|
-
*/
|
|
55
|
-
interface BaseMultiSelectProps<T extends DataWithId> extends BaseSelectProps<T> {
|
|
56
|
-
selectedItemIds?: T["id"][];
|
|
57
|
-
onSelectedItemIdsChange?: (itemIds: T["id"][]) => void;
|
|
58
|
-
showSelectedItems?: boolean;
|
|
59
|
-
selectHeadings?: boolean;
|
|
60
|
-
selectAllItem?: ToggleItem;
|
|
61
|
-
inputType?: "checkbox" | "icon";
|
|
62
|
-
}
|
|
63
|
-
/**
|
|
64
|
-
* Props common to all autocomplete/searchable components
|
|
65
|
-
*/
|
|
66
|
-
interface BaseAutocompleteProps<T extends DataWithId> extends BaseSelectProps<T> {
|
|
67
|
-
EmptyState: ReactNode;
|
|
68
|
-
inputValue?: string;
|
|
69
|
-
itemToSearchString?: (item: T) => string;
|
|
70
|
-
onInputValueChange?: (value: string) => void;
|
|
71
|
-
}
|
|
72
|
-
/**
|
|
73
|
-
* Props for single-select autocomplete/searchable components
|
|
74
|
-
*/
|
|
75
|
-
interface BaseSingleAutocompleteProps<T extends DataWithId> extends BaseSingleSelectProps<T>, BaseAutocompleteProps<T> {
|
|
76
|
-
inputType?: "radio" | "icon";
|
|
77
|
-
}
|
|
78
|
-
/**
|
|
79
|
-
* Props for multi-select autocomplete/searchable components
|
|
80
|
-
*/
|
|
81
|
-
interface BaseMultiAutocompleteProps<T extends DataWithId> extends BaseMultiSelectProps<T>, BaseAutocompleteProps<T> {
|
|
82
|
-
inputType?: "checkbox" | "icon";
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
interface SingleSelectProps<T extends DataWithId> extends BaseSingleSelectProps<T> {
|
|
86
|
-
itemToSelection?: (item: T) => ReactNode;
|
|
87
|
-
renderSelection?: (item: T | null) => ReactNode;
|
|
88
|
-
triggerButtonProps?: any;
|
|
89
|
-
}
|
|
90
|
-
declare function SingleSelect<T extends DataWithId>({ id, data, selectedItemId: controlledSelectedItemId, isOpen: controlledIsOpen, itemToKey, itemToString, itemToSelection, renderSelection, renderItem, groupBy, renderGroupHeading, isVirtualized, estimatedItemHeight, placeholder, onSelectedItemIdChange, onIsOpenChange, stateReducer, triggerButtonProps, menuProps, inputType, removePlaceholderItem, onPointerDownOutside, onInteractOutside, popoutPlacement, }: SingleSelectProps<T>): react_jsx_runtime.JSX.Element;
|
|
91
|
-
|
|
92
|
-
interface MultiSelectProps<T extends DataWithId> extends BaseMultiSelectProps<T> {
|
|
93
|
-
renderSelections?: (items: T[]) => ReactNode;
|
|
94
|
-
triggerButtonProps?: any;
|
|
95
|
-
shouldOverflow?: boolean;
|
|
96
|
-
}
|
|
97
|
-
declare function MultiSelect<T extends DataWithId>({ id, data, selectedItemIds: controlledSelectedItemIds, isOpen: controlledIsOpen, itemToKey, itemToString, renderSelections, renderItem, groupBy, renderGroupHeading, isVirtualized, estimatedItemHeight, showSelectedItems, selectHeadings, selectAllItem, placeholder, onSelectedItemIdsChange, onIsOpenChange, stateReducer, triggerButtonProps, menuProps, inputType, shouldOverflow, onPointerDownOutside, onInteractOutside, popoutPlacement, }: MultiSelectProps<T>): react_jsx_runtime.JSX.Element;
|
|
98
|
-
|
|
99
|
-
interface SingleAutocompleteProps<T extends DataWithId> extends BaseSingleAutocompleteProps<T> {
|
|
100
|
-
includePlaceholderItem?: boolean;
|
|
101
|
-
}
|
|
102
|
-
declare function SingleAutocomplete<T extends DataWithId>({ id, data, selectedItemId: controlledSelectedItemId, inputValue: controlledInputValue, isOpen: controlledIsOpen, itemToKey, itemToString, itemToSearchString, renderItem, groupBy, renderGroupHeading, isVirtualized, estimatedItemHeight, EmptyState, placeholder, onSelectedItemIdChange, onInputValueChange, onIsOpenChange, stateReducer, menuProps, inputType, includePlaceholderItem, onPointerDownOutside, onInteractOutside, popoutPlacement, }: SingleAutocompleteProps<T>): react_jsx_runtime.JSX.Element;
|
|
103
|
-
|
|
104
|
-
interface MultiAutocompleteProps<T extends DataWithId> extends BaseMultiAutocompleteProps<T> {
|
|
105
|
-
}
|
|
106
|
-
declare function MultiAutocomplete<T extends DataWithId>({ id, data, selectedItemIds: controlledSelectedItemIds, inputValue: controlledInputValue, isOpen: controlledIsOpen, itemToKey, itemToString, itemToSearchString, renderItem, groupBy, renderGroupHeading, isVirtualized, estimatedItemHeight, showSelectedItems, selectHeadings, selectAllItem, EmptyState, placeholder, onSelectedItemIdsChange, onInputValueChange, onIsOpenChange, stateReducer, menuProps, inputType, onPointerDownOutside, onInteractOutside, popoutPlacement, }: MultiAutocompleteProps<T>): react_jsx_runtime.JSX.Element;
|
|
107
|
-
|
|
108
|
-
export { MultiAutocomplete, type MultiAutocompleteProps, MultiSelect, type MultiSelectProps, SingleAutocomplete, type SingleAutocompleteProps, SingleSelect, type SingleSelectProps };
|
package/dist/v2/index.d.ts
DELETED
|
@@ -1,108 +0,0 @@
|
|
|
1
|
-
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
-
import { ReactNode } from 'react';
|
|
3
|
-
|
|
4
|
-
interface DataWithId {
|
|
5
|
-
id: string | number;
|
|
6
|
-
}
|
|
7
|
-
interface ToggleItem {
|
|
8
|
-
id: "select-all" | "clear-selection";
|
|
9
|
-
label: string;
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
/**
|
|
13
|
-
* Base props common to all select/autocomplete components
|
|
14
|
-
*/
|
|
15
|
-
interface BaseSelectProps<T extends DataWithId> {
|
|
16
|
-
id: string;
|
|
17
|
-
data: T[];
|
|
18
|
-
isOpen?: boolean;
|
|
19
|
-
itemToKey?: (item: T) => string | number;
|
|
20
|
-
itemToString: (item: T | null) => string;
|
|
21
|
-
renderItem: (item: T) => ReactNode;
|
|
22
|
-
groupBy?: (item: T) => string;
|
|
23
|
-
renderGroupHeading?: (label: string) => string;
|
|
24
|
-
isVirtualized?: boolean;
|
|
25
|
-
estimatedItemHeight?: number;
|
|
26
|
-
placeholder: string;
|
|
27
|
-
onIsOpenChange?: (isOpen: boolean) => void;
|
|
28
|
-
stateReducer?: any;
|
|
29
|
-
menuProps?: React.HTMLAttributes<HTMLDivElement>;
|
|
30
|
-
onPointerDownOutside?: (event: CustomEvent<{
|
|
31
|
-
originalEvent: PointerEvent;
|
|
32
|
-
}>) => void;
|
|
33
|
-
onInteractOutside?: (event: CustomEvent<{
|
|
34
|
-
originalEvent: Event;
|
|
35
|
-
}>) => void;
|
|
36
|
-
/**
|
|
37
|
-
* Controls which side the popout appears relative to the trigger.
|
|
38
|
-
* @default "bottom"
|
|
39
|
-
*/
|
|
40
|
-
popoutPlacement?: "top" | "bottom";
|
|
41
|
-
}
|
|
42
|
-
/**
|
|
43
|
-
* Props common to all single-select components
|
|
44
|
-
*/
|
|
45
|
-
interface BaseSingleSelectProps<T extends DataWithId> extends BaseSelectProps<T> {
|
|
46
|
-
selectedItemId?: T["id"] | null;
|
|
47
|
-
onSelectedItemIdChange?: (itemId: T["id"] | null) => void;
|
|
48
|
-
placeholderItem?: ToggleItem;
|
|
49
|
-
inputType?: "radio" | "icon";
|
|
50
|
-
removePlaceholderItem?: boolean;
|
|
51
|
-
}
|
|
52
|
-
/**
|
|
53
|
-
* Props common to all multi-select components
|
|
54
|
-
*/
|
|
55
|
-
interface BaseMultiSelectProps<T extends DataWithId> extends BaseSelectProps<T> {
|
|
56
|
-
selectedItemIds?: T["id"][];
|
|
57
|
-
onSelectedItemIdsChange?: (itemIds: T["id"][]) => void;
|
|
58
|
-
showSelectedItems?: boolean;
|
|
59
|
-
selectHeadings?: boolean;
|
|
60
|
-
selectAllItem?: ToggleItem;
|
|
61
|
-
inputType?: "checkbox" | "icon";
|
|
62
|
-
}
|
|
63
|
-
/**
|
|
64
|
-
* Props common to all autocomplete/searchable components
|
|
65
|
-
*/
|
|
66
|
-
interface BaseAutocompleteProps<T extends DataWithId> extends BaseSelectProps<T> {
|
|
67
|
-
EmptyState: ReactNode;
|
|
68
|
-
inputValue?: string;
|
|
69
|
-
itemToSearchString?: (item: T) => string;
|
|
70
|
-
onInputValueChange?: (value: string) => void;
|
|
71
|
-
}
|
|
72
|
-
/**
|
|
73
|
-
* Props for single-select autocomplete/searchable components
|
|
74
|
-
*/
|
|
75
|
-
interface BaseSingleAutocompleteProps<T extends DataWithId> extends BaseSingleSelectProps<T>, BaseAutocompleteProps<T> {
|
|
76
|
-
inputType?: "radio" | "icon";
|
|
77
|
-
}
|
|
78
|
-
/**
|
|
79
|
-
* Props for multi-select autocomplete/searchable components
|
|
80
|
-
*/
|
|
81
|
-
interface BaseMultiAutocompleteProps<T extends DataWithId> extends BaseMultiSelectProps<T>, BaseAutocompleteProps<T> {
|
|
82
|
-
inputType?: "checkbox" | "icon";
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
interface SingleSelectProps<T extends DataWithId> extends BaseSingleSelectProps<T> {
|
|
86
|
-
itemToSelection?: (item: T) => ReactNode;
|
|
87
|
-
renderSelection?: (item: T | null) => ReactNode;
|
|
88
|
-
triggerButtonProps?: any;
|
|
89
|
-
}
|
|
90
|
-
declare function SingleSelect<T extends DataWithId>({ id, data, selectedItemId: controlledSelectedItemId, isOpen: controlledIsOpen, itemToKey, itemToString, itemToSelection, renderSelection, renderItem, groupBy, renderGroupHeading, isVirtualized, estimatedItemHeight, placeholder, onSelectedItemIdChange, onIsOpenChange, stateReducer, triggerButtonProps, menuProps, inputType, removePlaceholderItem, onPointerDownOutside, onInteractOutside, popoutPlacement, }: SingleSelectProps<T>): react_jsx_runtime.JSX.Element;
|
|
91
|
-
|
|
92
|
-
interface MultiSelectProps<T extends DataWithId> extends BaseMultiSelectProps<T> {
|
|
93
|
-
renderSelections?: (items: T[]) => ReactNode;
|
|
94
|
-
triggerButtonProps?: any;
|
|
95
|
-
shouldOverflow?: boolean;
|
|
96
|
-
}
|
|
97
|
-
declare function MultiSelect<T extends DataWithId>({ id, data, selectedItemIds: controlledSelectedItemIds, isOpen: controlledIsOpen, itemToKey, itemToString, renderSelections, renderItem, groupBy, renderGroupHeading, isVirtualized, estimatedItemHeight, showSelectedItems, selectHeadings, selectAllItem, placeholder, onSelectedItemIdsChange, onIsOpenChange, stateReducer, triggerButtonProps, menuProps, inputType, shouldOverflow, onPointerDownOutside, onInteractOutside, popoutPlacement, }: MultiSelectProps<T>): react_jsx_runtime.JSX.Element;
|
|
98
|
-
|
|
99
|
-
interface SingleAutocompleteProps<T extends DataWithId> extends BaseSingleAutocompleteProps<T> {
|
|
100
|
-
includePlaceholderItem?: boolean;
|
|
101
|
-
}
|
|
102
|
-
declare function SingleAutocomplete<T extends DataWithId>({ id, data, selectedItemId: controlledSelectedItemId, inputValue: controlledInputValue, isOpen: controlledIsOpen, itemToKey, itemToString, itemToSearchString, renderItem, groupBy, renderGroupHeading, isVirtualized, estimatedItemHeight, EmptyState, placeholder, onSelectedItemIdChange, onInputValueChange, onIsOpenChange, stateReducer, menuProps, inputType, includePlaceholderItem, onPointerDownOutside, onInteractOutside, popoutPlacement, }: SingleAutocompleteProps<T>): react_jsx_runtime.JSX.Element;
|
|
103
|
-
|
|
104
|
-
interface MultiAutocompleteProps<T extends DataWithId> extends BaseMultiAutocompleteProps<T> {
|
|
105
|
-
}
|
|
106
|
-
declare function MultiAutocomplete<T extends DataWithId>({ id, data, selectedItemIds: controlledSelectedItemIds, inputValue: controlledInputValue, isOpen: controlledIsOpen, itemToKey, itemToString, itemToSearchString, renderItem, groupBy, renderGroupHeading, isVirtualized, estimatedItemHeight, showSelectedItems, selectHeadings, selectAllItem, EmptyState, placeholder, onSelectedItemIdsChange, onInputValueChange, onIsOpenChange, stateReducer, menuProps, inputType, onPointerDownOutside, onInteractOutside, popoutPlacement, }: MultiAutocompleteProps<T>): react_jsx_runtime.JSX.Element;
|
|
107
|
-
|
|
108
|
-
export { MultiAutocomplete, type MultiAutocompleteProps, MultiSelect, type MultiSelectProps, SingleAutocomplete, type SingleAutocompleteProps, SingleSelect, type SingleSelectProps };
|