@db-ux/react-core-components 4.11.1 → 4.12.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.
Files changed (289) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/dist/components/accordion/accordion.d.ts +1 -1
  3. package/dist/components/accordion/accordion.js +83 -102
  4. package/dist/components/accordion/index.d.ts +1 -1
  5. package/dist/components/accordion/index.js +1 -0
  6. package/dist/components/accordion/model.d.ts +2 -2
  7. package/dist/components/accordion/model.js +2 -4
  8. package/dist/components/accordion-item/accordion-item.d.ts +2 -2
  9. package/dist/components/accordion-item/accordion-item.js +56 -89
  10. package/dist/components/accordion-item/index.d.ts +1 -1
  11. package/dist/components/accordion-item/index.js +1 -0
  12. package/dist/components/accordion-item/model.d.ts +1 -1
  13. package/dist/components/accordion-item/model.js +1 -0
  14. package/dist/components/badge/badge.d.ts +1 -1
  15. package/dist/components/badge/badge.js +28 -72
  16. package/dist/components/badge/index.d.ts +1 -1
  17. package/dist/components/badge/index.js +1 -0
  18. package/dist/components/badge/model.d.ts +1 -1
  19. package/dist/components/badge/model.js +1 -12
  20. package/dist/components/brand/brand.d.ts +1 -1
  21. package/dist/components/brand/brand.js +10 -60
  22. package/dist/components/brand/index.d.ts +1 -1
  23. package/dist/components/brand/index.js +1 -0
  24. package/dist/components/brand/model.d.ts +1 -1
  25. package/dist/components/brand/model.js +1 -0
  26. package/dist/components/button/button.d.ts +1 -1
  27. package/dist/components/button/button.js +19 -75
  28. package/dist/components/button/index.d.ts +1 -1
  29. package/dist/components/button/index.js +1 -0
  30. package/dist/components/button/model.d.ts +1 -1
  31. package/dist/components/button/model.js +2 -13
  32. package/dist/components/card/card.d.ts +1 -1
  33. package/dist/components/card/card.js +14 -65
  34. package/dist/components/card/index.d.ts +1 -1
  35. package/dist/components/card/index.js +1 -0
  36. package/dist/components/card/model.d.ts +1 -1
  37. package/dist/components/card/model.js +2 -8
  38. package/dist/components/checkbox/checkbox.d.ts +1 -1
  39. package/dist/components/checkbox/checkbox.js +143 -163
  40. package/dist/components/checkbox/index.d.ts +1 -1
  41. package/dist/components/checkbox/index.js +1 -0
  42. package/dist/components/checkbox/model.d.ts +1 -1
  43. package/dist/components/checkbox/model.js +1 -0
  44. package/dist/components/custom-button/custom-button.d.ts +1 -1
  45. package/dist/components/custom-button/custom-button.js +10 -65
  46. package/dist/components/custom-button/index.d.ts +1 -1
  47. package/dist/components/custom-button/index.js +1 -0
  48. package/dist/components/custom-button/model.d.ts +2 -2
  49. package/dist/components/custom-button/model.js +1 -0
  50. package/dist/components/custom-select/custom-select.d.ts +1 -1
  51. package/dist/components/custom-select/custom-select.js +688 -509
  52. package/dist/components/custom-select/index.d.ts +1 -1
  53. package/dist/components/custom-select/index.js +1 -0
  54. package/dist/components/custom-select/model.d.ts +4 -4
  55. package/dist/components/custom-select/model.js +1 -8
  56. package/dist/components/custom-select-dropdown/custom-select-dropdown.d.ts +1 -1
  57. package/dist/components/custom-select-dropdown/custom-select-dropdown.js +10 -62
  58. package/dist/components/custom-select-dropdown/index.d.ts +1 -1
  59. package/dist/components/custom-select-dropdown/index.js +1 -0
  60. package/dist/components/custom-select-dropdown/model.d.ts +1 -1
  61. package/dist/components/custom-select-dropdown/model.js +1 -8
  62. package/dist/components/custom-select-form-field/custom-select-form-field.d.ts +1 -1
  63. package/dist/components/custom-select-form-field/custom-select-form-field.js +9 -57
  64. package/dist/components/custom-select-form-field/index.d.ts +1 -1
  65. package/dist/components/custom-select-form-field/index.js +1 -0
  66. package/dist/components/custom-select-form-field/model.d.ts +1 -1
  67. package/dist/components/custom-select-form-field/model.js +1 -0
  68. package/dist/components/custom-select-list/custom-select-list.d.ts +1 -1
  69. package/dist/components/custom-select-list/custom-select-list.js +9 -60
  70. package/dist/components/custom-select-list/index.d.ts +1 -1
  71. package/dist/components/custom-select-list/index.js +1 -0
  72. package/dist/components/custom-select-list/model.d.ts +1 -1
  73. package/dist/components/custom-select-list/model.js +1 -0
  74. package/dist/components/custom-select-list-item/custom-select-list-item.d.ts +2 -2
  75. package/dist/components/custom-select-list-item/custom-select-list-item.js +28 -89
  76. package/dist/components/custom-select-list-item/index.d.ts +1 -1
  77. package/dist/components/custom-select-list-item/index.js +1 -0
  78. package/dist/components/custom-select-list-item/model.d.ts +1 -1
  79. package/dist/components/custom-select-list-item/model.js +1 -4
  80. package/dist/components/divider/divider.d.ts +1 -1
  81. package/dist/components/divider/divider.js +9 -60
  82. package/dist/components/divider/index.d.ts +1 -1
  83. package/dist/components/divider/index.js +1 -0
  84. package/dist/components/divider/model.d.ts +1 -1
  85. package/dist/components/divider/model.js +2 -4
  86. package/dist/components/drawer/drawer.d.ts +2 -2
  87. package/dist/components/drawer/drawer.js +109 -118
  88. package/dist/components/drawer/index.d.ts +1 -1
  89. package/dist/components/drawer/index.js +1 -0
  90. package/dist/components/drawer/model.d.ts +4 -1
  91. package/dist/components/drawer/model.js +4 -14
  92. package/dist/components/header/header.d.ts +1 -1
  93. package/dist/components/header/header.js +43 -143
  94. package/dist/components/header/index.d.ts +1 -1
  95. package/dist/components/header/index.js +1 -0
  96. package/dist/components/header/model.d.ts +1 -1
  97. package/dist/components/header/model.js +1 -0
  98. package/dist/components/icon/icon.d.ts +1 -1
  99. package/dist/components/icon/icon.js +9 -61
  100. package/dist/components/icon/index.d.ts +1 -1
  101. package/dist/components/icon/index.js +1 -0
  102. package/dist/components/icon/model.d.ts +1 -1
  103. package/dist/components/icon/model.js +1 -11
  104. package/dist/components/infotext/index.d.ts +1 -1
  105. package/dist/components/infotext/index.js +1 -0
  106. package/dist/components/infotext/infotext.d.ts +1 -1
  107. package/dist/components/infotext/infotext.js +9 -62
  108. package/dist/components/infotext/model.d.ts +1 -1
  109. package/dist/components/infotext/model.js +1 -0
  110. package/dist/components/input/index.d.ts +1 -1
  111. package/dist/components/input/index.js +1 -0
  112. package/dist/components/input/input.d.ts +1 -1
  113. package/dist/components/input/input.js +154 -198
  114. package/dist/components/input/model.d.ts +1 -1
  115. package/dist/components/input/model.js +5 -21
  116. package/dist/components/link/index.d.ts +1 -1
  117. package/dist/components/link/index.js +1 -0
  118. package/dist/components/link/link.d.ts +1 -1
  119. package/dist/components/link/link.js +9 -70
  120. package/dist/components/link/model.d.ts +1 -1
  121. package/dist/components/link/model.js +3 -8
  122. package/dist/components/navigation/index.d.ts +1 -1
  123. package/dist/components/navigation/index.js +1 -0
  124. package/dist/components/navigation/model.d.ts +1 -1
  125. package/dist/components/navigation/model.js +1 -0
  126. package/dist/components/navigation/navigation.d.ts +1 -1
  127. package/dist/components/navigation/navigation.js +9 -57
  128. package/dist/components/navigation-item/index.d.ts +1 -1
  129. package/dist/components/navigation-item/index.js +1 -0
  130. package/dist/components/navigation-item/model.d.ts +2 -2
  131. package/dist/components/navigation-item/model.js +1 -0
  132. package/dist/components/navigation-item/navigation-item.d.ts +1 -1
  133. package/dist/components/navigation-item/navigation-item.js +71 -117
  134. package/dist/components/notification/index.d.ts +1 -1
  135. package/dist/components/notification/index.js +1 -0
  136. package/dist/components/notification/model.d.ts +1 -1
  137. package/dist/components/notification/model.js +3 -12
  138. package/dist/components/notification/notification.d.ts +2 -2
  139. package/dist/components/notification/notification.js +23 -100
  140. package/dist/components/page/index.d.ts +1 -1
  141. package/dist/components/page/index.js +1 -0
  142. package/dist/components/page/model.d.ts +1 -1
  143. package/dist/components/page/model.js +2 -4
  144. package/dist/components/page/page.d.ts +1 -1
  145. package/dist/components/page/page.js +42 -74
  146. package/dist/components/popover/index.d.ts +1 -1
  147. package/dist/components/popover/index.js +1 -0
  148. package/dist/components/popover/model.d.ts +1 -1
  149. package/dist/components/popover/model.js +1 -0
  150. package/dist/components/popover/popover.d.ts +1 -1
  151. package/dist/components/popover/popover.js +119 -126
  152. package/dist/components/radio/index.d.ts +1 -1
  153. package/dist/components/radio/index.js +1 -0
  154. package/dist/components/radio/model.d.ts +1 -1
  155. package/dist/components/radio/model.js +1 -0
  156. package/dist/components/radio/radio.d.ts +1 -1
  157. package/dist/components/radio/radio.js +86 -124
  158. package/dist/components/section/index.d.ts +1 -1
  159. package/dist/components/section/index.js +1 -0
  160. package/dist/components/section/model.d.ts +1 -1
  161. package/dist/components/section/model.js +1 -0
  162. package/dist/components/section/section.d.ts +1 -1
  163. package/dist/components/section/section.js +9 -59
  164. package/dist/components/select/index.d.ts +1 -1
  165. package/dist/components/select/index.js +1 -0
  166. package/dist/components/select/model.d.ts +1 -1
  167. package/dist/components/select/model.js +1 -0
  168. package/dist/components/select/select.d.ts +1 -1
  169. package/dist/components/select/select.js +172 -188
  170. package/dist/components/stack/index.d.ts +1 -1
  171. package/dist/components/stack/index.js +1 -0
  172. package/dist/components/stack/model.d.ts +1 -1
  173. package/dist/components/stack/model.js +4 -14
  174. package/dist/components/stack/stack.d.ts +1 -1
  175. package/dist/components/stack/stack.js +9 -63
  176. package/dist/components/switch/index.d.ts +1 -1
  177. package/dist/components/switch/index.js +1 -0
  178. package/dist/components/switch/model.d.ts +1 -1
  179. package/dist/components/switch/model.js +1 -0
  180. package/dist/components/switch/switch.d.ts +1 -1
  181. package/dist/components/switch/switch.js +135 -182
  182. package/dist/components/tab-item/index.d.ts +1 -1
  183. package/dist/components/tab-item/index.js +1 -0
  184. package/dist/components/tab-item/model.d.ts +1 -1
  185. package/dist/components/tab-item/model.js +1 -0
  186. package/dist/components/tab-item/tab-item.d.ts +1 -1
  187. package/dist/components/tab-item/tab-item.js +72 -105
  188. package/dist/components/tab-list/index.d.ts +1 -1
  189. package/dist/components/tab-list/index.js +1 -0
  190. package/dist/components/tab-list/model.d.ts +1 -1
  191. package/dist/components/tab-list/model.js +1 -0
  192. package/dist/components/tab-list/tab-list.d.ts +1 -1
  193. package/dist/components/tab-list/tab-list.js +9 -60
  194. package/dist/components/tab-panel/index.d.ts +1 -1
  195. package/dist/components/tab-panel/index.js +1 -0
  196. package/dist/components/tab-panel/model.d.ts +1 -1
  197. package/dist/components/tab-panel/model.js +1 -0
  198. package/dist/components/tab-panel/tab-panel.d.ts +1 -1
  199. package/dist/components/tab-panel/tab-panel.js +10 -59
  200. package/dist/components/table/examples/data.d.ts +1 -1
  201. package/dist/components/table/examples/data.js +258 -0
  202. package/dist/components/table/index.d.ts +1 -1
  203. package/dist/components/table/index.js +1 -0
  204. package/dist/components/table/model.d.ts +2 -2
  205. package/dist/components/table/model.js +6 -28
  206. package/dist/components/table/table.d.ts +1 -1
  207. package/dist/components/table/table.js +77 -111
  208. package/dist/components/table-body/index.d.ts +1 -1
  209. package/dist/components/table-body/index.js +1 -0
  210. package/dist/components/table-body/model.d.ts +2 -2
  211. package/dist/components/table-body/model.js +1 -0
  212. package/dist/components/table-body/table-body.d.ts +1 -1
  213. package/dist/components/table-body/table-body.js +12 -64
  214. package/dist/components/table-caption/index.d.ts +1 -1
  215. package/dist/components/table-caption/index.js +1 -0
  216. package/dist/components/table-caption/model.d.ts +1 -1
  217. package/dist/components/table-caption/model.js +1 -0
  218. package/dist/components/table-caption/table-caption.d.ts +1 -1
  219. package/dist/components/table-caption/table-caption.js +9 -57
  220. package/dist/components/table-data-cell/index.d.ts +1 -1
  221. package/dist/components/table-data-cell/index.js +1 -0
  222. package/dist/components/table-data-cell/model.d.ts +1 -1
  223. package/dist/components/table-data-cell/model.js +1 -0
  224. package/dist/components/table-data-cell/table-data-cell.d.ts +1 -1
  225. package/dist/components/table-data-cell/table-data-cell.js +9 -62
  226. package/dist/components/table-footer/index.d.ts +1 -1
  227. package/dist/components/table-footer/index.js +1 -0
  228. package/dist/components/table-footer/model.d.ts +2 -2
  229. package/dist/components/table-footer/model.js +1 -0
  230. package/dist/components/table-footer/table-footer.d.ts +1 -1
  231. package/dist/components/table-footer/table-footer.js +12 -64
  232. package/dist/components/table-head/index.d.ts +1 -1
  233. package/dist/components/table-head/index.js +1 -0
  234. package/dist/components/table-head/model.d.ts +2 -2
  235. package/dist/components/table-head/model.js +1 -0
  236. package/dist/components/table-head/table-head.d.ts +1 -1
  237. package/dist/components/table-head/table-head.js +18 -71
  238. package/dist/components/table-header-cell/index.d.ts +1 -1
  239. package/dist/components/table-header-cell/index.js +1 -0
  240. package/dist/components/table-header-cell/model.d.ts +1 -1
  241. package/dist/components/table-header-cell/model.js +1 -9
  242. package/dist/components/table-header-cell/table-header-cell.d.ts +1 -1
  243. package/dist/components/table-header-cell/table-header-cell.js +9 -65
  244. package/dist/components/table-row/index.d.ts +1 -1
  245. package/dist/components/table-row/index.js +1 -0
  246. package/dist/components/table-row/model.d.ts +4 -4
  247. package/dist/components/table-row/model.js +1 -8
  248. package/dist/components/table-row/table-row.d.ts +1 -1
  249. package/dist/components/table-row/table-row.js +20 -127
  250. package/dist/components/tabs/index.d.ts +1 -1
  251. package/dist/components/tabs/index.js +1 -0
  252. package/dist/components/tabs/model.d.ts +3 -3
  253. package/dist/components/tabs/model.js +2 -4
  254. package/dist/components/tabs/tabs.d.ts +1 -1
  255. package/dist/components/tabs/tabs.js +170 -191
  256. package/dist/components/tag/index.d.ts +1 -1
  257. package/dist/components/tag/index.js +1 -0
  258. package/dist/components/tag/model.d.ts +1 -1
  259. package/dist/components/tag/model.js +1 -4
  260. package/dist/components/tag/tag.d.ts +1 -1
  261. package/dist/components/tag/tag.js +26 -91
  262. package/dist/components/textarea/index.d.ts +1 -1
  263. package/dist/components/textarea/index.js +1 -0
  264. package/dist/components/textarea/model.d.ts +1 -1
  265. package/dist/components/textarea/model.js +2 -13
  266. package/dist/components/textarea/textarea.d.ts +1 -1
  267. package/dist/components/textarea/textarea.js +139 -165
  268. package/dist/components/tooltip/index.d.ts +1 -1
  269. package/dist/components/tooltip/index.js +1 -0
  270. package/dist/components/tooltip/model.d.ts +1 -1
  271. package/dist/components/tooltip/model.js +1 -4
  272. package/dist/components/tooltip/tooltip.d.ts +1 -1
  273. package/dist/components/tooltip/tooltip.js +197 -160
  274. package/dist/index.d.ts +97 -97
  275. package/dist/index.js +97 -75
  276. package/dist/shared/constants.js +100 -32
  277. package/dist/shared/examples/index.js +4 -0
  278. package/dist/shared/figma.js +1 -0
  279. package/dist/shared/model.js +22 -77
  280. package/dist/shared/showcase/show-code-link.js +51 -0
  281. package/dist/utils/document-click-listener.js +29 -26
  282. package/dist/utils/document-scroll-listener.js +38 -30
  283. package/dist/utils/floating-components.js +404 -107
  284. package/dist/utils/form-components.js +71 -34
  285. package/dist/utils/index.d.ts +1 -1
  286. package/dist/utils/index.js +170 -49
  287. package/dist/utils/navigation.js +134 -68
  288. package/dist/utils/react.js +21 -10
  289. package/package.json +6 -9
@@ -1,511 +1,690 @@
1
1
  "use client";
2
- import { filterPassingProps as e, getRootProps as t } from "../../utils/react.js";
3
- import { cls as n, delay as r, getBoolean as i, getBooleanAsString as a, getHideProp as ee, getOptionKey as o, getSearchInput as te, hasVoiceOver as ne, stringPropVisible as s } from "../../utils/index.js";
4
- import { DEFAULT_INVALID_MESSAGE_ID_SUFFIX as re, DEFAULT_LABEL_ID_SUFFIX as ie, DEFAULT_MESSAGE_ID_SUFFIX as ae, DEFAULT_PLACEHOLDER_ID_SUFFIX as c, DEFAULT_REMOVE as oe, DEFAULT_SELECTED as se, DEFAULT_SELECT_ID_SUFFIX as ce, DEFAULT_VALID_MESSAGE_ID_SUFFIX as le } from "../../shared/constants.js";
5
- import ue from "../button/button.js";
6
- import { addResetEventListener as de } from "../../utils/form-components.js";
7
- import l from "../infotext/infotext.js";
8
- import { DocumentClickListener as fe } from "../../utils/document-click-listener.js";
9
- import { DocumentScrollListener as u } from "../../utils/document-scroll-listener.js";
10
- import { handleFixedDropdown as pe } from "../../utils/floating-components.js";
11
- import me from "../custom-select-dropdown/custom-select-dropdown.js";
12
- import he from "../custom-select-list-item/custom-select-list-item.js";
13
- import ge from "../custom-select-list/custom-select-list.js";
14
- import _e from "../input/input.js";
15
- import ve from "../tooltip/tooltip.js";
16
- import ye from "../tag/tag.js";
17
- import { forwardRef as d, useEffect as f, useId as be, useRef as p, useState as m } from "react";
18
- import { Fragment as h, jsx as g, jsxs as _ } from "react/jsx-runtime";
19
- //#region src/components/custom-select/custom-select.tsx
20
- function v(d, v) {
21
- d = {
22
- clearSelectionText: "Clear selection",
23
- showClearSelection: !0,
24
- ...d
25
- };
26
- let xe = be(), Se = v || p(v), y = p(null), b = p(null), x = p(null), S = p(null), [C, Ce] = m(() => void 0), [w, we] = m(() => void 0), [T, E] = m(() => void 0), [D, O] = m(() => void 0), [k, A] = m(() => void 0), [Te, j] = m(() => void 0), [M, Ee] = m(() => void 0), [De, Oe] = m(() => void 0), [ke, Ae] = m(() => void 0), [je, Me] = m(() => void 0), [N, P] = m(() => "no-validation"), [Ne, Pe] = m(() => !1), [Fe, Ie] = m(() => void 0), [Le, Re] = m(() => void 0), [F, I] = m(() => ""), [L, ze] = m(() => void 0), [Be, R] = m(() => ""), [z, Ve] = m(() => []), [He, Ue] = m(() => !1), [We, Ge] = m(() => !1), [B, Ke] = m(() => 0), [V, H] = m(() => []), [U, W] = m(() => []), [qe, Je] = m(() => !1), [Ye, Xe] = m(() => void 0), [Ze, Qe] = m(() => 0), [$e, et] = m(() => void 0), [tt, nt] = m(() => void 0);
27
- function rt(e) {
28
- e?.target?.contains && e?.target?.contains(y.current) && q();
29
- }
30
- let [it, at] = m(() => void 0);
31
- function ot() {
32
- return !!(d.validMessage ?? d.validation === "valid");
33
- }
34
- function st() {
35
- b.current && (b.current.value = lt()), !b.current?.validity.valid || d.validation === "invalid" ? (G(D), A(d.invalidMessage || b.current?.validationMessage || "TODO: Add an invalidMessage"), ne() && (R(k), r(() => R(""), 1e3)), Ne && P(d.validation ?? "invalid")) : ot() && b.current?.validity.valid && d.required ? (G(T), ne() && (R(d.validMessage ?? "TODO: Add a validMessage"), r(() => R(""), 1e3)), P(d.validation ?? "valid")) : s(d.message, d.showMessage) ? (G(w), P(d.validation ?? "no-validation")) : (G(ke), P(d.validation ?? "no-validation"));
36
- }
37
- function ct(e) {
38
- d.onDropdownToggle && (e.stopPropagation(), d.onDropdownToggle(e)), e.target instanceof HTMLDetailsElement && e.target.open ? (Xe(new fe().addCallback((e) => gt(e))), et(new u().addCallback((e) => rt(e))), q(), tt?.observe(y.current), e.target.dataset.test || vt()) : (Ye && new fe().removeCallback(Ye), $e && new u().removeCallback($e), tt?.unobserve(y.current));
39
- }
40
- function lt() {
41
- return V?.length ? V.at(0) ?? "" : "";
42
- }
43
- function G(e) {
44
- let t = [];
45
- e && t.push(e), L && F?.length && t.push(L), Re(t.join(" "));
46
- }
47
- function ut() {
48
- return d.selectAllLabel ?? "LABEL SHOULD BE SET";
49
- }
50
- function K(e) {
51
- return e.label ?? e.value?.toString() ?? "";
52
- }
53
- function dt(e) {
54
- return e && V?.includes ? V?.includes(e) : !1;
55
- }
56
- function ft(e) {
57
- let t = d.removeTagsTexts, n = d.options;
58
- if (t && n) {
59
- let r = n.findIndex((t) => t.value === e.value);
60
- if (r >= 0 && r < t.length) return t[r];
61
- }
62
- return `${oe} ${K(e)}`;
63
- }
64
- function pt(e, t) {
65
- t && t.stopPropagation(), X(e.value), Q();
66
- }
67
- function q() {
68
- if (y.current) {
69
- let e = y.current.querySelector("article");
70
- e && r(() => {
71
- pe(e, y.current, d.placement ?? "bottom");
72
- }, 1);
73
- }
74
- }
75
- function mt(e) {
76
- if (y.current?.open) {
77
- if (self.document) {
78
- let t = self.document.activeElement;
79
- if (t) if (t.getAttribute("type") === "checkbox" || t.getAttribute("type") === "radio") {
80
- let n = t?.closest("li");
81
- if (e.key === "ArrowDown" || e.key === "ArrowRight") {
82
- let e = n?.nextElementSibling;
83
- for (; e;) {
84
- let t = e.querySelector("input");
85
- if (t) {
86
- t.focus();
87
- break;
88
- }
89
- e = e.nextElementSibling;
90
- }
91
- e || Z(t);
92
- } else {
93
- let e = n?.previousElementSibling;
94
- for (; e;) {
95
- let t = e.querySelector("input");
96
- if (t) {
97
- t.focus();
98
- break;
99
- }
100
- e = e.previousElementSibling;
101
- }
102
- if (!e) {
103
- let e = y.current.querySelector("input[type=\"checkbox\"]");
104
- if (e && e !== t) Z(t);
105
- else {
106
- let e = te(y.current);
107
- if (e) r(() => {
108
- e.focus();
109
- }, 100);
110
- else {
111
- let e = Array.from(y.current?.querySelectorAll("input[type=\"checkbox\"],input[type=\"radio\"]"));
112
- e.length && e.at(-1)?.focus();
113
- }
114
- }
115
- }
116
- }
117
- } else t.getAttribute("type") === "search" && (e.key === "ArrowUp" || e.key === "ArrowLeft") ? (J(void 0, !0), Q()) : Z(t);
118
- }
119
- } else (e.key === "ArrowDown" || e.key === "ArrowRight") && (q(), y.current && (y.current.open = !0), vt());
120
- e.stopPropagation(), e.preventDefault();
121
- }
122
- function ht(e) {
123
- if (e.stopPropagation(), e.key === "Escape" && y.current?.open) J(void 0, !0), Q();
124
- else if (e.key === "Enter" && y.current?.open) {
125
- if (self.document) {
126
- let t = self.document.activeElement;
127
- if (["checkbox", "radio"].includes(t.getAttribute("type") || "")) t.click(), e.preventDefault();
128
- else if (t.getAttribute("type") === "search") {
129
- let t = U?.find((e) => !e.isGroupTitle && !e.disabled);
130
- t?.value && (X(t.value), e.preventDefault());
131
- }
132
- }
133
- } else (e.key === "ArrowDown" || e.key === "ArrowUp" || e.key === "ArrowLeft" || e.key === "ArrowRight") && mt(e);
134
- }
135
- function J(e, t) {
136
- if (y.current) {
137
- if (t) y.current.open = !1, Q();
138
- else if (y.current.open && e && e.relatedTarget) {
139
- let t = e.relatedTarget;
140
- !y.current.contains(t) && t.localName !== "dialog" && r(() => y.current.open = !1, 1);
141
- }
142
- }
143
- }
144
- function gt(e) {
145
- if (e) {
146
- let t = e.target;
147
- y.current?.open && !y.current.contains(t) && (y.current.open = !1);
148
- }
149
- }
150
- function Y(e) {
151
- (/* @__PURE__ */ new Date()).getTime() - Ze < 200 || (H(e), Pe(!0), d.onOptionSelected && d.onOptionSelected(e ?? []), Qe((/* @__PURE__ */ new Date()).getTime()));
152
- }
153
- function X(e) {
154
- e && (d.multiple ? V?.includes(e) ? Y(V.filter((t) => t !== e)) : Y([...V || [], e]) : (Y([e]), J(void 0, !0)));
155
- }
156
- function _t(e) {
157
- if (e.stopPropagation(), V?.length === B) Y([]);
158
- else {
159
- let e = We && S.current ? S.current.value : void 0;
160
- Y(d.options ? d.options.filter((t) => !t.isGroupTitle && (!e || t.value?.toLowerCase().includes(e.toLowerCase()))).map((e) => e.value ?? "") : []);
161
- }
162
- }
163
- function Z(e) {
164
- if (y.current) {
165
- let t = Array.from(y.current.querySelectorAll("input[type=\"checkbox\"],input[type=\"radio\"]"));
166
- if (t.length) {
167
- let n = t.at(0), i = n === e && t.length > 1 ? t.at(1) : n;
168
- i && r(() => {
169
- i.focus();
170
- }, 1);
171
- }
172
- }
173
- }
174
- function vt() {
175
- if (y.current) {
176
- let e = te(y.current);
177
- e ? r(() => {
178
- e.focus();
179
- }, 1) : Z();
180
- }
181
- }
182
- function yt(e) {
183
- if (e === void 0) return;
184
- let t;
185
- if (typeof e == "string") t = e;
186
- else {
187
- let n = e;
188
- n.stopPropagation(), d.onSearch && d.onSearch(n), t = n.target.value, at(t);
189
- }
190
- !d.options || !t || t.length === 0 ? W(d.options) : d.searchFilter ? W(d.options.filter((e) => d.searchFilter(e, t))) : W(d.options.filter((e) => !e.isGroupTitle && K(e).toLowerCase().includes(t.toLowerCase())));
191
- }
192
- function bt(e) {
193
- e.stopPropagation(), Y([]), Q();
194
- }
195
- function Q() {
196
- y.current && y.current.querySelector("summary")?.focus();
197
- }
198
- let [xt, St] = m(() => !1), [Ct, $] = m(() => !1);
199
- function wt() {
200
- let e = d.id ?? d.propOverrides?.id ?? `custom-select-${xe}`;
201
- Ce(e), we(e + ae), E(e + le), O(e + re), j(e + ce), Ee(e + ie), Oe(e + "-summary"), Ae(e + c), ze(e + "-selected-labels"), Me(e + "-info");
202
- }
203
- function Tt(e) {
204
- e.stopPropagation();
205
- }
206
- return f(() => {
207
- wt(), A(d.invalidMessage || "TODO: Add an invalidMessage"), typeof window < "u" && "IntersectionObserver" in window && nt(new IntersectionObserver((e) => {
208
- if (y.current) {
209
- let t = e.find(({ target: e }) => e === y.current);
210
- t && !t.isIntersecting && y.current.open && (y.current.open = !1);
211
- }
212
- }));
213
- }, []), f(() => {
214
- (d.id ?? d.propOverrides?.id) && wt();
215
- }, [d.id, d.propOverrides?.id]), f(() => {
216
- y.current && y.current.addEventListener("focusout", (e) => J(e));
217
- }, [y.current]), f(() => {
218
- if (C) {
219
- let e = C + ae;
220
- Ee(C + ie), j(C + ce), E(C + le), O(C + re), Ae(C + c), s(d.message, d.showMessage) ? G(e) : G();
221
- }
222
- }, [C]), f(() => {
223
- if (y.current) {
224
- let e = y.current.querySelector("summary");
225
- e && e.setAttribute("aria-describedby", d.ariaDescribedBy ?? (Le || ""));
226
- }
227
- }, [y.current, Le]), f(() => {
228
- d.showNoResults === void 0 ? U && Je(U.length === 0) : Je(d.showNoResults);
229
- }, [
230
- d.showNoResults,
231
- d.showLoading,
232
- U
233
- ]), f(() => {
234
- Ue(!!(d.multiple && (d.showSelectAll ?? B > 5)));
235
- }, [
236
- d.showSelectAll,
237
- B,
238
- d.multiple
239
- ]), f(() => {
240
- Ge(d.showSearch ?? B > 9);
241
- }, [d.showSearch, B]), f(() => {
242
- let e = d.values;
243
- Array.isArray(e) ? V !== e && H(e) : e == null && V?.length !== 0 && H([]);
244
- }, [d.values]), f(() => {
245
- b.current && st();
246
- }, [V, b.current]), f(() => {
247
- if (b.current) {
248
- let e = Fe;
249
- e || (e = new AbortController(), Ie(e));
250
- let t = d.values;
251
- de(b.current, () => {
252
- Y(t || (b.current.value ? [b.current.value] : [])), st();
253
- }, e.signal);
254
- }
255
- }, [b.current]), f(() => {
256
- P(d.validation);
257
- }, [d.validation]), f(() => {
258
- V?.length === 0 ? (St(!1), $(!1)) : V?.length === B ? ($(!1), St(!0)) : V && $(!0);
259
- }, [V, B]), f(() => {
260
- W(d.options), Ke(d.options?.filter((e) => !e.isGroupTitle).length ?? 0);
261
- }, [d.options]), f(() => {
262
- if (at(d.searchValue), d.searchValue) {
263
- let e = d.searchValue;
264
- yt(e);
265
- }
266
- }, [d.searchValue]), f(() => {
267
- d.options?.length && Ve(d.options?.filter((e) => !e.value || !V?.includes ? !1 : !e.isGroupTitle && V?.includes(e.value)));
268
- }, [d.options, V]), f(() => {
269
- if (d.selectedLabels) {
270
- I(d.selectedLabels);
271
- return;
272
- }
273
- if (z?.length) {
274
- if (d.transformSelectedLabels) {
275
- let e = z, t = d.transformSelectedLabels;
276
- I(t(e));
277
- return;
278
- }
279
- d.selectedType === "amount" ? I(d.amountText ? d.amountText : `${z?.length} ${se}`) : I(z?.map((e) => K(e)).join(", "));
280
- } else I("");
281
- }, [
282
- z,
283
- d.selectedType,
284
- d.amountText,
285
- d.selectedLabels,
286
- d.transformSelectedLabels
287
- ]), f(() => {
288
- d.onAmountChange && d.onAmountChange(z?.length ?? 0);
289
- }, [z]), f(() => {
290
- x.current && (x.current.indeterminate = !!Ct);
291
- }, [Ct, x.current]), f(() => {
292
- A(d.invalidMessage || b.current?.validationMessage || "TODO: Add an invalidMessage");
293
- }, [b.current, d.invalidMessage]), f(() => () => {
294
- Fe?.abort();
295
- }, []), /* @__PURE__ */ _("div", {
296
- id: C,
297
- ref: Se,
298
- ...e(d, [
299
- "data-icon-variant",
300
- "data-icon-variant-before",
301
- "data-icon-variant-after",
302
- "data-icon-weight",
303
- "data-icon-weight-before",
304
- "data-icon-weight-after",
305
- "data-interactive",
306
- "data-force-mobile",
307
- "data-color",
308
- "data-container-color",
309
- "data-bg-color",
310
- "data-on-bg-color",
311
- "data-color-scheme",
312
- "data-font-size",
313
- "data-headline-size",
314
- "data-divider",
315
- "data-focus",
316
- "data-font",
317
- "data-density",
318
- "onOptionSelected",
319
- "onAmountChange",
320
- "onDropdownToggle"
321
- ]),
322
- ...t(d, [
323
- "data-icon-variant",
324
- "data-icon-variant-before",
325
- "data-icon-variant-after",
326
- "data-icon-weight",
327
- "data-icon-weight-before",
328
- "data-icon-weight-after",
329
- "data-interactive",
330
- "data-force-mobile",
331
- "data-color",
332
- "data-container-color",
333
- "data-bg-color",
334
- "data-on-bg-color",
335
- "data-color-scheme",
336
- "data-font-size",
337
- "data-headline-size",
338
- "data-divider",
339
- "data-focus",
340
- "data-font",
341
- "data-density"
342
- ]),
343
- className: n("db-custom-select", d.className),
344
- "aria-invalid": N === "invalid",
345
- "data-custom-validity": N,
346
- "data-width": d.formFieldWidth,
347
- "data-variant": d.variant === "floating" && d.selectedType === "tag" && d.multiple ? "above" : d.variant,
348
- "data-required": a(d.required, "required"),
349
- "data-hide-asterisk": ee(d.showRequiredAsterisk),
350
- "data-placement": d.placement,
351
- "data-selected-type": d.multiple ? d.selectedType : "text",
352
- "data-hide-label": ee(d.showLabel),
353
- "data-icon": d.icon,
354
- "data-show-icon": a(d.showIcon, "showIcon"),
355
- children: [
356
- /* @__PURE__ */ _("label", {
357
- id: M,
358
- children: [d.label ?? "LABEL SHOULD BE SET", /* @__PURE__ */ g("select", {
359
- role: "none",
360
- hidden: !0,
361
- id: Te,
362
- tabIndex: -1,
363
- ref: b,
364
- form: d.form,
365
- name: d.name,
366
- "data-custom-validity": N,
367
- multiple: i(d.multiple, "multiple"),
368
- disabled: i(d.disabled, "disabled"),
369
- required: i(d.required, "required"),
370
- onChange: (e) => Tt(e),
371
- children: d.options?.length ? /* @__PURE__ */ g(h, { children: d.options?.map((e) => /* @__PURE__ */ g("option", {
372
- disabled: e.disabled,
373
- value: e.value,
374
- children: K(e)
375
- }, o(e, "native-select-option-"))) }) : null
376
- })]
377
- }),
378
- /* @__PURE__ */ _("details", {
379
- ref: y,
380
- open: d.open,
381
- onToggle: (e) => ct(e),
382
- onKeyDown: (e) => ht(e),
383
- children: [d.children, d.options ? /* @__PURE__ */ _(h, { children: [/* @__PURE__ */ _("summary", {
384
- className: "db-custom-select-form-field",
385
- id: De,
386
- "aria-disabled": a(d.disabled, "disabled"),
387
- tabIndex: d.disabled ? -1 : void 0,
388
- "aria-labelledby": M,
389
- children: [F?.length ? /* @__PURE__ */ _("span", {
390
- "data-visually-hidden": a(d.selectedType === "tag", "selectedType"),
391
- id: L,
392
- children: [d.selectedPrefix ? /* @__PURE__ */ g("span", {
393
- "data-visually-hidden": "true",
394
- children: d.selectedPrefix
395
- }) : null, F]
396
- }) : null, d.selectedType === "tag" ? /* @__PURE__ */ g("div", { children: z?.map((e) => /* @__PURE__ */ g(ye, {
397
- emphasis: "strong",
398
- behavior: "removable",
399
- removeButton: ft(e),
400
- onRemove: (t) => pt(e, t),
401
- children: K(e)
402
- }, o(e, "tag-"))) }) : null]
403
- }), /* @__PURE__ */ _(me, {
404
- width: d.dropdownWidth,
405
- children: [
406
- We ? /* @__PURE__ */ g("div", { children: /* @__PURE__ */ g(_e, {
407
- type: "search",
408
- ref: S,
409
- name: C,
410
- form: C,
411
- showLabel: !1,
412
- value: it,
413
- label: d.searchLabel ?? "LABEL SHOULD BE SET",
414
- placeholder: d.searchPlaceholder ?? d.searchLabel,
415
- ariaDescribedBy: qe || d.showLoading ? je : void 0,
416
- onInput: (e) => yt(e)
417
- }) }) : null,
418
- qe || d.showLoading ? /* @__PURE__ */ g(l, {
419
- id: je,
420
- icon: d.showLoading ? "circular_arrows" : void 0,
421
- semantic: d.showLoading ? "informational" : "warning",
422
- children: (d.showLoading ? d.loadingText : d.noResultsText) ?? "MESSAGE SHOULD BE SET"
423
- }) : /* @__PURE__ */ g(h, { children: /* @__PURE__ */ _(h, { children: [He ? /* @__PURE__ */ g("div", { children: /* @__PURE__ */ g("div", {
424
- className: "db-checkbox db-custom-select-list-item",
425
- children: /* @__PURE__ */ _("label", { children: [/* @__PURE__ */ g("input", {
426
- type: "checkbox",
427
- value: "select-all",
428
- ref: x,
429
- form: C,
430
- checked: xt,
431
- onChange: (e) => _t(e)
432
- }), ut()] })
433
- }) }) : null, /* @__PURE__ */ g(ge, {
434
- multiple: i(d.multiple, "multiple"),
435
- label: d.listLabel ?? d.label ?? "LABEL SHOULD BE SET",
436
- children: U?.map((e) => /* @__PURE__ */ g(he, {
437
- type: d.multiple ? "checkbox" : "radio",
438
- showDivider: e.showDivider,
439
- icon: e.icon,
440
- isGroupTitle: e.isGroupTitle,
441
- groupTitle: K(e),
442
- name: C,
443
- checked: dt(e.value),
444
- disabled: e.disabled,
445
- value: e.value,
446
- onChange: (t) => X(e.value),
447
- children: e.isGroupTitle ? null : /* @__PURE__ */ g(h, { children: K(e) })
448
- }, o(e, "custom-select-list-item-")))
449
- })] }) }),
450
- /* @__PURE__ */ g("div", { children: /* @__PURE__ */ g(ue, {
451
- variant: "ghost",
452
- width: "full",
453
- icon: "cross",
454
- size: "small",
455
- name: C,
456
- form: C,
457
- onClick: (e) => J(void 0, !0),
458
- children: d.mobileCloseButtonText ?? "Close"
459
- }) })
460
- ]
461
- })] }) : null]
462
- }),
463
- (d.showClearSelection ?? !0) && V?.length ? /* @__PURE__ */ _(ue, {
464
- icon: "cross",
465
- variant: "ghost",
466
- size: "small",
467
- noText: !0,
468
- name: C,
469
- form: C,
470
- disabled: i(d.disabled, "disabled"),
471
- onClick: (e) => bt(e),
472
- children: [d.clearSelectionText, /* @__PURE__ */ g(ve, {
473
- placement: "top",
474
- children: d.clearSelectionText
475
- })]
476
- }) : null,
477
- /* @__PURE__ */ g("span", {
478
- className: "db-custom-select-placeholder",
479
- "aria-hidden": "true",
480
- id: ke,
481
- children: d.placeholder ?? d.label
482
- }),
483
- s(d.message, d.showMessage) ? /* @__PURE__ */ g(l, {
484
- size: "small",
485
- icon: d.messageIcon,
486
- id: w,
487
- children: d.message
488
- }) : null,
489
- ot() ? /* @__PURE__ */ g(l, {
490
- size: "small",
491
- semantic: "successful",
492
- id: T,
493
- children: d.validMessage || "TODO: Add a validMessage"
494
- }) : null,
495
- /* @__PURE__ */ g(l, {
496
- size: "small",
497
- semantic: "critical",
498
- id: D,
499
- children: k
500
- }),
501
- /* @__PURE__ */ g("span", {
502
- "data-visually-hidden": "true",
503
- role: "status",
504
- children: Be
505
- })
506
- ]
507
- });
2
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { filterPassingProps, getRootProps } from "../../utils/react.js";
4
+ import { useState, useRef, useEffect, forwardRef } from "react";
5
+ import { DEFAULT_CLOSE_BUTTON, DEFAULT_INVALID_MESSAGE, DEFAULT_INVALID_MESSAGE_ID_SUFFIX, DEFAULT_LABEL, DEFAULT_LABEL_ID_SUFFIX, DEFAULT_MESSAGE, DEFAULT_MESSAGE_ID_SUFFIX, DEFAULT_PLACEHOLDER_ID_SUFFIX, DEFAULT_REMOVE, DEFAULT_SELECT_ID_SUFFIX, DEFAULT_SELECTED, DEFAULT_VALID_MESSAGE, DEFAULT_VALID_MESSAGE_ID_SUFFIX, } from "../../shared/constants.js";
6
+ import { cls, delay, getBoolean, getBooleanAsString, getHideProp, getOptionKey, getSearchInput, hasVoiceOver, stringPropVisible, } from "../../utils/index.js";
7
+ import { DocumentClickListener } from "../../utils/document-click-listener.js";
8
+ import { DocumentScrollListener } from "../../utils/document-scroll-listener.js";
9
+ import { handleFixedDropdown } from "../../utils/floating-components.js";
10
+ import { addResetEventListener, } from "../../utils/form-components.js";
11
+ import DBButton from "../button/button.js";
12
+ import DBCustomSelectDropdown from "../custom-select-dropdown/custom-select-dropdown.js";
13
+ import DBCustomSelectListItem from "../custom-select-list-item/custom-select-list-item.js";
14
+ import DBCustomSelectList from "../custom-select-list/custom-select-list.js";
15
+ import DBInfotext from "../infotext/infotext.js";
16
+ import DBInput from "../input/input.js";
17
+ import DBTag from "../tag/tag.js";
18
+ import DBTooltip from "../tooltip/tooltip.js";
19
+ import { useId } from "react";
20
+ function DBCustomSelectFn(props, component) {
21
+ props = {
22
+ clearSelectionText: "Clear selection",
23
+ showClearSelection: true,
24
+ ...props,
25
+ };
26
+ const uuid = useId();
27
+ const _ref = component || useRef(component);
28
+ const detailsRef = useRef(null);
29
+ const selectRef = useRef(null);
30
+ const selectAllRef = useRef(null);
31
+ const searchInputRef = useRef(null);
32
+ const [_id, set_id] = useState(() => undefined);
33
+ const [_messageId, set_messageId] = useState(() => undefined);
34
+ const [_validMessageId, set_validMessageId] = useState(() => undefined);
35
+ const [_invalidMessageId, set_invalidMessageId] = useState(() => undefined);
36
+ const [_invalidMessage, set_invalidMessage] = useState(() => undefined);
37
+ const [_selectId, set_selectId] = useState(() => undefined);
38
+ const [_labelId, set_labelId] = useState(() => undefined);
39
+ const [_summaryId, set_summaryId] = useState(() => undefined);
40
+ const [_placeholderId, set_placeholderId] = useState(() => undefined);
41
+ const [_infoTextId, set_infoTextId] = useState(() => undefined);
42
+ const [_validity, set_validity] = useState(() => "no-validation");
43
+ const [_userInteraction, set_userInteraction] = useState(() => false);
44
+ const [abortController, setAbortController] = useState(() => undefined);
45
+ const [_descByIds, set_descByIds] = useState(() => undefined);
46
+ const [_selectedLabels, set_selectedLabels] = useState(() => "");
47
+ const [_selectedLabelsId, set_selectedLabelsId] = useState(() => undefined);
48
+ const [_voiceOverFallback, set_voiceOverFallback] = useState(() => "");
49
+ const [_selectedOptions, set_selectedOptions] = useState(() => []);
50
+ const [selectAllEnabled, setSelectAllEnabled] = useState(() => false);
51
+ const [searchEnabled, setSearchEnabled] = useState(() => false);
52
+ const [amountOptions, setAmountOptions] = useState(() => 0);
53
+ const [_values, set_values] = useState(() => []);
54
+ const [_options, set_options] = useState(() => []);
55
+ const [_hasNoOptions, set_hasNoOptions] = useState(() => false);
56
+ const [_documentClickListenerCallbackId, set_documentClickListenerCallbackId,] = useState(() => undefined);
57
+ const [_internalChangeTimestamp, set_internalChangeTimestamp] = useState(() => 0);
58
+ const [_documentScrollListenerCallbackId, set_documentScrollListenerCallbackId,] = useState(() => undefined);
59
+ const [_observer, set_observer] = useState(() => undefined);
60
+ function handleDocumentScroll(event) {
61
+ if (event?.target?.contains &&
62
+ event?.target?.contains(detailsRef.current)) {
63
+ handleAutoPlacement();
64
+ }
65
+ }
66
+ const [_searchValue, set_searchValue] = useState(() => undefined);
67
+ function hasValidState() {
68
+ return !!(props.validMessage ?? props.validation === "valid");
69
+ }
70
+ function handleValidation() {
71
+ if (selectRef.current) {
72
+ selectRef.current.value = getNativeSelectValue();
73
+ }
74
+ /* For a11y reasons we need to map the correct message with the select */
75
+ if (!selectRef.current?.validity.valid || props.validation === "invalid") {
76
+ setDescById(_invalidMessageId);
77
+ set_invalidMessage(props.invalidMessage ||
78
+ selectRef.current?.validationMessage ||
79
+ DEFAULT_INVALID_MESSAGE);
80
+ if (hasVoiceOver()) {
81
+ set_voiceOverFallback(_invalidMessage);
82
+ void delay(() => set_voiceOverFallback(""), 1000);
83
+ }
84
+ if (_userInteraction) {
85
+ set_validity(props.validation ?? "invalid");
86
+ }
87
+ }
88
+ else if (hasValidState() &&
89
+ selectRef.current?.validity.valid &&
90
+ props.required) {
91
+ setDescById(_validMessageId);
92
+ if (hasVoiceOver()) {
93
+ set_voiceOverFallback(props.validMessage ?? DEFAULT_VALID_MESSAGE);
94
+ void delay(() => set_voiceOverFallback(""), 1000);
95
+ }
96
+ set_validity(props.validation ?? "valid");
97
+ }
98
+ else if (stringPropVisible(props.message, props.showMessage)) {
99
+ setDescById(_messageId);
100
+ set_validity(props.validation ?? "no-validation");
101
+ }
102
+ else {
103
+ setDescById(_placeholderId);
104
+ set_validity(props.validation ?? "no-validation");
105
+ }
106
+ }
107
+ function handleDropdownToggle(event) {
108
+ if (props.onDropdownToggle) {
109
+ event.stopPropagation();
110
+ props.onDropdownToggle(event);
111
+ }
112
+ if (event.target instanceof HTMLDetailsElement && event.target.open) {
113
+ set_documentClickListenerCallbackId(new DocumentClickListener().addCallback((event) => handleDocumentClose(event)));
114
+ set_documentScrollListenerCallbackId(new DocumentScrollListener().addCallback((event) => handleDocumentScroll(event)));
115
+ handleAutoPlacement();
116
+ _observer?.observe(detailsRef.current);
117
+ if (!event.target.dataset["test"]) {
118
+ // We need this workaround for snapshot testing
119
+ handleOpenByKeyboardFocus();
120
+ }
121
+ }
122
+ else {
123
+ if (_documentClickListenerCallbackId) {
124
+ new DocumentClickListener().removeCallback(_documentClickListenerCallbackId);
125
+ }
126
+ if (_documentScrollListenerCallbackId) {
127
+ new DocumentScrollListener().removeCallback(_documentScrollListenerCallbackId);
128
+ }
129
+ _observer?.unobserve(detailsRef.current);
130
+ }
131
+ }
132
+ function getNativeSelectValue() {
133
+ if (_values?.length) {
134
+ return _values.at(0) ?? "";
135
+ }
136
+ return "";
137
+ }
138
+ function setDescById(descId) {
139
+ const descByIds = [];
140
+ if (descId) {
141
+ descByIds.push(descId);
142
+ }
143
+ if (_selectedLabelsId && _selectedLabels?.length) {
144
+ descByIds.push(_selectedLabelsId);
145
+ }
146
+ set_descByIds(descByIds.join(" "));
147
+ }
148
+ function getSelectAllLabel() {
149
+ return props.selectAllLabel ?? DEFAULT_LABEL;
150
+ }
151
+ function getOptionLabel(option) {
152
+ return option.label ?? option.value?.toString() ?? "";
153
+ }
154
+ function getOptionChecked(value) {
155
+ if (value && _values?.includes) {
156
+ return _values?.includes(value);
157
+ }
158
+ return false;
159
+ }
160
+ function getTagRemoveLabel(option) {
161
+ const removeTexts = props.removeTagsTexts;
162
+ const options = props.options;
163
+ if (removeTexts && options) {
164
+ // Find the index of the option in the original options array
165
+ const optionIndex = options.findIndex((opt) => opt.value === option.value);
166
+ if (optionIndex >= 0 && optionIndex < removeTexts.length) {
167
+ return removeTexts[optionIndex];
168
+ }
169
+ }
170
+ // Fallback to default behavior
171
+ return `${DEFAULT_REMOVE} ${getOptionLabel(option)}`;
172
+ }
173
+ function handleTagRemove(option, event) {
174
+ if (event) {
175
+ event.stopPropagation();
176
+ }
177
+ handleSelect(option.value);
178
+ handleSummaryFocus();
179
+ }
180
+ function handleAutoPlacement() {
181
+ if (detailsRef.current) {
182
+ const dropdown = detailsRef.current.querySelector("article");
183
+ if (dropdown) {
184
+ // This is a workaround for Angular
185
+ void delay(() => {
186
+ handleFixedDropdown(dropdown, detailsRef.current, props.placement ?? "bottom");
187
+ }, 1);
188
+ }
189
+ }
190
+ }
191
+ function handleArrowDownUp(event) {
192
+ if (detailsRef.current?.open) {
193
+ if (self.document) {
194
+ const activeElement = self.document.activeElement;
195
+ if (activeElement) {
196
+ // 1. we check if we are currently focusing a checkbox in the dropdown
197
+ const isCheckbox = activeElement.getAttribute("type") === "checkbox" ||
198
+ activeElement.getAttribute("type") === "radio";
199
+ if (isCheckbox) {
200
+ const listElement = activeElement?.closest("li");
201
+ if (event.key === "ArrowDown" || event.key === "ArrowRight") {
202
+ // Find next element with input, skipping group titles
203
+ let nextElement = listElement?.nextElementSibling;
204
+ while (nextElement) {
205
+ const nextInput = nextElement.querySelector("input");
206
+ if (nextInput) {
207
+ nextInput.focus();
208
+ break;
209
+ }
210
+ nextElement = nextElement.nextElementSibling;
211
+ }
212
+ if (!nextElement) {
213
+ // We are on the last checkbox we move to the top checkbox
214
+ handleFocusFirstDropdownCheckbox(activeElement);
215
+ }
216
+ }
217
+ else {
218
+ // Find previous element with input, skipping group titles
219
+ let prevElement = listElement?.previousElementSibling;
220
+ while (prevElement) {
221
+ const prevInput = prevElement.querySelector("input");
222
+ if (prevInput) {
223
+ prevInput.focus();
224
+ break;
225
+ }
226
+ prevElement = prevElement.previousElementSibling;
227
+ }
228
+ if (!prevElement) {
229
+ // Check if we have a "select all" checkbox (only relevant for multi-select)
230
+ const selectAllCheckbox = detailsRef.current.querySelector(`input[type="checkbox"]`);
231
+ if (selectAllCheckbox && selectAllCheckbox !== activeElement) {
232
+ // We are on the top list checkbox but there is a select all checkbox as well
233
+ handleFocusFirstDropdownCheckbox(activeElement);
234
+ }
235
+ else {
236
+ // We are on the top checkbox, we need to move to the search
237
+ // or to the last checkbox
238
+ const search = getSearchInput(detailsRef.current);
239
+ if (search) {
240
+ void delay(() => {
241
+ search.focus();
242
+ }, 100);
243
+ }
244
+ else {
245
+ const checkboxList = Array.from(detailsRef.current?.querySelectorAll(`input[type="checkbox"],input[type="radio"]`));
246
+ if (checkboxList.length) {
247
+ checkboxList.at(-1)?.focus();
248
+ }
249
+ }
250
+ }
251
+ }
252
+ }
253
+ }
254
+ else {
255
+ // 2. If we are on the search, and press up we go back to summary and close
256
+ if (activeElement.getAttribute("type") === "search" &&
257
+ (event.key === "ArrowUp" || event.key === "ArrowLeft")) {
258
+ handleClose(undefined, true);
259
+ handleSummaryFocus();
260
+ }
261
+ else {
262
+ // 3. Otherwise, we need to move to the first checkbox
263
+ handleFocusFirstDropdownCheckbox(activeElement);
264
+ }
265
+ }
266
+ }
267
+ }
268
+ }
269
+ else if (event.key === "ArrowDown" || event.key === "ArrowRight") {
270
+ // Open dropdown with arrows see https://www.w3.org/WAI/ARIA/apg/patterns/combobox/#keyboardinteraction
271
+ handleAutoPlacement();
272
+ if (detailsRef.current) {
273
+ detailsRef.current.open = true;
274
+ }
275
+ handleOpenByKeyboardFocus();
276
+ }
277
+ event.stopPropagation();
278
+ event.preventDefault();
279
+ }
280
+ function handleKeyboardPress(event) {
281
+ event.stopPropagation();
282
+ if (event.key === "Escape" && detailsRef.current?.open) {
283
+ handleClose(undefined, true);
284
+ handleSummaryFocus();
285
+ }
286
+ else if (event.key === "Enter" && detailsRef.current?.open) {
287
+ // Handle Enter key to select option like Space key
288
+ if (self.document) {
289
+ const activeElement = self.document.activeElement;
290
+ if (["checkbox", "radio"].includes(activeElement.getAttribute("type") || "")) {
291
+ // Trigger click to simulate Space key behavior
292
+ activeElement.click();
293
+ event.preventDefault();
294
+ }
295
+ else if (activeElement.getAttribute("type") === "search") {
296
+ // When Enter is pressed in search field, select the first available option
297
+ const firstOption = _options?.find((opt) => !opt.isGroupTitle && !opt.disabled);
298
+ if (firstOption?.value) {
299
+ handleSelect(firstOption.value);
300
+ event.preventDefault();
301
+ }
302
+ }
303
+ }
304
+ }
305
+ else if (event.key === "ArrowDown" ||
306
+ event.key === "ArrowUp" ||
307
+ event.key === "ArrowLeft" ||
308
+ event.key === "ArrowRight") {
309
+ handleArrowDownUp(event);
310
+ }
311
+ }
312
+ function handleClose(event, forceClose) {
313
+ if (detailsRef.current) {
314
+ if (forceClose) {
315
+ detailsRef.current.open = false;
316
+ handleSummaryFocus();
317
+ }
318
+ else if (detailsRef.current.open && event) {
319
+ if (event.relatedTarget) {
320
+ const relatedTarget = event.relatedTarget;
321
+ // We close if the focus is on something like a <button> etc. which is not inside the <details> element
322
+ // Inside a <dialog> there is some focus problem because of the top-layer
323
+ // We do not want to focus <dialog> itself
324
+ if (!detailsRef.current.contains(relatedTarget) &&
325
+ relatedTarget.localName !== "dialog") {
326
+ // We need to use delay here because the combination of `contains`
327
+ // and changing the DOM element causes a race condition inside browser
328
+ void delay(() => (detailsRef.current.open = false), 1);
329
+ }
330
+ }
331
+ }
332
+ }
333
+ }
334
+ function handleDocumentClose(event) {
335
+ if (event) {
336
+ // stencil is sending a custom event which wraps the pointer event into details
337
+ const target = event.target;
338
+ if (detailsRef.current?.open && !detailsRef.current.contains(target)) {
339
+ detailsRef.current.open = false;
340
+ }
341
+ }
342
+ }
343
+ function handleOptionSelected(values) {
344
+ const skip = new Date().getTime() - _internalChangeTimestamp < 200;
345
+ if (skip)
346
+ return;
347
+ set_values(values);
348
+ set_userInteraction(true);
349
+ if (props.onOptionSelected) {
350
+ props.onOptionSelected(values ?? []);
351
+ }
352
+ set_internalChangeTimestamp(new Date().getTime());
353
+ }
354
+ function handleSelect(value) {
355
+ if (value) {
356
+ if (props.multiple) {
357
+ if (_values?.includes(value)) {
358
+ handleOptionSelected(_values.filter((v) => v !== value));
359
+ }
360
+ else {
361
+ handleOptionSelected([...(_values || []), value]);
362
+ }
363
+ }
364
+ else {
365
+ handleOptionSelected([value]);
366
+ handleClose(undefined, true);
367
+ }
368
+ }
369
+ }
370
+ function handleSelectAll(event) {
371
+ event.stopPropagation();
372
+ if (_values?.length === amountOptions) {
373
+ handleOptionSelected([]);
374
+ }
375
+ else {
376
+ const searchValue = searchEnabled && searchInputRef.current
377
+ ? searchInputRef.current.value
378
+ : undefined;
379
+ handleOptionSelected(props.options
380
+ ? props
381
+ .options.filter((option) => !option.isGroupTitle &&
382
+ (!searchValue ||
383
+ option.value
384
+ ?.toLowerCase()
385
+ .includes(searchValue.toLowerCase())))
386
+ .map((option) => option.value ?? "")
387
+ : []);
388
+ }
389
+ }
390
+ function handleFocusFirstDropdownCheckbox(activeElement) {
391
+ if (detailsRef.current) {
392
+ const checkboxes = Array.from(detailsRef.current.querySelectorAll(`input[type="checkbox"],input[type="radio"]`));
393
+ if (checkboxes.length) {
394
+ const first = checkboxes.at(0);
395
+ const checkbox = first === activeElement && checkboxes.length > 1
396
+ ? checkboxes.at(1)
397
+ : first;
398
+ if (checkbox) {
399
+ void delay(() => {
400
+ // Takes some time until element can be focused
401
+ checkbox.focus();
402
+ }, 1);
403
+ }
404
+ }
405
+ }
406
+ }
407
+ function handleOpenByKeyboardFocus() {
408
+ if (detailsRef.current) {
409
+ // Focus search if possible
410
+ const search = getSearchInput(detailsRef.current);
411
+ if (search) {
412
+ void delay(() => {
413
+ // Takes some time until element can be focused
414
+ search.focus();
415
+ }, 1);
416
+ }
417
+ else {
418
+ // Focus first checkbox otherwise
419
+ handleFocusFirstDropdownCheckbox();
420
+ }
421
+ }
422
+ }
423
+ function handleSearch(valueOrEvent) {
424
+ if (valueOrEvent === undefined) {
425
+ return;
426
+ }
427
+ let filterText;
428
+ if (typeof valueOrEvent === "string") {
429
+ filterText = valueOrEvent;
430
+ }
431
+ else {
432
+ const event = valueOrEvent;
433
+ event.stopPropagation();
434
+ if (props.onSearch) {
435
+ props.onSearch(event);
436
+ }
437
+ filterText = event.target.value;
438
+ set_searchValue(filterText);
439
+ }
440
+ if (!props.options || !filterText || filterText.length === 0) {
441
+ set_options(props.options);
442
+ }
443
+ else if (props.searchFilter) {
444
+ set_options(props.options.filter((option) => props.searchFilter(option, filterText)));
445
+ }
446
+ else {
447
+ set_options(props.options.filter((option) => !option.isGroupTitle &&
448
+ getOptionLabel(option)
449
+ .toLowerCase()
450
+ .includes(filterText.toLowerCase())));
451
+ }
452
+ if (detailsRef.current?.open) {
453
+ handleAutoPlacement();
454
+ }
455
+ }
456
+ function handleClearAll(event) {
457
+ event.stopPropagation();
458
+ handleOptionSelected([]);
459
+ handleSummaryFocus();
460
+ }
461
+ function handleSummaryFocus() {
462
+ if (detailsRef.current) {
463
+ detailsRef.current
464
+ .querySelector("summary")
465
+ ?.focus();
466
+ }
467
+ }
468
+ const [selectAllChecked, setSelectAllChecked] = useState(() => false);
469
+ const [selectAllIndeterminate, setSelectAllIndeterminate] = useState(() => false);
470
+ function resetIds() {
471
+ const mId = props.id ?? props.propOverrides?.id ?? `custom-select-${uuid}`;
472
+ set_id(mId);
473
+ set_messageId(mId + DEFAULT_MESSAGE_ID_SUFFIX);
474
+ set_validMessageId(mId + DEFAULT_VALID_MESSAGE_ID_SUFFIX);
475
+ set_invalidMessageId(mId + DEFAULT_INVALID_MESSAGE_ID_SUFFIX);
476
+ set_selectId(mId + DEFAULT_SELECT_ID_SUFFIX);
477
+ set_labelId(mId + DEFAULT_LABEL_ID_SUFFIX);
478
+ set_summaryId(mId + "-summary");
479
+ set_placeholderId(mId + DEFAULT_PLACEHOLDER_ID_SUFFIX);
480
+ set_selectedLabelsId(mId + "-selected-labels");
481
+ set_infoTextId(mId + "-info");
482
+ }
483
+ function satisfyReact(event) {
484
+ // This is a function to satisfy React
485
+ event.stopPropagation();
486
+ }
487
+ useEffect(() => {
488
+ resetIds();
489
+ set_invalidMessage(props.invalidMessage || DEFAULT_INVALID_MESSAGE);
490
+ if (typeof window !== "undefined" && "IntersectionObserver" in window) {
491
+ set_observer(new IntersectionObserver((payload) => {
492
+ if (detailsRef.current) {
493
+ const entry = payload.find(({ target }) => target === detailsRef.current);
494
+ if (entry && !entry.isIntersecting && detailsRef.current.open) {
495
+ detailsRef.current.open = false;
496
+ }
497
+ }
498
+ }));
499
+ }
500
+ }, []);
501
+ useEffect(() => {
502
+ if (props.id ?? props.propOverrides?.id) {
503
+ resetIds();
504
+ }
505
+ }, [props.id, props.propOverrides?.id]);
506
+ useEffect(() => {
507
+ if (detailsRef.current) {
508
+ detailsRef.current.addEventListener("focusout", (event) => handleClose(event));
509
+ }
510
+ }, [detailsRef.current]);
511
+ useEffect(() => {
512
+ if (_id) {
513
+ const messageId = _id + DEFAULT_MESSAGE_ID_SUFFIX;
514
+ set_labelId(_id + DEFAULT_LABEL_ID_SUFFIX);
515
+ set_selectId(_id + DEFAULT_SELECT_ID_SUFFIX);
516
+ set_validMessageId(_id + DEFAULT_VALID_MESSAGE_ID_SUFFIX);
517
+ set_invalidMessageId(_id + DEFAULT_INVALID_MESSAGE_ID_SUFFIX);
518
+ set_placeholderId(_id + DEFAULT_PLACEHOLDER_ID_SUFFIX);
519
+ if (stringPropVisible(props.message, props.showMessage)) {
520
+ setDescById(messageId);
521
+ }
522
+ else {
523
+ setDescById();
524
+ }
525
+ }
526
+ }, [_id]);
527
+ useEffect(() => {
528
+ if (detailsRef.current) {
529
+ const summary = detailsRef.current.querySelector("summary");
530
+ if (summary) {
531
+ summary.setAttribute("aria-describedby", props.ariaDescribedBy ?? (_descByIds || ""));
532
+ }
533
+ }
534
+ }, [detailsRef.current, _descByIds]);
535
+ useEffect(() => {
536
+ if (props.showNoResults !== undefined) {
537
+ set_hasNoOptions(props.showNoResults);
538
+ }
539
+ else if (_options) {
540
+ set_hasNoOptions(_options.length === 0);
541
+ }
542
+ }, [props.showNoResults, props.showLoading, _options]);
543
+ useEffect(() => {
544
+ setSelectAllEnabled(Boolean(props.multiple && (props.showSelectAll ?? amountOptions > 5)));
545
+ }, [props.showSelectAll, amountOptions, props.multiple]);
546
+ useEffect(() => {
547
+ setSearchEnabled(props.showSearch ?? amountOptions > 9);
548
+ }, [props.showSearch, amountOptions]);
549
+ useEffect(() => {
550
+ const v = props.values;
551
+ if (Array.isArray(v)) {
552
+ if (_values !== v) {
553
+ set_values(v);
554
+ }
555
+ }
556
+ else if (v == null && _values?.length !== 0) {
557
+ set_values([]);
558
+ }
559
+ }, [props.values]);
560
+ useEffect(() => {
561
+ if (selectRef.current) {
562
+ handleValidation();
563
+ }
564
+ }, [_values, selectRef.current]);
565
+ useEffect(() => {
566
+ if (selectRef.current) {
567
+ let controller = abortController;
568
+ if (!controller) {
569
+ controller = new AbortController();
570
+ setAbortController(controller);
571
+ }
572
+ const initialValues = props.values;
573
+ addResetEventListener(selectRef.current, () => {
574
+ const resetValue = initialValues
575
+ ? initialValues
576
+ : selectRef.current.value
577
+ ? [selectRef.current.value]
578
+ : [];
579
+ handleOptionSelected(resetValue);
580
+ handleValidation();
581
+ }, controller.signal);
582
+ }
583
+ }, [selectRef.current]);
584
+ useEffect(() => {
585
+ set_validity(props.validation);
586
+ }, [props.validation]);
587
+ useEffect(() => {
588
+ if (_values?.length === 0) {
589
+ setSelectAllChecked(false);
590
+ setSelectAllIndeterminate(false);
591
+ }
592
+ else if (_values?.length === amountOptions) {
593
+ setSelectAllIndeterminate(false);
594
+ setSelectAllChecked(true);
595
+ }
596
+ else if (_values) {
597
+ setSelectAllIndeterminate(true);
598
+ }
599
+ }, [_values, amountOptions]);
600
+ useEffect(() => {
601
+ set_options(props.options);
602
+ setAmountOptions(props.options?.filter((option) => !option.isGroupTitle).length ?? 0);
603
+ // Reposition open auto-width dropdowns: replacing options can change their content width.
604
+ if (detailsRef.current?.open) {
605
+ handleAutoPlacement();
606
+ }
607
+ }, [props.options]);
608
+ useEffect(() => {
609
+ set_searchValue(props.searchValue);
610
+ if (props.searchValue) {
611
+ const sValue = props.searchValue; // <- workaround for Angular
612
+ handleSearch(sValue);
613
+ }
614
+ }, [props.searchValue]);
615
+ useEffect(() => {
616
+ if (props.options?.length) {
617
+ set_selectedOptions(props.options?.filter((option) => {
618
+ if (!option.value || !_values?.["includes"]) {
619
+ return false;
620
+ }
621
+ return !option.isGroupTitle && _values?.includes(option.value);
622
+ }));
623
+ }
624
+ }, [props.options, _values]);
625
+ useEffect(() => {
626
+ if (props.selectedLabels) {
627
+ set_selectedLabels(props.selectedLabels);
628
+ return;
629
+ }
630
+ if (_selectedOptions?.length) {
631
+ if (props.transformSelectedLabels) {
632
+ // We need to add this to another ``const`` for Angular generated output to work
633
+ const selectedOptions = _selectedOptions;
634
+ const transformFn = props.transformSelectedLabels;
635
+ set_selectedLabels(transformFn(selectedOptions));
636
+ return;
637
+ }
638
+ if (props.selectedType === "amount") {
639
+ set_selectedLabels(props.amountText
640
+ ? props.amountText
641
+ : `${_selectedOptions?.length} ${DEFAULT_SELECTED}`);
642
+ }
643
+ else {
644
+ set_selectedLabels(_selectedOptions
645
+ ?.map((option) => getOptionLabel(option))
646
+ .join(", "));
647
+ }
648
+ }
649
+ else {
650
+ set_selectedLabels("");
651
+ }
652
+ }, [
653
+ _selectedOptions,
654
+ props.selectedType,
655
+ props.amountText,
656
+ props.selectedLabels,
657
+ props.transformSelectedLabels,
658
+ ]);
659
+ useEffect(() => {
660
+ if (props.onAmountChange) {
661
+ props.onAmountChange(_selectedOptions?.length ?? 0);
662
+ }
663
+ }, [_selectedOptions]);
664
+ useEffect(() => {
665
+ if (selectAllRef.current) {
666
+ selectAllRef.current.indeterminate = Boolean(selectAllIndeterminate);
667
+ }
668
+ }, [selectAllIndeterminate, selectAllRef.current]);
669
+ useEffect(() => {
670
+ set_invalidMessage(props.invalidMessage ||
671
+ selectRef.current?.validationMessage ||
672
+ DEFAULT_INVALID_MESSAGE);
673
+ }, [selectRef.current, props.invalidMessage]);
674
+ useEffect(() => {
675
+ return () => {
676
+ abortController?.abort();
677
+ };
678
+ }, []);
679
+ return (_jsxs("div", { id: _id, ref: _ref, ...filterPassingProps(props, ["data-icon-variant", "data-icon-variant-before", "data-icon-variant-after", "data-icon-weight", "data-icon-weight-before", "data-icon-weight-after", "data-interactive", "data-force-mobile", "data-color", "data-container-color", "data-bg-color", "data-on-bg-color", "data-color-scheme", "data-font-size", "data-headline-size", "data-divider", "data-focus", "data-font", "data-density", "onOptionSelected", "onAmountChange", "onDropdownToggle"]), ...getRootProps(props, ["data-icon-variant", "data-icon-variant-before", "data-icon-variant-after", "data-icon-weight", "data-icon-weight-before", "data-icon-weight-after", "data-interactive", "data-force-mobile", "data-color", "data-container-color", "data-bg-color", "data-on-bg-color", "data-color-scheme", "data-font-size", "data-headline-size", "data-divider", "data-focus", "data-font", "data-density"]), className: cls("db-custom-select", props.className), "aria-invalid": _validity === "invalid", "data-custom-validity": _validity, "data-width": props.formFieldWidth, "data-variant": props.variant === "floating" &&
680
+ props.selectedType === "tag" &&
681
+ props.multiple
682
+ ? "above"
683
+ : props.variant, "data-required": getBooleanAsString(props.required, "required"), "data-hide-asterisk": getHideProp(props.showRequiredAsterisk), "data-placement": props.placement, "data-selected-type": props.multiple ? props.selectedType : "text", "data-hide-label": getHideProp(props.showLabel), "data-icon": props.icon, "data-show-icon": getBooleanAsString(props.showIcon, "showIcon"), children: [_jsxs("label", { id: _labelId, children: [props.label ?? DEFAULT_LABEL, _jsx("select", { role: "none", hidden: true, id: _selectId, tabIndex: -1, ref: selectRef, form: props.form, name: props.name, "data-custom-validity": _validity, multiple: getBoolean(props.multiple, "multiple"), disabled: getBoolean(props.disabled, "disabled"), required: getBoolean(props.required, "required"), onChange: (event) => satisfyReact(event), children: props.options?.length ? (_jsx(_Fragment, { children: props.options?.map((option) => (_jsx("option", { disabled: option.disabled, value: option.value, children: getOptionLabel(option) }, getOptionKey(option, "native-select-option-")))) })) : null })] }), _jsxs("details", { ref: detailsRef, open: props.open, onToggle: (event) => handleDropdownToggle(event), onKeyDown: (event) => handleKeyboardPress(event), children: [props.children, props.options ? (_jsxs(_Fragment, { children: [_jsxs("summary", { className: "db-custom-select-form-field", id: _summaryId, "aria-disabled": getBooleanAsString(props.disabled, "disabled"), tabIndex: props.disabled ? -1 : undefined, "aria-labelledby": _labelId, children: [_selectedLabels?.length ? (_jsxs("span", { "data-visually-hidden": getBooleanAsString(props.selectedType === "tag", "selectedType"), id: _selectedLabelsId, children: [props.selectedPrefix ? (_jsx("span", { "data-visually-hidden": "true", children: props.selectedPrefix })) : null, _selectedLabels] })) : null, props.selectedType === "tag" ? (_jsx("div", { children: _selectedOptions?.map((option) => (_jsx(DBTag, { emphasis: "strong", behavior: "removable", removeButton: getTagRemoveLabel(option), onRemove: (event) => handleTagRemove(option, event), children: getOptionLabel(option) }, getOptionKey(option, "tag-")))) })) : null] }), _jsxs(DBCustomSelectDropdown, { width: props.dropdownWidth, children: [searchEnabled ? (_jsx("div", { children: _jsx(DBInput, { type: "search", ref: searchInputRef, name: _id, form: _id, showLabel: false, value: _searchValue, label: props.searchLabel ?? DEFAULT_LABEL, placeholder: props.searchPlaceholder ?? props.searchLabel, ariaDescribedBy: _hasNoOptions || props.showLoading
684
+ ? _infoTextId
685
+ : undefined, onInput: (event) => handleSearch(event) }) })) : null, _hasNoOptions || props.showLoading ? (_jsx(DBInfotext, { id: _infoTextId, icon: props.showLoading ? "circular_arrows" : undefined, semantic: props.showLoading ? "informational" : "warning", children: (props.showLoading
686
+ ? props.loadingText
687
+ : props.noResultsText) ?? DEFAULT_MESSAGE })) : (_jsx(_Fragment, { children: _jsxs(_Fragment, { children: [selectAllEnabled ? (_jsx("div", { children: _jsx("div", { className: "db-checkbox db-custom-select-list-item", children: _jsxs("label", { children: [_jsx("input", { type: "checkbox", value: "select-all", ref: selectAllRef, form: _id, checked: selectAllChecked, onChange: (event) => handleSelectAll(event) }), getSelectAllLabel()] }) }) })) : null, _jsx(DBCustomSelectList, { multiple: getBoolean(props.multiple, "multiple"), label: props.listLabel ?? props.label ?? DEFAULT_LABEL, children: _options?.map((option) => (_jsx(DBCustomSelectListItem, { type: props.multiple ? "checkbox" : "radio", showDivider: option.showDivider, icon: option.icon, isGroupTitle: option.isGroupTitle, groupTitle: getOptionLabel(option), name: _id, checked: getOptionChecked(option.value), disabled: option.disabled, value: option.value, onChange: (event) => handleSelect(option.value), children: !option.isGroupTitle ? (_jsx(_Fragment, { children: getOptionLabel(option) })) : null }, getOptionKey(option, "custom-select-list-item-")))) })] }) })), _jsx("div", { children: _jsx(DBButton, { variant: "ghost", width: "full", icon: "cross", size: "small", name: _id, form: _id, onClick: (event) => handleClose(undefined, true), children: props.mobileCloseButtonText ?? DEFAULT_CLOSE_BUTTON }) })] })] })) : null] }), (props.showClearSelection ?? true) && _values?.length ? (_jsxs(DBButton, { icon: "cross", variant: "ghost", size: "small", noText: true, name: _id, form: _id, disabled: getBoolean(props.disabled, "disabled"), onClick: (event) => handleClearAll(event), children: [props.clearSelectionText, _jsx(DBTooltip, { placement: "top", children: props.clearSelectionText })] })) : null, _jsx("span", { className: "db-custom-select-placeholder", "aria-hidden": "true", id: _placeholderId, children: props.placeholder ?? props.label }), stringPropVisible(props.message, props.showMessage) ? (_jsx(DBInfotext, { size: "small", icon: props.messageIcon, id: _messageId, children: props.message })) : null, hasValidState() ? (_jsx(DBInfotext, { size: "small", semantic: "successful", id: _validMessageId, children: props.validMessage || DEFAULT_VALID_MESSAGE })) : null, _jsx(DBInfotext, { size: "small", semantic: "critical", id: _invalidMessageId, children: _invalidMessage }), _jsx("span", { "data-visually-hidden": "true", role: "status", children: _voiceOverFallback })] }));
508
688
  }
509
- var xe = d(v);
510
- //#endregion
511
- export { xe as default };
689
+ const DBCustomSelect = forwardRef(DBCustomSelectFn);
690
+ export default DBCustomSelect;