@purpur/library 10.0.0 → 10.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (77) hide show
  1. package/CHANGELOG.json +18 -0
  2. package/CHANGELOG.md +13 -1
  3. package/dist/components/accordion/src/accordion-item.d.ts +1 -1
  4. package/dist/components/accordion/src/accordion.d.ts +1 -1
  5. package/dist/components/alert-badge/src/alert-badge.d.ts +1 -1
  6. package/dist/components/avatar/src/avatar.d.ts +1 -1
  7. package/dist/components/badge/src/badge.d.ts +1 -1
  8. package/dist/components/button/src/button.d.ts +5 -5
  9. package/dist/components/button/src/button.visual.fixtures.d.ts +1 -1
  10. package/dist/components/card/src/card-badge.d.ts +1 -1
  11. package/dist/components/card/src/card-content-container.d.ts +1 -1
  12. package/dist/components/card/src/card-content.d.ts +1 -1
  13. package/dist/components/card/src/card-cta.d.ts +1 -1
  14. package/dist/components/card/src/card-media.d.ts +2 -2
  15. package/dist/components/card/src/card-root.d.ts +1 -1
  16. package/dist/components/checkbox/src/checkbox.d.ts +1 -1
  17. package/dist/components/chip-group/src/chip-group.d.ts +1 -1
  18. package/dist/components/comparison-table/src/components/OptionCard/option-card.d.ts +1 -1
  19. package/dist/components/content-block/src/content-block-group.d.ts +1 -1
  20. package/dist/components/content-block/src/content-block.d.ts +1 -1
  21. package/dist/components/country-flag-icon/src/country-flag-icon.d.ts +2 -2
  22. package/dist/components/cta-link/src/cta-link.d.ts +10 -10
  23. package/dist/components/date-picker/src/date-picker.d.ts +5 -5
  24. package/dist/components/date-range-field/src/date-range-field.d.ts +1 -1
  25. package/dist/components/dismissable-chip-group/src/dismissable-chip-group-item.d.ts +1 -1
  26. package/dist/components/dismissable-chip-group/src/dismissable-chip-group.d.ts +2 -2
  27. package/dist/components/drawer/src/drawer-container.d.ts +1 -1
  28. package/dist/components/drawer/src/drawer-frame.d.ts +2 -2
  29. package/dist/components/drawer/src/drawer-handle.d.ts +1 -1
  30. package/dist/components/drawer/src/drawer-header.d.ts +1 -1
  31. package/dist/components/drawer/src/drawer-scroll-area.d.ts +1 -1
  32. package/dist/components/drawer/src/drawer-trigger.d.ts +2 -2
  33. package/dist/components/dropdown/src/dropdown.types.d.ts +1 -1
  34. package/dist/components/dropdown/src/dropdown.types.d.ts.map +1 -1
  35. package/dist/components/dropdown/src/useDropdown.d.ts +1 -1
  36. package/dist/components/field-error-text/src/field-error-text.d.ts +2 -2
  37. package/dist/components/field-helper-text/src/field-helper-text.d.ts +1 -1
  38. package/dist/components/footer/src/footer.d.ts +1 -1
  39. package/dist/components/illustrative-icon/src/animated-illustrative-icon.d.ts +1 -1
  40. package/dist/components/illustrative-icon/src/static-illustrative-icon.d.ts +2 -2
  41. package/dist/components/label/src/label.d.ts +1 -1
  42. package/dist/components/link/src/link.d.ts +1 -1
  43. package/dist/components/loading/src/loading-illustrative.d.ts +2 -2
  44. package/dist/components/modal/src/modal-trigger.d.ts +1 -1
  45. package/dist/components/notification/src/notification.d.ts +3 -3
  46. package/dist/components/notification-banner/src/notification-banner.d.ts +1 -1
  47. package/dist/components/pagination/src/pagination-page-selector.d.ts +2 -2
  48. package/dist/components/pagination/src/pagination-page-size-selector.d.ts +2 -2
  49. package/dist/components/pagination/src/pagination-page-trigger.d.ts +1 -1
  50. package/dist/components/pagination/src/pagination-pages.d.ts +2 -2
  51. package/dist/components/pagination/src/pagination-truncation-separator.d.ts +1 -1
  52. package/dist/components/pagination/src/types.d.ts +1 -1
  53. package/dist/components/pagination/src/use-page-options.hook.d.ts +1 -1
  54. package/dist/components/pagination/src/use-page-size-options.hook.d.ts +1 -1
  55. package/dist/components/password-field/src/password-strength-indicator.d.ts +1 -1
  56. package/dist/components/promotion-card/src/promotion-card.d.ts +3 -3
  57. package/dist/components/radio-button-group/src/radio-button-group-root.d.ts +2 -2
  58. package/dist/components/radio-card-group/src/radio-card-group.d.ts +1 -1
  59. package/dist/components/radio-card-group/src/radio-card-item.d.ts +1 -1
  60. package/dist/components/rich-text/src/types.d.ts +3 -3
  61. package/dist/components/search-field/src/search-field-base.d.ts +2 -2
  62. package/dist/components/stepper/src/stepper-container.d.ts +1 -1
  63. package/dist/components/table/src/cell-types/button-group-cell.d.ts +3 -3
  64. package/dist/components/table/src/table-content.d.ts +1 -1
  65. package/dist/components/table/src/table.d.ts +1 -1
  66. package/dist/components/tabs/src/tab-content.d.ts +2 -2
  67. package/dist/components/text-area/src/text-area.d.ts +1 -1
  68. package/dist/components/text-field/src/text-field.d.ts +1 -1
  69. package/dist/components/tooltip/src/tooltip.d.ts +3 -3
  70. package/dist/dropdown-Bn7WvsL2.js.map +1 -1
  71. package/dist/dropdown-CrufJnb4.mjs.map +1 -1
  72. package/dist/libraries/library/src/notification-banner.d.ts +1 -1
  73. package/dist/libraries/library/src/notification.d.ts +1 -1
  74. package/dist/libraries/library/src/quantity-selector.d.ts +2 -2
  75. package/dist/libraries/library/src/spacer.d.ts +2 -2
  76. package/dist/libraries/theme/src/ThemeProvider.d.ts +1 -1
  77. package/package.json +19 -19
@@ -4,4 +4,4 @@ type UsePageSizeOptionsHook = {
4
4
  };
5
5
  export declare const usePageSizeOptions: (availablePageSizes: number[]) => UsePageSizeOptionsHook;
6
6
  export {};
7
- //# sourceMappingURL=use-page-size-options.hook.d.ts.map
7
+ //# sourceMappingURL=use-page-size-options.hook.d.ts.map.map
@@ -6,4 +6,4 @@ export type PasswordStrengthIndicatorProps = Omit<BaseProps, "children"> & {
6
6
  passwordStrength?: PasswordStrengthValue;
7
7
  };
8
8
  export declare const PasswordStrengthIndicator: React.ForwardRefExoticComponent<Omit<PasswordStrengthIndicatorProps, "ref"> & React.RefAttributes<HTMLDivElement>>;
9
- //# sourceMappingURL=password-strength-indicator.d.ts.map
9
+ //# sourceMappingURL=password-strength-indicator.d.ts.mapmap
@@ -1,7 +1,7 @@
1
1
  import { default as React, ReactNode } from 'react';
2
- import { BaseProps } from '../../../libraries/common-types/src/common-types.ts';
3
- import { HeadingTagType, HeadingVariantType } from '../../heading/src/heading.tsx';
4
- import { ColorScheme } from '../../../libraries/theme/src/theme.ts';
2
+ import { BaseProps } from '../../../libraries/common-types/src/common-types';
3
+ import { HeadingTagType, HeadingVariantType } from '../../heading/src/heading';
4
+ import { ColorScheme } from '../../../libraries/theme/src/theme';
5
5
  export declare const promotionCardVariants: readonly ["primary", "secondary", "quaternary"];
6
6
  export type PromotionCardVariant = (typeof promotionCardVariants)[number];
7
7
  export type PromotionCardDecorativeImage = {
@@ -1,6 +1,6 @@
1
1
  import { default as React, ReactNode } from 'react';
2
- import { BaseProps } from '../../../libraries/common-types/src/common-types';
3
- import { HeadingTagType } from '../../heading/src/heading';
2
+ import { BaseProps } from '../../../libraries/common-types/src/common-types.ts';
3
+ import { HeadingTagType } from '../../heading/src/heading.tsx';
4
4
  import { RADIO_BUTTON_GROUP_ORIENTATION, RadioButtonGroupDirection } from './constants';
5
5
  import { RadioButtonGroupItem } from './radio-button-group-item';
6
6
  export type RadioButtonGroupRootProps = Omit<BaseProps, "id"> & {
@@ -142,4 +142,4 @@ export declare const RadioCardGroup: React.ForwardRefExoticComponent<StylingProp
142
142
  } & React.RefAttributes<HTMLDivElement>>;
143
143
  export type { RadioCardItemProps } from './radio-card-item';
144
144
  export { RadioCardItem } from './radio-card-item';
145
- //# sourceMappingURL=radio-card-group.d.ts.map.map
145
+ //# sourceMappingURL=radio-card-group.d.ts.map
@@ -37,4 +37,4 @@ export type RadioCardItemProps = Omit<BaseProps, "id" | "title"> & {
37
37
  };
38
38
  export declare const RadioCardItem: React.ForwardRefExoticComponent<Omit<RadioCardItemProps, "ref"> & React.RefAttributes<HTMLDivElement>>;
39
39
  export {};
40
- //# sourceMappingURL=radio-card-item.d.ts.map
40
+ //# sourceMappingURL=radio-card-item.d.ts.mapmap
@@ -1,6 +1,6 @@
1
1
  import { ReactNode } from 'react';
2
- import { BadgeVariant } from '../../badge/src/badge';
3
- import { BaseProps } from '../../../libraries/common-types/src/common-types';
2
+ import { BadgeVariant } from '../../badge/src/badge.tsx';
3
+ import { BaseProps } from '../../../libraries/common-types/src/common-types.ts';
4
4
  import { BLOCK, ELEMENT, INLINE, MARK } from './constants';
5
5
  export type ImageProp = undefined | ((url: string, alt?: string, contentType?: string) => ReactNode);
6
6
  export type VideoPosterProp = undefined | ((url: string) => string);
@@ -81,4 +81,4 @@ export type Value = {
81
81
  };
82
82
  export type KeyOfBlock = keyof typeof BLOCK;
83
83
  export {};
84
- //# sourceMappingURL=types.d.ts.map.ts.map
84
+ //# sourceMappingURL=types.d.ts.map
@@ -1,5 +1,5 @@
1
1
  import { default as React, ChangeEvent, CSSProperties, RefObject } from 'react';
2
- import { TextFieldProps } from '../../text-field/src/text-field';
2
+ import { TextFieldProps } from '../../text-field/src/text-field.tsx';
3
3
  import { AutocompleteOption } from '@purpur/use-autocomplete';
4
4
  export declare const searchFieldVariants: readonly ["button-attached", "no-button"];
5
5
  type Variant = (typeof searchFieldVariants)[number];
@@ -93,4 +93,4 @@ export declare const SearchFieldBase: React.ForwardRefExoticComponent<(Omit<Defa
93
93
  wrapperStyle?: CSSProperties;
94
94
  }, "ref">) & React.RefAttributes<HTMLInputElement>>;
95
95
  export {};
96
- //# sourceMappingURL=search-field-base.d.ts.map.map
96
+ //# sourceMappingURL=search-field-base.d.ts.map
@@ -7,4 +7,4 @@ export type StepperContainerProps = Omit<BaseProps, "children"> & {
7
7
  variant: StepperVariant;
8
8
  };
9
9
  export declare const StepperContainer: ({ ["data-testid"]: dataTestId, children, className, alignWithGrid, variant, ...props }: StepperContainerProps) => React.JSX.Element;
10
- //# sourceMappingURL=stepper-container.d.ts.map
10
+ //# sourceMappingURL=stepper-container.d.ts.mapmap
@@ -1,6 +1,6 @@
1
1
  import { default as React, ReactElement } from 'react';
2
- import { ButtonProps } from '../../../button/src/button';
3
- import { IconProps } from '../../../../icon/icon';
2
+ import { ButtonProps } from '../../../button/src/button.tsx';
3
+ import { IconProps } from '@purpur/icon';
4
4
  import { Cell, RowData } from '@tanstack/react-table';
5
5
  type IconOnlyButtonVariant = Extract<ButtonProps, {
6
6
  iconOnly: true;
@@ -16,4 +16,4 @@ export type ButtonGroupCellProps<TData> = {
16
16
  };
17
17
  export declare const ButtonGroupCell: <TData extends RowData>({ cell }: ButtonGroupCellProps<TData>) => React.JSX.Element;
18
18
  export {};
19
- //# sourceMappingURL=button-group-cell.d.ts.map
19
+ //# sourceMappingURL=button-group-cell.d.ts.maps.map
@@ -1,6 +1,6 @@
1
1
  import { default as React } from 'react';
2
2
  import { UniqueIdentifier } from '@dnd-kit/core';
3
- import { HeadingTagType } from '../../heading/src/heading';
3
+ import { HeadingTagType } from '../../heading/src/heading.tsx';
4
4
  import { Row, Table, RowData } from '@tanstack/react-table';
5
5
  type TableContentProps<TData extends RowData> = {
6
6
  tanstackTable: Table<TData>;
@@ -1,6 +1,6 @@
1
1
  import { default as React, ReactElement } from 'react';
2
2
  import { ColumnDef, ColumnFiltersState, CoreOptions, PaginationState, RowData, RowSelectionState, SortingState, TableOptions, VisibilityState } from '@tanstack/react-table';
3
- import { PaginationProps } from '../../pagination/src/pagination';
3
+ import { PaginationProps } from '../../pagination/src/pagination.tsx';
4
4
  import { WithActionBarProps, WithColumnDragProps, WithEmptyTableProps, WithLoadingProps, WithoutActionBarProps, WithoutColumnDragProps, WithoutEmptyTableProps, WithoutLoadingProps, WithoutRowSelectionProps, WithoutToolbarProps, WithRowSelectionProps, WithSortingProps, WithToolbarProps } from './types';
5
5
  export { createColumnHelper } from '@tanstack/react-table';
6
6
  export type { ColumnDef, ColumnFiltersState, CoreOptions, PaginationState, RowData, RowSelectionState, SortingState, TableOptions, VisibilityState, };
@@ -1,5 +1,5 @@
1
1
  import { default as React, ReactElement, ReactNode } from 'react';
2
- import { BaseProps } from '../../../libraries/common-types/src/common-types';
2
+ import { BaseProps } from '../../../libraries/common-types/src/common-types.ts';
3
3
  export type TabContentProps = Omit<BaseProps, "children"> & {
4
4
  /**
5
5
  * Content to be rendered inside a `button` element.
@@ -21,4 +21,4 @@ export type TabContentProps = Omit<BaseProps, "children"> & {
21
21
  };
22
22
  export declare const TabContent: React.ForwardRefExoticComponent<Omit<TabContentProps, "ref"> & React.RefAttributes<HTMLDivElement>>;
23
23
  export declare const isTabContent: (child?: ReactNode) => child is ReactElement<TabContentProps>;
24
- //# sourceMappingURL=tab-content.d.ts.mapmap
24
+ //# sourceMappingURL=tab-content.d.ts.map
@@ -1,5 +1,5 @@
1
1
  import { default as React } from 'react';
2
- import { BaseProps } from '../../../libraries/common-types/src/common-types';
2
+ import { BaseProps } from '../../../libraries/common-types/src/common-types.ts';
3
3
  export declare const ResizeOption: {
4
4
  readonly NONE: "none";
5
5
  readonly BOTH: "both";
@@ -1,5 +1,5 @@
1
1
  import { default as React, HTMLInputTypeAttribute, ReactElement, ReactNode } from 'react';
2
- import { BaseProps } from '../../../libraries/common-types/src/common-types';
2
+ import { BaseProps } from '../../../libraries/common-types/src/common-types.ts';
3
3
  export declare const textFieldVariants: readonly ["default", "ai"];
4
4
  export type TextFieldVariant = (typeof textFieldVariants)[number];
5
5
  type TextFieldCommonProps = {
@@ -1,7 +1,7 @@
1
1
  import { default as React, ReactNode } from 'react';
2
- import { Size } from '../../../libraries/action/src/action.tsx';
3
- import { BaseProps } from '../../../libraries/common-types/src/common-types.ts';
4
- import { Size as IconSize } from '@purpur/icon';
2
+ import { Size } from '../../../libraries/action/src/action';
3
+ import { BaseProps } from '../../../libraries/common-types/src/common-types';
4
+ import { Size as IconSize } from '../../../icon/icon';
5
5
  export declare const TOOLTIP_POSITION: {
6
6
  readonly TOP: "top";
7
7
  readonly BOTTOM: "bottom";
@@ -1 +1 @@
1
- {"version":3,"file":"dropdown-Bn7WvsL2.js","sources":["../../../components/dropdown/src/dropdown.types.ts","../../../components/dropdown/src/dropdown-shared.tsx","../../../components/dropdown/src/useDropdownFilter.ts","../../../components/dropdown/src/useDropdownInput.ts","../../../components/dropdown/src/dropdown-combobox.tsx","../../../components/dropdown/src/useDropdownHighlight.ts","../../../components/dropdown/src/useOnClickOutside.ts","../../../components/dropdown/src/useDropdown.ts","../../../components/dropdown/src/dropdown-select.tsx","../../../components/dropdown/src/dropdown.tsx"],"sourcesContent":["export type DropdownOption = {\n /**\n * Content rendered for this option in the trigger and listbox. Accepts any `ReactNode`.\n * For `combobox` mode, text-input syncing and the default search filter require a plain\n * `string` — non-string labels fall back to `value` for those, so provide `value`\n * (or a custom `filterOption`) when using a non-string label with `combobox`.\n */\n label: React.ReactNode;\n id: string;\n value?: string;\n disabled?: boolean;\n};\n\n/** Plain-text form of an option's label, for text inputs, search filtering, and ARIA strings. */\nexport const getOptionLabelText = (option: Pick<DropdownOption, \"label\" | \"value\">): string =>\n typeof option.label === \"string\" ? option.label : option.value ?? \"\";\n\n/** Shared props across all variants */\ntype DropdownBaseProps = {\n /** Unique id used to prefix all sub-element ids. */\n id?: string;\n /** Visible label rendered above the field. */\n label?: string;\n /** Accessible label for the listbox popup (required for select/combobox). */\n listboxLabel?: string;\n /** Placeholder text shown when no value is selected. */\n placeholder?: string;\n /** Helper text rendered below the field. */\n helperText?: string;\n /** Error text rendered below the field. Puts the field in an error state. */\n errorText?: string;\n /** Render the field with a valid (success) appearance. */\n valid?: boolean;\n /** Show a loading spinner inside the field. */\n loading?: boolean;\n /** Render on dark backgrounds. */\n negative?: boolean;\n /** Mark the field as required. */\n required?: boolean;\n /** Disable the field. */\n disabled?: boolean;\n /** Make the field read-only. */\n readOnly?: boolean;\n /**\n * Label for the \"Select all\" option. Only effective when `multiple` is `true`.\n * The option is hidden automatically when any disabled option is **not** selected.\n */\n selectAllLabel?: string;\n /** Text appended after the hidden chip count (e.g. `\"+4 more\"`). Only effective when `multiple` is `true`. */\n moreOptionsText?: string;\n className?: string;\n [\"data-testid\"]?: string;\n};\n\n// ── Multi-select variant (moreOptionsText required) ──────────────────\n\ntype DropdownMultipleProps = DropdownBaseProps & {\n multiple: true;\n /** The accessible label for each chip's remove button. */\n moreOptionsText: string;\n removeOptionAriaLabel: string;\n};\n\n// ── Single-select variant (moreOptionsText optional) ─────────────────\n\ntype DropdownSingleProps = DropdownBaseProps & {\n multiple?: false | undefined;\n moreOptionsText?: string;\n removeOptionAriaLabel?: never;\n};\n\n// ── Shared props for select variant ──────────────────────────────────\n\ntype DropdownSelectSharedProps = {\n combobox?: false;\n options: DropdownOption[];\n /** Currently selected option (single-select, controlled). */\n selectedOption?: DropdownOption;\n /** Currently selected options (multi-select, controlled). */\n selectedOptions?: DropdownOption[];\n /** Fired when an option is selected or deselected. */\n onSelect?: (toggledOption: DropdownOption | undefined, selectedOptions: DropdownOption[]) => void;\n /** Open the listbox when the trigger receives focus. */\n openOnFocus?: boolean;\n /** Maximum height of the listbox popup. */\n listboxMaxHeight?: string | number;\n filterOption?: never;\n onInputChange?: never;\n inputValue?: never;\n defaultInputValue?: never;\n noOptionsText?: never;\n highlightFirstOption?: never;\n};\n\n// ── Shared props for combobox variant ────────────────────────────────\n\ntype DropdownComboboxSharedProps = {\n combobox: true;\n options: DropdownOption[];\n /** Currently selected option (single-select, controlled). */\n selectedOption?: DropdownOption;\n /** Currently selected options (multi-select, controlled). */\n selectedOptions?: DropdownOption[];\n /** Fired when an option is selected or deselected. */\n onSelect?: (toggledOption: DropdownOption | undefined, selectedOptions: DropdownOption[]) => void;\n /** Custom filter for autocomplete results. */\n filterOption?: (inputValue: string | undefined, option: DropdownOption) => boolean;\n /** Controlled input value. */\n inputValue?: string;\n /** Default input value (uncontrolled). */\n defaultInputValue?: string;\n /** Fired when the text-input value changes. */\n onInputChange?: (value: string) => void;\n /** Text shown when filtering yields no results. */\n noOptionsText?: React.ReactNode;\n /** Highlight the first option automatically. */\n highlightFirstOption?: boolean;\n /** Open the listbox when the input receives focus. */\n openOnFocus?: boolean;\n /** Maximum height of the listbox popup. */\n listboxMaxHeight?: string | number;\n};\n\n// ── Custom select (single & multi) ────────────────────────────────────\n\nexport type DropdownSelectProps =\n | (DropdownMultipleProps & DropdownSelectSharedProps)\n | (DropdownSingleProps & DropdownSelectSharedProps);\n\n// ── Combobox / autocomplete ──────────────────────────────────────────\n\nexport type DropdownComboboxProps =\n | (DropdownMultipleProps & DropdownComboboxSharedProps)\n | (DropdownSingleProps & DropdownComboboxSharedProps);\n\nexport type DropdownProps = DropdownSelectProps | DropdownComboboxProps;\n","import React from \"react\";\nimport type { CheckedState } from \"@purpur/checkbox\";\nimport { Checkbox } from \"@purpur/checkbox\";\nimport { DismissableChipGroup } from \"@purpur/dismissable-chip-group\";\nimport { FieldErrorText } from \"@purpur/field-error-text\";\nimport { FieldHelperText } from \"@purpur/field-helper-text\";\nimport { IconCheckCircleFilled } from \"@purpur/icon/check-circle-filled\";\nimport { IconChevronDown } from \"@purpur/icon/chevron-down\";\nimport { Label } from \"@purpur/label\";\nimport { Listbox } from \"@purpur/listbox\";\nimport { Spinner } from \"@purpur/spinner\";\nimport c from \"classnames/bind\";\n\nimport styles from \"./dropdown.module.scss\";\nimport type { DropdownOption } from \"./dropdown.types\";\nimport { getOptionLabelText } from \"./dropdown.types\";\n\nconst cx = c.bind(styles);\nexport const rootClassName = \"purpur-dropdown\";\n\ntype GetTestId = (name: string) => string | undefined;\n\ntype DropdownLabelProps = {\n fieldId: string;\n htmlForSuffix?: string;\n label?: string;\n getTestId: GetTestId;\n disabled: boolean;\n negative: boolean;\n required: boolean;\n};\n\nexport const DropdownLabel = ({\n fieldId,\n htmlForSuffix,\n label,\n getTestId,\n disabled,\n negative,\n required,\n}: DropdownLabelProps) => {\n if (!label) return null;\n\n return (\n <Label\n htmlFor={htmlForSuffix ? `${fieldId}-${htmlForSuffix}` : fieldId}\n className={cx(`${rootClassName}__label`)}\n data-testid={getTestId(\"label\")}\n disabled={disabled}\n negative={negative}\n >\n {required && <span aria-hidden>*</span>}\n {label}\n </Label>\n );\n};\n\ntype DropdownEndAdornmentsProps = {\n getTestId: GetTestId;\n loading?: boolean;\n disabled: boolean;\n negative: boolean;\n isValid: boolean;\n isOpen?: boolean;\n readOnly?: boolean;\n showChevronOpen: boolean;\n};\n\nexport const DropdownEndAdornments = ({\n getTestId,\n loading,\n disabled,\n negative,\n isValid,\n isOpen,\n readOnly,\n showChevronOpen,\n}: DropdownEndAdornmentsProps) => (\n <span className={cx(`${rootClassName}__end-adornments`)}>\n {loading ? (\n <Spinner\n disabled={disabled}\n size=\"xxs\"\n negative={negative}\n data-testid={getTestId(\"spinner\")}\n />\n ) : (\n <>\n {isValid && (\n <IconCheckCircleFilled\n data-testid={getTestId(\"valid-icon\")}\n className={cx(`${rootClassName}__valid-icon`)}\n />\n )}\n <IconChevronDown\n className={cx(`${rootClassName}__chevron-icon`, {\n [`${rootClassName}__chevron-icon--open`]: showChevronOpen && isOpen,\n [`${rootClassName}__chevron-icon--disabled`]: disabled,\n [`${rootClassName}__chevron-icon--readonly`]: readOnly && !disabled,\n [`${rootClassName}__chevron-icon--is-valid`]: isValid,\n [`${rootClassName}__chevron-icon--negative`]: negative,\n })}\n data-testid={getTestId(\"dropdown-icon\")}\n size=\"sm\"\n />\n </>\n )}\n </span>\n);\n\nconst MAX_VISIBLE_TAGS = 6;\n\ntype DropdownTagsProps = {\n selectedItems: DropdownOption[];\n getTestId: GetTestId;\n disabled: boolean;\n negative: boolean;\n onRemove: (option: DropdownOption) => void;\n isSelect?: boolean;\n moreOptionsText?: string;\n removeOptionAriaLabel?: string;\n};\n\nexport const DropdownTags = ({\n selectedItems,\n getTestId,\n disabled,\n negative,\n onRemove,\n isSelect,\n moreOptionsText,\n removeOptionAriaLabel,\n}: DropdownTagsProps) => {\n if (!selectedItems.length) return null;\n\n const capEnabled = moreOptionsText !== undefined && selectedItems.length > MAX_VISIBLE_TAGS;\n const visibleItems = capEnabled ? selectedItems.slice(-MAX_VISIBLE_TAGS) : selectedItems;\n const hiddenCount = selectedItems.length - visibleItems.length;\n\n return (\n <DismissableChipGroup\n className={cx(`${rootClassName}__chip-group`, {\n [`${rootClassName}__chip-group--select`]: isSelect,\n })}\n negative={negative}\n data-testid={getTestId(\"tags\")}\n size=\"sm\"\n >\n {visibleItems.map((item) => (\n <DismissableChipGroup.Item\n key={item.id}\n id={item.id}\n data-testid={getTestId(`tag-${item.id}`)}\n aria-label={\n removeOptionAriaLabel\n ? `${removeOptionAriaLabel} ${getOptionLabelText(item)}`\n : getOptionLabelText(item)\n }\n onDismiss={() => {\n onRemove(item);\n }}\n disabled={disabled || item.disabled}\n >\n {item.label}\n </DismissableChipGroup.Item>\n ))}\n {hiddenCount > 0 && (\n <li\n className={cx(`${rootClassName}__chip-group-more`)}\n data-testid={getTestId(\"tags-more\")}\n >\n {`+${hiddenCount} ${moreOptionsText}`}\n </li>\n )}\n </DismissableChipGroup>\n );\n};\n\ntype DropdownFooterProps = {\n errorText?: string;\n helperText?: string;\n helperTextId: string;\n negative: boolean;\n};\n\nexport const DropdownFooter = ({\n errorText,\n helperText,\n helperTextId,\n negative,\n}: DropdownFooterProps) => (\n <>\n {errorText && <FieldErrorText negative={negative}>{errorText}</FieldErrorText>}\n {helperText && !errorText && (\n <FieldHelperText id={helperTextId} negative={negative}>\n {helperText}\n </FieldHelperText>\n )}\n </>\n);\n\nexport const SELECT_ALL_OPTION_ID = \"__purpur-dropdown-select-all__\";\n\ntype ShouldShowSelectAllArgs = {\n selectAllLabel?: string;\n multiple?: boolean;\n options: DropdownOption[];\n selectedItems: DropdownOption[];\n};\n\nexport const shouldShowSelectAll = ({\n selectAllLabel,\n multiple,\n options,\n selectedItems,\n}: ShouldShowSelectAllArgs): boolean => {\n if (!selectAllLabel || !multiple) return false;\n const enabledOptions = options.filter((o) => !o.disabled);\n if (enabledOptions.length === 0) return false;\n const disabledOptions = options.filter((o) => o.disabled);\n const hasDisabledUnselected = disabledOptions.some(\n (o) => !selectedItems.some((s) => s.id === o.id)\n );\n // Hide \"All\" when a disabled option is not selected (can't select everything)\n return !hasDisabledUnselected;\n};\n\ntype DropdownListboxItemsProps = {\n optionsToShow: DropdownOption[];\n getListboxItemProps: (option: DropdownOption, index: number) => Record<string, unknown>;\n multiple?: boolean;\n negative: boolean;\n fieldId: string;\n noOptionsText?: React.ReactNode;\n selectAllLabel?: string;\n selectedItems?: DropdownOption[];\n};\n\nexport const DropdownListboxItems = ({\n optionsToShow,\n getListboxItemProps,\n multiple,\n negative,\n fieldId,\n noOptionsText,\n selectAllLabel,\n selectedItems = [],\n}: DropdownListboxItemsProps) => {\n if (noOptionsText !== undefined && !optionsToShow.length) {\n return <Listbox.Item noninteractive>{noOptionsText}</Listbox.Item>;\n }\n\n const hasSelectAll = optionsToShow[0]?.id === SELECT_ALL_OPTION_ID;\n\n let selectAllCheckedState: CheckedState = false;\n if (hasSelectAll) {\n const realOptions = optionsToShow.filter((o) => o.id !== SELECT_ALL_OPTION_ID);\n const enabledOptions = realOptions.filter((o) => !o.disabled);\n const enabledSelectedCount = enabledOptions.filter((o) =>\n selectedItems.some((s) => s.id === o.id)\n ).length;\n const allEnabledSelected =\n enabledOptions.length > 0 && enabledSelectedCount === enabledOptions.length;\n const someSelected = selectedItems.length > 0;\n selectAllCheckedState = allEnabledSelected ? true : someSelected ? \"indeterminate\" : false;\n }\n\n return optionsToShow.map((option, index) => {\n const { key, selected, ...itemProps } = getListboxItemProps(option, index);\n\n if (option.id === SELECT_ALL_OPTION_ID) {\n return (\n <Listbox.Item\n key={key as string}\n {...itemProps}\n aria-selected={selectAllCheckedState === true}\n className={cx(\n `${rootClassName}__checkbox-item-multiple`,\n `${rootClassName}__select-all-item`\n )}\n hideSelectedIcon\n >\n <span className={cx(`${rootClassName}__checkbox-container`)}>\n <Checkbox\n id={`${fieldId}-checkbox-select-all`}\n checked={selectAllCheckedState}\n label={selectAllLabel}\n negative={negative}\n aria-hidden\n />\n </span>\n </Listbox.Item>\n );\n }\n\n if (multiple) {\n return (\n <Listbox.Item\n key={key as string}\n {...itemProps}\n className={cx(`${rootClassName}__checkbox-item-multiple`, {\n [`${rootClassName}__select-all-child`]: hasSelectAll,\n })}\n selected={!!selected}\n hideSelectedIcon\n >\n <span\n className={cx(`${rootClassName}__checkbox-container`, {\n [`${rootClassName}__checkbox-container--disabled`]: option.disabled,\n })}\n >\n <Checkbox\n id={`${fieldId}-checkbox-${option.id}`}\n checked={!!selected}\n label={option.label}\n negative={negative}\n aria-hidden\n disabled={option.disabled}\n />\n </span>\n </Listbox.Item>\n );\n }\n\n return (\n <Listbox.Item key={key as string} {...itemProps} selected={!!selected}>\n <div>{option.label}</div>\n </Listbox.Item>\n );\n });\n};\n\nexport { cx };\n","import type { DropdownOption } from \"./dropdown.types\";\nimport { getOptionLabelText } from \"./dropdown.types\";\n\nconst filterOptions = (\n options: DropdownOption[],\n searchTerm: string | undefined,\n filterOption?: (inputValue: string | undefined, option: DropdownOption) => boolean\n): DropdownOption[] => {\n if (filterOption) {\n return options.filter((option) => filterOption(searchTerm, option));\n }\n if (!searchTerm) return options;\n const chunks = searchTerm.toUpperCase().split(\" \");\n return options.filter((option) =>\n chunks.every((chunk) =>\n (option.value || (typeof option.label === \"string\" ? option.label : \"\"))\n .toUpperCase()\n .includes(chunk)\n )\n );\n};\n\nexport const getFilteredOptions = ({\n options,\n searchTerm,\n filterOption,\n selectedOption,\n multiple,\n}: {\n options: DropdownOption[];\n searchTerm: string | undefined;\n filterOption?: (inputValue: string | undefined, option: DropdownOption) => boolean;\n selectedOption?: DropdownOption;\n multiple: boolean;\n}): DropdownOption[] => {\n if (!multiple && selectedOption && getOptionLabelText(selectedOption) === searchTerm) {\n return options;\n }\n return filterOptions(options, searchTerm, filterOption);\n};\n","import { useState } from \"react\";\n\nimport type { DropdownOption } from \"./dropdown.types\";\nimport { getOptionLabelText } from \"./dropdown.types\";\n\nexport type UseDropdownInputParams = {\n controlledInputValue?: string;\n defaultInputValue?: string;\n selectedOption?: DropdownOption;\n onInputChange?: (value: string) => void;\n};\n\nexport const useDropdownInput = ({\n controlledInputValue,\n defaultInputValue,\n selectedOption,\n onInputChange,\n}: UseDropdownInputParams) => {\n const [internalInputValue, setInternalInputValue] = useState(\n (typeof controlledInputValue === \"string\"\n ? controlledInputValue\n : defaultInputValue ?? (selectedOption ? getOptionLabelText(selectedOption) : undefined)) ??\n \"\"\n );\n\n const displayInputValue =\n typeof controlledInputValue === \"string\" ? controlledInputValue : internalInputValue;\n\n const populateInputField = (value: string) => {\n onInputChange?.(value);\n setInternalInputValue(value);\n };\n\n return {\n displayInputValue,\n populateInputField,\n };\n};\n","import React, { forwardRef, useId } from \"react\";\nimport { Listbox } from \"@purpur/listbox\";\nimport { useAutocomplete } from \"@purpur/use-autocomplete\";\n\nimport type { DropdownComboboxProps, DropdownOption } from \"./dropdown.types\";\nimport { getOptionLabelText } from \"./dropdown.types\";\nimport {\n cx,\n DropdownEndAdornments,\n DropdownFooter,\n DropdownLabel,\n DropdownListboxItems,\n DropdownTags,\n rootClassName,\n SELECT_ALL_OPTION_ID,\n shouldShowSelectAll,\n} from \"./dropdown-shared\";\nimport { getFilteredOptions } from \"./useDropdownFilter\";\nimport { useDropdownInput } from \"./useDropdownInput\";\n\nexport const DropdownCombobox = forwardRef<HTMLDivElement, DropdownComboboxProps>((props, ref) => {\n const {\n id: propId,\n label,\n options,\n className,\n errorText,\n helperText,\n placeholder,\n negative = false,\n readOnly = false,\n disabled = false,\n required = false,\n valid,\n loading,\n multiple = false,\n selectedOption,\n selectedOptions = [],\n onSelect,\n openOnFocus = false,\n listboxMaxHeight,\n listboxLabel,\n filterOption,\n inputValue,\n defaultInputValue,\n onInputChange,\n noOptionsText,\n highlightFirstOption = false,\n selectAllLabel,\n moreOptionsText,\n removeOptionAriaLabel,\n [\"data-testid\"]: dataTestId,\n } = props;\n\n const randomId = useId();\n const fieldId = propId ?? randomId;\n const getTestId = (name: string) => (dataTestId ? `${dataTestId}-${name}` : undefined);\n const isValid = !!valid && !errorText;\n const helperTextId = `${fieldId}-helper-text`;\n\n const selectedItems = multiple ? selectedOptions : selectedOption ? [selectedOption] : [];\n\n const { displayInputValue, populateInputField } = useDropdownInput({\n controlledInputValue: inputValue,\n defaultInputValue,\n selectedOption,\n onInputChange,\n });\n\n const optionsToShow = getFilteredOptions({\n options,\n searchTerm: displayInputValue,\n filterOption,\n selectedOption,\n multiple,\n });\n\n const showSelectAll = shouldShowSelectAll({\n selectAllLabel,\n multiple,\n options,\n selectedItems,\n });\n\n // Hide \"Select all\" when the user is actively searching/filtering.\n const selectAllMatchesSearch = showSelectAll && !displayInputValue;\n\n // Inject a virtual \"Select all\" option so it participates in keyboard navigation.\n const optionsWithSelectAll =\n showSelectAll && selectAllMatchesSearch\n ? [{ id: SELECT_ALL_OPTION_ID, label: selectAllLabel as string }, ...optionsToShow]\n : optionsToShow;\n\n const handleSelectAll = () => {\n const enabledOptions = options.filter((o) => !o.disabled);\n const allEnabledSelected = enabledOptions.every((o) =>\n selectedItems.some((s) => s.id === o.id)\n );\n if (allEnabledSelected) {\n const next = selectedItems.filter((o) => o.disabled);\n onSelect?.(undefined, next);\n } else {\n const disabledSelected = selectedItems.filter((o) => o.disabled);\n const next = [...disabledSelected, ...enabledOptions];\n onSelect?.(undefined, next);\n }\n populateInputField(\"\");\n };\n\n const handleAutocompleteSelect = (option: DropdownOption) => {\n if (option.id === SELECT_ALL_OPTION_ID) {\n handleSelectAll();\n return;\n }\n if (multiple) {\n const isAlreadySelected = selectedItems.some((o) => o.id === option.id);\n const next = isAlreadySelected\n ? selectedItems.filter((o) => o.id !== option.id)\n : [...selectedItems, option];\n onSelect?.(option, next);\n populateInputField(\"\");\n } else {\n onSelect?.(option, [option]);\n populateInputField(getOptionLabelText(option));\n }\n };\n\n const {\n rootRef,\n inputRef,\n inputProps,\n listboxProps,\n getListboxItemProps,\n isOpen,\n openListbox,\n anchorStyle,\n } = useAutocomplete({\n id: fieldId,\n // useAutocomplete only reads id/disabled, never label's value, so this is safe even though\n // DropdownOption.label can be a ReactNode instead of the string it's typed to require.\n options: optionsWithSelectAll as (DropdownOption & { label: string })[],\n listboxLabel: listboxLabel || label || \"Options\",\n selectedOption: (multiple ? undefined : selectedOption) as\n | (DropdownOption & { label: string })\n | undefined,\n disabled,\n readOnly,\n openOnFocus,\n listboxMaxHeight,\n highlightFirstOption,\n closeOnSelect: !multiple,\n noOptionsText,\n negative,\n onSelect: handleAutocompleteSelect,\n [\"data-testid\"]: dataTestId,\n });\n\n const setRootRef = (node: HTMLDivElement | null) => {\n (rootRef as React.RefObject<HTMLDivElement | null>).current = node;\n if (typeof ref === \"function\") ref(node);\n else if (ref) (ref as React.RefObject<HTMLDivElement | null>).current = node;\n };\n\n // For multi-select the hook doesn't know about selectedOptions, so inject\n // the correct `selected` state here based on selectedItems.\n const getListboxItemPropsWithSelection = (option: DropdownOption, index: number) => {\n const props = getListboxItemProps(option as DropdownOption & { label: string }, index);\n if (multiple) {\n const isSelected = selectedItems.some((o) => o.id === option.id);\n return { ...props, selected: isSelected, \"aria-selected\": isSelected };\n }\n return props;\n };\n\n const handleRemoveTag = (option: DropdownOption) => {\n const next = selectedItems.filter((o) => o.id !== option.id);\n onSelect?.(option, next);\n };\n\n const handleInputKeyDown = (event: React.KeyboardEvent<HTMLInputElement>) => {\n if (\n multiple &&\n event.key === \"Backspace\" &&\n event.currentTarget.value === \"\" &&\n selectedItems.length > 0\n ) {\n // Find the last non-disabled chip to remove; disabled chips cannot be removed.\n for (let i = selectedItems.length - 1; i >= 0; i--) {\n if (!selectedItems[i].disabled) {\n handleRemoveTag(selectedItems[i]);\n break;\n }\n }\n }\n (inputProps as React.InputHTMLAttributes<HTMLInputElement>)?.onKeyDown?.(event);\n };\n\n const handleInputChange: React.ChangeEventHandler<HTMLInputElement> = (e) => {\n populateInputField(e.target.value);\n if (!isOpen) {\n openListbox();\n }\n };\n\n const handleContainerClick: React.MouseEventHandler<HTMLDivElement> = (event) => {\n if (disabled || readOnly) return;\n\n const target = event.target as HTMLElement;\n // Ignore clicks on the input (it has its own mousedown handler) or chip dismiss buttons.\n if (\n target === (inputRef as React.RefObject<HTMLInputElement>).current ||\n target.closest(\"button\")\n ) {\n return;\n }\n\n const input = (inputRef as React.RefObject<HTMLInputElement>).current;\n input?.dispatchEvent(new MouseEvent(\"mousedown\", { bubbles: true }));\n input?.focus();\n };\n\n // True when every option (enabled and disabled) is currently selected and a\n // `selectAllLabel` is configured. In that case the field shows the label\n // text instead of a list of chips.\n const allEnabledSelected =\n multiple &&\n !!selectAllLabel &&\n options.length > 0 &&\n options.every((o) => selectedItems.some((s) => s.id === o.id));\n\n const wrapperClassName = cx(rootClassName, className, {\n [`${rootClassName}--negative`]: negative,\n });\n\n return (\n <div ref={setRootRef} className={wrapperClassName}>\n <DropdownLabel\n fieldId={fieldId}\n htmlForSuffix=\"input\"\n label={label}\n getTestId={getTestId}\n disabled={disabled}\n negative={negative}\n required={required}\n />\n <div className={cx(`${rootClassName}__field-row`)}>\n {/* disable eslint rules for this div since it is just visual container and the input inside is still accessible and has its own handlers.*/}\n {/* eslint-disable-next-line jsx-a11y/no-static-element-interactions, jsx-a11y/click-events-have-key-events */}\n <div\n className={cx(`${rootClassName}__combobox-container`, {\n [`${rootClassName}__combobox-container--error`]: !!errorText,\n [`${rootClassName}__combobox-container--is-valid`]: isValid,\n [`${rootClassName}__combobox-container--negative`]: negative,\n [`${rootClassName}__combobox-container--disabled`]: disabled,\n [`${rootClassName}__combobox-container--readonly`]: readOnly && !disabled,\n })}\n style={anchorStyle}\n onClick={handleContainerClick}\n >\n {multiple && !allEnabledSelected && (\n <DropdownTags\n selectedItems={selectedItems}\n getTestId={getTestId}\n disabled={disabled}\n negative={negative}\n onRemove={handleRemoveTag}\n moreOptionsText={moreOptionsText}\n removeOptionAriaLabel={removeOptionAriaLabel}\n />\n )}\n <input\n {...(inputProps as React.InputHTMLAttributes<HTMLInputElement>)}\n ref={inputRef as React.RefObject<HTMLInputElement>}\n id={`${fieldId}-input`}\n data-testid={getTestId(\"input\")}\n onKeyDown={handleInputKeyDown}\n onChange={handleInputChange}\n value={allEnabledSelected && !displayInputValue ? selectAllLabel : displayInputValue}\n placeholder={placeholder}\n className={cx(`${rootClassName}__input`, {\n [`${rootClassName}__input--negative`]: negative,\n })}\n aria-describedby={helperTextId}\n aria-invalid={!!errorText}\n disabled={disabled}\n readOnly={readOnly}\n />\n <DropdownEndAdornments\n getTestId={getTestId}\n loading={loading}\n disabled={disabled}\n negative={negative}\n isValid={isValid}\n isOpen={isOpen}\n showChevronOpen\n />\n <span\n className={cx(`${rootClassName}__frame`, {\n [`${rootClassName}__frame--negative`]: negative,\n })}\n />\n </div>\n </div>\n {isOpen && (\n <Listbox {...listboxProps} className={cx(`${rootClassName}__listbox`)}>\n {DropdownListboxItems({\n optionsToShow: optionsWithSelectAll,\n getListboxItemProps: getListboxItemPropsWithSelection,\n multiple,\n negative,\n fieldId,\n noOptionsText,\n selectAllLabel,\n selectedItems,\n })}\n </Listbox>\n )}\n <DropdownFooter\n errorText={errorText}\n helperText={helperText}\n helperTextId={helperTextId}\n negative={negative}\n />\n </div>\n );\n});\n\nDropdownCombobox.displayName = \"DropdownCombobox\";\n","import { useRef, useState } from \"react\";\n\nimport type { DropdownOption } from \"./dropdown.types\";\n\nexport type HighlightedOption = DropdownOption & { isSetByClickEvent?: boolean };\n\nexport type UseDropdownHighlightParams = {\n options: DropdownOption[];\n highlightFirstOption: boolean;\n};\n\nexport const useDropdownHighlight = ({\n options,\n highlightFirstOption,\n}: UseDropdownHighlightParams) => {\n const listboxRef = useRef<HTMLUListElement>(null);\n const optionRefs = useRef<Record<string, HTMLLIElement>>({});\n\n const [highlightedOption, setHighlightedOption] = useState<HighlightedOption | undefined>(\n highlightFirstOption ? options[0] : undefined\n );\n\n const scrollOptionIntoView = (optionEl: HTMLLIElement | undefined) => {\n if (optionEl) {\n const optionRect = optionEl.getBoundingClientRect();\n const listboxRect = listboxRef.current?.getBoundingClientRect() || { top: 0, bottom: 0 };\n const isOutside = optionRect.top < listboxRect.top || optionRect.bottom > listboxRect.bottom;\n if (isOutside) {\n optionEl.scrollIntoView({ block: \"nearest\" });\n }\n }\n };\n\n const findNextOption = (\n direction: \"ArrowUp\" | \"ArrowDown\",\n optionsToShow: DropdownOption[]\n ): DropdownOption | undefined => {\n const enabledList = optionsToShow.filter((o) => !o.disabled);\n if (!enabledList.length) return undefined;\n\n const currentIndex = highlightedOption\n ? enabledList.findIndex((o) => o.id === highlightedOption.id)\n : -1;\n\n if (direction === \"ArrowDown\") {\n return enabledList[(currentIndex + 1) % enabledList.length];\n }\n return enabledList[(currentIndex - 1 + enabledList.length) % enabledList.length];\n };\n\n const highlightOption = (option: DropdownOption | undefined) => {\n setHighlightedOption(option ? { ...option } : undefined);\n if (option) scrollOptionIntoView(optionRefs.current[option.id]);\n };\n\n const highlightByClick = (option: DropdownOption) => {\n if (option.id !== highlightedOption?.id) {\n setHighlightedOption({ ...option, isSetByClickEvent: true });\n }\n };\n\n const highlightSelected = (option: DropdownOption, eventType: \"CLICK\" | \"KEYBOARD\") => {\n requestAnimationFrame(() => {\n const isSetByClickEvent = eventType === \"CLICK\";\n setHighlightedOption({ ...option, isSetByClickEvent });\n scrollOptionIntoView(optionRefs.current[option.id]);\n });\n };\n\n const resetHighlight = () => {\n setHighlightedOption(undefined);\n };\n\n return {\n highlightedOption,\n listboxRef,\n optionRefs,\n findNextOption,\n highlightOption,\n highlightByClick,\n highlightSelected,\n resetHighlight,\n };\n};\n","import { useCallback, useEffect } from \"react\";\n\nexport const useOnClickOutside = (element: HTMLElement | null, callback: () => void) => {\n const handleClickOutside = useCallback(\n (event: MouseEvent) => {\n if (element && !element.contains(event.target as Node)) {\n callback();\n }\n },\n [callback, element]\n );\n\n useEffect(() => {\n document.addEventListener(\"mousedown\", handleClickOutside);\n return () => {\n document.removeEventListener(\"mousedown\", handleClickOutside);\n };\n }, [handleClickOutside]);\n};\n","import type { CSSProperties } from \"react\";\nimport { useCallback, useId, useRef, useState } from \"react\";\nimport type { ListboxItemProps, ListboxProps } from \"@purpur/listbox\";\n\nimport type { DropdownOption } from \"./dropdown.types\";\nimport { getOptionLabelText } from \"./dropdown.types\";\nimport { getFilteredOptions } from \"./useDropdownFilter\";\nimport { useDropdownHighlight } from \"./useDropdownHighlight\";\nimport { useDropdownInput } from \"./useDropdownInput\";\nimport { useOnClickOutside } from \"./useOnClickOutside\";\n\n// ── Hook params ────────────────────────────────────────────────────────\n\nexport type UseDropdownParams = {\n id: string;\n variant: \"select\" | \"combobox\";\n options: DropdownOption[];\n listboxLabel: string;\n multiple?: boolean;\n\n // Selection\n selectedOption?: DropdownOption;\n selectedOptions?: DropdownOption[];\n onSelect?: (toggledOption: DropdownOption | undefined, selectedOptions: DropdownOption[]) => void;\n\n // Combobox-specific\n filterOption?: (inputValue: string | undefined, option: DropdownOption) => boolean;\n inputValue?: string;\n defaultInputValue?: string;\n onInputChange?: (value: string) => void;\n noOptionsText?: React.ReactNode;\n highlightFirstOption?: boolean;\n\n // Shared behaviour\n negative: boolean;\n openOnFocus?: boolean;\n listboxMaxHeight?: string | number;\n disabled?: boolean;\n readOnly?: boolean;\n\n [\"data-testid\"]?: string;\n};\n\n// ── Return type ────────────────────────────────────────────────────────\n\nexport type UseDropdownReturn = {\n rootRef: React.RefObject<HTMLDivElement | null>;\n triggerContainerProps: Record<string, unknown> | null;\n triggerProps: Record<string, unknown>;\n inputProps: Record<string, unknown> | null;\n listboxProps: ListboxProps;\n getListboxItemProps: (option: DropdownOption, index: number) => ListboxItemProps;\n optionsToShow: DropdownOption[];\n isOpen: boolean;\n highlightedOption: DropdownOption | undefined;\n selectedItems: DropdownOption[];\n anchorStyle: CSSProperties;\n};\n\n// ── Hook ───────────────────────────────────────────────────────────────\n\nexport const useDropdown = ({\n id,\n variant,\n options,\n listboxLabel,\n multiple = false,\n selectedOption,\n selectedOptions = [],\n onSelect,\n filterOption,\n inputValue: controlledInputValue,\n defaultInputValue,\n onInputChange,\n noOptionsText,\n highlightFirstOption = false,\n openOnFocus = false,\n listboxMaxHeight,\n negative,\n disabled = false,\n readOnly = false,\n [\"data-testid\"]: dataTestId,\n}: UseDropdownParams): UseDropdownReturn => {\n const isCombobox = variant === \"combobox\";\n const uniqueId = useId();\n\n // ── Refs ─────────────────────────────────────────────────────────────\n const rootRef = useRef<HTMLDivElement | null>(null);\n const triggerRef = useRef<HTMLButtonElement | null>(null);\n const inputRef = useRef<HTMLInputElement | null>(null);\n\n // ── Sub-hooks ────────────────────────────────────────────────────────\n const highlight = useDropdownHighlight({ options, highlightFirstOption });\n const { displayInputValue, populateInputField } = useDropdownInput({\n controlledInputValue,\n defaultInputValue,\n selectedOption,\n onInputChange,\n });\n\n // ── Open / close ────────────────────────────────────────────────────\n const [isOpen, setIsOpen] = useState(false);\n\n const closeListbox = () => {\n setIsOpen(false);\n highlight.resetHighlight();\n };\n\n useOnClickOutside(rootRef.current, closeListbox);\n\n const openListbox = ({ eventType }: { eventType: \"CLICK\" | \"KEYBOARD\" }) => {\n setIsOpen(true);\n const current = multiple ? undefined : selectedOption;\n if (current) {\n highlight.highlightSelected(current, eventType);\n }\n };\n\n // ── Derived state ───────────────────────────────────────────────────\n const resolvedSelected = multiple ? selectedOptions : selectedOption ? [selectedOption] : [];\n\n const optionsToShow = isCombobox\n ? getFilteredOptions({\n options,\n searchTerm: displayInputValue,\n filterOption,\n selectedOption,\n multiple,\n })\n : options;\n\n const showListbox = isOpen && (!!optionsToShow.length || !!noOptionsText);\n\n // ── Helpers ──────────────────────────────────────────────────────────\n const getTestId = (name: string) => (dataTestId ? `${dataTestId}-${name}` : undefined);\n\n // ── Selection ────────────────────────────────────────────────────────\n const selectOption = (option: DropdownOption | undefined) => {\n if (!option || option.disabled) return;\n\n if (multiple) {\n const isAlreadySelected = resolvedSelected.some((o) => o.id === option.id);\n const next = isAlreadySelected\n ? resolvedSelected.filter((o) => o.id !== option.id)\n : [...resolvedSelected, option];\n onSelect?.(option, next);\n if (isCombobox) {\n populateInputField(\"\");\n inputRef.current?.focus();\n }\n } else {\n onSelect?.(option, [option]);\n if (isCombobox) {\n populateInputField(getOptionLabelText(option));\n }\n closeListbox();\n (isCombobox ? inputRef : triggerRef).current?.focus();\n }\n };\n\n // ── Navigation ───────────────────────────────────────────────────────\n const highlightNextOption = (direction: \"ArrowUp\" | \"ArrowDown\") => {\n if (!showListbox) openListbox({ eventType: \"KEYBOARD\" });\n const next = highlight.findNextOption(direction, optionsToShow);\n highlight.highlightOption(next);\n };\n\n // ── Keyboard ─────────────────────────────────────────────────────────\n const handleKeyDown = (event: React.KeyboardEvent) => {\n if (disabled || readOnly) return;\n\n switch (event.key) {\n case \"ArrowUp\":\n case \"ArrowDown\":\n event.preventDefault();\n highlightNextOption(event.key);\n break;\n case \"Enter\": {\n event.preventDefault();\n if (showListbox && highlight.highlightedOption) {\n selectOption(highlight.highlightedOption);\n } else if (!showListbox) {\n openListbox({ eventType: \"KEYBOARD\" });\n }\n break;\n }\n case \" \": {\n if (!isCombobox) {\n event.preventDefault();\n if (showListbox && highlight.highlightedOption) {\n selectOption(highlight.highlightedOption);\n } else if (!showListbox) {\n openListbox({ eventType: \"KEYBOARD\" });\n }\n }\n break;\n }\n case \"Escape\":\n event.preventDefault();\n closeListbox();\n break;\n case \"Tab\":\n closeListbox();\n break;\n case \"Home\":\n case \"End\":\n if (isCombobox) closeListbox();\n break;\n }\n };\n\n // ── Combobox input handlers ─────────────────────────────────────────\n const handleInputChange: React.ChangeEventHandler<HTMLInputElement> = (e) => {\n populateInputField(e.target.value);\n highlight.resetHighlight();\n if (!isOpen) openListbox({ eventType: \"KEYBOARD\" });\n };\n\n const handleInputMouseDown = () => {\n if (disabled || readOnly) return;\n isOpen ? closeListbox() : openListbox({ eventType: \"CLICK\" });\n };\n\n const handleInputFocus = () => {\n if (!isOpen && openOnFocus && !disabled && !readOnly) {\n openListbox({ eventType: \"KEYBOARD\" });\n }\n inputRef.current?.select();\n };\n\n const handleInputBlur = () => {\n setTimeout(() => {\n const activeEl = document.activeElement;\n // Only close when focus has moved to a real element outside the dropdown.\n // Guarding against document.body prevents a false-positive close when a\n // screen reader navigates with its virtual cursor: the input blurs but no\n // DOM element receives physical focus (activeElement falls back to body).\n if (\n activeEl !== document.body &&\n !inputRef.current?.contains(activeEl) &&\n !highlight.listboxRef.current?.contains(activeEl) &&\n !rootRef.current?.contains(activeEl)\n ) {\n closeListbox();\n if (isCombobox && !multiple) {\n populateInputField(selectedOption ? getOptionLabelText(selectedOption) : \"\");\n }\n }\n });\n };\n\n // ── Select trigger handlers ─────────────────────────────────────────\n const handleTriggerClick = () => {\n if (disabled || readOnly) return;\n isOpen ? closeListbox() : openListbox({ eventType: \"CLICK\" });\n };\n\n const handleTriggerContainerClick: React.MouseEventHandler<HTMLDivElement> = (event) => {\n if (disabled || readOnly) return;\n\n const clickedButton = (event.target as HTMLElement).closest(\"button\");\n if (clickedButton && clickedButton !== triggerRef.current) {\n return;\n }\n\n handleTriggerClick();\n };\n\n const handleTriggerFocus = () => {\n if (!isOpen && openOnFocus && !disabled && !readOnly) {\n openListbox({ eventType: \"KEYBOARD\" });\n }\n };\n\n // ── Build props ──────────────────────────────────────────────────────\n const listboxId = `${id}-listbox`;\n const createListboxItemId = (option: DropdownOption) => `${id}-listbox-item-${option.id}`;\n const anchorName = `--purpur-dropdown-${uniqueId.replace(/:/g, \"\")}`;\n const anchorStyle = { anchorName } as CSSProperties;\n const triggerContainerProps: Record<string, unknown> | null = isCombobox\n ? null\n : {\n onClick: handleTriggerContainerClick,\n };\n\n // ── Popover sync ────────────────────────────────────────────────────\n const listboxCallbackRef = useCallback(\n (node: HTMLUListElement | null) => {\n (highlight.listboxRef as React.MutableRefObject<HTMLUListElement | null>).current = node;\n if (node && typeof node.showPopover === \"function\") {\n try {\n node.showPopover();\n } catch {\n // Popover not supported or already open\n }\n }\n },\n [highlight.listboxRef]\n );\n\n const listboxProps = {\n \"aria-label\": listboxLabel,\n \"aria-expanded\": showListbox,\n \"data-testid\": getTestId(\"listbox\"),\n id: listboxId,\n ref: listboxCallbackRef,\n onMouseLeave: () => highlight.resetHighlight(),\n popover: \"manual\",\n negative,\n style: {\n ...(listboxMaxHeight\n ? {\n maxHeight:\n typeof listboxMaxHeight === \"number\" ? `${listboxMaxHeight}px` : listboxMaxHeight,\n }\n : {}),\n positionAnchor: anchorName,\n } as CSSProperties,\n } as ListboxProps;\n\n const getListboxItemProps = (option: DropdownOption, index: number): ListboxItemProps => {\n const isSelected = resolvedSelected.some((o) => o.id === option.id);\n const { highlightedOption } = highlight;\n\n const highlighted =\n (option.id === highlightedOption?.id ||\n (highlightFirstOption && !highlightedOption && index === 0)) &&\n !highlightedOption?.isSetByClickEvent;\n\n return {\n \"data-testid\": getTestId(`listbox-item-${option.id}`),\n id: createListboxItemId(option),\n key: option.id,\n onMouseMove: () => highlight.highlightByClick(option),\n onMouseUp: () => selectOption(option),\n ref: (el) => {\n if (el) highlight.optionRefs.current[option.id] = el;\n },\n tabIndex: -1,\n selected: isSelected,\n disabled: option.disabled,\n highlighted,\n hovered: option.id === highlightedOption?.id && !!highlightedOption?.isSetByClickEvent,\n \"aria-selected\": isSelected,\n };\n };\n\n const triggerProps: Record<string, unknown> = isCombobox\n ? {}\n : {\n ref: triggerRef,\n type: \"button\" as const,\n role: \"combobox\",\n \"aria-haspopup\": \"listbox\",\n \"aria-expanded\": showListbox,\n \"aria-controls\": listboxId,\n \"aria-disabled\": disabled,\n \"data-testid\": getTestId(\"trigger\"),\n id: `${id}-trigger`,\n onKeyDown: handleKeyDown,\n onFocus: handleTriggerFocus,\n disabled,\n tabIndex: disabled ? -1 : 0,\n style: anchorStyle,\n };\n\n const inputProps: Record<string, unknown> | null = isCombobox\n ? {\n ref: inputRef,\n role: \"combobox\",\n \"aria-autocomplete\": \"list\" as const,\n \"aria-expanded\": showListbox,\n \"aria-controls\": listboxId,\n \"aria-activedescendant\": highlight.highlightedOption\n ? createListboxItemId(highlight.highlightedOption)\n : undefined,\n \"data-testid\": getTestId(\"input\"),\n autoComplete: \"off\",\n id: `${id}-input`,\n type: \"text\",\n value: displayInputValue,\n onChange: handleInputChange,\n onMouseDown: handleInputMouseDown,\n onFocus: handleInputFocus,\n onBlur: handleInputBlur,\n onKeyDown: handleKeyDown,\n disabled,\n readOnly,\n }\n : null;\n\n return {\n rootRef,\n triggerContainerProps,\n triggerProps,\n inputProps,\n listboxProps,\n getListboxItemProps,\n optionsToShow,\n isOpen: showListbox,\n highlightedOption: highlight.highlightedOption,\n selectedItems: resolvedSelected,\n anchorStyle,\n };\n};\n","import React, { forwardRef, useId } from \"react\";\nimport { Listbox } from \"@purpur/listbox\";\n\nimport type { DropdownOption, DropdownSelectProps } from \"./dropdown.types\";\nimport {\n cx,\n DropdownEndAdornments,\n DropdownFooter,\n DropdownLabel,\n DropdownListboxItems,\n DropdownTags,\n rootClassName,\n SELECT_ALL_OPTION_ID,\n shouldShowSelectAll,\n} from \"./dropdown-shared\";\nimport { useDropdown } from \"./useDropdown\";\n\nexport const DropdownSelect = forwardRef<HTMLDivElement, DropdownSelectProps>((props, ref) => {\n const {\n id: propId,\n label,\n options,\n className,\n errorText,\n helperText,\n placeholder,\n negative = false,\n readOnly = false,\n disabled = false,\n required = false,\n valid = false,\n loading = false,\n multiple = false,\n selectedOption,\n selectedOptions = [],\n onSelect,\n openOnFocus = false,\n listboxMaxHeight,\n listboxLabel,\n selectAllLabel,\n moreOptionsText,\n removeOptionAriaLabel,\n [\"data-testid\"]: dataTestId,\n } = props;\n\n const randomId = useId();\n const fieldId = propId ?? randomId;\n const getTestId = (name: string) => (dataTestId ? `${dataTestId}-${name}` : undefined);\n const isValid = !!valid && !errorText;\n const helperTextId = `${fieldId}-helper-text`;\n\n // Resolve selected items up-front so we can decide whether to show the\n // virtual \"Select all\" option.\n const resolvedSelectedItems = multiple ? selectedOptions : selectedOption ? [selectedOption] : [];\n\n const showSelectAll = shouldShowSelectAll({\n selectAllLabel,\n multiple,\n options,\n selectedItems: resolvedSelectedItems,\n });\n\n const handleSelectAll = () => {\n const enabledOptions = options.filter((o) => !o.disabled);\n const allEnabledSelected = enabledOptions.every((o) =>\n resolvedSelectedItems.some((s) => s.id === o.id)\n );\n if (allEnabledSelected) {\n // Deselect all enabled options, keep disabled+selected as-is\n const next = resolvedSelectedItems.filter((o) => o.disabled);\n onSelect?.(undefined, next);\n } else {\n // Select all enabled, keep disabled+selected as-is\n const disabledSelected = resolvedSelectedItems.filter((o) => o.disabled);\n const next = [...disabledSelected, ...enabledOptions];\n onSelect?.(undefined, next);\n }\n };\n\n // Intercept selection of the virtual \"Select all\" option routed through the\n // hook's keyboard/mouse handlers and redirect to the dedicated handler.\n const handleHookSelect = (\n toggledOption: DropdownOption | undefined,\n nextSelected: DropdownOption[]\n ) => {\n if (toggledOption?.id === SELECT_ALL_OPTION_ID) {\n handleSelectAll();\n return;\n }\n onSelect?.(toggledOption, nextSelected);\n };\n\n const hookOptions = showSelectAll\n ? [{ id: SELECT_ALL_OPTION_ID, label: selectAllLabel as string }, ...options]\n : options;\n\n const dropdown = useDropdown({\n id: fieldId,\n variant: \"select\",\n options: hookOptions,\n listboxLabel: listboxLabel || label || \"Options\",\n multiple,\n negative,\n selectedOption,\n selectedOptions,\n onSelect: handleHookSelect,\n openOnFocus,\n listboxMaxHeight,\n disabled,\n readOnly,\n [\"data-testid\"]: dataTestId,\n });\n\n const setRootRef = (node: HTMLDivElement | null) => {\n (dropdown.rootRef as React.RefObject<HTMLDivElement | null>).current = node;\n if (typeof ref === \"function\") ref(node);\n else if (ref) (ref as React.RefObject<HTMLDivElement | null>).current = node;\n };\n\n const {\n triggerContainerProps,\n triggerProps,\n listboxProps,\n getListboxItemProps,\n optionsToShow,\n isOpen,\n selectedItems,\n anchorStyle,\n } = dropdown;\n\n const triggerButtonProps = {\n ...(triggerProps as React.ButtonHTMLAttributes<HTMLButtonElement>),\n };\n delete triggerButtonProps.style;\n\n const handleRemoveTag = (option: DropdownOption) => {\n const next = selectedItems.filter((o) => o.id !== option.id);\n onSelect?.(option, next);\n };\n\n // True when every option (enabled and disabled) is currently selected and a\n // `selectAllLabel` is configured. In that case the field shows the label\n // text instead of a list of chips.\n const allEnabledSelected =\n multiple &&\n !!selectAllLabel &&\n options.length > 0 &&\n options.every((o) => selectedItems.some((s) => s.id === o.id));\n\n const displayLabel = multiple\n ? allEnabledSelected\n ? selectAllLabel\n : selectedItems.length === 0\n ? placeholder || \"\"\n : \"\"\n : selectedOption?.label || placeholder || \"\";\n\n const wrapperClassName = cx(rootClassName, className, {\n [`${rootClassName}--negative`]: negative,\n });\n\n return (\n <div ref={setRootRef} className={wrapperClassName}>\n <DropdownLabel\n fieldId={fieldId}\n htmlForSuffix=\"trigger\"\n label={label}\n getTestId={getTestId}\n disabled={disabled}\n negative={negative}\n required={required}\n />\n <div className={cx(`${rootClassName}__field-row`)}>\n <div\n {...(triggerContainerProps as React.HTMLAttributes<HTMLDivElement>)}\n className={cx(`${rootClassName}__trigger-container`, {\n [`${rootClassName}__trigger-container--error`]: !!errorText,\n [`${rootClassName}__trigger-container--is-valid`]: isValid,\n [`${rootClassName}__trigger-container--negative`]: negative,\n [`${rootClassName}__trigger-container--disabled`]: disabled,\n [`${rootClassName}__trigger-container--readonly`]: readOnly && !disabled,\n [`${rootClassName}__trigger-container--has-tags`]:\n multiple && selectedItems.length > 0 && !allEnabledSelected,\n })}\n style={anchorStyle}\n >\n {multiple && !allEnabledSelected && (\n <DropdownTags\n selectedItems={selectedItems}\n getTestId={getTestId}\n disabled={disabled}\n negative={negative}\n onRemove={handleRemoveTag}\n moreOptionsText={moreOptionsText}\n removeOptionAriaLabel={removeOptionAriaLabel}\n isSelect\n />\n )}\n <button\n {...triggerButtonProps}\n className={cx(`${rootClassName}__trigger`, {\n [`${rootClassName}__trigger--is-valid`]: isValid,\n [`${rootClassName}__trigger--negative`]: negative,\n [`${rootClassName}__trigger--disabled`]: disabled,\n [`${rootClassName}__trigger--readonly`]: readOnly && !disabled,\n [`${rootClassName}__trigger--placeholder`]: !selectedItems.length,\n })}\n aria-describedby={helperTextId}\n >\n <span className={cx(`${rootClassName}__trigger-text`)}>{displayLabel}</span>\n </button>\n <DropdownEndAdornments\n getTestId={getTestId}\n loading={loading}\n disabled={disabled}\n negative={negative}\n isValid={isValid}\n isOpen={isOpen}\n readOnly={readOnly}\n showChevronOpen\n />\n <span\n className={cx(`${rootClassName}__frame`, {\n [`${rootClassName}__frame--negative`]: negative,\n })}\n />\n </div>\n </div>\n {isOpen && (\n <Listbox {...listboxProps} className={cx(`${rootClassName}__listbox`)}>\n {DropdownListboxItems({\n optionsToShow,\n getListboxItemProps,\n multiple,\n negative,\n fieldId,\n selectAllLabel,\n selectedItems,\n })}\n </Listbox>\n )}\n <DropdownFooter\n errorText={errorText}\n helperText={helperText}\n helperTextId={helperTextId}\n negative={negative}\n />\n </div>\n );\n});\n\nDropdownSelect.displayName = \"DropdownSelect\";\n","import React, { forwardRef } from \"react\";\n\nimport type { DropdownComboboxProps, DropdownProps, DropdownSelectProps } from \"./dropdown.types\";\nimport { DropdownCombobox } from \"./dropdown-combobox\";\nimport { DropdownSelect } from \"./dropdown-select\";\n\nexport const Dropdown = forwardRef<HTMLDivElement, DropdownProps>((props, ref) => {\n if (props.combobox) {\n return <DropdownCombobox ref={ref} {...(props as DropdownComboboxProps)} />;\n }\n\n return <DropdownSelect ref={ref} {...(props as DropdownSelectProps)} />;\n});\n\nDropdown.displayName = \"Dropdown\";\n\nexport type {\n DropdownComboboxProps,\n DropdownOption,\n DropdownProps,\n DropdownSelectProps,\n} from \"./dropdown.types\";\nexport { useDropdown } from \"./useDropdown\";\n"],"names":["getOptionLabelText","option","cx","c","styles","rootClassName","DropdownLabel","fieldId","htmlForSuffix","label","getTestId","disabled","negative","required","jsxs","Label","jsx","DropdownEndAdornments","loading","isValid","isOpen","readOnly","showChevronOpen","Spinner","Fragment","IconCheckCircleFilled","IconChevronDown","MAX_VISIBLE_TAGS","DropdownTags","selectedItems","onRemove","isSelect","moreOptionsText","removeOptionAriaLabel","visibleItems","hiddenCount","DismissableChipGroup","item","DropdownFooter","errorText","helperText","helperTextId","FieldErrorText","FieldHelperText","SELECT_ALL_OPTION_ID","shouldShowSelectAll","selectAllLabel","multiple","options","o","s","DropdownListboxItems","optionsToShow","getListboxItemProps","noOptionsText","Listbox","hasSelectAll","selectAllCheckedState","enabledOptions","enabledSelectedCount","allEnabledSelected","someSelected","index","key","selected","itemProps","Checkbox","filterOptions","searchTerm","filterOption","chunks","chunk","getFilteredOptions","selectedOption","useDropdownInput","controlledInputValue","defaultInputValue","onInputChange","internalInputValue","setInternalInputValue","useState","value","DropdownCombobox","forwardRef","props","ref","propId","className","placeholder","valid","selectedOptions","onSelect","openOnFocus","listboxMaxHeight","listboxLabel","inputValue","highlightFirstOption","dataTestId","randomId","useId","name","displayInputValue","populateInputField","showSelectAll","optionsWithSelectAll","handleSelectAll","next","handleAutocompleteSelect","rootRef","inputRef","inputProps","listboxProps","openListbox","anchorStyle","useAutocomplete","setRootRef","node","getListboxItemPropsWithSelection","isSelected","handleRemoveTag","handleInputKeyDown","event","i","handleInputChange","e","handleContainerClick","target","input","wrapperClassName","useDropdownHighlight","listboxRef","useRef","optionRefs","highlightedOption","setHighlightedOption","scrollOptionIntoView","optionEl","optionRect","listboxRect","direction","enabledList","currentIndex","eventType","useOnClickOutside","element","callback","handleClickOutside","useCallback","useEffect","useDropdown","id","variant","isCombobox","uniqueId","triggerRef","highlight","setIsOpen","closeListbox","current","resolvedSelected","showListbox","selectOption","highlightNextOption","handleKeyDown","handleInputMouseDown","handleInputFocus","handleInputBlur","activeEl","handleTriggerClick","handleTriggerContainerClick","clickedButton","handleTriggerFocus","listboxId","createListboxItemId","anchorName","triggerContainerProps","listboxCallbackRef","highlighted","el","triggerProps","DropdownSelect","resolvedSelectedItems","handleHookSelect","toggledOption","nextSelected","hookOptions","dropdown","triggerButtonProps","displayLabel","Dropdown"],"mappings":"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"}
1
+ {"version":3,"file":"dropdown-Bn7WvsL2.js","sources":["../../../components/dropdown/src/dropdown.types.ts","../../../components/dropdown/src/dropdown-shared.tsx","../../../components/dropdown/src/useDropdownFilter.ts","../../../components/dropdown/src/useDropdownInput.ts","../../../components/dropdown/src/dropdown-combobox.tsx","../../../components/dropdown/src/useDropdownHighlight.ts","../../../components/dropdown/src/useOnClickOutside.ts","../../../components/dropdown/src/useDropdown.ts","../../../components/dropdown/src/dropdown-select.tsx","../../../components/dropdown/src/dropdown.tsx"],"sourcesContent":["export type DropdownOption = {\n /**\n * Content rendered for this option in the trigger and listbox. Accepts any `ReactNode`.\n * For `combobox` mode, text-input syncing and the default search filter require a plain\n * `string` — non-string labels fall back to `value` for those, so provide `value`\n * (or a custom `filterOption`) when using a non-string label with `combobox`.\n */\n label: React.ReactNode;\n id: string;\n value?: string;\n disabled?: boolean;\n};\n\n/** Plain-text form of an option's label, for text inputs, search filtering, and ARIA strings. */\nexport const getOptionLabelText = (option: Pick<DropdownOption, \"label\" | \"value\">): string =>\n typeof option.label === \"string\" ? option.label : option.value ?? \"\";\n\n/** Shared props across all variants */\ntype DropdownBaseProps = {\n /** Unique id used to prefix all sub-element ids. */\n id?: string;\n /** Visible label rendered above the field. */\n label?: string;\n /** Accessible label for the listbox popup (required for select/combobox). */\n listboxLabel?: string;\n /** Placeholder text shown when no value is selected. */\n placeholder?: string;\n /** Helper text rendered below the field. */\n helperText?: string;\n /** Error text rendered below the field. Puts the field in an error state. */\n errorText?: string;\n /** Render the field with a valid (success) appearance. */\n valid?: boolean;\n /** Show a loading spinner inside the field. */\n loading?: boolean;\n /** Render on dark backgrounds. */\n negative?: boolean;\n /** Mark the field as required. */\n required?: boolean;\n /** Disable the field. */\n disabled?: boolean;\n /** Make the field read-only. */\n readOnly?: boolean;\n /**\n * Label for the \"Select all\" option. Only effective when `multiple` is `true`.\n * The option is hidden automatically when any disabled option is **not** selected.\n */\n selectAllLabel?: string;\n /** Text appended after the hidden chip count (e.g. `\"+4 more\"`). Only effective when `multiple` is `true`. */\n moreOptionsText?: string;\n className?: string;\n [\"data-testid\"]?: string;\n};\n\n// ── Multi-select variant (moreOptionsText required) ──────────────────\n\ntype DropdownMultipleProps = DropdownBaseProps & {\n multiple: true;\n moreOptionsText: string;\n /** The accessible label for each chip's remove button. */\n removeOptionAriaLabel: string;\n};\n\n// ── Single-select variant (moreOptionsText optional) ─────────────────\n\ntype DropdownSingleProps = DropdownBaseProps & {\n multiple?: false | undefined;\n moreOptionsText?: string;\n removeOptionAriaLabel?: never;\n};\n\n// ── Shared props for select variant ──────────────────────────────────\n\ntype DropdownSelectSharedProps = {\n combobox?: false;\n options: DropdownOption[];\n /** Currently selected option (single-select, controlled). */\n selectedOption?: DropdownOption;\n /** Currently selected options (multi-select, controlled). */\n selectedOptions?: DropdownOption[];\n /** Fired when an option is selected or deselected. */\n onSelect?: (toggledOption: DropdownOption | undefined, selectedOptions: DropdownOption[]) => void;\n /** Open the listbox when the trigger receives focus. */\n openOnFocus?: boolean;\n /** Maximum height of the listbox popup. */\n listboxMaxHeight?: string | number;\n filterOption?: never;\n onInputChange?: never;\n inputValue?: never;\n defaultInputValue?: never;\n noOptionsText?: never;\n highlightFirstOption?: never;\n};\n\n// ── Shared props for combobox variant ────────────────────────────────\n\ntype DropdownComboboxSharedProps = {\n combobox: true;\n options: DropdownOption[];\n /** Currently selected option (single-select, controlled). */\n selectedOption?: DropdownOption;\n /** Currently selected options (multi-select, controlled). */\n selectedOptions?: DropdownOption[];\n /** Fired when an option is selected or deselected. */\n onSelect?: (toggledOption: DropdownOption | undefined, selectedOptions: DropdownOption[]) => void;\n /** Custom filter for autocomplete results. */\n filterOption?: (inputValue: string | undefined, option: DropdownOption) => boolean;\n /** Controlled input value. */\n inputValue?: string;\n /** Default input value (uncontrolled). */\n defaultInputValue?: string;\n /** Fired when the text-input value changes. */\n onInputChange?: (value: string) => void;\n /** Text shown when filtering yields no results. */\n noOptionsText?: React.ReactNode;\n /** Highlight the first option automatically. */\n highlightFirstOption?: boolean;\n /** Open the listbox when the input receives focus. */\n openOnFocus?: boolean;\n /** Maximum height of the listbox popup. */\n listboxMaxHeight?: string | number;\n};\n\n// ── Custom select (single & multi) ────────────────────────────────────\n\nexport type DropdownSelectProps =\n | (DropdownMultipleProps & DropdownSelectSharedProps)\n | (DropdownSingleProps & DropdownSelectSharedProps);\n\n// ── Combobox / autocomplete ──────────────────────────────────────────\n\nexport type DropdownComboboxProps =\n | (DropdownMultipleProps & DropdownComboboxSharedProps)\n | (DropdownSingleProps & DropdownComboboxSharedProps);\n\nexport type DropdownProps = DropdownSelectProps | DropdownComboboxProps;\n","import React from \"react\";\nimport type { CheckedState } from \"@purpur/checkbox\";\nimport { Checkbox } from \"@purpur/checkbox\";\nimport { DismissableChipGroup } from \"@purpur/dismissable-chip-group\";\nimport { FieldErrorText } from \"@purpur/field-error-text\";\nimport { FieldHelperText } from \"@purpur/field-helper-text\";\nimport { IconCheckCircleFilled } from \"@purpur/icon/check-circle-filled\";\nimport { IconChevronDown } from \"@purpur/icon/chevron-down\";\nimport { Label } from \"@purpur/label\";\nimport { Listbox } from \"@purpur/listbox\";\nimport { Spinner } from \"@purpur/spinner\";\nimport c from \"classnames/bind\";\n\nimport styles from \"./dropdown.module.scss\";\nimport type { DropdownOption } from \"./dropdown.types\";\nimport { getOptionLabelText } from \"./dropdown.types\";\n\nconst cx = c.bind(styles);\nexport const rootClassName = \"purpur-dropdown\";\n\ntype GetTestId = (name: string) => string | undefined;\n\ntype DropdownLabelProps = {\n fieldId: string;\n htmlForSuffix?: string;\n label?: string;\n getTestId: GetTestId;\n disabled: boolean;\n negative: boolean;\n required: boolean;\n};\n\nexport const DropdownLabel = ({\n fieldId,\n htmlForSuffix,\n label,\n getTestId,\n disabled,\n negative,\n required,\n}: DropdownLabelProps) => {\n if (!label) return null;\n\n return (\n <Label\n htmlFor={htmlForSuffix ? `${fieldId}-${htmlForSuffix}` : fieldId}\n className={cx(`${rootClassName}__label`)}\n data-testid={getTestId(\"label\")}\n disabled={disabled}\n negative={negative}\n >\n {required && <span aria-hidden>*</span>}\n {label}\n </Label>\n );\n};\n\ntype DropdownEndAdornmentsProps = {\n getTestId: GetTestId;\n loading?: boolean;\n disabled: boolean;\n negative: boolean;\n isValid: boolean;\n isOpen?: boolean;\n readOnly?: boolean;\n showChevronOpen: boolean;\n};\n\nexport const DropdownEndAdornments = ({\n getTestId,\n loading,\n disabled,\n negative,\n isValid,\n isOpen,\n readOnly,\n showChevronOpen,\n}: DropdownEndAdornmentsProps) => (\n <span className={cx(`${rootClassName}__end-adornments`)}>\n {loading ? (\n <Spinner\n disabled={disabled}\n size=\"xxs\"\n negative={negative}\n data-testid={getTestId(\"spinner\")}\n />\n ) : (\n <>\n {isValid && (\n <IconCheckCircleFilled\n data-testid={getTestId(\"valid-icon\")}\n className={cx(`${rootClassName}__valid-icon`)}\n />\n )}\n <IconChevronDown\n className={cx(`${rootClassName}__chevron-icon`, {\n [`${rootClassName}__chevron-icon--open`]: showChevronOpen && isOpen,\n [`${rootClassName}__chevron-icon--disabled`]: disabled,\n [`${rootClassName}__chevron-icon--readonly`]: readOnly && !disabled,\n [`${rootClassName}__chevron-icon--is-valid`]: isValid,\n [`${rootClassName}__chevron-icon--negative`]: negative,\n })}\n data-testid={getTestId(\"dropdown-icon\")}\n size=\"sm\"\n />\n </>\n )}\n </span>\n);\n\nconst MAX_VISIBLE_TAGS = 6;\n\ntype DropdownTagsProps = {\n selectedItems: DropdownOption[];\n getTestId: GetTestId;\n disabled: boolean;\n negative: boolean;\n onRemove: (option: DropdownOption) => void;\n isSelect?: boolean;\n moreOptionsText?: string;\n removeOptionAriaLabel?: string;\n};\n\nexport const DropdownTags = ({\n selectedItems,\n getTestId,\n disabled,\n negative,\n onRemove,\n isSelect,\n moreOptionsText,\n removeOptionAriaLabel,\n}: DropdownTagsProps) => {\n if (!selectedItems.length) return null;\n\n const capEnabled = moreOptionsText !== undefined && selectedItems.length > MAX_VISIBLE_TAGS;\n const visibleItems = capEnabled ? selectedItems.slice(-MAX_VISIBLE_TAGS) : selectedItems;\n const hiddenCount = selectedItems.length - visibleItems.length;\n\n return (\n <DismissableChipGroup\n className={cx(`${rootClassName}__chip-group`, {\n [`${rootClassName}__chip-group--select`]: isSelect,\n })}\n negative={negative}\n data-testid={getTestId(\"tags\")}\n size=\"sm\"\n >\n {visibleItems.map((item) => (\n <DismissableChipGroup.Item\n key={item.id}\n id={item.id}\n data-testid={getTestId(`tag-${item.id}`)}\n aria-label={\n removeOptionAriaLabel\n ? `${removeOptionAriaLabel} ${getOptionLabelText(item)}`\n : getOptionLabelText(item)\n }\n onDismiss={() => {\n onRemove(item);\n }}\n disabled={disabled || item.disabled}\n >\n {item.label}\n </DismissableChipGroup.Item>\n ))}\n {hiddenCount > 0 && (\n <li\n className={cx(`${rootClassName}__chip-group-more`)}\n data-testid={getTestId(\"tags-more\")}\n >\n {`+${hiddenCount} ${moreOptionsText}`}\n </li>\n )}\n </DismissableChipGroup>\n );\n};\n\ntype DropdownFooterProps = {\n errorText?: string;\n helperText?: string;\n helperTextId: string;\n negative: boolean;\n};\n\nexport const DropdownFooter = ({\n errorText,\n helperText,\n helperTextId,\n negative,\n}: DropdownFooterProps) => (\n <>\n {errorText && <FieldErrorText negative={negative}>{errorText}</FieldErrorText>}\n {helperText && !errorText && (\n <FieldHelperText id={helperTextId} negative={negative}>\n {helperText}\n </FieldHelperText>\n )}\n </>\n);\n\nexport const SELECT_ALL_OPTION_ID = \"__purpur-dropdown-select-all__\";\n\ntype ShouldShowSelectAllArgs = {\n selectAllLabel?: string;\n multiple?: boolean;\n options: DropdownOption[];\n selectedItems: DropdownOption[];\n};\n\nexport const shouldShowSelectAll = ({\n selectAllLabel,\n multiple,\n options,\n selectedItems,\n}: ShouldShowSelectAllArgs): boolean => {\n if (!selectAllLabel || !multiple) return false;\n const enabledOptions = options.filter((o) => !o.disabled);\n if (enabledOptions.length === 0) return false;\n const disabledOptions = options.filter((o) => o.disabled);\n const hasDisabledUnselected = disabledOptions.some(\n (o) => !selectedItems.some((s) => s.id === o.id)\n );\n // Hide \"All\" when a disabled option is not selected (can't select everything)\n return !hasDisabledUnselected;\n};\n\ntype DropdownListboxItemsProps = {\n optionsToShow: DropdownOption[];\n getListboxItemProps: (option: DropdownOption, index: number) => Record<string, unknown>;\n multiple?: boolean;\n negative: boolean;\n fieldId: string;\n noOptionsText?: React.ReactNode;\n selectAllLabel?: string;\n selectedItems?: DropdownOption[];\n};\n\nexport const DropdownListboxItems = ({\n optionsToShow,\n getListboxItemProps,\n multiple,\n negative,\n fieldId,\n noOptionsText,\n selectAllLabel,\n selectedItems = [],\n}: DropdownListboxItemsProps) => {\n if (noOptionsText !== undefined && !optionsToShow.length) {\n return <Listbox.Item noninteractive>{noOptionsText}</Listbox.Item>;\n }\n\n const hasSelectAll = optionsToShow[0]?.id === SELECT_ALL_OPTION_ID;\n\n let selectAllCheckedState: CheckedState = false;\n if (hasSelectAll) {\n const realOptions = optionsToShow.filter((o) => o.id !== SELECT_ALL_OPTION_ID);\n const enabledOptions = realOptions.filter((o) => !o.disabled);\n const enabledSelectedCount = enabledOptions.filter((o) =>\n selectedItems.some((s) => s.id === o.id)\n ).length;\n const allEnabledSelected =\n enabledOptions.length > 0 && enabledSelectedCount === enabledOptions.length;\n const someSelected = selectedItems.length > 0;\n selectAllCheckedState = allEnabledSelected ? true : someSelected ? \"indeterminate\" : false;\n }\n\n return optionsToShow.map((option, index) => {\n const { key, selected, ...itemProps } = getListboxItemProps(option, index);\n\n if (option.id === SELECT_ALL_OPTION_ID) {\n return (\n <Listbox.Item\n key={key as string}\n {...itemProps}\n aria-selected={selectAllCheckedState === true}\n className={cx(\n `${rootClassName}__checkbox-item-multiple`,\n `${rootClassName}__select-all-item`\n )}\n hideSelectedIcon\n >\n <span className={cx(`${rootClassName}__checkbox-container`)}>\n <Checkbox\n id={`${fieldId}-checkbox-select-all`}\n checked={selectAllCheckedState}\n label={selectAllLabel}\n negative={negative}\n aria-hidden\n />\n </span>\n </Listbox.Item>\n );\n }\n\n if (multiple) {\n return (\n <Listbox.Item\n key={key as string}\n {...itemProps}\n className={cx(`${rootClassName}__checkbox-item-multiple`, {\n [`${rootClassName}__select-all-child`]: hasSelectAll,\n })}\n selected={!!selected}\n hideSelectedIcon\n >\n <span\n className={cx(`${rootClassName}__checkbox-container`, {\n [`${rootClassName}__checkbox-container--disabled`]: option.disabled,\n })}\n >\n <Checkbox\n id={`${fieldId}-checkbox-${option.id}`}\n checked={!!selected}\n label={option.label}\n negative={negative}\n aria-hidden\n disabled={option.disabled}\n />\n </span>\n </Listbox.Item>\n );\n }\n\n return (\n <Listbox.Item key={key as string} {...itemProps} selected={!!selected}>\n <div>{option.label}</div>\n </Listbox.Item>\n );\n });\n};\n\nexport { cx };\n","import type { DropdownOption } from \"./dropdown.types\";\nimport { getOptionLabelText } from \"./dropdown.types\";\n\nconst filterOptions = (\n options: DropdownOption[],\n searchTerm: string | undefined,\n filterOption?: (inputValue: string | undefined, option: DropdownOption) => boolean\n): DropdownOption[] => {\n if (filterOption) {\n return options.filter((option) => filterOption(searchTerm, option));\n }\n if (!searchTerm) return options;\n const chunks = searchTerm.toUpperCase().split(\" \");\n return options.filter((option) =>\n chunks.every((chunk) =>\n (option.value || (typeof option.label === \"string\" ? option.label : \"\"))\n .toUpperCase()\n .includes(chunk)\n )\n );\n};\n\nexport const getFilteredOptions = ({\n options,\n searchTerm,\n filterOption,\n selectedOption,\n multiple,\n}: {\n options: DropdownOption[];\n searchTerm: string | undefined;\n filterOption?: (inputValue: string | undefined, option: DropdownOption) => boolean;\n selectedOption?: DropdownOption;\n multiple: boolean;\n}): DropdownOption[] => {\n if (!multiple && selectedOption && getOptionLabelText(selectedOption) === searchTerm) {\n return options;\n }\n return filterOptions(options, searchTerm, filterOption);\n};\n","import { useState } from \"react\";\n\nimport type { DropdownOption } from \"./dropdown.types\";\nimport { getOptionLabelText } from \"./dropdown.types\";\n\nexport type UseDropdownInputParams = {\n controlledInputValue?: string;\n defaultInputValue?: string;\n selectedOption?: DropdownOption;\n onInputChange?: (value: string) => void;\n};\n\nexport const useDropdownInput = ({\n controlledInputValue,\n defaultInputValue,\n selectedOption,\n onInputChange,\n}: UseDropdownInputParams) => {\n const [internalInputValue, setInternalInputValue] = useState(\n (typeof controlledInputValue === \"string\"\n ? controlledInputValue\n : defaultInputValue ?? (selectedOption ? getOptionLabelText(selectedOption) : undefined)) ??\n \"\"\n );\n\n const displayInputValue =\n typeof controlledInputValue === \"string\" ? controlledInputValue : internalInputValue;\n\n const populateInputField = (value: string) => {\n onInputChange?.(value);\n setInternalInputValue(value);\n };\n\n return {\n displayInputValue,\n populateInputField,\n };\n};\n","import React, { forwardRef, useId } from \"react\";\nimport { Listbox } from \"@purpur/listbox\";\nimport { useAutocomplete } from \"@purpur/use-autocomplete\";\n\nimport type { DropdownComboboxProps, DropdownOption } from \"./dropdown.types\";\nimport { getOptionLabelText } from \"./dropdown.types\";\nimport {\n cx,\n DropdownEndAdornments,\n DropdownFooter,\n DropdownLabel,\n DropdownListboxItems,\n DropdownTags,\n rootClassName,\n SELECT_ALL_OPTION_ID,\n shouldShowSelectAll,\n} from \"./dropdown-shared\";\nimport { getFilteredOptions } from \"./useDropdownFilter\";\nimport { useDropdownInput } from \"./useDropdownInput\";\n\nexport const DropdownCombobox = forwardRef<HTMLDivElement, DropdownComboboxProps>((props, ref) => {\n const {\n id: propId,\n label,\n options,\n className,\n errorText,\n helperText,\n placeholder,\n negative = false,\n readOnly = false,\n disabled = false,\n required = false,\n valid,\n loading,\n multiple = false,\n selectedOption,\n selectedOptions = [],\n onSelect,\n openOnFocus = false,\n listboxMaxHeight,\n listboxLabel,\n filterOption,\n inputValue,\n defaultInputValue,\n onInputChange,\n noOptionsText,\n highlightFirstOption = false,\n selectAllLabel,\n moreOptionsText,\n removeOptionAriaLabel,\n [\"data-testid\"]: dataTestId,\n } = props;\n\n const randomId = useId();\n const fieldId = propId ?? randomId;\n const getTestId = (name: string) => (dataTestId ? `${dataTestId}-${name}` : undefined);\n const isValid = !!valid && !errorText;\n const helperTextId = `${fieldId}-helper-text`;\n\n const selectedItems = multiple ? selectedOptions : selectedOption ? [selectedOption] : [];\n\n const { displayInputValue, populateInputField } = useDropdownInput({\n controlledInputValue: inputValue,\n defaultInputValue,\n selectedOption,\n onInputChange,\n });\n\n const optionsToShow = getFilteredOptions({\n options,\n searchTerm: displayInputValue,\n filterOption,\n selectedOption,\n multiple,\n });\n\n const showSelectAll = shouldShowSelectAll({\n selectAllLabel,\n multiple,\n options,\n selectedItems,\n });\n\n // Hide \"Select all\" when the user is actively searching/filtering.\n const selectAllMatchesSearch = showSelectAll && !displayInputValue;\n\n // Inject a virtual \"Select all\" option so it participates in keyboard navigation.\n const optionsWithSelectAll =\n showSelectAll && selectAllMatchesSearch\n ? [{ id: SELECT_ALL_OPTION_ID, label: selectAllLabel as string }, ...optionsToShow]\n : optionsToShow;\n\n const handleSelectAll = () => {\n const enabledOptions = options.filter((o) => !o.disabled);\n const allEnabledSelected = enabledOptions.every((o) =>\n selectedItems.some((s) => s.id === o.id)\n );\n if (allEnabledSelected) {\n const next = selectedItems.filter((o) => o.disabled);\n onSelect?.(undefined, next);\n } else {\n const disabledSelected = selectedItems.filter((o) => o.disabled);\n const next = [...disabledSelected, ...enabledOptions];\n onSelect?.(undefined, next);\n }\n populateInputField(\"\");\n };\n\n const handleAutocompleteSelect = (option: DropdownOption) => {\n if (option.id === SELECT_ALL_OPTION_ID) {\n handleSelectAll();\n return;\n }\n if (multiple) {\n const isAlreadySelected = selectedItems.some((o) => o.id === option.id);\n const next = isAlreadySelected\n ? selectedItems.filter((o) => o.id !== option.id)\n : [...selectedItems, option];\n onSelect?.(option, next);\n populateInputField(\"\");\n } else {\n onSelect?.(option, [option]);\n populateInputField(getOptionLabelText(option));\n }\n };\n\n const {\n rootRef,\n inputRef,\n inputProps,\n listboxProps,\n getListboxItemProps,\n isOpen,\n openListbox,\n anchorStyle,\n } = useAutocomplete({\n id: fieldId,\n // useAutocomplete only reads id/disabled, never label's value, so this is safe even though\n // DropdownOption.label can be a ReactNode instead of the string it's typed to require.\n options: optionsWithSelectAll as (DropdownOption & { label: string })[],\n listboxLabel: listboxLabel || label || \"Options\",\n selectedOption: (multiple ? undefined : selectedOption) as\n | (DropdownOption & { label: string })\n | undefined,\n disabled,\n readOnly,\n openOnFocus,\n listboxMaxHeight,\n highlightFirstOption,\n closeOnSelect: !multiple,\n noOptionsText,\n negative,\n onSelect: handleAutocompleteSelect,\n [\"data-testid\"]: dataTestId,\n });\n\n const setRootRef = (node: HTMLDivElement | null) => {\n (rootRef as React.RefObject<HTMLDivElement | null>).current = node;\n if (typeof ref === \"function\") ref(node);\n else if (ref) (ref as React.RefObject<HTMLDivElement | null>).current = node;\n };\n\n // For multi-select the hook doesn't know about selectedOptions, so inject\n // the correct `selected` state here based on selectedItems.\n const getListboxItemPropsWithSelection = (option: DropdownOption, index: number) => {\n const props = getListboxItemProps(option as DropdownOption & { label: string }, index);\n if (multiple) {\n const isSelected = selectedItems.some((o) => o.id === option.id);\n return { ...props, selected: isSelected, \"aria-selected\": isSelected };\n }\n return props;\n };\n\n const handleRemoveTag = (option: DropdownOption) => {\n const next = selectedItems.filter((o) => o.id !== option.id);\n onSelect?.(option, next);\n };\n\n const handleInputKeyDown = (event: React.KeyboardEvent<HTMLInputElement>) => {\n if (\n multiple &&\n event.key === \"Backspace\" &&\n event.currentTarget.value === \"\" &&\n selectedItems.length > 0\n ) {\n // Find the last non-disabled chip to remove; disabled chips cannot be removed.\n for (let i = selectedItems.length - 1; i >= 0; i--) {\n if (!selectedItems[i].disabled) {\n handleRemoveTag(selectedItems[i]);\n break;\n }\n }\n }\n (inputProps as React.InputHTMLAttributes<HTMLInputElement>)?.onKeyDown?.(event);\n };\n\n const handleInputChange: React.ChangeEventHandler<HTMLInputElement> = (e) => {\n populateInputField(e.target.value);\n if (!isOpen) {\n openListbox();\n }\n };\n\n const handleContainerClick: React.MouseEventHandler<HTMLDivElement> = (event) => {\n if (disabled || readOnly) return;\n\n const target = event.target as HTMLElement;\n // Ignore clicks on the input (it has its own mousedown handler) or chip dismiss buttons.\n if (\n target === (inputRef as React.RefObject<HTMLInputElement>).current ||\n target.closest(\"button\")\n ) {\n return;\n }\n\n const input = (inputRef as React.RefObject<HTMLInputElement>).current;\n input?.dispatchEvent(new MouseEvent(\"mousedown\", { bubbles: true }));\n input?.focus();\n };\n\n // True when every option (enabled and disabled) is currently selected and a\n // `selectAllLabel` is configured. In that case the field shows the label\n // text instead of a list of chips.\n const allEnabledSelected =\n multiple &&\n !!selectAllLabel &&\n options.length > 0 &&\n options.every((o) => selectedItems.some((s) => s.id === o.id));\n\n const wrapperClassName = cx(rootClassName, className, {\n [`${rootClassName}--negative`]: negative,\n });\n\n return (\n <div ref={setRootRef} className={wrapperClassName}>\n <DropdownLabel\n fieldId={fieldId}\n htmlForSuffix=\"input\"\n label={label}\n getTestId={getTestId}\n disabled={disabled}\n negative={negative}\n required={required}\n />\n <div className={cx(`${rootClassName}__field-row`)}>\n {/* disable eslint rules for this div since it is just visual container and the input inside is still accessible and has its own handlers.*/}\n {/* eslint-disable-next-line jsx-a11y/no-static-element-interactions, jsx-a11y/click-events-have-key-events */}\n <div\n className={cx(`${rootClassName}__combobox-container`, {\n [`${rootClassName}__combobox-container--error`]: !!errorText,\n [`${rootClassName}__combobox-container--is-valid`]: isValid,\n [`${rootClassName}__combobox-container--negative`]: negative,\n [`${rootClassName}__combobox-container--disabled`]: disabled,\n [`${rootClassName}__combobox-container--readonly`]: readOnly && !disabled,\n })}\n style={anchorStyle}\n onClick={handleContainerClick}\n >\n {multiple && !allEnabledSelected && (\n <DropdownTags\n selectedItems={selectedItems}\n getTestId={getTestId}\n disabled={disabled}\n negative={negative}\n onRemove={handleRemoveTag}\n moreOptionsText={moreOptionsText}\n removeOptionAriaLabel={removeOptionAriaLabel}\n />\n )}\n <input\n {...(inputProps as React.InputHTMLAttributes<HTMLInputElement>)}\n ref={inputRef as React.RefObject<HTMLInputElement>}\n id={`${fieldId}-input`}\n data-testid={getTestId(\"input\")}\n onKeyDown={handleInputKeyDown}\n onChange={handleInputChange}\n value={allEnabledSelected && !displayInputValue ? selectAllLabel : displayInputValue}\n placeholder={placeholder}\n className={cx(`${rootClassName}__input`, {\n [`${rootClassName}__input--negative`]: negative,\n })}\n aria-describedby={helperTextId}\n aria-invalid={!!errorText}\n disabled={disabled}\n readOnly={readOnly}\n />\n <DropdownEndAdornments\n getTestId={getTestId}\n loading={loading}\n disabled={disabled}\n negative={negative}\n isValid={isValid}\n isOpen={isOpen}\n showChevronOpen\n />\n <span\n className={cx(`${rootClassName}__frame`, {\n [`${rootClassName}__frame--negative`]: negative,\n })}\n />\n </div>\n </div>\n {isOpen && (\n <Listbox {...listboxProps} className={cx(`${rootClassName}__listbox`)}>\n {DropdownListboxItems({\n optionsToShow: optionsWithSelectAll,\n getListboxItemProps: getListboxItemPropsWithSelection,\n multiple,\n negative,\n fieldId,\n noOptionsText,\n selectAllLabel,\n selectedItems,\n })}\n </Listbox>\n )}\n <DropdownFooter\n errorText={errorText}\n helperText={helperText}\n helperTextId={helperTextId}\n negative={negative}\n />\n </div>\n );\n});\n\nDropdownCombobox.displayName = \"DropdownCombobox\";\n","import { useRef, useState } from \"react\";\n\nimport type { DropdownOption } from \"./dropdown.types\";\n\nexport type HighlightedOption = DropdownOption & { isSetByClickEvent?: boolean };\n\nexport type UseDropdownHighlightParams = {\n options: DropdownOption[];\n highlightFirstOption: boolean;\n};\n\nexport const useDropdownHighlight = ({\n options,\n highlightFirstOption,\n}: UseDropdownHighlightParams) => {\n const listboxRef = useRef<HTMLUListElement>(null);\n const optionRefs = useRef<Record<string, HTMLLIElement>>({});\n\n const [highlightedOption, setHighlightedOption] = useState<HighlightedOption | undefined>(\n highlightFirstOption ? options[0] : undefined\n );\n\n const scrollOptionIntoView = (optionEl: HTMLLIElement | undefined) => {\n if (optionEl) {\n const optionRect = optionEl.getBoundingClientRect();\n const listboxRect = listboxRef.current?.getBoundingClientRect() || { top: 0, bottom: 0 };\n const isOutside = optionRect.top < listboxRect.top || optionRect.bottom > listboxRect.bottom;\n if (isOutside) {\n optionEl.scrollIntoView({ block: \"nearest\" });\n }\n }\n };\n\n const findNextOption = (\n direction: \"ArrowUp\" | \"ArrowDown\",\n optionsToShow: DropdownOption[]\n ): DropdownOption | undefined => {\n const enabledList = optionsToShow.filter((o) => !o.disabled);\n if (!enabledList.length) return undefined;\n\n const currentIndex = highlightedOption\n ? enabledList.findIndex((o) => o.id === highlightedOption.id)\n : -1;\n\n if (direction === \"ArrowDown\") {\n return enabledList[(currentIndex + 1) % enabledList.length];\n }\n return enabledList[(currentIndex - 1 + enabledList.length) % enabledList.length];\n };\n\n const highlightOption = (option: DropdownOption | undefined) => {\n setHighlightedOption(option ? { ...option } : undefined);\n if (option) scrollOptionIntoView(optionRefs.current[option.id]);\n };\n\n const highlightByClick = (option: DropdownOption) => {\n if (option.id !== highlightedOption?.id) {\n setHighlightedOption({ ...option, isSetByClickEvent: true });\n }\n };\n\n const highlightSelected = (option: DropdownOption, eventType: \"CLICK\" | \"KEYBOARD\") => {\n requestAnimationFrame(() => {\n const isSetByClickEvent = eventType === \"CLICK\";\n setHighlightedOption({ ...option, isSetByClickEvent });\n scrollOptionIntoView(optionRefs.current[option.id]);\n });\n };\n\n const resetHighlight = () => {\n setHighlightedOption(undefined);\n };\n\n return {\n highlightedOption,\n listboxRef,\n optionRefs,\n findNextOption,\n highlightOption,\n highlightByClick,\n highlightSelected,\n resetHighlight,\n };\n};\n","import { useCallback, useEffect } from \"react\";\n\nexport const useOnClickOutside = (element: HTMLElement | null, callback: () => void) => {\n const handleClickOutside = useCallback(\n (event: MouseEvent) => {\n if (element && !element.contains(event.target as Node)) {\n callback();\n }\n },\n [callback, element]\n );\n\n useEffect(() => {\n document.addEventListener(\"mousedown\", handleClickOutside);\n return () => {\n document.removeEventListener(\"mousedown\", handleClickOutside);\n };\n }, [handleClickOutside]);\n};\n","import type { CSSProperties } from \"react\";\nimport { useCallback, useId, useRef, useState } from \"react\";\nimport type { ListboxItemProps, ListboxProps } from \"@purpur/listbox\";\n\nimport type { DropdownOption } from \"./dropdown.types\";\nimport { getOptionLabelText } from \"./dropdown.types\";\nimport { getFilteredOptions } from \"./useDropdownFilter\";\nimport { useDropdownHighlight } from \"./useDropdownHighlight\";\nimport { useDropdownInput } from \"./useDropdownInput\";\nimport { useOnClickOutside } from \"./useOnClickOutside\";\n\n// ── Hook params ────────────────────────────────────────────────────────\n\nexport type UseDropdownParams = {\n id: string;\n variant: \"select\" | \"combobox\";\n options: DropdownOption[];\n listboxLabel: string;\n multiple?: boolean;\n\n // Selection\n selectedOption?: DropdownOption;\n selectedOptions?: DropdownOption[];\n onSelect?: (toggledOption: DropdownOption | undefined, selectedOptions: DropdownOption[]) => void;\n\n // Combobox-specific\n filterOption?: (inputValue: string | undefined, option: DropdownOption) => boolean;\n inputValue?: string;\n defaultInputValue?: string;\n onInputChange?: (value: string) => void;\n noOptionsText?: React.ReactNode;\n highlightFirstOption?: boolean;\n\n // Shared behaviour\n negative: boolean;\n openOnFocus?: boolean;\n listboxMaxHeight?: string | number;\n disabled?: boolean;\n readOnly?: boolean;\n\n [\"data-testid\"]?: string;\n};\n\n// ── Return type ────────────────────────────────────────────────────────\n\nexport type UseDropdownReturn = {\n rootRef: React.RefObject<HTMLDivElement | null>;\n triggerContainerProps: Record<string, unknown> | null;\n triggerProps: Record<string, unknown>;\n inputProps: Record<string, unknown> | null;\n listboxProps: ListboxProps;\n getListboxItemProps: (option: DropdownOption, index: number) => ListboxItemProps;\n optionsToShow: DropdownOption[];\n isOpen: boolean;\n highlightedOption: DropdownOption | undefined;\n selectedItems: DropdownOption[];\n anchorStyle: CSSProperties;\n};\n\n// ── Hook ───────────────────────────────────────────────────────────────\n\nexport const useDropdown = ({\n id,\n variant,\n options,\n listboxLabel,\n multiple = false,\n selectedOption,\n selectedOptions = [],\n onSelect,\n filterOption,\n inputValue: controlledInputValue,\n defaultInputValue,\n onInputChange,\n noOptionsText,\n highlightFirstOption = false,\n openOnFocus = false,\n listboxMaxHeight,\n negative,\n disabled = false,\n readOnly = false,\n [\"data-testid\"]: dataTestId,\n}: UseDropdownParams): UseDropdownReturn => {\n const isCombobox = variant === \"combobox\";\n const uniqueId = useId();\n\n // ── Refs ─────────────────────────────────────────────────────────────\n const rootRef = useRef<HTMLDivElement | null>(null);\n const triggerRef = useRef<HTMLButtonElement | null>(null);\n const inputRef = useRef<HTMLInputElement | null>(null);\n\n // ── Sub-hooks ────────────────────────────────────────────────────────\n const highlight = useDropdownHighlight({ options, highlightFirstOption });\n const { displayInputValue, populateInputField } = useDropdownInput({\n controlledInputValue,\n defaultInputValue,\n selectedOption,\n onInputChange,\n });\n\n // ── Open / close ────────────────────────────────────────────────────\n const [isOpen, setIsOpen] = useState(false);\n\n const closeListbox = () => {\n setIsOpen(false);\n highlight.resetHighlight();\n };\n\n useOnClickOutside(rootRef.current, closeListbox);\n\n const openListbox = ({ eventType }: { eventType: \"CLICK\" | \"KEYBOARD\" }) => {\n setIsOpen(true);\n const current = multiple ? undefined : selectedOption;\n if (current) {\n highlight.highlightSelected(current, eventType);\n }\n };\n\n // ── Derived state ───────────────────────────────────────────────────\n const resolvedSelected = multiple ? selectedOptions : selectedOption ? [selectedOption] : [];\n\n const optionsToShow = isCombobox\n ? getFilteredOptions({\n options,\n searchTerm: displayInputValue,\n filterOption,\n selectedOption,\n multiple,\n })\n : options;\n\n const showListbox = isOpen && (!!optionsToShow.length || !!noOptionsText);\n\n // ── Helpers ──────────────────────────────────────────────────────────\n const getTestId = (name: string) => (dataTestId ? `${dataTestId}-${name}` : undefined);\n\n // ── Selection ────────────────────────────────────────────────────────\n const selectOption = (option: DropdownOption | undefined) => {\n if (!option || option.disabled) return;\n\n if (multiple) {\n const isAlreadySelected = resolvedSelected.some((o) => o.id === option.id);\n const next = isAlreadySelected\n ? resolvedSelected.filter((o) => o.id !== option.id)\n : [...resolvedSelected, option];\n onSelect?.(option, next);\n if (isCombobox) {\n populateInputField(\"\");\n inputRef.current?.focus();\n }\n } else {\n onSelect?.(option, [option]);\n if (isCombobox) {\n populateInputField(getOptionLabelText(option));\n }\n closeListbox();\n (isCombobox ? inputRef : triggerRef).current?.focus();\n }\n };\n\n // ── Navigation ───────────────────────────────────────────────────────\n const highlightNextOption = (direction: \"ArrowUp\" | \"ArrowDown\") => {\n if (!showListbox) openListbox({ eventType: \"KEYBOARD\" });\n const next = highlight.findNextOption(direction, optionsToShow);\n highlight.highlightOption(next);\n };\n\n // ── Keyboard ─────────────────────────────────────────────────────────\n const handleKeyDown = (event: React.KeyboardEvent) => {\n if (disabled || readOnly) return;\n\n switch (event.key) {\n case \"ArrowUp\":\n case \"ArrowDown\":\n event.preventDefault();\n highlightNextOption(event.key);\n break;\n case \"Enter\": {\n event.preventDefault();\n if (showListbox && highlight.highlightedOption) {\n selectOption(highlight.highlightedOption);\n } else if (!showListbox) {\n openListbox({ eventType: \"KEYBOARD\" });\n }\n break;\n }\n case \" \": {\n if (!isCombobox) {\n event.preventDefault();\n if (showListbox && highlight.highlightedOption) {\n selectOption(highlight.highlightedOption);\n } else if (!showListbox) {\n openListbox({ eventType: \"KEYBOARD\" });\n }\n }\n break;\n }\n case \"Escape\":\n event.preventDefault();\n closeListbox();\n break;\n case \"Tab\":\n closeListbox();\n break;\n case \"Home\":\n case \"End\":\n if (isCombobox) closeListbox();\n break;\n }\n };\n\n // ── Combobox input handlers ─────────────────────────────────────────\n const handleInputChange: React.ChangeEventHandler<HTMLInputElement> = (e) => {\n populateInputField(e.target.value);\n highlight.resetHighlight();\n if (!isOpen) openListbox({ eventType: \"KEYBOARD\" });\n };\n\n const handleInputMouseDown = () => {\n if (disabled || readOnly) return;\n isOpen ? closeListbox() : openListbox({ eventType: \"CLICK\" });\n };\n\n const handleInputFocus = () => {\n if (!isOpen && openOnFocus && !disabled && !readOnly) {\n openListbox({ eventType: \"KEYBOARD\" });\n }\n inputRef.current?.select();\n };\n\n const handleInputBlur = () => {\n setTimeout(() => {\n const activeEl = document.activeElement;\n // Only close when focus has moved to a real element outside the dropdown.\n // Guarding against document.body prevents a false-positive close when a\n // screen reader navigates with its virtual cursor: the input blurs but no\n // DOM element receives physical focus (activeElement falls back to body).\n if (\n activeEl !== document.body &&\n !inputRef.current?.contains(activeEl) &&\n !highlight.listboxRef.current?.contains(activeEl) &&\n !rootRef.current?.contains(activeEl)\n ) {\n closeListbox();\n if (isCombobox && !multiple) {\n populateInputField(selectedOption ? getOptionLabelText(selectedOption) : \"\");\n }\n }\n });\n };\n\n // ── Select trigger handlers ─────────────────────────────────────────\n const handleTriggerClick = () => {\n if (disabled || readOnly) return;\n isOpen ? closeListbox() : openListbox({ eventType: \"CLICK\" });\n };\n\n const handleTriggerContainerClick: React.MouseEventHandler<HTMLDivElement> = (event) => {\n if (disabled || readOnly) return;\n\n const clickedButton = (event.target as HTMLElement).closest(\"button\");\n if (clickedButton && clickedButton !== triggerRef.current) {\n return;\n }\n\n handleTriggerClick();\n };\n\n const handleTriggerFocus = () => {\n if (!isOpen && openOnFocus && !disabled && !readOnly) {\n openListbox({ eventType: \"KEYBOARD\" });\n }\n };\n\n // ── Build props ──────────────────────────────────────────────────────\n const listboxId = `${id}-listbox`;\n const createListboxItemId = (option: DropdownOption) => `${id}-listbox-item-${option.id}`;\n const anchorName = `--purpur-dropdown-${uniqueId.replace(/:/g, \"\")}`;\n const anchorStyle = { anchorName } as CSSProperties;\n const triggerContainerProps: Record<string, unknown> | null = isCombobox\n ? null\n : {\n onClick: handleTriggerContainerClick,\n };\n\n // ── Popover sync ────────────────────────────────────────────────────\n const listboxCallbackRef = useCallback(\n (node: HTMLUListElement | null) => {\n (highlight.listboxRef as React.MutableRefObject<HTMLUListElement | null>).current = node;\n if (node && typeof node.showPopover === \"function\") {\n try {\n node.showPopover();\n } catch {\n // Popover not supported or already open\n }\n }\n },\n [highlight.listboxRef]\n );\n\n const listboxProps = {\n \"aria-label\": listboxLabel,\n \"aria-expanded\": showListbox,\n \"data-testid\": getTestId(\"listbox\"),\n id: listboxId,\n ref: listboxCallbackRef,\n onMouseLeave: () => highlight.resetHighlight(),\n popover: \"manual\",\n negative,\n style: {\n ...(listboxMaxHeight\n ? {\n maxHeight:\n typeof listboxMaxHeight === \"number\" ? `${listboxMaxHeight}px` : listboxMaxHeight,\n }\n : {}),\n positionAnchor: anchorName,\n } as CSSProperties,\n } as ListboxProps;\n\n const getListboxItemProps = (option: DropdownOption, index: number): ListboxItemProps => {\n const isSelected = resolvedSelected.some((o) => o.id === option.id);\n const { highlightedOption } = highlight;\n\n const highlighted =\n (option.id === highlightedOption?.id ||\n (highlightFirstOption && !highlightedOption && index === 0)) &&\n !highlightedOption?.isSetByClickEvent;\n\n return {\n \"data-testid\": getTestId(`listbox-item-${option.id}`),\n id: createListboxItemId(option),\n key: option.id,\n onMouseMove: () => highlight.highlightByClick(option),\n onMouseUp: () => selectOption(option),\n ref: (el) => {\n if (el) highlight.optionRefs.current[option.id] = el;\n },\n tabIndex: -1,\n selected: isSelected,\n disabled: option.disabled,\n highlighted,\n hovered: option.id === highlightedOption?.id && !!highlightedOption?.isSetByClickEvent,\n \"aria-selected\": isSelected,\n };\n };\n\n const triggerProps: Record<string, unknown> = isCombobox\n ? {}\n : {\n ref: triggerRef,\n type: \"button\" as const,\n role: \"combobox\",\n \"aria-haspopup\": \"listbox\",\n \"aria-expanded\": showListbox,\n \"aria-controls\": listboxId,\n \"aria-disabled\": disabled,\n \"data-testid\": getTestId(\"trigger\"),\n id: `${id}-trigger`,\n onKeyDown: handleKeyDown,\n onFocus: handleTriggerFocus,\n disabled,\n tabIndex: disabled ? -1 : 0,\n style: anchorStyle,\n };\n\n const inputProps: Record<string, unknown> | null = isCombobox\n ? {\n ref: inputRef,\n role: \"combobox\",\n \"aria-autocomplete\": \"list\" as const,\n \"aria-expanded\": showListbox,\n \"aria-controls\": listboxId,\n \"aria-activedescendant\": highlight.highlightedOption\n ? createListboxItemId(highlight.highlightedOption)\n : undefined,\n \"data-testid\": getTestId(\"input\"),\n autoComplete: \"off\",\n id: `${id}-input`,\n type: \"text\",\n value: displayInputValue,\n onChange: handleInputChange,\n onMouseDown: handleInputMouseDown,\n onFocus: handleInputFocus,\n onBlur: handleInputBlur,\n onKeyDown: handleKeyDown,\n disabled,\n readOnly,\n }\n : null;\n\n return {\n rootRef,\n triggerContainerProps,\n triggerProps,\n inputProps,\n listboxProps,\n getListboxItemProps,\n optionsToShow,\n isOpen: showListbox,\n highlightedOption: highlight.highlightedOption,\n selectedItems: resolvedSelected,\n anchorStyle,\n };\n};\n","import React, { forwardRef, useId } from \"react\";\nimport { Listbox } from \"@purpur/listbox\";\n\nimport type { DropdownOption, DropdownSelectProps } from \"./dropdown.types\";\nimport {\n cx,\n DropdownEndAdornments,\n DropdownFooter,\n DropdownLabel,\n DropdownListboxItems,\n DropdownTags,\n rootClassName,\n SELECT_ALL_OPTION_ID,\n shouldShowSelectAll,\n} from \"./dropdown-shared\";\nimport { useDropdown } from \"./useDropdown\";\n\nexport const DropdownSelect = forwardRef<HTMLDivElement, DropdownSelectProps>((props, ref) => {\n const {\n id: propId,\n label,\n options,\n className,\n errorText,\n helperText,\n placeholder,\n negative = false,\n readOnly = false,\n disabled = false,\n required = false,\n valid = false,\n loading = false,\n multiple = false,\n selectedOption,\n selectedOptions = [],\n onSelect,\n openOnFocus = false,\n listboxMaxHeight,\n listboxLabel,\n selectAllLabel,\n moreOptionsText,\n removeOptionAriaLabel,\n [\"data-testid\"]: dataTestId,\n } = props;\n\n const randomId = useId();\n const fieldId = propId ?? randomId;\n const getTestId = (name: string) => (dataTestId ? `${dataTestId}-${name}` : undefined);\n const isValid = !!valid && !errorText;\n const helperTextId = `${fieldId}-helper-text`;\n\n // Resolve selected items up-front so we can decide whether to show the\n // virtual \"Select all\" option.\n const resolvedSelectedItems = multiple ? selectedOptions : selectedOption ? [selectedOption] : [];\n\n const showSelectAll = shouldShowSelectAll({\n selectAllLabel,\n multiple,\n options,\n selectedItems: resolvedSelectedItems,\n });\n\n const handleSelectAll = () => {\n const enabledOptions = options.filter((o) => !o.disabled);\n const allEnabledSelected = enabledOptions.every((o) =>\n resolvedSelectedItems.some((s) => s.id === o.id)\n );\n if (allEnabledSelected) {\n // Deselect all enabled options, keep disabled+selected as-is\n const next = resolvedSelectedItems.filter((o) => o.disabled);\n onSelect?.(undefined, next);\n } else {\n // Select all enabled, keep disabled+selected as-is\n const disabledSelected = resolvedSelectedItems.filter((o) => o.disabled);\n const next = [...disabledSelected, ...enabledOptions];\n onSelect?.(undefined, next);\n }\n };\n\n // Intercept selection of the virtual \"Select all\" option routed through the\n // hook's keyboard/mouse handlers and redirect to the dedicated handler.\n const handleHookSelect = (\n toggledOption: DropdownOption | undefined,\n nextSelected: DropdownOption[]\n ) => {\n if (toggledOption?.id === SELECT_ALL_OPTION_ID) {\n handleSelectAll();\n return;\n }\n onSelect?.(toggledOption, nextSelected);\n };\n\n const hookOptions = showSelectAll\n ? [{ id: SELECT_ALL_OPTION_ID, label: selectAllLabel as string }, ...options]\n : options;\n\n const dropdown = useDropdown({\n id: fieldId,\n variant: \"select\",\n options: hookOptions,\n listboxLabel: listboxLabel || label || \"Options\",\n multiple,\n negative,\n selectedOption,\n selectedOptions,\n onSelect: handleHookSelect,\n openOnFocus,\n listboxMaxHeight,\n disabled,\n readOnly,\n [\"data-testid\"]: dataTestId,\n });\n\n const setRootRef = (node: HTMLDivElement | null) => {\n (dropdown.rootRef as React.RefObject<HTMLDivElement | null>).current = node;\n if (typeof ref === \"function\") ref(node);\n else if (ref) (ref as React.RefObject<HTMLDivElement | null>).current = node;\n };\n\n const {\n triggerContainerProps,\n triggerProps,\n listboxProps,\n getListboxItemProps,\n optionsToShow,\n isOpen,\n selectedItems,\n anchorStyle,\n } = dropdown;\n\n const triggerButtonProps = {\n ...(triggerProps as React.ButtonHTMLAttributes<HTMLButtonElement>),\n };\n delete triggerButtonProps.style;\n\n const handleRemoveTag = (option: DropdownOption) => {\n const next = selectedItems.filter((o) => o.id !== option.id);\n onSelect?.(option, next);\n };\n\n // True when every option (enabled and disabled) is currently selected and a\n // `selectAllLabel` is configured. In that case the field shows the label\n // text instead of a list of chips.\n const allEnabledSelected =\n multiple &&\n !!selectAllLabel &&\n options.length > 0 &&\n options.every((o) => selectedItems.some((s) => s.id === o.id));\n\n const displayLabel = multiple\n ? allEnabledSelected\n ? selectAllLabel\n : selectedItems.length === 0\n ? placeholder || \"\"\n : \"\"\n : selectedOption?.label || placeholder || \"\";\n\n const wrapperClassName = cx(rootClassName, className, {\n [`${rootClassName}--negative`]: negative,\n });\n\n return (\n <div ref={setRootRef} className={wrapperClassName}>\n <DropdownLabel\n fieldId={fieldId}\n htmlForSuffix=\"trigger\"\n label={label}\n getTestId={getTestId}\n disabled={disabled}\n negative={negative}\n required={required}\n />\n <div className={cx(`${rootClassName}__field-row`)}>\n <div\n {...(triggerContainerProps as React.HTMLAttributes<HTMLDivElement>)}\n className={cx(`${rootClassName}__trigger-container`, {\n [`${rootClassName}__trigger-container--error`]: !!errorText,\n [`${rootClassName}__trigger-container--is-valid`]: isValid,\n [`${rootClassName}__trigger-container--negative`]: negative,\n [`${rootClassName}__trigger-container--disabled`]: disabled,\n [`${rootClassName}__trigger-container--readonly`]: readOnly && !disabled,\n [`${rootClassName}__trigger-container--has-tags`]:\n multiple && selectedItems.length > 0 && !allEnabledSelected,\n })}\n style={anchorStyle}\n >\n {multiple && !allEnabledSelected && (\n <DropdownTags\n selectedItems={selectedItems}\n getTestId={getTestId}\n disabled={disabled}\n negative={negative}\n onRemove={handleRemoveTag}\n moreOptionsText={moreOptionsText}\n removeOptionAriaLabel={removeOptionAriaLabel}\n isSelect\n />\n )}\n <button\n {...triggerButtonProps}\n className={cx(`${rootClassName}__trigger`, {\n [`${rootClassName}__trigger--is-valid`]: isValid,\n [`${rootClassName}__trigger--negative`]: negative,\n [`${rootClassName}__trigger--disabled`]: disabled,\n [`${rootClassName}__trigger--readonly`]: readOnly && !disabled,\n [`${rootClassName}__trigger--placeholder`]: !selectedItems.length,\n })}\n aria-describedby={helperTextId}\n >\n <span className={cx(`${rootClassName}__trigger-text`)}>{displayLabel}</span>\n </button>\n <DropdownEndAdornments\n getTestId={getTestId}\n loading={loading}\n disabled={disabled}\n negative={negative}\n isValid={isValid}\n isOpen={isOpen}\n readOnly={readOnly}\n showChevronOpen\n />\n <span\n className={cx(`${rootClassName}__frame`, {\n [`${rootClassName}__frame--negative`]: negative,\n })}\n />\n </div>\n </div>\n {isOpen && (\n <Listbox {...listboxProps} className={cx(`${rootClassName}__listbox`)}>\n {DropdownListboxItems({\n optionsToShow,\n getListboxItemProps,\n multiple,\n negative,\n fieldId,\n selectAllLabel,\n selectedItems,\n })}\n </Listbox>\n )}\n <DropdownFooter\n errorText={errorText}\n helperText={helperText}\n helperTextId={helperTextId}\n negative={negative}\n />\n </div>\n );\n});\n\nDropdownSelect.displayName = \"DropdownSelect\";\n","import React, { forwardRef } from \"react\";\n\nimport type { DropdownComboboxProps, DropdownProps, DropdownSelectProps } from \"./dropdown.types\";\nimport { DropdownCombobox } from \"./dropdown-combobox\";\nimport { DropdownSelect } from \"./dropdown-select\";\n\nexport const Dropdown = forwardRef<HTMLDivElement, DropdownProps>((props, ref) => {\n if (props.combobox) {\n return <DropdownCombobox ref={ref} {...(props as DropdownComboboxProps)} />;\n }\n\n return <DropdownSelect ref={ref} {...(props as DropdownSelectProps)} />;\n});\n\nDropdown.displayName = \"Dropdown\";\n\nexport type {\n DropdownComboboxProps,\n DropdownOption,\n DropdownProps,\n DropdownSelectProps,\n} from \"./dropdown.types\";\nexport { useDropdown } from \"./useDropdown\";\n"],"names":["getOptionLabelText","option","cx","c","styles","rootClassName","DropdownLabel","fieldId","htmlForSuffix","label","getTestId","disabled","negative","required","jsxs","Label","jsx","DropdownEndAdornments","loading","isValid","isOpen","readOnly","showChevronOpen","Spinner","Fragment","IconCheckCircleFilled","IconChevronDown","MAX_VISIBLE_TAGS","DropdownTags","selectedItems","onRemove","isSelect","moreOptionsText","removeOptionAriaLabel","visibleItems","hiddenCount","DismissableChipGroup","item","DropdownFooter","errorText","helperText","helperTextId","FieldErrorText","FieldHelperText","SELECT_ALL_OPTION_ID","shouldShowSelectAll","selectAllLabel","multiple","options","o","s","DropdownListboxItems","optionsToShow","getListboxItemProps","noOptionsText","Listbox","hasSelectAll","selectAllCheckedState","enabledOptions","enabledSelectedCount","allEnabledSelected","someSelected","index","key","selected","itemProps","Checkbox","filterOptions","searchTerm","filterOption","chunks","chunk","getFilteredOptions","selectedOption","useDropdownInput","controlledInputValue","defaultInputValue","onInputChange","internalInputValue","setInternalInputValue","useState","value","DropdownCombobox","forwardRef","props","ref","propId","className","placeholder","valid","selectedOptions","onSelect","openOnFocus","listboxMaxHeight","listboxLabel","inputValue","highlightFirstOption","dataTestId","randomId","useId","name","displayInputValue","populateInputField","showSelectAll","optionsWithSelectAll","handleSelectAll","next","handleAutocompleteSelect","rootRef","inputRef","inputProps","listboxProps","openListbox","anchorStyle","useAutocomplete","setRootRef","node","getListboxItemPropsWithSelection","isSelected","handleRemoveTag","handleInputKeyDown","event","i","handleInputChange","e","handleContainerClick","target","input","wrapperClassName","useDropdownHighlight","listboxRef","useRef","optionRefs","highlightedOption","setHighlightedOption","scrollOptionIntoView","optionEl","optionRect","listboxRect","direction","enabledList","currentIndex","eventType","useOnClickOutside","element","callback","handleClickOutside","useCallback","useEffect","useDropdown","id","variant","isCombobox","uniqueId","triggerRef","highlight","setIsOpen","closeListbox","current","resolvedSelected","showListbox","selectOption","highlightNextOption","handleKeyDown","handleInputMouseDown","handleInputFocus","handleInputBlur","activeEl","handleTriggerClick","handleTriggerContainerClick","clickedButton","handleTriggerFocus","listboxId","createListboxItemId","anchorName","triggerContainerProps","listboxCallbackRef","highlighted","el","triggerProps","DropdownSelect","resolvedSelectedItems","handleHookSelect","toggledOption","nextSelected","hookOptions","dropdown","triggerButtonProps","displayLabel","Dropdown"],"mappings":"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"}