react-native-collapsible-sticky-header 0.0.0-stage → 0.1.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 (103) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +569 -2
  3. package/lib/commonjs/Badge.js +65 -0
  4. package/lib/commonjs/Badge.js.map +1 -0
  5. package/lib/commonjs/CollapsibleStickyHeaderScreen.js +386 -0
  6. package/lib/commonjs/CollapsibleStickyHeaderScreen.js.map +1 -0
  7. package/lib/commonjs/HeaderGreeting.js +122 -0
  8. package/lib/commonjs/HeaderGreeting.js.map +1 -0
  9. package/lib/commonjs/HeaderNavBar.js +219 -0
  10. package/lib/commonjs/HeaderNavBar.js.map +1 -0
  11. package/lib/commonjs/ImageOrNode.js +40 -0
  12. package/lib/commonjs/ImageOrNode.js.map +1 -0
  13. package/lib/commonjs/animations.js +34 -0
  14. package/lib/commonjs/animations.js.map +1 -0
  15. package/lib/commonjs/index.js +122 -0
  16. package/lib/commonjs/index.js.map +1 -0
  17. package/lib/commonjs/optionalGradient.js +24 -0
  18. package/lib/commonjs/optionalGradient.js.map +1 -0
  19. package/lib/commonjs/package.json +1 -0
  20. package/lib/commonjs/theme.js +93 -0
  21. package/lib/commonjs/theme.js.map +1 -0
  22. package/lib/commonjs/types.js +6 -0
  23. package/lib/commonjs/types.js.map +1 -0
  24. package/lib/commonjs/useStickyHeader.js +143 -0
  25. package/lib/commonjs/useStickyHeader.js.map +1 -0
  26. package/lib/commonjs/utils.js +90 -0
  27. package/lib/commonjs/utils.js.map +1 -0
  28. package/lib/module/Badge.js +61 -0
  29. package/lib/module/Badge.js.map +1 -0
  30. package/lib/module/CollapsibleStickyHeaderScreen.js +379 -0
  31. package/lib/module/CollapsibleStickyHeaderScreen.js.map +1 -0
  32. package/lib/module/HeaderGreeting.js +118 -0
  33. package/lib/module/HeaderGreeting.js.map +1 -0
  34. package/lib/module/HeaderNavBar.js +215 -0
  35. package/lib/module/HeaderNavBar.js.map +1 -0
  36. package/lib/module/ImageOrNode.js +36 -0
  37. package/lib/module/ImageOrNode.js.map +1 -0
  38. package/lib/module/animations.js +28 -0
  39. package/lib/module/animations.js.map +1 -0
  40. package/lib/module/index.js +11 -0
  41. package/lib/module/index.js.map +1 -0
  42. package/lib/module/optionalGradient.js +20 -0
  43. package/lib/module/optionalGradient.js.map +1 -0
  44. package/lib/module/package.json +1 -0
  45. package/lib/module/theme.js +88 -0
  46. package/lib/module/theme.js.map +1 -0
  47. package/lib/module/types.js +4 -0
  48. package/lib/module/types.js.map +1 -0
  49. package/lib/module/useStickyHeader.js +138 -0
  50. package/lib/module/useStickyHeader.js.map +1 -0
  51. package/lib/module/utils.js +78 -0
  52. package/lib/module/utils.js.map +1 -0
  53. package/lib/typescript/commonjs/package.json +1 -0
  54. package/lib/typescript/commonjs/src/Badge.d.ts +20 -0
  55. package/lib/typescript/commonjs/src/Badge.d.ts.map +1 -0
  56. package/lib/typescript/commonjs/src/CollapsibleStickyHeaderScreen.d.ts +10 -0
  57. package/lib/typescript/commonjs/src/CollapsibleStickyHeaderScreen.d.ts.map +1 -0
  58. package/lib/typescript/commonjs/src/HeaderGreeting.d.ts +33 -0
  59. package/lib/typescript/commonjs/src/HeaderGreeting.d.ts.map +1 -0
  60. package/lib/typescript/commonjs/src/HeaderNavBar.d.ts +48 -0
  61. package/lib/typescript/commonjs/src/HeaderNavBar.d.ts.map +1 -0
  62. package/lib/typescript/commonjs/src/ImageOrNode.d.ts +16 -0
  63. package/lib/typescript/commonjs/src/ImageOrNode.d.ts.map +1 -0
  64. package/lib/typescript/commonjs/src/animations.d.ts +9 -0
  65. package/lib/typescript/commonjs/src/animations.d.ts.map +1 -0
  66. package/lib/typescript/commonjs/src/index.d.ts +10 -0
  67. package/lib/typescript/commonjs/src/index.d.ts.map +1 -0
  68. package/lib/typescript/commonjs/src/optionalGradient.d.ts +13 -0
  69. package/lib/typescript/commonjs/src/optionalGradient.d.ts.map +1 -0
  70. package/lib/typescript/commonjs/src/theme.d.ts +81 -0
  71. package/lib/typescript/commonjs/src/theme.d.ts.map +1 -0
  72. package/lib/typescript/commonjs/src/types.d.ts +244 -0
  73. package/lib/typescript/commonjs/src/types.d.ts.map +1 -0
  74. package/lib/typescript/commonjs/src/useStickyHeader.d.ts +12 -0
  75. package/lib/typescript/commonjs/src/useStickyHeader.d.ts.map +1 -0
  76. package/lib/typescript/commonjs/src/utils.d.ts +30 -0
  77. package/lib/typescript/commonjs/src/utils.d.ts.map +1 -0
  78. package/lib/typescript/module/package.json +1 -0
  79. package/lib/typescript/module/src/Badge.d.ts +20 -0
  80. package/lib/typescript/module/src/Badge.d.ts.map +1 -0
  81. package/lib/typescript/module/src/CollapsibleStickyHeaderScreen.d.ts +10 -0
  82. package/lib/typescript/module/src/CollapsibleStickyHeaderScreen.d.ts.map +1 -0
  83. package/lib/typescript/module/src/HeaderGreeting.d.ts +33 -0
  84. package/lib/typescript/module/src/HeaderGreeting.d.ts.map +1 -0
  85. package/lib/typescript/module/src/HeaderNavBar.d.ts +48 -0
  86. package/lib/typescript/module/src/HeaderNavBar.d.ts.map +1 -0
  87. package/lib/typescript/module/src/ImageOrNode.d.ts +16 -0
  88. package/lib/typescript/module/src/ImageOrNode.d.ts.map +1 -0
  89. package/lib/typescript/module/src/animations.d.ts +9 -0
  90. package/lib/typescript/module/src/animations.d.ts.map +1 -0
  91. package/lib/typescript/module/src/index.d.ts +10 -0
  92. package/lib/typescript/module/src/index.d.ts.map +1 -0
  93. package/lib/typescript/module/src/optionalGradient.d.ts +13 -0
  94. package/lib/typescript/module/src/optionalGradient.d.ts.map +1 -0
  95. package/lib/typescript/module/src/theme.d.ts +81 -0
  96. package/lib/typescript/module/src/theme.d.ts.map +1 -0
  97. package/lib/typescript/module/src/types.d.ts +244 -0
  98. package/lib/typescript/module/src/types.d.ts.map +1 -0
  99. package/lib/typescript/module/src/useStickyHeader.d.ts +12 -0
  100. package/lib/typescript/module/src/useStickyHeader.d.ts.map +1 -0
  101. package/lib/typescript/module/src/utils.d.ts +30 -0
  102. package/lib/typescript/module/src/utils.d.ts.map +1 -0
  103. package/package.json +142 -4
@@ -0,0 +1,143 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.DEFAULT_STICKY_POINTER_OFFSET = exports.DEFAULT_STICKY_FADE_DISTANCE = exports.DEFAULT_COLLAPSE_TRANSLATE_Y = void 0;
7
+ exports.useStickyHeader = useStickyHeader;
8
+ var _react = require("react");
9
+ var _reactNativeReanimated = require("react-native-reanimated");
10
+ var _reactNativeSafeAreaContext = require("react-native-safe-area-context");
11
+ var _utils = require("./utils.js");
12
+ const DEFAULT_STICKY_FADE_DISTANCE = exports.DEFAULT_STICKY_FADE_DISTANCE = 40;
13
+ const DEFAULT_STICKY_POINTER_OFFSET = exports.DEFAULT_STICKY_POINTER_OFFSET = 20;
14
+ const DEFAULT_COLLAPSE_TRANSLATE_Y = exports.DEFAULT_COLLAPSE_TRANSLATE_Y = -12;
15
+
16
+ /**
17
+ * Scroll-driven state for a collapsing header with a sticky bar.
18
+ *
19
+ * All styles are computed on the UI thread. The hook only re-renders when the
20
+ * sticky state flips (and when the nav bar is first measured).
21
+ */
22
+ function useStickyHeader(options = {}) {
23
+ const {
24
+ thresholdOffset = 0,
25
+ stickyFadeDistance = DEFAULT_STICKY_FADE_DISTANCE,
26
+ stickyPointerOffset = DEFAULT_STICKY_POINTER_OFFSET,
27
+ collapseTranslateY = DEFAULT_COLLAPSE_TRANSLATE_Y,
28
+ collapseAnimation,
29
+ stickyAnimation,
30
+ respectSafeArea = true,
31
+ topInset: topInsetOverride,
32
+ reducedMotion: reducedMotionOverride,
33
+ onStickyChange,
34
+ onScroll
35
+ } = options;
36
+ const insets = (0, _reactNativeSafeAreaContext.useSafeAreaInsets)();
37
+ const systemReducedMotion = (0, _reactNativeReanimated.useReducedMotion)();
38
+ const reducedMotion = reducedMotionOverride ?? systemReducedMotion;
39
+ const topInset = respectSafeArea ? topInsetOverride ?? insets.top : 0;
40
+ const scrollY = (0, _reactNativeReanimated.useSharedValue)(0);
41
+ const navBarHeight = (0, _reactNativeReanimated.useSharedValue)(0);
42
+ const threshold = (0, _reactNativeReanimated.useSharedValue)(0);
43
+ const stickySV = (0, _reactNativeReanimated.useSharedValue)(false);
44
+ const [isSticky, setIsSticky] = (0, _react.useState)(false);
45
+ const onStickyChangeRef = (0, _react.useRef)(onStickyChange);
46
+ onStickyChangeRef.current = onStickyChange;
47
+ const onScrollRef = (0, _react.useRef)(onScroll);
48
+ onScrollRef.current = onScroll;
49
+ const hasJsOnScroll = onScroll != null;
50
+ const notifySticky = (0, _react.useCallback)(next => {
51
+ setIsSticky(next);
52
+ onStickyChangeRef.current?.(next);
53
+ }, []);
54
+ const forwardScroll = (0, _react.useCallback)(event => {
55
+ onScrollRef.current?.({
56
+ nativeEvent: event
57
+ });
58
+ }, []);
59
+ const updateScrollY = (0, _react.useCallback)(y => {
60
+ 'worklet';
61
+
62
+ scrollY.value = y;
63
+ const next = (0, _utils.isStickyAt)(y, threshold.value, stickyPointerOffset);
64
+ if (next !== stickySV.value) {
65
+ stickySV.value = next;
66
+ (0, _reactNativeReanimated.runOnJS)(notifySticky)(next);
67
+ }
68
+ }, [scrollY, threshold, stickySV, stickyPointerOffset, notifySticky]);
69
+
70
+ // Re-evaluates the sticky state on the UI thread (where scrollY lives)
71
+ // after the threshold moved without a scroll.
72
+ const resyncSticky = (0, _react.useCallback)(() => {
73
+ 'worklet';
74
+
75
+ updateScrollY(scrollY.value);
76
+ }, [updateScrollY, scrollY]);
77
+
78
+ // The threshold is computed from JS-side numbers: shared value writes from
79
+ // JS are applied asynchronously, so reading them back here would be stale.
80
+ const measuredNavHeight = (0, _react.useRef)(0);
81
+ const syncThreshold = (0, _react.useCallback)(() => {
82
+ threshold.value = (0, _utils.computeThreshold)(measuredNavHeight.current, topInset, thresholdOffset);
83
+ (0, _reactNativeReanimated.runOnUI)(resyncSticky)();
84
+ }, [threshold, topInset, thresholdOffset, resyncSticky]);
85
+ (0, _react.useEffect)(() => {
86
+ syncThreshold();
87
+ }, [syncThreshold]);
88
+ const onNavLayout = (0, _react.useCallback)(event => {
89
+ const height = event.nativeEvent.layout.height;
90
+ if (height === measuredNavHeight.current) return;
91
+ measuredNavHeight.current = height;
92
+ navBarHeight.value = height;
93
+ syncThreshold();
94
+ }, [navBarHeight, syncThreshold]);
95
+
96
+ // No deps array: Reanimated rebuilds the handler from its closure (and v4
97
+ // warns when deps are passed on native).
98
+ const scrollHandler = (0, _reactNativeReanimated.useAnimatedScrollHandler)({
99
+ onScroll: event => {
100
+ updateScrollY(event.contentOffset.y);
101
+ if (hasJsOnScroll) {
102
+ (0, _reactNativeReanimated.runOnJS)(forwardScroll)(event);
103
+ }
104
+ }
105
+ });
106
+ const fadeDistance = reducedMotion ? 0 : stickyFadeDistance;
107
+ const collapseProgress = (0, _reactNativeReanimated.useDerivedValue)(() => (0, _utils.getCollapseProgress)(scrollY.value, threshold.value));
108
+ const stickyProgress = (0, _reactNativeReanimated.useDerivedValue)(() => (0, _utils.getStickyProgress)(scrollY.value, threshold.value, fadeDistance));
109
+ const translateY = reducedMotion ? 0 : collapseTranslateY;
110
+ const collapseStyle = (0, _reactNativeReanimated.useAnimatedStyle)(() => {
111
+ const p = collapseProgress.value;
112
+ if (collapseAnimation) return collapseAnimation(p);
113
+ return {
114
+ opacity: 1 - p,
115
+ transform: [{
116
+ translateY: p * translateY
117
+ }]
118
+ };
119
+ });
120
+ const stickyStyle = (0, _reactNativeReanimated.useAnimatedStyle)(() => {
121
+ const p = stickyProgress.value;
122
+ if (stickyAnimation && !reducedMotion) return stickyAnimation(p);
123
+ return {
124
+ opacity: p
125
+ };
126
+ });
127
+ return {
128
+ scrollHandler: scrollHandler,
129
+ scrollY,
130
+ threshold,
131
+ navBarHeight,
132
+ collapseProgress,
133
+ stickyProgress,
134
+ collapseStyle,
135
+ stickyStyle,
136
+ isSticky,
137
+ onNavLayout,
138
+ updateScrollY,
139
+ topInset,
140
+ reducedMotion
141
+ };
142
+ }
143
+ //# sourceMappingURL=useStickyHeader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_react","require","_reactNativeReanimated","_reactNativeSafeAreaContext","_utils","DEFAULT_STICKY_FADE_DISTANCE","exports","DEFAULT_STICKY_POINTER_OFFSET","DEFAULT_COLLAPSE_TRANSLATE_Y","useStickyHeader","options","thresholdOffset","stickyFadeDistance","stickyPointerOffset","collapseTranslateY","collapseAnimation","stickyAnimation","respectSafeArea","topInset","topInsetOverride","reducedMotion","reducedMotionOverride","onStickyChange","onScroll","insets","useSafeAreaInsets","systemReducedMotion","useReducedMotion","top","scrollY","useSharedValue","navBarHeight","threshold","stickySV","isSticky","setIsSticky","useState","onStickyChangeRef","useRef","current","onScrollRef","hasJsOnScroll","notifySticky","useCallback","next","forwardScroll","event","nativeEvent","updateScrollY","y","value","isStickyAt","runOnJS","resyncSticky","measuredNavHeight","syncThreshold","computeThreshold","runOnUI","useEffect","onNavLayout","height","layout","scrollHandler","useAnimatedScrollHandler","contentOffset","fadeDistance","collapseProgress","useDerivedValue","getCollapseProgress","stickyProgress","getStickyProgress","translateY","collapseStyle","useAnimatedStyle","p","opacity","transform","stickyStyle"],"sourceRoot":"../../src","sources":["useStickyHeader.ts"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,90 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.MAX_HEADER_ACTIONS = exports.DEFAULT_BADGE_MAX = void 0;
7
+ exports.computeThreshold = computeThreshold;
8
+ exports.formatBadgeCount = formatBadgeCount;
9
+ exports.getCollapseProgress = getCollapseProgress;
10
+ exports.getStickyProgress = getStickyProgress;
11
+ exports.isImageSource = isImageSource;
12
+ exports.isStickyAt = isStickyAt;
13
+ exports.limitActions = limitActions;
14
+ exports.warnActionOverflow = warnActionOverflow;
15
+ var _react = require("react");
16
+ /** Counts above this render as `"{max}+"` unless overridden. */
17
+ const DEFAULT_BADGE_MAX = exports.DEFAULT_BADGE_MAX = 9;
18
+
19
+ /** The most icon buttons a header bar renders. */
20
+ const MAX_HEADER_ACTIONS = exports.MAX_HEADER_ACTIONS = 3;
21
+ function clamp01(value) {
22
+ 'worklet';
23
+
24
+ return value < 0 ? 0 : value > 1 ? 1 : value;
25
+ }
26
+
27
+ /**
28
+ * Scroll offset at which the header is considered collapsed:
29
+ * `topInset + navBarHeight + offset`. Returns 0 while the nav bar has not
30
+ * been measured, which keeps the sticky bar hidden.
31
+ */
32
+ function computeThreshold(navBarHeight, topInset, offset = 0) {
33
+ 'worklet';
34
+
35
+ if (!(navBarHeight > 0)) return 0;
36
+ return Math.max(1, topInset + navBarHeight + offset);
37
+ }
38
+
39
+ /** 0 at the top, 1 once `scrollY` reaches the threshold. */
40
+ function getCollapseProgress(scrollY, threshold) {
41
+ 'worklet';
42
+
43
+ if (threshold <= 0) return 0;
44
+ return clamp01(scrollY / threshold);
45
+ }
46
+
47
+ /**
48
+ * 0 before `threshold - fadeDistance`, 1 at the threshold. A fade distance
49
+ * of 0 makes the transition instant.
50
+ */
51
+ function getStickyProgress(scrollY, threshold, fadeDistance) {
52
+ 'worklet';
53
+
54
+ if (threshold <= 0) return 0;
55
+ if (fadeDistance <= 0) return scrollY >= threshold ? 1 : 0;
56
+ return clamp01((scrollY - (threshold - fadeDistance)) / fadeDistance);
57
+ }
58
+
59
+ /** Whether the sticky bar should receive touches / be read by screen readers. */
60
+ function isStickyAt(scrollY, threshold, pointerOffset) {
61
+ 'worklet';
62
+
63
+ return threshold > 0 && scrollY >= threshold - pointerOffset;
64
+ }
65
+ function isImageSource(value) {
66
+ if (typeof value === 'number') return true;
67
+ if (value === null || typeof value !== 'object' || /*#__PURE__*/(0, _react.isValidElement)(value)) {
68
+ return false;
69
+ }
70
+ if (Array.isArray(value)) return value.every(v => isImageSource(v));
71
+ return 'uri' in value || 'testUri' in value;
72
+ }
73
+
74
+ /** Drops hidden actions and keeps the first `MAX_HEADER_ACTIONS`. */
75
+ function limitActions(actions) {
76
+ const visible = (actions ?? []).filter(a => !a.hidden);
77
+ return {
78
+ actions: visible.slice(0, MAX_HEADER_ACTIONS),
79
+ overflow: Math.max(0, visible.length - MAX_HEADER_ACTIONS)
80
+ };
81
+ }
82
+ function warnActionOverflow(overflow) {
83
+ if (__DEV__ && overflow > 0) {
84
+ console.warn(`[react-native-collapsible-sticky-header] ${MAX_HEADER_ACTIONS + overflow} visible actions were passed but at most ${MAX_HEADER_ACTIONS} are rendered. ` + `The last ${overflow} action(s) were dropped.`);
85
+ }
86
+ }
87
+ function formatBadgeCount(count, max) {
88
+ return count > max ? `${max}+` : String(count);
89
+ }
90
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_react","require","DEFAULT_BADGE_MAX","exports","MAX_HEADER_ACTIONS","clamp01","value","computeThreshold","navBarHeight","topInset","offset","Math","max","getCollapseProgress","scrollY","threshold","getStickyProgress","fadeDistance","isStickyAt","pointerOffset","isImageSource","isValidElement","Array","isArray","every","v","limitActions","actions","visible","filter","a","hidden","slice","overflow","length","warnActionOverflow","__DEV__","console","warn","formatBadgeCount","count","String"],"sourceRoot":"../../src","sources":["utils.ts"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,61 @@
1
+ "use strict";
2
+
3
+ import { memo } from 'react';
4
+ import { StyleSheet, Text, View } from 'react-native';
5
+ import { defaultTheme } from "./theme.js";
6
+ import { DEFAULT_BADGE_MAX, formatBadgeCount } from "./utils.js";
7
+ import { jsx as _jsx } from "react/jsx-runtime";
8
+ export const Badge = /*#__PURE__*/memo(function Badge({
9
+ count,
10
+ max = DEFAULT_BADGE_MAX,
11
+ color = defaultTheme.colors.badge,
12
+ textColor = defaultTheme.colors.badgeText,
13
+ borderColor = defaultTheme.colors.badgeBorder,
14
+ borderWidth = 1.5,
15
+ size = defaultTheme.badgeSize,
16
+ showZero = false,
17
+ style,
18
+ textStyle,
19
+ testID = 'sticky-header-badge'
20
+ }) {
21
+ const whole = Math.floor(count);
22
+ if (!Number.isFinite(whole) || whole < 0 || whole === 0 && !showZero) {
23
+ return null;
24
+ }
25
+ return /*#__PURE__*/_jsx(View, {
26
+ testID: testID,
27
+ pointerEvents: "none",
28
+ importantForAccessibility: "no-hide-descendants",
29
+ accessibilityElementsHidden: true,
30
+ style: [styles.badge, {
31
+ backgroundColor: color,
32
+ borderColor,
33
+ borderWidth,
34
+ minWidth: size,
35
+ height: size,
36
+ borderRadius: size / 2
37
+ }, style],
38
+ children: /*#__PURE__*/_jsx(Text, {
39
+ numberOfLines: 1,
40
+ allowFontScaling: false,
41
+ style: [styles.text, {
42
+ color: textColor,
43
+ fontSize: Math.round(size * 0.55)
44
+ }, textStyle],
45
+ children: formatBadgeCount(whole, max)
46
+ })
47
+ });
48
+ });
49
+ const styles = StyleSheet.create({
50
+ badge: {
51
+ alignItems: 'center',
52
+ justifyContent: 'center',
53
+ paddingHorizontal: 4
54
+ },
55
+ text: {
56
+ fontWeight: '700',
57
+ includeFontPadding: false,
58
+ textAlign: 'center'
59
+ }
60
+ });
61
+ //# sourceMappingURL=Badge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["memo","StyleSheet","Text","View","defaultTheme","DEFAULT_BADGE_MAX","formatBadgeCount","jsx","_jsx","Badge","count","max","color","colors","badge","textColor","badgeText","borderColor","badgeBorder","borderWidth","size","badgeSize","showZero","style","textStyle","testID","whole","Math","floor","Number","isFinite","pointerEvents","importantForAccessibility","accessibilityElementsHidden","styles","backgroundColor","minWidth","height","borderRadius","children","numberOfLines","allowFontScaling","text","fontSize","round","create","alignItems","justifyContent","paddingHorizontal","fontWeight","includeFontPadding","textAlign"],"sourceRoot":"../../src","sources":["Badge.tsx"],"mappings":";;AAAA,SAASA,IAAI,QAAQ,OAAO;AAC5B,SACEC,UAAU,EACVC,IAAI,EACJC,IAAI,QAIC,cAAc;AACrB,SAASC,YAAY,QAAQ,YAAS;AACtC,SAASC,iBAAiB,EAAEC,gBAAgB,QAAQ,YAAS;AAAC,SAAAC,GAAA,IAAAC,IAAA;AAoB9D,OAAO,MAAMC,KAAK,gBAAGT,IAAI,CAAC,SAASS,KAAKA,CAAC;EACvCC,KAAK;EACLC,GAAG,GAAGN,iBAAiB;EACvBO,KAAK,GAAGR,YAAY,CAACS,MAAM,CAACC,KAAK;EACjCC,SAAS,GAAGX,YAAY,CAACS,MAAM,CAACG,SAAS;EACzCC,WAAW,GAAGb,YAAY,CAACS,MAAM,CAACK,WAAW;EAC7CC,WAAW,GAAG,GAAG;EACjBC,IAAI,GAAGhB,YAAY,CAACiB,SAAS;EAC7BC,QAAQ,GAAG,KAAK;EAChBC,KAAK;EACLC,SAAS;EACTC,MAAM,GAAG;AACC,CAAC,EAAE;EACb,MAAMC,KAAK,GAAGC,IAAI,CAACC,KAAK,CAAClB,KAAK,CAAC;EAC/B,IAAI,CAACmB,MAAM,CAACC,QAAQ,CAACJ,KAAK,CAAC,IAAIA,KAAK,GAAG,CAAC,IAAKA,KAAK,KAAK,CAAC,IAAI,CAACJ,QAAS,EAAE;IACtE,OAAO,IAAI;EACb;EACA,oBACEd,IAAA,CAACL,IAAI;IACHsB,MAAM,EAAEA,MAAO;IACfM,aAAa,EAAC,MAAM;IACpBC,yBAAyB,EAAC,qBAAqB;IAC/CC,2BAA2B;IAC3BV,KAAK,EAAE,CACLW,MAAM,CAACpB,KAAK,EACZ;MACEqB,eAAe,EAAEvB,KAAK;MACtBK,WAAW;MACXE,WAAW;MACXiB,QAAQ,EAAEhB,IAAI;MACdiB,MAAM,EAAEjB,IAAI;MACZkB,YAAY,EAAElB,IAAI,GAAG;IACvB,CAAC,EACDG,KAAK,CACL;IAAAgB,QAAA,eAEF/B,IAAA,CAACN,IAAI;MACHsC,aAAa,EAAE,CAAE;MACjBC,gBAAgB,EAAE,KAAM;MACxBlB,KAAK,EAAE,CACLW,MAAM,CAACQ,IAAI,EACX;QAAE9B,KAAK,EAAEG,SAAS;QAAE4B,QAAQ,EAAEhB,IAAI,CAACiB,KAAK,CAACxB,IAAI,GAAG,IAAI;MAAE,CAAC,EACvDI,SAAS,CACT;MAAAe,QAAA,EAEDjC,gBAAgB,CAACoB,KAAK,EAAEf,GAAG;IAAC,CACzB;EAAC,CACH,CAAC;AAEX,CAAC,CAAC;AAEF,MAAMuB,MAAM,GAAGjC,UAAU,CAAC4C,MAAM,CAAC;EAC/B/B,KAAK,EAAE;IACLgC,UAAU,EAAE,QAAQ;IACpBC,cAAc,EAAE,QAAQ;IACxBC,iBAAiB,EAAE;EACrB,CAAC;EACDN,IAAI,EAAE;IACJO,UAAU,EAAE,KAAK;IACjBC,kBAAkB,EAAE,KAAK;IACzBC,SAAS,EAAE;EACb;AACF,CAAC,CAAC","ignoreList":[]}