@clickhouse/click-ui 0.10.0-rc1 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (179) hide show
  1. package/dist/cjs/click-ui.css +6 -0
  2. package/dist/cjs/components/Assets/Flags/Austria.cjs +47 -0
  3. package/dist/cjs/components/Assets/Flags/Austria.cjs.map +1 -0
  4. package/dist/cjs/components/Assets/Flags/Bahrain.cjs +47 -0
  5. package/dist/cjs/components/Assets/Flags/Bahrain.cjs.map +1 -0
  6. package/dist/cjs/components/Assets/Flags/Belgium.cjs +62 -0
  7. package/dist/cjs/components/Assets/Flags/Belgium.cjs.map +1 -0
  8. package/dist/cjs/components/Assets/Flags/Canada.cjs +13 -21
  9. package/dist/cjs/components/Assets/Flags/Canada.cjs.map +1 -1
  10. package/dist/cjs/components/Assets/Flags/Chile.cjs +92 -0
  11. package/dist/cjs/components/Assets/Flags/Chile.cjs.map +1 -0
  12. package/dist/cjs/components/Assets/Flags/China.cjs +47 -0
  13. package/dist/cjs/components/Assets/Flags/China.cjs.map +1 -0
  14. package/dist/cjs/components/Assets/Flags/Denmark.cjs +54 -0
  15. package/dist/cjs/components/Assets/Flags/Denmark.cjs.map +1 -0
  16. package/dist/cjs/components/Assets/Flags/Finland.cjs +54 -0
  17. package/dist/cjs/components/Assets/Flags/Finland.cjs.map +1 -0
  18. package/dist/cjs/components/Assets/Flags/France.cjs +26 -17
  19. package/dist/cjs/components/Assets/Flags/France.cjs.map +1 -1
  20. package/dist/cjs/components/Assets/Flags/Greece.cjs +128 -0
  21. package/dist/cjs/components/Assets/Flags/Greece.cjs.map +1 -0
  22. package/dist/cjs/components/Assets/Flags/Indonesia.cjs +14 -14
  23. package/dist/cjs/components/Assets/Flags/Indonesia.cjs.map +1 -1
  24. package/dist/cjs/components/Assets/Flags/Ireland.cjs +10 -10
  25. package/dist/cjs/components/Assets/Flags/Ireland.cjs.map +1 -1
  26. package/dist/cjs/components/Assets/Flags/Italy.cjs +63 -0
  27. package/dist/cjs/components/Assets/Flags/Italy.cjs.map +1 -0
  28. package/dist/cjs/components/Assets/Flags/Malaysia.cjs +2 -2
  29. package/dist/cjs/components/Assets/Flags/Malaysia.cjs.map +1 -1
  30. package/dist/cjs/components/Assets/Flags/Mexico.cjs +8 -8
  31. package/dist/cjs/components/Assets/Flags/Mexico.cjs.map +1 -1
  32. package/dist/cjs/components/Assets/Flags/New-Zealand.cjs +553 -0
  33. package/dist/cjs/components/Assets/Flags/New-Zealand.cjs.map +1 -0
  34. package/dist/cjs/components/Assets/Flags/Norway.cjs +68 -0
  35. package/dist/cjs/components/Assets/Flags/Norway.cjs.map +1 -0
  36. package/dist/cjs/components/Assets/Flags/Poland.cjs +55 -0
  37. package/dist/cjs/components/Assets/Flags/Poland.cjs.map +1 -0
  38. package/dist/cjs/components/Assets/Flags/Qatar.cjs +47 -0
  39. package/dist/cjs/components/Assets/Flags/Qatar.cjs.map +1 -0
  40. package/dist/cjs/components/Assets/Flags/Saudi-Arabia.cjs +176 -0
  41. package/dist/cjs/components/Assets/Flags/Saudi-Arabia.cjs.map +1 -0
  42. package/dist/cjs/components/Assets/Flags/Singapore.cjs +12 -12
  43. package/dist/cjs/components/Assets/Flags/Singapore.cjs.map +1 -1
  44. package/dist/cjs/components/Assets/Flags/Spain.cjs +4447 -0
  45. package/dist/cjs/components/Assets/Flags/Spain.cjs.map +1 -0
  46. package/dist/cjs/components/Assets/Flags/Sweden.cjs +11 -11
  47. package/dist/cjs/components/Assets/Flags/Sweden.cjs.map +1 -1
  48. package/dist/cjs/components/Assets/Flags/Switzerland.cjs +30 -21
  49. package/dist/cjs/components/Assets/Flags/Switzerland.cjs.map +1 -1
  50. package/dist/cjs/components/Assets/Flags/Taiwan.cjs +5 -5
  51. package/dist/cjs/components/Assets/Flags/Taiwan.cjs.map +1 -1
  52. package/dist/cjs/components/Assets/Flags/Thailand.cjs +62 -0
  53. package/dist/cjs/components/Assets/Flags/Thailand.cjs.map +1 -0
  54. package/dist/cjs/components/Assets/Flags/United-Arab-Emirates.cjs +20 -20
  55. package/dist/cjs/components/Assets/Flags/United-Arab-Emirates.cjs.map +1 -1
  56. package/dist/cjs/components/Assets/Flags/United-States.cjs +2 -2
  57. package/dist/cjs/components/Assets/Flags/United-States.cjs.map +1 -1
  58. package/dist/cjs/components/Assets/Flags/system/FlagsDark.cjs +32 -0
  59. package/dist/cjs/components/Assets/Flags/system/FlagsDark.cjs.map +1 -1
  60. package/dist/cjs/components/Assets/Flags/system/FlagsLight.cjs +32 -0
  61. package/dist/cjs/components/Assets/Flags/system/FlagsLight.cjs.map +1 -1
  62. package/dist/cjs/components/DatePicker/Common.cjs +1 -1
  63. package/dist/cjs/components/DatePicker/Common.cjs.map +1 -1
  64. package/dist/cjs/components/DatePicker/DateRangePicker.cjs +1 -1
  65. package/dist/cjs/components/DatePicker/DateRangePicker.cjs.map +1 -1
  66. package/dist/cjs/components/DatePicker/DateTimeRangePicker.cjs +12 -8
  67. package/dist/cjs/components/DatePicker/DateTimeRangePicker.cjs.map +1 -1
  68. package/dist/cjs/components/DatePicker/utils.cjs +22 -6
  69. package/dist/cjs/components/DatePicker/utils.cjs.map +1 -1
  70. package/dist/cjs/components/GenericMenu/GenericMenu.css +2 -0
  71. package/dist/cjs/components/Select/common/InternalSelect.cjs +147 -193
  72. package/dist/cjs/components/Select/common/InternalSelect.cjs.map +1 -1
  73. package/dist/cjs/components/Select/common/SelectComponents.css +4 -0
  74. package/dist/cjs/components/Select/common/SelectComponents.module.css.cjs +1 -0
  75. package/dist/cjs/components/Select/common/SelectComponents.module.css.cjs.map +1 -1
  76. package/dist/esm/click-ui.css +6 -0
  77. package/dist/esm/components/Assets/Flags/Austria.js +43 -0
  78. package/dist/esm/components/Assets/Flags/Austria.js.map +1 -0
  79. package/dist/esm/components/Assets/Flags/Bahrain.js +43 -0
  80. package/dist/esm/components/Assets/Flags/Bahrain.js.map +1 -0
  81. package/dist/esm/components/Assets/Flags/Belgium.js +58 -0
  82. package/dist/esm/components/Assets/Flags/Belgium.js.map +1 -0
  83. package/dist/esm/components/Assets/Flags/Canada.js +13 -21
  84. package/dist/esm/components/Assets/Flags/Canada.js.map +1 -1
  85. package/dist/esm/components/Assets/Flags/Chile.js +88 -0
  86. package/dist/esm/components/Assets/Flags/Chile.js.map +1 -0
  87. package/dist/esm/components/Assets/Flags/China.js +43 -0
  88. package/dist/esm/components/Assets/Flags/China.js.map +1 -0
  89. package/dist/esm/components/Assets/Flags/Denmark.js +50 -0
  90. package/dist/esm/components/Assets/Flags/Denmark.js.map +1 -0
  91. package/dist/esm/components/Assets/Flags/Finland.js +50 -0
  92. package/dist/esm/components/Assets/Flags/Finland.js.map +1 -0
  93. package/dist/esm/components/Assets/Flags/France.js +26 -17
  94. package/dist/esm/components/Assets/Flags/France.js.map +1 -1
  95. package/dist/esm/components/Assets/Flags/Greece.js +124 -0
  96. package/dist/esm/components/Assets/Flags/Greece.js.map +1 -0
  97. package/dist/esm/components/Assets/Flags/Indonesia.js +14 -14
  98. package/dist/esm/components/Assets/Flags/Indonesia.js.map +1 -1
  99. package/dist/esm/components/Assets/Flags/Ireland.js +10 -10
  100. package/dist/esm/components/Assets/Flags/Ireland.js.map +1 -1
  101. package/dist/esm/components/Assets/Flags/Italy.js +59 -0
  102. package/dist/esm/components/Assets/Flags/Italy.js.map +1 -0
  103. package/dist/esm/components/Assets/Flags/Malaysia.js +2 -2
  104. package/dist/esm/components/Assets/Flags/Malaysia.js.map +1 -1
  105. package/dist/esm/components/Assets/Flags/Mexico.js +8 -8
  106. package/dist/esm/components/Assets/Flags/Mexico.js.map +1 -1
  107. package/dist/esm/components/Assets/Flags/New-Zealand.js +549 -0
  108. package/dist/esm/components/Assets/Flags/New-Zealand.js.map +1 -0
  109. package/dist/esm/components/Assets/Flags/Norway.js +64 -0
  110. package/dist/esm/components/Assets/Flags/Norway.js.map +1 -0
  111. package/dist/esm/components/Assets/Flags/Poland.js +51 -0
  112. package/dist/esm/components/Assets/Flags/Poland.js.map +1 -0
  113. package/dist/esm/components/Assets/Flags/Qatar.js +43 -0
  114. package/dist/esm/components/Assets/Flags/Qatar.js.map +1 -0
  115. package/dist/esm/components/Assets/Flags/Saudi-Arabia.js +172 -0
  116. package/dist/esm/components/Assets/Flags/Saudi-Arabia.js.map +1 -0
  117. package/dist/esm/components/Assets/Flags/Singapore.js +12 -12
  118. package/dist/esm/components/Assets/Flags/Singapore.js.map +1 -1
  119. package/dist/esm/components/Assets/Flags/Spain.js +4443 -0
  120. package/dist/esm/components/Assets/Flags/Spain.js.map +1 -0
  121. package/dist/esm/components/Assets/Flags/Sweden.js +11 -11
  122. package/dist/esm/components/Assets/Flags/Sweden.js.map +1 -1
  123. package/dist/esm/components/Assets/Flags/Switzerland.js +30 -21
  124. package/dist/esm/components/Assets/Flags/Switzerland.js.map +1 -1
  125. package/dist/esm/components/Assets/Flags/Taiwan.js +5 -5
  126. package/dist/esm/components/Assets/Flags/Taiwan.js.map +1 -1
  127. package/dist/esm/components/Assets/Flags/Thailand.js +58 -0
  128. package/dist/esm/components/Assets/Flags/Thailand.js.map +1 -0
  129. package/dist/esm/components/Assets/Flags/United-Arab-Emirates.js +20 -20
  130. package/dist/esm/components/Assets/Flags/United-Arab-Emirates.js.map +1 -1
  131. package/dist/esm/components/Assets/Flags/United-States.js +2 -2
  132. package/dist/esm/components/Assets/Flags/United-States.js.map +1 -1
  133. package/dist/esm/components/Assets/Flags/system/FlagsDark.js +34 -2
  134. package/dist/esm/components/Assets/Flags/system/FlagsDark.js.map +1 -1
  135. package/dist/esm/components/Assets/Flags/system/FlagsLight.js +34 -2
  136. package/dist/esm/components/Assets/Flags/system/FlagsLight.js.map +1 -1
  137. package/dist/esm/components/DatePicker/Common.js +2 -2
  138. package/dist/esm/components/DatePicker/Common.js.map +1 -1
  139. package/dist/esm/components/DatePicker/DateRangePicker.js +2 -2
  140. package/dist/esm/components/DatePicker/DateRangePicker.js.map +1 -1
  141. package/dist/esm/components/DatePicker/DateTimeRangePicker.js +13 -9
  142. package/dist/esm/components/DatePicker/DateTimeRangePicker.js.map +1 -1
  143. package/dist/esm/components/DatePicker/utils.js +20 -5
  144. package/dist/esm/components/DatePicker/utils.js.map +1 -1
  145. package/dist/esm/components/GenericMenu/GenericMenu.css +2 -0
  146. package/dist/esm/components/Select/common/InternalSelect.js +148 -194
  147. package/dist/esm/components/Select/common/InternalSelect.js.map +1 -1
  148. package/dist/esm/components/Select/common/SelectComponents.css +4 -0
  149. package/dist/esm/components/Select/common/SelectComponents.module.css.js +1 -0
  150. package/dist/esm/components/Select/common/SelectComponents.module.css.js.map +1 -1
  151. package/dist/types/components/Assets/Flags/Austria.d.ts +3 -0
  152. package/dist/types/components/Assets/Flags/Bahrain.d.ts +3 -0
  153. package/dist/types/components/Assets/Flags/Belgium.d.ts +3 -0
  154. package/dist/types/components/Assets/Flags/Canada.d.ts +1 -2
  155. package/dist/types/components/Assets/Flags/Chile.d.ts +3 -0
  156. package/dist/types/components/Assets/Flags/China.d.ts +3 -0
  157. package/dist/types/components/Assets/Flags/Denmark.d.ts +3 -0
  158. package/dist/types/components/Assets/Flags/Finland.d.ts +3 -0
  159. package/dist/types/components/Assets/Flags/France.d.ts +1 -2
  160. package/dist/types/components/Assets/Flags/Greece.d.ts +3 -0
  161. package/dist/types/components/Assets/Flags/Indonesia.d.ts +1 -2
  162. package/dist/types/components/Assets/Flags/Ireland.d.ts +1 -2
  163. package/dist/types/components/Assets/Flags/Italy.d.ts +3 -0
  164. package/dist/types/components/Assets/Flags/New-Zealand.d.ts +3 -0
  165. package/dist/types/components/Assets/Flags/Norway.d.ts +3 -0
  166. package/dist/types/components/Assets/Flags/Poland.d.ts +3 -0
  167. package/dist/types/components/Assets/Flags/Qatar.d.ts +3 -0
  168. package/dist/types/components/Assets/Flags/Saudi-Arabia.d.ts +3 -0
  169. package/dist/types/components/Assets/Flags/Singapore.d.ts +1 -2
  170. package/dist/types/components/Assets/Flags/Spain.d.ts +3 -0
  171. package/dist/types/components/Assets/Flags/Sweden.d.ts +1 -2
  172. package/dist/types/components/Assets/Flags/Switzerland.d.ts +1 -2
  173. package/dist/types/components/Assets/Flags/Thailand.d.ts +3 -0
  174. package/dist/types/components/Assets/Flags/United-Arab-Emirates.d.ts +2 -3
  175. package/dist/types/components/Assets/Flags/system/types.d.ts +1 -1
  176. package/dist/types/components/DatePicker/utils.d.ts +3 -2
  177. package/dist/types/components/Select/common/index.d.ts +1 -1
  178. package/dist/types/components/Select/common/types.d.ts +0 -6
  179. package/package.json +1 -1
@@ -1,5 +1,5 @@
1
1
  import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
2
- import { useId, useState, useRef, useCallback, useEffect, useMemo, forwardRef, Children, isValidElement } from 'react';
2
+ import { useId, useState, useRef, useCallback, useMemo, forwardRef, Children, isValidElement } from 'react';
3
3
  import { Portal } from '@radix-ui/react-popover';
4
4
  import { SelectPopoverRoot, StyledSelectTrigger, SelectValue, HiddenSelectElement, SelectPopoverContent, SelectList, SearchBarContainer, SearchBar, selectStyles, SelectListContent, SelectGroupContainer, SelectGroupName, SelectGroupContent, SelectNoDataContainer, SelectItemDescriptionText } from './SelectComponents.js';
5
5
  import { OptionContext } from './OptionContext.js';
@@ -11,7 +11,6 @@ import { GenericMenuItem } from '../../GenericMenu/index.js';
11
11
  import { IconWrapper } from '../../IconWrapper/index.js';
12
12
  import { useInputModality } from '../../../hooks/internal/useInputModality.js';
13
13
  import { cn } from '../../../lib/cva.js';
14
- import { getTextFromNodes } from '../../../lib/getTextFromNodes.js';
15
14
  import { useResolvedPortalContainer } from '../../../providers/PortalContext.js';
16
15
  import { FormRoot } from '../../FormContainer/FormRoot.js';
17
16
  import { FormElementContainer } from '../../FormContainer/FormElementContainer.js';
@@ -85,36 +84,18 @@ const NoOptionsDisplay = ({
85
84
  }
86
85
  );
87
86
  };
88
- const childrenToComboboxItemArray = (children, callback, heading) => {
87
+ const childrenToNormalizedOptions = (children, register) => {
89
88
  return Children.toArray(children).flatMap((child) => {
90
89
  if (isValidElement(child) && child && typeof child === "object") {
91
90
  const type = child.type;
92
91
  if (type.displayName === "Select.Group") {
93
- const groupChildren = child.props.children;
94
- return childrenToComboboxItemArray(
95
- groupChildren,
96
- callback,
97
- getTextFromNodes(child.props.heading).toLowerCase()
98
- );
92
+ return childrenToNormalizedOptions(child.props.children, register);
99
93
  } else if (type.displayName === "Select.Item") {
100
- const title = getTextFromNodes(child).toLowerCase();
101
- const value = child.props.value;
102
- const disabled = child.props.disabled;
103
- callback({
104
- disabled,
105
- value,
106
- title,
107
- heading,
108
- nodeProps: child.props
109
- });
110
- return {
111
- disabled,
112
- value,
113
- title,
114
- heading
115
- };
94
+ const { value, disabled } = child.props;
95
+ register(value, child.props);
96
+ return { value, disabled };
116
97
  } else if ("props" in child && child.props.children) {
117
- return childrenToComboboxItemArray(child.props.children, callback, heading);
98
+ return childrenToNormalizedOptions(child.props.children, register);
118
99
  }
119
100
  }
120
101
  return [];
@@ -155,100 +136,70 @@ const InternalSelect = ({
155
136
  const defaultId = useId();
156
137
  const [search, setSearch] = useState("");
157
138
  const [highlighted, setHighlighted] = useState();
158
- const visibleList = useRef([]);
159
- const navigatable = useRef([]);
139
+ const [searchSource, setSearchSource] = useState(() => /* @__PURE__ */ new Map());
160
140
  const valueNode = useRef(/* @__PURE__ */ new Map());
161
- const [isInitialized, setInitialized] = useState(false);
162
- const [list, setList] = useState([]);
163
- const updateElements = useCallback(
164
- ({ disabled: disabled2, value, title, heading, nodeProps }) => {
165
- if (title.includes(search) || heading?.includes(search)) {
166
- visibleList.current.push(value);
167
- if (!disabled2) {
168
- navigatable.current.push(value);
169
- }
170
- }
171
- valueNode.current.set(value, nodeProps);
172
- },
173
- [search]
174
- );
175
- const onUpdateSearch = useCallback(
176
- (search2) => {
177
- setSearch(search2);
178
- let hasHighlightedValue = false;
179
- const visibleItemsList = [];
180
- const navigatableList = [];
181
- const searchLowerCase = search2.toLowerCase();
182
- list.forEach((item) => {
183
- if (item.title.includes(searchLowerCase) || item.heading?.includes(searchLowerCase)) {
184
- if (item.value === highlighted) {
185
- hasHighlightedValue = true;
186
- }
187
- visibleItemsList.push(item.value);
188
- if (!item.disabled) {
189
- navigatableList.push(item.value);
190
- }
141
+ const registerValueNode = useCallback((value, nodeProps) => {
142
+ valueNode.current.set(value, nodeProps);
143
+ }, []);
144
+ const normalizedOptions = useMemo(() => {
145
+ if (options) {
146
+ return options.flatMap((option) => {
147
+ if ("options" in option) {
148
+ return (option.options ?? []).map((item) => {
149
+ registerValueNode(item.value, item);
150
+ return { value: item.value, disabled: item.disabled };
151
+ });
191
152
  }
153
+ registerValueNode(option.value, option);
154
+ return { value: option.value, disabled: option.disabled };
192
155
  });
193
- navigatable.current = navigatableList;
194
- visibleList.current = visibleItemsList;
195
- if (!hasHighlightedValue) {
196
- setHighlighted(navigatableList[0] ?? null);
156
+ } else if (children) {
157
+ return childrenToNormalizedOptions(children, registerValueNode);
158
+ }
159
+ return [];
160
+ }, [children, options, registerValueNode]);
161
+ const listNode = useRef(null);
162
+ const captureSearchSource = useCallback(() => {
163
+ const root = listNode.current;
164
+ if (!root) {
165
+ return;
166
+ }
167
+ const next = /* @__PURE__ */ new Map();
168
+ root.querySelectorAll("[cui-select-item][data-value]").forEach((el) => {
169
+ const value = el.getAttribute("data-value");
170
+ if (value === null) {
171
+ return;
197
172
  }
198
- },
199
- [highlighted, list]
173
+ const group = el.closest("[cui-select-group]");
174
+ const heading = group?.querySelector("[cui-select-group-name]")?.textContent ?? "";
175
+ next.set(value, `${el.textContent ?? ""} ${heading}`.toLowerCase());
176
+ });
177
+ setSearchSource(next);
178
+ }, []);
179
+ const onSearchChange = (next) => {
180
+ if (search === "" && next !== "") {
181
+ captureSearchSource();
182
+ }
183
+ setSearch(next);
184
+ };
185
+ const matchedOptions = useMemo(() => {
186
+ if (search === "") {
187
+ return normalizedOptions;
188
+ }
189
+ const searchLowerCase = search.toLowerCase();
190
+ return normalizedOptions.filter(
191
+ (item) => (searchSource.get(item.value) ?? "").includes(searchLowerCase)
192
+ );
193
+ }, [search, normalizedOptions, searchSource]);
194
+ const visibleValues = useMemo(
195
+ () => new Set(matchedOptions.map((o) => o.value)),
196
+ [matchedOptions]
200
197
  );
201
- const updateList = useCallback(
202
- (children2, options2) => {
203
- const lowerCasedSearch = search.toLowerCase();
204
- if (options2) {
205
- setList(
206
- options2.flatMap((option) => {
207
- if ("options" in option) {
208
- const heading = getTextFromNodes(option.heading).toLowerCase();
209
- return (option.options ?? []).map((item) => {
210
- valueNode.current.set(item.value, item);
211
- const title = getTextFromNodes(item.label).toLowerCase();
212
- if (title.includes(lowerCasedSearch) || heading?.includes(lowerCasedSearch)) {
213
- visibleList.current.push(item.value);
214
- if (!disabled) {
215
- navigatable.current.push(item.value);
216
- }
217
- }
218
- return {
219
- heading,
220
- disabled: item.disabled,
221
- value: item.value,
222
- title
223
- };
224
- });
225
- } else {
226
- valueNode.current.set(option.value, option);
227
- const title = getTextFromNodes(option.label).toLowerCase();
228
- if (title.includes(lowerCasedSearch)) {
229
- visibleList.current.push(option.value);
230
- if (!disabled) {
231
- navigatable.current.push(option.value);
232
- }
233
- }
234
- return {
235
- disabled: option.disabled,
236
- value: option.value,
237
- title: getTextFromNodes(option.label)
238
- };
239
- }
240
- })
241
- );
242
- } else if (children2) {
243
- setList(childrenToComboboxItemArray(children2, updateElements));
244
- }
245
- },
246
- [disabled, search, updateElements]
198
+ const navigableValues = useMemo(
199
+ () => matchedOptions.filter((o) => !o.disabled).map((o) => o.value),
200
+ [matchedOptions]
247
201
  );
248
- useEffect(() => {
249
- updateList(children, options);
250
- setInitialized(true);
251
- }, [children, options, updateList]);
202
+ const effectiveHighlight = highlighted && navigableValues.includes(highlighted) ? highlighted : navigableValues[0];
252
203
  const inputRef = useRef(null);
253
204
  const inputModalityProps = useInputModality();
254
205
  const portalContainer = useResolvedPortalContainer(container);
@@ -256,41 +207,41 @@ const InternalSelect = ({
256
207
  inputRef.current?.focus();
257
208
  };
258
209
  const clearSearch = () => {
259
- onUpdateSearch("");
210
+ setSearch("");
260
211
  };
261
212
  const onKeyDown = (e) => {
262
213
  if (!e.defaultPrevented) {
263
214
  if (e.key === "Enter") {
264
215
  e.preventDefault();
265
- if (highlighted) {
266
- onSelect(highlighted, void 0, e);
267
- } else if (visibleList.current.length === 0 && allowCreateOption) {
216
+ if (effectiveHighlight) {
217
+ onSelect(effectiveHighlight, void 0, e);
218
+ } else if (matchedOptions.length === 0 && allowCreateOption) {
268
219
  onSelect(search, "custom", e);
269
220
  }
270
221
  } else if (["ArrowUp", "ArrowDown", "Home", "End"].includes(e.key)) {
271
222
  e.preventDefault();
272
- let nextHighlightedValue = highlighted;
273
- const highlightedIndex = navigatable.current.findIndex(
274
- (value) => value === highlighted
223
+ let nextHighlightedValue = effectiveHighlight;
224
+ const highlightedIndex = navigableValues.findIndex(
225
+ (value) => value === effectiveHighlight
275
226
  );
276
227
  if (e.key === "ArrowUp") {
277
228
  if (highlightedIndex === 0) {
278
- nextHighlightedValue = navigatable.current[navigatable.current.length - 1];
229
+ nextHighlightedValue = navigableValues[navigableValues.length - 1];
279
230
  } else {
280
- nextHighlightedValue = navigatable.current[highlightedIndex - 1];
231
+ nextHighlightedValue = navigableValues[highlightedIndex - 1];
281
232
  }
282
233
  } else if (e.key === "ArrowDown") {
283
234
  e.preventDefault();
284
- if (highlightedIndex === navigatable.current.length - 1) {
285
- nextHighlightedValue = navigatable.current[0];
235
+ if (highlightedIndex === navigableValues.length - 1) {
236
+ nextHighlightedValue = navigableValues[0];
286
237
  } else {
287
- nextHighlightedValue = navigatable.current[highlightedIndex + 1];
238
+ nextHighlightedValue = navigableValues[highlightedIndex + 1];
288
239
  }
289
240
  } else if (e.key === "End") {
290
241
  e.preventDefault();
291
- nextHighlightedValue = navigatable.current[navigatable.current.length - 1];
242
+ nextHighlightedValue = navigableValues[navigableValues.length - 1];
292
243
  } else if (e.key === "Home") {
293
- nextHighlightedValue = navigatable.current[0];
244
+ nextHighlightedValue = navigableValues[0];
294
245
  e.preventDefault();
295
246
  }
296
247
  setHighlighted(nextHighlightedValue);
@@ -298,21 +249,19 @@ const InternalSelect = ({
298
249
  }
299
250
  };
300
251
  const isHidden = useCallback(
301
- (value) => {
302
- return !visibleList.current.includes(value ?? "");
303
- },
304
- [visibleList]
252
+ (value) => !visibleValues.has(value ?? ""),
253
+ [visibleValues]
305
254
  );
306
255
  const optionContextValue = useMemo(() => {
307
256
  return {
308
257
  search,
309
258
  updateHighlighted: setHighlighted,
310
- highlighted,
259
+ highlighted: effectiveHighlight,
311
260
  isHidden,
312
261
  onSelect,
313
262
  selectedValues
314
263
  };
315
- }, [search, highlighted, isHidden, onSelect, selectedValues]);
264
+ }, [search, effectiveHighlight, isHidden, onSelect, selectedValues]);
316
265
  const onCreateOption = (e) => {
317
266
  e.preventDefault();
318
267
  e.stopPropagation();
@@ -345,7 +294,7 @@ const InternalSelect = ({
345
294
  "data-testid": "select-trigger",
346
295
  ...triggerProps,
347
296
  children: [
348
- isInitialized && /* @__PURE__ */ jsx(SelectValue, { children: selectedValues.length === 0 ? placeholder : multiple ? /* @__PURE__ */ jsx(
297
+ /* @__PURE__ */ jsx(SelectValue, { children: selectedValues.length === 0 ? placeholder : multiple ? /* @__PURE__ */ jsx(
349
298
  MultiSelectValue,
350
299
  {
351
300
  disabled: disabled ?? false,
@@ -380,7 +329,7 @@ const InternalSelect = ({
380
329
  form,
381
330
  value: selectedValues,
382
331
  onChange: () => null,
383
- children: list.map((item) => /* @__PURE__ */ jsx(
332
+ children: normalizedOptions.map((item) => /* @__PURE__ */ jsx(
384
333
  "option",
385
334
  {
386
335
  value: item.value,
@@ -398,10 +347,7 @@ const InternalSelect = ({
398
347
  sideOffset: 5,
399
348
  onFocus,
400
349
  onCloseAutoFocus: () => {
401
- onUpdateSearch("");
402
- },
403
- onOpenAutoFocus: () => {
404
- setHighlighted(visibleList.current[0]);
350
+ setSearch("");
405
351
  },
406
352
  align: "start",
407
353
  $useFullWidthItems: useFullWidthItems,
@@ -413,7 +359,7 @@ const InternalSelect = ({
413
359
  {
414
360
  ref: inputRef,
415
361
  value: search,
416
- onChange: (e) => onUpdateSearch(e.target.value),
362
+ onChange: (e) => onSearchChange(e.target.value),
417
363
  "data-testid": "select-search-input",
418
364
  onKeyDown,
419
365
  $showSearch: showSearch
@@ -434,54 +380,61 @@ const InternalSelect = ({
434
380
  }
435
381
  )
436
382
  ] }),
437
- /* @__PURE__ */ jsx(SelectListContent, { $maxHeight: maxHeight, children: /* @__PURE__ */ jsx(OptionContext.Provider, { value: optionContextValue, children: options && options.length > 0 ? options.map((props2, index) => {
438
- if ("options" in props2) {
439
- const { options: itemList = [], ...groupProps } = props2;
440
- return /* @__PURE__ */ jsx(
441
- SelectGroup,
442
- {
443
- ...groupProps,
444
- children: itemList.map((itemProps, itemIndex) => {
445
- if (checkbox) {
446
- return /* @__PURE__ */ jsx(
447
- MultiSelectCheckboxItem,
448
- {
449
- ...itemProps
450
- },
451
- `select-${id}-group-${index}-item-${itemIndex}`
452
- );
453
- }
383
+ /* @__PURE__ */ jsx(
384
+ SelectListContent,
385
+ {
386
+ ref: listNode,
387
+ $maxHeight: maxHeight,
388
+ children: /* @__PURE__ */ jsx(OptionContext.Provider, { value: optionContextValue, children: options && options.length > 0 ? options.map((props2, index) => {
389
+ if ("options" in props2) {
390
+ const { options: itemList = [], ...groupProps } = props2;
391
+ return /* @__PURE__ */ jsx(
392
+ SelectGroup,
393
+ {
394
+ ...groupProps,
395
+ children: itemList.map((itemProps, itemIndex) => {
396
+ if (checkbox) {
397
+ return /* @__PURE__ */ jsx(
398
+ MultiSelectCheckboxItem,
399
+ {
400
+ ...itemProps
401
+ },
402
+ `select-${id}-group-${index}-item-${itemIndex}`
403
+ );
404
+ }
405
+ return /* @__PURE__ */ jsx(
406
+ SelectItem,
407
+ {
408
+ ...itemProps
409
+ },
410
+ `select-${id}-group-${index}-item-${itemIndex}`
411
+ );
412
+ })
413
+ },
414
+ `select-${id}-group-${index}`
415
+ );
416
+ } else {
417
+ if (checkbox) {
454
418
  return /* @__PURE__ */ jsx(
455
- SelectItem,
419
+ MultiSelectCheckboxItem,
456
420
  {
457
- ...itemProps
421
+ ...props2
458
422
  },
459
- `select-${id}-group-${index}-item-${itemIndex}`
423
+ `select-${id}-item-${index}`
460
424
  );
461
- })
462
- },
463
- `select-${id}-group-${index}`
464
- );
465
- } else {
466
- if (checkbox) {
467
- return /* @__PURE__ */ jsx(
468
- MultiSelectCheckboxItem,
469
- {
470
- ...props2
471
- },
472
- `select-${id}-item-${index}`
473
- );
474
- }
475
- return /* @__PURE__ */ jsx(
476
- SelectItem,
477
- {
478
- ...props2
479
- },
480
- `select-${id}-item-${index}`
481
- );
425
+ }
426
+ return /* @__PURE__ */ jsx(
427
+ SelectItem,
428
+ {
429
+ ...props2
430
+ },
431
+ `select-${id}-item-${index}`
432
+ );
433
+ }
434
+ }) : children })
482
435
  }
483
- }) : children }) }),
484
- visibleList.current.length === 0 && (allowCreateOption || !!noAvailableOptions) && /* @__PURE__ */ jsx(
436
+ ),
437
+ matchedOptions.length === 0 && (allowCreateOption || !!noAvailableOptions) && /* @__PURE__ */ jsx(
485
438
  NoOptionsDisplay,
486
439
  {
487
440
  allowCreateOption,
@@ -521,10 +474,11 @@ const SelectGroup = forwardRef(
521
474
  SelectGroupContainer,
522
475
  {
523
476
  ...props,
477
+ "cui-select-group": "",
524
478
  ref: mergeRefs([
525
479
  forwardedRef,
526
480
  (node) => {
527
- const hidden = node?.querySelectorAll("[cui-select-item]").length === 0;
481
+ const hidden = node?.querySelectorAll("[cui-select-item]:not([hidden])").length === 0;
528
482
  if (hidden) {
529
483
  node?.setAttribute("hidden", "");
530
484
  } else {
@@ -534,7 +488,7 @@ const SelectGroup = forwardRef(
534
488
  }
535
489
  ]),
536
490
  children: [
537
- /* @__PURE__ */ jsx(SelectGroupName, { children: heading }),
491
+ /* @__PURE__ */ jsx(SelectGroupName, { "cui-select-group-name": "", children: heading }),
538
492
  /* @__PURE__ */ jsx(SelectGroupContent, { children })
539
493
  ]
540
494
  }
@@ -573,15 +527,15 @@ const SelectItem = forwardRef(
573
527
  updateHighlighted(value);
574
528
  }
575
529
  };
576
- if (isHidden(value)) {
577
- return null;
578
- }
530
+ const hidden = isHidden(value);
579
531
  const isChecked = selectedValues.includes(value);
580
532
  return /* @__PURE__ */ jsxs(Fragment, { children: [
581
533
  /* @__PURE__ */ jsxs(
582
534
  GenericMenuItem,
583
535
  {
584
536
  ...props,
537
+ hidden,
538
+ className: cn(selectStyles["select-item"], props.className),
585
539
  "data-value": value,
586
540
  onClick: onSelectValue,
587
541
  onMouseOver,
@@ -618,7 +572,7 @@ const SelectItem = forwardRef(
618
572
  ]
619
573
  }
620
574
  ),
621
- separator && /* @__PURE__ */ jsx(Separator, { size: "sm" })
575
+ separator && !hidden && /* @__PURE__ */ jsx(Separator, { size: "sm" })
622
576
  ] });
623
577
  }
624
578
  );
@@ -655,15 +609,15 @@ const MultiSelectCheckboxItem = forwardRef(
655
609
  updateHighlighted(value);
656
610
  }
657
611
  };
658
- if (isHidden(value)) {
659
- return null;
660
- }
612
+ const hidden = isHidden(value);
661
613
  const isChecked = selectedValues.includes(value);
662
614
  return /* @__PURE__ */ jsxs(Fragment, { children: [
663
615
  /* @__PURE__ */ jsx(
664
616
  GenericMenuItem,
665
617
  {
666
618
  ...props,
619
+ hidden,
620
+ className: cn(selectStyles["select-item"], props.className),
667
621
  "data-value": value,
668
622
  onClick: handleMenuItemClick,
669
623
  onMouseOver: handleMenuItemMouseOver,
@@ -707,7 +661,7 @@ const MultiSelectCheckboxItem = forwardRef(
707
661
  )
708
662
  }
709
663
  ),
710
- separator && /* @__PURE__ */ jsx(Separator, { size: "sm" })
664
+ separator && !hidden && /* @__PURE__ */ jsx(Separator, { size: "sm" })
711
665
  ] });
712
666
  }
713
667
  );