react-native-skelo 0.0.3 → 0.1.0-alpha.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 +1 -1
- package/README.md +9 -26
- package/lib/commonjs/animations/PulseAnimation.js +26 -2
- package/lib/commonjs/animations/PulseAnimation.js.map +1 -1
- package/lib/commonjs/animations/ShimmerAnimation.js +55 -25
- package/lib/commonjs/animations/ShimmerAnimation.js.map +1 -1
- package/lib/commonjs/components/Skeleton.js +9 -15
- package/lib/commonjs/components/Skeleton.js.map +1 -1
- package/lib/module/animations/PulseAnimation.js +26 -2
- package/lib/module/animations/PulseAnimation.js.map +1 -1
- package/lib/module/animations/ShimmerAnimation.js +56 -26
- package/lib/module/animations/ShimmerAnimation.js.map +1 -1
- package/lib/module/components/Skeleton.js +9 -15
- package/lib/module/components/Skeleton.js.map +1 -1
- package/lib/typescript/animations/PulseAnimation.d.ts +44 -0
- package/lib/typescript/animations/PulseAnimation.d.ts.map +1 -1
- package/lib/typescript/animations/ShimmerAnimation.d.ts +44 -0
- package/lib/typescript/animations/ShimmerAnimation.d.ts.map +1 -1
- package/lib/typescript/components/Skeleton.d.ts.map +1 -1
- package/package.json +4 -20
- package/src/animations/PulseAnimation.tsx +67 -5
- package/src/animations/ShimmerAnimation.tsx +106 -38
- package/src/components/Skeleton.tsx +9 -17
- package/lib/commonjs/core/deepRegistry.js +0 -18
- package/lib/commonjs/core/deepRegistry.js.map +0 -1
- package/lib/commonjs/deep.js +0 -18
- package/lib/commonjs/deep.js.map +0 -1
- package/lib/module/core/deepRegistry.js +0 -11
- package/lib/module/core/deepRegistry.js.map +0 -1
- package/lib/module/deep.js +0 -11
- package/lib/module/deep.js.map +0 -1
- package/lib/typescript/core/deepRegistry.d.ts +0 -7
- package/lib/typescript/core/deepRegistry.d.ts.map +0 -1
- package/lib/typescript/deep.d.ts +0 -2
- package/lib/typescript/deep.d.ts.map +0 -1
- package/src/core/deepRegistry.ts +0 -16
- package/src/deep.ts +0 -12
package/LICENSE
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
MIT License
|
|
2
2
|
|
|
3
|
-
Copyright (c) 2026 Shubhanshu
|
|
3
|
+
Copyright (c) 2026 Shubhanshu
|
|
4
4
|
|
|
5
5
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
6
|
of this software and associated documentation files (the "Software"), to deal
|
package/README.md
CHANGED
|
@@ -4,12 +4,12 @@
|
|
|
4
4
|
|
|
5
5
|
**Write your UI once. Skelo builds the loading state automatically.**
|
|
6
6
|
|
|
7
|
-
[](https://www.npmjs.com/package/react-native-skelo)
|
|
7
|
+
[](https://www.npmjs.com/package/react-native-skelo)
|
|
8
8
|
[](./LICENSE)
|
|
9
9
|
|
|
10
10
|
</div>
|
|
11
11
|
|
|
12
|
-
> ⚠️ **
|
|
12
|
+
> ⚠️ **Alpha.** The API may change before `1.0`. The `deep` engine is experimental — see [caveats](#deep-mode-caveats-experimental).
|
|
13
13
|
|
|
14
14
|
Skeleton loading screens usually mean building — and maintaining — a second copy of your UI. Skelo derives the skeleton from the UI you already wrote.
|
|
15
15
|
|
|
@@ -29,33 +29,17 @@ While `loading`, Skelo reads the tree and its styles and renders a matching skel
|
|
|
29
29
|
## Installation
|
|
30
30
|
|
|
31
31
|
```bash
|
|
32
|
-
npm install react-native-skelo
|
|
32
|
+
npm install react-native-skelo@alpha
|
|
33
33
|
```
|
|
34
34
|
|
|
35
|
-
|
|
36
|
-
React Native's built-in `experimental_backgroundImage` gradient (New
|
|
37
|
-
Architecture) — no gradient library required.
|
|
38
|
-
|
|
39
|
-
### To enable `deep` mode (optional)
|
|
40
|
-
|
|
41
|
-
`deep` mode is opt-in so the core library never bundles a reconciler you don't
|
|
42
|
-
use. Install `react-reconciler` (matching your React version) and import the
|
|
43
|
-
deep entry **once** in your app's entry file:
|
|
35
|
+
Peer dependencies:
|
|
44
36
|
|
|
45
37
|
```bash
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
npm install react-reconciler@0.29.2
|
|
38
|
+
npm install react-native-reanimated react-native-linear-gradient
|
|
39
|
+
# Optional — only needed for `deep` mode:
|
|
40
|
+
npm install react-reconciler
|
|
50
41
|
```
|
|
51
42
|
|
|
52
|
-
```js
|
|
53
|
-
// index.js (app entry)
|
|
54
|
-
import 'react-native-skelo/deep';
|
|
55
|
-
```
|
|
56
|
-
|
|
57
|
-
Without this, `<Skeleton deep>` simply falls back to static parsing (no crash).
|
|
58
|
-
|
|
59
43
|
## Usage
|
|
60
44
|
|
|
61
45
|
### Basic — inline host elements
|
|
@@ -89,7 +73,7 @@ const Home = withSkeleton(HomeScreen);
|
|
|
89
73
|
<Home loading={loading} {...props} />
|
|
90
74
|
```
|
|
91
75
|
|
|
92
|
-
Requires `react-reconciler
|
|
76
|
+
Requires `react-reconciler`. See [caveats](#deep-mode-caveats-experimental).
|
|
93
77
|
|
|
94
78
|
### `styles` — generate from a StyleSheet
|
|
95
79
|
|
|
@@ -161,8 +145,7 @@ Also exported: `withSkeleton`, `SkeletonIgnore`, `StyleSkeleton`, the primitives
|
|
|
161
145
|
|
|
162
146
|
## Requirements
|
|
163
147
|
|
|
164
|
-
- React Native
|
|
165
|
-
`experimental_backgroundImage` gradient needs it)
|
|
148
|
+
- React Native (Fabric / New Architecture recommended)
|
|
166
149
|
- `react-native-reanimated` ≥ 3
|
|
167
150
|
- `react-reconciler` (optional, for `deep`) — must match your React version
|
|
168
151
|
|
|
@@ -8,7 +8,23 @@ var _react = _interopRequireWildcard(require("react"));
|
|
|
8
8
|
var _reactNative = require("react-native");
|
|
9
9
|
var _reactNativeReanimated = _interopRequireWildcard(require("react-native-reanimated"));
|
|
10
10
|
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
|
|
11
|
-
|
|
11
|
+
/**
|
|
12
|
+
* Pulse animation component using Reanimated 3
|
|
13
|
+
*
|
|
14
|
+
* Creates a subtle breathing/pulsing effect using:
|
|
15
|
+
* - Shared values for performance
|
|
16
|
+
* - Worklets for 60 FPS on UI thread
|
|
17
|
+
* - Opacity animation for pulse effect
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* ```tsx
|
|
21
|
+
* <PulseAnimation
|
|
22
|
+
* width={200}
|
|
23
|
+
* height={20}
|
|
24
|
+
* borderRadius={4}
|
|
25
|
+
* />
|
|
26
|
+
* ```
|
|
27
|
+
*/
|
|
12
28
|
function PulseAnimation({
|
|
13
29
|
width,
|
|
14
30
|
height,
|
|
@@ -18,16 +34,24 @@ function PulseAnimation({
|
|
|
18
34
|
style,
|
|
19
35
|
children
|
|
20
36
|
}) {
|
|
37
|
+
// Shared value for opacity (0 to 1)
|
|
21
38
|
const opacity = (0, _reactNativeReanimated.useSharedValue)(1);
|
|
22
39
|
(0, _react.useEffect)(() => {
|
|
40
|
+
// Start infinite pulse animation
|
|
41
|
+
// Sequence: fade out -> fade in
|
|
23
42
|
opacity.value = (0, _reactNativeReanimated.withRepeat)((0, _reactNativeReanimated.withSequence)((0, _reactNativeReanimated.withTiming)(0.5, {
|
|
24
43
|
duration: duration / 2,
|
|
25
44
|
easing: _reactNativeReanimated.Easing.inOut(_reactNativeReanimated.Easing.ease)
|
|
26
45
|
}), (0, _reactNativeReanimated.withTiming)(1, {
|
|
27
46
|
duration: duration / 2,
|
|
28
47
|
easing: _reactNativeReanimated.Easing.inOut(_reactNativeReanimated.Easing.ease)
|
|
29
|
-
})), -1,
|
|
48
|
+
})), -1,
|
|
49
|
+
// Infinite repeat
|
|
50
|
+
false // Don't reverse
|
|
51
|
+
);
|
|
30
52
|
}, [duration, opacity]);
|
|
53
|
+
|
|
54
|
+
// Animated style for pulse effect
|
|
31
55
|
const animatedStyle = (0, _reactNativeReanimated.useAnimatedStyle)(() => {
|
|
32
56
|
'worklet';
|
|
33
57
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_react","_interopRequireWildcard","require","_reactNative","_reactNativeReanimated","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","PulseAnimation","width","height","baseColor","duration","borderRadius","style","children","opacity","useSharedValue","useEffect","value","withRepeat","withSequence","withTiming","easing","Easing","inOut","ease","animatedStyle","useAnimatedStyle","createElement","View","styles","container","backgroundColor","StyleSheet","create","overflow"],"sourceRoot":"../../../src","sources":["animations/PulseAnimation.tsx"],"mappings":";;;;;;AAAA,IAAAA,MAAA,GAAAC,uBAAA,CAAAC,OAAA;AAEA,IAAAC,YAAA,GAAAD,OAAA;AACA,IAAAE,sBAAA,GAAAH,uBAAA,CAAAC,OAAA;AAOiC,SAAAD,wBAAAI,CAAA,EAAAC,CAAA,6BAAAC,OAAA,MAAAC,CAAA,OAAAD,OAAA,IAAAE,CAAA,OAAAF,OAAA,YAAAN,uBAAA,YAAAA,CAAAI,CAAA,EAAAC,CAAA,SAAAA,CAAA,IAAAD,CAAA,IAAAA,CAAA,CAAAK,UAAA,SAAAL,CAAA,MAAAM,CAAA,EAAAC,CAAA,EAAAC,CAAA,KAAAC,SAAA,QAAAC,OAAA,EAAAV,CAAA,iBAAAA,CAAA,uBAAAA,CAAA,yBAAAA,CAAA,SAAAQ,CAAA,MAAAF,CAAA,GAAAL,CAAA,GAAAG,CAAA,GAAAD,CAAA,QAAAG,CAAA,CAAAK,GAAA,CAAAX,CAAA,UAAAM,CAAA,CAAAM,GAAA,CAAAZ,CAAA,GAAAM,CAAA,CAAAO,GAAA,CAAAb,CAAA,EAAAQ,CAAA,gBAAAP,CAAA,IAAAD,CAAA,gBAAAC,CAAA,OAAAa,cAAA,CAAAC,IAAA,CAAAf,CAAA,EAAAC,CAAA,OAAAM,CAAA,IAAAD,CAAA,GAAAU,MAAA,CAAAC,cAAA,KAAAD,MAAA,CAAAE,wBAAA,CAAAlB,CAAA,EAAAC,CAAA,OAAAM,CAAA,CAAAK,GAAA,IAAAL,CAAA,CAAAM,GAAA,IAAAP,CAAA,CAAAE,CAAA,EAAAP,CAAA,EAAAM,CAAA,IAAAC,CAAA,CAAAP,CAAA,IAAAD,CAAA,CAAAC,CAAA,WAAAO,CAAA,KAAAR,CAAA,EAAAC,CAAA;
|
|
1
|
+
{"version":3,"names":["_react","_interopRequireWildcard","require","_reactNative","_reactNativeReanimated","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","PulseAnimation","width","height","baseColor","duration","borderRadius","style","children","opacity","useSharedValue","useEffect","value","withRepeat","withSequence","withTiming","easing","Easing","inOut","ease","animatedStyle","useAnimatedStyle","createElement","View","styles","container","backgroundColor","StyleSheet","create","overflow"],"sourceRoot":"../../../src","sources":["animations/PulseAnimation.tsx"],"mappings":"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","ignoreList":[]}
|
|
@@ -7,10 +7,25 @@ exports.ShimmerAnimation = ShimmerAnimation;
|
|
|
7
7
|
var _react = _interopRequireWildcard(require("react"));
|
|
8
8
|
var _reactNative = require("react-native");
|
|
9
9
|
var _reactNativeReanimated = _interopRequireWildcard(require("react-native-reanimated"));
|
|
10
|
+
var _reactNativeLinearGradient = require("react-native-linear-gradient");
|
|
10
11
|
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
12
|
+
/**
|
|
13
|
+
* Shimmer animation component using Reanimated 3
|
|
14
|
+
*
|
|
15
|
+
* Creates a smooth left-to-right shimmer effect using:
|
|
16
|
+
* - Shared values for performance
|
|
17
|
+
* - Worklets for 60 FPS on UI thread
|
|
18
|
+
* - Linear gradient for shimmer effect
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* ```tsx
|
|
22
|
+
* <ShimmerAnimation
|
|
23
|
+
* width={200}
|
|
24
|
+
* height={20}
|
|
25
|
+
* borderRadius={4}
|
|
26
|
+
* />
|
|
27
|
+
* ```
|
|
28
|
+
*/
|
|
14
29
|
function ShimmerAnimation({
|
|
15
30
|
width,
|
|
16
31
|
height,
|
|
@@ -21,37 +36,33 @@ function ShimmerAnimation({
|
|
|
21
36
|
style,
|
|
22
37
|
children
|
|
23
38
|
}) {
|
|
39
|
+
// Shared value for animation progress (0 to 1)
|
|
24
40
|
const progress = (0, _reactNativeReanimated.useSharedValue)(0);
|
|
25
|
-
const [measuredWidth, setMeasuredWidth] = (0, _react.useState)(0);
|
|
26
41
|
(0, _react.useEffect)(() => {
|
|
42
|
+
// Start infinite shimmer animation
|
|
27
43
|
progress.value = (0, _reactNativeReanimated.withRepeat)((0, _reactNativeReanimated.withTiming)(1, {
|
|
28
44
|
duration,
|
|
29
45
|
easing: _reactNativeReanimated.Easing.linear
|
|
30
|
-
}), -1,
|
|
46
|
+
}), -1,
|
|
47
|
+
// Infinite repeat
|
|
48
|
+
false // Don't reverse
|
|
49
|
+
);
|
|
31
50
|
}, [duration, progress]);
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
setMeasuredWidth(prev => prev === w ? prev : w);
|
|
35
|
-
};
|
|
36
|
-
const containerWidth = typeof width === 'number' ? width : measuredWidth;
|
|
51
|
+
|
|
52
|
+
// Animated style for shimmer overlay
|
|
37
53
|
const animatedStyle = (0, _reactNativeReanimated.useAnimatedStyle)(() => {
|
|
38
54
|
'worklet';
|
|
39
55
|
|
|
40
|
-
|
|
56
|
+
// Calculate shimmer position
|
|
57
|
+
// Interpolate from -100% to 100% to create left-to-right sweep
|
|
58
|
+
const translateX = (0, _reactNativeReanimated.interpolate)(progress.value, [0, 1], [-1, 1]);
|
|
41
59
|
return {
|
|
42
60
|
transform: [{
|
|
43
|
-
translateX
|
|
61
|
+
translateX: translateX * (typeof width === 'number' ? width : 200)
|
|
44
62
|
}]
|
|
45
63
|
};
|
|
46
|
-
}, [
|
|
47
|
-
|
|
48
|
-
// `experimental_backgroundImage` isn't in the ViewStyle types yet.
|
|
49
|
-
const gradientStyle = {
|
|
50
|
-
..._reactNative.StyleSheet.absoluteFillObject,
|
|
51
|
-
experimental_backgroundImage: `linear-gradient(to right, ${baseColor}, ${highlightColor}, ${baseColor})`
|
|
52
|
-
};
|
|
64
|
+
}, [width]);
|
|
53
65
|
return /*#__PURE__*/_react.default.createElement(_reactNative.View, {
|
|
54
|
-
onLayout: onLayout,
|
|
55
66
|
style: [styles.container, {
|
|
56
67
|
width,
|
|
57
68
|
height,
|
|
@@ -59,15 +70,34 @@ function ShimmerAnimation({
|
|
|
59
70
|
backgroundColor: baseColor
|
|
60
71
|
}, style]
|
|
61
72
|
}, /*#__PURE__*/_react.default.createElement(_reactNativeReanimated.default.View, {
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
}
|
|
73
|
+
style: [_reactNative.StyleSheet.absoluteFill, {
|
|
74
|
+
overflow: 'hidden',
|
|
75
|
+
borderRadius
|
|
76
|
+
}]
|
|
77
|
+
}, /*#__PURE__*/_react.default.createElement(_reactNativeReanimated.default.View, {
|
|
78
|
+
style: [styles.shimmer, {
|
|
79
|
+
width: typeof width === 'number' ? width : '100%',
|
|
80
|
+
height: '100%'
|
|
81
|
+
}, animatedStyle]
|
|
82
|
+
}, /*#__PURE__*/_react.default.createElement(_reactNativeLinearGradient.LinearGradient, {
|
|
83
|
+
colors: [baseColor, highlightColor, highlightColor, baseColor],
|
|
84
|
+
start: {
|
|
85
|
+
x: 0,
|
|
86
|
+
y: 0
|
|
87
|
+
},
|
|
88
|
+
end: {
|
|
89
|
+
x: 1,
|
|
90
|
+
y: 0
|
|
91
|
+
},
|
|
92
|
+
style: _reactNative.StyleSheet.absoluteFill
|
|
93
|
+
}))), children);
|
|
67
94
|
}
|
|
68
95
|
const styles = _reactNative.StyleSheet.create({
|
|
69
96
|
container: {
|
|
70
97
|
overflow: 'hidden'
|
|
98
|
+
},
|
|
99
|
+
shimmer: {
|
|
100
|
+
position: 'absolute'
|
|
71
101
|
}
|
|
72
102
|
});
|
|
73
103
|
//# sourceMappingURL=ShimmerAnimation.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_react","_interopRequireWildcard","require","_reactNative","_reactNativeReanimated","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","ShimmerAnimation","width","height","baseColor","highlightColor","duration","borderRadius","style","children","progress","useSharedValue","
|
|
1
|
+
{"version":3,"names":["_react","_interopRequireWildcard","require","_reactNative","_reactNativeReanimated","_reactNativeLinearGradient","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","ShimmerAnimation","width","height","baseColor","highlightColor","duration","borderRadius","style","children","progress","useSharedValue","useEffect","value","withRepeat","withTiming","easing","Easing","linear","animatedStyle","useAnimatedStyle","translateX","interpolate","transform","createElement","View","styles","container","backgroundColor","StyleSheet","absoluteFill","overflow","shimmer","LinearGradient","colors","start","x","y","end","create","position"],"sourceRoot":"../../../src","sources":["animations/ShimmerAnimation.tsx"],"mappings":"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","ignoreList":[]}
|
|
@@ -9,7 +9,7 @@ var _parser = require("../core/parser");
|
|
|
9
9
|
var _SkeletonRenderer = require("./SkeletonRenderer");
|
|
10
10
|
var _SkeletonIgnore = require("./SkeletonIgnore");
|
|
11
11
|
var _StyleSkeleton = require("../core/generator/StyleSkeleton");
|
|
12
|
-
var
|
|
12
|
+
var _expandOffline = require("../core/parser/expandOffline");
|
|
13
13
|
var _defaults = require("../constants/defaults");
|
|
14
14
|
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
|
|
15
15
|
/**
|
|
@@ -66,21 +66,15 @@ function Skeleton({
|
|
|
66
66
|
console.log('[Skelo] Parsing component tree...');
|
|
67
67
|
}
|
|
68
68
|
try {
|
|
69
|
-
// Deep mode: expand opaque components into their real host tree
|
|
70
|
-
//
|
|
71
|
-
// Falls back to static parsing if unavailable or it returns nothing.
|
|
69
|
+
// Deep mode: expand opaque components into their real host tree by
|
|
70
|
+
// rendering them offline. Falls back to static parsing on failure.
|
|
72
71
|
if (deep) {
|
|
73
|
-
const
|
|
74
|
-
if (
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
if (__DEV__) {
|
|
80
|
-
console.warn('[Skelo] deep expansion returned nothing; falling back to static parsing.');
|
|
81
|
-
}
|
|
82
|
-
} else if (__DEV__) {
|
|
83
|
-
console.warn("[Skelo] `deep` requires react-reconciler. Install it and add `import 'react-native-skelo/deep';` in your app entry.");
|
|
72
|
+
const expanded = (0, _expandOffline.expandToComponentNodes)(/*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, children));
|
|
73
|
+
if (expanded && expanded.length > 0) {
|
|
74
|
+
return expanded;
|
|
75
|
+
}
|
|
76
|
+
if (__DEV__) {
|
|
77
|
+
console.warn('[Skelo] deep expansion returned nothing; falling back to static parsing.');
|
|
84
78
|
}
|
|
85
79
|
}
|
|
86
80
|
const parsed = _parser.Parser.parse(children);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_react","_interopRequireWildcard","require","_parser","_SkeletonRenderer","_SkeletonIgnore","_StyleSkeleton","
|
|
1
|
+
{"version":3,"names":["_react","_interopRequireWildcard","require","_parser","_SkeletonRenderer","_SkeletonIgnore","_StyleSkeleton","_expandOffline","_defaults","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","Skeleton","loading","children","styles","excludeStyles","deep","animation","DEFAULT_CONFIG","duration","baseColor","highlightColor","borderRadius","accessible","accessibilityLabel","debug","skeletonTree","useMemo","__DEV__","console","log","expanded","expandToComponentNodes","createElement","Fragment","length","warn","parsed","Parser","parse","summarize","nodes","map","node","type","style","JSON","stringify","error","config","StyleSkeleton","exclude","SkeletonRenderer","tree","displayName","Ignore","SkeletonIgnore"],"sourceRoot":"../../../src","sources":["components/Skeleton.tsx"],"mappings":"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","ignoreList":[]}
|
|
@@ -1,7 +1,23 @@
|
|
|
1
1
|
import React, { useEffect } from 'react';
|
|
2
2
|
import { StyleSheet } from 'react-native';
|
|
3
3
|
import Animated, { useSharedValue, useAnimatedStyle, withRepeat, withSequence, withTiming, Easing } from 'react-native-reanimated';
|
|
4
|
-
|
|
4
|
+
/**
|
|
5
|
+
* Pulse animation component using Reanimated 3
|
|
6
|
+
*
|
|
7
|
+
* Creates a subtle breathing/pulsing effect using:
|
|
8
|
+
* - Shared values for performance
|
|
9
|
+
* - Worklets for 60 FPS on UI thread
|
|
10
|
+
* - Opacity animation for pulse effect
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* ```tsx
|
|
14
|
+
* <PulseAnimation
|
|
15
|
+
* width={200}
|
|
16
|
+
* height={20}
|
|
17
|
+
* borderRadius={4}
|
|
18
|
+
* />
|
|
19
|
+
* ```
|
|
20
|
+
*/
|
|
5
21
|
export function PulseAnimation({
|
|
6
22
|
width,
|
|
7
23
|
height,
|
|
@@ -11,16 +27,24 @@ export function PulseAnimation({
|
|
|
11
27
|
style,
|
|
12
28
|
children
|
|
13
29
|
}) {
|
|
30
|
+
// Shared value for opacity (0 to 1)
|
|
14
31
|
const opacity = useSharedValue(1);
|
|
15
32
|
useEffect(() => {
|
|
33
|
+
// Start infinite pulse animation
|
|
34
|
+
// Sequence: fade out -> fade in
|
|
16
35
|
opacity.value = withRepeat(withSequence(withTiming(0.5, {
|
|
17
36
|
duration: duration / 2,
|
|
18
37
|
easing: Easing.inOut(Easing.ease)
|
|
19
38
|
}), withTiming(1, {
|
|
20
39
|
duration: duration / 2,
|
|
21
40
|
easing: Easing.inOut(Easing.ease)
|
|
22
|
-
})), -1,
|
|
41
|
+
})), -1,
|
|
42
|
+
// Infinite repeat
|
|
43
|
+
false // Don't reverse
|
|
44
|
+
);
|
|
23
45
|
}, [duration, opacity]);
|
|
46
|
+
|
|
47
|
+
// Animated style for pulse effect
|
|
24
48
|
const animatedStyle = useAnimatedStyle(() => {
|
|
25
49
|
'worklet';
|
|
26
50
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["React","useEffect","StyleSheet","Animated","useSharedValue","useAnimatedStyle","withRepeat","withSequence","withTiming","Easing","PulseAnimation","width","height","baseColor","duration","borderRadius","style","children","opacity","value","easing","inOut","ease","animatedStyle","createElement","View","styles","container","backgroundColor","create","overflow"],"sourceRoot":"../../../src","sources":["animations/PulseAnimation.tsx"],"mappings":"AAAA,OAAOA,KAAK,IAAIC,SAAS,QAAQ,OAAO;AAExC,SAASC,UAAU,QAAQ,cAAc;AACzC,OAAOC,QAAQ,IACbC,cAAc,EACdC,gBAAgB,EAChBC,UAAU,EACVC,YAAY,EACZC,UAAU,EACVC,MAAM,QACD,yBAAyB;
|
|
1
|
+
{"version":3,"names":["React","useEffect","StyleSheet","Animated","useSharedValue","useAnimatedStyle","withRepeat","withSequence","withTiming","Easing","PulseAnimation","width","height","baseColor","duration","borderRadius","style","children","opacity","value","easing","inOut","ease","animatedStyle","createElement","View","styles","container","backgroundColor","create","overflow"],"sourceRoot":"../../../src","sources":["animations/PulseAnimation.tsx"],"mappings":"AAAA,OAAOA,KAAK,IAAIC,SAAS,QAAQ,OAAO;AAExC,SAASC,UAAU,QAAQ,cAAc;AACzC,OAAOC,QAAQ,IACbC,cAAc,EACdC,gBAAgB,EAChBC,UAAU,EACVC,YAAY,EACZC,UAAU,EACVC,MAAM,QACD,yBAAyB;AA+ChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,cAAcA,CAAC;EAC7BC,KAAK;EACLC,MAAM;EACNC,SAAS,GAAG,SAAS;EACrBC,QAAQ,GAAG,IAAI;EACfC,YAAY,GAAG,CAAC;EAChBC,KAAK;EACLC;AACU,CAAC,EAAE;EACb;EACA,MAAMC,OAAO,GAAGd,cAAc,CAAC,CAAC,CAAC;EAEjCH,SAAS,CAAC,MAAM;IACd;IACA;IACAiB,OAAO,CAACC,KAAK,GAAGb,UAAU,CACxBC,YAAY,CACVC,UAAU,CAAC,GAAG,EAAE;MACdM,QAAQ,EAAEA,QAAQ,GAAG,CAAC;MACtBM,MAAM,EAAEX,MAAM,CAACY,KAAK,CAACZ,MAAM,CAACa,IAAI;IAClC,CAAC,CAAC,EACFd,UAAU,CAAC,CAAC,EAAE;MACZM,QAAQ,EAAEA,QAAQ,GAAG,CAAC;MACtBM,MAAM,EAAEX,MAAM,CAACY,KAAK,CAACZ,MAAM,CAACa,IAAI;IAClC,CAAC,CACH,CAAC,EACD,CAAC,CAAC;IAAE;IACJ,KAAK,CAAC;IACR,CAAC;EACH,CAAC,EAAE,CAACR,QAAQ,EAAEI,OAAO,CAAC,CAAC;;EAEvB;EACA,MAAMK,aAAa,GAAGlB,gBAAgB,CAAC,MAAM;IAC3C,SAAS;;IAET,OAAO;MACLa,OAAO,EAAEA,OAAO,CAACC;IACnB,CAAC;EACH,CAAC,EAAE,EAAE,CAAC;EAEN,oBACEnB,KAAA,CAAAwB,aAAA,CAACrB,QAAQ,CAACsB,IAAI;IACZT,KAAK,EAAE,CACLU,MAAM,CAACC,SAAS,EAChB;MACEhB,KAAK;MACLC,MAAM;MACNG,YAAY;MACZa,eAAe,EAAEf;IACnB,CAAC,EACDU,aAAa,EACbP,KAAK;EACL,GAEDC,QACY,CAAC;AAEpB;AAEA,MAAMS,MAAM,GAAGxB,UAAU,CAAC2B,MAAM,CAAC;EAC/BF,SAAS,EAAE;IACTG,QAAQ,EAAE;EACZ;AACF,CAAC,CAAC","ignoreList":[]}
|
|
@@ -1,9 +1,24 @@
|
|
|
1
|
-
import React, { useEffect
|
|
1
|
+
import React, { useEffect } from 'react';
|
|
2
2
|
import { StyleSheet, View } from 'react-native';
|
|
3
3
|
import Animated, { useSharedValue, useAnimatedStyle, withRepeat, withTiming, interpolate, Easing } from 'react-native-reanimated';
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
4
|
+
import { LinearGradient } from 'react-native-linear-gradient';
|
|
5
|
+
/**
|
|
6
|
+
* Shimmer animation component using Reanimated 3
|
|
7
|
+
*
|
|
8
|
+
* Creates a smooth left-to-right shimmer effect using:
|
|
9
|
+
* - Shared values for performance
|
|
10
|
+
* - Worklets for 60 FPS on UI thread
|
|
11
|
+
* - Linear gradient for shimmer effect
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* ```tsx
|
|
15
|
+
* <ShimmerAnimation
|
|
16
|
+
* width={200}
|
|
17
|
+
* height={20}
|
|
18
|
+
* borderRadius={4}
|
|
19
|
+
* />
|
|
20
|
+
* ```
|
|
21
|
+
*/
|
|
7
22
|
export function ShimmerAnimation({
|
|
8
23
|
width,
|
|
9
24
|
height,
|
|
@@ -14,37 +29,33 @@ export function ShimmerAnimation({
|
|
|
14
29
|
style,
|
|
15
30
|
children
|
|
16
31
|
}) {
|
|
32
|
+
// Shared value for animation progress (0 to 1)
|
|
17
33
|
const progress = useSharedValue(0);
|
|
18
|
-
const [measuredWidth, setMeasuredWidth] = useState(0);
|
|
19
34
|
useEffect(() => {
|
|
35
|
+
// Start infinite shimmer animation
|
|
20
36
|
progress.value = withRepeat(withTiming(1, {
|
|
21
37
|
duration,
|
|
22
38
|
easing: Easing.linear
|
|
23
|
-
}), -1,
|
|
39
|
+
}), -1,
|
|
40
|
+
// Infinite repeat
|
|
41
|
+
false // Don't reverse
|
|
42
|
+
);
|
|
24
43
|
}, [duration, progress]);
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
setMeasuredWidth(prev => prev === w ? prev : w);
|
|
28
|
-
};
|
|
29
|
-
const containerWidth = typeof width === 'number' ? width : measuredWidth;
|
|
44
|
+
|
|
45
|
+
// Animated style for shimmer overlay
|
|
30
46
|
const animatedStyle = useAnimatedStyle(() => {
|
|
31
47
|
'worklet';
|
|
32
48
|
|
|
33
|
-
|
|
49
|
+
// Calculate shimmer position
|
|
50
|
+
// Interpolate from -100% to 100% to create left-to-right sweep
|
|
51
|
+
const translateX = interpolate(progress.value, [0, 1], [-1, 1]);
|
|
34
52
|
return {
|
|
35
53
|
transform: [{
|
|
36
|
-
translateX
|
|
54
|
+
translateX: translateX * (typeof width === 'number' ? width : 200)
|
|
37
55
|
}]
|
|
38
56
|
};
|
|
39
|
-
}, [
|
|
40
|
-
|
|
41
|
-
// `experimental_backgroundImage` isn't in the ViewStyle types yet.
|
|
42
|
-
const gradientStyle = {
|
|
43
|
-
...StyleSheet.absoluteFillObject,
|
|
44
|
-
experimental_backgroundImage: `linear-gradient(to right, ${baseColor}, ${highlightColor}, ${baseColor})`
|
|
45
|
-
};
|
|
57
|
+
}, [width]);
|
|
46
58
|
return /*#__PURE__*/React.createElement(View, {
|
|
47
|
-
onLayout: onLayout,
|
|
48
59
|
style: [styles.container, {
|
|
49
60
|
width,
|
|
50
61
|
height,
|
|
@@ -52,15 +63,34 @@ export function ShimmerAnimation({
|
|
|
52
63
|
backgroundColor: baseColor
|
|
53
64
|
}, style]
|
|
54
65
|
}, /*#__PURE__*/React.createElement(Animated.View, {
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
}
|
|
66
|
+
style: [StyleSheet.absoluteFill, {
|
|
67
|
+
overflow: 'hidden',
|
|
68
|
+
borderRadius
|
|
69
|
+
}]
|
|
70
|
+
}, /*#__PURE__*/React.createElement(Animated.View, {
|
|
71
|
+
style: [styles.shimmer, {
|
|
72
|
+
width: typeof width === 'number' ? width : '100%',
|
|
73
|
+
height: '100%'
|
|
74
|
+
}, animatedStyle]
|
|
75
|
+
}, /*#__PURE__*/React.createElement(LinearGradient, {
|
|
76
|
+
colors: [baseColor, highlightColor, highlightColor, baseColor],
|
|
77
|
+
start: {
|
|
78
|
+
x: 0,
|
|
79
|
+
y: 0
|
|
80
|
+
},
|
|
81
|
+
end: {
|
|
82
|
+
x: 1,
|
|
83
|
+
y: 0
|
|
84
|
+
},
|
|
85
|
+
style: StyleSheet.absoluteFill
|
|
86
|
+
}))), children);
|
|
60
87
|
}
|
|
61
88
|
const styles = StyleSheet.create({
|
|
62
89
|
container: {
|
|
63
90
|
overflow: 'hidden'
|
|
91
|
+
},
|
|
92
|
+
shimmer: {
|
|
93
|
+
position: 'absolute'
|
|
64
94
|
}
|
|
65
95
|
});
|
|
66
96
|
//# sourceMappingURL=ShimmerAnimation.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["React","useEffect","
|
|
1
|
+
{"version":3,"names":["React","useEffect","StyleSheet","View","Animated","useSharedValue","useAnimatedStyle","withRepeat","withTiming","interpolate","Easing","LinearGradient","ShimmerAnimation","width","height","baseColor","highlightColor","duration","borderRadius","style","children","progress","value","easing","linear","animatedStyle","translateX","transform","createElement","styles","container","backgroundColor","absoluteFill","overflow","shimmer","colors","start","x","y","end","create","position"],"sourceRoot":"../../../src","sources":["animations/ShimmerAnimation.tsx"],"mappings":"AAAA,OAAOA,KAAK,IAAIC,SAAS,QAAQ,OAAO;AAExC,SAASC,UAAU,EAAEC,IAAI,QAAQ,cAAc;AAC/C,OAAOC,QAAQ,IACbC,cAAc,EACdC,gBAAgB,EAChBC,UAAU,EACVC,UAAU,EACVC,WAAW,EACXC,MAAM,QACD,yBAAyB;AAChC,SAASC,cAAc,QAAQ,8BAA8B;AA+C7D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,gBAAgBA,CAAC;EAC/BC,KAAK;EACLC,MAAM;EACNC,SAAS,GAAG,SAAS;EACrBC,cAAc,GAAG,SAAS;EAC1BC,QAAQ,GAAG,IAAI;EACfC,YAAY,GAAG,CAAC;EAChBC,KAAK;EACLC;AACY,CAAC,EAAE;EACf;EACA,MAAMC,QAAQ,GAAGhB,cAAc,CAAC,CAAC,CAAC;EAElCJ,SAAS,CAAC,MAAM;IACd;IACAoB,QAAQ,CAACC,KAAK,GAAGf,UAAU,CACzBC,UAAU,CAAC,CAAC,EAAE;MACZS,QAAQ;MACRM,MAAM,EAAEb,MAAM,CAACc;IACjB,CAAC,CAAC,EACF,CAAC,CAAC;IAAE;IACJ,KAAK,CAAC;IACR,CAAC;EACH,CAAC,EAAE,CAACP,QAAQ,EAAEI,QAAQ,CAAC,CAAC;;EAExB;EACA,MAAMI,aAAa,GAAGnB,gBAAgB,CAAC,MAAM;IAC3C,SAAS;;IAET;IACA;IACA,MAAMoB,UAAU,GAAGjB,WAAW,CAACY,QAAQ,CAACC,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAE/D,OAAO;MACLK,SAAS,EAAE,CAAC;QAAED,UAAU,EAAEA,UAAU,IAAI,OAAOb,KAAK,KAAK,QAAQ,GAAGA,KAAK,GAAG,GAAG;MAAE,CAAC;IACpF,CAAC;EACH,CAAC,EAAE,CAACA,KAAK,CAAC,CAAC;EAEX,oBACEb,KAAA,CAAA4B,aAAA,CAACzB,IAAI;IACHgB,KAAK,EAAE,CACLU,MAAM,CAACC,SAAS,EAChB;MACEjB,KAAK;MACLC,MAAM;MACNI,YAAY;MACZa,eAAe,EAAEhB;IACnB,CAAC,EACDI,KAAK;EACL,gBAGFnB,KAAA,CAAA4B,aAAA,CAACxB,QAAQ,CAACD,IAAI;IACZgB,KAAK,EAAE,CACLjB,UAAU,CAAC8B,YAAY,EACvB;MACEC,QAAQ,EAAE,QAAQ;MAClBf;IACF,CAAC;EACD,gBAEFlB,KAAA,CAAA4B,aAAA,CAACxB,QAAQ,CAACD,IAAI;IACZgB,KAAK,EAAE,CACLU,MAAM,CAACK,OAAO,EACd;MACErB,KAAK,EAAE,OAAOA,KAAK,KAAK,QAAQ,GAAGA,KAAK,GAAG,MAAM;MACjDC,MAAM,EAAE;IACV,CAAC,EACDW,aAAa;EACb,gBAEFzB,KAAA,CAAA4B,aAAA,CAACjB,cAAc;IACbwB,MAAM,EAAE,CAACpB,SAAS,EAAEC,cAAc,EAAEA,cAAc,EAAED,SAAS,CAAE;IAC/DqB,KAAK,EAAE;MAAEC,CAAC,EAAE,CAAC;MAAEC,CAAC,EAAE;IAAE,CAAE;IACtBC,GAAG,EAAE;MAAEF,CAAC,EAAE,CAAC;MAAEC,CAAC,EAAE;IAAE,CAAE;IACpBnB,KAAK,EAAEjB,UAAU,CAAC8B;EAAa,CAChC,CACY,CACF,CAAC,EAGfZ,QACG,CAAC;AAEX;AAEA,MAAMS,MAAM,GAAG3B,UAAU,CAACsC,MAAM,CAAC;EAC/BV,SAAS,EAAE;IACTG,QAAQ,EAAE;EACZ,CAAC;EACDC,OAAO,EAAE;IACPO,QAAQ,EAAE;EACZ;AACF,CAAC,CAAC","ignoreList":[]}
|
|
@@ -3,7 +3,7 @@ import { Parser } from '../core/parser';
|
|
|
3
3
|
import { SkeletonRenderer } from './SkeletonRenderer';
|
|
4
4
|
import { SkeletonIgnore } from './SkeletonIgnore';
|
|
5
5
|
import { StyleSkeleton } from '../core/generator/StyleSkeleton';
|
|
6
|
-
import {
|
|
6
|
+
import { expandToComponentNodes } from '../core/parser/expandOffline';
|
|
7
7
|
import { DEFAULT_CONFIG } from '../constants/defaults';
|
|
8
8
|
|
|
9
9
|
/**
|
|
@@ -60,21 +60,15 @@ export function Skeleton({
|
|
|
60
60
|
console.log('[Skelo] Parsing component tree...');
|
|
61
61
|
}
|
|
62
62
|
try {
|
|
63
|
-
// Deep mode: expand opaque components into their real host tree
|
|
64
|
-
//
|
|
65
|
-
// Falls back to static parsing if unavailable or it returns nothing.
|
|
63
|
+
// Deep mode: expand opaque components into their real host tree by
|
|
64
|
+
// rendering them offline. Falls back to static parsing on failure.
|
|
66
65
|
if (deep) {
|
|
67
|
-
const
|
|
68
|
-
if (
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
if (__DEV__) {
|
|
74
|
-
console.warn('[Skelo] deep expansion returned nothing; falling back to static parsing.');
|
|
75
|
-
}
|
|
76
|
-
} else if (__DEV__) {
|
|
77
|
-
console.warn("[Skelo] `deep` requires react-reconciler. Install it and add `import 'react-native-skelo/deep';` in your app entry.");
|
|
66
|
+
const expanded = expandToComponentNodes(/*#__PURE__*/React.createElement(React.Fragment, null, children));
|
|
67
|
+
if (expanded && expanded.length > 0) {
|
|
68
|
+
return expanded;
|
|
69
|
+
}
|
|
70
|
+
if (__DEV__) {
|
|
71
|
+
console.warn('[Skelo] deep expansion returned nothing; falling back to static parsing.');
|
|
78
72
|
}
|
|
79
73
|
}
|
|
80
74
|
const parsed = Parser.parse(children);
|