@servicetitan/anvil2 1.49.4 → 1.49.6

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 (208) hide show
  1. package/CHANGELOG.md +34 -0
  2. package/dist/{Breadcrumbs-DjR-2OEH.js → Breadcrumbs-Y6IaMoi5.js} +2 -2
  3. package/dist/{Breadcrumbs-DjR-2OEH.js.map → Breadcrumbs-Y6IaMoi5.js.map} +1 -1
  4. package/dist/Breadcrumbs.js +1 -1
  5. package/dist/{Calendar-BkJs1qTF.js → Calendar-B5Ednjem.js} +2 -2
  6. package/dist/{Calendar-BkJs1qTF.js.map → Calendar-B5Ednjem.js.map} +1 -1
  7. package/dist/{Calendar-WHERvu2Y.js → Calendar-Ce08LvdP.js} +2 -2
  8. package/dist/{Calendar-WHERvu2Y.js.map → Calendar-Ce08LvdP.js.map} +1 -1
  9. package/dist/Calendar.js +2 -2
  10. package/dist/{Checkbox-C5Qjq_tU.js → Checkbox-ByaZv8wu.js} +2 -2
  11. package/dist/{Checkbox-C5Qjq_tU.js.map → Checkbox-ByaZv8wu.js.map} +1 -1
  12. package/dist/{Checkbox-Bhjj-jM4.js → Checkbox-nE-_tWmc.js} +4 -3
  13. package/dist/{Checkbox-Bhjj-jM4.js.map → Checkbox-nE-_tWmc.js.map} +1 -1
  14. package/dist/Checkbox.js +2 -2
  15. package/dist/Checkbox.module-D4EgXL0i.js +27 -0
  16. package/dist/Checkbox.module-D4EgXL0i.js.map +1 -0
  17. package/dist/{Chip-X2EwdZ97.js → Chip-UqdorCE2.js} +23 -17
  18. package/dist/Chip-UqdorCE2.js.map +1 -0
  19. package/dist/Chip.js +1 -1
  20. package/dist/Combobox-Dy4IZDg1.js +4281 -0
  21. package/dist/Combobox-Dy4IZDg1.js.map +1 -0
  22. package/dist/Combobox.js +1 -1
  23. package/dist/{DataTable--vA-HttA.js → DataTable-D6MmOQF2.js} +8 -8
  24. package/dist/{DataTable--vA-HttA.js.map → DataTable-D6MmOQF2.js.map} +1 -1
  25. package/dist/{DateField-BNleIuS8.js → DateField-BxS9LZG7.js} +6 -6
  26. package/dist/{DateField-BNleIuS8.js.map → DateField-BxS9LZG7.js.map} +1 -1
  27. package/dist/DateField.js +1 -1
  28. package/dist/{DateFieldRange-BBgvno-_.js → DateFieldRange-BdDiHUfv.js} +7 -7
  29. package/dist/{DateFieldRange-BBgvno-_.js.map → DateFieldRange-BdDiHUfv.js.map} +1 -1
  30. package/dist/DateFieldRange.js +1 -1
  31. package/dist/{DateFieldSingle-Bcwkxogy.js → DateFieldSingle-CuQO3LH9.js} +7 -7
  32. package/dist/{DateFieldSingle-Bcwkxogy.js.map → DateFieldSingle-CuQO3LH9.js.map} +1 -1
  33. package/dist/DateFieldSingle.js +1 -1
  34. package/dist/{DateFieldYearless-DnVJaBBq.js → DateFieldYearless-2YhZmNYg.js} +3 -3
  35. package/dist/{DateFieldYearless-DnVJaBBq.js.map → DateFieldYearless-2YhZmNYg.js.map} +1 -1
  36. package/dist/DateFieldYearless.js +1 -1
  37. package/dist/{DateFieldYearlessRange-BivGidsU.js → DateFieldYearlessRange-CgCmvHLs.js} +3 -3
  38. package/dist/{DateFieldYearlessRange-BivGidsU.js.map → DateFieldYearlessRange-CgCmvHLs.js.map} +1 -1
  39. package/dist/DateFieldYearlessRange.js +1 -1
  40. package/dist/{DaysOfTheWeek-Dn6zHxpt.js → DaysOfTheWeek-DlIka9b_.js} +3 -3
  41. package/dist/{DaysOfTheWeek-Dn6zHxpt.js.map → DaysOfTheWeek-DlIka9b_.js.map} +1 -1
  42. package/dist/DaysOfTheWeek.js +1 -1
  43. package/dist/{Dialog-3ptbLquZ.js → Dialog-DSwvbfdW.js} +21 -62
  44. package/dist/Dialog-DSwvbfdW.js.map +1 -0
  45. package/dist/Dialog.css +29 -29
  46. package/dist/Dialog.js +2 -1
  47. package/dist/Dialog.js.map +1 -1
  48. package/dist/DialogCancelButton-sTEfx5kf.js +50 -0
  49. package/dist/DialogCancelButton-sTEfx5kf.js.map +1 -0
  50. package/dist/{Drawer-plkbENfI.js → Drawer-CGYcEj6d.js} +5 -4
  51. package/dist/{Drawer-plkbENfI.js.map → Drawer-CGYcEj6d.js.map} +1 -1
  52. package/dist/Drawer.js +1 -1
  53. package/dist/{DrawerContext-D4tWTLVf.js → DrawerContext-Cs3k160L.js} +127 -2
  54. package/dist/{DrawerContext-D4tWTLVf.js.map → DrawerContext-Cs3k160L.js.map} +1 -1
  55. package/dist/{FieldLabel-CHMCV9wX.js → FieldLabel-jqlQ1Ldh.js} +2 -2
  56. package/dist/{FieldLabel-CHMCV9wX.js.map → FieldLabel-jqlQ1Ldh.js.map} +1 -1
  57. package/dist/FieldLabel.js +1 -1
  58. package/dist/{InputMask-Cd01c3Tj.js → InputMask-DaN_Adz6.js} +3 -3
  59. package/dist/{InputMask-Cd01c3Tj.js.map → InputMask-DaN_Adz6.js.map} +1 -1
  60. package/dist/InputMask.js +1 -1
  61. package/dist/{Link-DuYh7Xl2.js → Link-DqZxs0kQ.js} +13 -4
  62. package/dist/Link-DqZxs0kQ.js.map +1 -0
  63. package/dist/Link.css +27 -19
  64. package/dist/Link.js +1 -1
  65. package/dist/Link.module-CjeOl2NH.js +14 -0
  66. package/dist/Link.module-CjeOl2NH.js.map +1 -0
  67. package/dist/{LinkButton-pIUNATNE.js → LinkButton-jb2Gc3hC.js} +5 -2
  68. package/dist/LinkButton-jb2Gc3hC.js.map +1 -0
  69. package/dist/LinkButton.js +1 -1
  70. package/dist/{ListView-CZ5T8bR1.js → ListView-B1I7Ii3g.js} +2 -2
  71. package/dist/{ListView-CZ5T8bR1.js.map → ListView-B1I7Ii3g.js.map} +1 -1
  72. package/dist/ListView.js +1 -1
  73. package/dist/{Menu-DUAfSImY.js → Menu-Cn2JJe1Y.js} +2 -2
  74. package/dist/{Menu-DUAfSImY.js.map → Menu-Cn2JJe1Y.js.map} +1 -1
  75. package/dist/Menu.js +1 -1
  76. package/dist/{NumberField-C62E56_v.js → NumberField-BdK4U9mW.js} +2 -2
  77. package/dist/{NumberField-C62E56_v.js.map → NumberField-BdK4U9mW.js.map} +1 -1
  78. package/dist/NumberField.js +1 -1
  79. package/dist/{Page-Bc8ko-eM.js → Page-C-yMjgoO.js} +7 -7
  80. package/dist/{Page-Bc8ko-eM.js.map → Page-C-yMjgoO.js.map} +1 -1
  81. package/dist/Page.js +1 -1
  82. package/dist/{Pagination-BHEEnNas.js → Pagination-CnF6yBr5.js} +2 -2
  83. package/dist/{Pagination-BHEEnNas.js.map → Pagination-CnF6yBr5.js.map} +1 -1
  84. package/dist/Pagination.js +1 -1
  85. package/dist/{Popover-CIPg_ZgX.js → Popover-CcMDyKTj.js} +2 -2
  86. package/dist/{Popover-CIPg_ZgX.js.map → Popover-CcMDyKTj.js.map} +1 -1
  87. package/dist/Popover.js +1 -1
  88. package/dist/{ProgressBar-CUpF9fFW.js → ProgressBar-CufkbVu5.js} +2 -2
  89. package/dist/{ProgressBar-CUpF9fFW.js.map → ProgressBar-CufkbVu5.js.map} +1 -1
  90. package/dist/ProgressBar.js +1 -1
  91. package/dist/{Radio-CyCFna1X.js → Radio-BeBG7Ksw.js} +2 -2
  92. package/dist/{Radio-CyCFna1X.js.map → Radio-BeBG7Ksw.js.map} +1 -1
  93. package/dist/Radio.js +2 -2
  94. package/dist/{RadioGroup-DRS2EjVH.js → RadioGroup-BAjpkCjp.js} +2 -2
  95. package/dist/{RadioGroup-DRS2EjVH.js.map → RadioGroup-BAjpkCjp.js.map} +1 -1
  96. package/dist/{SearchField-DrgNbG3I.js → SearchField-D6bICv4b.js} +36 -7
  97. package/dist/SearchField-D6bICv4b.js.map +1 -0
  98. package/dist/SearchField.css +13 -8
  99. package/dist/SearchField.js +1 -1
  100. package/dist/{SelectCard-lBcnP5j5.js → SelectCard-DDN7qqHv.js} +3 -3
  101. package/dist/{SelectCard-lBcnP5j5.js.map → SelectCard-DDN7qqHv.js.map} +1 -1
  102. package/dist/SelectCard.js +1 -1
  103. package/dist/SelectField.d.ts +2 -0
  104. package/dist/SelectField.js +2 -0
  105. package/dist/SelectField.js.map +1 -0
  106. package/dist/SelectFieldSync-DQm3_D0v.js +1122 -0
  107. package/dist/SelectFieldSync-DQm3_D0v.js.map +1 -0
  108. package/dist/SelectFieldSync.css +168 -0
  109. package/dist/{SelectTrigger-DdsBqEtU.js → SelectTrigger-CNEhRluU.js} +2 -2
  110. package/dist/{SelectTrigger-DdsBqEtU.js.map → SelectTrigger-CNEhRluU.js.map} +1 -1
  111. package/dist/SelectTrigger.js +1 -1
  112. package/dist/{SelectTriggerBase-BkVt3IP4.js → SelectTriggerBase-Cv6hGsrC.js} +5 -35
  113. package/dist/{SelectTriggerBase-BkVt3IP4.js.map → SelectTriggerBase-Cv6hGsrC.js.map} +1 -1
  114. package/dist/SelectTriggerBase.css +59 -59
  115. package/dist/SelectTriggerBase.module-Ce49lamD.js +35 -0
  116. package/dist/SelectTriggerBase.module-Ce49lamD.js.map +1 -0
  117. package/dist/Table.js +1 -1
  118. package/dist/{TextField-CpVkZxMT.js → TextField--y8q4R2H.js} +2 -2
  119. package/dist/{TextField-CpVkZxMT.js.map → TextField--y8q4R2H.js.map} +1 -1
  120. package/dist/{TextField-CygbgVVt.js → TextField-aMwSN1iP.js} +2 -2
  121. package/dist/{TextField-CygbgVVt.js.map → TextField-aMwSN1iP.js.map} +1 -1
  122. package/dist/TextField.js +1 -1
  123. package/dist/{Textarea-DacevzmW.js → Textarea-D1zwX2h6.js} +2 -2
  124. package/dist/{Textarea-DacevzmW.js.map → Textarea-D1zwX2h6.js.map} +1 -1
  125. package/dist/Textarea.js +1 -1
  126. package/dist/{TimeField-BkOB5ESa.js → TimeField-BHxXbOfe.js} +4 -4
  127. package/dist/{TimeField-BkOB5ESa.js.map → TimeField-BHxXbOfe.js.map} +1 -1
  128. package/dist/TimeField.js +1 -1
  129. package/dist/Toast.js +2 -2
  130. package/dist/{Toaster-nFhRAJc8.js → Toaster-CRp3nf4U.js} +2 -2
  131. package/dist/{Toaster-nFhRAJc8.js.map → Toaster-CRp3nf4U.js.map} +1 -1
  132. package/dist/{Toaster-Dx0cFQwb.js → Toaster-qPt6zb6F.js} +3 -3
  133. package/dist/{Toaster-Dx0cFQwb.js.map → Toaster-qPt6zb6F.js.map} +1 -1
  134. package/dist/{Toolbar-DuuaM0Cz.js → Toolbar-XJrmS4v4.js} +13 -13
  135. package/dist/{Toolbar-DuuaM0Cz.js.map → Toolbar-XJrmS4v4.js.map} +1 -1
  136. package/dist/Toolbar.js +1 -1
  137. package/dist/{Tooltip-CZsoFe6C.js → Tooltip-CBy7srE2.js} +3 -3
  138. package/dist/Tooltip-CBy7srE2.js.map +1 -0
  139. package/dist/Tooltip.js +1 -1
  140. package/dist/{YearlessDateInputWithPicker-MHLlAdrH.js → YearlessDateInputWithPicker-LiMI-Oer.js} +4 -4
  141. package/dist/{YearlessDateInputWithPicker-MHLlAdrH.js.map → YearlessDateInputWithPicker-LiMI-Oer.js.map} +1 -1
  142. package/dist/assets/icons/st/titan_intelligence.svg +1 -1
  143. package/dist/assets/icons/st/transactional.svg +1 -0
  144. package/dist/assets/icons/st.ts +1 -0
  145. package/dist/beta/components/SelectField/SelectField.d.ts +2 -0
  146. package/dist/beta/components/SelectField/SelectFieldSync.d.ts +39 -0
  147. package/dist/beta/components/SelectField/index.d.ts +3 -0
  148. package/dist/beta/components/SelectField/internal/FieldDialog/FieldDialog.d.ts +8 -0
  149. package/dist/beta/components/SelectField/internal/FieldPopover/FieldPopover.d.ts +8 -0
  150. package/dist/beta/components/SelectField/internal/InView.d.ts +34 -0
  151. package/dist/beta/components/SelectField/internal/SelectFieldInput.d.ts +64 -0
  152. package/dist/beta/components/SelectField/internal/SelectFieldLabel.d.ts +39 -0
  153. package/dist/beta/components/SelectField/internal/SelectFieldList.d.ts +26 -0
  154. package/dist/beta/components/SelectField/internal/SelectFieldListItem.d.ts +14 -0
  155. package/dist/beta/components/SelectField/internal/useCombo.d.ts +31 -0
  156. package/dist/beta/components/SelectField/stories/SelectField.stories.data.d.ts +32 -0
  157. package/dist/beta/components/SelectField/types.d.ts +275 -0
  158. package/dist/beta/components/Table/types.d.ts +1 -1
  159. package/dist/beta/components/index.d.ts +1 -0
  160. package/dist/beta/hooks/index.d.ts +1 -0
  161. package/dist/beta/hooks/useAdaptiveView.d.ts +50 -0
  162. package/dist/beta/index.d.ts +1 -0
  163. package/dist/beta.js +5 -4
  164. package/dist/beta.js.map +1 -1
  165. package/dist/components/ButtonToggle/ButtonToggle.d.ts +1 -1
  166. package/dist/components/Chip/Chip.d.ts +2 -1
  167. package/dist/components/Chip/internal/Chip.d.ts +2 -1
  168. package/dist/components/DateFieldRange/internal/MaskedDateRangeInput.d.ts +1 -1
  169. package/dist/components/DateFieldSingle/internal/MaskedDateInput.d.ts +1 -1
  170. package/dist/components/Link/internal/Link.d.ts +21 -2
  171. package/dist/components/Link/useLinkStyles.d.ts +1 -1
  172. package/dist/components/LinkButton/LinkButton.d.ts +13 -1
  173. package/dist/components/SearchField/SearchField.d.ts +6 -3
  174. package/dist/components/Stepper/Stepper.d.ts +1 -1
  175. package/dist/components/Stepper/StepperStep.d.ts +1 -1
  176. package/dist/components/Tab/Tab.d.ts +1 -1
  177. package/dist/components/Tab/TabButton.d.ts +1 -1
  178. package/dist/{indeterminate_check_box-RY9zr3xS.js → indeterminate_check_box-B4zobNlt.js} +2 -27
  179. package/dist/{indeterminate_check_box-RY9zr3xS.js.map → indeterminate_check_box-B4zobNlt.js.map} +1 -1
  180. package/dist/index.js +39 -38
  181. package/dist/index.js.map +1 -1
  182. package/dist/internal/hooks/index.d.ts +1 -0
  183. package/dist/internal/hooks/useDebouncedCallback/index.d.ts +1 -0
  184. package/dist/internal/hooks/useDebouncedCallback/useDebouncedCallback.d.ts +28 -0
  185. package/dist/internal/hooks/useSelectFieldLoading/index.d.ts +1 -0
  186. package/dist/internal/hooks/useSelectFieldLoading/useSelectFieldLoading.d.ts +102 -0
  187. package/dist/{Combobox-BO-k4QZE.js → match-sorter.esm-CtBw0MrM.js} +4 -4278
  188. package/dist/match-sorter.esm-CtBw0MrM.js.map +1 -0
  189. package/dist/useDialogScrollLock-BW-aVboo.js +41 -0
  190. package/dist/useDialogScrollLock-BW-aVboo.js.map +1 -0
  191. package/dist/{useInitialFocus-Cl_Txu7W.js → useInitialFocus-BpmW7pDB.js} +4 -41
  192. package/dist/useInitialFocus-BpmW7pDB.js.map +1 -0
  193. package/dist/{usePopoverSupport-CWTCDfN2.js → usePopoverSupport-CCSCHnit.js} +2 -2
  194. package/dist/{usePopoverSupport-CWTCDfN2.js.map → usePopoverSupport-CCSCHnit.js.map} +1 -1
  195. package/dist/{utils-aSAOVHjX.js → utils-C-hkPwMi.js} +2 -2
  196. package/dist/{utils-aSAOVHjX.js.map → utils-C-hkPwMi.js.map} +1 -1
  197. package/package.json +1 -1
  198. package/dist/Chip-X2EwdZ97.js.map +0 -1
  199. package/dist/Combobox-BO-k4QZE.js.map +0 -1
  200. package/dist/Dialog-3ptbLquZ.js.map +0 -1
  201. package/dist/Link-DuYh7Xl2.js.map +0 -1
  202. package/dist/Link.module-Cf17JWod.js +0 -12
  203. package/dist/Link.module-Cf17JWod.js.map +0 -1
  204. package/dist/LinkButton-pIUNATNE.js.map +0 -1
  205. package/dist/SearchField-DrgNbG3I.js.map +0 -1
  206. package/dist/Tooltip-CZsoFe6C.js.map +0 -1
  207. package/dist/useInitialFocus-Cl_Txu7W.js.map +0 -1
  208. /package/dist/{indeterminate_check_box.css → Checkbox.css} +0 -0
@@ -0,0 +1,1122 @@
1
+ import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
2
+ import { u as useCombobox, m as matchSorter } from './match-sorter.esm-CtBw0MrM.js';
3
+ import { useState, useRef, useCallback, useEffect, useMemo, forwardRef, useId, useImperativeHandle } from 'react';
4
+ import { S as Spinner } from './Spinner-xEFwsq8_.js';
5
+ import { B as Button } from './Button-92_FKAyV.js';
6
+ import { c as cx } from './index-tZvMCc77.js';
7
+ import { F as Flex } from './Flex-CjPHUTeq.js';
8
+ import { I as Icon } from './Icon-BSuTVNaa.js';
9
+ import { S as SvgIndeterminateCheckBox, a as SvgCheckBox, b as SvgCheckBoxOutlineBlank } from './indeterminate_check_box-B4zobNlt.js';
10
+ import { S as SvgCheck } from './check-Cf67OWrZ.js';
11
+ import { T as Text } from './Text-kPA-VzsB.js';
12
+ import { u as useIntersectionObserver } from './useIntersectionObserver-BEmMDO3P.js';
13
+ import { S as SrOnly } from './SrOnly-CTsYSuby.js';
14
+ import { s as styles$4 } from './SelectTriggerBase.module-Ce49lamD.js';
15
+ import { S as SvgChevronRight } from './chevron_right-BdpsxX7x.js';
16
+ import { S as SvgClose } from './close-DZj38AEh.js';
17
+ import { F as FieldLabel } from './FieldLabel-jqlQ1Ldh.js';
18
+ import { B as computePosition, A as autoUpdate, o as offset, L as autoPlacement, i as size, D as DialogContext } from './DrawerContext-Cs3k160L.js';
19
+ import { u as useBreakpoint } from './useBreakpoint-BGCsBhQ7.js';
20
+ import './anvil-fonts.css';import './SelectFieldSync.css';/* empty css */
21
+ import { D as DialogCancelButton } from './DialogCancelButton-sTEfx5kf.js';
22
+ import { u as useDialogScrollLock } from './useDialogScrollLock-BW-aVboo.js';
23
+ import { u as useLayoutPropsUtil } from './useLayoutPropsUtil-BlIWftBb.js';
24
+ import { F as FieldMessage } from './FieldMessage-DWONT3dr.js';
25
+
26
+ const DEFAULT_PAGE_SIZE = 20;
27
+ const DEFAULT_CACHE_MAX_SIZE = 15;
28
+ function useSelectFieldLoading(config) {
29
+ const { lazy, loadOptions: loadOptionsProp, cache: cacheConfig } = config;
30
+ const cacheEnabled = cacheConfig?.enabled !== false;
31
+ const cacheMaxSize = cacheConfig?.maxSize ?? DEFAULT_CACHE_MAX_SIZE;
32
+ const [options, setOptions] = useState([]);
33
+ const [hasMoreToLoad, setHasMoreToLoad] = useState(false);
34
+ const [previousGroup, setPreviousGroup] = useState(
35
+ null
36
+ );
37
+ const [previousPage, setPreviousPage] = useState(0);
38
+ const [previousOffset, setPreviousOffset] = useState(0);
39
+ const [loading, setLoading] = useState(false);
40
+ const [loadingMore, setLoadingMore] = useState(false);
41
+ const [stateCache, setStateCache] = useState(
42
+ () => /* @__PURE__ */ new Map()
43
+ );
44
+ const currentSearchValueRef = useRef("");
45
+ const appendOptions = useCallback((newOptions) => {
46
+ setOptions((prevOptions) => prevOptions.concat(newOptions));
47
+ }, []);
48
+ const pageSize = lazy === "page" ? config.pageSize : DEFAULT_PAGE_SIZE;
49
+ const limit = lazy === "offset" ? config.limit : DEFAULT_PAGE_SIZE;
50
+ const restoreFromCache = useCallback((cached) => {
51
+ setOptions(cached.options);
52
+ setHasMoreToLoad(cached.hasMore);
53
+ setPreviousPage(cached.previousPage);
54
+ setPreviousOffset(cached.previousOffset);
55
+ setPreviousGroup(cached.previousGroup);
56
+ }, []);
57
+ useEffect(() => {
58
+ if (!cacheEnabled) return;
59
+ const searchValue = currentSearchValueRef.current;
60
+ if (options.length === 0) return;
61
+ setStateCache((prev) => {
62
+ if (prev.size >= cacheMaxSize) {
63
+ prev.clear();
64
+ }
65
+ prev.set(searchValue, {
66
+ options,
67
+ hasMore: hasMoreToLoad,
68
+ previousPage,
69
+ previousOffset,
70
+ previousGroup
71
+ });
72
+ return new Map(prev);
73
+ });
74
+ }, [
75
+ cacheEnabled,
76
+ cacheMaxSize,
77
+ options,
78
+ hasMoreToLoad,
79
+ previousPage,
80
+ previousOffset,
81
+ previousGroup
82
+ ]);
83
+ const loadOptions = useCallback(
84
+ async (searchValue, options2) => {
85
+ const isInitial = !!options2?.initial;
86
+ if (isInitial && cacheEnabled) {
87
+ const cached = stateCache.get(searchValue);
88
+ if (cached) {
89
+ currentSearchValueRef.current = searchValue;
90
+ restoreFromCache(cached);
91
+ return;
92
+ }
93
+ }
94
+ if (isInitial) {
95
+ currentSearchValueRef.current = searchValue;
96
+ }
97
+ (isInitial ? setLoading : setLoadingMore)(true);
98
+ try {
99
+ if (!lazy) {
100
+ const result = await loadOptionsProp(searchValue);
101
+ const resolved = Array.isArray(result) ? result : await result;
102
+ (isInitial ? setOptions : appendOptions)(resolved);
103
+ } else {
104
+ let result;
105
+ if (lazy === "page") {
106
+ const page = isInitial ? 0 : previousPage;
107
+ result = await loadOptionsProp(searchValue, page, pageSize);
108
+ setPreviousPage(isInitial ? 1 : page + 1);
109
+ } else if (lazy === "offset") {
110
+ const offset = isInitial ? 0 : previousOffset;
111
+ result = await loadOptionsProp(searchValue, offset, limit);
112
+ setPreviousOffset(isInitial ? limit : offset + limit);
113
+ } else if (lazy === "group") {
114
+ const group = isInitial ? null : previousGroup;
115
+ result = await loadOptionsProp(searchValue, group);
116
+ setPreviousGroup(
117
+ result.options[result.options.length - 1]?.group ?? null
118
+ );
119
+ } else {
120
+ throw new Error(
121
+ `Invalid lazy mode: ${lazy}. Expected 'page', 'offset', or 'group'.`
122
+ );
123
+ }
124
+ setHasMoreToLoad(result.hasMore ?? false);
125
+ (isInitial ? setOptions : appendOptions)(result.options);
126
+ }
127
+ } finally {
128
+ (isInitial ? setLoading : setLoadingMore)(false);
129
+ }
130
+ },
131
+ [
132
+ lazy,
133
+ pageSize,
134
+ limit,
135
+ loadOptionsProp,
136
+ appendOptions,
137
+ previousPage,
138
+ previousOffset,
139
+ previousGroup,
140
+ cacheEnabled,
141
+ stateCache,
142
+ restoreFromCache
143
+ ]
144
+ );
145
+ const loadMore = useCallback(
146
+ async (searchValue) => {
147
+ await loadOptions(searchValue, { initial: false });
148
+ },
149
+ [loadOptions]
150
+ );
151
+ const reset = useCallback(() => {
152
+ setOptions([]);
153
+ setHasMoreToLoad(false);
154
+ setPreviousGroup(null);
155
+ setPreviousPage(0);
156
+ setPreviousOffset(0);
157
+ setLoading(false);
158
+ setLoadingMore(false);
159
+ }, []);
160
+ const clearCache = useCallback(() => {
161
+ setStateCache(/* @__PURE__ */ new Map());
162
+ }, []);
163
+ return {
164
+ options,
165
+ loading,
166
+ loadingMore,
167
+ hasMore: hasMoreToLoad,
168
+ loadOptions,
169
+ loadMore,
170
+ reset,
171
+ clearCache
172
+ };
173
+ }
174
+
175
+ const empty = "_empty_dbxri_5";
176
+ const scroller = "_scroller_dbxri_19";
177
+ const styles$3 = {
178
+ "select-field-list": "_select-field-list_dbxri_2",
179
+ empty: empty,
180
+ "load-more": "_load-more_dbxri_12",
181
+ scroller: scroller};
182
+
183
+ const highlighted = "_highlighted_15431_26";
184
+ const disabled = "_disabled_15431_29";
185
+ const single = "_single_15431_33";
186
+ const selected = "_selected_15431_33";
187
+ const checkbox = "_checkbox_15431_36";
188
+ const checked = "_checked_15431_40";
189
+ const unchecked = "_unchecked_15431_43";
190
+ const indeterminate = "_indeterminate_15431_46";
191
+ const styles$2 = {
192
+ "select-field-list-item": "_select-field-list-item_15431_2",
193
+ highlighted: highlighted,
194
+ disabled: disabled,
195
+ single: single,
196
+ selected: selected,
197
+ checkbox: checkbox,
198
+ checked: checked,
199
+ unchecked: unchecked,
200
+ indeterminate: indeterminate
201
+ };
202
+
203
+ const SelectFieldListItem = ({
204
+ item,
205
+ index,
206
+ highlighted,
207
+ disabled,
208
+ getItemProps,
209
+ selectionType,
210
+ checked
211
+ }) => {
212
+ const checkbox = useMemo(() => {
213
+ if (checked === "indeterminate")
214
+ return {
215
+ icon: SvgIndeterminateCheckBox,
216
+ class: styles$2["indeterminate"]
217
+ };
218
+ if (checked) return { icon: SvgCheckBox, class: styles$2["checked"] };
219
+ return { icon: SvgCheckBoxOutlineBlank, class: styles$2["unchecked"] };
220
+ }, [checked]);
221
+ return /* @__PURE__ */ jsxs(
222
+ "li",
223
+ {
224
+ ...getItemProps({
225
+ item,
226
+ index,
227
+ className: cx(styles$2["select-field-list-item"], {
228
+ [styles$2.highlighted]: highlighted,
229
+ [styles$2.selected]: checked,
230
+ [styles$2.disabled]: disabled,
231
+ [styles$2.single]: selectionType === "single",
232
+ [styles$2.multiple]: selectionType === "multiple"
233
+ })
234
+ }),
235
+ children: [
236
+ selectionType === "multiple" && /* @__PURE__ */ jsx("div", { "aria-hidden": true, children: /* @__PURE__ */ jsx(
237
+ Icon,
238
+ {
239
+ size: "large",
240
+ svg: checkbox.icon,
241
+ className: cx(styles$2["checkbox"], checkbox.class)
242
+ }
243
+ ) }),
244
+ /* @__PURE__ */ jsxs(Flex, { grow: 1, shrink: 1, direction: "column", gap: "1", children: [
245
+ /* @__PURE__ */ jsx(Text, { size: "medium", children: item.original.content?.title ?? item.original.label }),
246
+ item.original.content?.description && /* @__PURE__ */ jsx(Text, { size: "small", children: item.original.content?.description })
247
+ ] }),
248
+ selectionType === "single" && checked && /* @__PURE__ */ jsx(
249
+ Icon,
250
+ {
251
+ size: "medium",
252
+ svg: SvgCheck,
253
+ className: cx(styles$2["checkbox"], styles$2["checked"])
254
+ }
255
+ )
256
+ ]
257
+ },
258
+ item.id
259
+ );
260
+ };
261
+
262
+ const InView = ({
263
+ children,
264
+ onVisibilityChange,
265
+ rootMargin
266
+ }) => {
267
+ const { ref } = useIntersectionObserver({
268
+ onChange: (isIntersecting) => {
269
+ onVisibilityChange?.(isIntersecting);
270
+ },
271
+ rootMargin
272
+ });
273
+ return /* @__PURE__ */ jsx("div", { ref, children });
274
+ };
275
+
276
+ const SelectFieldList = ({
277
+ isOpen,
278
+ items,
279
+ getMenuProps,
280
+ getItemProps,
281
+ highlightedIndex,
282
+ selectedOption,
283
+ hasMore,
284
+ onLoadMore,
285
+ loading,
286
+ loadingMore,
287
+ disableAutoLoadMore,
288
+ disabled,
289
+ className,
290
+ style
291
+ }) => {
292
+ const handleLoaderVisibilityChange = (visible) => {
293
+ if (visible && !disableAutoLoadMore) {
294
+ onLoadMore();
295
+ }
296
+ };
297
+ return /* @__PURE__ */ jsxs(
298
+ "div",
299
+ {
300
+ ...getMenuProps({
301
+ className: cx(styles$3["scroller"], className),
302
+ style
303
+ }),
304
+ children: [
305
+ /* @__PURE__ */ jsx("ul", { className: cx(styles$3["select-field-list"]), children: isOpen && /* @__PURE__ */ jsx(Fragment, { children: loading ? /* @__PURE__ */ jsx("div", { className: styles$3["empty"], children: /* @__PURE__ */ jsx(Spinner, { size: "medium" }) }) : items.length > 0 ? items.map((item, index) => /* @__PURE__ */ jsx(
306
+ SelectFieldListItem,
307
+ {
308
+ item,
309
+ index,
310
+ getItemProps,
311
+ selectionType: "single",
312
+ checked: selectedOption?.id === item.original.id,
313
+ highlighted: highlightedIndex === index,
314
+ disabled: (disabled || item.disabled) ?? false
315
+ },
316
+ item.id
317
+ )) : /* @__PURE__ */ jsx("div", { className: styles$3["empty"], children: /* @__PURE__ */ jsx(Text, { subdued: true, size: "small", children: "No match found" }) }) }) }),
318
+ loadingMore ? /* @__PURE__ */ jsxs("div", { className: styles$3["load-more"], children: [
319
+ /* @__PURE__ */ jsx(Spinner, { size: "small" }),
320
+ /* @__PURE__ */ jsx(SrOnly, { children: "Loading more..." })
321
+ ] }) : hasMore && !loading ? /* @__PURE__ */ jsx(
322
+ InView,
323
+ {
324
+ onVisibilityChange: handleLoaderVisibilityChange,
325
+ rootMargin: "0px 0px -100px 0px",
326
+ children: /* @__PURE__ */ jsx("div", { className: styles$3["load-more"], children: /* @__PURE__ */ jsx(Button, { appearance: "secondary", size: "small", onClick: onLoadMore, children: "Load more" }) })
327
+ }
328
+ ) : null
329
+ ]
330
+ }
331
+ );
332
+ };
333
+ SelectFieldList.displayName = "SelectFieldList";
334
+
335
+ const SelectFieldInput = ({
336
+ placeholder,
337
+ size,
338
+ disableClearButton,
339
+ disableToggleButton,
340
+ disabled,
341
+ readOnly,
342
+ error,
343
+ onClear,
344
+ id,
345
+ inputWrapperRef,
346
+ htmlInputWrapperProps,
347
+ inputProps,
348
+ toggleButtonProps,
349
+ prefix,
350
+ suffix
351
+ }) => {
352
+ const inputWrapperClassNames = cx(styles$4["input-wrapper"], {
353
+ [styles$4["small"]]: size === "small",
354
+ [styles$4["large"]]: size === "large",
355
+ [styles$4["no-clear-button"]]: disableClearButton,
356
+ [styles$4["disabled"]]: disabled || readOnly
357
+ });
358
+ return /* @__PURE__ */ jsxs(
359
+ "div",
360
+ {
361
+ ref: inputWrapperRef,
362
+ ...htmlInputWrapperProps,
363
+ className: cx(inputWrapperClassNames, htmlInputWrapperProps?.className),
364
+ children: [
365
+ prefix ? /* @__PURE__ */ jsx("div", { className: styles$4["prefix"], children: prefix }) : null,
366
+ /* @__PURE__ */ jsx(
367
+ "input",
368
+ {
369
+ id,
370
+ placeholder,
371
+ disabled,
372
+ readOnly,
373
+ ...inputProps,
374
+ className: cx(styles$4["input"], inputProps?.className, {
375
+ [styles$4["error"]]: error
376
+ })
377
+ }
378
+ ),
379
+ suffix ? /* @__PURE__ */ jsx("div", { className: styles$4["suffix"], children: suffix }) : null,
380
+ /* @__PURE__ */ jsxs("div", { className: styles$4["buttons-wrapper"], children: [
381
+ disableClearButton ? null : /* @__PURE__ */ jsx("div", { className: styles$4["close-button-wrapper"], children: /* @__PURE__ */ jsx(
382
+ Button,
383
+ {
384
+ icon: SvgClose,
385
+ "aria-label": "clear selection",
386
+ appearance: "ghost",
387
+ size: "small",
388
+ className: styles$4["close-button"],
389
+ onClick: () => {
390
+ onClear?.();
391
+ }
392
+ }
393
+ ) }),
394
+ disableToggleButton ? null : /* @__PURE__ */ jsx("div", { className: styles$4["toggle-button-wrapper"], children: /* @__PURE__ */ jsx(
395
+ Button,
396
+ {
397
+ icon: SvgChevronRight,
398
+ "aria-label": "toggle menu",
399
+ appearance: "ghost",
400
+ size: "small",
401
+ disabled,
402
+ ...toggleButtonProps,
403
+ className: cx(
404
+ styles$4["toggle-button"],
405
+ toggleButtonProps?.className
406
+ )
407
+ }
408
+ ) })
409
+ ] })
410
+ ]
411
+ }
412
+ );
413
+ };
414
+ SelectFieldInput.displayName = "SelectFieldInput";
415
+
416
+ const SelectFieldLabel = ({
417
+ label,
418
+ getLabelProps,
419
+ required,
420
+ moreInfo,
421
+ openMoreInfo
422
+ }) => {
423
+ return /* @__PURE__ */ jsx(
424
+ FieldLabel,
425
+ {
426
+ ...getLabelProps(),
427
+ required,
428
+ moreInfo,
429
+ openMoreInfo,
430
+ children: label
431
+ }
432
+ );
433
+ };
434
+
435
+ function useDebouncedCallback(callback, delay = 300) {
436
+ const timeoutRef = useRef(null);
437
+ const callbackRef = useRef(callback);
438
+ useEffect(() => {
439
+ callbackRef.current = callback;
440
+ }, [callback]);
441
+ useEffect(() => {
442
+ return () => {
443
+ if (timeoutRef.current) {
444
+ clearTimeout(timeoutRef.current);
445
+ timeoutRef.current = null;
446
+ }
447
+ };
448
+ }, [delay]);
449
+ const debouncedCallback = useCallback(
450
+ ((...args) => {
451
+ if (timeoutRef.current) {
452
+ clearTimeout(timeoutRef.current);
453
+ }
454
+ timeoutRef.current = setTimeout(() => {
455
+ callbackRef.current(...args);
456
+ timeoutRef.current = null;
457
+ }, delay);
458
+ }),
459
+ [delay]
460
+ );
461
+ return debouncedCallback;
462
+ }
463
+
464
+ const useCombo = ({
465
+ options,
466
+ pinnedOptions,
467
+ selectAll,
468
+ selectedOption,
469
+ onSelectedOptionChange,
470
+ onInputValueChange,
471
+ onIsOpenChange,
472
+ displayAs = "popover",
473
+ disableHighlightOnOpen = false,
474
+ disabled
475
+ }) => {
476
+ const downshiftItems = useMemo(() => {
477
+ const items = options.map(
478
+ mapOptionToDownshiftItem
479
+ );
480
+ if (selectAll) {
481
+ items.unshift({
482
+ id: "select-all",
483
+ type: "select-all",
484
+ original: { id: "select-all", label: selectAll.label ?? "Select All" }
485
+ });
486
+ }
487
+ return items;
488
+ }, [options, pinnedOptions, selectAll]);
489
+ const selectedDownshiftItem = useMemo(() => {
490
+ return selectedOption ? mapOptionToDownshiftItem(selectedOption) : null;
491
+ }, [selectedOption]);
492
+ const {
493
+ isOpen,
494
+ highlightedIndex,
495
+ getToggleButtonProps,
496
+ getLabelProps,
497
+ getMenuProps,
498
+ getInputProps,
499
+ getItemProps,
500
+ inputValue,
501
+ closeMenu,
502
+ openMenu,
503
+ setHighlightedIndex
504
+ } = useCombobox({
505
+ isItemDisabled: (item, _index) => {
506
+ if (!item) {
507
+ return false;
508
+ }
509
+ return (disabled || item.disabled) ?? false;
510
+ },
511
+ selectedItem: selectedDownshiftItem,
512
+ onSelectedItemChange: ({
513
+ selectedItem: si
514
+ }) => {
515
+ if (si && si.type === "option") {
516
+ onSelectedOptionChange(si.original);
517
+ } else {
518
+ onSelectedOptionChange(null);
519
+ }
520
+ },
521
+ onInputValueChange,
522
+ onIsOpenChange: (changes) => {
523
+ onIsOpenChange?.(changes);
524
+ if (changes.isOpen && !disableHighlightOnOpen) {
525
+ const selectedItemIndex = downshiftItems.findIndex(
526
+ (item) => item.id === selectedDownshiftItem?.id
527
+ );
528
+ setHighlightedIndex(selectedItemIndex);
529
+ }
530
+ },
531
+ items: downshiftItems,
532
+ itemToString(item) {
533
+ return item?.original.label ?? "";
534
+ },
535
+ stateReducer: (state, actionAndChanges) => stateReducer(state, actionAndChanges, displayAs)
536
+ });
537
+ return {
538
+ inputValue,
539
+ getToggleButtonProps,
540
+ getLabelProps,
541
+ getMenuProps,
542
+ getInputProps,
543
+ getItemProps,
544
+ highlightedIndex,
545
+ isOpen,
546
+ downshiftItems,
547
+ closeMenu,
548
+ openMenu
549
+ };
550
+ };
551
+ function mapOptionToDownshiftItem(option) {
552
+ return {
553
+ id: option.id,
554
+ type: "option",
555
+ disabled: option.disabled ?? false,
556
+ original: option
557
+ };
558
+ }
559
+ function stateReducer(state, actionAndChanges, displayAs) {
560
+ const { type, changes } = actionAndChanges;
561
+ switch (type) {
562
+ case useCombobox.stateChangeTypes.InputBlur:
563
+ if (displayAs === "dialog" && state.isOpen) {
564
+ return {
565
+ ...changes,
566
+ isOpen: state.isOpen
567
+ };
568
+ }
569
+ return {
570
+ ...changes,
571
+ inputValue: state.selectedItem?.original.label ?? state.inputValue
572
+ };
573
+ case useCombobox.stateChangeTypes.InputKeyDownEscape:
574
+ case useCombobox.stateChangeTypes.FunctionCloseMenu:
575
+ return {
576
+ ...changes,
577
+ inputValue: state.selectedItem?.original.label ?? state.inputValue
578
+ };
579
+ case useCombobox.stateChangeTypes.InputClick:
580
+ if (displayAs === "dialog" && state.isOpen) {
581
+ return {
582
+ ...changes,
583
+ isOpen: state.isOpen
584
+ };
585
+ }
586
+ return changes;
587
+ case useCombobox.stateChangeTypes.InputKeyDownEnter:
588
+ case useCombobox.stateChangeTypes.ItemClick:
589
+ return changes;
590
+ default:
591
+ return changes;
592
+ }
593
+ }
594
+
595
+ const styles$1 = {
596
+ "field-popover": "_field-popover_aeggh_2"
597
+ };
598
+
599
+ const FieldPopover = (props) => {
600
+ const ref = useRef(null);
601
+ const { id, children, referenceElement, open } = props;
602
+ useEffect(() => {
603
+ if (open) {
604
+ ref.current?.showPopover();
605
+ } else {
606
+ ref.current?.hidePopover();
607
+ }
608
+ }, [open]);
609
+ const updatePosition = useCallback(async () => {
610
+ if (!ref.current || !referenceElement.current) return;
611
+ const position = await computePosition(
612
+ referenceElement.current,
613
+ ref.current,
614
+ {
615
+ placement: "bottom-start",
616
+ middleware: [
617
+ offset(8),
618
+ autoPlacement({
619
+ allowedPlacements: ["bottom-start", "top-start"],
620
+ padding: 8
621
+ }),
622
+ size({
623
+ padding: 8,
624
+ apply({ rects, elements, availableHeight }) {
625
+ Object.assign(elements.floating.style, {
626
+ width: `${rects.reference.width}px`,
627
+ maxHeight: `${Math.max(0, availableHeight)}px`
628
+ });
629
+ }
630
+ })
631
+ ]
632
+ }
633
+ );
634
+ ref.current.style.left = `${position.x}px`;
635
+ ref.current.style.top = `${position.y}px`;
636
+ }, [ref, referenceElement]);
637
+ useEffect(() => {
638
+ if (!ref.current || !referenceElement.current || !open) return;
639
+ const cleanup = autoUpdate(
640
+ referenceElement.current,
641
+ ref.current,
642
+ updatePosition
643
+ );
644
+ return () => {
645
+ cleanup();
646
+ };
647
+ }, [referenceElement, ref, updatePosition, open]);
648
+ return /* @__PURE__ */ jsx("div", { ref, id, className: styles$1["field-popover"], popover: "manual", children });
649
+ };
650
+
651
+ function detectCoarsePointer() {
652
+ if (typeof window === "undefined" || !window.matchMedia) {
653
+ return false;
654
+ }
655
+ return window.matchMedia("(pointer: coarse)").matches;
656
+ }
657
+ function useAdaptiveView() {
658
+ const breakpoint = useBreakpoint();
659
+ const [hasCoarsePointer, setHasCoarsePointer] = useState(detectCoarsePointer);
660
+ useEffect(() => {
661
+ setHasCoarsePointer(detectCoarsePointer());
662
+ const mediaQuery = window.matchMedia("(pointer: coarse)");
663
+ const handleChange = (e) => {
664
+ setHasCoarsePointer(e.matches);
665
+ };
666
+ mediaQuery.addEventListener("change", handleChange);
667
+ return () => mediaQuery.removeEventListener("change", handleChange);
668
+ }, []);
669
+ const isSmallScreen = !breakpoint?.md;
670
+ const isMobile = isSmallScreen && hasCoarsePointer;
671
+ return {
672
+ view: isMobile ? "mobile" : "desktop",
673
+ isMobile,
674
+ isDesktop: !isMobile
675
+ };
676
+ }
677
+
678
+ const header = "_header_dcw9s_33";
679
+ const field = "_field_dcw9s_2";
680
+ const content = "_content_dcw9s_44";
681
+ const styles = {
682
+ "field-dialog": "_field-dialog_dcw9s_2",
683
+ "field-dialog-visual-viewport-height": "_field-dialog-visual-viewport-height_dcw9s_16",
684
+ header: header,
685
+ field: field,
686
+ content: content
687
+ };
688
+
689
+ const FieldDialog = ({
690
+ id,
691
+ isOpen,
692
+ onClose,
693
+ field,
694
+ children,
695
+ title
696
+ }) => {
697
+ const elRef = useRef(null);
698
+ const visualViewportHeightRef = useRef(null);
699
+ useDialogScrollLock({
700
+ open: isOpen,
701
+ id,
702
+ enableScrollChaining: false,
703
+ elementRef: elRef
704
+ });
705
+ useEffect(() => {
706
+ if (isOpen) {
707
+ elRef.current?.showModal();
708
+ } else {
709
+ elRef.current?.close();
710
+ }
711
+ }, [isOpen]);
712
+ useEffect(() => {
713
+ if (isOpen) {
714
+ const handleResize = () => {
715
+ if (!visualViewportHeightRef.current) return;
716
+ visualViewportHeightRef.current.style.height = `${window.visualViewport?.height ?? 0}px`;
717
+ visualViewportHeightRef.current.style.maxHeight = `${window.visualViewport?.height ?? 0}px`;
718
+ };
719
+ window.visualViewport?.addEventListener("resize", handleResize);
720
+ return () => {
721
+ window.visualViewport?.removeEventListener("resize", handleResize);
722
+ };
723
+ }
724
+ }, [isOpen]);
725
+ return /* @__PURE__ */ jsx(
726
+ "dialog",
727
+ {
728
+ ref: elRef,
729
+ id,
730
+ "data-anv": "field-dialog",
731
+ className: styles["field-dialog"],
732
+ onKeyDown: (e) => {
733
+ if (e.code === "Escape") {
734
+ e.preventDefault();
735
+ onClose();
736
+ }
737
+ },
738
+ children: /* @__PURE__ */ jsxs(
739
+ "div",
740
+ {
741
+ className: styles["field-dialog-visual-viewport-height"],
742
+ ref: visualViewportHeightRef,
743
+ children: [
744
+ /* @__PURE__ */ jsxs(Flex, { direction: "row", className: styles["header"], children: [
745
+ /* @__PURE__ */ jsx(Text, { variant: "headline", el: "h1", children: title }),
746
+ /* @__PURE__ */ jsx("span", { className: styles["close-container"], children: /* @__PURE__ */ jsx(DialogContext.Provider, { value: { close: onClose }, children: /* @__PURE__ */ jsx(
747
+ DialogCancelButton,
748
+ {
749
+ className: styles["close-button"],
750
+ size: "small",
751
+ appearance: "ghost",
752
+ "aria-label": "Close dialog",
753
+ icon: SvgClose
754
+ }
755
+ ) }) })
756
+ ] }),
757
+ /* @__PURE__ */ jsx(Flex, { direction: "column", className: styles["field"], children: field }),
758
+ /* @__PURE__ */ jsx(Flex, { direction: "column", className: styles["content"], children })
759
+ ]
760
+ }
761
+ )
762
+ }
763
+ );
764
+ };
765
+
766
+ const SelectField = forwardRef(
767
+ (propsWithLayout, ref) => {
768
+ const { layoutStyles, componentProps } = useLayoutPropsUtil(propsWithLayout);
769
+ const [initialLoadPerformed, setInitialLoadPerformed] = useState(false);
770
+ const inputWrapperRef = useRef(null);
771
+ const {
772
+ id: idProp,
773
+ value: selectedOption,
774
+ initialLoad: initialLoadProp = "auto",
775
+ displayMenuAs: displayMenuAsProp = "auto",
776
+ lazy,
777
+ loadOptions: loadOptionsProp,
778
+ label,
779
+ placeholder,
780
+ disableClearButton: disableClearButtonProp = false,
781
+ debounceMs = 200,
782
+ onSelectedOptionChange,
783
+ cache,
784
+ size,
785
+ error,
786
+ hint,
787
+ description,
788
+ errorAriaLive: errorAriaLiveProp = "assertive",
789
+ required,
790
+ disabled,
791
+ readOnly,
792
+ prefix,
793
+ suffix
794
+ } = componentProps;
795
+ const autoId = useId();
796
+ const id = idProp ?? autoId;
797
+ const helperUid = useId();
798
+ const [hasFocus, setHasFocus] = useState(false);
799
+ const handleFocus = () => {
800
+ setHasFocus(true);
801
+ };
802
+ const handleBlur = () => {
803
+ setHasFocus(false);
804
+ };
805
+ const errorMessage = typeof error !== "boolean" ? error : void 0;
806
+ const hasHelperText = hint || errorMessage || description;
807
+ const isDisabledOrReadOnly = (disabled || readOnly) ?? false;
808
+ const { isMobile } = useAdaptiveView();
809
+ const displayAs = displayMenuAsProp === "auto" ? isMobile ? "dialog" : "popover" : displayMenuAsProp;
810
+ const initialLoad = initialLoadProp === "auto" ? "immediate" : initialLoadProp;
811
+ const pageSize = lazy === "page" && "lazyOptions" in componentProps ? componentProps.lazyOptions?.pageSize ?? DEFAULT_PAGE_SIZE : DEFAULT_PAGE_SIZE;
812
+ const limit = lazy === "offset" && "lazyOptions" in componentProps ? componentProps.lazyOptions?.limit ?? DEFAULT_PAGE_SIZE : DEFAULT_PAGE_SIZE;
813
+ const loadingHookConfig = useMemo(() => {
814
+ const cacheConfig = {
815
+ enabled: cache?.enabled,
816
+ maxSize: cache?.maxSize
817
+ };
818
+ if (lazy === "page")
819
+ return {
820
+ lazy: "page",
821
+ loadOptions: loadOptionsProp,
822
+ pageSize,
823
+ cache: cacheConfig
824
+ };
825
+ if (lazy === "offset")
826
+ return {
827
+ lazy: "offset",
828
+ loadOptions: loadOptionsProp,
829
+ limit,
830
+ cache: cacheConfig
831
+ };
832
+ if (lazy === "group")
833
+ return {
834
+ lazy: "group",
835
+ loadOptions: loadOptionsProp,
836
+ cache: cacheConfig
837
+ };
838
+ return {
839
+ lazy: false,
840
+ loadOptions: loadOptionsProp,
841
+ cache: cacheConfig
842
+ };
843
+ }, [
844
+ lazy,
845
+ loadOptionsProp,
846
+ pageSize,
847
+ limit,
848
+ cache?.enabled,
849
+ cache?.maxSize
850
+ ]);
851
+ const {
852
+ options,
853
+ loading,
854
+ loadingMore,
855
+ hasMore,
856
+ loadOptions,
857
+ loadMore,
858
+ clearCache
859
+ } = useSelectFieldLoading(loadingHookConfig);
860
+ useImperativeHandle(ref, () => ({ clearCache }), [clearCache]);
861
+ const debouncedOptionLoader = useDebouncedCallback((inputValue2) => {
862
+ loadOptions(selectedOption?.label === inputValue2 ? "" : inputValue2, {
863
+ initial: true
864
+ });
865
+ }, debounceMs);
866
+ const adjustInputValueForSelectedOption = useCallback(
867
+ (inputValue2) => {
868
+ if (selectedOption?.label === inputValue2) {
869
+ return "";
870
+ } else {
871
+ return inputValue2;
872
+ }
873
+ },
874
+ [selectedOption?.label]
875
+ );
876
+ const {
877
+ isOpen,
878
+ getToggleButtonProps,
879
+ getLabelProps,
880
+ getMenuProps,
881
+ getInputProps,
882
+ highlightedIndex,
883
+ getItemProps,
884
+ inputValue,
885
+ downshiftItems,
886
+ closeMenu
887
+ } = useCombo({
888
+ displayAs,
889
+ disabled: isDisabledOrReadOnly,
890
+ options,
891
+ pinnedOptions: [],
892
+ selectedOption,
893
+ onSelectedOptionChange: (selectedOption2) => {
894
+ onSelectedOptionChange(selectedOption2);
895
+ },
896
+ async onIsOpenChange(changes) {
897
+ if (initialLoad === "open" && !initialLoadPerformed && changes.isOpen) {
898
+ await loadOptions(adjustInputValueForSelectedOption(inputValue), {
899
+ initial: true
900
+ });
901
+ setInitialLoadPerformed(true);
902
+ }
903
+ },
904
+ onInputValueChange: ({ inputValue: iv }) => {
905
+ debouncedOptionLoader(iv);
906
+ }
907
+ });
908
+ useEffect(() => {
909
+ const performInitialLoad = async () => {
910
+ if (initialLoad === "immediate" && !initialLoadPerformed) {
911
+ await loadOptions(adjustInputValueForSelectedOption(inputValue), {
912
+ initial: true
913
+ });
914
+ setInitialLoadPerformed(true);
915
+ }
916
+ };
917
+ performInitialLoad();
918
+ }, [
919
+ loadOptions,
920
+ initialLoadPerformed,
921
+ initialLoad,
922
+ inputValue,
923
+ adjustInputValueForSelectedOption
924
+ ]);
925
+ const handleLoadMore = async () => {
926
+ await loadMore(adjustInputValueForSelectedOption(inputValue));
927
+ };
928
+ const disableClearButton = disableClearButtonProp || !selectedOption || isDisabledOrReadOnly;
929
+ if (displayAs === "dialog") {
930
+ return /* @__PURE__ */ jsxs("div", { className: styles$4["search-field"], style: { ...layoutStyles }, children: [
931
+ /* @__PURE__ */ jsx(
932
+ SelectFieldLabel,
933
+ {
934
+ label,
935
+ getLabelProps,
936
+ required
937
+ }
938
+ ),
939
+ /* @__PURE__ */ jsx(
940
+ SelectFieldInput,
941
+ {
942
+ disabled,
943
+ readOnly,
944
+ disableToggleButton: false,
945
+ placeholder,
946
+ disableClearButton,
947
+ toggleButtonProps: getToggleButtonProps(),
948
+ onClear: () => onSelectedOptionChange(null),
949
+ id: `${id}-input`,
950
+ inputProps: getInputProps({
951
+ "aria-describedby": hasHelperText ? helperUid : void 0,
952
+ "aria-invalid": error ? true : void 0,
953
+ onFocus: handleFocus,
954
+ onBlur: handleBlur
955
+ }),
956
+ size,
957
+ error: !!error,
958
+ prefix,
959
+ suffix
960
+ }
961
+ ),
962
+ hasHelperText ? /* @__PURE__ */ jsx(
963
+ FieldMessage,
964
+ {
965
+ id: helperUid,
966
+ hint,
967
+ errorMessage,
968
+ errorAriaLive: isOpen || hasFocus ? errorAriaLiveProp : "off",
969
+ description
970
+ }
971
+ ) : null,
972
+ /* @__PURE__ */ jsx(
973
+ FieldDialog,
974
+ {
975
+ id: `${id}-dialog`,
976
+ isOpen,
977
+ onClose: closeMenu,
978
+ title: label,
979
+ field: /* @__PURE__ */ jsx(
980
+ SelectFieldInput,
981
+ {
982
+ disabled,
983
+ readOnly,
984
+ inputProps: getInputProps(),
985
+ disableToggleButton: true,
986
+ placeholder,
987
+ disableClearButton,
988
+ onClear: () => onSelectedOptionChange(null),
989
+ id: `${id}-dialog-input`,
990
+ inputWrapperRef,
991
+ size: "medium",
992
+ error: !!error,
993
+ prefix,
994
+ suffix
995
+ }
996
+ ),
997
+ children: /* @__PURE__ */ jsx(
998
+ SelectFieldList,
999
+ {
1000
+ isOpen: true,
1001
+ items: downshiftItems,
1002
+ getMenuProps,
1003
+ getItemProps,
1004
+ highlightedIndex,
1005
+ selectedOption,
1006
+ hasMore,
1007
+ onLoadMore: handleLoadMore,
1008
+ loading,
1009
+ loadingMore,
1010
+ disabled: isDisabledOrReadOnly,
1011
+ style: {
1012
+ paddingInline: 24,
1013
+ paddingBlockEnd: 24
1014
+ }
1015
+ }
1016
+ )
1017
+ }
1018
+ )
1019
+ ] });
1020
+ }
1021
+ return /* @__PURE__ */ jsxs("div", { className: styles$4["search-field"], style: { ...layoutStyles }, children: [
1022
+ /* @__PURE__ */ jsx(
1023
+ SelectFieldLabel,
1024
+ {
1025
+ label,
1026
+ getLabelProps,
1027
+ required
1028
+ }
1029
+ ),
1030
+ /* @__PURE__ */ jsx(
1031
+ SelectFieldInput,
1032
+ {
1033
+ disabled,
1034
+ readOnly,
1035
+ inputProps: getInputProps({
1036
+ popovertarget: `${id}-popover`,
1037
+ "aria-describedby": hasHelperText ? helperUid : void 0,
1038
+ "aria-invalid": error ? true : void 0,
1039
+ onFocus: handleFocus,
1040
+ onBlur: handleBlur
1041
+ }),
1042
+ toggleButtonProps: getToggleButtonProps(),
1043
+ disableToggleButton: false,
1044
+ placeholder,
1045
+ disableClearButton,
1046
+ onClear: () => onSelectedOptionChange(null),
1047
+ id: `${id}-input`,
1048
+ popoverTarget: `${id}-popover`,
1049
+ inputWrapperRef,
1050
+ size,
1051
+ error: !!error,
1052
+ prefix,
1053
+ suffix
1054
+ }
1055
+ ),
1056
+ hasHelperText ? /* @__PURE__ */ jsx(
1057
+ FieldMessage,
1058
+ {
1059
+ id: helperUid,
1060
+ hint,
1061
+ errorMessage,
1062
+ errorAriaLive: isOpen || hasFocus ? errorAriaLiveProp : "off",
1063
+ description
1064
+ }
1065
+ ) : null,
1066
+ /* @__PURE__ */ jsx(
1067
+ FieldPopover,
1068
+ {
1069
+ id: `${id}-popover`,
1070
+ referenceElement: inputWrapperRef,
1071
+ open: isOpen && displayAs === "popover",
1072
+ children: /* @__PURE__ */ jsx(
1073
+ SelectFieldList,
1074
+ {
1075
+ isOpen,
1076
+ items: downshiftItems,
1077
+ getMenuProps,
1078
+ getItemProps,
1079
+ highlightedIndex,
1080
+ selectedOption,
1081
+ hasMore,
1082
+ onLoadMore: handleLoadMore,
1083
+ loading,
1084
+ loadingMore,
1085
+ disabled: isDisabledOrReadOnly,
1086
+ style: {
1087
+ padding: 8
1088
+ }
1089
+ }
1090
+ )
1091
+ }
1092
+ )
1093
+ ] });
1094
+ }
1095
+ );
1096
+ SelectField.displayName = "SelectField";
1097
+
1098
+ const defaultFilter = (options, searchValue) => {
1099
+ return matchSorter(options, searchValue, {
1100
+ keys: ["label", "searchText"]
1101
+ });
1102
+ };
1103
+ const SelectFieldSync = (props) => {
1104
+ const { options, filter: filterProp = defaultFilter, ...rest } = props;
1105
+ const filter = typeof filterProp === "function" ? filterProp : (options2, searchValue) => matchSorter(
1106
+ options2,
1107
+ searchValue,
1108
+ filterProp
1109
+ );
1110
+ return /* @__PURE__ */ jsx(
1111
+ SelectField,
1112
+ {
1113
+ lazy: false,
1114
+ loadOptions: (searchValue) => filter(options, searchValue),
1115
+ debounceMs: 0,
1116
+ ...rest
1117
+ }
1118
+ );
1119
+ };
1120
+
1121
+ export { SelectField as S, SelectFieldSync as a, useAdaptiveView as u };
1122
+ //# sourceMappingURL=SelectFieldSync-DQm3_D0v.js.map