react-native-skelo 0.0.3 โ 0.0.5
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/README.md +86 -92
- package/lib/commonjs/animations/PulseAnimation.js +17 -18
- package/lib/commonjs/animations/PulseAnimation.js.map +1 -1
- package/lib/commonjs/animations/ShimmerAnimation.js +47 -28
- package/lib/commonjs/animations/ShimmerAnimation.js.map +1 -1
- package/lib/commonjs/components/Skeleton.js +22 -16
- package/lib/commonjs/components/Skeleton.js.map +1 -1
- package/lib/commonjs/core/parser/expandLists.js +67 -0
- package/lib/commonjs/core/parser/expandLists.js.map +1 -0
- package/lib/commonjs/index.js +1 -0
- package/lib/commonjs/index.js.map +1 -1
- package/lib/module/animations/PulseAnimation.js +18 -19
- package/lib/module/animations/PulseAnimation.js.map +1 -1
- package/lib/module/animations/ShimmerAnimation.js +48 -29
- package/lib/module/animations/ShimmerAnimation.js.map +1 -1
- package/lib/module/components/Skeleton.js +22 -16
- package/lib/module/components/Skeleton.js.map +1 -1
- package/lib/module/core/parser/expandLists.js +61 -0
- package/lib/module/core/parser/expandLists.js.map +1 -0
- package/lib/module/index.js +4 -0
- package/lib/module/index.js.map +1 -1
- package/lib/typescript/animations/PulseAnimation.d.ts.map +1 -1
- package/lib/typescript/animations/ShimmerAnimation.d.ts.map +1 -1
- package/lib/typescript/components/Skeleton.d.ts +1 -1
- package/lib/typescript/components/Skeleton.d.ts.map +1 -1
- package/lib/typescript/core/parser/expandLists.d.ts +3 -0
- package/lib/typescript/core/parser/expandLists.d.ts.map +1 -0
- package/lib/typescript/index.d.ts +1 -0
- package/lib/typescript/index.d.ts.map +1 -1
- package/lib/typescript/types/skeleton.d.ts +8 -0
- package/lib/typescript/types/skeleton.d.ts.map +1 -1
- package/package.json +5 -10
- package/src/animations/PulseAnimation.tsx +17 -27
- package/src/animations/ShimmerAnimation.tsx +36 -47
- package/src/components/Skeleton.tsx +24 -18
- package/src/core/parser/expandLists.tsx +77 -0
- package/src/index.ts +4 -0
- package/src/types/skeleton.ts +9 -0
package/README.md
CHANGED
|
@@ -1,135 +1,121 @@
|
|
|
1
1
|
<div align="center">
|
|
2
2
|
|
|
3
|
-
# react-native-skelo
|
|
3
|
+
# ๐ฆด react-native-skelo
|
|
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)
|
|
8
|
-
[](https://www.npmjs.com/package/react-native-skelo)
|
|
8
|
+
[](https://www.npmjs.com/package/react-native-skelo)
|
|
9
|
+
[](./LICENSE)
|
|
10
|
+
[](https://github.com/shubhanshubb/react-native-skelo)
|
|
11
|
+
|
|
12
|
+
<br />
|
|
13
|
+
|
|
14
|
+
<img src="./assets/demo.gif" alt="Skelo skeleton demo" width="270" />
|
|
15
|
+
|
|
16
|
+
<img src="./assets/grid.gif" alt="Image-grid skeleton" width="270" />
|
|
9
17
|
|
|
10
18
|
</div>
|
|
11
19
|
|
|
12
|
-
|
|
20
|
+
<br />
|
|
13
21
|
|
|
14
|
-
|
|
22
|
+
**Stop building and maintaining a second copy of your UI just for loading states.** Wrap your components in `<Skeleton>` and Skelo generates a matching skeleton โ sized from the styles you already wrote.
|
|
15
23
|
|
|
16
24
|
```tsx
|
|
17
|
-
import { Skeleton } from 'react-native-skelo';
|
|
18
|
-
|
|
19
25
|
<Skeleton loading={isLoading}>
|
|
20
|
-
<
|
|
21
|
-
<Image style={styles.avatar} />
|
|
22
|
-
<Text style={styles.name}>{user.name}</Text>
|
|
23
|
-
</View>
|
|
26
|
+
<ProfileCard user={user} />
|
|
24
27
|
</Skeleton>
|
|
25
28
|
```
|
|
26
29
|
|
|
27
|
-
|
|
30
|
+
That's the whole API. No skeleton screens to hand-draw, no keeping two layouts in sync.
|
|
28
31
|
|
|
29
|
-
|
|
32
|
+
> โ ๏ธ **Pre-release (`0.0.x`)** โ evolving fast; the API may change before the stable `0.1.0`.
|
|
30
33
|
|
|
31
|
-
|
|
32
|
-
npm install react-native-skelo react-native-reanimated
|
|
33
|
-
```
|
|
34
|
+
---
|
|
34
35
|
|
|
35
|
-
|
|
36
|
-
React Native's built-in `experimental_backgroundImage` gradient (New
|
|
37
|
-
Architecture) โ no gradient library required.
|
|
36
|
+
## โจ Features
|
|
38
37
|
|
|
39
|
-
|
|
38
|
+
- ๐ช **Zero-config** โ wrap a component, get a skeleton. No setup, no separate loading screen.
|
|
39
|
+
- ๐ง **Sees inside your components** โ introspects custom components automatically (no inlining).
|
|
40
|
+
- ๐ **Lists included** โ `FlatList` / `SectionList` render skeleton rows while data loads.
|
|
41
|
+
- ๐จ **Shimmer ยท Pulse ยท None** โ built-in animations on the native driver.
|
|
42
|
+
- ๐ชถ **No dependencies** โ no `reanimated`, no gradient library. Just `react` + `react-native`.
|
|
43
|
+
- ๐ **Style-aware** โ every skeleton is sized from your real element styles.
|
|
40
44
|
|
|
41
|
-
|
|
42
|
-
use. Install `react-reconciler` (matching your React version) and import the
|
|
43
|
-
deep entry **once** in your app's entry file:
|
|
45
|
+
---
|
|
44
46
|
|
|
45
|
-
|
|
46
|
-
# React 19:
|
|
47
|
-
npm install react-reconciler@0.31.0
|
|
48
|
-
# React 18:
|
|
49
|
-
npm install react-reconciler@0.29.2
|
|
50
|
-
```
|
|
47
|
+
## ๐ฆ Installation
|
|
51
48
|
|
|
52
|
-
```
|
|
53
|
-
|
|
54
|
-
import 'react-native-skelo/deep';
|
|
49
|
+
```bash
|
|
50
|
+
npm install react-native-skelo
|
|
55
51
|
```
|
|
56
52
|
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
## Usage
|
|
60
|
-
|
|
61
|
-
### Basic โ inline host elements
|
|
62
|
-
|
|
63
|
-
Skelo traverses the `View` / `Text` / `Image` tree you pass and mirrors it:
|
|
53
|
+
**That's it โ no other dependencies.** Everything (including custom-component introspection) works out of the box.
|
|
64
54
|
|
|
65
|
-
|
|
66
|
-
<Skeleton loading={loading} animation="shimmer">
|
|
67
|
-
<View style={styles.row}>
|
|
68
|
-
<Image style={styles.avatar} /> {/* โ circle / box */}
|
|
69
|
-
<Text style={styles.title}>Title</Text> {/* โ text bar */}
|
|
70
|
-
</View>
|
|
71
|
-
</Skeleton>
|
|
72
|
-
```
|
|
55
|
+
> React 18 apps: add `"react-reconciler": "0.29.x"` to your deps (Skelo ships targeting React 19's `0.31`).
|
|
73
56
|
|
|
74
|
-
|
|
57
|
+
---
|
|
75
58
|
|
|
76
|
-
|
|
59
|
+
## ๐ Usage
|
|
77
60
|
|
|
78
|
-
|
|
61
|
+
### Just wrap it
|
|
79
62
|
|
|
80
63
|
```tsx
|
|
81
|
-
import { Skeleton
|
|
82
|
-
|
|
83
|
-
<Skeleton loading={loading} deep>
|
|
84
|
-
<ProfileScreen />
|
|
85
|
-
</Skeleton>
|
|
64
|
+
import { Skeleton } from 'react-native-skelo';
|
|
86
65
|
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
<
|
|
66
|
+
function Screen({ loading, user }) {
|
|
67
|
+
return (
|
|
68
|
+
<Skeleton loading={loading} animation="shimmer">
|
|
69
|
+
<ProfileCard user={user} />
|
|
70
|
+
</Skeleton>
|
|
71
|
+
);
|
|
72
|
+
}
|
|
90
73
|
```
|
|
91
74
|
|
|
92
|
-
|
|
75
|
+
Skelo renders `ProfileCard`, reads its real `View`/`Text`/`Image` tree + styles, and draws a matching skeleton while `loading` is `true`. When it's `false`, your real UI renders.
|
|
93
76
|
|
|
94
|
-
###
|
|
77
|
+
### Lists
|
|
95
78
|
|
|
96
|
-
|
|
79
|
+
Wrap a `FlatList` โ Skelo fills it with skeleton rows while the data loads:
|
|
97
80
|
|
|
98
81
|
```tsx
|
|
99
|
-
<Skeleton loading={loading}
|
|
82
|
+
<Skeleton loading={loading} count={6}>
|
|
83
|
+
<FlatList data={items} renderItem={renderItem} />
|
|
84
|
+
</Skeleton>
|
|
100
85
|
```
|
|
101
86
|
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
### `Skeleton.Ignore` โ keep something visible
|
|
87
|
+
### Keep something visible
|
|
105
88
|
|
|
106
89
|
```tsx
|
|
107
90
|
<Skeleton loading={loading}>
|
|
108
91
|
<Skeleton.Ignore>
|
|
109
|
-
<Text style={styles.heading}>Profile</Text>
|
|
92
|
+
<Text style={styles.heading}>Profile</Text> {/* stays real */}
|
|
110
93
|
</Skeleton.Ignore>
|
|
111
94
|
<ProfileBody />
|
|
112
95
|
</Skeleton>
|
|
113
96
|
```
|
|
114
97
|
|
|
115
|
-
###
|
|
98
|
+
### Generate from a StyleSheet
|
|
99
|
+
|
|
100
|
+
```tsx
|
|
101
|
+
<Skeleton loading={loading} styles={styles} excludeStyles={['container']} />
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
### Custom skeleton for a component
|
|
116
105
|
|
|
117
106
|
```tsx
|
|
118
107
|
import { Skelo } from 'react-native-skelo';
|
|
119
|
-
import { Avatar } from 'my-design-system';
|
|
120
108
|
|
|
121
109
|
Skelo.register({
|
|
122
110
|
name: 'Avatar',
|
|
123
111
|
component: Avatar,
|
|
124
|
-
strategy: (props, { primitives }) =>
|
|
125
|
-
<primitives.Circle size={props.size ?? 40} />
|
|
126
|
-
),
|
|
112
|
+
strategy: (props, { primitives }) => <primitives.Circle size={props.size ?? 40} />,
|
|
127
113
|
});
|
|
128
114
|
```
|
|
129
115
|
|
|
130
|
-
|
|
116
|
+
---
|
|
131
117
|
|
|
132
|
-
|
|
118
|
+
## โ๏ธ `<Skeleton>` props
|
|
133
119
|
|
|
134
120
|
| Prop | Type | Default | Description |
|
|
135
121
|
|---|---|---|---|
|
|
@@ -138,34 +124,42 @@ Skelo.register({
|
|
|
138
124
|
| `duration` | `number` | `1200` | Animation duration (ms) |
|
|
139
125
|
| `baseColor` / `highlightColor` | `string` | theme | Skeleton colors |
|
|
140
126
|
| `borderRadius` | `number` | `4` | Default corner radius |
|
|
141
|
-
| `
|
|
127
|
+
| `count` | `number` | `6` | Placeholder rows for a `FlatList`/`SectionList` |
|
|
128
|
+
| `deep` | `boolean` | auto | Force component introspection on/off (auto when available) |
|
|
142
129
|
| `styles` | `StyleSheet \| style[]` | โ | Generate from styles instead of children |
|
|
143
|
-
| `excludeStyles` | `string[]` | โ | Style keys to skip in `styles` mode |
|
|
144
130
|
| `accessibilityLabel` | `string` | `'Loading content'` | Screen-reader label |
|
|
145
131
|
|
|
146
|
-
Also exported: `withSkeleton`, `SkeletonIgnore`, `StyleSkeleton`, the primitives (`SkeletonBox`, `SkeletonText`, `SkeletonImage`, `SkeletonCircle`), and `Skelo` (
|
|
132
|
+
Also exported: `withSkeleton`, `SkeletonIgnore`, `StyleSkeleton`, the primitives (`SkeletonBox`, `SkeletonText`, `SkeletonImage`, `SkeletonCircle`), and `Skelo` (`register` / `fromStyles`).
|
|
133
|
+
|
|
134
|
+
---
|
|
135
|
+
|
|
136
|
+
## ๐งฉ How it works
|
|
137
|
+
|
|
138
|
+
- **Host elements** (`View` / `Text` / `Image`) are read directly (`React.Children` + `StyleSheet.flatten`).
|
|
139
|
+
- **Custom components** are expanded by a tiny JS-only `react-reconciler` renderer (bundled) that renders them off-screen to recover their real host tree + styles โ then feeds the same skeleton engine.
|
|
140
|
+
- Anything Skelo can't introspect (native content) is measured and shown as one size-matched block.
|
|
141
|
+
|
|
142
|
+
---
|
|
147
143
|
|
|
148
|
-
##
|
|
144
|
+
## โ ๏ธ Good to know
|
|
149
145
|
|
|
150
|
-
|
|
151
|
-
- **`deep` mode** โ a JS-only `react-reconciler` renderer renders the component off-screen to recover its real host tree + styles, then feeds the same skeleton renderer.
|
|
152
|
-
- Anything Skelo can't introspect (a custom component without `deep`, or native content) is measured and shown as a single size-matched block.
|
|
146
|
+
Skelo skeletonizes **what your component renders during loading**:
|
|
153
147
|
|
|
154
|
-
|
|
148
|
+
- Introspection **runs mount effects** โ a screen that fetches on mount may fetch twice. Prefer it for presentational trees; register a plugin for effect-heavy screens.
|
|
149
|
+
- It renders **outside your providers** โ components needing navigation/theme/redux context fall back to a measured block.
|
|
150
|
+
- **Native content** (`WebView`, `MapView`, `Video`, โฆ) lives outside React, so it becomes a single sized block.
|
|
151
|
+
- A **data-driven list/grid** that renders nothing while loading has nothing to skeletonize โ keep placeholder items rendered (see the [example](./example)).
|
|
155
152
|
|
|
156
|
-
|
|
153
|
+
---
|
|
157
154
|
|
|
158
|
-
|
|
159
|
-
- **Renders outside your providers** โ components that require navigation/theme/redux context may fail to expand; Skelo catches this and falls back to a measured block.
|
|
160
|
-
- Only the **React host tree** is visible. `WebView`, `MapView`, `Video`, etc. render their content natively (outside React), so they can only become a single sized block.
|
|
155
|
+
## ๐ Requirements
|
|
161
156
|
|
|
162
|
-
|
|
157
|
+
- React Native (New Architecture recommended)
|
|
158
|
+
- React 19 (React 18 โ override `react-reconciler` to `0.29`)
|
|
159
|
+
- No other dependencies
|
|
163
160
|
|
|
164
|
-
|
|
165
|
-
`experimental_backgroundImage` gradient needs it)
|
|
166
|
-
- `react-native-reanimated` โฅ 3
|
|
167
|
-
- `react-reconciler` (optional, for `deep`) โ must match your React version
|
|
161
|
+
---
|
|
168
162
|
|
|
169
|
-
## License
|
|
163
|
+
## ๐ License
|
|
170
164
|
|
|
171
165
|
MIT ยฉ [Shubhanshu Barnwal](https://shubhanshubb.dev)
|
|
@@ -6,9 +6,8 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
6
6
|
exports.PulseAnimation = PulseAnimation;
|
|
7
7
|
var _react = _interopRequireWildcard(require("react"));
|
|
8
8
|
var _reactNative = require("react-native");
|
|
9
|
-
var _reactNativeReanimated = _interopRequireWildcard(require("react-native-reanimated"));
|
|
10
9
|
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
|
-
// Breathing opacity loop
|
|
10
|
+
// Breathing opacity loop using React Native's built-in Animated (native driver).
|
|
12
11
|
function PulseAnimation({
|
|
13
12
|
width,
|
|
14
13
|
height,
|
|
@@ -18,30 +17,30 @@ function PulseAnimation({
|
|
|
18
17
|
style,
|
|
19
18
|
children
|
|
20
19
|
}) {
|
|
21
|
-
const opacity = (0,
|
|
20
|
+
const opacity = (0, _react.useRef)(new _reactNative.Animated.Value(1)).current;
|
|
22
21
|
(0, _react.useEffect)(() => {
|
|
23
|
-
|
|
22
|
+
const loop = _reactNative.Animated.loop(_reactNative.Animated.sequence([_reactNative.Animated.timing(opacity, {
|
|
23
|
+
toValue: 0.5,
|
|
24
24
|
duration: duration / 2,
|
|
25
|
-
easing:
|
|
26
|
-
|
|
25
|
+
easing: _reactNative.Easing.inOut(_reactNative.Easing.ease),
|
|
26
|
+
useNativeDriver: true
|
|
27
|
+
}), _reactNative.Animated.timing(opacity, {
|
|
28
|
+
toValue: 1,
|
|
27
29
|
duration: duration / 2,
|
|
28
|
-
easing:
|
|
29
|
-
|
|
30
|
+
easing: _reactNative.Easing.inOut(_reactNative.Easing.ease),
|
|
31
|
+
useNativeDriver: true
|
|
32
|
+
})]));
|
|
33
|
+
loop.start();
|
|
34
|
+
return () => loop.stop();
|
|
30
35
|
}, [duration, opacity]);
|
|
31
|
-
|
|
32
|
-
'worklet';
|
|
33
|
-
|
|
34
|
-
return {
|
|
35
|
-
opacity: opacity.value
|
|
36
|
-
};
|
|
37
|
-
}, []);
|
|
38
|
-
return /*#__PURE__*/_react.default.createElement(_reactNativeReanimated.default.View, {
|
|
36
|
+
return /*#__PURE__*/_react.default.createElement(_reactNative.Animated.View, {
|
|
39
37
|
style: [styles.container, {
|
|
40
38
|
width,
|
|
41
39
|
height,
|
|
42
40
|
borderRadius,
|
|
43
|
-
backgroundColor: baseColor
|
|
44
|
-
|
|
41
|
+
backgroundColor: baseColor,
|
|
42
|
+
opacity
|
|
43
|
+
}, style]
|
|
45
44
|
}, children);
|
|
46
45
|
}
|
|
47
46
|
const styles = _reactNative.StyleSheet.create({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_react","_interopRequireWildcard","require","_reactNative","
|
|
1
|
+
{"version":3,"names":["_react","_interopRequireWildcard","require","_reactNative","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","useRef","Animated","Value","current","useEffect","loop","sequence","timing","toValue","easing","Easing","inOut","ease","useNativeDriver","start","stop","createElement","View","styles","container","backgroundColor","StyleSheet","create","overflow"],"sourceRoot":"../../../src","sources":["animations/PulseAnimation.tsx"],"mappings":"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","ignoreList":[]}
|
|
@@ -6,11 +6,10 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
6
6
|
exports.ShimmerAnimation = ShimmerAnimation;
|
|
7
7
|
var _react = _interopRequireWildcard(require("react"));
|
|
8
8
|
var _reactNative = require("react-native");
|
|
9
|
-
var _reactNativeReanimated = _interopRequireWildcard(require("react-native-reanimated"));
|
|
10
9
|
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
|
-
//
|
|
10
|
+
// Zero-dependency shimmer: a highlight band (dim/bright/dim segments to fake a
|
|
11
|
+
// soft gradient) sweeps across the base, driven by React Native's built-in
|
|
12
|
+
// Animated native driver. Plain Views only โ guaranteed to render and animate.
|
|
14
13
|
function ShimmerAnimation({
|
|
15
14
|
width,
|
|
16
15
|
height,
|
|
@@ -21,35 +20,28 @@ function ShimmerAnimation({
|
|
|
21
20
|
style,
|
|
22
21
|
children
|
|
23
22
|
}) {
|
|
24
|
-
const progress = (0,
|
|
23
|
+
const progress = (0, _react.useRef)(new _reactNative.Animated.Value(0)).current;
|
|
25
24
|
const [measuredWidth, setMeasuredWidth] = (0, _react.useState)(0);
|
|
26
25
|
(0, _react.useEffect)(() => {
|
|
27
|
-
|
|
26
|
+
const loop = _reactNative.Animated.loop(_reactNative.Animated.timing(progress, {
|
|
27
|
+
toValue: 1,
|
|
28
28
|
duration,
|
|
29
|
-
easing:
|
|
30
|
-
|
|
29
|
+
easing: _reactNative.Easing.linear,
|
|
30
|
+
useNativeDriver: true
|
|
31
|
+
}));
|
|
32
|
+
loop.start();
|
|
33
|
+
return () => loop.stop();
|
|
31
34
|
}, [duration, progress]);
|
|
32
35
|
const onLayout = event => {
|
|
33
36
|
const w = event.nativeEvent.layout.width;
|
|
34
37
|
setMeasuredWidth(prev => prev === w ? prev : w);
|
|
35
38
|
};
|
|
36
|
-
const containerWidth = typeof width === 'number' ? width : measuredWidth;
|
|
37
|
-
const
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
transform: [{
|
|
43
|
-
translateX
|
|
44
|
-
}]
|
|
45
|
-
};
|
|
46
|
-
}, [containerWidth]);
|
|
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
|
-
};
|
|
39
|
+
const containerWidth = typeof width === 'number' ? width : measuredWidth || 200;
|
|
40
|
+
const bandWidth = Math.max(containerWidth * 0.6, 80);
|
|
41
|
+
const translateX = progress.interpolate({
|
|
42
|
+
inputRange: [0, 1],
|
|
43
|
+
outputRange: [-bandWidth, containerWidth]
|
|
44
|
+
});
|
|
53
45
|
return /*#__PURE__*/_react.default.createElement(_reactNative.View, {
|
|
54
46
|
onLayout: onLayout,
|
|
55
47
|
style: [styles.container, {
|
|
@@ -58,16 +50,43 @@ function ShimmerAnimation({
|
|
|
58
50
|
borderRadius,
|
|
59
51
|
backgroundColor: baseColor
|
|
60
52
|
}, style]
|
|
61
|
-
}, /*#__PURE__*/_react.default.createElement(
|
|
53
|
+
}, /*#__PURE__*/_react.default.createElement(_reactNative.Animated.View, {
|
|
62
54
|
pointerEvents: "none",
|
|
63
|
-
style: [
|
|
55
|
+
style: [styles.band, {
|
|
56
|
+
width: bandWidth,
|
|
57
|
+
transform: [{
|
|
58
|
+
translateX
|
|
59
|
+
}]
|
|
60
|
+
}]
|
|
64
61
|
}, /*#__PURE__*/_react.default.createElement(_reactNative.View, {
|
|
65
|
-
style:
|
|
62
|
+
style: [styles.segment, {
|
|
63
|
+
backgroundColor: highlightColor,
|
|
64
|
+
opacity: 0.25
|
|
65
|
+
}]
|
|
66
|
+
}), /*#__PURE__*/_react.default.createElement(_reactNative.View, {
|
|
67
|
+
style: [styles.segment, {
|
|
68
|
+
backgroundColor: highlightColor,
|
|
69
|
+
opacity: 0.9
|
|
70
|
+
}]
|
|
71
|
+
}), /*#__PURE__*/_react.default.createElement(_reactNative.View, {
|
|
72
|
+
style: [styles.segment, {
|
|
73
|
+
backgroundColor: highlightColor,
|
|
74
|
+
opacity: 0.25
|
|
75
|
+
}]
|
|
66
76
|
})), children);
|
|
67
77
|
}
|
|
68
78
|
const styles = _reactNative.StyleSheet.create({
|
|
69
79
|
container: {
|
|
70
80
|
overflow: 'hidden'
|
|
81
|
+
},
|
|
82
|
+
band: {
|
|
83
|
+
position: 'absolute',
|
|
84
|
+
top: 0,
|
|
85
|
+
bottom: 0,
|
|
86
|
+
flexDirection: 'row'
|
|
87
|
+
},
|
|
88
|
+
segment: {
|
|
89
|
+
flex: 1
|
|
71
90
|
}
|
|
72
91
|
});
|
|
73
92
|
//# sourceMappingURL=ShimmerAnimation.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_react","_interopRequireWildcard","require","_reactNative","
|
|
1
|
+
{"version":3,"names":["_react","_interopRequireWildcard","require","_reactNative","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","useRef","Animated","Value","current","measuredWidth","setMeasuredWidth","useState","useEffect","loop","timing","toValue","easing","Easing","linear","useNativeDriver","start","stop","onLayout","event","w","nativeEvent","layout","prev","containerWidth","bandWidth","Math","max","translateX","interpolate","inputRange","outputRange","createElement","View","styles","container","backgroundColor","pointerEvents","band","transform","segment","opacity","StyleSheet","create","overflow","position","top","bottom","flexDirection","flex"],"sourceRoot":"../../../src","sources":["animations/ShimmerAnimation.tsx"],"mappings":"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","ignoreList":[]}
|
|
@@ -10,6 +10,7 @@ var _SkeletonRenderer = require("./SkeletonRenderer");
|
|
|
10
10
|
var _SkeletonIgnore = require("./SkeletonIgnore");
|
|
11
11
|
var _StyleSkeleton = require("../core/generator/StyleSkeleton");
|
|
12
12
|
var _deepRegistry = require("../core/deepRegistry");
|
|
13
|
+
var _expandLists = require("../core/parser/expandLists");
|
|
13
14
|
var _defaults = require("../constants/defaults");
|
|
14
15
|
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
16
|
/**
|
|
@@ -45,7 +46,8 @@ function Skeleton({
|
|
|
45
46
|
children,
|
|
46
47
|
styles,
|
|
47
48
|
excludeStyles,
|
|
48
|
-
deep
|
|
49
|
+
deep,
|
|
50
|
+
count = 6,
|
|
49
51
|
animation = _defaults.DEFAULT_CONFIG.animation,
|
|
50
52
|
duration = _defaults.DEFAULT_CONFIG.duration,
|
|
51
53
|
baseColor = _defaults.DEFAULT_CONFIG.baseColor,
|
|
@@ -66,24 +68,28 @@ function Skeleton({
|
|
|
66
68
|
console.log('[Skelo] Parsing component tree...');
|
|
67
69
|
}
|
|
68
70
|
try {
|
|
71
|
+
// Turn FlatList/SectionList into placeholder rows so lists show a
|
|
72
|
+
// skeleton even though their data (and rows) don't exist yet.
|
|
73
|
+
const prepared = (0, _expandLists.expandListPlaceholders)(children, count);
|
|
74
|
+
|
|
69
75
|
// Deep mode: expand opaque components into their real host tree via the
|
|
70
76
|
// opt-in expander (registered by importing 'react-native-skelo/deep').
|
|
71
|
-
//
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
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.");
|
|
77
|
+
// When `deep` is not set explicitly, it's used automatically whenever the
|
|
78
|
+
// expander is available. Falls back to static parsing otherwise.
|
|
79
|
+
const expand = (0, _deepRegistry.getDeepExpander)();
|
|
80
|
+
const wantDeep = deep === undefined ? expand !== null : deep;
|
|
81
|
+
if (wantDeep && expand) {
|
|
82
|
+
const expanded = expand(/*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, prepared));
|
|
83
|
+
if (expanded && expanded.length > 0) {
|
|
84
|
+
return expanded;
|
|
85
|
+
}
|
|
86
|
+
if (__DEV__) {
|
|
87
|
+
console.warn('[Skelo] deep expansion returned nothing; falling back to static parsing.');
|
|
84
88
|
}
|
|
89
|
+
} else if (deep === true && !expand && __DEV__) {
|
|
90
|
+
console.warn("[Skelo] `deep` requires react-reconciler. Install it and add `import 'react-native-skelo/deep';` in your app entry.");
|
|
85
91
|
}
|
|
86
|
-
const parsed = _parser.Parser.parse(
|
|
92
|
+
const parsed = _parser.Parser.parse(prepared);
|
|
87
93
|
if (__DEV__ && debug) {
|
|
88
94
|
// Log a lightweight summary: the raw nodes hold React elements
|
|
89
95
|
// (`element`) and arbitrary props that aren't safely serializable.
|
|
@@ -101,7 +107,7 @@ function Skeleton({
|
|
|
101
107
|
}
|
|
102
108
|
return [];
|
|
103
109
|
}
|
|
104
|
-
}, [loading, styles, deep, children, debug]);
|
|
110
|
+
}, [loading, styles, deep, count, children, debug]);
|
|
105
111
|
|
|
106
112
|
// Create skeleton config
|
|
107
113
|
const config = (0, _react.useMemo)(() => ({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_react","_interopRequireWildcard","require","_parser","_SkeletonRenderer","_SkeletonIgnore","_StyleSkeleton","_deepRegistry","_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","expand","getDeepExpander","expanded","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":";;;;;;AAAA,IAAAA,MAAA,GAAAC,uBAAA,CAAAC,OAAA;AAEA,IAAAC,OAAA,GAAAD,OAAA;AACA,IAAAE,iBAAA,GAAAF,OAAA;AACA,IAAAG,eAAA,GAAAH,OAAA;AACA,IAAAI,cAAA,GAAAJ,OAAA;AACA,IAAAK,aAAA,GAAAL,OAAA;AACA,IAAAM,
|
|
1
|
+
{"version":3,"names":["_react","_interopRequireWildcard","require","_parser","_SkeletonRenderer","_SkeletonIgnore","_StyleSkeleton","_deepRegistry","_expandLists","_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","count","animation","DEFAULT_CONFIG","duration","baseColor","highlightColor","borderRadius","accessible","accessibilityLabel","debug","skeletonTree","useMemo","__DEV__","console","log","prepared","expandListPlaceholders","expand","getDeepExpander","wantDeep","undefined","expanded","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":[]}
|