@servicetitan/anvil2 2.0.4 → 2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (225) hide show
  1. package/CHANGELOG.md +56 -0
  2. package/dist/{Calendar-jO-0jbbt.js → Calendar-D0CczOpQ.js} +3 -835
  3. package/dist/Calendar-D0CczOpQ.js.map +1 -0
  4. package/dist/{Calendar-DxLrWESu.js → Calendar-oNlBgZKB.js} +2 -2
  5. package/dist/{Calendar-DxLrWESu.js.map → Calendar-oNlBgZKB.js.map} +1 -1
  6. package/dist/Calendar.js +2 -2
  7. package/dist/{Checkbox-9VbydUcM.js → Checkbox-DIY-6agd.js} +12 -12
  8. package/dist/Checkbox-DIY-6agd.js.map +1 -0
  9. package/dist/{Checkbox-ZXftLNwB.js → Checkbox-DuzAqrE7.js} +2 -2
  10. package/dist/{Checkbox-ZXftLNwB.js.map → Checkbox-DuzAqrE7.js.map} +1 -1
  11. package/dist/Checkbox.js +1 -1
  12. package/dist/{Combobox-CNObHLjp.js → Combobox-CSGn20KQ.js} +14 -7
  13. package/dist/Combobox-CSGn20KQ.js.map +1 -0
  14. package/dist/Combobox.js +1 -1
  15. package/dist/{DataTable-CQpySyDq.js → DataTable-D30sE1Xt.js} +223 -19
  16. package/dist/DataTable-D30sE1Xt.js.map +1 -0
  17. package/dist/{DateFieldRange-BG86w0pX.js → DateFieldRange-DBOiqaML.js} +46 -36
  18. package/dist/DateFieldRange-DBOiqaML.js.map +1 -0
  19. package/dist/DateFieldRange.js +1 -1
  20. package/dist/{DateFieldSingle-Byu_jyye.js → DateFieldSingle-C4hU55MP.js} +38 -29
  21. package/dist/DateFieldSingle-C4hU55MP.js.map +1 -0
  22. package/dist/DateFieldSingle.js +1 -1
  23. package/dist/{DateFieldYearless-Dw1k3_PY.js → DateFieldYearless-BXkUiHIR.js} +14 -13
  24. package/dist/DateFieldYearless-BXkUiHIR.js.map +1 -0
  25. package/dist/DateFieldYearless.js +1 -1
  26. package/dist/{DateFieldYearlessRange--plyld10.js → DateFieldYearlessRange-CGffFnVT.js} +14 -13
  27. package/dist/DateFieldYearlessRange-CGffFnVT.js.map +1 -0
  28. package/dist/DateFieldYearlessRange.js +1 -1
  29. package/dist/{DaysOfTheWeek-vE310Rjp.js → DaysOfTheWeek-DJEDopC9.js} +9 -5
  30. package/dist/DaysOfTheWeek-DJEDopC9.js.map +1 -0
  31. package/dist/DaysOfTheWeek.js +1 -1
  32. package/dist/{Dialog-DZPaz84r.js → Dialog-BbsZMnCA.js} +4 -4
  33. package/dist/{Dialog-DZPaz84r.js.map → Dialog-BbsZMnCA.js.map} +1 -1
  34. package/dist/Dialog.js +1 -1
  35. package/dist/{Drawer-pMQOa2jH.js → Drawer-Dhq76ot3.js} +4 -4
  36. package/dist/{Drawer-pMQOa2jH.js.map → Drawer-Dhq76ot3.js.map} +1 -1
  37. package/dist/Drawer.js +1 -1
  38. package/dist/DrillDown.js +1 -1
  39. package/dist/{FieldDialog-Be54L3E-.js → FieldDialog-CAuhkCZY.js} +541 -142
  40. package/dist/FieldDialog-CAuhkCZY.js.map +1 -0
  41. package/dist/FieldDialog.css +58 -28
  42. package/dist/{FieldLabel-DSrHbw9U.js → FieldLabel-DL0D6fvc.js} +2 -2
  43. package/dist/{FieldLabel-DSrHbw9U.js.map → FieldLabel-DL0D6fvc.js.map} +1 -1
  44. package/dist/FieldLabel.js +1 -1
  45. package/dist/FieldMessage-DS0COrjp.js +132 -0
  46. package/dist/FieldMessage-DS0COrjp.js.map +1 -0
  47. package/dist/FieldMessage.css +18 -4
  48. package/dist/FieldMessage.js +2 -1
  49. package/dist/FieldMessage.js.map +1 -1
  50. package/dist/{Helper-CK-XjpR3.js → Helper-PNGm_U2X.js} +7 -4
  51. package/dist/Helper-PNGm_U2X.js.map +1 -0
  52. package/dist/{InputMask-DoqWRi3t.js → InputMask-Ds0W2fKy.js} +2 -2
  53. package/dist/{InputMask-DoqWRi3t.js.map → InputMask-Ds0W2fKy.js.map} +1 -1
  54. package/dist/InputMask.js +1 -1
  55. package/dist/{ListView-CtRhYAls.js → ListView-MMmJDM--.js} +2 -2
  56. package/dist/{ListView-CtRhYAls.js.map → ListView-MMmJDM--.js.map} +1 -1
  57. package/dist/ListView.js +1 -1
  58. package/dist/MultiSelectField.js +1 -1
  59. package/dist/{MultiSelectFieldSync-xj7jXas-.js → MultiSelectFieldSync-Bey99LzJ.js} +178 -58
  60. package/dist/MultiSelectFieldSync-Bey99LzJ.js.map +1 -0
  61. package/dist/NumberField-CDkEUfXW.js +237 -0
  62. package/dist/NumberField-CDkEUfXW.js.map +1 -0
  63. package/dist/NumberField.js +1 -1
  64. package/dist/{Page-vc7zs4tn.js → Page-BVxybI-j.js} +6 -6
  65. package/dist/{Page-vc7zs4tn.js.map → Page-BVxybI-j.js.map} +1 -1
  66. package/dist/Page.js +1 -1
  67. package/dist/{Popover-OOLK0hUz.js → Popover-4C5IVk8T.js} +7 -6
  68. package/dist/{Popover-OOLK0hUz.js.map → Popover-4C5IVk8T.js.map} +1 -1
  69. package/dist/Popover.css +15 -14
  70. package/dist/Popover.js +1 -1
  71. package/dist/{ProgressBar-HA9RPZfC.js → ProgressBar-BGwp-qnf.js} +16 -11
  72. package/dist/ProgressBar-BGwp-qnf.js.map +1 -0
  73. package/dist/ProgressBar.js +1 -1
  74. package/dist/{Radio-31wKzlZ4.js → Radio-BRcpSu-d.js} +12 -12
  75. package/dist/Radio-BRcpSu-d.js.map +1 -0
  76. package/dist/{Radio-BwWDJuLF.js → Radio-D7hNws2b.js} +2 -2
  77. package/dist/{Radio-BwWDJuLF.js.map → Radio-D7hNws2b.js.map} +1 -1
  78. package/dist/Radio.js +1 -1
  79. package/dist/{SelectCard-C91twG1S.js → SelectCard-Bag44PmE.js} +3 -3
  80. package/dist/{SelectCard-C91twG1S.js.map → SelectCard-Bag44PmE.js.map} +1 -1
  81. package/dist/SelectCard.js +1 -1
  82. package/dist/SelectField.js +1 -1
  83. package/dist/{SelectFieldSync-BFsJssdD.js → SelectFieldSync-CigqXq3T.js} +67 -50
  84. package/dist/SelectFieldSync-CigqXq3T.js.map +1 -0
  85. package/dist/{SelectTrigger-Cxhx9IVo.js → SelectTrigger-DgsvUfyl.js} +2 -2
  86. package/dist/{SelectTrigger-Cxhx9IVo.js.map → SelectTrigger-DgsvUfyl.js.map} +1 -1
  87. package/dist/SelectTrigger.js +1 -1
  88. package/dist/{SelectTriggerBase-aaOWep-V.js → SelectTriggerBase-OxfNqdIq.js} +12 -7
  89. package/dist/SelectTriggerBase-OxfNqdIq.js.map +1 -0
  90. package/dist/{Stepper-Jv9A3Ned.js → Stepper-D8lkCP8Y.js} +11 -2
  91. package/dist/Stepper-D8lkCP8Y.js.map +1 -0
  92. package/dist/Stepper.js +1 -1
  93. package/dist/{Switch-DQICcdAv.js → Switch-D0zwZCg4.js} +2 -2
  94. package/dist/{Switch-DQICcdAv.js.map → Switch-D0zwZCg4.js.map} +1 -1
  95. package/dist/Switch.js +1 -1
  96. package/dist/Table.js +1 -1
  97. package/dist/{TextField-CDiiYSlT.js → TextField-BycenT6H.js} +13 -12
  98. package/dist/TextField-BycenT6H.js.map +1 -0
  99. package/dist/{TextField-CnYxS52Y.js → TextField-Dfzn2HeL.js} +2 -2
  100. package/dist/{TextField-CnYxS52Y.js.map → TextField-Dfzn2HeL.js.map} +1 -1
  101. package/dist/TextField.js +1 -1
  102. package/dist/{Textarea-BnHIDj2P.js → Textarea-BwbwJP6z.js} +13 -12
  103. package/dist/Textarea-BwbwJP6z.js.map +1 -0
  104. package/dist/Textarea.js +1 -1
  105. package/dist/{TimeField-ChqK40k_.js → TimeField-B0WSzSfJ.js} +4 -4
  106. package/dist/{TimeField-ChqK40k_.js.map → TimeField-B0WSzSfJ.js.map} +1 -1
  107. package/dist/TimeField.js +1 -1
  108. package/dist/TimezoneMessage-Cnsl4cHT.js +84 -0
  109. package/dist/TimezoneMessage-Cnsl4cHT.js.map +1 -0
  110. package/dist/TimezoneMessage.css +7 -0
  111. package/dist/Toast.js +2 -2
  112. package/dist/{Toaster-BlycAc63.js → Toaster-9Q_yaKGu.js} +18 -18
  113. package/dist/Toaster-9Q_yaKGu.js.map +1 -0
  114. package/dist/{Toaster-DW_bi2L9.js → Toaster-DHo8dnWH.js} +2 -2
  115. package/dist/{Toaster-DW_bi2L9.js.map → Toaster-DHo8dnWH.js.map} +1 -1
  116. package/dist/{Toolbar-vBomnRKG.js → Toolbar-CVOenuCF.js} +70 -23
  117. package/dist/Toolbar-CVOenuCF.js.map +1 -0
  118. package/dist/Toolbar.js +1 -1
  119. package/dist/{Tooltip-CUiAJXak.js → Tooltip-Bt62hC5J.js} +5 -5
  120. package/dist/{Tooltip-CUiAJXak.js.map → Tooltip-Bt62hC5J.js.map} +1 -1
  121. package/dist/Tooltip.css +9 -8
  122. package/dist/Tooltip.js +1 -1
  123. package/dist/{YearlessDateInputWithPicker-DZSb8sPf.js → YearlessDateInputWithPicker-ztozRk-X.js} +3 -3
  124. package/dist/{YearlessDateInputWithPicker-DZSb8sPf.js.map → YearlessDateInputWithPicker-ztozRk-X.js.map} +1 -1
  125. package/dist/beta/components/MultiSelectField/MultiSelectField.d.ts +2 -0
  126. package/dist/beta/components/MultiSelectField/MultiSelectFieldSync.d.ts +43 -4
  127. package/dist/beta/components/MultiSelectField/internal/MultiSelectFieldList.d.ts +5 -5
  128. package/dist/beta/components/MultiSelectField/internal/useComboMultiple.d.ts +13 -2
  129. package/dist/beta/components/MultiSelectField/stories/MultiSelectField.stories.data.d.ts +1 -0
  130. package/dist/beta/components/MultiSelectField/types.d.ts +52 -8
  131. package/dist/beta/components/SelectField/SelectFieldSync.d.ts +10 -3
  132. package/dist/beta/components/SelectField/internal/FieldListBase.d.ts +6 -5
  133. package/dist/beta/components/SelectField/internal/SelectFieldList.d.ts +4 -2
  134. package/dist/beta/components/SelectField/internal/SelectFieldListItem.d.ts +2 -1
  135. package/dist/beta/components/SelectField/internal/VirtualizedFieldListBase.d.ts +2 -0
  136. package/dist/beta/components/SelectField/internal/useCombo.d.ts +3 -1
  137. package/dist/beta/components/SelectField/internal/useFieldListSections.d.ts +55 -0
  138. package/dist/beta/components/SelectField/stories/SelectField.stories.data.d.ts +1 -0
  139. package/dist/beta/components/SelectField/types.d.ts +24 -6
  140. package/dist/beta/components/Table/DataTable/internal/editable-cells/DataTableEditableNumberCell.d.ts +7 -0
  141. package/dist/beta/components/Table/DataTable/internal/util/getTanStackColumnDef.d.ts +1 -0
  142. package/dist/beta/components/Table/DataTable/stories/DataTable.story-data.d.ts +1 -0
  143. package/dist/beta/components/Table/createColumnHelper.d.ts +36 -9
  144. package/dist/beta/components/Table/types.d.ts +54 -4
  145. package/dist/beta/components/Toolbar/Filters/internal/utils/filter-state.d.ts +1 -0
  146. package/dist/beta.js +7 -7
  147. package/dist/components/ButtonToggle/ButtonToggle.d.ts +1 -1
  148. package/dist/components/Checkbox/Checkbox.d.ts +2 -1
  149. package/dist/components/Checkbox/CheckboxGroup.d.ts +16 -8
  150. package/dist/components/Checkbox/internal/Checkbox.d.ts +1 -1
  151. package/dist/components/DateFieldRange/DateFieldRange.d.ts +8 -1
  152. package/dist/components/DateFieldRange/internal/DateFieldRangeCalendar.d.ts +3 -1
  153. package/dist/components/DateFieldSingle/DateFieldSingle.d.ts +8 -1
  154. package/dist/components/DateFieldSingle/internal/DateFieldSingleCalendar.d.ts +3 -1
  155. package/dist/components/DateFieldSingle/internal/TimezoneMessage.d.ts +6 -0
  156. package/dist/components/DateFieldSingle/internal/utils.d.ts +11 -0
  157. package/dist/components/DateFieldYearless/DateFieldYearless.d.ts +8 -3
  158. package/dist/components/DateFieldYearlessRange/DateFieldYearlessRange.d.ts +12 -1
  159. package/dist/components/DaysOfTheWeek/DaysOfTheWeek.d.ts +20 -6
  160. package/dist/components/Dialog/internal/useInitialFocus.d.ts +5 -1
  161. package/dist/components/FieldMessage/FieldMessage.d.ts +39 -20
  162. package/dist/components/FieldMessage/index.d.ts +1 -0
  163. package/dist/components/FieldMessage/utils.d.ts +7 -0
  164. package/dist/components/NumberField/NumberField.d.ts +24 -2
  165. package/dist/components/Page/Page.d.ts +2 -2
  166. package/dist/components/ProgressBar/ProgressBar.d.ts +8 -3
  167. package/dist/components/Radio/Radio.d.ts +2 -1
  168. package/dist/components/Radio/RadioGroup.d.ts +16 -8
  169. package/dist/components/SelectTrigger/internal/SelectTriggerBase.d.ts +1 -1
  170. package/dist/components/Stepper/Stepper.d.ts +6 -2
  171. package/dist/components/TextField/internal/TextField.d.ts +12 -1
  172. package/dist/components/Textarea/Textarea.d.ts +8 -5
  173. package/dist/index-DXeGMe23.js +836 -0
  174. package/dist/index-DXeGMe23.js.map +1 -0
  175. package/dist/{index.esm-BMOZFPwN.js → index.esm-C2ZhC_8d.js} +2 -2
  176. package/dist/{index.esm-BMOZFPwN.js.map → index.esm-C2ZhC_8d.js.map} +1 -1
  177. package/dist/{useOnClickOutside-Cyqbe1n3.js → index.esm-K9kxJhLx.js} +88 -94
  178. package/dist/index.esm-K9kxJhLx.js.map +1 -0
  179. package/dist/index.js +31 -30
  180. package/dist/index.js.map +1 -1
  181. package/dist/internal/components/Helper/Helper.d.ts +12 -3
  182. package/dist/internal/components/StatusIcon/StatusIcon.d.ts +45 -0
  183. package/dist/internal/components/StatusIcon/index.d.ts +1 -0
  184. package/dist/internal/functions/index.d.ts +1 -0
  185. package/dist/internal/functions/warnOnce.d.ts +5 -0
  186. package/dist/internal/hooks/useNumberField/useNumberField.d.ts +1 -1
  187. package/dist/{useDrilldown-lAdB3FFW.js → useDrilldown-jbU4Cs5l.js} +2 -598
  188. package/dist/useDrilldown-jbU4Cs5l.js.map +1 -0
  189. package/dist/{useInitialFocus-nOW12jQ5.js → useInitialFocus-BRRbylek.js} +2 -2
  190. package/dist/{useInitialFocus-nOW12jQ5.js.map → useInitialFocus-BRRbylek.js.map} +1 -1
  191. package/dist/{NumberField-W1k8V5Qq.js → useNumberField-eMyk7MB8.js} +5 -235
  192. package/dist/useNumberField-eMyk7MB8.js.map +1 -0
  193. package/dist/useOnClickOutside-Zw5vzxSq.js +71 -0
  194. package/dist/useOnClickOutside-Zw5vzxSq.js.map +1 -0
  195. package/dist/utils-pudAMGnO.js +25 -0
  196. package/dist/utils-pudAMGnO.js.map +1 -0
  197. package/package.json +9 -8
  198. package/dist/Calendar-jO-0jbbt.js.map +0 -1
  199. package/dist/Checkbox-9VbydUcM.js.map +0 -1
  200. package/dist/Combobox-CNObHLjp.js.map +0 -1
  201. package/dist/DataTable-CQpySyDq.js.map +0 -1
  202. package/dist/DateFieldRange-BG86w0pX.js.map +0 -1
  203. package/dist/DateFieldSingle-Byu_jyye.js.map +0 -1
  204. package/dist/DateFieldYearless-Dw1k3_PY.js.map +0 -1
  205. package/dist/DateFieldYearlessRange--plyld10.js.map +0 -1
  206. package/dist/DaysOfTheWeek-vE310Rjp.js.map +0 -1
  207. package/dist/FieldDialog-Be54L3E-.js.map +0 -1
  208. package/dist/FieldMessage-tEr6rWXS.js +0 -54
  209. package/dist/FieldMessage-tEr6rWXS.js.map +0 -1
  210. package/dist/Helper-CK-XjpR3.js.map +0 -1
  211. package/dist/MultiSelectFieldSync-xj7jXas-.js.map +0 -1
  212. package/dist/NumberField-W1k8V5Qq.js.map +0 -1
  213. package/dist/ProgressBar-HA9RPZfC.js.map +0 -1
  214. package/dist/Radio-31wKzlZ4.js.map +0 -1
  215. package/dist/SelectFieldSync-BFsJssdD.js.map +0 -1
  216. package/dist/SelectTriggerBase-aaOWep-V.js.map +0 -1
  217. package/dist/Stepper-Jv9A3Ned.js.map +0 -1
  218. package/dist/TextField-CDiiYSlT.js.map +0 -1
  219. package/dist/Textarea-BnHIDj2P.js.map +0 -1
  220. package/dist/Toaster-BlycAc63.js.map +0 -1
  221. package/dist/Toolbar-vBomnRKG.js.map +0 -1
  222. package/dist/useDrilldown-lAdB3FFW.js.map +0 -1
  223. package/dist/useOnClickOutside-Cyqbe1n3.js.map +0 -1
  224. package/dist/utils-BHKRoLps.js +0 -60
  225. package/dist/utils-BHKRoLps.js.map +0 -1
@@ -0,0 +1,836 @@
1
+ import * as React from 'react';
2
+ import { flushSync } from 'react-dom';
3
+
4
+ function memo(getDeps, fn, opts) {
5
+ let deps = opts.initialDeps ?? [];
6
+ let result;
7
+ function memoizedFunction() {
8
+ var _a, _b, _c, _d;
9
+ let depTime;
10
+ if (opts.key && ((_a = opts.debug) == null ? void 0 : _a.call(opts))) depTime = Date.now();
11
+ const newDeps = getDeps();
12
+ const depsChanged = newDeps.length !== deps.length || newDeps.some((dep, index) => deps[index] !== dep);
13
+ if (!depsChanged) {
14
+ return result;
15
+ }
16
+ deps = newDeps;
17
+ let resultTime;
18
+ if (opts.key && ((_b = opts.debug) == null ? void 0 : _b.call(opts))) resultTime = Date.now();
19
+ result = fn(...newDeps);
20
+ if (opts.key && ((_c = opts.debug) == null ? void 0 : _c.call(opts))) {
21
+ const depEndTime = Math.round((Date.now() - depTime) * 100) / 100;
22
+ const resultEndTime = Math.round((Date.now() - resultTime) * 100) / 100;
23
+ const resultFpsPercentage = resultEndTime / 16;
24
+ const pad = (str, num) => {
25
+ str = String(str);
26
+ while (str.length < num) {
27
+ str = " " + str;
28
+ }
29
+ return str;
30
+ };
31
+ console.info(
32
+ `%c⏱ ${pad(resultEndTime, 5)} /${pad(depEndTime, 5)} ms`,
33
+ `
34
+ font-size: .6rem;
35
+ font-weight: bold;
36
+ color: hsl(${Math.max(
37
+ 0,
38
+ Math.min(120 - 120 * resultFpsPercentage, 120)
39
+ )}deg 100% 31%);`,
40
+ opts == null ? void 0 : opts.key
41
+ );
42
+ }
43
+ (_d = opts == null ? void 0 : opts.onChange) == null ? void 0 : _d.call(opts, result);
44
+ return result;
45
+ }
46
+ memoizedFunction.updateDeps = (newDeps) => {
47
+ deps = newDeps;
48
+ };
49
+ return memoizedFunction;
50
+ }
51
+ function notUndefined(value, msg) {
52
+ if (value === void 0) {
53
+ throw new Error(`Unexpected undefined${""}`);
54
+ } else {
55
+ return value;
56
+ }
57
+ }
58
+ const approxEqual = (a, b) => Math.abs(a - b) < 1.01;
59
+ const debounce = (targetWindow, fn, ms) => {
60
+ let timeoutId;
61
+ return function(...args) {
62
+ targetWindow.clearTimeout(timeoutId);
63
+ timeoutId = targetWindow.setTimeout(() => fn.apply(this, args), ms);
64
+ };
65
+ };
66
+
67
+ const getRect = (element) => {
68
+ const { offsetWidth, offsetHeight } = element;
69
+ return { width: offsetWidth, height: offsetHeight };
70
+ };
71
+ const defaultKeyExtractor = (index) => index;
72
+ const defaultRangeExtractor = (range) => {
73
+ const start = Math.max(range.startIndex - range.overscan, 0);
74
+ const end = Math.min(range.endIndex + range.overscan, range.count - 1);
75
+ const arr = [];
76
+ for (let i = start; i <= end; i++) {
77
+ arr.push(i);
78
+ }
79
+ return arr;
80
+ };
81
+ const observeElementRect = (instance, cb) => {
82
+ const element = instance.scrollElement;
83
+ if (!element) {
84
+ return;
85
+ }
86
+ const targetWindow = instance.targetWindow;
87
+ if (!targetWindow) {
88
+ return;
89
+ }
90
+ const handler = (rect) => {
91
+ const { width, height } = rect;
92
+ cb({ width: Math.round(width), height: Math.round(height) });
93
+ };
94
+ handler(getRect(element));
95
+ if (!targetWindow.ResizeObserver) {
96
+ return () => {
97
+ };
98
+ }
99
+ const observer = new targetWindow.ResizeObserver((entries) => {
100
+ const run = () => {
101
+ const entry = entries[0];
102
+ if (entry == null ? void 0 : entry.borderBoxSize) {
103
+ const box = entry.borderBoxSize[0];
104
+ if (box) {
105
+ handler({ width: box.inlineSize, height: box.blockSize });
106
+ return;
107
+ }
108
+ }
109
+ handler(getRect(element));
110
+ };
111
+ instance.options.useAnimationFrameWithResizeObserver ? requestAnimationFrame(run) : run();
112
+ });
113
+ observer.observe(element, { box: "border-box" });
114
+ return () => {
115
+ observer.unobserve(element);
116
+ };
117
+ };
118
+ const addEventListenerOptions = {
119
+ passive: true
120
+ };
121
+ const supportsScrollend = typeof window == "undefined" ? true : "onscrollend" in window;
122
+ const observeElementOffset = (instance, cb) => {
123
+ const element = instance.scrollElement;
124
+ if (!element) {
125
+ return;
126
+ }
127
+ const targetWindow = instance.targetWindow;
128
+ if (!targetWindow) {
129
+ return;
130
+ }
131
+ let offset = 0;
132
+ const fallback = instance.options.useScrollendEvent && supportsScrollend ? () => void 0 : debounce(
133
+ targetWindow,
134
+ () => {
135
+ cb(offset, false);
136
+ },
137
+ instance.options.isScrollingResetDelay
138
+ );
139
+ const createHandler = (isScrolling) => () => {
140
+ const { horizontal, isRtl } = instance.options;
141
+ offset = horizontal ? element["scrollLeft"] * (isRtl && -1 || 1) : element["scrollTop"];
142
+ fallback();
143
+ cb(offset, isScrolling);
144
+ };
145
+ const handler = createHandler(true);
146
+ const endHandler = createHandler(false);
147
+ endHandler();
148
+ element.addEventListener("scroll", handler, addEventListenerOptions);
149
+ const registerScrollendEvent = instance.options.useScrollendEvent && supportsScrollend;
150
+ if (registerScrollendEvent) {
151
+ element.addEventListener("scrollend", endHandler, addEventListenerOptions);
152
+ }
153
+ return () => {
154
+ element.removeEventListener("scroll", handler);
155
+ if (registerScrollendEvent) {
156
+ element.removeEventListener("scrollend", endHandler);
157
+ }
158
+ };
159
+ };
160
+ const measureElement = (element, entry, instance) => {
161
+ if (entry == null ? void 0 : entry.borderBoxSize) {
162
+ const box = entry.borderBoxSize[0];
163
+ if (box) {
164
+ const size = Math.round(
165
+ box[instance.options.horizontal ? "inlineSize" : "blockSize"]
166
+ );
167
+ return size;
168
+ }
169
+ }
170
+ return element[instance.options.horizontal ? "offsetWidth" : "offsetHeight"];
171
+ };
172
+ const elementScroll = (offset, {
173
+ adjustments = 0,
174
+ behavior
175
+ }, instance) => {
176
+ var _a, _b;
177
+ const toOffset = offset + adjustments;
178
+ (_b = (_a = instance.scrollElement) == null ? void 0 : _a.scrollTo) == null ? void 0 : _b.call(_a, {
179
+ [instance.options.horizontal ? "left" : "top"]: toOffset,
180
+ behavior
181
+ });
182
+ };
183
+ class Virtualizer {
184
+ constructor(opts) {
185
+ this.unsubs = [];
186
+ this.scrollElement = null;
187
+ this.targetWindow = null;
188
+ this.isScrolling = false;
189
+ this.measurementsCache = [];
190
+ this.itemSizeCache = /* @__PURE__ */ new Map();
191
+ this.pendingMeasuredCacheIndexes = [];
192
+ this.scrollRect = null;
193
+ this.scrollOffset = null;
194
+ this.scrollDirection = null;
195
+ this.scrollAdjustments = 0;
196
+ this.elementsCache = /* @__PURE__ */ new Map();
197
+ this.observer = /* @__PURE__ */ (() => {
198
+ let _ro = null;
199
+ const get = () => {
200
+ if (_ro) {
201
+ return _ro;
202
+ }
203
+ if (!this.targetWindow || !this.targetWindow.ResizeObserver) {
204
+ return null;
205
+ }
206
+ return _ro = new this.targetWindow.ResizeObserver((entries) => {
207
+ entries.forEach((entry) => {
208
+ const run = () => {
209
+ this._measureElement(entry.target, entry);
210
+ };
211
+ this.options.useAnimationFrameWithResizeObserver ? requestAnimationFrame(run) : run();
212
+ });
213
+ });
214
+ };
215
+ return {
216
+ disconnect: () => {
217
+ var _a;
218
+ (_a = get()) == null ? void 0 : _a.disconnect();
219
+ _ro = null;
220
+ },
221
+ observe: (target) => {
222
+ var _a;
223
+ return (_a = get()) == null ? void 0 : _a.observe(target, { box: "border-box" });
224
+ },
225
+ unobserve: (target) => {
226
+ var _a;
227
+ return (_a = get()) == null ? void 0 : _a.unobserve(target);
228
+ }
229
+ };
230
+ })();
231
+ this.range = null;
232
+ this.setOptions = (opts2) => {
233
+ Object.entries(opts2).forEach(([key, value]) => {
234
+ if (typeof value === "undefined") delete opts2[key];
235
+ });
236
+ this.options = {
237
+ debug: false,
238
+ initialOffset: 0,
239
+ overscan: 1,
240
+ paddingStart: 0,
241
+ paddingEnd: 0,
242
+ scrollPaddingStart: 0,
243
+ scrollPaddingEnd: 0,
244
+ horizontal: false,
245
+ getItemKey: defaultKeyExtractor,
246
+ rangeExtractor: defaultRangeExtractor,
247
+ onChange: () => {
248
+ },
249
+ measureElement,
250
+ initialRect: { width: 0, height: 0 },
251
+ scrollMargin: 0,
252
+ gap: 0,
253
+ indexAttribute: "data-index",
254
+ initialMeasurementsCache: [],
255
+ lanes: 1,
256
+ isScrollingResetDelay: 150,
257
+ enabled: true,
258
+ isRtl: false,
259
+ useScrollendEvent: false,
260
+ useAnimationFrameWithResizeObserver: false,
261
+ ...opts2
262
+ };
263
+ };
264
+ this.notify = (sync) => {
265
+ var _a, _b;
266
+ (_b = (_a = this.options).onChange) == null ? void 0 : _b.call(_a, this, sync);
267
+ };
268
+ this.maybeNotify = memo(
269
+ () => {
270
+ this.calculateRange();
271
+ return [
272
+ this.isScrolling,
273
+ this.range ? this.range.startIndex : null,
274
+ this.range ? this.range.endIndex : null
275
+ ];
276
+ },
277
+ (isScrolling) => {
278
+ this.notify(isScrolling);
279
+ },
280
+ {
281
+ key: process.env.NODE_ENV !== "production" && "maybeNotify",
282
+ debug: () => this.options.debug,
283
+ initialDeps: [
284
+ this.isScrolling,
285
+ this.range ? this.range.startIndex : null,
286
+ this.range ? this.range.endIndex : null
287
+ ]
288
+ }
289
+ );
290
+ this.cleanup = () => {
291
+ this.unsubs.filter(Boolean).forEach((d) => d());
292
+ this.unsubs = [];
293
+ this.observer.disconnect();
294
+ this.scrollElement = null;
295
+ this.targetWindow = null;
296
+ };
297
+ this._didMount = () => {
298
+ return () => {
299
+ this.cleanup();
300
+ };
301
+ };
302
+ this._willUpdate = () => {
303
+ var _a;
304
+ const scrollElement = this.options.enabled ? this.options.getScrollElement() : null;
305
+ if (this.scrollElement !== scrollElement) {
306
+ this.cleanup();
307
+ if (!scrollElement) {
308
+ this.maybeNotify();
309
+ return;
310
+ }
311
+ this.scrollElement = scrollElement;
312
+ if (this.scrollElement && "ownerDocument" in this.scrollElement) {
313
+ this.targetWindow = this.scrollElement.ownerDocument.defaultView;
314
+ } else {
315
+ this.targetWindow = ((_a = this.scrollElement) == null ? void 0 : _a.window) ?? null;
316
+ }
317
+ this.elementsCache.forEach((cached) => {
318
+ this.observer.observe(cached);
319
+ });
320
+ this._scrollToOffset(this.getScrollOffset(), {
321
+ adjustments: void 0,
322
+ behavior: void 0
323
+ });
324
+ this.unsubs.push(
325
+ this.options.observeElementRect(this, (rect) => {
326
+ this.scrollRect = rect;
327
+ this.maybeNotify();
328
+ })
329
+ );
330
+ this.unsubs.push(
331
+ this.options.observeElementOffset(this, (offset, isScrolling) => {
332
+ this.scrollAdjustments = 0;
333
+ this.scrollDirection = isScrolling ? this.getScrollOffset() < offset ? "forward" : "backward" : null;
334
+ this.scrollOffset = offset;
335
+ this.isScrolling = isScrolling;
336
+ this.maybeNotify();
337
+ })
338
+ );
339
+ }
340
+ };
341
+ this.getSize = () => {
342
+ if (!this.options.enabled) {
343
+ this.scrollRect = null;
344
+ return 0;
345
+ }
346
+ this.scrollRect = this.scrollRect ?? this.options.initialRect;
347
+ return this.scrollRect[this.options.horizontal ? "width" : "height"];
348
+ };
349
+ this.getScrollOffset = () => {
350
+ if (!this.options.enabled) {
351
+ this.scrollOffset = null;
352
+ return 0;
353
+ }
354
+ this.scrollOffset = this.scrollOffset ?? (typeof this.options.initialOffset === "function" ? this.options.initialOffset() : this.options.initialOffset);
355
+ return this.scrollOffset;
356
+ };
357
+ this.getFurthestMeasurement = (measurements, index) => {
358
+ const furthestMeasurementsFound = /* @__PURE__ */ new Map();
359
+ const furthestMeasurements = /* @__PURE__ */ new Map();
360
+ for (let m = index - 1; m >= 0; m--) {
361
+ const measurement = measurements[m];
362
+ if (furthestMeasurementsFound.has(measurement.lane)) {
363
+ continue;
364
+ }
365
+ const previousFurthestMeasurement = furthestMeasurements.get(
366
+ measurement.lane
367
+ );
368
+ if (previousFurthestMeasurement == null || measurement.end > previousFurthestMeasurement.end) {
369
+ furthestMeasurements.set(measurement.lane, measurement);
370
+ } else if (measurement.end < previousFurthestMeasurement.end) {
371
+ furthestMeasurementsFound.set(measurement.lane, true);
372
+ }
373
+ if (furthestMeasurementsFound.size === this.options.lanes) {
374
+ break;
375
+ }
376
+ }
377
+ return furthestMeasurements.size === this.options.lanes ? Array.from(furthestMeasurements.values()).sort((a, b) => {
378
+ if (a.end === b.end) {
379
+ return a.index - b.index;
380
+ }
381
+ return a.end - b.end;
382
+ })[0] : void 0;
383
+ };
384
+ this.getMeasurementOptions = memo(
385
+ () => [
386
+ this.options.count,
387
+ this.options.paddingStart,
388
+ this.options.scrollMargin,
389
+ this.options.getItemKey,
390
+ this.options.enabled
391
+ ],
392
+ (count, paddingStart, scrollMargin, getItemKey, enabled) => {
393
+ this.pendingMeasuredCacheIndexes = [];
394
+ return {
395
+ count,
396
+ paddingStart,
397
+ scrollMargin,
398
+ getItemKey,
399
+ enabled
400
+ };
401
+ },
402
+ {
403
+ key: false
404
+ }
405
+ );
406
+ this.getMeasurements = memo(
407
+ () => [this.getMeasurementOptions(), this.itemSizeCache],
408
+ ({ count, paddingStart, scrollMargin, getItemKey, enabled }, itemSizeCache) => {
409
+ if (!enabled) {
410
+ this.measurementsCache = [];
411
+ this.itemSizeCache.clear();
412
+ return [];
413
+ }
414
+ if (this.measurementsCache.length === 0) {
415
+ this.measurementsCache = this.options.initialMeasurementsCache;
416
+ this.measurementsCache.forEach((item) => {
417
+ this.itemSizeCache.set(item.key, item.size);
418
+ });
419
+ }
420
+ const min = this.pendingMeasuredCacheIndexes.length > 0 ? Math.min(...this.pendingMeasuredCacheIndexes) : 0;
421
+ this.pendingMeasuredCacheIndexes = [];
422
+ const measurements = this.measurementsCache.slice(0, min);
423
+ for (let i = min; i < count; i++) {
424
+ const key = getItemKey(i);
425
+ const furthestMeasurement = this.options.lanes === 1 ? measurements[i - 1] : this.getFurthestMeasurement(measurements, i);
426
+ const start = furthestMeasurement ? furthestMeasurement.end + this.options.gap : paddingStart + scrollMargin;
427
+ const measuredSize = itemSizeCache.get(key);
428
+ const size = typeof measuredSize === "number" ? measuredSize : this.options.estimateSize(i);
429
+ const end = start + size;
430
+ const lane = furthestMeasurement ? furthestMeasurement.lane : i % this.options.lanes;
431
+ measurements[i] = {
432
+ index: i,
433
+ start,
434
+ size,
435
+ end,
436
+ key,
437
+ lane
438
+ };
439
+ }
440
+ this.measurementsCache = measurements;
441
+ return measurements;
442
+ },
443
+ {
444
+ key: process.env.NODE_ENV !== "production" && "getMeasurements",
445
+ debug: () => this.options.debug
446
+ }
447
+ );
448
+ this.calculateRange = memo(
449
+ () => [
450
+ this.getMeasurements(),
451
+ this.getSize(),
452
+ this.getScrollOffset(),
453
+ this.options.lanes
454
+ ],
455
+ (measurements, outerSize, scrollOffset, lanes) => {
456
+ return this.range = measurements.length > 0 && outerSize > 0 ? calculateRange({
457
+ measurements,
458
+ outerSize,
459
+ scrollOffset,
460
+ lanes
461
+ }) : null;
462
+ },
463
+ {
464
+ key: process.env.NODE_ENV !== "production" && "calculateRange",
465
+ debug: () => this.options.debug
466
+ }
467
+ );
468
+ this.getVirtualIndexes = memo(
469
+ () => {
470
+ let startIndex = null;
471
+ let endIndex = null;
472
+ const range = this.calculateRange();
473
+ if (range) {
474
+ startIndex = range.startIndex;
475
+ endIndex = range.endIndex;
476
+ }
477
+ this.maybeNotify.updateDeps([this.isScrolling, startIndex, endIndex]);
478
+ return [
479
+ this.options.rangeExtractor,
480
+ this.options.overscan,
481
+ this.options.count,
482
+ startIndex,
483
+ endIndex
484
+ ];
485
+ },
486
+ (rangeExtractor, overscan, count, startIndex, endIndex) => {
487
+ return startIndex === null || endIndex === null ? [] : rangeExtractor({
488
+ startIndex,
489
+ endIndex,
490
+ overscan,
491
+ count
492
+ });
493
+ },
494
+ {
495
+ key: process.env.NODE_ENV !== "production" && "getVirtualIndexes",
496
+ debug: () => this.options.debug
497
+ }
498
+ );
499
+ this.indexFromElement = (node) => {
500
+ const attributeName = this.options.indexAttribute;
501
+ const indexStr = node.getAttribute(attributeName);
502
+ if (!indexStr) {
503
+ console.warn(
504
+ `Missing attribute name '${attributeName}={index}' on measured element.`
505
+ );
506
+ return -1;
507
+ }
508
+ return parseInt(indexStr, 10);
509
+ };
510
+ this._measureElement = (node, entry) => {
511
+ const index = this.indexFromElement(node);
512
+ const item = this.measurementsCache[index];
513
+ if (!item) {
514
+ return;
515
+ }
516
+ const key = item.key;
517
+ const prevNode = this.elementsCache.get(key);
518
+ if (prevNode !== node) {
519
+ if (prevNode) {
520
+ this.observer.unobserve(prevNode);
521
+ }
522
+ this.observer.observe(node);
523
+ this.elementsCache.set(key, node);
524
+ }
525
+ if (node.isConnected) {
526
+ this.resizeItem(index, this.options.measureElement(node, entry, this));
527
+ }
528
+ };
529
+ this.resizeItem = (index, size) => {
530
+ const item = this.measurementsCache[index];
531
+ if (!item) {
532
+ return;
533
+ }
534
+ const itemSize = this.itemSizeCache.get(item.key) ?? item.size;
535
+ const delta = size - itemSize;
536
+ if (delta !== 0) {
537
+ if (this.shouldAdjustScrollPositionOnItemSizeChange !== void 0 ? this.shouldAdjustScrollPositionOnItemSizeChange(item, delta, this) : item.start < this.getScrollOffset() + this.scrollAdjustments) {
538
+ if (process.env.NODE_ENV !== "production" && this.options.debug) {
539
+ console.info("correction", delta);
540
+ }
541
+ this._scrollToOffset(this.getScrollOffset(), {
542
+ adjustments: this.scrollAdjustments += delta,
543
+ behavior: void 0
544
+ });
545
+ }
546
+ this.pendingMeasuredCacheIndexes.push(item.index);
547
+ this.itemSizeCache = new Map(this.itemSizeCache.set(item.key, size));
548
+ this.notify(false);
549
+ }
550
+ };
551
+ this.measureElement = (node) => {
552
+ if (!node) {
553
+ this.elementsCache.forEach((cached, key) => {
554
+ if (!cached.isConnected) {
555
+ this.observer.unobserve(cached);
556
+ this.elementsCache.delete(key);
557
+ }
558
+ });
559
+ return;
560
+ }
561
+ this._measureElement(node, void 0);
562
+ };
563
+ this.getVirtualItems = memo(
564
+ () => [this.getVirtualIndexes(), this.getMeasurements()],
565
+ (indexes, measurements) => {
566
+ const virtualItems = [];
567
+ for (let k = 0, len = indexes.length; k < len; k++) {
568
+ const i = indexes[k];
569
+ const measurement = measurements[i];
570
+ virtualItems.push(measurement);
571
+ }
572
+ return virtualItems;
573
+ },
574
+ {
575
+ key: process.env.NODE_ENV !== "production" && "getVirtualItems",
576
+ debug: () => this.options.debug
577
+ }
578
+ );
579
+ this.getVirtualItemForOffset = (offset) => {
580
+ const measurements = this.getMeasurements();
581
+ if (measurements.length === 0) {
582
+ return void 0;
583
+ }
584
+ return notUndefined(
585
+ measurements[findNearestBinarySearch(
586
+ 0,
587
+ measurements.length - 1,
588
+ (index) => notUndefined(measurements[index]).start,
589
+ offset
590
+ )]
591
+ );
592
+ };
593
+ this.getOffsetForAlignment = (toOffset, align, itemSize = 0) => {
594
+ const size = this.getSize();
595
+ const scrollOffset = this.getScrollOffset();
596
+ if (align === "auto") {
597
+ align = toOffset >= scrollOffset + size ? "end" : "start";
598
+ }
599
+ if (align === "center") {
600
+ toOffset += (itemSize - size) / 2;
601
+ } else if (align === "end") {
602
+ toOffset -= size;
603
+ }
604
+ const maxOffset = this.getTotalSize() + this.options.scrollMargin - size;
605
+ return Math.max(Math.min(maxOffset, toOffset), 0);
606
+ };
607
+ this.getOffsetForIndex = (index, align = "auto") => {
608
+ index = Math.max(0, Math.min(index, this.options.count - 1));
609
+ const item = this.measurementsCache[index];
610
+ if (!item) {
611
+ return void 0;
612
+ }
613
+ const size = this.getSize();
614
+ const scrollOffset = this.getScrollOffset();
615
+ if (align === "auto") {
616
+ if (item.end >= scrollOffset + size - this.options.scrollPaddingEnd) {
617
+ align = "end";
618
+ } else if (item.start <= scrollOffset + this.options.scrollPaddingStart) {
619
+ align = "start";
620
+ } else {
621
+ return [scrollOffset, align];
622
+ }
623
+ }
624
+ const toOffset = align === "end" ? item.end + this.options.scrollPaddingEnd : item.start - this.options.scrollPaddingStart;
625
+ return [
626
+ this.getOffsetForAlignment(toOffset, align, item.size),
627
+ align
628
+ ];
629
+ };
630
+ this.isDynamicMode = () => this.elementsCache.size > 0;
631
+ this.scrollToOffset = (toOffset, { align = "start", behavior } = {}) => {
632
+ if (behavior === "smooth" && this.isDynamicMode()) {
633
+ console.warn(
634
+ "The `smooth` scroll behavior is not fully supported with dynamic size."
635
+ );
636
+ }
637
+ this._scrollToOffset(this.getOffsetForAlignment(toOffset, align), {
638
+ adjustments: void 0,
639
+ behavior
640
+ });
641
+ };
642
+ this.scrollToIndex = (index, { align: initialAlign = "auto", behavior } = {}) => {
643
+ if (behavior === "smooth" && this.isDynamicMode()) {
644
+ console.warn(
645
+ "The `smooth` scroll behavior is not fully supported with dynamic size."
646
+ );
647
+ }
648
+ index = Math.max(0, Math.min(index, this.options.count - 1));
649
+ let attempts = 0;
650
+ const maxAttempts = 10;
651
+ const tryScroll = (currentAlign) => {
652
+ if (!this.targetWindow) return;
653
+ const offsetInfo = this.getOffsetForIndex(index, currentAlign);
654
+ if (!offsetInfo) {
655
+ console.warn("Failed to get offset for index:", index);
656
+ return;
657
+ }
658
+ const [offset, align] = offsetInfo;
659
+ this._scrollToOffset(offset, { adjustments: void 0, behavior });
660
+ this.targetWindow.requestAnimationFrame(() => {
661
+ const currentOffset = this.getScrollOffset();
662
+ const afterInfo = this.getOffsetForIndex(index, align);
663
+ if (!afterInfo) {
664
+ console.warn("Failed to get offset for index:", index);
665
+ return;
666
+ }
667
+ if (!approxEqual(afterInfo[0], currentOffset)) {
668
+ scheduleRetry(align);
669
+ }
670
+ });
671
+ };
672
+ const scheduleRetry = (align) => {
673
+ if (!this.targetWindow) return;
674
+ attempts++;
675
+ if (attempts < maxAttempts) {
676
+ if (process.env.NODE_ENV !== "production" && this.options.debug) {
677
+ console.info("Schedule retry", attempts, maxAttempts);
678
+ }
679
+ this.targetWindow.requestAnimationFrame(() => tryScroll(align));
680
+ } else {
681
+ console.warn(
682
+ `Failed to scroll to index ${index} after ${maxAttempts} attempts.`
683
+ );
684
+ }
685
+ };
686
+ tryScroll(initialAlign);
687
+ };
688
+ this.scrollBy = (delta, { behavior } = {}) => {
689
+ if (behavior === "smooth" && this.isDynamicMode()) {
690
+ console.warn(
691
+ "The `smooth` scroll behavior is not fully supported with dynamic size."
692
+ );
693
+ }
694
+ this._scrollToOffset(this.getScrollOffset() + delta, {
695
+ adjustments: void 0,
696
+ behavior
697
+ });
698
+ };
699
+ this.getTotalSize = () => {
700
+ var _a;
701
+ const measurements = this.getMeasurements();
702
+ let end;
703
+ if (measurements.length === 0) {
704
+ end = this.options.paddingStart;
705
+ } else if (this.options.lanes === 1) {
706
+ end = ((_a = measurements[measurements.length - 1]) == null ? void 0 : _a.end) ?? 0;
707
+ } else {
708
+ const endByLane = Array(this.options.lanes).fill(null);
709
+ let endIndex = measurements.length - 1;
710
+ while (endIndex >= 0 && endByLane.some((val) => val === null)) {
711
+ const item = measurements[endIndex];
712
+ if (endByLane[item.lane] === null) {
713
+ endByLane[item.lane] = item.end;
714
+ }
715
+ endIndex--;
716
+ }
717
+ end = Math.max(...endByLane.filter((val) => val !== null));
718
+ }
719
+ return Math.max(
720
+ end - this.options.scrollMargin + this.options.paddingEnd,
721
+ 0
722
+ );
723
+ };
724
+ this._scrollToOffset = (offset, {
725
+ adjustments,
726
+ behavior
727
+ }) => {
728
+ this.options.scrollToFn(offset, { behavior, adjustments }, this);
729
+ };
730
+ this.measure = () => {
731
+ this.itemSizeCache = /* @__PURE__ */ new Map();
732
+ this.notify(false);
733
+ };
734
+ this.setOptions(opts);
735
+ }
736
+ }
737
+ const findNearestBinarySearch = (low, high, getCurrentValue, value) => {
738
+ while (low <= high) {
739
+ const middle = (low + high) / 2 | 0;
740
+ const currentValue = getCurrentValue(middle);
741
+ if (currentValue < value) {
742
+ low = middle + 1;
743
+ } else if (currentValue > value) {
744
+ high = middle - 1;
745
+ } else {
746
+ return middle;
747
+ }
748
+ }
749
+ if (low > 0) {
750
+ return low - 1;
751
+ } else {
752
+ return 0;
753
+ }
754
+ };
755
+ function calculateRange({
756
+ measurements,
757
+ outerSize,
758
+ scrollOffset,
759
+ lanes
760
+ }) {
761
+ const lastIndex = measurements.length - 1;
762
+ const getOffset = (index) => measurements[index].start;
763
+ if (measurements.length <= lanes) {
764
+ return {
765
+ startIndex: 0,
766
+ endIndex: lastIndex
767
+ };
768
+ }
769
+ let startIndex = findNearestBinarySearch(
770
+ 0,
771
+ lastIndex,
772
+ getOffset,
773
+ scrollOffset
774
+ );
775
+ let endIndex = startIndex;
776
+ if (lanes === 1) {
777
+ while (endIndex < lastIndex && measurements[endIndex].end < scrollOffset + outerSize) {
778
+ endIndex++;
779
+ }
780
+ } else if (lanes > 1) {
781
+ const endPerLane = Array(lanes).fill(0);
782
+ while (endIndex < lastIndex && endPerLane.some((pos) => pos < scrollOffset + outerSize)) {
783
+ const item = measurements[endIndex];
784
+ endPerLane[item.lane] = item.end;
785
+ endIndex++;
786
+ }
787
+ const startPerLane = Array(lanes).fill(scrollOffset + outerSize);
788
+ while (startIndex >= 0 && startPerLane.some((pos) => pos >= scrollOffset)) {
789
+ const item = measurements[startIndex];
790
+ startPerLane[item.lane] = item.start;
791
+ startIndex--;
792
+ }
793
+ startIndex = Math.max(0, startIndex - startIndex % lanes);
794
+ endIndex = Math.min(lastIndex, endIndex + (lanes - 1 - endIndex % lanes));
795
+ }
796
+ return { startIndex, endIndex };
797
+ }
798
+
799
+ const useIsomorphicLayoutEffect = typeof document !== "undefined" ? React.useLayoutEffect : React.useEffect;
800
+ function useVirtualizerBase(options) {
801
+ const rerender = React.useReducer(() => ({}), {})[1];
802
+ const resolvedOptions = {
803
+ ...options,
804
+ onChange: (instance2, sync) => {
805
+ var _a;
806
+ if (sync) {
807
+ flushSync(rerender);
808
+ } else {
809
+ rerender();
810
+ }
811
+ (_a = options.onChange) == null ? void 0 : _a.call(options, instance2, sync);
812
+ }
813
+ };
814
+ const [instance] = React.useState(
815
+ () => new Virtualizer(resolvedOptions)
816
+ );
817
+ instance.setOptions(resolvedOptions);
818
+ useIsomorphicLayoutEffect(() => {
819
+ return instance._didMount();
820
+ }, []);
821
+ useIsomorphicLayoutEffect(() => {
822
+ return instance._willUpdate();
823
+ });
824
+ return instance;
825
+ }
826
+ function useVirtualizer(options) {
827
+ return useVirtualizerBase({
828
+ observeElementRect,
829
+ observeElementOffset,
830
+ scrollToFn: elementScroll,
831
+ ...options
832
+ });
833
+ }
834
+
835
+ export { defaultRangeExtractor as d, useVirtualizer as u };
836
+ //# sourceMappingURL=index-DXeGMe23.js.map