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.
- package/LICENSE +21 -0
- package/README.md +569 -2
- package/lib/commonjs/Badge.js +65 -0
- package/lib/commonjs/Badge.js.map +1 -0
- package/lib/commonjs/CollapsibleStickyHeaderScreen.js +386 -0
- package/lib/commonjs/CollapsibleStickyHeaderScreen.js.map +1 -0
- package/lib/commonjs/HeaderGreeting.js +122 -0
- package/lib/commonjs/HeaderGreeting.js.map +1 -0
- package/lib/commonjs/HeaderNavBar.js +219 -0
- package/lib/commonjs/HeaderNavBar.js.map +1 -0
- package/lib/commonjs/ImageOrNode.js +40 -0
- package/lib/commonjs/ImageOrNode.js.map +1 -0
- package/lib/commonjs/animations.js +34 -0
- package/lib/commonjs/animations.js.map +1 -0
- package/lib/commonjs/index.js +122 -0
- package/lib/commonjs/index.js.map +1 -0
- package/lib/commonjs/optionalGradient.js +24 -0
- package/lib/commonjs/optionalGradient.js.map +1 -0
- package/lib/commonjs/package.json +1 -0
- package/lib/commonjs/theme.js +93 -0
- package/lib/commonjs/theme.js.map +1 -0
- package/lib/commonjs/types.js +6 -0
- package/lib/commonjs/types.js.map +1 -0
- package/lib/commonjs/useStickyHeader.js +143 -0
- package/lib/commonjs/useStickyHeader.js.map +1 -0
- package/lib/commonjs/utils.js +90 -0
- package/lib/commonjs/utils.js.map +1 -0
- package/lib/module/Badge.js +61 -0
- package/lib/module/Badge.js.map +1 -0
- package/lib/module/CollapsibleStickyHeaderScreen.js +379 -0
- package/lib/module/CollapsibleStickyHeaderScreen.js.map +1 -0
- package/lib/module/HeaderGreeting.js +118 -0
- package/lib/module/HeaderGreeting.js.map +1 -0
- package/lib/module/HeaderNavBar.js +215 -0
- package/lib/module/HeaderNavBar.js.map +1 -0
- package/lib/module/ImageOrNode.js +36 -0
- package/lib/module/ImageOrNode.js.map +1 -0
- package/lib/module/animations.js +28 -0
- package/lib/module/animations.js.map +1 -0
- package/lib/module/index.js +11 -0
- package/lib/module/index.js.map +1 -0
- package/lib/module/optionalGradient.js +20 -0
- package/lib/module/optionalGradient.js.map +1 -0
- package/lib/module/package.json +1 -0
- package/lib/module/theme.js +88 -0
- package/lib/module/theme.js.map +1 -0
- package/lib/module/types.js +4 -0
- package/lib/module/types.js.map +1 -0
- package/lib/module/useStickyHeader.js +138 -0
- package/lib/module/useStickyHeader.js.map +1 -0
- package/lib/module/utils.js +78 -0
- package/lib/module/utils.js.map +1 -0
- package/lib/typescript/commonjs/package.json +1 -0
- package/lib/typescript/commonjs/src/Badge.d.ts +20 -0
- package/lib/typescript/commonjs/src/Badge.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/CollapsibleStickyHeaderScreen.d.ts +10 -0
- package/lib/typescript/commonjs/src/CollapsibleStickyHeaderScreen.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/HeaderGreeting.d.ts +33 -0
- package/lib/typescript/commonjs/src/HeaderGreeting.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/HeaderNavBar.d.ts +48 -0
- package/lib/typescript/commonjs/src/HeaderNavBar.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/ImageOrNode.d.ts +16 -0
- package/lib/typescript/commonjs/src/ImageOrNode.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/animations.d.ts +9 -0
- package/lib/typescript/commonjs/src/animations.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/index.d.ts +10 -0
- package/lib/typescript/commonjs/src/index.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/optionalGradient.d.ts +13 -0
- package/lib/typescript/commonjs/src/optionalGradient.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/theme.d.ts +81 -0
- package/lib/typescript/commonjs/src/theme.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/types.d.ts +244 -0
- package/lib/typescript/commonjs/src/types.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/useStickyHeader.d.ts +12 -0
- package/lib/typescript/commonjs/src/useStickyHeader.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/utils.d.ts +30 -0
- package/lib/typescript/commonjs/src/utils.d.ts.map +1 -0
- package/lib/typescript/module/package.json +1 -0
- package/lib/typescript/module/src/Badge.d.ts +20 -0
- package/lib/typescript/module/src/Badge.d.ts.map +1 -0
- package/lib/typescript/module/src/CollapsibleStickyHeaderScreen.d.ts +10 -0
- package/lib/typescript/module/src/CollapsibleStickyHeaderScreen.d.ts.map +1 -0
- package/lib/typescript/module/src/HeaderGreeting.d.ts +33 -0
- package/lib/typescript/module/src/HeaderGreeting.d.ts.map +1 -0
- package/lib/typescript/module/src/HeaderNavBar.d.ts +48 -0
- package/lib/typescript/module/src/HeaderNavBar.d.ts.map +1 -0
- package/lib/typescript/module/src/ImageOrNode.d.ts +16 -0
- package/lib/typescript/module/src/ImageOrNode.d.ts.map +1 -0
- package/lib/typescript/module/src/animations.d.ts +9 -0
- package/lib/typescript/module/src/animations.d.ts.map +1 -0
- package/lib/typescript/module/src/index.d.ts +10 -0
- package/lib/typescript/module/src/index.d.ts.map +1 -0
- package/lib/typescript/module/src/optionalGradient.d.ts +13 -0
- package/lib/typescript/module/src/optionalGradient.d.ts.map +1 -0
- package/lib/typescript/module/src/theme.d.ts +81 -0
- package/lib/typescript/module/src/theme.d.ts.map +1 -0
- package/lib/typescript/module/src/types.d.ts +244 -0
- package/lib/typescript/module/src/types.d.ts.map +1 -0
- package/lib/typescript/module/src/useStickyHeader.d.ts +12 -0
- package/lib/typescript/module/src/useStickyHeader.d.ts.map +1 -0
- package/lib/typescript/module/src/utils.d.ts +30 -0
- package/lib/typescript/module/src/utils.d.ts.map +1 -0
- 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":[]}
|