@linzjs/lui 21.52.0 → 21.53.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/CHANGELOG.md CHANGED
@@ -1,3 +1,17 @@
1
+ ## [21.53.1](https://github.com/linz/lui/compare/v21.53.0...v21.53.1) (2024-11-11)
2
+
3
+
4
+ ### Bug Fixes
5
+
6
+ * **searchbox:** style padding for passive search input ([#1170](https://github.com/linz/lui/issues/1170)) ([1854c9f](https://github.com/linz/lui/commit/1854c9f46da1d42a189f7cbd1e2b6a77e2a02e79))
7
+
8
+ # [21.53.0](https://github.com/linz/lui/compare/v21.52.0...v21.53.0) (2024-11-04)
9
+
10
+
11
+ ### Features
12
+
13
+ * Adding an imperative API to LuiListBox to allow selecting or focusing the first item ([#1169](https://github.com/linz/lui/issues/1169)) ([fd56d9c](https://github.com/linz/lui/commit/fd56d9c520e4523820bd22567a0bf8e420b3a455))
14
+
1
15
  # [21.52.0](https://github.com/linz/lui/compare/v21.51.1...v21.52.0) (2024-11-03)
2
16
 
3
17
 
@@ -1,6 +1,6 @@
1
1
  import './LuiListBox.scss';
2
2
  import 'react-loading-skeleton/dist/skeleton.css';
3
- import { HTMLAttributes, Key, ReactNode } from 'react';
3
+ import { HTMLAttributes, Key, ReactNode, MutableRefObject } from 'react';
4
4
  import { SelectionBehavior, SelectionMode } from '@react-types/shared';
5
5
  import { AriaListBoxOptions } from '@react-aria/listbox';
6
6
  export declare type KeyGetter<T> = (item: T) => Key;
@@ -46,4 +46,13 @@ export interface ILuiListBoxProps<T = ILuiListBoxItem> extends Omit<HTMLAttribut
46
46
  emptyIndicator?: () => ReactNode;
47
47
  onNavigateOutOfBounds?: (bound: 'start' | 'end') => void;
48
48
  }
49
- export declare function LuiListBox<T extends object = ILuiListBoxItem>({ ariaLabel, ariaLabelledBy, itemRenderer, groupHeadingRenderer, loadingIndicator, emptyIndicator, selectionMode, selectionBehavior, disabled, disabledKeys, items, value, onChange, getKey, getGroup, getLabel, ariaProps, className, onNavigateOutOfBounds, ...ulProps }: ILuiListBoxProps<T>): JSX.Element;
49
+ export interface ILuiListBoxHandle {
50
+ focusFirstItem: () => void;
51
+ selectFirstItem: () => void;
52
+ }
53
+ declare type ForwardedRef<T> = ((instance: T | null) => void) | MutableRefObject<T | null> | null;
54
+ export declare const LuiListBox: <T extends object = ILuiListBoxItem>(props: ILuiListBoxProps<T> & {
55
+ ref?: ForwardedRef<ILuiListBoxHandle> | undefined;
56
+ }) => ReturnType<typeof LuiListBoxWithRef>;
57
+ declare function LuiListBoxWithRef<T extends object = ILuiListBoxItem>(props: ILuiListBoxProps<T>, ref: ForwardedRef<ILuiListBoxHandle>): JSX.Element;
58
+ export {};
@@ -1,6 +1,7 @@
1
1
  import React, { ReactElement } from 'react';
2
2
  import { LuiButtonProps } from '../LuiButton/LuiButton';
3
3
  import { ISearchGroupedResult, ISearchResult } from '../LuiSearchInput/ResultsDisplay';
4
+ import { InputValidationResult } from '../LuiSearchInput/LuiPassiveSearchInput';
4
5
  export interface ISearchMenuOption {
5
6
  name?: string;
6
7
  groupTitle?: string | ReactElement;
@@ -14,6 +15,13 @@ export interface ISearchMenuOption {
14
15
  renderItem?: (item: any) => ReactElement;
15
16
  icon?: ReactElement;
16
17
  columnBreak?: boolean;
18
+ onSearch?: (searchString: string) => void;
19
+ validateInput?: (input: string) => InputValidationResult | undefined;
20
+ /**
21
+ * @deprecated customizedInput was designed to enhance search box input component diversity.
22
+ * But considering to keep the input memory be consistent among all the input components,
23
+ * uncontrolled customized components are hard to be coordinated.
24
+ */
17
25
  customizedInput?: React.ReactElement;
18
26
  }
19
27
  export interface ILuiSearchBoxProps {
@@ -16,4 +16,13 @@ export interface IPassiveSearchInputProps {
16
16
  onClickInput?: () => void;
17
17
  validateInput?: (input: string) => InputValidationResult | undefined;
18
18
  }
19
+ export declare const ControlledPassiveSearchInputComponent: (props: IPassiveSearchInputProps & {
20
+ typedValue: string;
21
+ setTypedValue: (value: string) => void;
22
+ }) => JSX.Element;
23
+ /**
24
+ * @deprecated This was created for client to easily customize the passive input component.
25
+ * But that is hard to keep input memory to be consistent with other input components.
26
+ * Has extracted the controlled version and let LuiSearchInput to align the input value.
27
+ */
19
28
  export declare const LuiPassiveSearchInput: (props: React.PropsWithChildren<IPassiveSearchInputProps>) => JSX.Element;
@@ -1,6 +1,7 @@
1
1
  import React, { ReactElement } from 'react';
2
2
  import 'react-loading-skeleton/dist/skeleton.css';
3
3
  import { ISearchGroupedResult, ISearchResult } from './ResultsDisplay';
4
+ import { InputValidationResult } from './LuiPassiveSearchInput';
4
5
  export interface ISearchInputProps<SearchResult extends ISearchResult = ISearchResult> {
5
6
  minCharactersForSearch: number;
6
7
  placeholderText: string;
@@ -15,5 +16,7 @@ export interface ISearchInputProps<SearchResult extends ISearchResult = ISearchR
15
16
  onClearCallback?: () => void;
16
17
  onClickInput?: () => void;
17
18
  externalSearch?: boolean;
19
+ onSearch?: (searchString: string) => void;
20
+ validateInput?: (input: string) => InputValidationResult | undefined;
18
21
  }
19
22
  export declare const LuiSearchInput: <SearchResult extends ISearchResult = ISearchResult>(props: React.PropsWithChildren<ISearchInputProps<SearchResult>>) => JSX.Element;
package/dist/index.d.ts CHANGED
@@ -59,7 +59,7 @@ export { LuiAccordicard } from './components/LuiAccordicard/LuiAccordicard';
59
59
  export { LuiAccordicardStatic } from './components/LuiAccordicardStatic/LuiAccordicardStatic';
60
60
  export { LuiAccordion } from './components/LuiAccordion/LuiAccordion';
61
61
  export * from './components/LuiMultiSwitch/LuiMultiSwitch';
62
- export { LuiListBox, type ILuiListBoxItem, type ILuiListBoxProps, type IItemRendererProps, } from './components/LuiListBox/LuiListBox';
62
+ export { LuiListBox, type ILuiListBoxItem, type ILuiListBoxProps, type IItemRendererProps, type ILuiListBoxHandle, } from './components/LuiListBox/LuiListBox';
63
63
  export { RadioItemRenderer } from './components/LuiListBox/Renderers/RadioItemRenderer';
64
64
  export { CheckboxItemRenderer } from './components/LuiListBox/Renderers/CheckboxItemRenderer';
65
65
  export { LuiSideMenu, type ILuiSideMenuProps, } from './components/LuiSideMenu/LuiSideMenu';
package/dist/index.js CHANGED
@@ -42490,6 +42490,67 @@ var ResultsDisplay = function (_a) {
42490
42490
  children));
42491
42491
  };
42492
42492
 
42493
+ var ControlledPassiveSearchInputComponent = function (props) {
42494
+ var _a = React.useState(), inputValidationResult = _a[0], setInputValidationResult = _a[1];
42495
+ var inputRef = React.useRef(null);
42496
+ var typedValue = props.typedValue, setTypedValue = props.setTypedValue;
42497
+ // set focus to input box
42498
+ React.useEffect(function () {
42499
+ var _a;
42500
+ if (props.focusUpdate !== undefined)
42501
+ (_a = inputRef.current) === null || _a === void 0 ? void 0 : _a.focus();
42502
+ }, [props.focusUpdate]);
42503
+ // validate input
42504
+ React.useEffect(function () {
42505
+ setInputValidationResult((props.validateInput && props.validateInput(typedValue)) || undefined);
42506
+ }, [typedValue]);
42507
+ function setInputValue(value) {
42508
+ setTypedValue(props.inputTransformer ? props.inputTransformer(value) : value);
42509
+ }
42510
+ function handleKeyDown(event) {
42511
+ switch (event.key) {
42512
+ case 'Enter':
42513
+ if (inputValidationResult &&
42514
+ inputValidationResult.stopProgress === true)
42515
+ return;
42516
+ props.onSearch(typedValue);
42517
+ }
42518
+ }
42519
+ var cancelIcon = typedValue !== '' ? (React__default["default"].createElement(LuiIcon, { alt: "clear", name: "ic_cancel_clear", size: "md", color: '#6b6966', spanProps: {
42520
+ onClick: function () {
42521
+ var _a;
42522
+ setInputValue('');
42523
+ (_a = props.onClearCallback) === null || _a === void 0 ? void 0 : _a.call(props);
42524
+ }
42525
+ } })) : null;
42526
+ var searchIcon = typedValue === '' || (inputValidationResult === null || inputValidationResult === void 0 ? void 0 : inputValidationResult.stopProgress) === true ? (React__default["default"].createElement("div", { className: "LuiSearchInput-search-button-disabled" },
42527
+ React__default["default"].createElement(LuiIcon, { name: "ic_search", size: "md", alt: "search", color: '#989189' }))) : (React__default["default"].createElement("div", { onClick: function () { return props.onSearch(typedValue); }, className: "LuiSearchInput-search-button" },
42528
+ React__default["default"].createElement(LuiIcon, { name: "ic_search", size: "md", alt: "search", color: '#FFFFFF' })));
42529
+ return (React__default["default"].createElement("div", { className: "LuiSearchInput", onClick: props.onClickInput },
42530
+ React__default["default"].createElement("span", { className: "LuiSearchInput-inputWrapper" },
42531
+ React__default["default"].createElement("input", { type: "text", className: clsx('LuiSearchPassiveInput-input'), ref: inputRef, value: typedValue, placeholder: props.placeholderText, "aria-label": "Search", onChange: function (e) { return setInputValue(e.target.value); }, onKeyDown: handleKeyDown, onFocus: function (e) {
42532
+ e.target.select();
42533
+ }, style: { pointerEvents: 'auto' } }),
42534
+ React__default["default"].createElement("div", { className: "LuiSearchPassiveInput-buttons-panel" },
42535
+ cancelIcon,
42536
+ searchIcon)),
42537
+ inputValidationResult && inputValidationResult.userMessage && (React__default["default"].createElement(React__default["default"].Fragment, null,
42538
+ React__default["default"].createElement("hr", { className: "LuiSearchInput-resultSeparator" }),
42539
+ React__default["default"].createElement("div", { "data-testid": "no-result-msg", className: "LuiSearchInput-disclaimer" }, inputValidationResult.userMessage))),
42540
+ props.disclaimer && (React__default["default"].createElement(React__default["default"].Fragment, null,
42541
+ React__default["default"].createElement("hr", { className: "LuiSearchInput-resultSeparator" }),
42542
+ React__default["default"].createElement("div", { "data-testid": "disclaimer", className: "LuiSearchInput-disclaimer" }, props.disclaimer)))));
42543
+ };
42544
+ /**
42545
+ * @deprecated This was created for client to easily customize the passive input component.
42546
+ * But that is hard to keep input memory to be consistent with other input components.
42547
+ * Has extracted the controlled version and let LuiSearchInput to align the input value.
42548
+ */
42549
+ var LuiPassiveSearchInput = function (props) {
42550
+ var _a = React.useState(props.initialValue ? props.initialValue : ''), typedValue = _a[0], setTypedValue = _a[1];
42551
+ return (React__default["default"].createElement(ControlledPassiveSearchInputComponent, __assign({ typedValue: typedValue, setTypedValue: setTypedValue }, props)));
42552
+ };
42553
+
42493
42554
  function flatten(items) {
42494
42555
  if (isGroupedResult(items)) {
42495
42556
  return items.flatMap(function (item) { return item.items; });
@@ -42663,7 +42724,7 @@ var LuiSearchInput = function (props) {
42663
42724
  else
42664
42725
  return null;
42665
42726
  }
42666
- return (React__default["default"].createElement("div", { className: "LuiSearchInput", onClick: props.onClickInput },
42727
+ return props.onSearch ? (React__default["default"].createElement(ControlledPassiveSearchInputComponent, __assign({ typedValue: typedValue, setTypedValue: setTypedValue }, props, { minCharactersForSearch: props.minCharactersForSearch, placeholderText: props.placeholderText, onSearch: props.onSearch, disclaimer: props.disclaimer, initialValue: props.initialValue, inputTransformer: props.inputTransformer, focusUpdate: props.focusUpdate, onClearCallback: props.onClearCallback, onClickInput: props.onClickInput, validateInput: props.validateInput }))) : (React__default["default"].createElement("div", { className: "LuiSearchInput", onClick: props.onClickInput },
42667
42728
  React__default["default"].createElement("span", { className: "LuiSearchInput-inputWrapper" },
42668
42729
  searchIcon,
42669
42730
  React__default["default"].createElement("input", { type: "text", className: clsx('LuiSearchInput-input'), ref: inputRef, value: typedValue, placeholder: props.placeholderText, "aria-label": "Search", onChange: function (e) { return setInputValue(e.target.value); }, onKeyDown: handleKeyDown, onFocus: function (e) {
@@ -42688,64 +42749,6 @@ var LuiSearchInput = function (props) {
42688
42749
  React__default["default"].createElement("div", { "data-testid": "disclaimer", className: "LuiSearchInput-disclaimer" }, props.disclaimer)))));
42689
42750
  };
42690
42751
 
42691
- var LuiPassiveSearchInput = function (props) {
42692
- var _a = React.useState(props.initialValue ? props.initialValue : ''), typedValue = _a[0], setTypedValue = _a[1];
42693
- var _b = React.useState(), inputValidationResult = _b[0], setInputValidationResult = _b[1];
42694
- var inputRef = React.useRef(null);
42695
- // set focus to input box
42696
- React.useEffect(function () {
42697
- var _a;
42698
- if (props.focusUpdate !== undefined)
42699
- (_a = inputRef.current) === null || _a === void 0 ? void 0 : _a.focus();
42700
- }, [props.focusUpdate]);
42701
- // validate input
42702
- React.useEffect(function () {
42703
- setInputValidationResult((props.validateInput && props.validateInput(typedValue)) || undefined);
42704
- }, [typedValue]);
42705
- function setInputValue(value) {
42706
- setTypedValue(props.inputTransformer ? props.inputTransformer(value) : value);
42707
- }
42708
- function handleKeyDown(event) {
42709
- switch (event.key) {
42710
- case 'Enter':
42711
- if (inputValidationResult &&
42712
- inputValidationResult.stopProgress === true)
42713
- return;
42714
- props.onSearch(typedValue);
42715
- }
42716
- }
42717
- var cancelIcon = typedValue !== '' ? (React__default["default"].createElement(LuiIcon, { alt: "clear", name: "ic_cancel_clear", size: "md", color: '#6b6966', spanProps: {
42718
- onClick: function () {
42719
- var _a;
42720
- setInputValue('');
42721
- (_a = props.onClearCallback) === null || _a === void 0 ? void 0 : _a.call(props);
42722
- }
42723
- } })) : null;
42724
- var searchIcon = typedValue === '' || (inputValidationResult === null || inputValidationResult === void 0 ? void 0 : inputValidationResult.stopProgress) === true ? (React__default["default"].createElement("div", { className: "LuiSearchInput-search-button-disabled" },
42725
- React__default["default"].createElement(LuiIcon, { name: "ic_search", size: "md", alt: "search", color: '#989189' }))) : (React__default["default"].createElement("div", { onClick: function () { return props.onSearch(typedValue); }, className: "LuiSearchInput-search-button" },
42726
- React__default["default"].createElement(LuiIcon, { name: "ic_search", size: "md", alt: "search", color: '#FFFFFF' })));
42727
- return (React__default["default"].createElement("div", { className: "LuiSearchInput", onClick: props.onClickInput },
42728
- React__default["default"].createElement("span", { className: "LuiSearchInput-inputWrapper" },
42729
- React__default["default"].createElement("input", { type: "text", className: clsx('LuiSearchInput-input'), ref: inputRef, value: typedValue, placeholder: props.placeholderText, "aria-label": "Search", onChange: function (e) { return setInputValue(e.target.value); }, onKeyDown: handleKeyDown, onFocus: function (e) {
42730
- e.target.select();
42731
- }, style: { pointerEvents: 'auto' } }),
42732
- React__default["default"].createElement("div", { style: {
42733
- display: 'flex',
42734
- flexDirection: 'row',
42735
- paddingRight: '8px',
42736
- gap: '14px',
42737
- alignItems: 'center'
42738
- } },
42739
- cancelIcon,
42740
- searchIcon)),
42741
- inputValidationResult && inputValidationResult.userMessage && (React__default["default"].createElement(React__default["default"].Fragment, null,
42742
- React__default["default"].createElement("hr", { className: "LuiSearchInput-resultSeparator" }),
42743
- React__default["default"].createElement("div", { "data-testid": "no-result-msg", className: "LuiSearchInput-disclaimer" }, inputValidationResult.userMessage))),
42744
- props.disclaimer && (React__default["default"].createElement(React__default["default"].Fragment, null,
42745
- React__default["default"].createElement("hr", { className: "LuiSearchInput-resultSeparator" }),
42746
- React__default["default"].createElement("div", { "data-testid": "disclaimer", className: "LuiSearchInput-disclaimer" }, props.disclaimer)))));
42747
- };
42748
-
42749
42752
  var resultStyle = { verticalAlign: 'middle' };
42750
42753
  /**
42751
42754
  * LuiSearchBox is a search input with select menu.
@@ -42823,7 +42826,7 @@ var LuiSearchBox = function (_a) {
42823
42826
  ? selectedMenuOption.renderItem
42824
42827
  : function (item) {
42825
42828
  return React__default["default"].createElement("span", { style: resultStyle }, item.description);
42826
- }, disclaimer: selectedMenuOption.disclaimer, focusUpdate: autoFocus && isFocus ? focusUpdate : undefined, externalSearch: externalSearch, initialValue: !!externalSearch ? searchString : undefined, onClickInput: onClickInput, onClearCallback: onClearInput })))));
42829
+ }, disclaimer: selectedMenuOption.disclaimer, focusUpdate: autoFocus && isFocus ? focusUpdate : undefined, externalSearch: externalSearch, initialValue: !!externalSearch ? searchString : undefined, onClickInput: onClickInput, onClearCallback: onClearInput, onSearch: selectedMenuOption.onSearch, validateInput: selectedMenuOption.validateInput })))));
42827
42830
  };
42828
42831
  var LuiSearchBoxButton = React__default["default"].forwardRef(function (props, ref) {
42829
42832
  var button = React.useMemo(function () {
@@ -58330,8 +58333,9 @@ function LuiListBoxGroup(_a) {
58330
58333
  React__default["default"].createElement("ul", __assign({ className: "LuiListBoxGroup-items" }, groupProps), (group.childNodes || []).map(function (node) { return (React__default["default"].createElement(LuiListBoxItem, { key: node.key, node: node, state: state, renderer: itemRenderer })); }))));
58331
58334
  }
58332
58335
 
58333
- function LuiListBox(_a) {
58334
- var ariaLabel = _a.ariaLabel, ariaLabelledBy = _a.ariaLabelledBy, _b = _a.itemRenderer, itemRenderer = _b === void 0 ? DefaultItemRenderer : _b, _c = _a.groupHeadingRenderer, groupHeadingRenderer = _c === void 0 ? DefaultGroupHeadingRenderer : _c, _d = _a.loadingIndicator, loadingIndicator = _d === void 0 ? DefaultLoadingIndicator : _d, _e = _a.emptyIndicator, emptyIndicator = _e === void 0 ? DefaultEmptyIndicator : _e, _f = _a.selectionMode, selectionMode = _f === void 0 ? 'single' : _f, _g = _a.selectionBehavior, selectionBehavior = _g === void 0 ? 'toggle' : _g, _h = _a.disabled, disabled = _h === void 0 ? false : _h, _j = _a.disabledKeys, disabledKeys = _j === void 0 ? [] : _j, items = _a.items, value = _a.value, onChange = _a.onChange, getKey = _a.getKey, getGroup = _a.getGroup, getLabel = _a.getLabel, ariaProps = _a.ariaProps, className = _a.className, onNavigateOutOfBounds = _a.onNavigateOutOfBounds, ulProps = __rest(_a, ["ariaLabel", "ariaLabelledBy", "itemRenderer", "groupHeadingRenderer", "loadingIndicator", "emptyIndicator", "selectionMode", "selectionBehavior", "disabled", "disabledKeys", "items", "value", "onChange", "getKey", "getGroup", "getLabel", "ariaProps", "className", "onNavigateOutOfBounds"]);
58336
+ var LuiListBox = React.forwardRef(LuiListBoxWithRef);
58337
+ function LuiListBoxWithRef(props, ref) {
58338
+ var ariaLabel = props.ariaLabel, ariaLabelledBy = props.ariaLabelledBy, _a = props.itemRenderer, itemRenderer = _a === void 0 ? DefaultItemRenderer : _a, _b = props.groupHeadingRenderer, groupHeadingRenderer = _b === void 0 ? DefaultGroupHeadingRenderer : _b, _c = props.loadingIndicator, loadingIndicator = _c === void 0 ? DefaultLoadingIndicator : _c, _d = props.emptyIndicator, emptyIndicator = _d === void 0 ? DefaultEmptyIndicator : _d, _e = props.selectionMode, selectionMode = _e === void 0 ? 'single' : _e, _f = props.selectionBehavior, selectionBehavior = _f === void 0 ? 'toggle' : _f, _g = props.disabled, disabled = _g === void 0 ? false : _g, _h = props.disabledKeys, disabledKeys = _h === void 0 ? [] : _h, items = props.items, value = props.value, onChange = props.onChange, getKey = props.getKey, getGroup = props.getGroup, getLabel = props.getLabel, ariaProps = props.ariaProps, className = props.className, onNavigateOutOfBounds = props.onNavigateOutOfBounds, ulProps = __rest(props, ["ariaLabel", "ariaLabelledBy", "itemRenderer", "groupHeadingRenderer", "loadingIndicator", "emptyIndicator", "selectionMode", "selectionBehavior", "disabled", "disabledKeys", "items", "value", "onChange", "getKey", "getGroup", "getLabel", "ariaProps", "className", "onNavigateOutOfBounds"]);
58335
58339
  var listProps = useLuiListBox({
58336
58340
  selectionMode: selectionMode,
58337
58341
  selectionBehavior: selectionBehavior,
@@ -58346,9 +58350,20 @@ function LuiListBox(_a) {
58346
58350
  disabledKeys: disabledKeys
58347
58351
  });
58348
58352
  var ariaListBoxProps = React.useMemo(function () { return (__assign({ 'aria-label': ariaLabel, 'aria-labelledby': ariaLabelledBy }, listProps)); }, [listProps, ariaLabel, ariaLabelledBy]);
58349
- var ref = React.useRef(null);
58353
+ var listRef = React.useRef(null);
58350
58354
  var state = $e72dd72e1c76a225$export$2f645645f7bca764(listProps);
58351
- var listBoxProps = $c132121280ec012d$export$50eacbbf140a3141(ariaListBoxProps, state, ref).listBoxProps;
58355
+ var listBoxProps = $c132121280ec012d$export$50eacbbf140a3141(ariaListBoxProps, state, listRef).listBoxProps;
58356
+ var getFirstItem = function () { var _a; return (_a = listRef.current) === null || _a === void 0 ? void 0 : _a.querySelector('li[data-key]:first-of-type'); };
58357
+ React.useImperativeHandle(ref, function () { return ({
58358
+ focusFirstItem: function () {
58359
+ var _a;
58360
+ (_a = getFirstItem()) === null || _a === void 0 ? void 0 : _a.focus();
58361
+ },
58362
+ selectFirstItem: function () {
58363
+ var _a;
58364
+ (_a = getFirstItem()) === null || _a === void 0 ? void 0 : _a.click();
58365
+ }
58366
+ }); });
58352
58367
  var onKeyDown = function (e) {
58353
58368
  var _a, _b;
58354
58369
  var lastFocusedKey = state.selectionManager.focusedKey;
@@ -58366,7 +58381,7 @@ function LuiListBox(_a) {
58366
58381
  onNavigateOutOfBounds === null || onNavigateOutOfBounds === void 0 ? void 0 : onNavigateOutOfBounds('end');
58367
58382
  }
58368
58383
  };
58369
- return (React__default["default"].createElement("ul", __assign({}, ulProps, listBoxProps, { onKeyDown: onKeyDown, ref: ref, className: clsx('LuiListBox', className) }),
58384
+ return (React__default["default"].createElement("ul", __assign({}, ulProps, listBoxProps, { onKeyDown: onKeyDown, ref: listRef, className: clsx('LuiListBox', className) }),
58370
58385
  !items && loadingIndicator(),
58371
58386
  (items === null || items === void 0 ? void 0 : items.length) === 0 && emptyIndicator(),
58372
58387
  Array.from(state.collection).map(function (node) {