react-native-skelo 0.0.5 → 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.
Files changed (55) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +77 -88
  3. package/lib/commonjs/animations/PulseAnimation.js +42 -17
  4. package/lib/commonjs/animations/PulseAnimation.js.map +1 -1
  5. package/lib/commonjs/animations/ShimmerAnimation.js +65 -54
  6. package/lib/commonjs/animations/ShimmerAnimation.js.map +1 -1
  7. package/lib/commonjs/components/Skeleton.js +8 -20
  8. package/lib/commonjs/components/Skeleton.js.map +1 -1
  9. package/lib/commonjs/index.js +0 -1
  10. package/lib/commonjs/index.js.map +1 -1
  11. package/lib/module/animations/PulseAnimation.js +43 -18
  12. package/lib/module/animations/PulseAnimation.js.map +1 -1
  13. package/lib/module/animations/ShimmerAnimation.js +66 -55
  14. package/lib/module/animations/ShimmerAnimation.js.map +1 -1
  15. package/lib/module/components/Skeleton.js +8 -20
  16. package/lib/module/components/Skeleton.js.map +1 -1
  17. package/lib/module/index.js +0 -4
  18. package/lib/module/index.js.map +1 -1
  19. package/lib/typescript/animations/PulseAnimation.d.ts +44 -0
  20. package/lib/typescript/animations/PulseAnimation.d.ts.map +1 -1
  21. package/lib/typescript/animations/ShimmerAnimation.d.ts +44 -0
  22. package/lib/typescript/animations/ShimmerAnimation.d.ts.map +1 -1
  23. package/lib/typescript/components/Skeleton.d.ts +1 -1
  24. package/lib/typescript/components/Skeleton.d.ts.map +1 -1
  25. package/lib/typescript/index.d.ts +0 -1
  26. package/lib/typescript/index.d.ts.map +1 -1
  27. package/lib/typescript/types/skeleton.d.ts +0 -8
  28. package/lib/typescript/types/skeleton.d.ts.map +1 -1
  29. package/package.json +12 -23
  30. package/src/animations/PulseAnimation.tsx +89 -17
  31. package/src/animations/ShimmerAnimation.tsx +118 -39
  32. package/src/components/Skeleton.tsx +8 -22
  33. package/src/index.ts +0 -4
  34. package/src/types/skeleton.ts +0 -9
  35. package/lib/commonjs/core/deepRegistry.js +0 -18
  36. package/lib/commonjs/core/deepRegistry.js.map +0 -1
  37. package/lib/commonjs/core/parser/expandLists.js +0 -67
  38. package/lib/commonjs/core/parser/expandLists.js.map +0 -1
  39. package/lib/commonjs/deep.js +0 -18
  40. package/lib/commonjs/deep.js.map +0 -1
  41. package/lib/module/core/deepRegistry.js +0 -11
  42. package/lib/module/core/deepRegistry.js.map +0 -1
  43. package/lib/module/core/parser/expandLists.js +0 -61
  44. package/lib/module/core/parser/expandLists.js.map +0 -1
  45. package/lib/module/deep.js +0 -11
  46. package/lib/module/deep.js.map +0 -1
  47. package/lib/typescript/core/deepRegistry.d.ts +0 -7
  48. package/lib/typescript/core/deepRegistry.d.ts.map +0 -1
  49. package/lib/typescript/core/parser/expandLists.d.ts +0 -3
  50. package/lib/typescript/core/parser/expandLists.d.ts.map +0 -1
  51. package/lib/typescript/deep.d.ts +0 -2
  52. package/lib/typescript/deep.d.ts.map +0 -1
  53. package/src/core/deepRegistry.ts +0 -16
  54. package/src/core/parser/expandLists.tsx +0 -77
  55. package/src/deep.ts +0 -12
package/LICENSE CHANGED
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2026 Shubhanshu Barnwal <connect@shubhanshubb.dev> (https://shubhanshubb.dev)
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
@@ -1,121 +1,119 @@
1
1
  <div align="center">
2
2
 
3
- # ðŸĶī react-native-skelo
3
+ # react-native-skelo
4
4
 
5
- ### Write your UI once. Skelo builds the loading state — automatically.
5
+ **Write your UI once. Skelo builds the loading state automatically.**
6
6
 
7
- [![npm version](https://img.shields.io/npm/v/react-native-skelo?color=5FC9F8&label=npm)](https://www.npmjs.com/package/react-native-skelo)
8
- [![downloads](https://img.shields.io/npm/dm/react-native-skelo?color=5FC9F8)](https://www.npmjs.com/package/react-native-skelo)
9
- [![license](https://img.shields.io/npm/l/react-native-skelo?color=5FC9F8)](./LICENSE)
10
- [![PRs welcome](https://img.shields.io/badge/PRs-welcome-5FC9F8.svg)](https://github.com/shubhanshubb/react-native-skelo)
11
-
12
- <br />
13
-
14
- <img src="./assets/demo.gif" alt="Skelo skeleton demo" width="270" />
15
- &nbsp;&nbsp;
16
- <img src="./assets/grid.gif" alt="Image-grid skeleton" width="270" />
7
+ [![npm](https://img.shields.io/npm/v/react-native-skelo/alpha)](https://www.npmjs.com/package/react-native-skelo)
8
+ [![license](https://img.shields.io/npm/l/react-native-skelo)](./LICENSE)
17
9
 
18
10
  </div>
19
11
 
20
- <br />
12
+ > ⚠ïļ **Alpha.** The API may change before `1.0`. The `deep` engine is experimental — see [caveats](#deep-mode-caveats-experimental).
21
13
 
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.
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.
23
15
 
24
16
  ```tsx
17
+ import { Skeleton } from 'react-native-skelo';
18
+
25
19
  <Skeleton loading={isLoading}>
26
- <ProfileCard user={user} />
20
+ <View style={styles.card}>
21
+ <Image style={styles.avatar} />
22
+ <Text style={styles.name}>{user.name}</Text>
23
+ </View>
27
24
  </Skeleton>
28
25
  ```
29
26
 
30
- That's the whole API. No skeleton screens to hand-draw, no keeping two layouts in sync.
27
+ While `loading`, Skelo reads the tree and its styles and renders a matching skeleton (circle avatar, text bar). When `loading` is `false`, it renders your real content.
31
28
 
32
- > ⚠ïļ **Pre-release (`0.0.x`)** — evolving fast; the API may change before the stable `0.1.0`.
29
+ ## Installation
33
30
 
34
- ---
35
-
36
- ## âœĻ Features
37
-
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.
44
-
45
- ---
31
+ ```bash
32
+ npm install react-native-skelo@alpha
33
+ ```
46
34
 
47
- ## ðŸ“Ķ Installation
35
+ Peer dependencies:
48
36
 
49
37
  ```bash
50
- npm install react-native-skelo
38
+ npm install react-native-reanimated react-native-linear-gradient
39
+ # Optional — only needed for `deep` mode:
40
+ npm install react-reconciler
51
41
  ```
52
42
 
53
- **That's it — no other dependencies.** Everything (including custom-component introspection) works out of the box.
43
+ ## Usage
54
44
 
55
- > React 18 apps: add `"react-reconciler": "0.29.x"` to your deps (Skelo ships targeting React 19's `0.31`).
45
+ ### Basic — inline host elements
56
46
 
57
- ---
47
+ Skelo traverses the `View` / `Text` / `Image` tree you pass and mirrors it:
58
48
 
59
- ## 🚀 Usage
49
+ ```tsx
50
+ <Skeleton loading={loading} animation="shimmer">
51
+ <View style={styles.row}>
52
+ <Image style={styles.avatar} /> {/* → circle / box */}
53
+ <Text style={styles.title}>Title</Text> {/* → text bar */}
54
+ </View>
55
+ </Skeleton>
56
+ ```
60
57
 
61
- ### Just wrap it
58
+ Structure comes from the JSX; dimensions come from each element's `style`.
59
+
60
+ ### `deep` — wrap any component (experimental)
61
+
62
+ Don't want to inline? Wrap an opaque component and let Skelo introspect it:
62
63
 
63
64
  ```tsx
64
- import { Skeleton } from 'react-native-skelo';
65
+ import { Skeleton, withSkeleton } from 'react-native-skelo';
65
66
 
66
- function Screen({ loading, user }) {
67
- return (
68
- <Skeleton loading={loading} animation="shimmer">
69
- <ProfileCard user={user} />
70
- </Skeleton>
71
- );
72
- }
67
+ <Skeleton loading={loading} deep>
68
+ <ProfileScreen />
69
+ </Skeleton>
70
+
71
+ // or as an HOC:
72
+ const Home = withSkeleton(HomeScreen);
73
+ <Home loading={loading} {...props} />
73
74
  ```
74
75
 
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.
76
+ Requires `react-reconciler`. See [caveats](#deep-mode-caveats-experimental).
76
77
 
77
- ### Lists
78
+ ### `styles` — generate from a StyleSheet
78
79
 
79
- Wrap a `FlatList` — Skelo fills it with skeleton rows while the data loads:
80
+ Pass styles directly to get a stack of skeleton shapes (no children needed):
80
81
 
81
82
  ```tsx
82
- <Skeleton loading={loading} count={6}>
83
- <FlatList data={items} renderItem={renderItem} />
84
- </Skeleton>
83
+ <Skeleton loading={loading} styles={styles} excludeStyles={['container']} />
85
84
  ```
86
85
 
87
- ### Keep something visible
86
+ A StyleSheet has no hierarchy, so this produces one shape per style that has visual dimensions.
87
+
88
+ ### `Skeleton.Ignore` — keep something visible
88
89
 
89
90
  ```tsx
90
91
  <Skeleton loading={loading}>
91
92
  <Skeleton.Ignore>
92
- <Text style={styles.heading}>Profile</Text> {/* stays real */}
93
+ <Text style={styles.heading}>Profile</Text> {/* stays real */}
93
94
  </Skeleton.Ignore>
94
95
  <ProfileBody />
95
96
  </Skeleton>
96
97
  ```
97
98
 
98
- ### Generate from a StyleSheet
99
-
100
- ```tsx
101
- <Skeleton loading={loading} styles={styles} excludeStyles={['container']} />
102
- ```
103
-
104
- ### Custom skeleton for a component
99
+ ### Custom components — register a plugin
105
100
 
106
101
  ```tsx
107
102
  import { Skelo } from 'react-native-skelo';
103
+ import { Avatar } from 'my-design-system';
108
104
 
109
105
  Skelo.register({
110
106
  name: 'Avatar',
111
107
  component: Avatar,
112
- strategy: (props, { primitives }) => <primitives.Circle size={props.size ?? 40} />,
108
+ strategy: (props, { primitives }) => (
109
+ <primitives.Circle size={props.size ?? 40} />
110
+ ),
113
111
  });
114
112
  ```
115
113
 
116
- ---
114
+ ## API
117
115
 
118
- ## ⚙ïļ `<Skeleton>` props
116
+ ### `<Skeleton>` props
119
117
 
120
118
  | Prop | Type | Default | Description |
121
119
  |---|---|---|---|
@@ -124,42 +122,33 @@ Skelo.register({
124
122
  | `duration` | `number` | `1200` | Animation duration (ms) |
125
123
  | `baseColor` / `highlightColor` | `string` | theme | Skeleton colors |
126
124
  | `borderRadius` | `number` | `4` | Default corner radius |
127
- | `count` | `number` | `6` | Placeholder rows for a `FlatList`/`SectionList` |
128
- | `deep` | `boolean` | auto | Force component introspection on/off (auto when available) |
125
+ | `deep` | `boolean` | `false` | Expand opaque components (experimental) |
129
126
  | `styles` | `StyleSheet \| style[]` | — | Generate from styles instead of children |
127
+ | `excludeStyles` | `string[]` | — | Style keys to skip in `styles` mode |
130
128
  | `accessibilityLabel` | `string` | `'Loading content'` | Screen-reader label |
131
129
 
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
- ---
130
+ Also exported: `withSkeleton`, `SkeletonIgnore`, `StyleSkeleton`, the primitives (`SkeletonBox`, `SkeletonText`, `SkeletonImage`, `SkeletonCircle`), and `Skelo` (plugin registry + `Skelo.fromStyles`).
143
131
 
144
- ## ⚠ïļ Good to know
132
+ ## How it works
145
133
 
146
- Skelo skeletonizes **what your component renders during loading**:
134
+ - **Inline mode** — static traversal of the host-element tree (`React.Children` + `StyleSheet.flatten`).
135
+ - **`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.
136
+ - Anything Skelo can't introspect (a custom component without `deep`, or native content) is measured and shown as a single size-matched block.
147
137
 
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)).
138
+ ## `deep` mode caveats (experimental)
152
139
 
153
- ---
140
+ `deep` renders your component offline to read its structure, which means:
154
141
 
155
- ## 📋 Requirements
142
+ - **Mount effects run** during introspection — a screen that fetches on mount may fetch twice. Prefer `deep` for presentational trees; register a plugin or provide a manual skeleton for effectful screens.
143
+ - **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.
144
+ - 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.
156
145
 
157
- - React Native (New Architecture recommended)
158
- - React 19 (React 18 → override `react-reconciler` to `0.29`)
159
- - No other dependencies
146
+ ## Requirements
160
147
 
161
- ---
148
+ - React Native (Fabric / New Architecture recommended)
149
+ - `react-native-reanimated` â‰Ĩ 3
150
+ - `react-reconciler` (optional, for `deep`) — must match your React version
162
151
 
163
- ## 📄 License
152
+ ## License
164
153
 
165
154
  MIT ÂĐ [Shubhanshu Barnwal](https://shubhanshubb.dev)
@@ -6,8 +6,25 @@ 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"));
9
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); }
10
- // Breathing opacity loop using React Native's built-in Animated (native driver).
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
+ */
11
28
  function PulseAnimation({
12
29
  width,
13
30
  height,
@@ -17,30 +34,38 @@ function PulseAnimation({
17
34
  style,
18
35
  children
19
36
  }) {
20
- const opacity = (0, _react.useRef)(new _reactNative.Animated.Value(1)).current;
37
+ // Shared value for opacity (0 to 1)
38
+ const opacity = (0, _reactNativeReanimated.useSharedValue)(1);
21
39
  (0, _react.useEffect)(() => {
22
- const loop = _reactNative.Animated.loop(_reactNative.Animated.sequence([_reactNative.Animated.timing(opacity, {
23
- toValue: 0.5,
40
+ // Start infinite pulse animation
41
+ // Sequence: fade out -> fade in
42
+ opacity.value = (0, _reactNativeReanimated.withRepeat)((0, _reactNativeReanimated.withSequence)((0, _reactNativeReanimated.withTiming)(0.5, {
24
43
  duration: duration / 2,
25
- easing: _reactNative.Easing.inOut(_reactNative.Easing.ease),
26
- useNativeDriver: true
27
- }), _reactNative.Animated.timing(opacity, {
28
- toValue: 1,
44
+ easing: _reactNativeReanimated.Easing.inOut(_reactNativeReanimated.Easing.ease)
45
+ }), (0, _reactNativeReanimated.withTiming)(1, {
29
46
  duration: duration / 2,
30
- easing: _reactNative.Easing.inOut(_reactNative.Easing.ease),
31
- useNativeDriver: true
32
- })]));
33
- loop.start();
34
- return () => loop.stop();
47
+ easing: _reactNativeReanimated.Easing.inOut(_reactNativeReanimated.Easing.ease)
48
+ })), -1,
49
+ // Infinite repeat
50
+ false // Don't reverse
51
+ );
35
52
  }, [duration, opacity]);
36
- return /*#__PURE__*/_react.default.createElement(_reactNative.Animated.View, {
53
+
54
+ // Animated style for pulse effect
55
+ const animatedStyle = (0, _reactNativeReanimated.useAnimatedStyle)(() => {
56
+ 'worklet';
57
+
58
+ return {
59
+ opacity: opacity.value
60
+ };
61
+ }, []);
62
+ return /*#__PURE__*/_react.default.createElement(_reactNativeReanimated.default.View, {
37
63
  style: [styles.container, {
38
64
  width,
39
65
  height,
40
66
  borderRadius,
41
- backgroundColor: baseColor,
42
- opacity
43
- }, style]
67
+ backgroundColor: baseColor
68
+ }, animatedStyle, style]
44
69
  }, children);
45
70
  }
46
71
  const styles = _reactNative.StyleSheet.create({
@@ -1 +1 @@
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":[]}
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":[]}
@@ -6,10 +6,26 @@ 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
+ var _reactNativeLinearGradient = require("react-native-linear-gradient");
9
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); }
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.
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
+ */
13
29
  function ShimmerAnimation({
14
30
  width,
15
31
  height,
@@ -20,73 +36,68 @@ function ShimmerAnimation({
20
36
  style,
21
37
  children
22
38
  }) {
23
- const progress = (0, _react.useRef)(new _reactNative.Animated.Value(0)).current;
24
- const [measuredWidth, setMeasuredWidth] = (0, _react.useState)(0);
39
+ // Shared value for animation progress (0 to 1)
40
+ const progress = (0, _reactNativeReanimated.useSharedValue)(0);
25
41
  (0, _react.useEffect)(() => {
26
- const loop = _reactNative.Animated.loop(_reactNative.Animated.timing(progress, {
27
- toValue: 1,
42
+ // Start infinite shimmer animation
43
+ progress.value = (0, _reactNativeReanimated.withRepeat)((0, _reactNativeReanimated.withTiming)(1, {
28
44
  duration,
29
- easing: _reactNative.Easing.linear,
30
- useNativeDriver: true
31
- }));
32
- loop.start();
33
- return () => loop.stop();
45
+ easing: _reactNativeReanimated.Easing.linear
46
+ }), -1,
47
+ // Infinite repeat
48
+ false // Don't reverse
49
+ );
34
50
  }, [duration, progress]);
35
- const onLayout = event => {
36
- const w = event.nativeEvent.layout.width;
37
- setMeasuredWidth(prev => prev === w ? prev : w);
38
- };
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
- });
51
+
52
+ // Animated style for shimmer overlay
53
+ const animatedStyle = (0, _reactNativeReanimated.useAnimatedStyle)(() => {
54
+ 'worklet';
55
+
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]);
59
+ return {
60
+ transform: [{
61
+ translateX: translateX * (typeof width === 'number' ? width : 200)
62
+ }]
63
+ };
64
+ }, [width]);
45
65
  return /*#__PURE__*/_react.default.createElement(_reactNative.View, {
46
- onLayout: onLayout,
47
66
  style: [styles.container, {
48
67
  width,
49
68
  height,
50
69
  borderRadius,
51
70
  backgroundColor: baseColor
52
71
  }, style]
53
- }, /*#__PURE__*/_react.default.createElement(_reactNative.Animated.View, {
54
- pointerEvents: "none",
55
- style: [styles.band, {
56
- width: bandWidth,
57
- transform: [{
58
- translateX
59
- }]
60
- }]
61
- }, /*#__PURE__*/_react.default.createElement(_reactNative.View, {
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
72
+ }, /*#__PURE__*/_react.default.createElement(_reactNativeReanimated.default.View, {
73
+ style: [_reactNative.StyleSheet.absoluteFill, {
74
+ overflow: 'hidden',
75
+ borderRadius
70
76
  }]
71
- }), /*#__PURE__*/_react.default.createElement(_reactNative.View, {
72
- style: [styles.segment, {
73
- backgroundColor: highlightColor,
74
- opacity: 0.25
75
- }]
76
- })), children);
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);
77
94
  }
78
95
  const styles = _reactNative.StyleSheet.create({
79
96
  container: {
80
97
  overflow: 'hidden'
81
98
  },
82
- band: {
83
- position: 'absolute',
84
- top: 0,
85
- bottom: 0,
86
- flexDirection: 'row'
87
- },
88
- segment: {
89
- flex: 1
99
+ shimmer: {
100
+ position: 'absolute'
90
101
  }
91
102
  });
92
103
  //# sourceMappingURL=ShimmerAnimation.js.map
@@ -1 +1 @@
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":[]}
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,8 +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 _deepRegistry = require("../core/deepRegistry");
13
- var _expandLists = require("../core/parser/expandLists");
12
+ var _expandOffline = require("../core/parser/expandOffline");
14
13
  var _defaults = require("../constants/defaults");
15
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); }
16
15
  /**
@@ -46,8 +45,7 @@ function Skeleton({
46
45
  children,
47
46
  styles,
48
47
  excludeStyles,
49
- deep,
50
- count = 6,
48
+ deep = false,
51
49
  animation = _defaults.DEFAULT_CONFIG.animation,
52
50
  duration = _defaults.DEFAULT_CONFIG.duration,
53
51
  baseColor = _defaults.DEFAULT_CONFIG.baseColor,
@@ -68,28 +66,18 @@ function Skeleton({
68
66
  console.log('[Skelo] Parsing component tree...');
69
67
  }
70
68
  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
-
75
- // Deep mode: expand opaque components into their real host tree via the
76
- // opt-in expander (registered by importing 'react-native-skelo/deep').
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));
69
+ // Deep mode: expand opaque components into their real host tree by
70
+ // rendering them offline. Falls back to static parsing on failure.
71
+ if (deep) {
72
+ const expanded = (0, _expandOffline.expandToComponentNodes)(/*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, children));
83
73
  if (expanded && expanded.length > 0) {
84
74
  return expanded;
85
75
  }
86
76
  if (__DEV__) {
87
77
  console.warn('[Skelo] deep expansion returned nothing; falling back to static parsing.');
88
78
  }
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.");
91
79
  }
92
- const parsed = _parser.Parser.parse(prepared);
80
+ const parsed = _parser.Parser.parse(children);
93
81
  if (__DEV__ && debug) {
94
82
  // Log a lightweight summary: the raw nodes hold React elements
95
83
  // (`element`) and arbitrary props that aren't safely serializable.
@@ -107,7 +95,7 @@ function Skeleton({
107
95
  }
108
96
  return [];
109
97
  }
110
- }, [loading, styles, deep, count, children, debug]);
98
+ }, [loading, styles, deep, children, debug]);
111
99
 
112
100
  // Create skeleton config
113
101
  const config = (0, _react.useMemo)(() => ({
@@ -1 +1 @@
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":[]}
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":[]}