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,215 @@
1
+ "use strict";
2
+
3
+ import { Fragment, memo, useEffect, useMemo } from 'react';
4
+ import { Pressable, StyleSheet, Text, View } from 'react-native';
5
+ import { Badge } from "./Badge.js";
6
+ import { ImageOrNode } from "./ImageOrNode.js";
7
+ import { createTheme } from "./theme.js";
8
+ import { DEFAULT_BADGE_MAX, formatBadgeCount, limitActions, warnActionOverflow } from "./utils.js";
9
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
10
+ const DEFAULT_SHOW = ['logo', 'avatar', 'title', 'actions'];
11
+ const ActionButton = /*#__PURE__*/memo(function ActionButton({
12
+ action,
13
+ variant,
14
+ color,
15
+ size,
16
+ theme
17
+ }) {
18
+ const iconColor = action.color ?? color;
19
+ const iconSize = action.size ?? size;
20
+ const hit = theme.actionSize;
21
+ const icon = typeof action.icon === 'function' ? action.icon({
22
+ color: iconColor,
23
+ size: iconSize,
24
+ variant
25
+ }) : action.icon;
26
+ const count = action.badgeCount ?? 0;
27
+ return /*#__PURE__*/_jsxs(Pressable, {
28
+ testID: action.testID ?? `sticky-header-action-${action.key}-${variant}`,
29
+ onPress: action.onPress,
30
+ accessibilityRole: "button",
31
+ accessibilityLabel: action.accessibilityLabel,
32
+ accessibilityHint: action.accessibilityHint,
33
+ accessibilityValue: count > 0 ? {
34
+ text: formatBadgeCount(count, DEFAULT_BADGE_MAX)
35
+ } : undefined,
36
+ hitSlop: 4,
37
+ style: ({
38
+ pressed
39
+ }) => [styles.action, {
40
+ width: hit,
41
+ height: hit,
42
+ borderRadius: hit / 2,
43
+ backgroundColor: variant === 'overlay' ? theme.colors.actionBgOverlay : theme.colors.actionBgSolid,
44
+ opacity: pressed ? theme.pressedOpacity : 1
45
+ }, action.style],
46
+ children: [icon, count > 0 ? /*#__PURE__*/_jsx(Badge, {
47
+ count: count,
48
+ color: theme.colors.badge,
49
+ textColor: theme.colors.badgeText,
50
+ borderColor: theme.colors.badgeBorder,
51
+ size: theme.badgeSize,
52
+ style: styles.badge
53
+ }) : null]
54
+ });
55
+ });
56
+ export const HeaderNavBar = /*#__PURE__*/memo(function HeaderNavBar({
57
+ variant = 'overlay',
58
+ logo,
59
+ logoSize,
60
+ logoStyle,
61
+ logoAccessibilityLabel,
62
+ onLogoPress,
63
+ title,
64
+ titleStyle,
65
+ avatar,
66
+ avatarSize,
67
+ avatarStyle,
68
+ onAvatarPress,
69
+ avatarAccessibilityLabel = 'Profile',
70
+ actions,
71
+ show = DEFAULT_SHOW,
72
+ iconColor,
73
+ iconSize,
74
+ theme: themeOverrides,
75
+ resolvedTheme,
76
+ children,
77
+ style,
78
+ testID
79
+ }) {
80
+ const theme = useMemo(() => resolvedTheme ?? createTheme(themeOverrides), [resolvedTheme, themeOverrides]);
81
+ const {
82
+ actions: limited,
83
+ overflow
84
+ } = limitActions(actions);
85
+ useEffect(() => warnActionOverflow(overflow), [overflow]);
86
+ const shown = !show.includes('actions') ? [] : variant === 'solid' ? limited.filter(a => a.showInSticky !== false) : limited;
87
+ const defaultLogoSize = variant === 'overlay' ? theme.logoSize.expanded : theme.logoSize.compact;
88
+ const size = {
89
+ ...defaultLogoSize,
90
+ ...logoSize
91
+ };
92
+ const color = iconColor ?? (variant === 'overlay' ? theme.colors.iconOverlay : theme.colors.iconSolid);
93
+ const padding = theme.spacing.navBar[variant];
94
+ let logoNode = null;
95
+ if (logo != null && logo !== false) {
96
+ const image = /*#__PURE__*/_jsx(ImageOrNode, {
97
+ value: logo,
98
+ testID: `sticky-header-logo-${variant}`,
99
+ accessibilityLabel: onLogoPress ? undefined : logoAccessibilityLabel,
100
+ style: [{
101
+ width: size.width,
102
+ height: size.height
103
+ }, logoStyle]
104
+ });
105
+ logoNode = onLogoPress ? /*#__PURE__*/_jsx(Pressable, {
106
+ testID: `sticky-header-nav-logo-${variant}`,
107
+ onPress: onLogoPress,
108
+ hitSlop: 4,
109
+ accessibilityRole: "button",
110
+ accessibilityLabel: logoAccessibilityLabel ?? 'Logo',
111
+ children: image
112
+ }) : image;
113
+ }
114
+ let avatarNode = null;
115
+ if (avatar != null && avatar !== false) {
116
+ const d = avatarSize ?? (variant === 'solid' ? theme.avatarSizeCompact : theme.avatarSize);
117
+ const image = /*#__PURE__*/_jsx(ImageOrNode, {
118
+ value: avatar,
119
+ resizeMode: "cover",
120
+ accessibilityLabel: onAvatarPress ? undefined : avatarAccessibilityLabel,
121
+ style: [{
122
+ width: d,
123
+ height: d,
124
+ borderRadius: d / 2,
125
+ overflow: 'hidden'
126
+ }, avatarStyle]
127
+ });
128
+ avatarNode = onAvatarPress ? /*#__PURE__*/_jsx(Pressable, {
129
+ testID: `sticky-header-nav-avatar-${variant}`,
130
+ onPress: onAvatarPress,
131
+ hitSlop: 6,
132
+ accessibilityRole: "button",
133
+ accessibilityLabel: avatarAccessibilityLabel,
134
+ children: image
135
+ }) : /*#__PURE__*/_jsx(View, {
136
+ testID: `sticky-header-nav-avatar-${variant}`,
137
+ children: image
138
+ });
139
+ }
140
+ let titleNode = null;
141
+ if (title != null && title !== false) {
142
+ titleNode = typeof title === 'string' || typeof title === 'number' ? /*#__PURE__*/_jsx(Text, {
143
+ testID: `sticky-header-nav-title-${variant}`,
144
+ accessibilityRole: "header",
145
+ numberOfLines: 1,
146
+ style: [styles.title, {
147
+ color: variant === 'solid' ? theme.colors.stickyTitle : theme.colors.title,
148
+ fontSize: theme.typography.stickyTitleSize
149
+ }, titleStyle],
150
+ children: title
151
+ }) : title;
152
+ }
153
+ const leadingNodes = {
154
+ logo: logoNode,
155
+ avatar: avatarNode,
156
+ title: titleNode
157
+ };
158
+ const leading = show.filter(item => item !== 'actions').filter(item => leadingNodes[item] != null).map(item => /*#__PURE__*/_jsx(Fragment, {
159
+ children: leadingNodes[item]
160
+ }, item));
161
+ return /*#__PURE__*/_jsxs(View, {
162
+ testID: testID ?? `sticky-header-nav-${variant}`,
163
+ style: [styles.bar, padding, style],
164
+ children: [/*#__PURE__*/_jsx(View, {
165
+ testID: `sticky-header-nav-leading-${variant}`,
166
+ style: [styles.leading, {
167
+ gap: theme.spacing.leadingGap
168
+ }],
169
+ children: leading
170
+ }), children, shown.length > 0 ? /*#__PURE__*/_jsx(View, {
171
+ style: [styles.actions, {
172
+ gap: theme.spacing.actionGap
173
+ }],
174
+ children: shown.map(action => /*#__PURE__*/_jsx(ActionButton, {
175
+ action: action,
176
+ variant: variant,
177
+ color: color,
178
+ size: iconSize ?? theme.iconSize,
179
+ theme: theme
180
+ }, action.key))
181
+ }) : null]
182
+ });
183
+ });
184
+ const styles = StyleSheet.create({
185
+ bar: {
186
+ flexDirection: 'row',
187
+ alignItems: 'center',
188
+ justifyContent: 'space-between'
189
+ },
190
+ leading: {
191
+ flexDirection: 'row',
192
+ alignItems: 'center',
193
+ flexShrink: 1,
194
+ minWidth: 0
195
+ },
196
+ title: {
197
+ fontWeight: '600',
198
+ flexShrink: 1
199
+ },
200
+ actions: {
201
+ flexDirection: 'row',
202
+ alignItems: 'center',
203
+ flexShrink: 0
204
+ },
205
+ action: {
206
+ alignItems: 'center',
207
+ justifyContent: 'center'
208
+ },
209
+ badge: {
210
+ position: 'absolute',
211
+ top: -2,
212
+ end: -2
213
+ }
214
+ });
215
+ //# sourceMappingURL=HeaderNavBar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["Fragment","memo","useEffect","useMemo","Pressable","StyleSheet","Text","View","Badge","ImageOrNode","createTheme","DEFAULT_BADGE_MAX","formatBadgeCount","limitActions","warnActionOverflow","jsx","_jsx","jsxs","_jsxs","DEFAULT_SHOW","ActionButton","action","variant","color","size","theme","iconColor","iconSize","hit","actionSize","icon","count","badgeCount","testID","key","onPress","accessibilityRole","accessibilityLabel","accessibilityHint","accessibilityValue","text","undefined","hitSlop","style","pressed","styles","width","height","borderRadius","backgroundColor","colors","actionBgOverlay","actionBgSolid","opacity","pressedOpacity","children","badge","textColor","badgeText","borderColor","badgeBorder","badgeSize","HeaderNavBar","logo","logoSize","logoStyle","logoAccessibilityLabel","onLogoPress","title","titleStyle","avatar","avatarSize","avatarStyle","onAvatarPress","avatarAccessibilityLabel","actions","show","themeOverrides","resolvedTheme","limited","overflow","shown","includes","filter","a","showInSticky","defaultLogoSize","expanded","compact","iconOverlay","iconSolid","padding","spacing","navBar","logoNode","image","value","avatarNode","d","avatarSizeCompact","resizeMode","titleNode","numberOfLines","stickyTitle","fontSize","typography","stickyTitleSize","leadingNodes","leading","item","map","bar","gap","leadingGap","length","actionGap","create","flexDirection","alignItems","justifyContent","flexShrink","minWidth","fontWeight","position","top","end"],"sourceRoot":"../../src","sources":["HeaderNavBar.tsx"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+
3
+ import { Image, View } from 'react-native';
4
+ import { isImageSource } from "./utils.js";
5
+ import { jsx as _jsx } from "react/jsx-runtime";
6
+ /** Renders an image source as an `Image`, anything else as-is. */
7
+ export function ImageOrNode({
8
+ value,
9
+ style,
10
+ accessibilityLabel,
11
+ resizeMode = 'contain',
12
+ testID
13
+ }) {
14
+ if (value == null || value === false) return null;
15
+ if (isImageSource(value)) {
16
+ return /*#__PURE__*/_jsx(Image, {
17
+ testID: testID,
18
+ source: value,
19
+ resizeMode: resizeMode,
20
+ accessibilityRole: accessibilityLabel ? 'image' : undefined,
21
+ accessibilityLabel: accessibilityLabel,
22
+ accessible: !!accessibilityLabel,
23
+ style: style
24
+ });
25
+ }
26
+ return /*#__PURE__*/_jsx(View, {
27
+ testID: testID,
28
+ accessibilityLabel: accessibilityLabel,
29
+ style: [{
30
+ alignItems: 'center',
31
+ justifyContent: 'center'
32
+ }, style],
33
+ children: value
34
+ });
35
+ }
36
+ //# sourceMappingURL=ImageOrNode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["Image","View","isImageSource","jsx","_jsx","ImageOrNode","value","style","accessibilityLabel","resizeMode","testID","source","accessibilityRole","undefined","accessible","alignItems","justifyContent","children"],"sourceRoot":"../../src","sources":["ImageOrNode.tsx"],"mappings":";;AACA,SACEA,KAAK,EACLC,IAAI,QAKC,cAAc;AAErB,SAASC,aAAa,QAAQ,YAAS;AAAC,SAAAC,GAAA,IAAAC,IAAA;AAYxC;AACA,OAAO,SAASC,WAAWA,CAAC;EAC1BC,KAAK;EACLC,KAAK;EACLC,kBAAkB;EAClBC,UAAU,GAAG,SAAS;EACtBC;AACK,CAAC,EAAa;EACnB,IAAIJ,KAAK,IAAI,IAAI,IAAIA,KAAK,KAAK,KAAK,EAAE,OAAO,IAAI;EACjD,IAAIJ,aAAa,CAACI,KAAK,CAAC,EAAE;IACxB,oBACEF,IAAA,CAACJ,KAAK;MACJU,MAAM,EAAEA,MAAO;MACfC,MAAM,EAAEL,KAAM;MACdG,UAAU,EAAEA,UAAW;MACvBG,iBAAiB,EAAEJ,kBAAkB,GAAG,OAAO,GAAGK,SAAU;MAC5DL,kBAAkB,EAAEA,kBAAmB;MACvCM,UAAU,EAAE,CAAC,CAACN,kBAAmB;MACjCD,KAAK,EAAEA;IAA+B,CACvC,CAAC;EAEN;EACA,oBACEH,IAAA,CAACH,IAAI;IACHS,MAAM,EAAEA,MAAO;IACfF,kBAAkB,EAAEA,kBAAmB;IACvCD,KAAK,EAAE,CACL;MAAEQ,UAAU,EAAE,QAAQ;MAAEC,cAAc,EAAE;IAAS,CAAC,EAClDT,KAAK,CACL;IAAAU,QAAA,EAEDX;EAAK,CACF,CAAC;AAEX","ignoreList":[]}
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+
3
+ /** Default sticky bar animation: fade in. */
4
+ export const fadeStickyAnimation = progress => {
5
+ 'worklet';
6
+
7
+ return {
8
+ opacity: progress
9
+ };
10
+ };
11
+
12
+ /**
13
+ * Slides the sticky bar down from above while fading it in.
14
+ * @param distance How far above its resting place the bar starts. Default 120.
15
+ */
16
+ export function slideStickyAnimation(distance = 120) {
17
+ return progress => {
18
+ 'worklet';
19
+
20
+ return {
21
+ opacity: progress > 0 ? 1 : 0,
22
+ transform: [{
23
+ translateY: (progress - 1) * distance
24
+ }]
25
+ };
26
+ };
27
+ }
28
+ //# sourceMappingURL=animations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["fadeStickyAnimation","progress","opacity","slideStickyAnimation","distance","transform","translateY"],"sourceRoot":"../../src","sources":["animations.ts"],"mappings":";;AAEA;AACA,OAAO,MAAMA,mBAAsC,GAAIC,QAAQ,IAAK;EAClE,SAAS;;EACT,OAAO;IAAEC,OAAO,EAAED;EAAS,CAAC;AAC9B,CAAC;;AAED;AACA;AACA;AACA;AACA,OAAO,SAASE,oBAAoBA,CAACC,QAAQ,GAAG,GAAG,EAAqB;EACtE,OAAQH,QAAQ,IAAK;IACnB,SAAS;;IACT,OAAO;MACLC,OAAO,EAAED,QAAQ,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC;MAC7BI,SAAS,EAAE,CAAC;QAAEC,UAAU,EAAE,CAACL,QAAQ,GAAG,CAAC,IAAIG;MAAS,CAAC;IACvD,CAAC;EACH,CAAC;AACH","ignoreList":[]}
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+
3
+ export { CollapsibleStickyHeaderScreen } from "./CollapsibleStickyHeaderScreen.js";
4
+ export { useStickyHeader, DEFAULT_COLLAPSE_TRANSLATE_Y, DEFAULT_STICKY_FADE_DISTANCE, DEFAULT_STICKY_POINTER_OFFSET } from "./useStickyHeader.js";
5
+ export { HeaderNavBar } from "./HeaderNavBar.js";
6
+ export { HeaderGreeting } from "./HeaderGreeting.js";
7
+ export { Badge } from "./Badge.js";
8
+ export { createTheme, defaultTheme } from "./theme.js";
9
+ export { DEFAULT_BADGE_MAX, MAX_HEADER_ACTIONS, computeThreshold, getCollapseProgress, getStickyProgress, isStickyAt } from "./utils.js";
10
+ export { fadeStickyAnimation, slideStickyAnimation } from "./animations.js";
11
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["CollapsibleStickyHeaderScreen","useStickyHeader","DEFAULT_COLLAPSE_TRANSLATE_Y","DEFAULT_STICKY_FADE_DISTANCE","DEFAULT_STICKY_POINTER_OFFSET","HeaderNavBar","HeaderGreeting","Badge","createTheme","defaultTheme","DEFAULT_BADGE_MAX","MAX_HEADER_ACTIONS","computeThreshold","getCollapseProgress","getStickyProgress","isStickyAt","fadeStickyAnimation","slideStickyAnimation"],"sourceRoot":"../../src","sources":["index.ts"],"mappings":";;AAAA,SAASA,6BAA6B,QAAQ,oCAAiC;AAC/E,SACEC,eAAe,EACfC,4BAA4B,EAC5BC,4BAA4B,EAC5BC,6BAA6B,QACxB,sBAAmB;AAC1B,SACEC,YAAY,QAGP,mBAAgB;AACvB,SAASC,cAAc,QAAkC,qBAAkB;AAC3E,SAASC,KAAK,QAAyB,YAAS;AAChD,SACEC,WAAW,EACXC,YAAY,QAKP,YAAS;AAChB,SACEC,iBAAiB,EACjBC,kBAAkB,EAClBC,gBAAgB,EAChBC,mBAAmB,EACnBC,iBAAiB,EACjBC,UAAU,QACL,YAAS;AAChB,SAASC,mBAAmB,EAAEC,oBAAoB,QAAQ,iBAAc","ignoreList":[]}
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+
3
+ let cached;
4
+
5
+ /**
6
+ * Resolves `expo-linear-gradient` when it is installed. The require sits in a
7
+ * try/catch so Metro treats it as an optional dependency.
8
+ */
9
+ export function getLinearGradient() {
10
+ if (cached === undefined) {
11
+ try {
12
+ const mod = require('expo-linear-gradient');
13
+ cached = mod.LinearGradient ?? null;
14
+ } catch {
15
+ cached = null;
16
+ }
17
+ }
18
+ return cached;
19
+ }
20
+ //# sourceMappingURL=optionalGradient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["cached","getLinearGradient","undefined","mod","require","LinearGradient"],"sourceRoot":"../../src","sources":["optionalGradient.ts"],"mappings":";;AAWA,IAAIA,MAA6C;;AAEjD;AACA;AACA;AACA;AACA,OAAO,SAASC,iBAAiBA,CAAA,EAA8B;EAC7D,IAAID,MAAM,KAAKE,SAAS,EAAE;IACxB,IAAI;MACF,MAAMC,GAAG,GAAGC,OAAO,CAAC,sBAAsB,CAEzC;MACDJ,MAAM,GAAGG,GAAG,CAACE,cAAc,IAAI,IAAI;IACrC,CAAC,CAAC,MAAM;MACNL,MAAM,GAAG,IAAI;IACf;EACF;EACA,OAAOA,MAAM;AACf","ignoreList":[]}
@@ -0,0 +1 @@
1
+ {"type":"module"}
@@ -0,0 +1,88 @@
1
+ "use strict";
2
+
3
+ /** Neutral defaults. Brand colors belong in your own theme. */
4
+ export const defaultTheme = {
5
+ colors: {
6
+ stickyBg: '#ffffff',
7
+ headerBg: 'transparent',
8
+ iconOverlay: '#ffffff',
9
+ iconSolid: '#1f2937',
10
+ actionBgOverlay: 'transparent',
11
+ actionBgSolid: 'transparent',
12
+ badge: '#ef4444',
13
+ badgeText: '#ffffff',
14
+ badgeBorder: '#ffffff',
15
+ greeting: '#ffffff',
16
+ title: '#ffffff',
17
+ subtitle: 'rgba(255,255,255,0.85)',
18
+ stickyTitle: '#111827',
19
+ fade: ['transparent', '#ffffff'],
20
+ shadow: '#000000'
21
+ },
22
+ spacing: {
23
+ horizontal: 16,
24
+ actionGap: 8,
25
+ avatarGap: 12,
26
+ leadingGap: 8,
27
+ navBar: {
28
+ overlay: {
29
+ paddingHorizontal: 16,
30
+ paddingVertical: 8
31
+ },
32
+ solid: {
33
+ paddingHorizontal: 16,
34
+ paddingVertical: 4
35
+ }
36
+ }
37
+ },
38
+ radius: {
39
+ headerBottom: 0
40
+ },
41
+ pressedOpacity: 0.6,
42
+ iconSize: 22,
43
+ actionSize: 36,
44
+ avatarSize: 44,
45
+ avatarSizeCompact: 32,
46
+ badgeSize: 18,
47
+ logoSize: {
48
+ expanded: {
49
+ width: 100,
50
+ height: 75
51
+ },
52
+ compact: {
53
+ width: 64,
54
+ height: 48
55
+ }
56
+ },
57
+ typography: {
58
+ greetingSize: 14,
59
+ titleSize: 24,
60
+ subtitleSize: 14,
61
+ stickyTitleSize: 17
62
+ }
63
+ };
64
+ function isPlainObject(value) {
65
+ return typeof value === 'object' && value !== null && !Array.isArray(value) && Object.getPrototypeOf(value) === Object.prototype;
66
+ }
67
+ function deepMerge(base, overrides) {
68
+ if (!overrides) return base;
69
+ const out = {
70
+ ...base
71
+ };
72
+ for (const key of Object.keys(overrides)) {
73
+ const next = overrides[key];
74
+ if (next === undefined) continue;
75
+ const prev = out[key];
76
+ out[key] = isPlainObject(prev) && isPlainObject(next) ? deepMerge(prev, next) : next;
77
+ }
78
+ return out;
79
+ }
80
+
81
+ /**
82
+ * Deep-merges one or more partial themes over the defaults. Arrays (such as
83
+ * `colors.fade`) are replaced, not merged.
84
+ */
85
+ export function createTheme(...overrides) {
86
+ return overrides.reduce((theme, o) => deepMerge(theme, o), defaultTheme);
87
+ }
88
+ //# sourceMappingURL=theme.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["defaultTheme","colors","stickyBg","headerBg","iconOverlay","iconSolid","actionBgOverlay","actionBgSolid","badge","badgeText","badgeBorder","greeting","title","subtitle","stickyTitle","fade","shadow","spacing","horizontal","actionGap","avatarGap","leadingGap","navBar","overlay","paddingHorizontal","paddingVertical","solid","radius","headerBottom","pressedOpacity","iconSize","actionSize","avatarSize","avatarSizeCompact","badgeSize","logoSize","expanded","width","height","compact","typography","greetingSize","titleSize","subtitleSize","stickyTitleSize","isPlainObject","value","Array","isArray","Object","getPrototypeOf","prototype","deepMerge","base","overrides","out","key","keys","next","undefined","prev","createTheme","reduce","theme","o"],"sourceRoot":"../../src","sources":["theme.ts"],"mappings":";;AA+EA;AACA,OAAO,MAAMA,YAA+B,GAAG;EAC7CC,MAAM,EAAE;IACNC,QAAQ,EAAE,SAAS;IACnBC,QAAQ,EAAE,aAAa;IACvBC,WAAW,EAAE,SAAS;IACtBC,SAAS,EAAE,SAAS;IACpBC,eAAe,EAAE,aAAa;IAC9BC,aAAa,EAAE,aAAa;IAC5BC,KAAK,EAAE,SAAS;IAChBC,SAAS,EAAE,SAAS;IACpBC,WAAW,EAAE,SAAS;IACtBC,QAAQ,EAAE,SAAS;IACnBC,KAAK,EAAE,SAAS;IAChBC,QAAQ,EAAE,wBAAwB;IAClCC,WAAW,EAAE,SAAS;IACtBC,IAAI,EAAE,CAAC,aAAa,EAAE,SAAS,CAAC;IAChCC,MAAM,EAAE;EACV,CAAC;EACDC,OAAO,EAAE;IACPC,UAAU,EAAE,EAAE;IACdC,SAAS,EAAE,CAAC;IACZC,SAAS,EAAE,EAAE;IACbC,UAAU,EAAE,CAAC;IACbC,MAAM,EAAE;MACNC,OAAO,EAAE;QAAEC,iBAAiB,EAAE,EAAE;QAAEC,eAAe,EAAE;MAAE,CAAC;MACtDC,KAAK,EAAE;QAAEF,iBAAiB,EAAE,EAAE;QAAEC,eAAe,EAAE;MAAE;IACrD;EACF,CAAC;EACDE,MAAM,EAAE;IACNC,YAAY,EAAE;EAChB,CAAC;EACDC,cAAc,EAAE,GAAG;EACnBC,QAAQ,EAAE,EAAE;EACZC,UAAU,EAAE,EAAE;EACdC,UAAU,EAAE,EAAE;EACdC,iBAAiB,EAAE,EAAE;EACrBC,SAAS,EAAE,EAAE;EACbC,QAAQ,EAAE;IACRC,QAAQ,EAAE;MAAEC,KAAK,EAAE,GAAG;MAAEC,MAAM,EAAE;IAAG,CAAC;IACpCC,OAAO,EAAE;MAAEF,KAAK,EAAE,EAAE;MAAEC,MAAM,EAAE;IAAG;EACnC,CAAC;EACDE,UAAU,EAAE;IACVC,YAAY,EAAE,EAAE;IAChBC,SAAS,EAAE,EAAE;IACbC,YAAY,EAAE,EAAE;IAChBC,eAAe,EAAE;EACnB;AACF,CAAC;AAED,SAASC,aAAaA,CAACC,KAAc,EAAoC;EACvE,OACE,OAAOA,KAAK,KAAK,QAAQ,IACzBA,KAAK,KAAK,IAAI,IACd,CAACC,KAAK,CAACC,OAAO,CAACF,KAAK,CAAC,IACrBG,MAAM,CAACC,cAAc,CAACJ,KAAK,CAAC,KAAKG,MAAM,CAACE,SAAS;AAErD;AAEA,SAASC,SAASA,CAAIC,IAAO,EAAEC,SAAqC,EAAK;EACvE,IAAI,CAACA,SAAS,EAAE,OAAOD,IAAI;EAC3B,MAAME,GAA4B,GAAG;IAAE,GAAIF;EAAiC,CAAC;EAC7E,KAAK,MAAMG,GAAG,IAAIP,MAAM,CAACQ,IAAI,CAACH,SAAS,CAAC,EAAE;IACxC,MAAMI,IAAI,GAAIJ,SAAS,CAA6BE,GAAG,CAAC;IACxD,IAAIE,IAAI,KAAKC,SAAS,EAAE;IACxB,MAAMC,IAAI,GAAGL,GAAG,CAACC,GAAG,CAAC;IACrBD,GAAG,CAACC,GAAG,CAAC,GACNX,aAAa,CAACe,IAAI,CAAC,IAAIf,aAAa,CAACa,IAAI,CAAC,GACtCN,SAAS,CAACQ,IAAI,EAAEF,IAAgC,CAAC,GACjDA,IAAI;EACZ;EACA,OAAOH,GAAG;AACZ;;AAEA;AACA;AACA;AACA;AACA,OAAO,SAASM,WAAWA,CACzB,GAAGP,SAAwD,EACxC;EACnB,OAAOA,SAAS,CAACQ,MAAM,CACrB,CAACC,KAAK,EAAEC,CAAC,KAAKZ,SAAS,CAACW,KAAK,EAAEC,CAAC,CAAC,EACjChE,YACF,CAAC;AACH","ignoreList":[]}
@@ -0,0 +1,4 @@
1
+ "use strict";
2
+
3
+ export {};
4
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":[],"sourceRoot":"../../src","sources":["types.ts"],"mappings":"","ignoreList":[]}
@@ -0,0 +1,138 @@
1
+ "use strict";
2
+
3
+ import { useCallback, useEffect, useRef, useState } from 'react';
4
+ import { runOnJS, runOnUI, useAnimatedScrollHandler, useAnimatedStyle, useDerivedValue, useReducedMotion, useSharedValue } from 'react-native-reanimated';
5
+ import { useSafeAreaInsets } from 'react-native-safe-area-context';
6
+ import { computeThreshold, getCollapseProgress, getStickyProgress, isStickyAt } from "./utils.js";
7
+ export const DEFAULT_STICKY_FADE_DISTANCE = 40;
8
+ export const DEFAULT_STICKY_POINTER_OFFSET = 20;
9
+ export const DEFAULT_COLLAPSE_TRANSLATE_Y = -12;
10
+
11
+ /**
12
+ * Scroll-driven state for a collapsing header with a sticky bar.
13
+ *
14
+ * All styles are computed on the UI thread. The hook only re-renders when the
15
+ * sticky state flips (and when the nav bar is first measured).
16
+ */
17
+ export function useStickyHeader(options = {}) {
18
+ const {
19
+ thresholdOffset = 0,
20
+ stickyFadeDistance = DEFAULT_STICKY_FADE_DISTANCE,
21
+ stickyPointerOffset = DEFAULT_STICKY_POINTER_OFFSET,
22
+ collapseTranslateY = DEFAULT_COLLAPSE_TRANSLATE_Y,
23
+ collapseAnimation,
24
+ stickyAnimation,
25
+ respectSafeArea = true,
26
+ topInset: topInsetOverride,
27
+ reducedMotion: reducedMotionOverride,
28
+ onStickyChange,
29
+ onScroll
30
+ } = options;
31
+ const insets = useSafeAreaInsets();
32
+ const systemReducedMotion = useReducedMotion();
33
+ const reducedMotion = reducedMotionOverride ?? systemReducedMotion;
34
+ const topInset = respectSafeArea ? topInsetOverride ?? insets.top : 0;
35
+ const scrollY = useSharedValue(0);
36
+ const navBarHeight = useSharedValue(0);
37
+ const threshold = useSharedValue(0);
38
+ const stickySV = useSharedValue(false);
39
+ const [isSticky, setIsSticky] = useState(false);
40
+ const onStickyChangeRef = useRef(onStickyChange);
41
+ onStickyChangeRef.current = onStickyChange;
42
+ const onScrollRef = useRef(onScroll);
43
+ onScrollRef.current = onScroll;
44
+ const hasJsOnScroll = onScroll != null;
45
+ const notifySticky = useCallback(next => {
46
+ setIsSticky(next);
47
+ onStickyChangeRef.current?.(next);
48
+ }, []);
49
+ const forwardScroll = useCallback(event => {
50
+ onScrollRef.current?.({
51
+ nativeEvent: event
52
+ });
53
+ }, []);
54
+ const updateScrollY = useCallback(y => {
55
+ 'worklet';
56
+
57
+ scrollY.value = y;
58
+ const next = isStickyAt(y, threshold.value, stickyPointerOffset);
59
+ if (next !== stickySV.value) {
60
+ stickySV.value = next;
61
+ runOnJS(notifySticky)(next);
62
+ }
63
+ }, [scrollY, threshold, stickySV, stickyPointerOffset, notifySticky]);
64
+
65
+ // Re-evaluates the sticky state on the UI thread (where scrollY lives)
66
+ // after the threshold moved without a scroll.
67
+ const resyncSticky = useCallback(() => {
68
+ 'worklet';
69
+
70
+ updateScrollY(scrollY.value);
71
+ }, [updateScrollY, scrollY]);
72
+
73
+ // The threshold is computed from JS-side numbers: shared value writes from
74
+ // JS are applied asynchronously, so reading them back here would be stale.
75
+ const measuredNavHeight = useRef(0);
76
+ const syncThreshold = useCallback(() => {
77
+ threshold.value = computeThreshold(measuredNavHeight.current, topInset, thresholdOffset);
78
+ runOnUI(resyncSticky)();
79
+ }, [threshold, topInset, thresholdOffset, resyncSticky]);
80
+ useEffect(() => {
81
+ syncThreshold();
82
+ }, [syncThreshold]);
83
+ const onNavLayout = useCallback(event => {
84
+ const height = event.nativeEvent.layout.height;
85
+ if (height === measuredNavHeight.current) return;
86
+ measuredNavHeight.current = height;
87
+ navBarHeight.value = height;
88
+ syncThreshold();
89
+ }, [navBarHeight, syncThreshold]);
90
+
91
+ // No deps array: Reanimated rebuilds the handler from its closure (and v4
92
+ // warns when deps are passed on native).
93
+ const scrollHandler = useAnimatedScrollHandler({
94
+ onScroll: event => {
95
+ updateScrollY(event.contentOffset.y);
96
+ if (hasJsOnScroll) {
97
+ runOnJS(forwardScroll)(event);
98
+ }
99
+ }
100
+ });
101
+ const fadeDistance = reducedMotion ? 0 : stickyFadeDistance;
102
+ const collapseProgress = useDerivedValue(() => getCollapseProgress(scrollY.value, threshold.value));
103
+ const stickyProgress = useDerivedValue(() => getStickyProgress(scrollY.value, threshold.value, fadeDistance));
104
+ const translateY = reducedMotion ? 0 : collapseTranslateY;
105
+ const collapseStyle = useAnimatedStyle(() => {
106
+ const p = collapseProgress.value;
107
+ if (collapseAnimation) return collapseAnimation(p);
108
+ return {
109
+ opacity: 1 - p,
110
+ transform: [{
111
+ translateY: p * translateY
112
+ }]
113
+ };
114
+ });
115
+ const stickyStyle = useAnimatedStyle(() => {
116
+ const p = stickyProgress.value;
117
+ if (stickyAnimation && !reducedMotion) return stickyAnimation(p);
118
+ return {
119
+ opacity: p
120
+ };
121
+ });
122
+ return {
123
+ scrollHandler: scrollHandler,
124
+ scrollY,
125
+ threshold,
126
+ navBarHeight,
127
+ collapseProgress,
128
+ stickyProgress,
129
+ collapseStyle,
130
+ stickyStyle,
131
+ isSticky,
132
+ onNavLayout,
133
+ updateScrollY,
134
+ topInset,
135
+ reducedMotion
136
+ };
137
+ }
138
+ //# sourceMappingURL=useStickyHeader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["useCallback","useEffect","useRef","useState","runOnJS","runOnUI","useAnimatedScrollHandler","useAnimatedStyle","useDerivedValue","useReducedMotion","useSharedValue","useSafeAreaInsets","computeThreshold","getCollapseProgress","getStickyProgress","isStickyAt","DEFAULT_STICKY_FADE_DISTANCE","DEFAULT_STICKY_POINTER_OFFSET","DEFAULT_COLLAPSE_TRANSLATE_Y","useStickyHeader","options","thresholdOffset","stickyFadeDistance","stickyPointerOffset","collapseTranslateY","collapseAnimation","stickyAnimation","respectSafeArea","topInset","topInsetOverride","reducedMotion","reducedMotionOverride","onStickyChange","onScroll","insets","systemReducedMotion","top","scrollY","navBarHeight","threshold","stickySV","isSticky","setIsSticky","onStickyChangeRef","current","onScrollRef","hasJsOnScroll","notifySticky","next","forwardScroll","event","nativeEvent","updateScrollY","y","value","resyncSticky","measuredNavHeight","syncThreshold","onNavLayout","height","layout","scrollHandler","contentOffset","fadeDistance","collapseProgress","stickyProgress","translateY","collapseStyle","p","opacity","transform","stickyStyle"],"sourceRoot":"../../src","sources":["useStickyHeader.ts"],"mappings":"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","ignoreList":[]}