infinity-ui-elements 1.8.3 → 1.8.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.esm.js CHANGED
@@ -1372,17 +1372,17 @@ const FormFooter = React.forwardRef(({ helperText, trailingText, validationState
1372
1372
  // Size-based configurations
1373
1373
  const sizeConfig = {
1374
1374
  small: {
1375
- textSize: "xsmall",
1375
+ textClassName: "text-caption-small-regular",
1376
1376
  iconSize: 12,
1377
1377
  gap: "gap-1",
1378
1378
  },
1379
1379
  medium: {
1380
- textSize: "small",
1380
+ textClassName: "text-caption-medium-regular",
1381
1381
  iconSize: 14,
1382
1382
  gap: "gap-1",
1383
1383
  },
1384
1384
  large: {
1385
- textSize: "medium",
1385
+ textClassName: "text-caption-large-regular",
1386
1386
  iconSize: 16,
1387
1387
  gap: "gap-1.5",
1388
1388
  },
@@ -1391,20 +1391,22 @@ const FormFooter = React.forwardRef(({ helperText, trailingText, validationState
1391
1391
  // Determine text color based on validation state and disabled state
1392
1392
  const getTextColor = () => {
1393
1393
  if (isDisabled)
1394
- return "disabled";
1394
+ return "text-surface-ink-neutral-disabled";
1395
1395
  if (validationState === "positive")
1396
- return "positive";
1396
+ return "text-feedback-ink-positive-intense";
1397
1397
  if (validationState === "negative")
1398
- return "negative";
1398
+ return "text-feedback-ink-negative-subtle";
1399
1399
  if (validationState === "default")
1400
- return "default";
1401
- return "default";
1400
+ return "text-surface-ink-neutral-subtle";
1401
+ return "text-surface-ink-neutral-subtle";
1402
1402
  };
1403
+ const helperTextColorClass = getTextColor();
1404
+ const trailingTextColorClass = getTextColor();
1403
1405
  // Don't render anything if there's no content
1404
1406
  if (!helperText && !trailingText) {
1405
1407
  return null;
1406
1408
  }
1407
- return (jsxs("div", { ref: ref, className: cn("flex items-center justify-between px-1", config.gap, className), children: [helperText && (jsxs("div", { className: cn("flex items-center", config.gap), children: [validationState === "positive" && (jsx("svg", { width: config.iconSize, height: config.iconSize, viewBox: "0 0 14 14", fill: "none", xmlns: "http://www.w3.org/2000/svg", className: "text-feedback-ink-positive-intense shrink-0", children: jsx("path", { d: "M3 7L6 10L11 4", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round" }) })), validationState === "negative" && (jsxs("svg", { width: config.iconSize, height: config.iconSize, viewBox: "0 0 14 14", fill: "none", xmlns: "http://www.w3.org/2000/svg", className: "text-feedback-ink-negative-subtle shrink-0", children: [jsx("circle", { cx: "7", cy: "7", r: "6", stroke: "currentColor", strokeWidth: "1" }), jsx("path", { d: "M7 4V7.5M7 10V9.5", stroke: "currentColor", strokeWidth: "1", strokeLinecap: "round" })] })), jsx(Text, { as: "span", variant: "body", size: config.textSize, weight: "regular", color: getTextColor(), className: cn("italic font-size-100 leading-100", helperTextClassName), children: helperText })] })), trailingText && (jsx(Text, { as: "span", variant: "body", size: config.textSize, weight: "regular", color: isDisabled ? "disabled" : "muted", className: cn("font-size-100 leading-100 shrink-0", trailingTextClassName), children: trailingText }))] }));
1409
+ return (jsxs("div", { ref: ref, className: cn("flex items-center justify-between px-1", config.gap, className), children: [helperText && (jsxs("div", { className: cn("flex items-center", config.gap), children: [validationState === "positive" && (jsx("svg", { width: config.iconSize, height: config.iconSize, viewBox: "0 0 14 14", fill: "none", xmlns: "http://www.w3.org/2000/svg", className: "text-feedback-ink-positive-intense shrink-0", children: jsx("path", { d: "M3 7L6 10L11 4", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round" }) })), validationState === "negative" && (jsxs("svg", { width: config.iconSize, height: config.iconSize, viewBox: "0 0 14 14", fill: "none", xmlns: "http://www.w3.org/2000/svg", className: "text-feedback-ink-negative-subtle shrink-0", children: [jsx("circle", { cx: "7", cy: "7", r: "6", stroke: "currentColor", strokeWidth: "1" }), jsx("path", { d: "M7 4V7.5M7 10V9.5", stroke: "currentColor", strokeWidth: "1", strokeLinecap: "round" })] })), jsx("span", { className: cn(config.textClassName, helperTextColorClass, "italic font-size-100 leading-100", helperTextClassName), children: helperText })] })), trailingText && (jsx("span", { className: cn(config.textClassName, trailingTextColorClass, "font-size-100 leading-100 shrink-0", trailingTextClassName), children: trailingText }))] }));
1408
1410
  });
1409
1411
  FormFooter.displayName = "FormFooter";
1410
1412
 
@@ -1542,7 +1544,7 @@ const Checkbox = React.forwardRef(({ label, errorText, size = "medium", validati
1542
1544
  },
1543
1545
  medium: {
1544
1546
  gap: "gap-2.5",
1545
- labelSize: "text-body-medium-regular",
1547
+ labelSize: "text-body-small-regular",
1546
1548
  iconSize: 12,
1547
1549
  },
1548
1550
  large: {
@@ -1868,10 +1870,10 @@ const DropdownMenu = React.forwardRef(({ items = [], customContent, sectionHeadi
1868
1870
  if (isEmpty || items.length === 0) {
1869
1871
  return (jsxs("div", { className: "flex flex-col items-center justify-center py-8 px-6 text-center", children: [emptyIcon || (jsx(Search, { className: "w-12 h-12 text-surface-ink-neutral-muted mb-4" })), jsx(Text, { as: "h3", variant: "body", size: "small", weight: "semibold", className: "text-surface-ink-neutral-normal mb-2", children: emptyTitle }), jsx(Text, { as: "p", variant: "body", size: "small", weight: "regular", className: "text-surface-ink-neutral-muted mb-3", children: emptyDescription }), emptyLinkText && (jsx(Link, { type: "anchor", color: "primary", size: "small", onClick: onEmptyLinkClick, children: emptyLinkText }))] }));
1870
1872
  }
1871
- return (jsxs("div", { className: "py-3 px-3 max-h-[400px] overflow-y-auto", children: [sectionHeading && (jsx(Text, { as: "div", variant: "body", size: "small", weight: "medium", className: "text-surface-ink-neutral-muted px-3 py-2 mb-1", children: sectionHeading })), jsx("div", { className: "flex flex-col gap-1", children: items.map((item, index) => (jsx(ListItem, { title: item.title, description: item.description, leadingIcon: item.leadingIcon, trailingIcon: item.trailingIcon, showChevron: showChevron, isDisabled: item.isDisabled, isSelected: index === focusedIndex, onClick: () => {
1873
+ return (jsxs("div", { className: "py-3 px-3 max-h-[400px] overflow-y-auto", children: [sectionHeading && (jsx(Text, { as: "div", variant: "body", size: "small", weight: "medium", className: "text-surface-ink-neutral-muted px-3 py-2 mb-1", children: sectionHeading })), jsx("div", { className: "flex flex-col gap-1", children: items.map((item, index) => (jsx(ListItem, { title: item.label, description: item.description, leadingIcon: item.leadingIcon, trailingIcon: item.trailingIcon, showChevron: showChevron, isDisabled: item.isDisabled, isSelected: index === focusedIndex, variant: item.variant, onClick: () => {
1872
1874
  item.onClick?.();
1873
1875
  onClose?.();
1874
- }, containerClassName: cn(index === focusedIndex && "bg-action-fill-primary-faded") }, item.id))) })] }));
1876
+ }, containerClassName: cn(index === focusedIndex && "bg-action-fill-primary-faded") }, item.value))) })] }));
1875
1877
  };
1876
1878
  const widthClass = width === "full" ? "w-full" : width === "auto" ? "w-auto" : "";
1877
1879
  const footerVisible = showFooter ?? !disableFooter;
@@ -2181,23 +2183,26 @@ const FormHeader = React.forwardRef(({ label, size = "medium", isOptional = fals
2181
2183
  // Size-based configurations
2182
2184
  const sizeConfig = {
2183
2185
  small: {
2184
- textSize: "xsmall",
2186
+ textClassName: "text-body-xsmall-semibold",
2187
+ textClassNameRegular: "text-caption-small-regular",
2185
2188
  iconSize: 12,
2186
2189
  gap: "gap-1.5",
2187
2190
  },
2188
2191
  medium: {
2189
- textSize: "small",
2192
+ textClassName: "text-body-small-semibold",
2193
+ textClassNameRegular: "text-caption-medium-regular",
2190
2194
  iconSize: 14,
2191
2195
  gap: "gap-2",
2192
2196
  },
2193
2197
  large: {
2194
- textSize: "medium",
2198
+ textClassName: "text-body-medium-semibold",
2199
+ textClassNameRegular: "text-caption-large-regular",
2195
2200
  iconSize: 16,
2196
2201
  gap: "gap-2.5",
2197
2202
  },
2198
2203
  };
2199
2204
  const config = sizeConfig[size];
2200
- return (jsxs("div", { ref: ref, className: cn("flex items-center justify-between px-1", config.gap, className), children: [jsxs("div", { className: cn("flex items-center", config.gap), children: [jsxs("label", { htmlFor: htmlFor, className: cn("flex items-center", labelClassName), children: [jsx(Text, { as: "span", variant: "body", size: config.textSize, weight: "semibold", color: "subtle", children: label }), isRequired && (jsx(Text, { as: "span", variant: "body", size: config.textSize, weight: "semibold", color: "negative", className: "ml-0.5", children: "*" })), isOptional && (jsx(Text, { as: "span", variant: "body", size: config.textSize, weight: "regular", className: "text-surface-ink-neutral-muted italic ml-1", children: "(optional)" }))] }), infoDescription && (jsx(Tooltip, { description: infoDescription, heading: infoHeading, children: jsxs("svg", { width: config.iconSize, height: config.iconSize, viewBox: "0 0 14 14", fill: "none", xmlns: "http://www.w3.org/2000/svg", className: "text-surface-ink-neutral-muted", children: [jsx("circle", { cx: "7", cy: "7", r: "6", stroke: "currentColor", strokeWidth: "1" }), jsx("path", { d: "M7 6V10M7 4.5V4", stroke: "currentColor", strokeWidth: "1", strokeLinecap: "round" })] }) }))] }), linkText && (jsx("a", { href: linkHref, onClick: onLinkClick, className: cn("text-surface-ink-primary-normal hover:text-surface-ink-primary-hover transition-colors cursor-pointer font-display font-semibold leading-tight shrink-0", size === "small" && "text-xs", size === "medium" && "text-xs", size === "large" && "text-sm", linkClassName), children: linkText }))] }));
2205
+ return (jsxs("div", { ref: ref, className: cn("flex items-center justify-between px-1", config.gap, className), children: [jsxs("div", { className: cn("flex items-center", config.gap), children: [jsxs("label", { htmlFor: htmlFor, className: cn("flex items-center", labelClassName), children: [jsx("span", { className: cn(config.textClassName, "text-surface-neutral-subtle"), children: label }), isRequired && (jsx("span", { className: cn(config.textClassName, "text-color-negative ml-0.5"), children: "*" })), isOptional && (jsx("span", { className: cn(config.textClassNameRegular, "text-surface-neutral-muted italic ml-1"), children: "(optional)" }))] }), infoDescription && (jsx(Tooltip, { description: infoDescription, heading: infoHeading, children: jsx(Icon, { name: "info", size: config.iconSize }) }))] }), linkText && (jsx(Link, { href: linkHref, onClick: onLinkClick, type: "action", color: "primary", size: size === "large" ? "small" : "xsmall", children: linkText }))] }));
2201
2206
  });
2202
2207
  FormHeader.displayName = "FormHeader";
2203
2208
 
@@ -2249,7 +2254,7 @@ const Modal = React.forwardRef(({ isOpen, onClose, title, description, footer, c
2249
2254
  });
2250
2255
  Modal.displayName = "Modal";
2251
2256
 
2252
- const selectVariants = cva("relative flex items-center gap-2 border rounded-medium transition-all font-display font-size-100 leading-100", {
2257
+ const selectVariants = cva("relative flex items-center gap-2 border rounded-large transition-all font-display font-size-100 leading-100", {
2253
2258
  variants: {
2254
2259
  size: {
2255
2260
  small: "h-[28px] px-3 text-xs gap-2",
@@ -2442,7 +2447,13 @@ const Select = React.forwardRef(({ className, options = [], value: controlledVal
2442
2447
  }, [isOpen, value, options, isDisabled, isLoading]);
2443
2448
  // Transform options to dropdown menu items
2444
2449
  const menuItems = options.map((option) => ({
2445
- ...option,
2450
+ value: option.value,
2451
+ label: option.label ?? String(option.value),
2452
+ description: option.description,
2453
+ leadingIcon: option.leadingIcon,
2454
+ trailingIcon: option.trailingIcon,
2455
+ isDisabled: option.isDisabled,
2456
+ variant: option.variant,
2446
2457
  onClick: () => handleSelect(option),
2447
2458
  }));
2448
2459
  const widthStyle = menuWidth === "full" ? "100%" : menuWidth === "auto" ? "auto" : menuWidth;
@@ -2467,9 +2478,7 @@ const Select = React.forwardRef(({ className, options = [], value: controlledVal
2467
2478
  ? "text-feedback-ink-positive-intense"
2468
2479
  : currentValidationState === "negative"
2469
2480
  ? "text-feedback-ink-negative-subtle"
2470
- : "text-surface-ink-neutral-muted"), children: prefix })), jsx("span", { className: cn("flex-1 text-left truncate", !selectedOption && "text-surface-ink-neutral-muted", isDisabled && "text-surface-ink-neutral-disabled"), children: isLoading
2471
- ? "Loading..."
2472
- : selectedOption?.label || selectedOption?.title || placeholder }), showClearButton && hasValue && !isDisabled && !isLoading && (jsx("button", { type: "button", onClick: handleClear, className: "shrink-0 flex items-center justify-center text-surface-ink-neutral-muted hover:text-surface-ink-neutral-normal transition-colors", tabIndex: -1, children: jsx("svg", { width: "16", height: "16", viewBox: "0 0 16 16", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: jsx("path", { d: "M12 4L4 12M4 4L12 12", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round" }) }) })), suffix && !showClearButton && (jsx("span", { className: cn("shrink-0 flex items-center", isDisabled
2481
+ : "text-surface-ink-neutral-muted"), children: prefix })), jsx("span", { className: cn("flex-1 text-left truncate", !selectedOption && "text-surface-ink-neutral-muted", isDisabled && "text-surface-ink-neutral-disabled"), children: isLoading ? "Loading..." : selectedOption?.label || placeholder }), showClearButton && hasValue && !isDisabled && !isLoading && (jsx("button", { type: "button", onClick: handleClear, className: "shrink-0 flex items-center justify-center text-surface-ink-neutral-muted hover:text-surface-ink-neutral-normal transition-colors", tabIndex: -1, children: jsx("svg", { width: "16", height: "16", viewBox: "0 0 16 16", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: jsx("path", { d: "M12 4L4 12M4 4L12 12", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round" }) }) })), suffix && !showClearButton && (jsx("span", { className: cn("shrink-0 flex items-center", isDisabled
2473
2482
  ? "text-surface-ink-neutral-disabled"
2474
2483
  : currentValidationState === "positive"
2475
2484
  ? "text-feedback-ink-positive-intense"
@@ -2885,10 +2894,10 @@ TextField.displayName = "TextField";
2885
2894
 
2886
2895
  const defaultFilter = (item, query) => {
2887
2896
  const searchQuery = query.toLowerCase();
2888
- return (item.title.toLowerCase().includes(searchQuery) ||
2897
+ return (item.label.toLowerCase().includes(searchQuery) ||
2889
2898
  (item.description?.toLowerCase().includes(searchQuery) ?? false));
2890
2899
  };
2891
- const SearchableDropdown = React.forwardRef(({ className, items = [], sectionHeading, isLoading = false, emptyTitle = "No Search Results Found", emptyDescription = "Add description of what the user can search for here.", emptyLinkText = "Link to support site", onEmptyLinkClick, primaryButtonText = "Primary", secondaryButtonText = "Secondary", onPrimaryClick, onSecondaryClick, dropdownWidth = "full", showChevron = false, emptyIcon, disableFooter = false, footerLayout = "horizontal", onSearchChange, onItemSelect, filterFunction = defaultFilter, searchValue: controlledSearchValue, defaultSearchValue = "", dropdownClassName, minSearchLength = 0, showOnFocus = true, containerClassName, ...textFieldProps }, ref) => {
2900
+ const SearchableDropdown = React.forwardRef(({ className, items = [], sectionHeading, isLoading = false, emptyTitle = "No Search Results Found", emptyDescription = "Add description of what the user can search for here.", emptyLinkText = "Link to support site", onEmptyLinkClick, primaryButtonText, secondaryButtonText, onPrimaryClick, onSecondaryClick, dropdownWidth = "full", showChevron = false, emptyIcon, disableFooter = false, footerLayout = "horizontal", onSearchChange, onItemSelect, filterFunction = defaultFilter, searchValue: controlledSearchValue, defaultSearchValue = "", dropdownClassName, minSearchLength = 0, showOnFocus = true, showAddNew = false, containerClassName, ...textFieldProps }, ref) => {
2892
2901
  const [uncontrolledSearchValue, setUncontrolledSearchValue] = React.useState(defaultSearchValue);
2893
2902
  const [isOpen, setIsOpen] = React.useState(false);
2894
2903
  const [focusedIndex, setFocusedIndex] = React.useState(-1);
@@ -2937,7 +2946,7 @@ const SearchableDropdown = React.forwardRef(({ className, items = [], sectionHea
2937
2946
  const handleItemSelect = (item) => {
2938
2947
  onItemSelect?.(item);
2939
2948
  if (controlledSearchValue === undefined) {
2940
- setUncontrolledSearchValue(item.title);
2949
+ setUncontrolledSearchValue(item.label);
2941
2950
  }
2942
2951
  setIsOpen(false);
2943
2952
  inputRef.current?.focus();
@@ -2948,6 +2957,40 @@ const SearchableDropdown = React.forwardRef(({ className, items = [], sectionHea
2948
2957
  return items;
2949
2958
  return items.filter((item) => filterFunction(item, searchValue));
2950
2959
  }, [items, searchValue, filterFunction]);
2960
+ // Add "Add New" option if showAddNew is true and no items match
2961
+ const itemsWithAddNew = React.useMemo(() => {
2962
+ if (!showAddNew || !searchValue || filteredItems.length > 0) {
2963
+ return filteredItems;
2964
+ }
2965
+ const addNewItem = {
2966
+ value: searchValue,
2967
+ label: `+ Add ${searchValue}`,
2968
+ variant: "primary",
2969
+ onClick: () => {
2970
+ const newItem = {
2971
+ value: searchValue,
2972
+ label: searchValue,
2973
+ };
2974
+ onItemSelect?.(newItem);
2975
+ if (controlledSearchValue === undefined) {
2976
+ setUncontrolledSearchValue(searchValue);
2977
+ }
2978
+ setIsOpen(false);
2979
+ inputRef.current?.focus();
2980
+ },
2981
+ };
2982
+ return [addNewItem];
2983
+ }, [
2984
+ showAddNew,
2985
+ searchValue,
2986
+ filteredItems,
2987
+ onItemSelect,
2988
+ controlledSearchValue,
2989
+ ]);
2990
+ // Reset focused index when items change
2991
+ React.useEffect(() => {
2992
+ setFocusedIndex(-1);
2993
+ }, [itemsWithAddNew.length]);
2951
2994
  // Close dropdown when clicking outside
2952
2995
  React.useEffect(() => {
2953
2996
  const handleClickOutside = (event) => {
@@ -2977,7 +3020,7 @@ const SearchableDropdown = React.forwardRef(({ className, items = [], sectionHea
2977
3020
  switch (e.key) {
2978
3021
  case "ArrowDown":
2979
3022
  e.preventDefault();
2980
- setFocusedIndex((prev) => prev < filteredItems.length - 1 ? prev + 1 : prev);
3023
+ setFocusedIndex((prev) => prev < itemsWithAddNew.length - 1 ? prev + 1 : prev);
2981
3024
  break;
2982
3025
  case "ArrowUp":
2983
3026
  e.preventDefault();
@@ -2985,8 +3028,8 @@ const SearchableDropdown = React.forwardRef(({ className, items = [], sectionHea
2985
3028
  break;
2986
3029
  case "Enter":
2987
3030
  e.preventDefault();
2988
- if (focusedIndex >= 0 && filteredItems[focusedIndex]) {
2989
- handleItemSelect(filteredItems[focusedIndex]);
3031
+ if (focusedIndex >= 0 && itemsWithAddNew[focusedIndex]) {
3032
+ handleItemSelect(itemsWithAddNew[focusedIndex]);
2990
3033
  }
2991
3034
  break;
2992
3035
  case "Escape":
@@ -2997,9 +3040,10 @@ const SearchableDropdown = React.forwardRef(({ className, items = [], sectionHea
2997
3040
  }
2998
3041
  };
2999
3042
  // Update items with onClick handlers that call handleItemSelect
3000
- const itemsWithHandlers = filteredItems.map((item) => ({
3043
+ // Only add onClick if it doesn't already exist (for Add New items)
3044
+ const itemsWithHandlers = itemsWithAddNew.map((item) => ({
3001
3045
  ...item,
3002
- onClick: () => handleItemSelect(item),
3046
+ onClick: item.onClick || (() => handleItemSelect(item)),
3003
3047
  }));
3004
3048
  const showDropdown = isOpen && searchValue.length >= minSearchLength;
3005
3049
  const dropdownMenu = showDropdown && (jsx("div", { ref: menuRef, style: {
@@ -3008,7 +3052,9 @@ const SearchableDropdown = React.forwardRef(({ className, items = [], sectionHea
3008
3052
  left: `${position.left}px`,
3009
3053
  width: dropdownWidth === "full" ? `${position.width}px` : "auto",
3010
3054
  zIndex: 9999,
3011
- }, children: jsx(DropdownMenu, { items: itemsWithHandlers, sectionHeading: sectionHeading, isLoading: isLoading, isEmpty: filteredItems.length === 0, emptyTitle: emptyTitle, emptyDescription: emptyDescription, emptyLinkText: emptyLinkText, onEmptyLinkClick: onEmptyLinkClick, primaryButtonText: primaryButtonText, secondaryButtonText: secondaryButtonText, onPrimaryClick: onPrimaryClick, onSecondaryClick: onSecondaryClick, showChevron: showChevron, emptyIcon: emptyIcon, disableFooter: disableFooter, footerLayout: footerLayout, onClose: () => setIsOpen(false), focusedIndex: focusedIndex, className: dropdownClassName, width: dropdownWidth === "full" ? "full" : "auto" }) }));
3055
+ }, children: jsx(DropdownMenu, { items: itemsWithHandlers, sectionHeading: sectionHeading, isLoading: isLoading, isEmpty: itemsWithAddNew.length === 0 && !showAddNew, emptyTitle: emptyTitle, emptyDescription: emptyDescription, emptyLinkText: emptyLinkText, onEmptyLinkClick: onEmptyLinkClick, primaryButtonText: primaryButtonText, secondaryButtonText: secondaryButtonText, onPrimaryClick: onPrimaryClick, onSecondaryClick: onSecondaryClick, showChevron: showChevron, emptyIcon: emptyIcon, disableFooter: disableFooter, showFooter: (primaryButtonText || secondaryButtonText) && !disableFooter
3056
+ ? true
3057
+ : false, footerLayout: footerLayout, onClose: () => setIsOpen(false), focusedIndex: focusedIndex, className: dropdownClassName, width: dropdownWidth === "full" ? "full" : "auto" }) }));
3012
3058
  return (jsxs(Fragment, { children: [jsx("div", { ref: dropdownRef, className: cn("relative", containerClassName), children: jsx(TextField, { ref: inputRef, value: searchValue, onChange: handleSearchChange, onFocus: handleFocus, onKeyDown: handleKeyDown, containerClassName: "mb-0", ...textFieldProps }) }), typeof document !== "undefined" &&
3013
3059
  dropdownMenu &&
3014
3060
  createPortal(dropdownMenu, document.body)] }));