react-native-divkit 1.6.5 → 1.8.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 (97) hide show
  1. package/README.md +18 -15
  2. package/dist/DivKit.d.ts.map +1 -1
  3. package/dist/DivKit.js +115 -4
  4. package/dist/DivKit.js.map +1 -1
  5. package/dist/components/DivComponent.d.ts.map +1 -1
  6. package/dist/components/DivComponent.js +6 -2
  7. package/dist/components/DivComponent.js.map +1 -1
  8. package/dist/components/index.d.ts +4 -0
  9. package/dist/components/index.d.ts.map +1 -1
  10. package/dist/components/index.js +2 -0
  11. package/dist/components/index.js.map +1 -1
  12. package/dist/components/indicator/DivIndicator.d.ts +19 -0
  13. package/dist/components/indicator/DivIndicator.d.ts.map +1 -0
  14. package/dist/components/indicator/DivIndicator.js +112 -0
  15. package/dist/components/indicator/DivIndicator.js.map +1 -0
  16. package/dist/components/indicator/index.d.ts +3 -0
  17. package/dist/components/indicator/index.d.ts.map +1 -0
  18. package/dist/components/indicator/index.js +2 -0
  19. package/dist/components/indicator/index.js.map +1 -0
  20. package/dist/components/indicator/utils.d.ts +61 -0
  21. package/dist/components/indicator/utils.d.ts.map +1 -0
  22. package/dist/components/indicator/utils.js +104 -0
  23. package/dist/components/indicator/utils.js.map +1 -0
  24. package/dist/components/pager/DivPager.d.ts +22 -0
  25. package/dist/components/pager/DivPager.d.ts.map +1 -0
  26. package/dist/components/pager/DivPager.js +269 -0
  27. package/dist/components/pager/DivPager.js.map +1 -0
  28. package/dist/components/pager/index.d.ts +3 -0
  29. package/dist/components/pager/index.d.ts.map +1 -0
  30. package/dist/components/pager/index.js +2 -0
  31. package/dist/components/pager/index.js.map +1 -0
  32. package/dist/components/pager/utils.d.ts +96 -0
  33. package/dist/components/pager/utils.d.ts.map +1 -0
  34. package/dist/components/pager/utils.js +142 -0
  35. package/dist/components/pager/utils.js.map +1 -0
  36. package/dist/components/state/DivState.d.ts +11 -12
  37. package/dist/components/state/DivState.d.ts.map +1 -1
  38. package/dist/components/state/DivState.js +263 -35
  39. package/dist/components/state/DivState.js.map +1 -1
  40. package/dist/components/utilities/Background.d.ts.map +1 -1
  41. package/dist/components/utilities/Background.js +4 -3
  42. package/dist/components/utilities/Background.js.map +1 -1
  43. package/dist/components/utilities/Outer.d.ts.map +1 -1
  44. package/dist/components/utilities/Outer.js +175 -78
  45. package/dist/components/utilities/Outer.js.map +1 -1
  46. package/dist/context/DivStateScopeContext.d.ts +18 -0
  47. package/dist/context/DivStateScopeContext.d.ts.map +1 -0
  48. package/dist/context/DivStateScopeContext.js +7 -0
  49. package/dist/context/DivStateScopeContext.js.map +1 -0
  50. package/dist/context/PagerContext.d.ts +30 -0
  51. package/dist/context/PagerContext.d.ts.map +1 -0
  52. package/dist/context/PagerContext.js +76 -0
  53. package/dist/context/PagerContext.js.map +1 -0
  54. package/dist/context/index.d.ts +1 -0
  55. package/dist/context/index.d.ts.map +1 -1
  56. package/dist/context/index.js +1 -0
  57. package/dist/context/index.js.map +1 -1
  58. package/dist/hooks/useAppearanceTransition.d.ts +86 -0
  59. package/dist/hooks/useAppearanceTransition.d.ts.map +1 -0
  60. package/dist/hooks/useAppearanceTransition.js +490 -0
  61. package/dist/hooks/useAppearanceTransition.js.map +1 -0
  62. package/dist/hooks/useChangeBoundsTransition.d.ts +46 -0
  63. package/dist/hooks/useChangeBoundsTransition.d.ts.map +1 -0
  64. package/dist/hooks/useChangeBoundsTransition.js +151 -0
  65. package/dist/hooks/useChangeBoundsTransition.js.map +1 -0
  66. package/dist/utils/configureChangeBoundsLayout.d.ts +11 -0
  67. package/dist/utils/configureChangeBoundsLayout.d.ts.map +1 -0
  68. package/dist/utils/configureChangeBoundsLayout.js +65 -0
  69. package/dist/utils/configureChangeBoundsLayout.js.map +1 -0
  70. package/dist/utils/flattenTransition.d.ts +5 -0
  71. package/dist/utils/flattenTransition.d.ts.map +1 -0
  72. package/dist/utils/flattenTransition.js +27 -0
  73. package/dist/utils/flattenTransition.js.map +1 -0
  74. package/package.json +3 -1
  75. package/src/DivKit.tsx +131 -5
  76. package/src/components/DivComponent.tsx +8 -2
  77. package/src/components/README.md +59 -5
  78. package/src/components/index.ts +4 -0
  79. package/src/components/indicator/DivIndicator.tsx +175 -0
  80. package/src/components/indicator/index.ts +2 -0
  81. package/src/components/indicator/utils.ts +149 -0
  82. package/src/components/pager/DivPager.tsx +393 -0
  83. package/src/components/pager/index.ts +2 -0
  84. package/src/components/pager/utils.ts +214 -0
  85. package/src/components/state/DivState.tsx +308 -39
  86. package/src/components/utilities/Background.tsx +4 -3
  87. package/src/components/utilities/Outer.tsx +192 -75
  88. package/src/context/DivStateScopeContext.tsx +23 -0
  89. package/src/context/PagerContext.tsx +108 -0
  90. package/src/context/index.ts +8 -0
  91. package/src/hooks/useAppearanceTransition.ts +621 -0
  92. package/src/hooks/useChangeBoundsTransition.ts +193 -0
  93. package/src/types/indicator.d.ts +32 -0
  94. package/src/types/pager.d.ts +36 -0
  95. package/src/types/shape.d.ts +26 -0
  96. package/src/utils/configureChangeBoundsLayout.ts +74 -0
  97. package/src/utils/flattenTransition.ts +36 -0
@@ -0,0 +1,104 @@
1
+ /**
2
+ * Pure helpers for DivIndicator. Extracted for unit testing.
3
+ */
4
+ import { correctColor } from '../../utils/correctColor';
5
+ export const DEFAULT_ACTIVE = {
6
+ width: 13,
7
+ height: 13,
8
+ borderRadius: 6.5,
9
+ background: '#ffdc60'
10
+ };
11
+ export const DEFAULT_INACTIVE = {
12
+ width: 10,
13
+ height: 10,
14
+ borderRadius: 5,
15
+ background: '#33919cb5'
16
+ };
17
+ /**
18
+ * Convert a Shape (rounded_rectangle | circle) into a DotStyle.
19
+ * Falls back to `base` when the shape is missing or unsupported.
20
+ */
21
+ export function shapeToDot(shape, fallbackColor, base) {
22
+ if (!shape)
23
+ return base;
24
+ const s = shape;
25
+ if (s.type === 'rounded_rectangle') {
26
+ const w = s.item_width?.value ?? base.width;
27
+ const h = s.item_height?.value ?? base.height;
28
+ const r = s.corner_radius?.value ?? Math.min(w, h) / 2;
29
+ return {
30
+ width: w,
31
+ height: h,
32
+ borderRadius: r,
33
+ background: correctColor(s.background_color, 1, fallbackColor)
34
+ };
35
+ }
36
+ if (s.type === 'circle') {
37
+ const r = s.radius?.value ?? base.width / 2;
38
+ return {
39
+ width: r * 2,
40
+ height: r * 2,
41
+ borderRadius: r,
42
+ background: correctColor(s.background_color, 1, fallbackColor)
43
+ };
44
+ }
45
+ return base;
46
+ }
47
+ /**
48
+ * Compute final active/inactive dot styles. Mirrors Indicator.svelte:
49
+ * - explicit active_shape/inactive_shape take precedence
50
+ * - else legacy `shape` + `active_item_size` + colors generates both
51
+ * - else defaults
52
+ */
53
+ export function buildDotStyles(args) {
54
+ const { activeShape, inactiveShape, legacyShape, activeColor, inactiveColor, activeItemSize } = args;
55
+ let inactive = { ...DEFAULT_INACTIVE };
56
+ let active = { ...DEFAULT_ACTIVE };
57
+ if (activeShape) {
58
+ active = shapeToDot(activeShape, active.background, active);
59
+ }
60
+ if (inactiveShape) {
61
+ inactive = shapeToDot(inactiveShape, inactive.background, inactive);
62
+ }
63
+ if (!activeShape && !inactiveShape && legacyShape) {
64
+ const sizeMul = typeof activeItemSize === 'number' && activeItemSize > 0 ? activeItemSize : 1.3;
65
+ inactive = shapeToDot(legacyShape, inactive.background, inactive);
66
+ inactive.background = correctColor(inactiveColor, 1, inactive.background);
67
+ const activeBg = correctColor(activeColor, 1, active.background);
68
+ active = {
69
+ width: inactive.width * sizeMul,
70
+ height: inactive.height * sizeMul,
71
+ borderRadius: inactive.borderRadius * sizeMul,
72
+ background: activeBg
73
+ };
74
+ }
75
+ return { active, inactive };
76
+ }
77
+ /**
78
+ * Resolve which placement mode to use and the spacing parameters.
79
+ * - stretch: equal spacing across the full width, item_spacing px between dots.
80
+ * - default: gap = space_between_centers - inactiveWidth.
81
+ */
82
+ export function resolvePlacement(args) {
83
+ const { itemsPlacement, spaceBetweenCenters, inactiveWidth } = args;
84
+ if (itemsPlacement && itemsPlacement.type === 'stretch') {
85
+ return {
86
+ placement: 'stretch',
87
+ gap: 0,
88
+ stretchSpacing: itemsPlacement.item_spacing?.value ?? 5,
89
+ maxVisible: itemsPlacement.max_visible_items ?? 10
90
+ };
91
+ }
92
+ let center = spaceBetweenCenters?.value;
93
+ if (itemsPlacement && itemsPlacement.type === 'default') {
94
+ center = itemsPlacement.space_between_centers?.value ?? center;
95
+ }
96
+ const c = typeof center === 'number' && center >= 0 ? center : 15;
97
+ return {
98
+ placement: 'default',
99
+ gap: Math.max(0, c - inactiveWidth),
100
+ stretchSpacing: 0,
101
+ maxVisible: 10
102
+ };
103
+ }
104
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/components/indicator/utils.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import React from 'react';
2
+ import type { ComponentContext } from '../../types/componentContext';
3
+ import type { DivPagerData } from '../../types/pager';
4
+ export interface DivPagerProps {
5
+ componentContext: ComponentContext<DivPagerData>;
6
+ }
7
+ /**
8
+ * DivPager — horizontal/vertical pager with snap-to-page scrolling.
9
+ *
10
+ * Based on Web Pager.svelte. Adapted for React Native:
11
+ * - Uses ScrollView with snapToInterval for paging behaviour.
12
+ * - Computes per-page size from layout_mode (fixed neighbour, percentage,
13
+ * wrap_content) once container size is known.
14
+ * - infinite_scroll: renders DUPLICATES extra items at each end; when the user
15
+ * lands on a duplicate the scroll position is silently snapped to the
16
+ * matching real item (no animation), giving a seamless loop.
17
+ * - Exposes its current page/size to indicators via PagerContext using the
18
+ * same registerPager/listenPager contract as Web. The "currentItem" reported
19
+ * to indicators is always the real index in [0, items.length).
20
+ */
21
+ export declare function DivPager({ componentContext }: DivPagerProps): React.JSX.Element | null;
22
+ //# sourceMappingURL=DivPager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DivPager.d.ts","sourceRoot":"","sources":["../../../src/components/pager/DivPager.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA4D,MAAM,OAAO,CAAC;AASjF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AACrE,OAAO,KAAK,EAAE,YAAY,EAAoB,MAAM,mBAAmB,CAAC;AAsBxE,MAAM,WAAW,aAAa;IAC1B,gBAAgB,EAAE,gBAAgB,CAAC,YAAY,CAAC,CAAC;CACpD;AAID;;;;;;;;;;;;;GAaG;AACH,wBAAgB,QAAQ,CAAC,EAAE,gBAAgB,EAAE,EAAE,aAAa,4BA0U3D"}
@@ -0,0 +1,269 @@
1
+ import React, { useEffect, useMemo, useRef, useState, useCallback } from 'react';
2
+ import { View, ScrollView, StyleSheet } from 'react-native';
3
+ import { Outer } from '../utilities/Outer';
4
+ import { DivComponent } from '../DivComponent';
5
+ import { useDerivedFromVarsSimple } from '../../hooks/useDerivedFromVars';
6
+ import { useDivKitContext } from '../../context/DivKitContext';
7
+ import { usePagerContextOptional } from '../../context/PagerContext';
8
+ import { wrapError } from '../../utils/wrapError';
9
+ import { DUPLICATES_IN_INFINITE, buildRenderedItems, computeContentPad, computePageSize, isInDuplicateRegion as isInDuplicateRegionFn, isInfiniteEnabled, offsetToPosition, positionToReal as positionToRealFn, realToPosition as realToPositionFn } from './utils';
10
+ const DUPLICATES = DUPLICATES_IN_INFINITE;
11
+ /**
12
+ * DivPager — horizontal/vertical pager with snap-to-page scrolling.
13
+ *
14
+ * Based on Web Pager.svelte. Adapted for React Native:
15
+ * - Uses ScrollView with snapToInterval for paging behaviour.
16
+ * - Computes per-page size from layout_mode (fixed neighbour, percentage,
17
+ * wrap_content) once container size is known.
18
+ * - infinite_scroll: renders DUPLICATES extra items at each end; when the user
19
+ * lands on a duplicate the scroll position is silently snapped to the
20
+ * matching real item (no animation), giving a seamless loop.
21
+ * - Exposes its current page/size to indicators via PagerContext using the
22
+ * same registerPager/listenPager contract as Web. The "currentItem" reported
23
+ * to indicators is always the real index in [0, items.length).
24
+ */
25
+ export function DivPager({ componentContext }) {
26
+ const { genId } = useDivKitContext();
27
+ const pagerCtx = usePagerContextOptional();
28
+ const { json, variables } = componentContext;
29
+ const orientation = useDerivedFromVarsSimple(json.orientation || 'horizontal', variables || new Map());
30
+ const layoutMode = useDerivedFromVarsSimple(json.layout_mode, variables || new Map());
31
+ const itemSpacingObj = useDerivedFromVarsSimple(json.item_spacing, variables || new Map());
32
+ const paddings = useDerivedFromVarsSimple(json.paddings, variables || new Map());
33
+ const scrollAxisAlignment = useDerivedFromVarsSimple(json.scroll_axis_alignment || 'center', variables || new Map());
34
+ const defaultItem = useDerivedFromVarsSimple(typeof json.default_item === 'number' ? json.default_item : 0, variables || new Map());
35
+ const infiniteScroll = useDerivedFromVarsSimple(json.infinite_scroll, variables || new Map());
36
+ const isHorizontal = orientation !== 'vertical';
37
+ const itemSpacing = itemSpacingObj?.value ?? 0;
38
+ const items = useMemo(() => {
39
+ return Array.isArray(json.items) ? json.items : [];
40
+ }, [json.items]);
41
+ const isInfinite = useMemo(() => isInfiniteEnabled(infiniteScroll, items.length), [infiniteScroll, items.length]);
42
+ // Pager paddings — applied on the inner ScrollView so we can also use them
43
+ // for snap math. Outer should NOT also apply them, so we strip them from
44
+ // the json passed into Outer below.
45
+ const innerPadStart = useMemo(() => {
46
+ const p = paddings || {};
47
+ if (isHorizontal) {
48
+ return Number(p.start ?? p.left ?? 0) || 0;
49
+ }
50
+ return Number(p.top ?? 0) || 0;
51
+ }, [paddings, isHorizontal]);
52
+ const innerPadEnd = useMemo(() => {
53
+ const p = paddings || {};
54
+ if (isHorizontal) {
55
+ return Number(p.end ?? p.right ?? 0) || 0;
56
+ }
57
+ return Number(p.bottom ?? 0) || 0;
58
+ }, [paddings, isHorizontal]);
59
+ const [containerSize, setContainerSize] = useState(0);
60
+ const scrollRef = useRef(null);
61
+ const currentItemRef = useRef(0); // real index, always in [0, items.length)
62
+ const initialScrollDone = useRef(false);
63
+ const registerDataRef = useRef(null);
64
+ const pagerInstId = useRef(genId('pager'));
65
+ const scrollToItemRef = useRef(null);
66
+ const pageSize = useMemo(() => computePageSize({
67
+ containerSize,
68
+ layoutMode,
69
+ scrollAxisAlignment: scrollAxisAlignment,
70
+ itemSpacing,
71
+ innerPadStart,
72
+ innerPadEnd
73
+ }), [containerSize, innerPadStart, innerPadEnd, layoutMode, scrollAxisAlignment, itemSpacing]);
74
+ const snapInterval = pageSize > 0 ? pageSize + itemSpacing : 0;
75
+ const contentPad = useMemo(() => computeContentPad({
76
+ containerSize,
77
+ pageSize,
78
+ innerPadStart,
79
+ innerPadEnd,
80
+ layoutMode,
81
+ scrollAxisAlignment: scrollAxisAlignment,
82
+ itemSpacing,
83
+ isInfinite
84
+ }), [
85
+ containerSize,
86
+ pageSize,
87
+ innerPadStart,
88
+ innerPadEnd,
89
+ layoutMode,
90
+ scrollAxisAlignment,
91
+ itemSpacing,
92
+ isInfinite
93
+ ]);
94
+ const realToPosition = useCallback((realIdx) => realToPositionFn(realIdx, isInfinite, DUPLICATES), [isInfinite]);
95
+ const positionToReal = useCallback((pos) => positionToRealFn(pos, isInfinite, items.length, DUPLICATES), [isInfinite, items.length]);
96
+ const isInDuplicateRegion = useCallback((pos) => isInDuplicateRegionFn(pos, isInfinite, items.length, DUPLICATES), [isInfinite, items.length]);
97
+ const runSelectedActions = useCallback((index) => {
98
+ const item = items[index];
99
+ const actions = item?.selected_actions;
100
+ if (Array.isArray(actions) && actions.length > 0) {
101
+ componentContext.execAnyActions(actions);
102
+ }
103
+ }, [items, componentContext]);
104
+ const pushPagerState = useCallback((item) => {
105
+ const reg = registerDataRef.current;
106
+ if (!reg)
107
+ return;
108
+ const data = {
109
+ instId: pagerInstId.current,
110
+ size: items.length,
111
+ currentItem: item,
112
+ scrollToPagerItem: (index) => scrollToItemRef.current?.(index, true)
113
+ };
114
+ reg.update(data);
115
+ }, [items.length]);
116
+ const scrollToItem = useCallback((realIndex, animated) => {
117
+ const node = scrollRef.current;
118
+ if (!node || snapInterval <= 0 || items.length === 0)
119
+ return;
120
+ const clampedReal = isInfinite
121
+ ? ((realIndex % items.length) + items.length) % items.length
122
+ : Math.max(0, Math.min(items.length - 1, realIndex));
123
+ const pos = realToPosition(clampedReal);
124
+ const offset = pos * snapInterval;
125
+ if (isHorizontal) {
126
+ node.scrollTo({ x: offset, y: 0, animated });
127
+ }
128
+ else {
129
+ node.scrollTo({ x: 0, y: offset, animated });
130
+ }
131
+ if (clampedReal !== currentItemRef.current) {
132
+ currentItemRef.current = clampedReal;
133
+ pushPagerState(clampedReal);
134
+ runSelectedActions(clampedReal);
135
+ }
136
+ }, [
137
+ items.length,
138
+ snapInterval,
139
+ isHorizontal,
140
+ isInfinite,
141
+ realToPosition,
142
+ pushPagerState,
143
+ runSelectedActions
144
+ ]);
145
+ useEffect(() => {
146
+ scrollToItemRef.current = scrollToItem;
147
+ }, [scrollToItem]);
148
+ // Register pager in context (so indicators can find it)
149
+ useEffect(() => {
150
+ if (!pagerCtx)
151
+ return;
152
+ const pagerId = json.id;
153
+ const reg = pagerCtx.registerPager(pagerId);
154
+ registerDataRef.current = reg;
155
+ pushPagerState(currentItemRef.current);
156
+ return () => {
157
+ reg.destroy();
158
+ registerDataRef.current = null;
159
+ };
160
+ }, [pagerCtx, json.id, pushPagerState]);
161
+ // Re-broadcast on items length / scrollToItem changes
162
+ useEffect(() => {
163
+ pushPagerState(currentItemRef.current);
164
+ }, [pushPagerState]);
165
+ // Initial scroll to default_item once we know page size
166
+ useEffect(() => {
167
+ if (initialScrollDone.current)
168
+ return;
169
+ if (snapInterval <= 0)
170
+ return;
171
+ const initial = Math.max(0, Math.min(items.length - 1, defaultItem ?? 0));
172
+ currentItemRef.current = initial;
173
+ const id = setTimeout(() => {
174
+ scrollToItem(initial, false);
175
+ initialScrollDone.current = true;
176
+ pushPagerState(initial);
177
+ }, 0);
178
+ return () => clearTimeout(id);
179
+ }, [snapInterval, defaultItem, items.length, scrollToItem, pushPagerState]);
180
+ const onScrollEnd = useCallback((event) => {
181
+ if (snapInterval <= 0)
182
+ return;
183
+ const { contentOffset } = event.nativeEvent;
184
+ const offset = isHorizontal ? contentOffset.x : contentOffset.y;
185
+ const pos = offsetToPosition(offset, snapInterval);
186
+ const realIdx = positionToReal(pos);
187
+ // In infinite mode: silently snap from a duplicate back to the
188
+ // matching real item without animation.
189
+ if (isInfinite && isInDuplicateRegion(pos)) {
190
+ const realPos = realToPosition(realIdx);
191
+ const node = scrollRef.current;
192
+ if (node) {
193
+ const realOffset = realPos * snapInterval;
194
+ if (isHorizontal) {
195
+ node.scrollTo({ x: realOffset, y: 0, animated: false });
196
+ }
197
+ else {
198
+ node.scrollTo({ x: 0, y: realOffset, animated: false });
199
+ }
200
+ }
201
+ }
202
+ if (realIdx !== currentItemRef.current) {
203
+ currentItemRef.current = realIdx;
204
+ pushPagerState(realIdx);
205
+ runSelectedActions(realIdx);
206
+ }
207
+ }, [
208
+ snapInterval,
209
+ isHorizontal,
210
+ positionToReal,
211
+ isInDuplicateRegion,
212
+ isInfinite,
213
+ realToPosition,
214
+ pushPagerState,
215
+ runSelectedActions
216
+ ]);
217
+ const onLayout = useCallback((e) => {
218
+ const size = isHorizontal ? e.nativeEvent.layout.width : e.nativeEvent.layout.height;
219
+ if (size && Math.abs(size - containerSize) > 0.5) {
220
+ setContainerSize(size);
221
+ }
222
+ }, [containerSize, isHorizontal]);
223
+ // Strip paddings from Outer — we apply them on the ScrollView ourselves.
224
+ const outerContext = useMemo(() => {
225
+ const restJson = { ...json };
226
+ delete restJson.paddings;
227
+ return { ...componentContext, json: restJson };
228
+ }, [componentContext, json]);
229
+ const renderedItems = useMemo(() => buildRenderedItems(items, isInfinite, DUPLICATES), [items, isInfinite]);
230
+ if (!json.layout_mode) {
231
+ componentContext.logError(wrapError(new Error('Empty "layout_mode" prop for div "pager"')));
232
+ return null;
233
+ }
234
+ const renderItems = () => {
235
+ if (!renderedItems.length || pageSize <= 0)
236
+ return null;
237
+ return renderedItems.map((entry, posIndex) => {
238
+ const childContext = componentContext.produceChildContext(entry.item, {
239
+ path: posIndex
240
+ });
241
+ const isLast = posIndex === renderedItems.length - 1;
242
+ const itemStyle = isHorizontal
243
+ ? { width: pageSize, marginRight: isLast ? 0 : itemSpacing }
244
+ : { height: pageSize, marginBottom: isLast ? 0 : itemSpacing };
245
+ return (<View key={entry.key} style={[styles.itemWrapper, itemStyle]}>
246
+ <DivComponent componentContext={childContext}/>
247
+ </View>);
248
+ });
249
+ };
250
+ return (<Outer componentContext={outerContext}>
251
+ <View style={styles.fill} onLayout={onLayout}>
252
+ {pageSize > 0 ? (<ScrollView ref={scrollRef} horizontal={isHorizontal} showsHorizontalScrollIndicator={false} showsVerticalScrollIndicator={false} decelerationRate="fast" snapToInterval={snapInterval} snapToAlignment="start" disableIntervalMomentum onMomentumScrollEnd={onScrollEnd} onScrollEndDrag={onScrollEnd} scrollEventThrottle={16} contentContainerStyle={isHorizontal
253
+ ? { paddingLeft: contentPad.start, paddingRight: contentPad.end }
254
+ : { paddingTop: contentPad.start, paddingBottom: contentPad.end }} style={styles.fill}>
255
+ {renderItems()}
256
+ </ScrollView>) : null}
257
+ </View>
258
+ </Outer>);
259
+ }
260
+ const styles = StyleSheet.create({
261
+ fill: {
262
+ flex: 1,
263
+ alignSelf: 'stretch'
264
+ },
265
+ itemWrapper: {
266
+ overflow: 'hidden'
267
+ }
268
+ });
269
+ //# sourceMappingURL=DivPager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DivPager.js","sourceRoot":"","sources":["../../../src/components/pager/DivPager.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export { DivPager } from './DivPager';
2
+ export type { DivPagerProps } from './DivPager';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/pager/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { DivPager } from './DivPager';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/pager/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,96 @@
1
+ /**
2
+ * Pure helpers for DivPager. Extracted so they can be unit-tested without
3
+ * having to render the React tree.
4
+ */
5
+ export type ScrollAxisAlignment = 'start' | 'center' | 'end';
6
+ export interface LayoutModeFixed {
7
+ type: 'fixed';
8
+ neighbour_page_width?: {
9
+ value?: number;
10
+ };
11
+ }
12
+ export interface LayoutModePercentage {
13
+ type: 'percentage';
14
+ page_width?: {
15
+ value?: number;
16
+ };
17
+ }
18
+ export interface LayoutModeWrap {
19
+ type: 'wrap_content';
20
+ }
21
+ export type AnyLayoutMode = LayoutModeFixed | LayoutModePercentage | LayoutModeWrap | {
22
+ type?: string;
23
+ [k: string]: unknown;
24
+ } | null | undefined;
25
+ export interface ComputePageSizeArgs {
26
+ containerSize: number;
27
+ layoutMode: AnyLayoutMode;
28
+ scrollAxisAlignment: ScrollAxisAlignment;
29
+ itemSpacing: number;
30
+ innerPadStart: number;
31
+ innerPadEnd: number;
32
+ }
33
+ /**
34
+ * Compute the size of a single page along the main axis. Mirrors the Web
35
+ * Pager.svelte autoSizeVal calculation:
36
+ * - fixed + center: containerSize − 2·neighbour − 2·spacing
37
+ * - fixed + start/end: containerSize − neighbour − spacing
38
+ * - percentage: containerSize · page_width / 100
39
+ * - wrap_content / unknown: usable area (containerSize − paddings)
40
+ */
41
+ export declare function computePageSize(args: ComputePageSizeArgs): number;
42
+ export interface ComputeContentPadArgs extends ComputePageSizeArgs {
43
+ pageSize: number;
44
+ isInfinite: boolean;
45
+ }
46
+ /**
47
+ * Compute the contentContainer paddings the inner ScrollView needs so that the
48
+ * first/last items snap to the right visual position (centre/start/end). In
49
+ * infinite mode the duplicates take that role and we use zero padding.
50
+ */
51
+ export declare function computeContentPad(args: ComputeContentPadArgs): {
52
+ start: number;
53
+ end: number;
54
+ };
55
+ export declare const DUPLICATES_IN_INFINITE = 2;
56
+ /**
57
+ * Map a "real" item index (0..size-1) to its rendered position.
58
+ * In infinite mode the real items live in [DUPLICATES, DUPLICATES + size).
59
+ */
60
+ export declare function realToPosition(realIdx: number, isInfinite: boolean, duplicates?: number): number;
61
+ /**
62
+ * Map a rendered position back to the real index. Wraps modulo `size` when
63
+ * the position lands inside the duplicate region.
64
+ */
65
+ export declare function positionToReal(pos: number, isInfinite: boolean, size: number, duplicates?: number): number;
66
+ /**
67
+ * True when `pos` corresponds to one of the duplicate entries (only meaningful
68
+ * in infinite mode).
69
+ */
70
+ export declare function isInDuplicateRegion(pos: number, isInfinite: boolean, size: number, duplicates?: number): boolean;
71
+ export interface RenderedItemEntry<T> {
72
+ item: T;
73
+ realIndex: number;
74
+ key: string;
75
+ }
76
+ /**
77
+ * Build the list of items to render. In infinite mode this prefixes the array
78
+ * with `duplicates` copies of the last items and suffixes it with `duplicates`
79
+ * copies of the first items, so the user can swipe past either edge and land
80
+ * on something visually identical to the wrap-around target.
81
+ */
82
+ export declare function buildRenderedItems<T extends {
83
+ id?: string;
84
+ }>(items: T[], isInfinite: boolean, duplicates?: number): RenderedItemEntry<T>[];
85
+ /**
86
+ * Decide whether infinite_scroll should actually be active.
87
+ * Mirrors Web's correctBooleanInt + the `items.length >= DUPLICATES_IN_INFINITE`
88
+ * gate.
89
+ */
90
+ export declare function isInfiniteEnabled(infiniteValue: unknown, itemsLength: number): boolean;
91
+ /**
92
+ * Convert a scroll offset (in px) into a snap position (rounded). Returns 0
93
+ * when snapInterval <= 0.
94
+ */
95
+ export declare function offsetToPosition(offset: number, snapInterval: number): number;
96
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/components/pager/utils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,MAAM,mBAAmB,GAAG,OAAO,GAAG,QAAQ,GAAG,KAAK,CAAC;AAE7D,MAAM,WAAW,eAAe;IAC5B,IAAI,EAAE,OAAO,CAAC;IACd,oBAAoB,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAC7C;AACD,MAAM,WAAW,oBAAoB;IACjC,IAAI,EAAE,YAAY,CAAC;IACnB,UAAU,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CACnC;AACD,MAAM,WAAW,cAAc;IAC3B,IAAI,EAAE,cAAc,CAAC;CACxB;AACD,MAAM,MAAM,aAAa,GACnB,eAAe,GACf,oBAAoB,GACpB,cAAc,GACd;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,GACvC,IAAI,GACJ,SAAS,CAAC;AAEhB,MAAM,WAAW,mBAAmB;IAChC,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,aAAa,CAAC;IAC1B,mBAAmB,EAAE,mBAAmB,CAAC;IACzC,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;CACvB;AAED;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,mBAAmB,GAAG,MAAM,CAoBjE;AAED,MAAM,WAAW,qBAAsB,SAAQ,mBAAmB;IAC9D,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,OAAO,CAAC;CACvB;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,qBAAqB,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAiC7F;AAED,eAAO,MAAM,sBAAsB,IAAI,CAAC;AAExC;;;GAGG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,UAAU,SAAyB,GAAG,MAAM,CAEhH;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAC1B,GAAG,EAAE,MAAM,EACX,UAAU,EAAE,OAAO,EACnB,IAAI,EAAE,MAAM,EACZ,UAAU,SAAyB,GACpC,MAAM,CAOR;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAC/B,GAAG,EAAE,MAAM,EACX,UAAU,EAAE,OAAO,EACnB,IAAI,EAAE,MAAM,EACZ,UAAU,SAAyB,GACpC,OAAO,CAGT;AAED,MAAM,WAAW,iBAAiB,CAAC,CAAC;IAChC,IAAI,EAAE,CAAC,CAAC;IACR,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;CACf;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,SAAS;IAAE,EAAE,CAAC,EAAE,MAAM,CAAA;CAAE,EACxD,KAAK,EAAE,CAAC,EAAE,EACV,UAAU,EAAE,OAAO,EACnB,UAAU,SAAyB,GACpC,iBAAiB,CAAC,CAAC,CAAC,EAAE,CAsBxB;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,aAAa,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAOtF;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,CAG7E"}