@shopify/flash-list 1.8.0 → 2.0.0-alpha.2

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 (170) hide show
  1. package/README.md +147 -26
  2. package/dist/FlashListProps.d.ts +65 -2
  3. package/dist/FlashListProps.d.ts.map +1 -1
  4. package/dist/__tests__/AverageWindow.test.js +35 -0
  5. package/dist/__tests__/AverageWindow.test.js.map +1 -1
  6. package/dist/enableNewCore.d.ts +3 -0
  7. package/dist/enableNewCore.d.ts.map +1 -0
  8. package/dist/enableNewCore.js +25 -0
  9. package/dist/enableNewCore.js.map +1 -0
  10. package/dist/index.d.ts +5 -0
  11. package/dist/index.d.ts.map +1 -1
  12. package/dist/index.js +28 -8
  13. package/dist/index.js.map +1 -1
  14. package/dist/recyclerview/RecycleKeyManager.d.ts +82 -0
  15. package/dist/recyclerview/RecycleKeyManager.d.ts.map +1 -0
  16. package/dist/recyclerview/RecycleKeyManager.js +135 -0
  17. package/dist/recyclerview/RecycleKeyManager.js.map +1 -0
  18. package/dist/recyclerview/RecyclerView.d.ts +12 -0
  19. package/dist/recyclerview/RecyclerView.d.ts.map +1 -0
  20. package/dist/recyclerview/RecyclerView.js +283 -0
  21. package/dist/recyclerview/RecyclerView.js.map +1 -0
  22. package/dist/recyclerview/RecyclerViewContextProvider.d.ts +12 -0
  23. package/dist/recyclerview/RecyclerViewContextProvider.d.ts.map +1 -0
  24. package/dist/recyclerview/RecyclerViewContextProvider.js +11 -0
  25. package/dist/recyclerview/RecyclerViewContextProvider.js.map +1 -0
  26. package/dist/recyclerview/RecyclerViewManager.d.ts +52 -0
  27. package/dist/recyclerview/RecyclerViewManager.d.ts.map +1 -0
  28. package/dist/recyclerview/RecyclerViewManager.js +323 -0
  29. package/dist/recyclerview/RecyclerViewManager.js.map +1 -0
  30. package/dist/recyclerview/RecyclerViewProps.d.ts +9 -0
  31. package/dist/recyclerview/RecyclerViewProps.d.ts.map +1 -0
  32. package/dist/recyclerview/RecyclerViewProps.js +3 -0
  33. package/dist/recyclerview/RecyclerViewProps.js.map +1 -0
  34. package/dist/recyclerview/ViewHolder.d.ts +45 -0
  35. package/dist/recyclerview/ViewHolder.d.ts.map +1 -0
  36. package/dist/recyclerview/ViewHolder.js +96 -0
  37. package/dist/recyclerview/ViewHolder.js.map +1 -0
  38. package/dist/recyclerview/ViewHolderCollection.d.ts +57 -0
  39. package/dist/recyclerview/ViewHolderCollection.d.ts.map +1 -0
  40. package/dist/recyclerview/ViewHolderCollection.js +75 -0
  41. package/dist/recyclerview/ViewHolderCollection.js.map +1 -0
  42. package/dist/recyclerview/components/CompatScroller.d.ts +7 -0
  43. package/dist/recyclerview/components/CompatScroller.d.ts.map +1 -0
  44. package/dist/recyclerview/components/CompatScroller.js +8 -0
  45. package/dist/recyclerview/components/CompatScroller.js.map +1 -0
  46. package/dist/recyclerview/components/CompatView.d.ts +7 -0
  47. package/dist/recyclerview/components/CompatView.d.ts.map +1 -0
  48. package/dist/recyclerview/components/CompatView.js +8 -0
  49. package/dist/recyclerview/components/CompatView.js.map +1 -0
  50. package/dist/recyclerview/components/ScrollAnchor.d.ts +28 -0
  51. package/dist/recyclerview/components/ScrollAnchor.d.ts.map +1 -0
  52. package/dist/recyclerview/components/ScrollAnchor.js +35 -0
  53. package/dist/recyclerview/components/ScrollAnchor.js.map +1 -0
  54. package/dist/recyclerview/components/StickyHeaders.d.ts +38 -0
  55. package/dist/recyclerview/components/StickyHeaders.d.ts.map +1 -0
  56. package/dist/recyclerview/components/StickyHeaders.js +119 -0
  57. package/dist/recyclerview/components/StickyHeaders.js.map +1 -0
  58. package/dist/recyclerview/helpers/ConsecutiveNumbers.d.ts +51 -0
  59. package/dist/recyclerview/helpers/ConsecutiveNumbers.d.ts.map +1 -0
  60. package/dist/recyclerview/helpers/ConsecutiveNumbers.js +122 -0
  61. package/dist/recyclerview/helpers/ConsecutiveNumbers.js.map +1 -0
  62. package/dist/recyclerview/helpers/EngagedIndicesTracker.d.ts +59 -0
  63. package/dist/recyclerview/helpers/EngagedIndicesTracker.d.ts.map +1 -0
  64. package/dist/recyclerview/helpers/EngagedIndicesTracker.js +138 -0
  65. package/dist/recyclerview/helpers/EngagedIndicesTracker.js.map +1 -0
  66. package/dist/recyclerview/hooks/useBoundDetection.d.ts +19 -0
  67. package/dist/recyclerview/hooks/useBoundDetection.d.ts.map +1 -0
  68. package/dist/recyclerview/hooks/useBoundDetection.js +103 -0
  69. package/dist/recyclerview/hooks/useBoundDetection.js.map +1 -0
  70. package/dist/recyclerview/hooks/useLayoutState.d.ts +12 -0
  71. package/dist/recyclerview/hooks/useLayoutState.d.ts.map +1 -0
  72. package/dist/recyclerview/hooks/useLayoutState.js +43 -0
  73. package/dist/recyclerview/hooks/useLayoutState.js.map +1 -0
  74. package/dist/recyclerview/hooks/useOnLoad.d.ts +25 -0
  75. package/dist/recyclerview/hooks/useOnLoad.d.ts.map +1 -0
  76. package/dist/recyclerview/hooks/useOnLoad.js +73 -0
  77. package/dist/recyclerview/hooks/useOnLoad.js.map +1 -0
  78. package/dist/recyclerview/hooks/useRecyclerViewController.d.ts +72 -0
  79. package/dist/recyclerview/hooks/useRecyclerViewController.d.ts.map +1 -0
  80. package/dist/recyclerview/hooks/useRecyclerViewController.js +370 -0
  81. package/dist/recyclerview/hooks/useRecyclerViewController.js.map +1 -0
  82. package/dist/recyclerview/hooks/useRecyclerViewManager.d.ts +6 -0
  83. package/dist/recyclerview/hooks/useRecyclerViewManager.d.ts.map +1 -0
  84. package/dist/recyclerview/hooks/useRecyclerViewManager.js +27 -0
  85. package/dist/recyclerview/hooks/useRecyclerViewManager.js.map +1 -0
  86. package/dist/recyclerview/hooks/useRecyclingState.d.ts +16 -0
  87. package/dist/recyclerview/hooks/useRecyclingState.d.ts.map +1 -0
  88. package/dist/recyclerview/hooks/useRecyclingState.js +54 -0
  89. package/dist/recyclerview/hooks/useRecyclingState.js.map +1 -0
  90. package/dist/recyclerview/hooks/useSecondaryProps.d.ts +27 -0
  91. package/dist/recyclerview/hooks/useSecondaryProps.d.ts.map +1 -0
  92. package/dist/recyclerview/hooks/useSecondaryProps.js +93 -0
  93. package/dist/recyclerview/hooks/useSecondaryProps.js.map +1 -0
  94. package/dist/recyclerview/hooks/useUnmountFlag.d.ts +11 -0
  95. package/dist/recyclerview/hooks/useUnmountFlag.d.ts.map +1 -0
  96. package/dist/recyclerview/hooks/useUnmountFlag.js +28 -0
  97. package/dist/recyclerview/hooks/useUnmountFlag.js.map +1 -0
  98. package/dist/recyclerview/layout-managers/GridLayoutManager.d.ts +65 -0
  99. package/dist/recyclerview/layout-managers/GridLayoutManager.d.ts.map +1 -0
  100. package/dist/recyclerview/layout-managers/GridLayoutManager.js +204 -0
  101. package/dist/recyclerview/layout-managers/GridLayoutManager.js.map +1 -0
  102. package/dist/recyclerview/layout-managers/LayoutManager.d.ts +281 -0
  103. package/dist/recyclerview/layout-managers/LayoutManager.d.ts.map +1 -0
  104. package/dist/recyclerview/layout-managers/LayoutManager.js +250 -0
  105. package/dist/recyclerview/layout-managers/LayoutManager.js.map +1 -0
  106. package/dist/recyclerview/layout-managers/LinearLayoutManager.d.ts +52 -0
  107. package/dist/recyclerview/layout-managers/LinearLayoutManager.d.ts.map +1 -0
  108. package/dist/recyclerview/layout-managers/LinearLayoutManager.js +191 -0
  109. package/dist/recyclerview/layout-managers/LinearLayoutManager.js.map +1 -0
  110. package/dist/recyclerview/layout-managers/MasonryLayoutManager.d.ts +73 -0
  111. package/dist/recyclerview/layout-managers/MasonryLayoutManager.d.ts.map +1 -0
  112. package/dist/recyclerview/layout-managers/MasonryLayoutManager.js +274 -0
  113. package/dist/recyclerview/layout-managers/MasonryLayoutManager.js.map +1 -0
  114. package/dist/recyclerview/utils/adjustOffsetForRTL.d.ts +12 -0
  115. package/dist/recyclerview/utils/adjustOffsetForRTL.d.ts.map +1 -0
  116. package/dist/recyclerview/utils/adjustOffsetForRTL.js +18 -0
  117. package/dist/recyclerview/utils/adjustOffsetForRTL.js.map +1 -0
  118. package/dist/recyclerview/utils/componentUtils.d.ts +19 -0
  119. package/dist/recyclerview/utils/componentUtils.d.ts.map +1 -0
  120. package/dist/recyclerview/utils/componentUtils.js +32 -0
  121. package/dist/recyclerview/utils/componentUtils.js.map +1 -0
  122. package/dist/recyclerview/utils/findVisibleIndex.d.ts +24 -0
  123. package/dist/recyclerview/utils/findVisibleIndex.d.ts.map +1 -0
  124. package/dist/recyclerview/utils/findVisibleIndex.js +82 -0
  125. package/dist/recyclerview/utils/findVisibleIndex.js.map +1 -0
  126. package/dist/recyclerview/utils/measureLayout.d.ts +56 -0
  127. package/dist/recyclerview/utils/measureLayout.d.ts.map +1 -0
  128. package/dist/recyclerview/utils/measureLayout.js +77 -0
  129. package/dist/recyclerview/utils/measureLayout.js.map +1 -0
  130. package/dist/tsconfig.tsbuildinfo +1 -1
  131. package/dist/utils/AverageWindow.d.ts +13 -0
  132. package/dist/utils/AverageWindow.d.ts.map +1 -1
  133. package/dist/utils/AverageWindow.js +30 -1
  134. package/dist/utils/AverageWindow.js.map +1 -1
  135. package/package.json +1 -1
  136. package/src/FlashListProps.ts +73 -2
  137. package/src/__tests__/AverageWindow.test.ts +49 -1
  138. package/src/enableNewCore.ts +22 -0
  139. package/src/index.ts +21 -0
  140. package/src/recyclerview/RecycleKeyManager.ts +185 -0
  141. package/src/recyclerview/RecyclerView.tsx +500 -0
  142. package/src/recyclerview/RecyclerViewContextProvider.ts +19 -0
  143. package/src/recyclerview/RecyclerViewManager.ts +379 -0
  144. package/src/recyclerview/RecyclerViewProps.ts +10 -0
  145. package/src/recyclerview/ViewHolder.tsx +173 -0
  146. package/src/recyclerview/ViewHolderCollection.tsx +164 -0
  147. package/src/recyclerview/components/CompatScroller.ts +9 -0
  148. package/src/recyclerview/components/CompatView.ts +9 -0
  149. package/src/recyclerview/components/ScrollAnchor.tsx +53 -0
  150. package/src/recyclerview/components/StickyHeaders.tsx +210 -0
  151. package/src/recyclerview/helpers/ConsecutiveNumbers.ts +120 -0
  152. package/src/recyclerview/helpers/EngagedIndicesTracker.ts +191 -0
  153. package/src/recyclerview/hooks/useBoundDetection.ts +127 -0
  154. package/src/recyclerview/hooks/useLayoutState.ts +46 -0
  155. package/src/recyclerview/hooks/useOnLoad.ts +78 -0
  156. package/src/recyclerview/hooks/useRecyclerViewController.tsx +487 -0
  157. package/src/recyclerview/hooks/useRecyclerViewManager.ts +30 -0
  158. package/src/recyclerview/hooks/useRecyclingState.ts +63 -0
  159. package/src/recyclerview/hooks/useSecondaryProps.tsx +119 -0
  160. package/src/recyclerview/hooks/useUnmountFlag.ts +26 -0
  161. package/src/recyclerview/layout-managers/GridLayoutManager.ts +215 -0
  162. package/src/recyclerview/layout-managers/LayoutManager.ts +493 -0
  163. package/src/recyclerview/layout-managers/LinearLayoutManager.ts +167 -0
  164. package/src/recyclerview/layout-managers/MasonryLayoutManager.ts +302 -0
  165. package/src/recyclerview/utils/adjustOffsetForRTL.ts +17 -0
  166. package/src/recyclerview/utils/componentUtils.ts +28 -0
  167. package/src/recyclerview/utils/findVisibleIndex.ts +94 -0
  168. package/src/recyclerview/utils/measureLayout.ts +89 -0
  169. package/src/utils/AverageWindow.ts +33 -0
  170. package/src/viewability/ViewToken.ts +1 -1
@@ -0,0 +1,138 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RVEngagedIndicesTrackerImpl = void 0;
4
+ var ConsecutiveNumbers_1 = require("./ConsecutiveNumbers");
5
+ var RVEngagedIndicesTrackerImpl = /** @class */ (function () {
6
+ function RVEngagedIndicesTrackerImpl() {
7
+ // Current scroll position of the list
8
+ this.scrollOffset = 0;
9
+ // Distance to pre-render items before and after the visible viewport (in pixels)
10
+ this.drawDistance = 250;
11
+ // Currently rendered item indices (including buffer items)
12
+ this.engagedIndices = ConsecutiveNumbers_1.ConsecutiveNumbers.EMPTY;
13
+ // Buffer distribution multipliers for scroll direction optimization
14
+ this.smallMultiplier = 0.1; // Used for buffer in the opposite direction of scroll
15
+ this.largeMultiplier = 0.9; // Used for buffer in the direction of scroll
16
+ // Circular buffer to track recent scroll velocities for direction detection
17
+ this.velocityHistory = [-1, -1, -1, -1, -1];
18
+ this.velocityIndex = 0;
19
+ }
20
+ /**
21
+ * Updates scroll position and determines which items should be rendered.
22
+ * Implements a smart buffer system that:
23
+ * 1. Calculates the visible viewport
24
+ * 2. Determines optimal buffer distribution based on scroll direction
25
+ * 3. Adjusts buffer sizes at list boundaries
26
+ * 4. Returns new indices that need to be rendered
27
+ */
28
+ RVEngagedIndicesTrackerImpl.prototype.updateScrollOffset = function (offset, velocity, layoutManager) {
29
+ // Update current scroll position
30
+ this.scrollOffset = offset;
31
+ // STEP 1: Determine the currently visible viewport
32
+ var windowSize = layoutManager.getWindowsSize();
33
+ var isHorizontal = layoutManager.isHorizontal();
34
+ var viewportStart = offset;
35
+ var viewportSize = isHorizontal ? windowSize.width : windowSize.height;
36
+ var viewportEnd = viewportStart + viewportSize;
37
+ // STEP 2: Determine buffer size and distribution
38
+ // The total extra space where items will be pre-rendered
39
+ var totalBuffer = this.drawDistance * 2;
40
+ // Determine scroll direction to optimize buffer distribution
41
+ var isScrollingBackward = this.isScrollingBackward(isHorizontal ? velocity === null || velocity === void 0 ? void 0 : velocity.x : velocity === null || velocity === void 0 ? void 0 : velocity.y);
42
+ // Distribute more buffer in the direction of scrolling
43
+ // When scrolling forward: more buffer after viewport
44
+ // When scrolling backward: more buffer before viewport
45
+ var beforeRatio = isScrollingBackward
46
+ ? this.largeMultiplier
47
+ : this.smallMultiplier;
48
+ var afterRatio = isScrollingBackward
49
+ ? this.smallMultiplier
50
+ : this.largeMultiplier;
51
+ var bufferBefore = Math.ceil(totalBuffer * beforeRatio);
52
+ var bufferAfter = Math.ceil(totalBuffer * afterRatio);
53
+ // STEP 3: Calculate the extended viewport (visible area + buffers)
54
+ // The start position with buffer (never less than 0)
55
+ var extendedStart = Math.max(0, viewportStart - bufferBefore);
56
+ // If we couldn't apply full buffer at start, calculate how much was unused
57
+ var unusedStartBuffer = Math.max(0, bufferBefore - viewportStart);
58
+ // Add any unused start buffer to the end buffer
59
+ var extendedEnd = viewportEnd + bufferAfter + unusedStartBuffer;
60
+ // STEP 4: Handle end boundary adjustments
61
+ // Get the total content size to check for end boundary
62
+ var layoutSize = layoutManager.getLayoutSize();
63
+ var maxPosition = isHorizontal ? layoutSize.width : layoutSize.height;
64
+ // If we hit the end boundary, redistribute unused buffer to the start
65
+ if (extendedEnd > maxPosition) {
66
+ // Calculate unused end buffer and apply it to the start if possible
67
+ var unusedEndBuffer = extendedEnd - maxPosition;
68
+ extendedEnd = maxPosition;
69
+ // Try to extend start position further with the unused end buffer
70
+ extendedStart = Math.max(0, extendedStart - unusedEndBuffer);
71
+ }
72
+ // STEP 5: Get and return the new engaged indices
73
+ var newEngagedIndices = layoutManager.getVisibleLayouts(extendedStart, extendedEnd);
74
+ if (!isHorizontal) {
75
+ //console.log("newEngagedIndices", newEngagedIndices, this.scrollOffset);
76
+ }
77
+ // Only return new indices if they've changed
78
+ var oldEngagedIndices = this.engagedIndices;
79
+ this.engagedIndices = newEngagedIndices;
80
+ return newEngagedIndices.equals(oldEngagedIndices)
81
+ ? undefined
82
+ : newEngagedIndices;
83
+ };
84
+ /**
85
+ * Determines scroll direction by analyzing recent velocity history.
86
+ * Uses a majority voting system on the last 5 velocity values.
87
+ * @param velocity - Current scroll velocity component (x or y)
88
+ * @returns true if scrolling backward (negative direction), false otherwise
89
+ */
90
+ RVEngagedIndicesTrackerImpl.prototype.isScrollingBackward = function (velocity) {
91
+ //update velocity history
92
+ if (velocity) {
93
+ this.velocityHistory[this.velocityIndex] = velocity;
94
+ this.velocityIndex =
95
+ (this.velocityIndex + 1) % this.velocityHistory.length;
96
+ }
97
+ //should decide based on whether we have more positive or negative values, use for loop
98
+ var positiveCount = 0;
99
+ var negativeCount = 0;
100
+ for (var i = 0; i < this.velocityHistory.length; i++) {
101
+ if (this.velocityHistory[i] > 0) {
102
+ positiveCount++;
103
+ }
104
+ else if (this.velocityHistory[i] < 0) {
105
+ negativeCount++;
106
+ }
107
+ }
108
+ return positiveCount < negativeCount;
109
+ };
110
+ /**
111
+ * Calculates which items are currently visible in the viewport.
112
+ * Unlike getEngagedIndices, this doesn't include buffer items.
113
+ * @param layoutManager - Layout manager to fetch item positions
114
+ * @returns Indices of items currently visible in the viewport
115
+ */
116
+ RVEngagedIndicesTrackerImpl.prototype.computeVisibleIndices = function (layoutManager) {
117
+ var windowSize = layoutManager.getWindowsSize();
118
+ var isHorizontal = layoutManager.isHorizontal();
119
+ // Calculate viewport boundaries
120
+ var viewportStart = this.scrollOffset;
121
+ var viewportSize = isHorizontal ? windowSize.width : windowSize.height;
122
+ var viewportEnd = viewportStart + viewportSize;
123
+ // Get indices of items currently visible in the viewport
124
+ var newVisibleIndices = layoutManager.getVisibleLayouts(viewportStart, viewportEnd);
125
+ return newVisibleIndices;
126
+ };
127
+ /**
128
+ * Returns the currently engaged (rendered) indices.
129
+ * This includes both visible items and buffer items.
130
+ * @returns The last computed set of engaged indices
131
+ */
132
+ RVEngagedIndicesTrackerImpl.prototype.getEngagedIndices = function () {
133
+ return this.engagedIndices;
134
+ };
135
+ return RVEngagedIndicesTrackerImpl;
136
+ }());
137
+ exports.RVEngagedIndicesTrackerImpl = RVEngagedIndicesTrackerImpl;
138
+ //# sourceMappingURL=EngagedIndicesTracker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EngagedIndicesTracker.js","sourceRoot":"","sources":["../../../src/recyclerview/helpers/EngagedIndicesTracker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /// <reference types="react" />
2
+ import { RecyclerViewManager } from "../RecyclerViewManager";
3
+ import { RecyclerViewProps } from "../RecyclerViewProps";
4
+ import { CompatScroller } from "../components/CompatScroller";
5
+ /**
6
+ * Hook to detect when the scroll position reaches near the start or end of the list
7
+ * and trigger the appropriate callbacks. This hook is responsible for:
8
+ * 1. Detecting when the user scrolls near the end of the list (onEndReached)
9
+ * 2. Detecting when the user scrolls near the start of the list (onStartReached)
10
+ * 3. Managing auto-scrolling to bottom when new content is added
11
+ *
12
+ * @param recyclerViewManager - The RecyclerViewManager instance that handles the list's core functionality
13
+ * @param props - The RecyclerViewProps containing configuration and callbacks
14
+ * @param scrollViewRef - Reference to the scrollable container component
15
+ */
16
+ export declare function useBoundDetection<T>(recyclerViewManager: RecyclerViewManager<T>, props: RecyclerViewProps<T>, scrollViewRef: React.RefObject<CompatScroller>): {
17
+ checkBounds: () => void;
18
+ };
19
+ //# sourceMappingURL=useBoundDetection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useBoundDetection.d.ts","sourceRoot":"","sources":["../../../src/recyclerview/hooks/useBoundDetection.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAE9D;;;;;;;;;;GAUG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,EACjC,mBAAmB,EAAE,mBAAmB,CAAC,CAAC,CAAC,EAC3C,KAAK,EAAE,iBAAiB,CAAC,CAAC,CAAC,EAC3B,aAAa,EAAE,KAAK,CAAC,SAAS,CAAC,cAAc,CAAC;;EA0G/C"}
@@ -0,0 +1,103 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.useBoundDetection = void 0;
4
+ var react_1 = require("react");
5
+ var react_2 = require("react");
6
+ /**
7
+ * Hook to detect when the scroll position reaches near the start or end of the list
8
+ * and trigger the appropriate callbacks. This hook is responsible for:
9
+ * 1. Detecting when the user scrolls near the end of the list (onEndReached)
10
+ * 2. Detecting when the user scrolls near the start of the list (onStartReached)
11
+ * 3. Managing auto-scrolling to bottom when new content is added
12
+ *
13
+ * @param recyclerViewManager - The RecyclerViewManager instance that handles the list's core functionality
14
+ * @param props - The RecyclerViewProps containing configuration and callbacks
15
+ * @param scrollViewRef - Reference to the scrollable container component
16
+ */
17
+ function useBoundDetection(recyclerViewManager, props, scrollViewRef) {
18
+ // Track whether we've already triggered the end reached callback to prevent duplicate calls
19
+ var pendingEndReached = (0, react_2.useRef)(false);
20
+ // Track whether we've already triggered the start reached callback to prevent duplicate calls
21
+ var pendingStartReached = (0, react_2.useRef)(false);
22
+ // Track whether we should auto-scroll to bottom when new content is added
23
+ var pendingAutoscrollToBottom = (0, react_2.useRef)(false);
24
+ var horizontal = props.horizontal, data = props.data, maintainVisibleContentPosition = props.maintainVisibleContentPosition;
25
+ /**
26
+ * Checks if the scroll position is near the start or end of the list
27
+ * and triggers appropriate callbacks if configured.
28
+ */
29
+ var checkBounds = (0, react_1.useCallback)(function () {
30
+ var _a, _b, _c;
31
+ // Skip all calculations if neither callback is provided and autoscroll is disabled
32
+ var autoscrollToBottomThreshold = (_a = maintainVisibleContentPosition === null || maintainVisibleContentPosition === void 0 ? void 0 : maintainVisibleContentPosition.autoscrollToBottomThreshold) !== null && _a !== void 0 ? _a : -1;
33
+ if (!props.onEndReached &&
34
+ !props.onStartReached &&
35
+ autoscrollToBottomThreshold < 0) {
36
+ return;
37
+ }
38
+ if (recyclerViewManager.getIsFirstLayoutComplete()) {
39
+ var lastScrollOffset = recyclerViewManager.getAbsoluteLastScrollOffset();
40
+ var contentSize = recyclerViewManager.getChildContainerDimensions();
41
+ var windowSize = recyclerViewManager.getWindowSize();
42
+ var isHorizontal = props.horizontal === true;
43
+ // Calculate dimensions based on scroll direction
44
+ var visibleLength = isHorizontal ? windowSize.width : windowSize.height;
45
+ var contentLength = (isHorizontal ? contentSize.width : contentSize.height) +
46
+ recyclerViewManager.firstItemOffset;
47
+ // Check if we're near the end of the list
48
+ if (props.onEndReached) {
49
+ var onEndReachedThreshold = (_b = props.onEndReachedThreshold) !== null && _b !== void 0 ? _b : 0.5;
50
+ var endThresholdDistance = onEndReachedThreshold * visibleLength;
51
+ var isNearEnd = Math.ceil(lastScrollOffset + visibleLength) >=
52
+ contentLength - endThresholdDistance;
53
+ if (isNearEnd && !pendingEndReached.current) {
54
+ pendingEndReached.current = true;
55
+ props.onEndReached();
56
+ }
57
+ pendingEndReached.current = isNearEnd;
58
+ }
59
+ // Check if we're near the start of the list
60
+ if (props.onStartReached) {
61
+ var onStartReachedThreshold = (_c = props.onStartReachedThreshold) !== null && _c !== void 0 ? _c : 0.2;
62
+ var startThresholdDistance = onStartReachedThreshold * visibleLength;
63
+ var isNearStart = lastScrollOffset <= startThresholdDistance;
64
+ if (isNearStart && !pendingStartReached.current) {
65
+ pendingStartReached.current = true;
66
+ props.onStartReached();
67
+ }
68
+ pendingStartReached.current = isNearStart;
69
+ }
70
+ // Handle auto-scrolling to bottom for vertical lists
71
+ if (!horizontal) {
72
+ var autoscrollToBottomThresholdDistance = autoscrollToBottomThreshold * visibleLength;
73
+ var isNearBottom = Math.ceil(lastScrollOffset + visibleLength) >=
74
+ contentLength - autoscrollToBottomThresholdDistance;
75
+ if (isNearBottom) {
76
+ pendingAutoscrollToBottom.current = true;
77
+ }
78
+ else {
79
+ pendingAutoscrollToBottom.current = false;
80
+ }
81
+ }
82
+ }
83
+ }, [recyclerViewManager, props]);
84
+ // Reset end reached state when data changes
85
+ (0, react_1.useMemo)(function () {
86
+ pendingEndReached.current = false;
87
+ }, [data]);
88
+ // Auto-scroll to bottom when new content is added and we're near the bottom
89
+ (0, react_1.useEffect)(function () {
90
+ if (pendingAutoscrollToBottom.current) {
91
+ requestAnimationFrame(function () {
92
+ var _a;
93
+ (_a = scrollViewRef.current) === null || _a === void 0 ? void 0 : _a.scrollToEnd();
94
+ pendingAutoscrollToBottom.current = false;
95
+ });
96
+ }
97
+ }, [data]);
98
+ return {
99
+ checkBounds: checkBounds,
100
+ };
101
+ }
102
+ exports.useBoundDetection = useBoundDetection;
103
+ //# sourceMappingURL=useBoundDetection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useBoundDetection.js","sourceRoot":"","sources":["../../../src/recyclerview/hooks/useBoundDetection.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Custom hook that combines state management with RecyclerView layout updates.
3
+ * This hook provides a way to manage state that affects the layout of the RecyclerView,
4
+ * ensuring that any state changes trigger a layout recalculation.
5
+ *
6
+ * @param initialState - The initial state value or a function that returns the initial state
7
+ * @returns A tuple containing:
8
+ * - The current state value
9
+ * - A setter function that updates the state and triggers a layout recalculation
10
+ */
11
+ export declare function useLayoutState<T>(initialState: T | (() => T)): [T, (newValue: T | ((prevValue: T) => T)) => void];
12
+ //# sourceMappingURL=useLayoutState.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useLayoutState.d.ts","sourceRoot":"","sources":["../../../src/recyclerview/hooks/useLayoutState.ts"],"names":[],"mappings":"AAIA;;;;;;;;;GASG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAC9B,YAAY,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,GAC1B,CAAC,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,IAAI,CAAC,CA6BpD"}
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.useLayoutState = void 0;
4
+ var tslib_1 = require("tslib");
5
+ var react_1 = require("react");
6
+ var RecyclerViewContextProvider_1 = require("../RecyclerViewContextProvider");
7
+ /**
8
+ * Custom hook that combines state management with RecyclerView layout updates.
9
+ * This hook provides a way to manage state that affects the layout of the RecyclerView,
10
+ * ensuring that any state changes trigger a layout recalculation.
11
+ *
12
+ * @param initialState - The initial state value or a function that returns the initial state
13
+ * @returns A tuple containing:
14
+ * - The current state value
15
+ * - A setter function that updates the state and triggers a layout recalculation
16
+ */
17
+ function useLayoutState(initialState) {
18
+ // Initialize state with the provided initial value
19
+ var _a = tslib_1.__read((0, react_1.useState)(initialState), 2), state = _a[0], setState = _a[1];
20
+ // Get the RecyclerView context for layout management
21
+ var recyclerViewContext = (0, RecyclerViewContextProvider_1.useRecyclerViewContext)();
22
+ /**
23
+ * Setter function that updates the state and triggers a layout recalculation.
24
+ * This ensures that any state changes that affect the layout are properly reflected
25
+ * in the RecyclerView's visual representation.
26
+ *
27
+ * @param newValue - Either a new state value or a function that receives the previous state
28
+ * and returns the new state
29
+ */
30
+ var setLayoutState = (0, react_1.useCallback)(function (newValue) {
31
+ // Update the state using either the new value or the result of the updater function
32
+ setState(function (prevValue) {
33
+ return typeof newValue === "function"
34
+ ? newValue(prevValue)
35
+ : newValue;
36
+ });
37
+ // Trigger a layout recalculation in the RecyclerView
38
+ recyclerViewContext === null || recyclerViewContext === void 0 ? void 0 : recyclerViewContext.layout();
39
+ }, [recyclerViewContext]);
40
+ return [state, setLayoutState];
41
+ }
42
+ exports.useLayoutState = useLayoutState;
43
+ //# sourceMappingURL=useLayoutState.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useLayoutState.js","sourceRoot":"","sources":["../../../src/recyclerview/hooks/useLayoutState.ts"],"names":[],"mappings":";;;;AAAA,+BAA8C;AAE9C,8EAAwE;AAExE;;;;;;;;;GASG;AACH,SAAgB,cAAc,CAC5B,YAA2B;IAE3B,mDAAmD;IAC7C,IAAA,KAAA,eAAoB,IAAA,gBAAQ,EAAI,YAAY,CAAC,IAAA,EAA5C,KAAK,QAAA,EAAE,QAAQ,QAA6B,CAAC;IACpD,qDAAqD;IACrD,IAAM,mBAAmB,GAAG,IAAA,oDAAsB,GAAE,CAAC;IAErD;;;;;;;OAOG;IACH,IAAM,cAAc,GAAG,IAAA,mBAAW,EAChC,UAAC,QAAmC;QAClC,oFAAoF;QACpF,QAAQ,CAAC,UAAC,SAAS;YACjB,OAAA,OAAO,QAAQ,KAAK,UAAU;gBAC5B,CAAC,CAAE,QAAgC,CAAC,SAAS,CAAC;gBAC9C,CAAC,CAAC,QAAQ;QAFZ,CAEY,CACb,CAAC;QACF,qDAAqD;QACrD,mBAAmB,aAAnB,mBAAmB,uBAAnB,mBAAmB,CAAE,MAAM,EAAE,CAAC;IAChC,CAAC,EACD,CAAC,mBAAmB,CAAC,CACtB,CAAC;IAEF,OAAO,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC;AACjC,CAAC;AA/BD,wCA+BC"}
@@ -0,0 +1,25 @@
1
+ import { RecyclerViewManager } from "../RecyclerViewManager";
2
+ /**
3
+ * Hook to track when the RecyclerView has loaded its items and notify when loading is complete.
4
+ * Similar to FlashList's onLoad functionality, this hook tracks the time it takes to render
5
+ * the initial set of items in the RecyclerView and provides performance metrics.
6
+ *
7
+ * @param recyclerViewManager - The RecyclerViewManager instance managing the list
8
+ * @param onLoad - Optional callback function that will be called when the list has loaded with timing information
9
+ * @returns Object containing isLoaded state indicating whether the list has completed initial rendering
10
+ */
11
+ export declare const useOnListLoad: <T>(recyclerViewManager: RecyclerViewManager<T>, onLoad?: ((info: {
12
+ elapsedTimeInMs: number;
13
+ }) => void) | undefined) => {
14
+ isLoaded: boolean;
15
+ };
16
+ /**
17
+ * Core hook that detects when a RecyclerView has completed its initial layout.
18
+ * This hook monitors the RecyclerViewManager and triggers the provided callback
19
+ * once the first layout is complete.
20
+ *
21
+ * @param recyclerViewManager - The RecyclerViewManager instance to monitor
22
+ * @param onLoad - Callback function that will be called once when the first layout is complete
23
+ */
24
+ export declare const useOnLoad: <T>(recyclerViewManager: RecyclerViewManager<T>, onLoad: () => void) => void;
25
+ //# sourceMappingURL=useOnLoad.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useOnLoad.d.ts","sourceRoot":"","sources":["../../../src/recyclerview/hooks/useOnLoad.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAI7D;;;;;;;;GAQG;AACH,eAAO,MAAM,aAAa,oEAER;IAAE,eAAe,EAAE,MAAM,CAAA;CAAE,KAAK,IAAI;cACvC,OAAO;CAsCrB,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,SAAS,2DAEZ,MAAM,IAAI,SAUnB,CAAC"}
@@ -0,0 +1,73 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.useOnLoad = exports.useOnListLoad = void 0;
4
+ var tslib_1 = require("tslib");
5
+ var react_1 = require("react");
6
+ var useUnmountFlag_1 = require("./useUnmountFlag");
7
+ //import { ToastAndroid } from "react-native";
8
+ /**
9
+ * Hook to track when the RecyclerView has loaded its items and notify when loading is complete.
10
+ * Similar to FlashList's onLoad functionality, this hook tracks the time it takes to render
11
+ * the initial set of items in the RecyclerView and provides performance metrics.
12
+ *
13
+ * @param recyclerViewManager - The RecyclerViewManager instance managing the list
14
+ * @param onLoad - Optional callback function that will be called when the list has loaded with timing information
15
+ * @returns Object containing isLoaded state indicating whether the list has completed initial rendering
16
+ */
17
+ var useOnListLoad = function (recyclerViewManager, onLoad) {
18
+ var loadStartTimeRef = (0, react_1.useRef)(Date.now());
19
+ var _a = tslib_1.__read((0, react_1.useState)(false), 2), isLoaded = _a[0], setIsLoaded = _a[1];
20
+ var dataLength = recyclerViewManager.getDataLength();
21
+ //const dataCollector = useRef<number[]>([]);
22
+ var isUnmounted = (0, useUnmountFlag_1.useUnmountFlag)();
23
+ // Track render cycles by collecting elapsed time on each render
24
+ // useEffect(() => {
25
+ // const elapsedTimeInMs = Date.now() - loadStartTimeRef.current;
26
+ // dataCollector.current?.push(elapsedTimeInMs);
27
+ // });
28
+ (0, react_1.useMemo)(function () {
29
+ loadStartTimeRef.current = Date.now();
30
+ }, [dataLength]);
31
+ (0, exports.useOnLoad)(recyclerViewManager, function () {
32
+ var elapsedTimeInMs = Date.now() - loadStartTimeRef.current;
33
+ // Commented code below was used for debugging purposes
34
+ // to display all collected timing data points
35
+ // const dataCollectorString = dataCollector.current
36
+ // ?.map((value) => value.toString())
37
+ // .join(", ");
38
+ // ToastAndroid?.show(
39
+ // `onLoad called after ${dataCollectorString}`,
40
+ // ToastAndroid.SHORT
41
+ // );
42
+ //console.log("----------> dataCollector", dataCollectorString);
43
+ //console.log("----------> elapsedTimeInMs", elapsedTimeInMs);
44
+ requestAnimationFrame(function () {
45
+ if (!isUnmounted.current) {
46
+ onLoad === null || onLoad === void 0 ? void 0 : onLoad({ elapsedTimeInMs: elapsedTimeInMs });
47
+ setIsLoaded(true);
48
+ }
49
+ });
50
+ });
51
+ return { isLoaded: isLoaded };
52
+ };
53
+ exports.useOnListLoad = useOnListLoad;
54
+ /**
55
+ * Core hook that detects when a RecyclerView has completed its initial layout.
56
+ * This hook monitors the RecyclerViewManager and triggers the provided callback
57
+ * once the first layout is complete.
58
+ *
59
+ * @param recyclerViewManager - The RecyclerViewManager instance to monitor
60
+ * @param onLoad - Callback function that will be called once when the first layout is complete
61
+ */
62
+ var useOnLoad = function (recyclerViewManager, onLoad) {
63
+ var isLoaded = (0, react_1.useRef)(false);
64
+ (0, react_1.useEffect)(function () {
65
+ // Only trigger onLoad callback once when first layout is complete
66
+ if (recyclerViewManager.getIsFirstLayoutComplete() && !isLoaded.current) {
67
+ isLoaded.current = true;
68
+ onLoad();
69
+ }
70
+ });
71
+ };
72
+ exports.useOnLoad = useOnLoad;
73
+ //# sourceMappingURL=useOnLoad.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useOnLoad.js","sourceRoot":"","sources":["../../../src/recyclerview/hooks/useOnLoad.ts"],"names":[],"mappings":";;;;AAAA,+BAA6D;AAE7D,mDAAkD;AAClD,8CAA8C;AAE9C;;;;;;;;GAQG;AACI,IAAM,aAAa,GAAG,UAC3B,mBAA2C,EAC3C,MAAoD;IAEpD,IAAM,gBAAgB,GAAG,IAAA,cAAM,EAAS,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IAC9C,IAAA,KAAA,eAA0B,IAAA,gBAAQ,EAAU,KAAK,CAAC,IAAA,EAAjD,QAAQ,QAAA,EAAE,WAAW,QAA4B,CAAC;IACzD,IAAM,UAAU,GAAG,mBAAmB,CAAC,aAAa,EAAE,CAAC;IACvD,6CAA6C;IAC7C,IAAM,WAAW,GAAG,IAAA,+BAAc,GAAE,CAAC;IACrC,gEAAgE;IAChE,oBAAoB;IACpB,mEAAmE;IACnE,kDAAkD;IAClD,MAAM;IAEN,IAAA,eAAO,EAAC;QACN,gBAAgB,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACxC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC;IAEjB,IAAA,iBAAS,EAAC,mBAAmB,EAAE;QAC7B,IAAM,eAAe,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,gBAAgB,CAAC,OAAO,CAAC;QAC9D,uDAAuD;QACvD,8CAA8C;QAC9C,oDAAoD;QACpD,uCAAuC;QACvC,iBAAiB;QACjB,sBAAsB;QACtB,kDAAkD;QAClD,uBAAuB;QACvB,KAAK;QACL,gEAAgE;QAChE,8DAA8D;QAC9D,qBAAqB,CAAC;YACpB,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE;gBACxB,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAG,EAAE,eAAe,iBAAA,EAAE,CAAC,CAAC;gBAC9B,WAAW,CAAC,IAAI,CAAC,CAAC;aACnB;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,OAAO,EAAE,QAAQ,UAAA,EAAE,CAAC;AACtB,CAAC,CAAC;AAzCW,QAAA,aAAa,iBAyCxB;AAEF;;;;;;;GAOG;AACI,IAAM,SAAS,GAAG,UACvB,mBAA2C,EAC3C,MAAkB;IAElB,IAAM,QAAQ,GAAG,IAAA,cAAM,EAAU,KAAK,CAAC,CAAC;IACxC,IAAA,iBAAS,EAAC;QACR,kEAAkE;QAClE,IAAI,mBAAmB,CAAC,wBAAwB,EAAE,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE;YACvE,QAAQ,CAAC,OAAO,GAAG,IAAI,CAAC;YACxB,MAAM,EAAE,CAAC;SACV;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AAZW,QAAA,SAAS,aAYpB"}
@@ -0,0 +1,72 @@
1
+ import { RefObject } from "react";
2
+ import { RecyclerViewProps } from "../RecyclerViewProps";
3
+ import { CompatScroller } from "../components/CompatScroller";
4
+ import { RecyclerViewManager } from "../RecyclerViewManager";
5
+ import { ScrollAnchorRef } from "../components/ScrollAnchor";
6
+ /**
7
+ * Parameters for scrolling to a specific position in the list.
8
+ * Extends ScrollToEdgeParams to include view positioning options.
9
+ */
10
+ export interface ScrollToParams extends ScrollToEdgeParams {
11
+ /** Position of the target item relative to the viewport (0 = top, 0.5 = center, 1 = bottom) */
12
+ viewPosition?: number;
13
+ /** Additional offset to apply after viewPosition calculation */
14
+ viewOffset?: number;
15
+ }
16
+ /**
17
+ * Parameters for scrolling to a specific offset in the list.
18
+ * Used when you want to scroll to an exact pixel position.
19
+ */
20
+ export interface ScrollToOffsetParams extends ScrollToParams {
21
+ /** The pixel offset to scroll to */
22
+ offset: number;
23
+ /**
24
+ * If true, the first item offset will not be added to the offset calculation.
25
+ * First offset represents header size or top padding.
26
+ */
27
+ skipFirstItemOffset?: boolean;
28
+ }
29
+ /**
30
+ * Parameters for scrolling to a specific index in the list.
31
+ * Used when you want to scroll to a specific item by its position in the data array.
32
+ */
33
+ export interface ScrollToIndexParams extends ScrollToParams {
34
+ /** The index of the item to scroll to */
35
+ index: number;
36
+ }
37
+ /**
38
+ * Parameters for scrolling to a specific item in the list.
39
+ * Used when you want to scroll to a specific item by its data value.
40
+ */
41
+ export interface ScrollToItemParams<T> extends ScrollToParams {
42
+ /** The item to scroll to */
43
+ item: T;
44
+ }
45
+ /**
46
+ * Base parameters for scrolling to the edges of the list.
47
+ */
48
+ export interface ScrollToEdgeParams {
49
+ /** Whether the scroll should be animated */
50
+ animated?: boolean;
51
+ }
52
+ /**
53
+ * Comprehensive hook that manages RecyclerView scrolling behavior and provides
54
+ * imperative methods for controlling the RecyclerView.
55
+ *
56
+ * This hook combines content offset management and scroll handling functionality:
57
+ * 1. Provides imperative methods for scrolling and measurement
58
+ * 2. Handles initial scroll position when the list first loads
59
+ * 3. Maintains visible content position during updates
60
+ * 4. Manages scroll anchors for chat-like applications
61
+ *
62
+ * @param recyclerViewManager - The RecyclerViewManager instance that handles core functionality
63
+ * @param ref - The ref to expose the imperative methods
64
+ * @param scrollViewRef - Reference to the scrollable container component
65
+ * @param scrollAnchorRef - Reference to the scroll anchor component
66
+ * @param props - The RecyclerViewProps containing configuration
67
+ */
68
+ export declare function useRecyclerViewController<T>(recyclerViewManager: RecyclerViewManager<T>, ref: React.Ref<any>, scrollViewRef: RefObject<CompatScroller>, scrollAnchorRef: React.RefObject<ScrollAnchorRef>, props: RecyclerViewProps<T>): {
69
+ applyContentOffset: () => Promise<void>;
70
+ applyInitialScrollIndex: () => void;
71
+ };
72
+ //# sourceMappingURL=useRecyclerViewController.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useRecyclerViewController.d.ts","sourceRoot":"","sources":["../../../src/recyclerview/hooks/useRecyclerViewController.tsx"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,EAMV,MAAM,OAAO,CAAC;AAEf,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAC9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAI7D,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAE7D;;;GAGG;AACH,MAAM,WAAW,cAAe,SAAQ,kBAAkB;IACxD,+FAA+F;IAC/F,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gEAAgE;IAChE,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;GAGG;AACH,MAAM,WAAW,oBAAqB,SAAQ,cAAc;IAC1D,oCAAoC;IACpC,MAAM,EAAE,MAAM,CAAC;IACf;;;OAGG;IACH,mBAAmB,CAAC,EAAE,OAAO,CAAC;CAC/B;AAED;;;GAGG;AACH,MAAM,WAAW,mBAAoB,SAAQ,cAAc;IACzD,yCAAyC;IACzC,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;GAGG;AACH,MAAM,WAAW,kBAAkB,CAAC,CAAC,CAAE,SAAQ,cAAc;IAC3D,4BAA4B;IAC5B,IAAI,EAAE,CAAC,CAAC;CACT;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,4CAA4C;IAC5C,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,yBAAyB,CAAC,CAAC,EACzC,mBAAmB,EAAE,mBAAmB,CAAC,CAAC,CAAC,EAC3C,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EACnB,aAAa,EAAE,SAAS,CAAC,cAAc,CAAC,EACxC,eAAe,EAAE,KAAK,CAAC,SAAS,CAAC,eAAe,CAAC,EACjD,KAAK,EAAE,iBAAiB,CAAC,CAAC,CAAC;;;EA6Y5B"}