@stackone/malachite 2.26.0 → 2.27.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/COMPONENTS.md +1 -1
- package/dist/components/ChangeReview/ChangeReviewItem.js +96 -88
- package/dist/components/ChangeReview/ChangeReviewItem.js.map +1 -1
- package/dist/components/Chat/ChatMessage.js +11 -11
- package/dist/components/Chat/ChatMessage.js.map +1 -1
- package/dist/components/Dropdown.js +188 -195
- package/dist/components/Dropdown.js.map +1 -1
- package/dist/components/MultiSelect.js +412 -382
- package/dist/components/MultiSelect.js.map +1 -1
- package/dist/components/truncatedLines.js +16 -0
- package/dist/components/truncatedLines.js.map +1 -0
- package/dist/index.d.ts +13 -1
- package/dist/tailwind.css.js +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Dropdown.js","sources":["../../src/components/Dropdown.tsx"],"sourcesContent":["import React, {\n useId,\n useState,\n useRef,\n useEffect,\n useInsertionEffect,\n useLayoutEffect,\n useCallback,\n} from 'react';\nimport { createPortal } from 'react-dom';\nimport { Control, FieldPath, FieldValues } from 'react-hook-form';\nimport BaseFormComponent, {\n type RequiredIndicator,\n type RightSideContent,\n useFormFieldIds,\n} from './BaseFormComponent';\nimport CaretDownIcon from './CustomIcons/CaretDownIcon';\nimport CloseIcon from './CustomIcons/CloseIcon';\nimport FieldMessage from './FieldMessage';\nimport LoadingInput from './LoadingInput';\nimport Spinner from './Spinner';\nimport Tooltip from './Tooltip';\nimport { CONTROL_TEXT_SIZE, CONTROL_TEXT_SIZE_CLASS } from './controlTextSize';\nimport { controlWidthStyle } from './controlWidth';\nimport { DROPDOWN_TRIGGER_ATTR, type DropdownTone, getTriggerVisual } from './dropdownTriggerStyle';\nimport { pushEscapeLayer } from './escapeLayers';\nimport {\n MENU_MAX_HEIGHT_PX,\n MENU_SPECS,\n type MenuGeometry,\n isTriggerOffscreen,\n measureMenuGeometry,\n rectSignature,\n} from './floatingMenuGeometry';\nimport { ensureDropdownPanelStyles } from './optionRowStyles';\nimport { overlayIdentity } from './portalOverlay';\nimport { useTopLayer } from './topLayer';\n\nexport type { DropdownTone };\n\nexport interface DropdownItem {\n id: string;\n label: string;\n icon?: React.ReactNode;\n /** Alternate label shown in the closed trigger when selected (falls back to `label`). */\n triggerLabel?: string;\n /** Items sharing a `group` render under a section header, in first-seen order. */\n group?: string;\n subtitle?: string;\n rightSideText?: string;\n rightSideTextVariant?: 'muted' | 'primary';\n rightSideTextAlignment?: 'left' | 'right';\n}\n\ninterface DropdownBaseProps {\n label?: string;\n hint?: string;\n rightSideContent?: RightSideContent;\n tooltip?: string;\n name: FieldPath<FieldValues> | string;\n loading?: boolean;\n menuLoading?: boolean;\n items: DropdownItem[];\n onItemSelected?: (id?: string) => void;\n defaultValue?: string;\n /** Controlled selection. When set, the trigger always reflects this id and the component\n * keeps no selection state of its own. Pass it with `onItemSelected`. */\n value?: string;\n disabled?: boolean;\n error?: boolean;\n /** `pending` marks a value the user still has to supply. Outranks open and selection. */\n tone?: DropdownTone;\n className?: string;\n formControl?: Control<FieldValues, unknown>;\n description?: string;\n required?: boolean;\n requiredIndicator?: RequiredIndicator;\n helperText?: React.ReactNode;\n placeholder?: string;\n subtitleLayout?: SubtitleLayout;\n /** Adds a clear control to the trigger, reported as `onItemSelected(undefined)`. */\n clearable?: boolean;\n /** 'large' (42px) for form inputs; 'medium' (32px) for toolbar chips; 'small' (28px) beside a title. */\n size?: DropdownSize;\n fullWidth?: boolean;\n width?: string | number;\n /**\n * Raises the open menu's floor above the shared 160px one, without widening the trigger.\n * For a control pinned narrow by its column — a role picker in a 160px cell, a member\n * picker in a 200px slot — whose options carry a subtitle the trigger never has to show.\n */\n minWidth?: number;\n /** Names the trigger from the light DOM, where `htmlFor` cannot reach into the shadow root. */\n id?: string;\n 'aria-label'?: string;\n 'aria-labelledby'?: string;\n}\n\n/**\n * The search trigger is a single-line text input with nowhere for a second line, so\n * `showSubtitleInTrigger` is rejected alongside `search` rather than silently ignored.\n */\ntype DropdownTriggerModeProps =\n | {\n search?: false;\n /** Promotes the selected item's `subtitle` into the closed trigger, beneath the value. */\n showSubtitleInTrigger?: boolean;\n }\n | { search: true; showSubtitleInTrigger?: never };\n\nexport type DropdownProps = DropdownBaseProps & DropdownTriggerModeProps;\n\n/**\n * Matches Button and the Figma component library: 28 / 32 / 42px. These names moved up a\n * tier in 0.71 — what was `xsmall`/`small`/`medium` is now `small`/`medium`/`large`.\n */\nexport type DropdownSize = 'small' | 'medium' | 'large';\n\nexport type SubtitleLayout = 'inline' | 'stacked';\n\nconst PANEL_MESSAGE_STYLE: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: 8,\n padding: '24px 16px',\n color: 'var(--malachite-text-dimmed, rgb(161, 161, 161))',\n};\n\n// Figma pins the option's inline annotation at 11px on every tier — unlike the label,\n// it does not ride the ladder (Item Large 68:2617, Item Medium 2343:2134).\nconst ANNOTATION_FONT_SIZE = 'var(--malachite-font-size-xsmall, 11px)';\n\nconst OPTION_SELECTOR = '[data-dropdown-option]';\n\nconst panelOptions = (panel: HTMLElement | null): HTMLElement[] =>\n Array.from(panel?.querySelectorAll<HTMLElement>(OPTION_SELECTOR) ?? []);\n\nconst matchesSearch = (item: DropdownItem, query: string) => {\n const q = query.toLowerCase();\n const labelMatches = item.label.toLowerCase().includes(q);\n const subtitleMatches = item.subtitle ? item.subtitle.toLowerCase().includes(q) : false;\n const rightSideTextMatches = item.rightSideText\n ? item.rightSideText.toLowerCase().includes(q)\n : false;\n return labelMatches || subtitleMatches || rightSideTextMatches;\n};\n\nconst TRIGGER_SIZE_HEIGHT: Record<DropdownSize, string> = {\n small: 'h-[var(--malachite-control-height-small,28px)]',\n medium: 'h-[var(--malachite-control-height-medium,32px)]',\n large: 'h-[var(--malachite-control-height-large,42px)]',\n};\n\nconst TRIGGER_SIZE_CLASSES: Record<DropdownSize, string> = {\n small: `${TRIGGER_SIZE_HEIGHT.small} px-2.5 py-1.5 ${CONTROL_TEXT_SIZE_CLASS.small}`,\n medium: `${TRIGGER_SIZE_HEIGHT.medium} px-3 py-1.5 ${CONTROL_TEXT_SIZE_CLASS.medium}`,\n large: `${TRIGGER_SIZE_HEIGHT.large} px-4 py-2.5 ${CONTROL_TEXT_SIZE_CLASS.large}`,\n};\n\nconst TRIGGER_SIZE_STACKED_CLASSES: Record<DropdownSize, string> = {\n small: `min-h-[var(--malachite-control-height-small,28px)] px-2.5 py-1.5 ${CONTROL_TEXT_SIZE_CLASS.small}`,\n medium: `min-h-[var(--malachite-control-height-medium,32px)] px-3 py-1.5 ${CONTROL_TEXT_SIZE_CLASS.medium}`,\n large: `min-h-[var(--malachite-control-height-large,42px)] px-4 py-2.5 ${CONTROL_TEXT_SIZE_CLASS.large}`,\n};\n\nconst CLEAR_OFFSET_CLASSES: Record<DropdownSize, string> = {\n small: 'right-[26px] size-4',\n medium: 'right-[30px] size-4',\n large: 'right-[38px] size-4',\n};\n\nconst CLEAR_STACKED_TOP_CLASSES: Record<DropdownSize, string> = {\n small: 'top-[calc(var(--malachite-control-height-small,28px)/2)] -translate-y-1/2',\n medium: 'top-[calc(var(--malachite-control-height-medium,32px)/2)] -translate-y-1/2',\n large: 'top-[calc(var(--malachite-control-height-large,42px)/2)] -translate-y-1/2',\n};\n\n// Radius tracks the tier in Figma: 10 / 12 / 14. Only 12 has a --malachite-radius-* rung.\nconst TRIGGER_SIZE_RADIUS: Record<DropdownSize, string> = {\n small: 'rounded-[var(--malachite-radius-10,10px)]',\n medium: 'rounded-xl',\n large: 'rounded-[var(--malachite-radius-xxl,14px)]',\n};\n\nconst NEVER = () => false;\n\nconst isCut = (el: HTMLElement | null) => !!el && el.scrollWidth > el.clientWidth;\n\n// Portaled to document.body, outside the shadow root: styling here has to be inline.\nconst TOOLTIP_LINES_STYLE: React.CSSProperties = {\n display: 'flex',\n flexDirection: 'column',\n gap: 4,\n};\n\nconst tooltipLines = (lines: ReadonlyArray<readonly [slot: string, text: React.ReactNode]>) => {\n const shown = lines.filter(([, text]) => Boolean(text));\n if (shown.length < 2) {\n return shown[0]?.[1];\n }\n return (\n <span style={TOOLTIP_LINES_STYLE}>\n {shown.map(([slot, text]) => (\n <span key={slot}>{text}</span>\n ))}\n </span>\n );\n};\n\nconst ValueRow: React.FC<{ wrap: boolean; id?: string; children: React.ReactNode }> = ({\n wrap,\n id,\n children,\n}) =>\n wrap ? (\n <span id={id} className=\"min-w-0 flex items-center gap-2\">\n {children}\n </span>\n ) : (\n <>{children}</>\n );\n\nconst LabelRow: React.FC<{ row: boolean; children: React.ReactNode }> = ({ row, children }) =>\n row ? (\n <span style={{ display: 'flex', alignItems: 'center', gap: 8, minWidth: 0 }}>\n {children}\n </span>\n ) : (\n <>{children}</>\n );\n\ninterface DropdownTriggerProps {\n isOpen: boolean;\n onClick: () => void;\n selectedItem: DropdownItem | undefined;\n hasClear?: boolean;\n onClear?: (event: React.MouseEvent<HTMLButtonElement>) => void;\n clearLabel?: string;\n disabled?: boolean;\n error?: boolean;\n tone?: DropdownTone;\n placeholder?: string;\n search?: boolean;\n showSubtitleInTrigger?: boolean;\n searchQuery?: string;\n onSearchChange?: (value: string) => void;\n onFocusOpen?: () => void;\n /** ArrowDown on the trigger: opens the menu, or steps into it if already open. */\n onArrowDown?: () => void;\n size?: DropdownSize;\n controlId: string;\n labelId?: string;\n describedBy?: string;\n required?: boolean;\n ariaLabel?: string;\n ariaLabelledBy?: string;\n /** A caller-supplied id means an external `<label for>` may be naming the control. */\n hasCallerId?: boolean;\n}\n\nconst DropdownTrigger = React.forwardRef<HTMLElement, DropdownTriggerProps>(\n (\n {\n isOpen,\n onClick,\n selectedItem,\n disabled = false,\n error = false,\n tone,\n placeholder,\n search = false,\n showSubtitleInTrigger = false,\n searchQuery = '',\n onSearchChange,\n onFocusOpen,\n onArrowDown,\n size = 'large',\n hasClear = false,\n onClear,\n clearLabel,\n controlId,\n labelId,\n describedBy,\n required = false,\n ariaLabel,\n ariaLabelledBy,\n hasCallerId = false,\n },\n forwardedRef,\n ) => {\n const stacked = showSubtitleInTrigger && !search && !!selectedItem?.subtitle;\n const sizeClasses = stacked\n ? TRIGGER_SIZE_STACKED_CLASSES[size]\n : TRIGGER_SIZE_CLASSES[size];\n const sizeRadius = TRIGGER_SIZE_RADIUS[size];\n const valueId = `${controlId}-value`;\n const subtitleId = `${controlId}-subtitle`;\n // aria-labelledby outranks aria-label in the accessible-name algorithm, so the\n // generated label+value pair has to be dropped for a caller's aria-label to apply.\n // Named off nothing, the button takes its name from every descendant — the subtitle\n // included, which `aria-describedby` then repeats. Naming it off the value alone fixes\n // that, but only where nothing else already names the control.\n const namesItself = !labelId && !ariaLabel && !hasCallerId && stacked;\n const labelledBy =\n ariaLabelledBy ??\n (labelId && !ariaLabel ? `${labelId} ${valueId}` : undefined) ??\n (namesItself ? valueId : undefined);\n\n const handleArrowDown = (event: React.KeyboardEvent): void => {\n if (event.key !== 'ArrowDown') {\n return;\n }\n event.preventDefault();\n onArrowDown?.();\n };\n\n const valueTextRef = useRef<HTMLSpanElement>(null);\n const subtitleTextRef = useRef<HTMLSpanElement>(null);\n const triggerVisual = getTriggerVisual({ disabled, error, tone, open: isOpen });\n const showValueLabel = !isOpen && !!selectedItem;\n const valueText = selectedItem?.triggerLabel ?? selectedItem?.label;\n const triggerSubtitle = stacked ? selectedItem?.subtitle : undefined;\n const isValueTruncated = () => isCut(valueTextRef.current);\n\n // A tooltip reads its text at render, but which line is cut off is only knowable on\n // hover — so the one measurement pass that decides whether to show also records what\n // to say. The initial value never shows: untruncated, the tooltip refuses to open.\n const [cutLines, setCutLines] = useState({ value: false, subtitle: true });\n const measureTruncatedLines = () => {\n const value = isValueTruncated();\n const subtitle = isCut(subtitleTextRef.current);\n if (!value && !subtitle) {\n return false;\n }\n setCutLines({ value, subtitle });\n return true;\n };\n\n if (search && !disabled) {\n return (\n <div\n ref={forwardedRef as React.Ref<HTMLDivElement>}\n className={`\n relative w-full ${sizeClasses} ${sizeRadius}\n border border-solid\n transition-all duration-200\n flex items-center\n `}\n style={triggerVisual}\n {...{ [DROPDOWN_TRIGGER_ATTR]: '' }}\n onClick={(e) => e.stopPropagation()}\n >\n {selectedItem?.icon && (\n <span className=\"flex shrink-0 items-center justify-center pr-2\">\n {selectedItem.icon}\n </span>\n )}\n <Tooltip text={valueText} shouldShow={isValueTruncated} isShrinkable fill>\n <div className=\"relative flex-1 flex items-center min-w-0\">\n {showValueLabel && (\n <span\n aria-hidden=\"true\"\n className=\"absolute inset-0 flex items-center pointer-events-none\"\n >\n <span\n ref={valueTextRef}\n className=\"min-w-0 block truncate text-[length:inherit]\n text-[var(--malachite-text-primary)]\"\n >\n {valueText}\n </span>\n </span>\n )}\n <input\n id={controlId}\n type=\"text\"\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledBy}\n aria-invalid={error || undefined}\n aria-required={required || undefined}\n aria-describedby={describedBy}\n value={isOpen ? searchQuery : (selectedItem?.label ?? '')}\n onChange={(e) => {\n e.stopPropagation();\n onSearchChange?.(e.target.value);\n if (!isOpen) {\n onClick();\n }\n }}\n onFocus={() => {\n onFocusOpen?.();\n }}\n onKeyDown={handleArrowDown}\n placeholder={placeholder ?? 'Select Field'}\n className={`flex-1 min-w-0 bg-transparent outline-none\n text-[length:inherit] font-normal\n placeholder:text-[var(--malachite-text-dimmed)] ${\n showValueLabel\n ? 'text-transparent'\n : 'text-[var(--malachite-text-primary)]'\n }`}\n />\n </div>\n </Tooltip>\n {hasClear && (\n <button\n type=\"button\"\n aria-label={clearLabel}\n onClick={onClear}\n className=\"flex shrink-0 items-center justify-center pl-2 cursor-pointer\n bg-transparent border-none p-0 text-[var(--malachite-text-placeholder)]\n hover:text-[var(--malachite-text-primary)] transition-colors\n rounded-full focus-visible:[outline:2px_solid_var(--malachite-text-primary)] focus-visible:outline-offset-2\"\n >\n <CloseIcon size={13} />\n </button>\n )}\n <div className=\"flex items-center justify-center pl-2\">\n {/* Mouse-only affordance: the input beside it already opens the menu on\n click and focus, so this stays out of the tab order to avoid a\n duplicate stop — but it must still be a button, not a click-handling\n span, so it is exposed and activatable rather than invisible. */}\n <button\n type=\"button\"\n tabIndex={-1}\n aria-label={isOpen ? 'Close options' : 'Open options'}\n onClick={(e) => {\n e.stopPropagation();\n onClick();\n }}\n className=\"flex items-center justify-center cursor-pointer bg-transparent border-none p-0\"\n >\n <CaretDownIcon\n size={13}\n style={{\n color: isOpen\n ? 'var(--malachite-text-primary, rgb(10, 10, 10))'\n : 'var(--malachite-text-placeholder, rgb(187, 187, 187))',\n transition: 'transform 0.2s ease, color 0.2s ease',\n transform: isOpen ? 'rotate(180deg)' : 'rotate(0deg)',\n }}\n />\n </button>\n </div>\n </div>\n );\n }\n\n const trigger = (\n <button\n ref={forwardedRef as React.Ref<HTMLButtonElement>}\n id={controlId}\n type=\"button\"\n aria-label={ariaLabel}\n aria-labelledby={labelledBy}\n aria-invalid={error || undefined}\n aria-required={required || undefined}\n aria-describedby={\n [describedBy, triggerSubtitle ? subtitleId : undefined]\n .filter(Boolean)\n .join(' ') || undefined\n }\n onClick={(e) => {\n e.stopPropagation();\n onClick();\n }}\n onKeyDown={handleArrowDown}\n disabled={disabled}\n style={triggerVisual}\n {...{ [DROPDOWN_TRIGGER_ATTR]: '' }}\n className={`\n relative w-full ${sizeClasses} ${sizeRadius}\n border border-solid\n transition-all duration-200\n flex ${stacked ? 'items-start' : 'items-center'} gap-3\n cursor-pointer\n disabled:cursor-not-allowed\n `}\n >\n {/* Spans: <button> takes phrasing content only. */}\n <span\n id={triggerSubtitle ? undefined : valueId}\n className={`text-left flex-1 min-w-0 flex ${\n triggerSubtitle ? 'flex-col gap-1' : 'items-center gap-2'\n }`}\n >\n {selectedItem ? (\n <>\n <ValueRow wrap={!!triggerSubtitle} id={valueId}>\n {selectedItem.icon && (\n <span className=\"flex items-center justify-center shrink-0\">\n {selectedItem.icon}\n </span>\n )}\n <Tooltip\n text={valueText}\n shouldShow={triggerSubtitle ? NEVER : isValueTruncated}\n triggerAs={triggerSubtitle ? 'span' : 'div'}\n isShrinkable\n >\n <span\n ref={valueTextRef}\n className={`min-w-0 block truncate text-[length:inherit] ${\n disabled\n ? 'text-[var(--malachite-text-placeholder)]'\n : 'text-[var(--malachite-text-primary)]'\n }`}\n >\n {valueText}\n </span>\n </Tooltip>\n </ValueRow>\n {triggerSubtitle && (\n <span\n id={subtitleId}\n ref={subtitleTextRef}\n className=\"min-w-0 block truncate text-[length:var(--malachite-font-size-xsmall,11px)] text-[var(--malachite-text-secondary,rgb(123,123,123))] leading-normal\"\n >\n {triggerSubtitle}\n </span>\n )}\n </>\n ) : (\n <span\n className={`flex-1 min-w-0 truncate text-[length:inherit] ${\n disabled\n ? 'text-[var(--malachite-text-placeholder)]'\n : 'text-[var(--malachite-text-dimmed)]'\n }`}\n >\n {placeholder ?? 'Select Field'}\n </span>\n )}\n </span>\n {hasClear && <span aria-hidden=\"true\" className=\"shrink-0 w-4\" />}\n <span className=\"flex items-center justify-center shrink-0\">\n <CaretDownIcon\n size={13}\n style={{\n color: isOpen\n ? 'var(--malachite-text-primary, rgb(10, 10, 10))'\n : 'var(--malachite-text-placeholder, rgb(187, 187, 187))',\n transition: 'transform 0.2s ease, color 0.2s ease',\n transform: isOpen ? 'rotate(180deg)' : 'rotate(0deg)',\n }}\n />\n </span>\n </button>\n );\n\n // The button is what takes focus, so the tooltip wraps it rather than a line inside:\n // mounted on a line it could only ever open with a pointer, and nested tooltips opened\n // together on hover. Its text is already in the trigger's name and description, so it\n // repeats it visually only. `fill`, not `isShrinkable`, whose `overflow: hidden` would\n // clip the error ring the button paints outside its border box.\n // Gated on the prop, not on there being a subtitle to show: keyed off the selection the\n // wrapper would appear on the first choice, remounting the button `focusTrigger` has\n // just handed focus back to and dropping the keyboard user at <body>.\n return showSubtitleInTrigger && !search ? (\n <Tooltip\n text={tooltipLines([\n ['value', cutLines.value && valueText],\n ['subtitle', cutLines.subtitle && triggerSubtitle],\n ])}\n shouldShow={triggerSubtitle ? measureTruncatedLines : NEVER}\n fill\n describesTrigger={false}\n >\n {trigger}\n </Tooltip>\n ) : (\n trigger\n );\n },\n);\nDropdownTrigger.displayName = 'DropdownTrigger';\n\ninterface DropdownItemComponentProps {\n item: DropdownItem;\n selected: boolean;\n subtitleLayout: SubtitleLayout;\n onItemSelected: (item: DropdownItem) => void;\n}\n\nconst DropdownItemComponent = ({\n item,\n selected,\n subtitleLayout,\n onItemSelected,\n}: DropdownItemComponentProps) => {\n const textColor = selected\n ? 'var(--malachite-accent-foreground, rgb(2, 122, 66))'\n : 'var(--malachite-text-primary, rgb(10, 10, 10))';\n const stacked = subtitleLayout === 'stacked' && !!item.subtitle;\n const optionId = `mal-${useId().replace(/[^a-zA-Z0-9_-]/g, '')}`;\n const optionLabelId = `${optionId}-label`;\n const optionSubtitleId = `${optionId}-subtitle`;\n const labelRef = useRef<HTMLSpanElement>(null);\n const subtitleRef = useRef<HTMLSpanElement>(null);\n const rightSideRef = useRef<HTMLSpanElement>(null);\n\n // Seeded all-cut: `Tooltip` skips `shouldShow` when its text is empty.\n const [cutLines, setCutLines] = useState({ label: true, subtitle: true, rightSide: true });\n const measureOptionLines = () => {\n const label = isCut(labelRef.current);\n const subtitle = isCut(subtitleRef.current);\n const rightSide = isCut(rightSideRef.current);\n if (!label && !subtitle && !rightSide) {\n return false;\n }\n setCutLines({ label, subtitle, rightSide });\n return true;\n };\n\n // Default to muted so right-side metadata (e.g. category tags) de-emphasises\n // against the primary item label. Consumers can opt back in with 'primary'.\n const rightSideTextColor =\n item.rightSideTextVariant === 'primary'\n ? 'var(--malachite-text-right-side-text-primary, rgb(10, 10, 10))'\n : 'var(--malachite-text-right-side-text-muted, rgb(123, 123, 123))';\n\n const rightSideJustify = item.rightSideTextAlignment === 'left' ? 'flex-start' : 'flex-end';\n\n const option = (\n // `role=\"option\"` would be invalid — nothing here declares a `listbox`, and an\n // orphaned option is dropped from the a11y tree. `aria-current`, not\n // `aria-pressed`: these are one-of-many choices, not toggles. tabIndex={-1}\n // because the portaled panel is outside the trigger's tab order; DropdownPanel\n // focuses an option on open and arrow keys move between them.\n <button\n type=\"button\"\n data-dropdown-option=\"\"\n data-selected={selected}\n aria-current={selected || undefined}\n // Unnamed, the option takes its name from everything inside it — a sentence-length\n // subtitle included.\n aria-labelledby={item.subtitle ? optionLabelId : undefined}\n aria-describedby={item.subtitle ? optionSubtitleId : undefined}\n tabIndex={-1}\n onClick={(e) => {\n e.stopPropagation();\n onItemSelected(item);\n }}\n className=\"malachite-dropdown-option\"\n style={{\n minHeight: 38,\n borderRadius: 8,\n display: 'flex',\n alignItems: 'center',\n padding: 10,\n gap: 12,\n cursor: 'pointer',\n transition: 'background-color 120ms ease',\n // Reset the UA button chrome. Background is deliberately absent — see PANEL_RULES.\n width: '100%',\n border: 'none',\n textAlign: 'left',\n font: 'inherit',\n color: 'inherit',\n }}\n >\n {/* Spans: <button> takes phrasing content only. */}\n <span\n style={{\n flex: 1,\n display: 'flex',\n alignItems: 'center',\n gap: 12,\n minWidth: 0,\n }}\n >\n <span style={{ flex: '1 1 auto', display: 'block', minWidth: 0 }}>\n <span\n style={\n stacked\n ? { display: 'flex', flexDirection: 'column', gap: 2 }\n : { display: 'flex', alignItems: 'center', gap: 8 }\n }\n >\n <LabelRow row={stacked && !!item.icon}>\n {item.icon && (\n <span\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n flexShrink: 0,\n }}\n >\n {item.icon}\n </span>\n )}\n <span\n id={item.subtitle ? optionLabelId : undefined}\n ref={labelRef}\n style={{\n fontWeight: 400,\n color: textColor,\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n minWidth: 0,\n }}\n >\n {item.label}\n </span>\n </LabelRow>\n {item.subtitle &&\n (stacked ? (\n <span\n id={optionSubtitleId}\n ref={subtitleRef}\n style={{\n fontSize: ANNOTATION_FONT_SIZE,\n fontWeight: 400,\n lineHeight: 1.4,\n color: selected\n ? textColor\n : 'var(--malachite-text-dimmed, rgb(161, 161, 161))',\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n }}\n >\n {item.subtitle}\n </span>\n ) : (\n <span\n style={{\n // Zero basis: the subtitle gives way before the label.\n flexGrow: 1,\n flexBasis: 0,\n display: 'flex',\n alignItems: 'center',\n gap: 8,\n minWidth: 0,\n overflow: 'hidden',\n }}\n >\n <span\n style={{\n fontSize: ANNOTATION_FONT_SIZE,\n fontWeight: 400,\n color: 'var(--malachite-text-secondary, rgb(123, 123, 123))',\n flexShrink: 0,\n }}\n >\n |\n </span>\n <span\n id={optionSubtitleId}\n ref={subtitleRef}\n style={{\n fontSize: ANNOTATION_FONT_SIZE,\n fontWeight: 400,\n color: 'var(--malachite-text-secondary, rgb(123, 123, 123))',\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n minWidth: 0,\n }}\n >\n {item.subtitle}\n </span>\n </span>\n ))}\n </span>\n </span>\n <span\n style={{\n // Reserved only when there is something to put there: an empty slot\n // still holding its width truncates the label and subtitle early.\n minWidth: item.rightSideText\n ? 'var(--malachite-text-right-side-text-min-width, 80px)'\n : 0,\n flexShrink: 1,\n display: 'flex',\n justifyContent: rightSideJustify,\n }}\n >\n {item.rightSideText && (\n <span\n ref={rightSideRef}\n style={{\n fontSize: 'var(--malachite-text-right-side-text-font-size, 12px)',\n fontWeight: 400,\n color: rightSideTextColor,\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n minWidth: 0,\n }}\n >\n {item.rightSideText}\n </span>\n )}\n </span>\n </span>\n </button>\n );\n\n // Focus lands on the option itself, and focusin does not reach a descendant, so a keyboard\n // user could never open a tooltip mounted inside it.\n return (\n <Tooltip\n text={tooltipLines([\n ['label', cutLines.label && item.label],\n ['subtitle', cutLines.subtitle && item.subtitle],\n ['rightSide', cutLines.rightSide && item.rightSideText],\n ])}\n shouldShow={measureOptionLines}\n isShrinkable\n describesTrigger={false}\n >\n {option}\n </Tooltip>\n );\n};\n\ninterface DropdownPanelProps {\n items: DropdownItem[];\n onItemSelected: (item?: DropdownItem) => void;\n selectedItem: DropdownItem | undefined;\n menuLoading?: boolean;\n emptyMessage: string;\n /** Focus an option on open. False in search mode, where the input keeps focus. */\n autoFocus: boolean;\n /** Panel has been measured. It renders `visibility: hidden` until then, and a\n * hidden element cannot take focus, so open-time focus has to wait for this. */\n positioned: boolean;\n /** Close the panel and hand focus back to the trigger. */\n onDismiss: () => void;\n subtitleLayout: SubtitleLayout;\n size: DropdownSize;\n}\n\nconst DropdownPanel = React.forwardRef<\n HTMLDivElement,\n DropdownPanelProps & { style?: React.CSSProperties }\n>((props, ref) => {\n const {\n items,\n onItemSelected,\n selectedItem,\n menuLoading,\n emptyMessage,\n autoFocus,\n positioned,\n onDismiss,\n subtitleLayout,\n size,\n style,\n } = props;\n const panelRef = useRef<HTMLDivElement | null>(null);\n\n // The panel only mounts while open, so no condition. useInsertionEffect, not layout:\n // it runs before the DOM mutation, so the rules are in place before the rows are inserted.\n useInsertionEffect(() => {\n ensureDropdownPanelStyles();\n }, []);\n\n useTopLayer(panelRef, true);\n\n // Start on the selected option so Enter re-confirms the current value. Not keyed on\n // `items`: re-running as the filtered list changes would yank focus back to the top.\n useEffect(() => {\n if (!autoFocus || !positioned) {\n return;\n }\n const options = panelOptions(panelRef.current);\n const selected = options.find((option) => option.dataset.selected === 'true');\n // Falls back to the panel: with no options nothing else can hold focus, and Tab-dismiss\n // only fires from inside it.\n (selected ?? options[0] ?? panelRef.current)?.focus();\n }, [autoFocus, positioned]);\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLDivElement>): void => {\n // The panel is portaled to document.body, so the browser's next tab stop bears no\n // relation to the trigger. Dismissing restores trigger focus so Tab resumes there.\n if (event.key === 'Tab') {\n onDismiss();\n return;\n }\n const options = panelOptions(panelRef.current);\n if (options.length === 0) {\n return;\n }\n const current = options.indexOf(document.activeElement as HTMLElement);\n const target = {\n ArrowDown: current + 1,\n ArrowUp: current - 1,\n Home: 0,\n End: options.length - 1,\n }[event.key];\n if (target === undefined) {\n return;\n }\n event.preventDefault();\n options[Math.min(Math.max(target, 0), options.length - 1)]?.focus();\n };\n\n // Inline styles, not Tailwind: this portals into document.body, outside the\n // Shadow DOM the malachite stylesheet is adopted into.\n return (\n <div\n ref={(node) => {\n panelRef.current = node;\n if (typeof ref === 'function') {\n ref(node);\n } else if (ref) {\n ref.current = node;\n }\n }}\n {...overlayIdentity('dropdown')}\n tabIndex={-1}\n onKeyDown={handleKeyDown}\n style={{\n background: MENU_SPECS.standard.background,\n border: MENU_SPECS.standard.border,\n borderRadius: MENU_SPECS.standard.radius,\n boxShadow: MENU_SPECS.standard.shadow,\n maxHeight: MENU_MAX_HEIGHT_PX,\n overflow: 'hidden',\n display: 'flex',\n flexDirection: 'column',\n fontSize: CONTROL_TEXT_SIZE[size],\n ...style,\n }}\n >\n {menuLoading ? (\n <div style={PANEL_MESSAGE_STYLE}>\n <Spinner size=\"xxxsmall\" />\n <span>Loading…</span>\n </div>\n ) : items.length === 0 ? (\n <div style={PANEL_MESSAGE_STYLE}>{emptyMessage}</div>\n ) : (\n <div\n style={{\n display: 'flex',\n flexDirection: 'column',\n gap: 4,\n padding: MENU_SPECS.standard.padding,\n overflowY: 'auto',\n scrollbarWidth: 'thin',\n scrollbarColor:\n 'var(--malachite-text-placeholder, rgb(187, 187, 187)) transparent',\n }}\n >\n {items.map((item, index) => {\n const prev = items[index - 1];\n const showGroupHeader =\n !!item.group && (!prev || prev.group !== item.group);\n return (\n <div key={item.id} style={{ flexShrink: 0 }}>\n {showGroupHeader && (\n <div\n style={{\n padding: '6px 10px 4px',\n fontSize: 12,\n fontWeight: 500,\n color: 'var(--malachite-text-secondary, rgb(123, 123, 123))',\n textTransform: 'none',\n userSelect: 'none',\n }}\n >\n {item.group}\n </div>\n )}\n <DropdownItemComponent\n item={item}\n onItemSelected={onItemSelected}\n subtitleLayout={subtitleLayout}\n selected={item.id === selectedItem?.id || false}\n />\n </div>\n );\n })}\n </div>\n )}\n </div>\n );\n});\nDropdownPanel.displayName = 'DropdownPanel';\n\nexport const Dropdown = ({\n items,\n onItemSelected,\n defaultValue,\n value,\n disabled = false,\n error,\n tone,\n label,\n hint,\n rightSideContent,\n tooltip,\n name,\n required = false,\n requiredIndicator,\n loading,\n menuLoading,\n formControl,\n description,\n helperText,\n placeholder,\n search = false,\n showSubtitleInTrigger = false,\n subtitleLayout = 'inline',\n clearable = false,\n size = 'large',\n fullWidth = false,\n width,\n minWidth,\n id,\n 'aria-label': ariaLabel,\n 'aria-labelledby': ariaLabelledBy,\n}: DropdownProps) => {\n const { controlId, labelId, descriptionId, hintId, helperTextId } = useFormFieldIds({\n id,\n label,\n description,\n hint,\n helperText: true,\n });\n const [isOpen, setIsOpen] = useState(false);\n // The id, never the resolved item: a cached object goes stale when `items` is rebuilt.\n const [ownValue, setOwnValue] = useState(defaultValue);\n const selectedId = value ?? ownValue;\n const selectedItem = items.find((item) => item.id === selectedId);\n const showClear = clearable && selectedId !== undefined && selectedId !== '' && !disabled;\n const triggerIsStacked = showSubtitleInTrigger && !search && !!selectedItem?.subtitle;\n const clearLabel = `Clear ${label ?? placeholder ?? 'selection'}`;\n\n // `defaultValue` only seeds the state, so a later change has to be pushed in.\n const lastDefaultValueRef = useRef(defaultValue);\n useEffect(() => {\n if (lastDefaultValueRef.current === defaultValue) {\n return;\n }\n lastDefaultValueRef.current = defaultValue;\n setOwnValue(defaultValue);\n }, [defaultValue]);\n const [searchQuery, setSearchQuery] = useState('');\n // Search mode only: set when the panel is opened by ArrowDown, so focus follows the\n // user into the list on mount instead of staying in the input.\n const [focusPanelOnOpen, setFocusPanelOnOpen] = useState(false);\n const dropdownRef = useRef<HTMLDivElement>(null);\n const triggerRef = useRef<HTMLElement>(null);\n const panelRef = useRef<HTMLDivElement>(null);\n const [panelPosition, setPanelPosition] = useState<MenuGeometry | null>(null);\n\n const reopenOnFocusRef = useRef(true);\n\n // In search mode the trigger is a wrapper div; the focusable part is the input.\n const focusTrigger = useCallback(() => {\n const trigger = triggerRef.current;\n if (!trigger) {\n return;\n }\n (trigger instanceof HTMLButtonElement\n ? trigger\n : trigger.querySelector<HTMLElement>('input')\n )?.focus();\n }, []);\n\n const handleClear = useCallback(\n (event: React.MouseEvent<HTMLButtonElement>) => {\n event.stopPropagation();\n setOwnValue(undefined);\n // The resolver is told the empty this form started the field at; the public\n // callback keeps reporting `undefined` whatever shape that is.\n reportSelectionRef.current?.(reportEmptyRef.current);\n onItemSelected?.(undefined);\n\n if (search) {\n reopenOnFocusRef.current = false;\n }\n focusTrigger();\n },\n [onItemSelected, search, focusTrigger],\n );\n\n const updatePanelPosition = useCallback(() => {\n const trigger = triggerRef.current;\n if (!trigger) return;\n\n setPanelPosition(\n measureMenuGeometry(panelRef.current, {\n triggerRect: trigger.getBoundingClientRect(),\n preset: 'standard',\n minWidth,\n viewportWidth: window.innerWidth,\n viewportHeight: window.innerHeight,\n }),\n );\n }, [minWidth]);\n\n useEffect(() => {\n if (!isOpen) {\n setPanelPosition(null);\n setFocusPanelOnOpen(false);\n return;\n }\n updatePanelPosition();\n const handleClickOutside = (event: MouseEvent) => {\n const path = event.composedPath();\n const trigger = dropdownRef.current;\n const panel = panelRef.current;\n const inTrigger = !!trigger && path.includes(trigger);\n const inPanel = !!panel && path.includes(panel);\n if (!inTrigger && !inPanel) {\n setIsOpen(false);\n if (search) {\n setSearchQuery('');\n }\n // Closing unmounts whatever option held focus, so the focusout the wrapper\n // below listens for never fires. Clicking away from an open menu is the one\n // way of leaving the field that has to report the blur itself.\n reportBlurRef.current?.();\n }\n };\n // ESC via the shared layer stack: closes only the topmost overlay. Focus is\n // restored explicitly — unmounting the option it sits on would drop it to <body>.\n const popEscapeLayer = pushEscapeLayer(() => {\n setIsOpen(false);\n if (search) {\n setSearchQuery('');\n }\n focusTrigger();\n });\n const handleScrollOrResize = () => updatePanelPosition();\n\n // `scroll` is not composed: a window listener never hears a scroller inside a\n // consumer's shadow root, so the trigger's rect is tracked instead.\n let frame = 0;\n let lastRect = '';\n const followTrigger = () => {\n const trigger = triggerRef.current;\n if (trigger) {\n const rect = trigger.getBoundingClientRect();\n\n if (isTriggerOffscreen(rect, window.innerWidth, window.innerHeight)) {\n setIsOpen(false);\n if (search) {\n setSearchQuery('');\n }\n return;\n }\n\n const signature = rectSignature(rect);\n if (signature !== lastRect) {\n lastRect = signature;\n updatePanelPosition();\n }\n }\n frame = requestAnimationFrame(followTrigger);\n };\n frame = requestAnimationFrame(followTrigger);\n\n document.addEventListener('mousedown', handleClickOutside);\n window.addEventListener('scroll', handleScrollOrResize, true);\n window.addEventListener('resize', handleScrollOrResize);\n return () => {\n cancelAnimationFrame(frame);\n document.removeEventListener('mousedown', handleClickOutside);\n popEscapeLayer();\n window.removeEventListener('scroll', handleScrollOrResize, true);\n window.removeEventListener('resize', handleScrollOrResize);\n };\n }, [isOpen, search, updatePanelPosition, focusTrigger]);\n\n useLayoutEffect(() => {\n if (!isOpen) {\n return;\n }\n updatePanelPosition();\n\n const panel = panelRef.current;\n if (!panel || typeof ResizeObserver === 'undefined') {\n return;\n }\n const observer = new ResizeObserver(() => updatePanelPosition());\n observer.observe(panel);\n return () => observer.disconnect();\n }, [isOpen, updatePanelPosition]);\n\n const reportSelectionRef = useRef<((value: unknown) => void) | undefined>(undefined);\n const reportBlurRef = useRef<(() => void) | undefined>(undefined);\n const reportEmptyRef = useRef<unknown>('');\n\n const handleItemSelected = (item?: DropdownItem) => {\n setOwnValue(item?.id);\n reportSelectionRef.current?.(item?.id ?? reportEmptyRef.current);\n setIsOpen(false);\n if (search) {\n setSearchQuery('');\n // Focus returns to the search input, whose focus handler would reopen the panel.\n reopenOnFocusRef.current = false;\n }\n onItemSelected?.(item?.id);\n focusTrigger();\n };\n\n const dismissPanel = () => {\n setIsOpen(false);\n if (search) {\n setSearchQuery('');\n }\n focusTrigger();\n };\n\n // ArrowDown is the \"take me into the list\" gesture. When it also opens the panel the\n // intent carries over to the mount, so it doesn't cost a second press in search mode.\n const enterPanel = () => {\n const first = panelOptions(panelRef.current)[0];\n if (first) {\n first.focus();\n return;\n }\n setFocusPanelOnOpen(true);\n setIsOpen(true);\n };\n\n const visibleItems =\n search && searchQuery ? items.filter((item) => matchesSearch(item, searchQuery)) : items;\n\n return (\n <BaseFormComponent\n fullWidth={fullWidth}\n label={label}\n hint={hint}\n rightSideContent={rightSideContent}\n tooltip={tooltip}\n name={name}\n required={required}\n requiredIndicator={requiredIndicator}\n loading={loading}\n formControl={formControl}\n description={description}\n controlId={controlId}\n labelId={labelId}\n descriptionId={descriptionId}\n hintId={hintId}\n loadingComponent={\n width === undefined ? (\n <LoadingInput\n heightClass={TRIGGER_SIZE_HEIGHT[size]}\n helperText={!!helperText}\n helperTextMarginTop\n />\n ) : (\n <div style={controlWidthStyle(width)}>\n <LoadingInput\n heightClass={TRIGGER_SIZE_HEIGHT[size]}\n helperText={!!helperText}\n helperTextMarginTop\n />\n </div>\n )\n }\n >\n {({ error: fieldError, message, onFieldChange, onFieldBlur, emptyValue }) => {\n reportSelectionRef.current = onFieldChange;\n reportBlurRef.current = onFieldBlur;\n reportEmptyRef.current = emptyValue;\n const isError = error ?? fieldError;\n // `error={false}` opts out of the resolver entirely, message included: a screen\n // that has dealt with the rejection its own way would otherwise keep reporting it.\n // The message is its own line rather than a replacement for the helper text,\n // matching Input and TextArea: a field that explains what it wants still has to\n // say why what was chosen was rejected.\n const errorMessage = error === false ? undefined : message;\n const errorMessageId = `${helperTextId}-error`;\n const describedBy =\n [\n descriptionId,\n hintId,\n helperText ? helperTextId : undefined,\n errorMessage ? errorMessageId : undefined,\n ]\n .filter(Boolean)\n .join(' ') || undefined;\n\n return (\n <>\n <div\n ref={dropdownRef}\n className={`relative w-full`}\n style={controlWidthStyle(width)}\n // Only leaving the field altogether is a blur `mode: 'onBlur'` should\n // hear. The panel is portaled to the body, so containment has to be\n // asked of it separately — otherwise opening the menu reads as\n // leaving, and the form validates before anything has been chosen.\n onBlur={(event) => {\n const next = event.relatedTarget as Node | null;\n const staysInField =\n event.currentTarget.contains(next) ||\n panelRef.current?.contains(next) === true;\n\n if (!staysInField) {\n reportBlurRef.current?.();\n }\n }}\n >\n {showClear && !search && (\n <button\n type=\"button\"\n onClick={handleClear}\n aria-label={clearLabel}\n className={`absolute ${\n triggerIsStacked\n ? CLEAR_STACKED_TOP_CLASSES[size]\n : 'top-1/2 -translate-y-1/2'\n } z-10 flex items-center\n justify-center rounded-full text-[var(--malachite-text-placeholder)]\n hover:text-[var(--malachite-text-primary)] transition-colors\n focus-visible:[outline:2px_solid_var(--malachite-text-primary)] focus-visible:outline-offset-2 ${CLEAR_OFFSET_CLASSES[size]}`}\n >\n <CloseIcon size={13} />\n </button>\n )}\n <DropdownTrigger\n hasClear={showClear}\n onClear={handleClear}\n clearLabel={clearLabel}\n ref={triggerRef as React.Ref<HTMLElement>}\n isOpen={isOpen}\n onClick={() => !disabled && setIsOpen(!isOpen)}\n selectedItem={selectedItem}\n disabled={disabled}\n error={isError}\n tone={tone}\n placeholder={placeholder}\n search={search}\n showSubtitleInTrigger={showSubtitleInTrigger}\n searchQuery={searchQuery}\n onSearchChange={setSearchQuery}\n onFocusOpen={() => {\n if (!reopenOnFocusRef.current) {\n reopenOnFocusRef.current = true;\n return;\n }\n setIsOpen(true);\n }}\n onArrowDown={() => {\n if (!disabled) {\n enterPanel();\n }\n }}\n size={size}\n controlId={controlId}\n hasCallerId={!!id}\n labelId={labelId}\n describedBy={describedBy}\n required={required}\n ariaLabel={ariaLabel}\n ariaLabelledBy={ariaLabelledBy}\n />\n {isOpen &&\n createPortal(\n <DropdownPanel\n ref={panelRef}\n style={{\n position: 'fixed',\n top: panelPosition?.top ?? 0,\n left: panelPosition?.left ?? 0,\n width: panelPosition?.width,\n maxHeight: panelPosition?.maxHeight,\n visibility: panelPosition ? 'visible' : 'hidden',\n opacity: panelPosition ? 1 : 0,\n }}\n items={visibleItems}\n onItemSelected={handleItemSelected}\n selectedItem={selectedItem}\n menuLoading={menuLoading}\n emptyMessage={\n items.length === 0\n ? 'No options available'\n : 'No results found'\n }\n subtitleLayout={subtitleLayout}\n size={size}\n autoFocus={!search || focusPanelOnOpen}\n positioned={panelPosition !== null}\n onDismiss={dismissPanel}\n />,\n document.body,\n )}\n </div>\n {helperText && (\n <div\n id={helperTextId}\n className=\"mt-1 text-[length:var(--malachite-font-size-small,13px)] text-left pl-2 text-[var(--malachite-text-dimmed,rgb(161,161,161))]\"\n >\n {helperText}\n </div>\n )}\n <FieldMessage id={errorMessageId} message={errorMessage} spaced />\n </>\n );\n }}\n </BaseFormComponent>\n );\n};\n\nexport default Dropdown;\n"],"names":["PANEL_MESSAGE_STYLE","ANNOTATION_FONT_SIZE","OPTION_SELECTOR","panelOptions","panel","matchesSearch","item","query","q","labelMatches","subtitleMatches","rightSideTextMatches","TRIGGER_SIZE_HEIGHT","TRIGGER_SIZE_CLASSES","CONTROL_TEXT_SIZE_CLASS","TRIGGER_SIZE_STACKED_CLASSES","CLEAR_OFFSET_CLASSES","CLEAR_STACKED_TOP_CLASSES","TRIGGER_SIZE_RADIUS","NEVER","isCut","el","TOOLTIP_LINES_STYLE","tooltipLines","lines","shown","text","_a","slot","jsx","ValueRow","wrap","id","children","Fragment","LabelRow","row","DropdownTrigger","React","isOpen","onClick","selectedItem","disabled","error","tone","placeholder","search","showSubtitleInTrigger","searchQuery","onSearchChange","onFocusOpen","onArrowDown","size","hasClear","onClear","clearLabel","controlId","labelId","describedBy","required","ariaLabel","ariaLabelledBy","hasCallerId","forwardedRef","stacked","sizeClasses","sizeRadius","valueId","subtitleId","namesItself","labelledBy","handleArrowDown","event","valueTextRef","useRef","subtitleTextRef","triggerVisual","getTriggerVisual","showValueLabel","valueText","triggerSubtitle","isValueTruncated","cutLines","setCutLines","useState","measureTruncatedLines","value","subtitle","jsxs","DROPDOWN_TRIGGER_ATTR","e","Tooltip","CloseIcon","CaretDownIcon","trigger","DropdownItemComponent","selected","subtitleLayout","onItemSelected","textColor","optionId","useId","optionLabelId","optionSubtitleId","labelRef","subtitleRef","rightSideRef","measureOptionLines","label","rightSide","rightSideTextColor","rightSideJustify","option","DropdownPanel","props","ref","items","menuLoading","emptyMessage","autoFocus","positioned","onDismiss","style","panelRef","useInsertionEffect","ensureDropdownPanelStyles","useTopLayer","useEffect","options","handleKeyDown","current","target","node","overlayIdentity","MENU_SPECS","MENU_MAX_HEIGHT_PX","CONTROL_TEXT_SIZE","Spinner","index","prev","showGroupHeader","Dropdown","defaultValue","hint","rightSideContent","tooltip","name","requiredIndicator","loading","formControl","description","helperText","clearable","fullWidth","width","minWidth","descriptionId","hintId","helperTextId","useFormFieldIds","setIsOpen","ownValue","setOwnValue","selectedId","showClear","triggerIsStacked","lastDefaultValueRef","setSearchQuery","focusPanelOnOpen","setFocusPanelOnOpen","dropdownRef","triggerRef","panelPosition","setPanelPosition","reopenOnFocusRef","focusTrigger","useCallback","handleClear","reportSelectionRef","reportEmptyRef","updatePanelPosition","measureMenuGeometry","handleClickOutside","path","inTrigger","inPanel","reportBlurRef","popEscapeLayer","pushEscapeLayer","handleScrollOrResize","frame","lastRect","followTrigger","rect","isTriggerOffscreen","signature","rectSignature","useLayoutEffect","observer","handleItemSelected","dismissPanel","enterPanel","first","visibleItems","BaseFormComponent","LoadingInput","controlWidthStyle","fieldError","message","onFieldChange","onFieldBlur","emptyValue","isError","errorMessage","errorMessageId","next","_b","createPortal","FieldMessage"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Dropdown.js","sources":["../../src/components/Dropdown.tsx"],"sourcesContent":["import React, {\n useId,\n useState,\n useRef,\n useEffect,\n useInsertionEffect,\n useLayoutEffect,\n useCallback,\n} from 'react';\nimport { createPortal } from 'react-dom';\nimport { Control, FieldPath, FieldValues } from 'react-hook-form';\nimport BaseFormComponent, {\n type RequiredIndicator,\n type RightSideContent,\n useFormFieldIds,\n} from './BaseFormComponent';\nimport CaretDownIcon from './CustomIcons/CaretDownIcon';\nimport CloseIcon from './CustomIcons/CloseIcon';\nimport FieldMessage from './FieldMessage';\nimport LoadingInput from './LoadingInput';\nimport Spinner from './Spinner';\nimport Tooltip from './Tooltip';\nimport { CONTROL_TEXT_SIZE, CONTROL_TEXT_SIZE_CLASS } from './controlTextSize';\nimport { controlWidthStyle } from './controlWidth';\nimport { DROPDOWN_TRIGGER_ATTR, type DropdownTone, getTriggerVisual } from './dropdownTriggerStyle';\nimport { pushEscapeLayer } from './escapeLayers';\nimport {\n MENU_MAX_HEIGHT_PX,\n MENU_SPECS,\n type MenuGeometry,\n isTriggerOffscreen,\n measureMenuGeometry,\n rectSignature,\n} from './floatingMenuGeometry';\nimport { ensureDropdownPanelStyles } from './optionRowStyles';\nimport { overlayIdentity } from './portalOverlay';\nimport { useTopLayer } from './topLayer';\nimport { isCut, tooltipLines } from './truncatedLines';\n\nexport type { DropdownTone };\n\nexport interface DropdownItem {\n id: string;\n label: string;\n icon?: React.ReactNode;\n /** Alternate label shown in the closed trigger when selected (falls back to `label`). */\n triggerLabel?: string;\n /** Items sharing a `group` render under a section header, in first-seen order. */\n group?: string;\n subtitle?: string;\n rightSideText?: string;\n rightSideTextVariant?: 'muted' | 'primary';\n rightSideTextAlignment?: 'left' | 'right';\n}\n\ninterface DropdownBaseProps {\n label?: string;\n hint?: string;\n rightSideContent?: RightSideContent;\n tooltip?: string;\n name: FieldPath<FieldValues> | string;\n loading?: boolean;\n menuLoading?: boolean;\n items: DropdownItem[];\n onItemSelected?: (id?: string) => void;\n defaultValue?: string;\n /** Controlled selection. When set, the trigger always reflects this id and the component\n * keeps no selection state of its own. Pass it with `onItemSelected`. */\n value?: string;\n disabled?: boolean;\n error?: boolean;\n /** `pending` marks a value the user still has to supply. Outranks open and selection. */\n tone?: DropdownTone;\n className?: string;\n formControl?: Control<FieldValues, unknown>;\n description?: string;\n required?: boolean;\n requiredIndicator?: RequiredIndicator;\n helperText?: React.ReactNode;\n placeholder?: string;\n subtitleLayout?: SubtitleLayout;\n /** Adds a clear control to the trigger, reported as `onItemSelected(undefined)`. */\n clearable?: boolean;\n /** 'large' (42px) for form inputs; 'medium' (32px) for toolbar chips; 'small' (28px) beside a title. */\n size?: DropdownSize;\n fullWidth?: boolean;\n width?: string | number;\n /**\n * Raises the open menu's floor above the shared 160px one, without widening the trigger.\n * For a control pinned narrow by its column — a role picker in a 160px cell, a member\n * picker in a 200px slot — whose options carry a subtitle the trigger never has to show.\n */\n minWidth?: number;\n /** Names the trigger from the light DOM, where `htmlFor` cannot reach into the shadow root. */\n id?: string;\n 'aria-label'?: string;\n 'aria-labelledby'?: string;\n}\n\n/**\n * The search trigger is a single-line text input with nowhere for a second line, so\n * `showSubtitleInTrigger` is rejected alongside `search` rather than silently ignored.\n */\ntype DropdownTriggerModeProps =\n | {\n search?: false;\n /** Promotes the selected item's `subtitle` into the closed trigger, beneath the value. */\n showSubtitleInTrigger?: boolean;\n }\n | { search: true; showSubtitleInTrigger?: never };\n\nexport type DropdownProps = DropdownBaseProps & DropdownTriggerModeProps;\n\n/**\n * Matches Button and the Figma component library: 28 / 32 / 42px. These names moved up a\n * tier in 0.71 — what was `xsmall`/`small`/`medium` is now `small`/`medium`/`large`.\n */\nexport type DropdownSize = 'small' | 'medium' | 'large';\n\nexport type SubtitleLayout = 'inline' | 'stacked';\n\nconst PANEL_MESSAGE_STYLE: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: 8,\n padding: '24px 16px',\n color: 'var(--malachite-text-dimmed, rgb(161, 161, 161))',\n};\n\n// Figma pins the option's inline annotation at 11px on every tier — unlike the label,\n// it does not ride the ladder (Item Large 68:2617, Item Medium 2343:2134).\nconst ANNOTATION_FONT_SIZE = 'var(--malachite-font-size-xsmall, 11px)';\n\nconst OPTION_SELECTOR = '[data-dropdown-option]';\n\nconst panelOptions = (panel: HTMLElement | null): HTMLElement[] =>\n Array.from(panel?.querySelectorAll<HTMLElement>(OPTION_SELECTOR) ?? []);\n\nconst matchesSearch = (item: DropdownItem, query: string) => {\n const q = query.toLowerCase();\n const labelMatches = item.label.toLowerCase().includes(q);\n const subtitleMatches = item.subtitle ? item.subtitle.toLowerCase().includes(q) : false;\n const rightSideTextMatches = item.rightSideText\n ? item.rightSideText.toLowerCase().includes(q)\n : false;\n return labelMatches || subtitleMatches || rightSideTextMatches;\n};\n\nconst TRIGGER_SIZE_HEIGHT: Record<DropdownSize, string> = {\n small: 'h-[var(--malachite-control-height-small,28px)]',\n medium: 'h-[var(--malachite-control-height-medium,32px)]',\n large: 'h-[var(--malachite-control-height-large,42px)]',\n};\n\nconst TRIGGER_SIZE_CLASSES: Record<DropdownSize, string> = {\n small: `${TRIGGER_SIZE_HEIGHT.small} px-2.5 py-1.5 ${CONTROL_TEXT_SIZE_CLASS.small}`,\n medium: `${TRIGGER_SIZE_HEIGHT.medium} px-3 py-1.5 ${CONTROL_TEXT_SIZE_CLASS.medium}`,\n large: `${TRIGGER_SIZE_HEIGHT.large} px-4 py-2.5 ${CONTROL_TEXT_SIZE_CLASS.large}`,\n};\n\nconst TRIGGER_SIZE_STACKED_CLASSES: Record<DropdownSize, string> = {\n small: `min-h-[var(--malachite-control-height-small,28px)] px-2.5 py-1.5 ${CONTROL_TEXT_SIZE_CLASS.small}`,\n medium: `min-h-[var(--malachite-control-height-medium,32px)] px-3 py-1.5 ${CONTROL_TEXT_SIZE_CLASS.medium}`,\n large: `min-h-[var(--malachite-control-height-large,42px)] px-4 py-2.5 ${CONTROL_TEXT_SIZE_CLASS.large}`,\n};\n\nconst CLEAR_OFFSET_CLASSES: Record<DropdownSize, string> = {\n small: 'right-[26px] size-4',\n medium: 'right-[30px] size-4',\n large: 'right-[38px] size-4',\n};\n\nconst CLEAR_STACKED_TOP_CLASSES: Record<DropdownSize, string> = {\n small: 'top-[calc(var(--malachite-control-height-small,28px)/2)] -translate-y-1/2',\n medium: 'top-[calc(var(--malachite-control-height-medium,32px)/2)] -translate-y-1/2',\n large: 'top-[calc(var(--malachite-control-height-large,42px)/2)] -translate-y-1/2',\n};\n\n// Radius tracks the tier in Figma: 10 / 12 / 14. Only 12 has a --malachite-radius-* rung.\nconst TRIGGER_SIZE_RADIUS: Record<DropdownSize, string> = {\n small: 'rounded-[var(--malachite-radius-10,10px)]',\n medium: 'rounded-xl',\n large: 'rounded-[var(--malachite-radius-xxl,14px)]',\n};\n\nconst NEVER = () => false;\n\nconst ValueRow: React.FC<{ wrap: boolean; id?: string; children: React.ReactNode }> = ({\n wrap,\n id,\n children,\n}) =>\n wrap ? (\n <span id={id} className=\"min-w-0 flex items-center gap-2\">\n {children}\n </span>\n ) : (\n <>{children}</>\n );\n\nconst LabelRow: React.FC<{ row: boolean; children: React.ReactNode }> = ({ row, children }) =>\n row ? (\n <span style={{ display: 'flex', alignItems: 'center', gap: 8, minWidth: 0 }}>\n {children}\n </span>\n ) : (\n <>{children}</>\n );\n\ninterface DropdownTriggerProps {\n isOpen: boolean;\n onClick: () => void;\n selectedItem: DropdownItem | undefined;\n hasClear?: boolean;\n onClear?: (event: React.MouseEvent<HTMLButtonElement>) => void;\n clearLabel?: string;\n disabled?: boolean;\n error?: boolean;\n tone?: DropdownTone;\n placeholder?: string;\n search?: boolean;\n showSubtitleInTrigger?: boolean;\n searchQuery?: string;\n onSearchChange?: (value: string) => void;\n onFocusOpen?: () => void;\n /** ArrowDown on the trigger: opens the menu, or steps into it if already open. */\n onArrowDown?: () => void;\n size?: DropdownSize;\n controlId: string;\n labelId?: string;\n describedBy?: string;\n required?: boolean;\n ariaLabel?: string;\n ariaLabelledBy?: string;\n /** A caller-supplied id means an external `<label for>` may be naming the control. */\n hasCallerId?: boolean;\n}\n\nconst DropdownTrigger = React.forwardRef<HTMLElement, DropdownTriggerProps>(\n (\n {\n isOpen,\n onClick,\n selectedItem,\n disabled = false,\n error = false,\n tone,\n placeholder,\n search = false,\n showSubtitleInTrigger = false,\n searchQuery = '',\n onSearchChange,\n onFocusOpen,\n onArrowDown,\n size = 'large',\n hasClear = false,\n onClear,\n clearLabel,\n controlId,\n labelId,\n describedBy,\n required = false,\n ariaLabel,\n ariaLabelledBy,\n hasCallerId = false,\n },\n forwardedRef,\n ) => {\n const stacked = showSubtitleInTrigger && !search && !!selectedItem?.subtitle;\n const sizeClasses = stacked\n ? TRIGGER_SIZE_STACKED_CLASSES[size]\n : TRIGGER_SIZE_CLASSES[size];\n const sizeRadius = TRIGGER_SIZE_RADIUS[size];\n const valueId = `${controlId}-value`;\n const subtitleId = `${controlId}-subtitle`;\n // aria-labelledby outranks aria-label in the accessible-name algorithm, so the\n // generated label+value pair has to be dropped for a caller's aria-label to apply.\n // Named off nothing, the button takes its name from every descendant — the subtitle\n // included, which `aria-describedby` then repeats. Naming it off the value alone fixes\n // that, but only where nothing else already names the control.\n const namesItself = !labelId && !ariaLabel && !hasCallerId && stacked;\n const labelledBy =\n ariaLabelledBy ??\n (labelId && !ariaLabel ? `${labelId} ${valueId}` : undefined) ??\n (namesItself ? valueId : undefined);\n\n const handleArrowDown = (event: React.KeyboardEvent): void => {\n if (event.key !== 'ArrowDown') {\n return;\n }\n event.preventDefault();\n onArrowDown?.();\n };\n\n const valueTextRef = useRef<HTMLSpanElement>(null);\n const subtitleTextRef = useRef<HTMLSpanElement>(null);\n const triggerVisual = getTriggerVisual({ disabled, error, tone, open: isOpen });\n const showValueLabel = !isOpen && !!selectedItem;\n const valueText = selectedItem?.triggerLabel ?? selectedItem?.label;\n const triggerSubtitle = stacked ? selectedItem?.subtitle : undefined;\n const isValueTruncated = () => isCut(valueTextRef.current);\n\n // A tooltip reads its text at render, but which line is cut off is only knowable on\n // hover — so the one measurement pass that decides whether to show also records what\n // to say. The initial value never shows: untruncated, the tooltip refuses to open.\n const [cutLines, setCutLines] = useState({ value: false, subtitle: true });\n const measureTruncatedLines = () => {\n const value = isValueTruncated();\n const subtitle = isCut(subtitleTextRef.current);\n if (!value && !subtitle) {\n return false;\n }\n setCutLines({ value, subtitle });\n return true;\n };\n\n if (search && !disabled) {\n return (\n <div\n ref={forwardedRef as React.Ref<HTMLDivElement>}\n className={`\n relative w-full ${sizeClasses} ${sizeRadius}\n border border-solid\n transition-all duration-200\n flex items-center\n `}\n style={triggerVisual}\n {...{ [DROPDOWN_TRIGGER_ATTR]: '' }}\n onClick={(e) => e.stopPropagation()}\n >\n {selectedItem?.icon && (\n <span className=\"flex shrink-0 items-center justify-center pr-2\">\n {selectedItem.icon}\n </span>\n )}\n <Tooltip text={valueText} shouldShow={isValueTruncated} isShrinkable fill>\n <div className=\"relative flex-1 flex items-center min-w-0\">\n {showValueLabel && (\n <span\n aria-hidden=\"true\"\n className=\"absolute inset-0 flex items-center pointer-events-none\"\n >\n <span\n ref={valueTextRef}\n className=\"min-w-0 block truncate text-[length:inherit]\n text-[var(--malachite-text-primary)]\"\n >\n {valueText}\n </span>\n </span>\n )}\n <input\n id={controlId}\n type=\"text\"\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledBy}\n aria-invalid={error || undefined}\n aria-required={required || undefined}\n aria-describedby={describedBy}\n value={isOpen ? searchQuery : (selectedItem?.label ?? '')}\n onChange={(e) => {\n e.stopPropagation();\n onSearchChange?.(e.target.value);\n if (!isOpen) {\n onClick();\n }\n }}\n onFocus={() => {\n onFocusOpen?.();\n }}\n onKeyDown={handleArrowDown}\n placeholder={placeholder ?? 'Select Field'}\n className={`flex-1 min-w-0 bg-transparent outline-none\n text-[length:inherit] font-normal\n placeholder:text-[var(--malachite-text-dimmed)] ${\n showValueLabel\n ? 'text-transparent'\n : 'text-[var(--malachite-text-primary)]'\n }`}\n />\n </div>\n </Tooltip>\n {hasClear && (\n <button\n type=\"button\"\n aria-label={clearLabel}\n onClick={onClear}\n className=\"flex shrink-0 items-center justify-center pl-2 cursor-pointer\n bg-transparent border-none p-0 text-[var(--malachite-text-placeholder)]\n hover:text-[var(--malachite-text-primary)] transition-colors\n rounded-full focus-visible:[outline:2px_solid_var(--malachite-text-primary)] focus-visible:outline-offset-2\"\n >\n <CloseIcon size={13} />\n </button>\n )}\n <div className=\"flex items-center justify-center pl-2\">\n {/* Mouse-only affordance: the input beside it already opens the menu on\n click and focus, so this stays out of the tab order to avoid a\n duplicate stop — but it must still be a button, not a click-handling\n span, so it is exposed and activatable rather than invisible. */}\n <button\n type=\"button\"\n tabIndex={-1}\n aria-label={isOpen ? 'Close options' : 'Open options'}\n onClick={(e) => {\n e.stopPropagation();\n onClick();\n }}\n className=\"flex items-center justify-center cursor-pointer bg-transparent border-none p-0\"\n >\n <CaretDownIcon\n size={13}\n style={{\n color: isOpen\n ? 'var(--malachite-text-primary, rgb(10, 10, 10))'\n : 'var(--malachite-text-placeholder, rgb(187, 187, 187))',\n transition: 'transform 0.2s ease, color 0.2s ease',\n transform: isOpen ? 'rotate(180deg)' : 'rotate(0deg)',\n }}\n />\n </button>\n </div>\n </div>\n );\n }\n\n const trigger = (\n <button\n ref={forwardedRef as React.Ref<HTMLButtonElement>}\n id={controlId}\n type=\"button\"\n aria-label={ariaLabel}\n aria-labelledby={labelledBy}\n aria-invalid={error || undefined}\n aria-required={required || undefined}\n aria-describedby={\n [describedBy, triggerSubtitle ? subtitleId : undefined]\n .filter(Boolean)\n .join(' ') || undefined\n }\n onClick={(e) => {\n e.stopPropagation();\n onClick();\n }}\n onKeyDown={handleArrowDown}\n disabled={disabled}\n style={triggerVisual}\n {...{ [DROPDOWN_TRIGGER_ATTR]: '' }}\n className={`\n relative w-full ${sizeClasses} ${sizeRadius}\n border border-solid\n transition-all duration-200\n flex ${stacked ? 'items-start' : 'items-center'} gap-3\n cursor-pointer\n disabled:cursor-not-allowed\n `}\n >\n {/* Spans: <button> takes phrasing content only. */}\n <span\n id={triggerSubtitle ? undefined : valueId}\n className={`text-left flex-1 min-w-0 flex ${\n triggerSubtitle ? 'flex-col gap-1' : 'items-center gap-2'\n }`}\n >\n {selectedItem ? (\n <>\n <ValueRow wrap={!!triggerSubtitle} id={valueId}>\n {selectedItem.icon && (\n <span className=\"flex items-center justify-center shrink-0\">\n {selectedItem.icon}\n </span>\n )}\n <Tooltip\n text={valueText}\n shouldShow={triggerSubtitle ? NEVER : isValueTruncated}\n triggerAs={triggerSubtitle ? 'span' : 'div'}\n isShrinkable\n >\n <span\n ref={valueTextRef}\n className={`min-w-0 block truncate text-[length:inherit] ${\n disabled\n ? 'text-[var(--malachite-text-placeholder)]'\n : 'text-[var(--malachite-text-primary)]'\n }`}\n >\n {valueText}\n </span>\n </Tooltip>\n </ValueRow>\n {triggerSubtitle && (\n <span\n id={subtitleId}\n ref={subtitleTextRef}\n className=\"min-w-0 block truncate text-[length:var(--malachite-font-size-xsmall,11px)] text-[var(--malachite-text-secondary,rgb(123,123,123))] leading-normal\"\n >\n {triggerSubtitle}\n </span>\n )}\n </>\n ) : (\n <span\n className={`flex-1 min-w-0 truncate text-[length:inherit] ${\n disabled\n ? 'text-[var(--malachite-text-placeholder)]'\n : 'text-[var(--malachite-text-dimmed)]'\n }`}\n >\n {placeholder ?? 'Select Field'}\n </span>\n )}\n </span>\n {hasClear && <span aria-hidden=\"true\" className=\"shrink-0 w-4\" />}\n <span className=\"flex items-center justify-center shrink-0\">\n <CaretDownIcon\n size={13}\n style={{\n color: isOpen\n ? 'var(--malachite-text-primary, rgb(10, 10, 10))'\n : 'var(--malachite-text-placeholder, rgb(187, 187, 187))',\n transition: 'transform 0.2s ease, color 0.2s ease',\n transform: isOpen ? 'rotate(180deg)' : 'rotate(0deg)',\n }}\n />\n </span>\n </button>\n );\n\n // The button is what takes focus, so the tooltip wraps it rather than a line inside:\n // mounted on a line it could only ever open with a pointer, and nested tooltips opened\n // together on hover. Its text is already in the trigger's name and description, so it\n // repeats it visually only. `fill`, not `isShrinkable`, whose `overflow: hidden` would\n // clip the error ring the button paints outside its border box.\n // Gated on the prop, not on there being a subtitle to show: keyed off the selection the\n // wrapper would appear on the first choice, remounting the button `focusTrigger` has\n // just handed focus back to and dropping the keyboard user at <body>.\n return showSubtitleInTrigger && !search ? (\n <Tooltip\n text={tooltipLines([\n ['value', cutLines.value && valueText],\n ['subtitle', cutLines.subtitle && triggerSubtitle],\n ])}\n shouldShow={triggerSubtitle ? measureTruncatedLines : NEVER}\n fill\n describesTrigger={false}\n >\n {trigger}\n </Tooltip>\n ) : (\n trigger\n );\n },\n);\nDropdownTrigger.displayName = 'DropdownTrigger';\n\ninterface DropdownItemComponentProps {\n item: DropdownItem;\n selected: boolean;\n subtitleLayout: SubtitleLayout;\n onItemSelected: (item: DropdownItem) => void;\n}\n\nconst DropdownItemComponent = ({\n item,\n selected,\n subtitleLayout,\n onItemSelected,\n}: DropdownItemComponentProps) => {\n const textColor = selected\n ? 'var(--malachite-accent-foreground, rgb(2, 122, 66))'\n : 'var(--malachite-text-primary, rgb(10, 10, 10))';\n const stacked = subtitleLayout === 'stacked' && !!item.subtitle;\n const optionId = `mal-${useId().replace(/[^a-zA-Z0-9_-]/g, '')}`;\n const optionLabelId = `${optionId}-label`;\n const optionSubtitleId = `${optionId}-subtitle`;\n const labelRef = useRef<HTMLSpanElement>(null);\n const subtitleRef = useRef<HTMLSpanElement>(null);\n const rightSideRef = useRef<HTMLSpanElement>(null);\n\n // Seeded all-cut: `Tooltip` skips `shouldShow` when its text is empty.\n const [cutLines, setCutLines] = useState({ label: true, subtitle: true, rightSide: true });\n const measureOptionLines = () => {\n const label = isCut(labelRef.current);\n const subtitle = isCut(subtitleRef.current);\n const rightSide = isCut(rightSideRef.current);\n if (!label && !subtitle && !rightSide) {\n return false;\n }\n setCutLines({ label, subtitle, rightSide });\n return true;\n };\n\n // Default to muted so right-side metadata (e.g. category tags) de-emphasises\n // against the primary item label. Consumers can opt back in with 'primary'.\n const rightSideTextColor =\n item.rightSideTextVariant === 'primary'\n ? 'var(--malachite-text-right-side-text-primary, rgb(10, 10, 10))'\n : 'var(--malachite-text-right-side-text-muted, rgb(123, 123, 123))';\n\n const rightSideJustify = item.rightSideTextAlignment === 'left' ? 'flex-start' : 'flex-end';\n\n const option = (\n // `role=\"option\"` would be invalid — nothing here declares a `listbox`, and an\n // orphaned option is dropped from the a11y tree. `aria-current`, not\n // `aria-pressed`: these are one-of-many choices, not toggles. tabIndex={-1}\n // because the portaled panel is outside the trigger's tab order; DropdownPanel\n // focuses an option on open and arrow keys move between them.\n <button\n type=\"button\"\n data-dropdown-option=\"\"\n data-selected={selected}\n aria-current={selected || undefined}\n // Unnamed, the option takes its name from everything inside it — a sentence-length\n // subtitle included.\n aria-labelledby={item.subtitle ? optionLabelId : undefined}\n aria-describedby={item.subtitle ? optionSubtitleId : undefined}\n tabIndex={-1}\n onClick={(e) => {\n e.stopPropagation();\n onItemSelected(item);\n }}\n className=\"malachite-dropdown-option\"\n style={{\n minHeight: 38,\n borderRadius: 8,\n display: 'flex',\n alignItems: 'center',\n padding: 10,\n gap: 12,\n cursor: 'pointer',\n transition: 'background-color 120ms ease',\n // Reset the UA button chrome. Background is deliberately absent — see PANEL_RULES.\n width: '100%',\n border: 'none',\n textAlign: 'left',\n font: 'inherit',\n color: 'inherit',\n }}\n >\n {/* Spans: <button> takes phrasing content only. */}\n <span\n style={{\n flex: 1,\n display: 'flex',\n alignItems: 'center',\n gap: 12,\n minWidth: 0,\n }}\n >\n <span style={{ flex: '1 1 auto', display: 'block', minWidth: 0 }}>\n <span\n style={\n stacked\n ? { display: 'flex', flexDirection: 'column', gap: 2 }\n : { display: 'flex', alignItems: 'center', gap: 8 }\n }\n >\n <LabelRow row={stacked && !!item.icon}>\n {item.icon && (\n <span\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n flexShrink: 0,\n }}\n >\n {item.icon}\n </span>\n )}\n <span\n id={item.subtitle ? optionLabelId : undefined}\n ref={labelRef}\n style={{\n fontWeight: 400,\n color: textColor,\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n minWidth: 0,\n }}\n >\n {item.label}\n </span>\n </LabelRow>\n {item.subtitle &&\n (stacked ? (\n <span\n id={optionSubtitleId}\n ref={subtitleRef}\n style={{\n fontSize: ANNOTATION_FONT_SIZE,\n fontWeight: 400,\n lineHeight: 1.4,\n color: selected\n ? textColor\n : 'var(--malachite-text-dimmed, rgb(161, 161, 161))',\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n }}\n >\n {item.subtitle}\n </span>\n ) : (\n <span\n style={{\n // Zero basis: the subtitle gives way before the label.\n flexGrow: 1,\n flexBasis: 0,\n display: 'flex',\n alignItems: 'center',\n gap: 8,\n minWidth: 0,\n overflow: 'hidden',\n }}\n >\n <span\n style={{\n fontSize: ANNOTATION_FONT_SIZE,\n fontWeight: 400,\n color: 'var(--malachite-text-secondary, rgb(123, 123, 123))',\n flexShrink: 0,\n }}\n >\n |\n </span>\n <span\n id={optionSubtitleId}\n ref={subtitleRef}\n style={{\n fontSize: ANNOTATION_FONT_SIZE,\n fontWeight: 400,\n color: 'var(--malachite-text-secondary, rgb(123, 123, 123))',\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n minWidth: 0,\n }}\n >\n {item.subtitle}\n </span>\n </span>\n ))}\n </span>\n </span>\n <span\n style={{\n // Reserved only when there is something to put there: an empty slot\n // still holding its width truncates the label and subtitle early.\n minWidth: item.rightSideText\n ? 'var(--malachite-text-right-side-text-min-width, 80px)'\n : 0,\n flexShrink: 1,\n display: 'flex',\n justifyContent: rightSideJustify,\n }}\n >\n {item.rightSideText && (\n <span\n ref={rightSideRef}\n style={{\n fontSize: 'var(--malachite-text-right-side-text-font-size, 12px)',\n fontWeight: 400,\n color: rightSideTextColor,\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n minWidth: 0,\n }}\n >\n {item.rightSideText}\n </span>\n )}\n </span>\n </span>\n </button>\n );\n\n // Focus lands on the option itself, and focusin does not reach a descendant, so a keyboard\n // user could never open a tooltip mounted inside it.\n return (\n <Tooltip\n text={tooltipLines([\n ['label', cutLines.label && item.label],\n ['subtitle', cutLines.subtitle && item.subtitle],\n ['rightSide', cutLines.rightSide && item.rightSideText],\n ])}\n shouldShow={measureOptionLines}\n isShrinkable\n describesTrigger={false}\n >\n {option}\n </Tooltip>\n );\n};\n\ninterface DropdownPanelProps {\n items: DropdownItem[];\n onItemSelected: (item?: DropdownItem) => void;\n selectedItem: DropdownItem | undefined;\n menuLoading?: boolean;\n emptyMessage: string;\n /** Focus an option on open. False in search mode, where the input keeps focus. */\n autoFocus: boolean;\n /** Panel has been measured. It renders `visibility: hidden` until then, and a\n * hidden element cannot take focus, so open-time focus has to wait for this. */\n positioned: boolean;\n /** Close the panel and hand focus back to the trigger. */\n onDismiss: () => void;\n subtitleLayout: SubtitleLayout;\n size: DropdownSize;\n}\n\nconst DropdownPanel = React.forwardRef<\n HTMLDivElement,\n DropdownPanelProps & { style?: React.CSSProperties }\n>((props, ref) => {\n const {\n items,\n onItemSelected,\n selectedItem,\n menuLoading,\n emptyMessage,\n autoFocus,\n positioned,\n onDismiss,\n subtitleLayout,\n size,\n style,\n } = props;\n const panelRef = useRef<HTMLDivElement | null>(null);\n\n // The panel only mounts while open, so no condition. useInsertionEffect, not layout:\n // it runs before the DOM mutation, so the rules are in place before the rows are inserted.\n useInsertionEffect(() => {\n ensureDropdownPanelStyles();\n }, []);\n\n useTopLayer(panelRef, true);\n\n // Start on the selected option so Enter re-confirms the current value. Not keyed on\n // `items`: re-running as the filtered list changes would yank focus back to the top.\n useEffect(() => {\n if (!autoFocus || !positioned) {\n return;\n }\n const options = panelOptions(panelRef.current);\n const selected = options.find((option) => option.dataset.selected === 'true');\n // Falls back to the panel: with no options nothing else can hold focus, and Tab-dismiss\n // only fires from inside it.\n (selected ?? options[0] ?? panelRef.current)?.focus();\n }, [autoFocus, positioned]);\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLDivElement>): void => {\n // The panel is portaled to document.body, so the browser's next tab stop bears no\n // relation to the trigger. Dismissing restores trigger focus so Tab resumes there.\n if (event.key === 'Tab') {\n onDismiss();\n return;\n }\n const options = panelOptions(panelRef.current);\n if (options.length === 0) {\n return;\n }\n const current = options.indexOf(document.activeElement as HTMLElement);\n const target = {\n ArrowDown: current + 1,\n ArrowUp: current - 1,\n Home: 0,\n End: options.length - 1,\n }[event.key];\n if (target === undefined) {\n return;\n }\n event.preventDefault();\n options[Math.min(Math.max(target, 0), options.length - 1)]?.focus();\n };\n\n // Inline styles, not Tailwind: this portals into document.body, outside the\n // Shadow DOM the malachite stylesheet is adopted into.\n return (\n <div\n ref={(node) => {\n panelRef.current = node;\n if (typeof ref === 'function') {\n ref(node);\n } else if (ref) {\n ref.current = node;\n }\n }}\n {...overlayIdentity('dropdown')}\n tabIndex={-1}\n onKeyDown={handleKeyDown}\n style={{\n background: MENU_SPECS.standard.background,\n border: MENU_SPECS.standard.border,\n borderRadius: MENU_SPECS.standard.radius,\n boxShadow: MENU_SPECS.standard.shadow,\n maxHeight: MENU_MAX_HEIGHT_PX,\n overflow: 'hidden',\n display: 'flex',\n flexDirection: 'column',\n fontSize: CONTROL_TEXT_SIZE[size],\n ...style,\n }}\n >\n {menuLoading ? (\n <div style={PANEL_MESSAGE_STYLE}>\n <Spinner size=\"xxxsmall\" />\n <span>Loading…</span>\n </div>\n ) : items.length === 0 ? (\n <div style={PANEL_MESSAGE_STYLE}>{emptyMessage}</div>\n ) : (\n <div\n style={{\n display: 'flex',\n flexDirection: 'column',\n gap: 4,\n padding: MENU_SPECS.standard.padding,\n overflowY: 'auto',\n scrollbarWidth: 'thin',\n scrollbarColor:\n 'var(--malachite-text-placeholder, rgb(187, 187, 187)) transparent',\n }}\n >\n {items.map((item, index) => {\n const prev = items[index - 1];\n const showGroupHeader =\n !!item.group && (!prev || prev.group !== item.group);\n return (\n <div key={item.id} style={{ flexShrink: 0 }}>\n {showGroupHeader && (\n <div\n style={{\n padding: '6px 10px 4px',\n fontSize: 12,\n fontWeight: 500,\n color: 'var(--malachite-text-secondary, rgb(123, 123, 123))',\n textTransform: 'none',\n userSelect: 'none',\n }}\n >\n {item.group}\n </div>\n )}\n <DropdownItemComponent\n item={item}\n onItemSelected={onItemSelected}\n subtitleLayout={subtitleLayout}\n selected={item.id === selectedItem?.id || false}\n />\n </div>\n );\n })}\n </div>\n )}\n </div>\n );\n});\nDropdownPanel.displayName = 'DropdownPanel';\n\nexport const Dropdown = ({\n items,\n onItemSelected,\n defaultValue,\n value,\n disabled = false,\n error,\n tone,\n label,\n hint,\n rightSideContent,\n tooltip,\n name,\n required = false,\n requiredIndicator,\n loading,\n menuLoading,\n formControl,\n description,\n helperText,\n placeholder,\n search = false,\n showSubtitleInTrigger = false,\n subtitleLayout = 'inline',\n clearable = false,\n size = 'large',\n fullWidth = false,\n width,\n minWidth,\n id,\n 'aria-label': ariaLabel,\n 'aria-labelledby': ariaLabelledBy,\n}: DropdownProps) => {\n const { controlId, labelId, descriptionId, hintId, helperTextId } = useFormFieldIds({\n id,\n label,\n description,\n hint,\n helperText: true,\n });\n const [isOpen, setIsOpen] = useState(false);\n // The id, never the resolved item: a cached object goes stale when `items` is rebuilt.\n const [ownValue, setOwnValue] = useState(defaultValue);\n const selectedId = value ?? ownValue;\n const selectedItem = items.find((item) => item.id === selectedId);\n const showClear = clearable && selectedId !== undefined && selectedId !== '' && !disabled;\n const triggerIsStacked = showSubtitleInTrigger && !search && !!selectedItem?.subtitle;\n const clearLabel = `Clear ${label ?? placeholder ?? 'selection'}`;\n\n // `defaultValue` only seeds the state, so a later change has to be pushed in.\n const lastDefaultValueRef = useRef(defaultValue);\n useEffect(() => {\n if (lastDefaultValueRef.current === defaultValue) {\n return;\n }\n lastDefaultValueRef.current = defaultValue;\n setOwnValue(defaultValue);\n }, [defaultValue]);\n const [searchQuery, setSearchQuery] = useState('');\n // Search mode only: set when the panel is opened by ArrowDown, so focus follows the\n // user into the list on mount instead of staying in the input.\n const [focusPanelOnOpen, setFocusPanelOnOpen] = useState(false);\n const dropdownRef = useRef<HTMLDivElement>(null);\n const triggerRef = useRef<HTMLElement>(null);\n const panelRef = useRef<HTMLDivElement>(null);\n const [panelPosition, setPanelPosition] = useState<MenuGeometry | null>(null);\n\n const reopenOnFocusRef = useRef(true);\n\n // In search mode the trigger is a wrapper div; the focusable part is the input.\n const focusTrigger = useCallback(() => {\n const trigger = triggerRef.current;\n if (!trigger) {\n return;\n }\n (trigger instanceof HTMLButtonElement\n ? trigger\n : trigger.querySelector<HTMLElement>('input')\n )?.focus();\n }, []);\n\n const handleClear = useCallback(\n (event: React.MouseEvent<HTMLButtonElement>) => {\n event.stopPropagation();\n setOwnValue(undefined);\n // The resolver is told the empty this form started the field at; the public\n // callback keeps reporting `undefined` whatever shape that is.\n reportSelectionRef.current?.(reportEmptyRef.current);\n onItemSelected?.(undefined);\n\n if (search) {\n reopenOnFocusRef.current = false;\n }\n focusTrigger();\n },\n [onItemSelected, search, focusTrigger],\n );\n\n const updatePanelPosition = useCallback(() => {\n const trigger = triggerRef.current;\n if (!trigger) return;\n\n setPanelPosition(\n measureMenuGeometry(panelRef.current, {\n triggerRect: trigger.getBoundingClientRect(),\n preset: 'standard',\n minWidth,\n viewportWidth: window.innerWidth,\n viewportHeight: window.innerHeight,\n }),\n );\n }, [minWidth]);\n\n useEffect(() => {\n if (!isOpen) {\n setPanelPosition(null);\n setFocusPanelOnOpen(false);\n return;\n }\n updatePanelPosition();\n const handleClickOutside = (event: MouseEvent) => {\n const path = event.composedPath();\n const trigger = dropdownRef.current;\n const panel = panelRef.current;\n const inTrigger = !!trigger && path.includes(trigger);\n const inPanel = !!panel && path.includes(panel);\n if (!inTrigger && !inPanel) {\n setIsOpen(false);\n if (search) {\n setSearchQuery('');\n }\n // Closing unmounts whatever option held focus, so the focusout the wrapper\n // below listens for never fires. Clicking away from an open menu is the one\n // way of leaving the field that has to report the blur itself.\n reportBlurRef.current?.();\n }\n };\n // ESC via the shared layer stack: closes only the topmost overlay. Focus is\n // restored explicitly — unmounting the option it sits on would drop it to <body>.\n const popEscapeLayer = pushEscapeLayer(() => {\n setIsOpen(false);\n if (search) {\n setSearchQuery('');\n }\n focusTrigger();\n });\n const handleScrollOrResize = () => updatePanelPosition();\n\n // `scroll` is not composed: a window listener never hears a scroller inside a\n // consumer's shadow root, so the trigger's rect is tracked instead.\n let frame = 0;\n let lastRect = '';\n const followTrigger = () => {\n const trigger = triggerRef.current;\n if (trigger) {\n const rect = trigger.getBoundingClientRect();\n\n if (isTriggerOffscreen(rect, window.innerWidth, window.innerHeight)) {\n setIsOpen(false);\n if (search) {\n setSearchQuery('');\n }\n return;\n }\n\n const signature = rectSignature(rect);\n if (signature !== lastRect) {\n lastRect = signature;\n updatePanelPosition();\n }\n }\n frame = requestAnimationFrame(followTrigger);\n };\n frame = requestAnimationFrame(followTrigger);\n\n document.addEventListener('mousedown', handleClickOutside);\n window.addEventListener('scroll', handleScrollOrResize, true);\n window.addEventListener('resize', handleScrollOrResize);\n return () => {\n cancelAnimationFrame(frame);\n document.removeEventListener('mousedown', handleClickOutside);\n popEscapeLayer();\n window.removeEventListener('scroll', handleScrollOrResize, true);\n window.removeEventListener('resize', handleScrollOrResize);\n };\n }, [isOpen, search, updatePanelPosition, focusTrigger]);\n\n useLayoutEffect(() => {\n if (!isOpen) {\n return;\n }\n updatePanelPosition();\n\n const panel = panelRef.current;\n if (!panel || typeof ResizeObserver === 'undefined') {\n return;\n }\n const observer = new ResizeObserver(() => updatePanelPosition());\n observer.observe(panel);\n return () => observer.disconnect();\n }, [isOpen, updatePanelPosition]);\n\n const reportSelectionRef = useRef<((value: unknown) => void) | undefined>(undefined);\n const reportBlurRef = useRef<(() => void) | undefined>(undefined);\n const reportEmptyRef = useRef<unknown>('');\n\n const handleItemSelected = (item?: DropdownItem) => {\n setOwnValue(item?.id);\n reportSelectionRef.current?.(item?.id ?? reportEmptyRef.current);\n setIsOpen(false);\n if (search) {\n setSearchQuery('');\n // Focus returns to the search input, whose focus handler would reopen the panel.\n reopenOnFocusRef.current = false;\n }\n onItemSelected?.(item?.id);\n focusTrigger();\n };\n\n const dismissPanel = () => {\n setIsOpen(false);\n if (search) {\n setSearchQuery('');\n }\n focusTrigger();\n };\n\n // ArrowDown is the \"take me into the list\" gesture. When it also opens the panel the\n // intent carries over to the mount, so it doesn't cost a second press in search mode.\n const enterPanel = () => {\n const first = panelOptions(panelRef.current)[0];\n if (first) {\n first.focus();\n return;\n }\n setFocusPanelOnOpen(true);\n setIsOpen(true);\n };\n\n const visibleItems =\n search && searchQuery ? items.filter((item) => matchesSearch(item, searchQuery)) : items;\n\n return (\n <BaseFormComponent\n fullWidth={fullWidth}\n label={label}\n hint={hint}\n rightSideContent={rightSideContent}\n tooltip={tooltip}\n name={name}\n required={required}\n requiredIndicator={requiredIndicator}\n loading={loading}\n formControl={formControl}\n description={description}\n controlId={controlId}\n labelId={labelId}\n descriptionId={descriptionId}\n hintId={hintId}\n loadingComponent={\n width === undefined ? (\n <LoadingInput\n heightClass={TRIGGER_SIZE_HEIGHT[size]}\n helperText={!!helperText}\n helperTextMarginTop\n />\n ) : (\n <div style={controlWidthStyle(width)}>\n <LoadingInput\n heightClass={TRIGGER_SIZE_HEIGHT[size]}\n helperText={!!helperText}\n helperTextMarginTop\n />\n </div>\n )\n }\n >\n {({ error: fieldError, message, onFieldChange, onFieldBlur, emptyValue }) => {\n reportSelectionRef.current = onFieldChange;\n reportBlurRef.current = onFieldBlur;\n reportEmptyRef.current = emptyValue;\n const isError = error ?? fieldError;\n // `error={false}` opts out of the resolver entirely, message included: a screen\n // that has dealt with the rejection its own way would otherwise keep reporting it.\n // The message is its own line rather than a replacement for the helper text,\n // matching Input and TextArea: a field that explains what it wants still has to\n // say why what was chosen was rejected.\n const errorMessage = error === false ? undefined : message;\n const errorMessageId = `${helperTextId}-error`;\n const describedBy =\n [\n descriptionId,\n hintId,\n helperText ? helperTextId : undefined,\n errorMessage ? errorMessageId : undefined,\n ]\n .filter(Boolean)\n .join(' ') || undefined;\n\n return (\n <>\n <div\n ref={dropdownRef}\n className={`relative w-full`}\n style={controlWidthStyle(width)}\n // Only leaving the field altogether is a blur `mode: 'onBlur'` should\n // hear. The panel is portaled to the body, so containment has to be\n // asked of it separately — otherwise opening the menu reads as\n // leaving, and the form validates before anything has been chosen.\n onBlur={(event) => {\n const next = event.relatedTarget as Node | null;\n const staysInField =\n event.currentTarget.contains(next) ||\n panelRef.current?.contains(next) === true;\n\n if (!staysInField) {\n reportBlurRef.current?.();\n }\n }}\n >\n {showClear && !search && (\n <button\n type=\"button\"\n onClick={handleClear}\n aria-label={clearLabel}\n className={`absolute ${\n triggerIsStacked\n ? CLEAR_STACKED_TOP_CLASSES[size]\n : 'top-1/2 -translate-y-1/2'\n } z-10 flex items-center\n justify-center rounded-full text-[var(--malachite-text-placeholder)]\n hover:text-[var(--malachite-text-primary)] transition-colors\n focus-visible:[outline:2px_solid_var(--malachite-text-primary)] focus-visible:outline-offset-2 ${CLEAR_OFFSET_CLASSES[size]}`}\n >\n <CloseIcon size={13} />\n </button>\n )}\n <DropdownTrigger\n hasClear={showClear}\n onClear={handleClear}\n clearLabel={clearLabel}\n ref={triggerRef as React.Ref<HTMLElement>}\n isOpen={isOpen}\n onClick={() => !disabled && setIsOpen(!isOpen)}\n selectedItem={selectedItem}\n disabled={disabled}\n error={isError}\n tone={tone}\n placeholder={placeholder}\n search={search}\n showSubtitleInTrigger={showSubtitleInTrigger}\n searchQuery={searchQuery}\n onSearchChange={setSearchQuery}\n onFocusOpen={() => {\n if (!reopenOnFocusRef.current) {\n reopenOnFocusRef.current = true;\n return;\n }\n setIsOpen(true);\n }}\n onArrowDown={() => {\n if (!disabled) {\n enterPanel();\n }\n }}\n size={size}\n controlId={controlId}\n hasCallerId={!!id}\n labelId={labelId}\n describedBy={describedBy}\n required={required}\n ariaLabel={ariaLabel}\n ariaLabelledBy={ariaLabelledBy}\n />\n {isOpen &&\n createPortal(\n <DropdownPanel\n ref={panelRef}\n style={{\n position: 'fixed',\n top: panelPosition?.top ?? 0,\n left: panelPosition?.left ?? 0,\n width: panelPosition?.width,\n maxHeight: panelPosition?.maxHeight,\n visibility: panelPosition ? 'visible' : 'hidden',\n opacity: panelPosition ? 1 : 0,\n }}\n items={visibleItems}\n onItemSelected={handleItemSelected}\n selectedItem={selectedItem}\n menuLoading={menuLoading}\n emptyMessage={\n items.length === 0\n ? 'No options available'\n : 'No results found'\n }\n subtitleLayout={subtitleLayout}\n size={size}\n autoFocus={!search || focusPanelOnOpen}\n positioned={panelPosition !== null}\n onDismiss={dismissPanel}\n />,\n document.body,\n )}\n </div>\n {helperText && (\n <div\n id={helperTextId}\n className=\"mt-1 text-[length:var(--malachite-font-size-small,13px)] text-left pl-2 text-[var(--malachite-text-dimmed,rgb(161,161,161))]\"\n >\n {helperText}\n </div>\n )}\n <FieldMessage id={errorMessageId} message={errorMessage} spaced />\n </>\n );\n }}\n </BaseFormComponent>\n );\n};\n\nexport default Dropdown;\n"],"names":["PANEL_MESSAGE_STYLE","ANNOTATION_FONT_SIZE","OPTION_SELECTOR","panelOptions","panel","matchesSearch","item","query","q","labelMatches","subtitleMatches","rightSideTextMatches","TRIGGER_SIZE_HEIGHT","TRIGGER_SIZE_CLASSES","CONTROL_TEXT_SIZE_CLASS","TRIGGER_SIZE_STACKED_CLASSES","CLEAR_OFFSET_CLASSES","CLEAR_STACKED_TOP_CLASSES","TRIGGER_SIZE_RADIUS","NEVER","ValueRow","wrap","id","children","jsx","Fragment","LabelRow","row","DropdownTrigger","React","isOpen","onClick","selectedItem","disabled","error","tone","placeholder","search","showSubtitleInTrigger","searchQuery","onSearchChange","onFocusOpen","onArrowDown","size","hasClear","onClear","clearLabel","controlId","labelId","describedBy","required","ariaLabel","ariaLabelledBy","hasCallerId","forwardedRef","stacked","sizeClasses","sizeRadius","valueId","subtitleId","namesItself","labelledBy","handleArrowDown","event","valueTextRef","useRef","subtitleTextRef","triggerVisual","getTriggerVisual","showValueLabel","valueText","triggerSubtitle","isValueTruncated","isCut","cutLines","setCutLines","useState","measureTruncatedLines","value","subtitle","jsxs","DROPDOWN_TRIGGER_ATTR","e","Tooltip","CloseIcon","CaretDownIcon","trigger","tooltipLines","DropdownItemComponent","selected","subtitleLayout","onItemSelected","textColor","optionId","useId","optionLabelId","optionSubtitleId","labelRef","subtitleRef","rightSideRef","measureOptionLines","label","rightSide","rightSideTextColor","rightSideJustify","option","DropdownPanel","props","ref","items","menuLoading","emptyMessage","autoFocus","positioned","onDismiss","style","panelRef","useInsertionEffect","ensureDropdownPanelStyles","useTopLayer","useEffect","options","_a","handleKeyDown","current","target","node","overlayIdentity","MENU_SPECS","MENU_MAX_HEIGHT_PX","CONTROL_TEXT_SIZE","Spinner","index","prev","showGroupHeader","Dropdown","defaultValue","hint","rightSideContent","tooltip","name","requiredIndicator","loading","formControl","description","helperText","clearable","fullWidth","width","minWidth","descriptionId","hintId","helperTextId","useFormFieldIds","setIsOpen","ownValue","setOwnValue","selectedId","showClear","triggerIsStacked","lastDefaultValueRef","setSearchQuery","focusPanelOnOpen","setFocusPanelOnOpen","dropdownRef","triggerRef","panelPosition","setPanelPosition","reopenOnFocusRef","focusTrigger","useCallback","handleClear","reportSelectionRef","reportEmptyRef","updatePanelPosition","measureMenuGeometry","handleClickOutside","path","inTrigger","inPanel","reportBlurRef","popEscapeLayer","pushEscapeLayer","handleScrollOrResize","frame","lastRect","followTrigger","rect","isTriggerOffscreen","signature","rectSignature","useLayoutEffect","observer","handleItemSelected","dismissPanel","enterPanel","first","visibleItems","BaseFormComponent","LoadingInput","controlWidthStyle","fieldError","message","onFieldChange","onFieldBlur","emptyValue","isError","errorMessage","errorMessageId","next","_b","createPortal","FieldMessage"],"mappings":"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"}
|