react-native-smart-skeleton 0.0.1

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 (173) hide show
  1. package/README.md +255 -0
  2. package/lib/commonjs/animations/breathing.js +53 -0
  3. package/lib/commonjs/animations/breathing.js.map +1 -0
  4. package/lib/commonjs/animations/pulse.js +50 -0
  5. package/lib/commonjs/animations/pulse.js.map +1 -0
  6. package/lib/commonjs/animations/shimmer.js +68 -0
  7. package/lib/commonjs/animations/shimmer.js.map +1 -0
  8. package/lib/commonjs/animations/wave.js +54 -0
  9. package/lib/commonjs/animations/wave.js.map +1 -0
  10. package/lib/commonjs/clone/SkeletonClone.js +91 -0
  11. package/lib/commonjs/clone/SkeletonClone.js.map +1 -0
  12. package/lib/commonjs/components/Circle.js +27 -0
  13. package/lib/commonjs/components/Circle.js.map +1 -0
  14. package/lib/commonjs/components/Group.js +57 -0
  15. package/lib/commonjs/components/Group.js.map +1 -0
  16. package/lib/commonjs/components/Pill.js +32 -0
  17. package/lib/commonjs/components/Pill.js.map +1 -0
  18. package/lib/commonjs/components/Rect.js +21 -0
  19. package/lib/commonjs/components/Rect.js.map +1 -0
  20. package/lib/commonjs/components/Skeleton.js +196 -0
  21. package/lib/commonjs/components/Skeleton.js.map +1 -0
  22. package/lib/commonjs/components/Square.js +28 -0
  23. package/lib/commonjs/components/Square.js.map +1 -0
  24. package/lib/commonjs/demo/demo.gif +0 -0
  25. package/lib/commonjs/hooks/useReducedMotion.js +42 -0
  26. package/lib/commonjs/hooks/useReducedMotion.js.map +1 -0
  27. package/lib/commonjs/hooks/useSkeletonTheme.js +46 -0
  28. package/lib/commonjs/hooks/useSkeletonTheme.js.map +1 -0
  29. package/lib/commonjs/index.js +149 -0
  30. package/lib/commonjs/index.js.map +1 -0
  31. package/lib/commonjs/presets/Card.js +83 -0
  32. package/lib/commonjs/presets/Card.js.map +1 -0
  33. package/lib/commonjs/presets/Chat.js +54 -0
  34. package/lib/commonjs/presets/Chat.js.map +1 -0
  35. package/lib/commonjs/presets/Product.js +70 -0
  36. package/lib/commonjs/presets/Product.js.map +1 -0
  37. package/lib/commonjs/presets/Profile.js +67 -0
  38. package/lib/commonjs/presets/Profile.js.map +1 -0
  39. package/lib/commonjs/presets/Video.js +76 -0
  40. package/lib/commonjs/presets/Video.js.map +1 -0
  41. package/lib/commonjs/providers/SkeletonProvider.js +70 -0
  42. package/lib/commonjs/providers/SkeletonProvider.js.map +1 -0
  43. package/lib/commonjs/types/index.js +6 -0
  44. package/lib/commonjs/types/index.js.map +1 -0
  45. package/lib/commonjs/utils/colors.js +144 -0
  46. package/lib/commonjs/utils/colors.js.map +1 -0
  47. package/lib/commonjs/utils/responsive.js +84 -0
  48. package/lib/commonjs/utils/responsive.js.map +1 -0
  49. package/lib/commonjs/utils/theme.js +39 -0
  50. package/lib/commonjs/utils/theme.js.map +1 -0
  51. package/lib/module/animations/breathing.js +47 -0
  52. package/lib/module/animations/breathing.js.map +1 -0
  53. package/lib/module/animations/pulse.js +44 -0
  54. package/lib/module/animations/pulse.js.map +1 -0
  55. package/lib/module/animations/shimmer.js +61 -0
  56. package/lib/module/animations/shimmer.js.map +1 -0
  57. package/lib/module/animations/wave.js +48 -0
  58. package/lib/module/animations/wave.js.map +1 -0
  59. package/lib/module/clone/SkeletonClone.js +84 -0
  60. package/lib/module/clone/SkeletonClone.js.map +1 -0
  61. package/lib/module/components/Circle.js +20 -0
  62. package/lib/module/components/Circle.js.map +1 -0
  63. package/lib/module/components/Group.js +50 -0
  64. package/lib/module/components/Group.js.map +1 -0
  65. package/lib/module/components/Pill.js +25 -0
  66. package/lib/module/components/Pill.js.map +1 -0
  67. package/lib/module/components/Rect.js +14 -0
  68. package/lib/module/components/Rect.js.map +1 -0
  69. package/lib/module/components/Skeleton.js +188 -0
  70. package/lib/module/components/Skeleton.js.map +1 -0
  71. package/lib/module/components/Square.js +21 -0
  72. package/lib/module/components/Square.js.map +1 -0
  73. package/lib/module/demo/demo.gif +0 -0
  74. package/lib/module/hooks/useReducedMotion.js +37 -0
  75. package/lib/module/hooks/useReducedMotion.js.map +1 -0
  76. package/lib/module/hooks/useSkeletonTheme.js +40 -0
  77. package/lib/module/hooks/useSkeletonTheme.js.map +1 -0
  78. package/lib/module/index.js +50 -0
  79. package/lib/module/index.js.map +1 -0
  80. package/lib/module/presets/Card.js +76 -0
  81. package/lib/module/presets/Card.js.map +1 -0
  82. package/lib/module/presets/Chat.js +47 -0
  83. package/lib/module/presets/Chat.js.map +1 -0
  84. package/lib/module/presets/Product.js +63 -0
  85. package/lib/module/presets/Product.js.map +1 -0
  86. package/lib/module/presets/Profile.js +60 -0
  87. package/lib/module/presets/Profile.js.map +1 -0
  88. package/lib/module/presets/Video.js +69 -0
  89. package/lib/module/presets/Video.js.map +1 -0
  90. package/lib/module/providers/SkeletonProvider.js +61 -0
  91. package/lib/module/providers/SkeletonProvider.js.map +1 -0
  92. package/lib/module/types/index.js +2 -0
  93. package/lib/module/types/index.js.map +1 -0
  94. package/lib/module/utils/colors.js +132 -0
  95. package/lib/module/utils/colors.js.map +1 -0
  96. package/lib/module/utils/responsive.js +74 -0
  97. package/lib/module/utils/responsive.js.map +1 -0
  98. package/lib/module/utils/theme.js +32 -0
  99. package/lib/module/utils/theme.js.map +1 -0
  100. package/lib/typescript/animations/breathing.d.ts +26 -0
  101. package/lib/typescript/animations/breathing.d.ts.map +1 -0
  102. package/lib/typescript/animations/pulse.d.ts +22 -0
  103. package/lib/typescript/animations/pulse.d.ts.map +1 -0
  104. package/lib/typescript/animations/shimmer.d.ts +34 -0
  105. package/lib/typescript/animations/shimmer.d.ts.map +1 -0
  106. package/lib/typescript/animations/wave.d.ts +23 -0
  107. package/lib/typescript/animations/wave.d.ts.map +1 -0
  108. package/lib/typescript/clone/SkeletonClone.d.ts +30 -0
  109. package/lib/typescript/clone/SkeletonClone.d.ts.map +1 -0
  110. package/lib/typescript/components/Circle.d.ts +10 -0
  111. package/lib/typescript/components/Circle.d.ts.map +1 -0
  112. package/lib/typescript/components/Group.d.ts +21 -0
  113. package/lib/typescript/components/Group.d.ts.map +1 -0
  114. package/lib/typescript/components/Pill.d.ts +12 -0
  115. package/lib/typescript/components/Pill.d.ts.map +1 -0
  116. package/lib/typescript/components/Rect.d.ts +12 -0
  117. package/lib/typescript/components/Rect.d.ts.map +1 -0
  118. package/lib/typescript/components/Skeleton.d.ts +16 -0
  119. package/lib/typescript/components/Skeleton.d.ts.map +1 -0
  120. package/lib/typescript/components/Square.d.ts +10 -0
  121. package/lib/typescript/components/Square.d.ts.map +1 -0
  122. package/lib/typescript/hooks/useReducedMotion.d.ts +11 -0
  123. package/lib/typescript/hooks/useReducedMotion.d.ts.map +1 -0
  124. package/lib/typescript/hooks/useSkeletonTheme.d.ts +12 -0
  125. package/lib/typescript/hooks/useSkeletonTheme.d.ts.map +1 -0
  126. package/lib/typescript/index.d.ts +51 -0
  127. package/lib/typescript/index.d.ts.map +1 -0
  128. package/lib/typescript/presets/Card.d.ts +11 -0
  129. package/lib/typescript/presets/Card.d.ts.map +1 -0
  130. package/lib/typescript/presets/Chat.d.ts +12 -0
  131. package/lib/typescript/presets/Chat.d.ts.map +1 -0
  132. package/lib/typescript/presets/Product.d.ts +12 -0
  133. package/lib/typescript/presets/Product.d.ts.map +1 -0
  134. package/lib/typescript/presets/Profile.d.ts +11 -0
  135. package/lib/typescript/presets/Profile.d.ts.map +1 -0
  136. package/lib/typescript/presets/Video.d.ts +12 -0
  137. package/lib/typescript/presets/Video.d.ts.map +1 -0
  138. package/lib/typescript/providers/SkeletonProvider.d.ts +18 -0
  139. package/lib/typescript/providers/SkeletonProvider.d.ts.map +1 -0
  140. package/lib/typescript/types/index.d.ts +149 -0
  141. package/lib/typescript/types/index.d.ts.map +1 -0
  142. package/lib/typescript/utils/colors.d.ts +51 -0
  143. package/lib/typescript/utils/colors.d.ts.map +1 -0
  144. package/lib/typescript/utils/responsive.d.ts +27 -0
  145. package/lib/typescript/utils/responsive.d.ts.map +1 -0
  146. package/lib/typescript/utils/theme.d.ts +16 -0
  147. package/lib/typescript/utils/theme.d.ts.map +1 -0
  148. package/package.json +74 -0
  149. package/src/animations/breathing.tsx +81 -0
  150. package/src/animations/pulse.tsx +75 -0
  151. package/src/animations/shimmer.tsx +88 -0
  152. package/src/animations/wave.tsx +74 -0
  153. package/src/clone/SkeletonClone.tsx +82 -0
  154. package/src/components/Circle.tsx +13 -0
  155. package/src/components/Group.tsx +55 -0
  156. package/src/components/Pill.tsx +23 -0
  157. package/src/components/Rect.tsx +15 -0
  158. package/src/components/Skeleton.tsx +218 -0
  159. package/src/components/Square.tsx +13 -0
  160. package/src/demo/demo.gif +0 -0
  161. package/src/hooks/useReducedMotion.ts +46 -0
  162. package/src/hooks/useSkeletonTheme.ts +45 -0
  163. package/src/index.ts +94 -0
  164. package/src/presets/Card.tsx +56 -0
  165. package/src/presets/Chat.tsx +52 -0
  166. package/src/presets/Product.tsx +45 -0
  167. package/src/presets/Profile.tsx +54 -0
  168. package/src/presets/Video.tsx +53 -0
  169. package/src/providers/SkeletonProvider.tsx +67 -0
  170. package/src/types/index.ts +246 -0
  171. package/src/utils/colors.ts +132 -0
  172. package/src/utils/responsive.ts +73 -0
  173. package/src/utils/theme.ts +35 -0
@@ -0,0 +1,188 @@
1
+ import React, { useCallback, useContext, useState } from "react";
2
+ import { I18nManager, View } from "react-native";
3
+ import Animated from "react-native-reanimated";
4
+ import { SkeletonContext } from "../providers/SkeletonProvider";
5
+ import { useSkeletonTheme } from "../hooks/useSkeletonTheme";
6
+ import { useReducedMotion } from "../hooks/useReducedMotion";
7
+ import { useShimmerTransform } from "../animations/shimmer";
8
+ import { usePulseStyle } from "../animations/pulse";
9
+ import { useWaveTransform } from "../animations/wave";
10
+ import { useBreathingStyle } from "../animations/breathing";
11
+ import { buildSweepGradient } from "../utils/colors";
12
+ const LinearGradientComponent = (() => {
13
+ try {
14
+ return require("expo-linear-gradient").LinearGradient;
15
+ } catch {
16
+ try {
17
+ return require("react-native-linear-gradient").default;
18
+ } catch {
19
+ return View;
20
+ }
21
+ }
22
+ })();
23
+ const AnimatedLinearGradient = Animated.createAnimatedComponent(LinearGradientComponent);
24
+
25
+ /**
26
+ * The base building block of react-native-smart-skeleton. Renders a single
27
+ * rectangular (optionally rounded) placeholder shape with the requested
28
+ * animation, fully theme-aware and accessible.
29
+ *
30
+ * Most consumers will reach for `Skeleton.Rect`, `Skeleton.Circle`,
31
+ * `Skeleton.Square`, or `Skeleton.Pill` instead of this directly, but those
32
+ * are all thin wrappers around this component.
33
+ *
34
+ * @example
35
+ * <Skeleton width={200} height={20} animation="shimmer" />
36
+ */
37
+ export default function Skeleton({
38
+ width = "100%",
39
+ height = 16,
40
+ borderRadius = 4,
41
+ backgroundColor,
42
+ highlightColor,
43
+ gradientColors,
44
+ animation,
45
+ duration,
46
+ delay = 0,
47
+ rtl,
48
+ colorVariant,
49
+ style,
50
+ accessibilityLabel = "Loading content",
51
+ accessible = true,
52
+ testID
53
+ }) {
54
+ const ctx = useContext(SkeletonContext);
55
+ const themeColors = useSkeletonTheme(colorVariant);
56
+ const osReducedMotion = useReducedMotion();
57
+ const [measuredWidth, setMeasuredWidth] = useState(0);
58
+ const onLayout = useCallback(e => {
59
+ setMeasuredWidth(e.nativeEvent.layout.width);
60
+ }, []);
61
+
62
+ // Resolve effective settings, falling back through: prop -> provider -> library default.
63
+ const resolvedAnimation = animation ?? ctx?.animation ?? "shimmer";
64
+ const resolvedDuration = duration ?? ctx?.duration ?? 1200;
65
+ const resolvedPerformanceMode = ctx?.performanceMode ?? "balanced";
66
+ const reducedMotion = ctx?.reducedMotion ?? osReducedMotion;
67
+ const resolvedRtl = rtl ?? ctx?.rtl ?? I18nManager.isRTL;
68
+ const bg = backgroundColor ?? themeColors.background;
69
+ const highlight = highlightColor ?? themeColors.highlight;
70
+ const colors = gradientColors ?? buildSweepGradient(bg, highlight);
71
+
72
+ // Reduced motion: never run shimmer/wave/pulse at full intensity. Fall back to a
73
+ // slow "breathing" effect unless the consumer explicitly asked for "none".
74
+ const effectiveAnimation = reducedMotion && resolvedAnimation !== "none" ? "breathing" : resolvedAnimation;
75
+ const disabled = effectiveAnimation === "none";
76
+ const shimmer = useShimmerTransform(measuredWidth, {
77
+ duration: resolvedDuration,
78
+ delay,
79
+ disabled: disabled || effectiveAnimation !== "shimmer",
80
+ performanceMode: resolvedPerformanceMode
81
+ });
82
+ const wave = useWaveTransform(measuredWidth, {
83
+ duration: resolvedDuration,
84
+ delay,
85
+ disabled: disabled || effectiveAnimation !== "wave",
86
+ performanceMode: resolvedPerformanceMode
87
+ });
88
+ const pulseStyle = usePulseStyle({
89
+ duration: resolvedDuration,
90
+ delay,
91
+ disabled: disabled || effectiveAnimation !== "pulse",
92
+ performanceMode: resolvedPerformanceMode
93
+ });
94
+ const breathingStyle = useBreathingStyle({
95
+ duration: reducedMotion ? resolvedDuration * 1.6 : resolvedDuration,
96
+ delay,
97
+ disabled: disabled || effectiveAnimation !== "breathing",
98
+ performanceMode: resolvedPerformanceMode,
99
+ // Reduced-motion breathing should be extra subtle.
100
+ minScale: reducedMotion ? 0.99 : 0.97,
101
+ minOpacity: reducedMotion ? 0.92 : 0.85
102
+ });
103
+ const containerStyle = [{
104
+ width,
105
+ height,
106
+ borderRadius,
107
+ overflow: "hidden",
108
+ backgroundColor: bg
109
+ }, style];
110
+ const renderOverlay = () => {
111
+ if (disabled) return null;
112
+ if (effectiveAnimation === "pulse") {
113
+ return /*#__PURE__*/React.createElement(Animated.View, {
114
+ pointerEvents: "none",
115
+ style: [{
116
+ position: "absolute",
117
+ top: 0,
118
+ right: 0,
119
+ bottom: 0,
120
+ left: 0,
121
+ backgroundColor: highlight
122
+ }, pulseStyle]
123
+ });
124
+ }
125
+ if (effectiveAnimation === "breathing") {
126
+ return /*#__PURE__*/React.createElement(Animated.View, {
127
+ pointerEvents: "none",
128
+ style: [{
129
+ position: "absolute",
130
+ top: 0,
131
+ right: 0,
132
+ bottom: 0,
133
+ left: 0,
134
+ backgroundColor: highlight
135
+ }, breathingStyle]
136
+ });
137
+ }
138
+ if (effectiveAnimation === "shimmer" || effectiveAnimation === "wave") {
139
+ const transform = effectiveAnimation === "shimmer" ? shimmer : wave;
140
+ const flip = resolvedRtl ? {
141
+ transform: [{
142
+ scaleX: -1
143
+ }]
144
+ } : null;
145
+ return /*#__PURE__*/React.createElement(Animated.View, {
146
+ pointerEvents: "none",
147
+ style: [{
148
+ position: "absolute",
149
+ top: 0,
150
+ bottom: 0,
151
+ left: 0
152
+ }, {
153
+ width: transform.sweepWidth
154
+ }, transform.style, flip]
155
+ }, /*#__PURE__*/React.createElement(AnimatedLinearGradient, {
156
+ colors: colors,
157
+ start: {
158
+ x: 0,
159
+ y: 0
160
+ },
161
+ end: {
162
+ x: 1,
163
+ y: 0
164
+ },
165
+ style: {
166
+ flex: 1
167
+ }
168
+ }));
169
+ }
170
+ return null;
171
+ };
172
+ return /*#__PURE__*/React.createElement(View, {
173
+ onLayout: onLayout,
174
+ style: containerStyle,
175
+ accessible: accessible,
176
+ accessibilityRole: accessible ? "image" : undefined,
177
+ accessibilityLabel: accessible ? accessibilityLabel : undefined,
178
+ accessibilityState: accessible ? {
179
+ busy: true
180
+ } : undefined
181
+ // importantForAccessibility keeps these decorative-but-informative
182
+ // nodes from over-announcing on Android when nested in lists.
183
+ ,
184
+ importantForAccessibility: accessible ? "yes" : "no-hide-descendants",
185
+ testID: testID
186
+ }, renderOverlay());
187
+ }
188
+ //# sourceMappingURL=Skeleton.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["React","useCallback","useContext","useState","I18nManager","View","Animated","SkeletonContext","useSkeletonTheme","useReducedMotion","useShimmerTransform","usePulseStyle","useWaveTransform","useBreathingStyle","buildSweepGradient","LinearGradientComponent","require","LinearGradient","default","AnimatedLinearGradient","createAnimatedComponent","Skeleton","width","height","borderRadius","backgroundColor","highlightColor","gradientColors","animation","duration","delay","rtl","colorVariant","style","accessibilityLabel","accessible","testID","ctx","themeColors","osReducedMotion","measuredWidth","setMeasuredWidth","onLayout","e","nativeEvent","layout","resolvedAnimation","resolvedDuration","resolvedPerformanceMode","performanceMode","reducedMotion","resolvedRtl","isRTL","bg","background","highlight","colors","effectiveAnimation","disabled","shimmer","wave","pulseStyle","breathingStyle","minScale","minOpacity","containerStyle","overflow","renderOverlay","createElement","pointerEvents","position","top","right","bottom","left","transform","flip","scaleX","sweepWidth","start","x","y","end","flex","accessibilityRole","undefined","accessibilityState","busy","importantForAccessibility"],"sourceRoot":"../../../src","sources":["components/Skeleton.tsx"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,21 @@
1
+ function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
2
+ import React from "react";
3
+ import Skeleton from "./Skeleton";
4
+ /**
5
+ * A square skeleton placeholder with equal width and height.
6
+ *
7
+ * @example
8
+ * <Skeleton.Square size={64} borderRadius={8} />
9
+ */
10
+ export default function Square({
11
+ size = 50,
12
+ borderRadius = 4,
13
+ ...props
14
+ }) {
15
+ return /*#__PURE__*/React.createElement(Skeleton, _extends({
16
+ width: size,
17
+ height: size,
18
+ borderRadius: borderRadius
19
+ }, props));
20
+ }
21
+ //# sourceMappingURL=Square.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["React","Skeleton","Square","size","borderRadius","props","createElement","_extends","width","height"],"sourceRoot":"../../../src","sources":["components/Square.tsx"],"mappings":";AAAA,OAAOA,KAAK,MAAM,OAAO;AACzB,OAAOC,QAAQ,MAAM,YAAY;AAGjC;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,SAASC,MAAMA,CAAC;EAAEC,IAAI,GAAG,EAAE;EAAEC,YAAY,GAAG,CAAC;EAAE,GAAGC;AAA2B,CAAC,EAAE;EAC3F,oBAAOL,KAAA,CAAAM,aAAA,CAACL,QAAQ,EAAAM,QAAA;IAACC,KAAK,EAAEL,IAAK;IAACM,MAAM,EAAEN,IAAK;IAACC,YAAY,EAAEA;EAAa,GAAKC,KAAK,CAAG,CAAC;AACzF","ignoreList":[]}
Binary file
@@ -0,0 +1,37 @@
1
+ import { useEffect, useState } from "react";
2
+ import { AccessibilityInfo } from "react-native";
3
+
4
+ /**
5
+ * Tracks the OS-level "reduce motion" accessibility setting
6
+ * (Reduce Motion on iOS, Remove Animations on Android) and keeps it
7
+ * up to date if the user changes the setting while the app is running.
8
+ *
9
+ * Skeleton animations should fall back to a static or near-static
10
+ * appearance (or the "breathing" animation at a slow, low-amplitude
11
+ * rate) when this returns true.
12
+ */
13
+ export function useReducedMotion() {
14
+ const [reducedMotion, setReducedMotion] = useState(false);
15
+ useEffect(() => {
16
+ let isMounted = true;
17
+ AccessibilityInfo.isReduceMotionEnabled?.().then(enabled => {
18
+ if (isMounted) setReducedMotion(!!enabled);
19
+ }).catch(() => {
20
+ // Some platforms/environments (e.g. older RN, web shims) may not
21
+ // implement this — default to false (animations enabled).
22
+ });
23
+ const subscription = AccessibilityInfo.addEventListener("reduceMotionChanged", enabled => {
24
+ setReducedMotion(!!enabled);
25
+ });
26
+ return () => {
27
+ isMounted = false;
28
+ // RN >= 0.65 returns an EmitterSubscription with `.remove()`.
29
+ // Older versions returned void and relied on removeEventListener.
30
+ if (subscription && typeof subscription.remove === "function") {
31
+ subscription.remove();
32
+ }
33
+ };
34
+ }, []);
35
+ return reducedMotion;
36
+ }
37
+ //# sourceMappingURL=useReducedMotion.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["useEffect","useState","AccessibilityInfo","useReducedMotion","reducedMotion","setReducedMotion","isMounted","isReduceMotionEnabled","then","enabled","catch","subscription","addEventListener","remove"],"sourceRoot":"../../../src","sources":["hooks/useReducedMotion.ts"],"mappings":"AAAA,SAASA,SAAS,EAAEC,QAAQ,QAAQ,OAAO;AAC3C,SAASC,iBAAiB,QAAQ,cAAc;;AAEhD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,gBAAgBA,CAAA,EAAY;EACxC,MAAM,CAACC,aAAa,EAAEC,gBAAgB,CAAC,GAAGJ,QAAQ,CAAC,KAAK,CAAC;EAEzDD,SAAS,CAAC,MAAM;IACZ,IAAIM,SAAS,GAAG,IAAI;IAEpBJ,iBAAiB,CAACK,qBAAqB,GAAG,CAAC,CACtCC,IAAI,CAAEC,OAAO,IAAK;MACf,IAAIH,SAAS,EAAED,gBAAgB,CAAC,CAAC,CAACI,OAAO,CAAC;IAC9C,CAAC,CAAC,CACDC,KAAK,CAAC,MAAM;MACT;MACA;IAAA,CACH,CAAC;IAEN,MAAMC,YAAY,GAAGT,iBAAiB,CAACU,gBAAgB,CACnD,qBAAqB,EACpBH,OAAgB,IAAK;MAClBJ,gBAAgB,CAAC,CAAC,CAACI,OAAO,CAAC;IAC/B,CACJ,CAAC;IAED,OAAO,MAAM;MACTH,SAAS,GAAG,KAAK;MACjB;MACA;MACA,IAAIK,YAAY,IAAI,OAAQA,YAAY,CAASE,MAAM,KAAK,UAAU,EAAE;QACnEF,YAAY,CAASE,MAAM,CAAC,CAAC;MAClC;IACJ,CAAC;EACL,CAAC,EAAE,EAAE,CAAC;EAEN,OAAOT,aAAa;AACxB","ignoreList":[]}
@@ -0,0 +1,40 @@
1
+ import { useContext, useMemo } from "react";
2
+ import { useColorScheme } from "react-native";
3
+ import { SkeletonContext } from "../providers/SkeletonProvider";
4
+ import { getDefaultThemeColors } from "../utils/theme";
5
+ import { resolveThemeColors } from "../utils/colors";
6
+ /**
7
+ * Resolves the active light/dark colors for a skeleton.
8
+ *
9
+ * If used inside a <SkeletonProvider>, honors its `theme` prop ("light" | "dark" | "system")
10
+ * and any registered brand `colors`. If used standalone (no provider), falls back to the
11
+ * device's OS color scheme and the library's default palette.
12
+ *
13
+ * @param colorVariant optional brand color variant name registered on the provider
14
+ */
15
+ export function useSkeletonTheme(colorVariant) {
16
+ const ctx = useContext(SkeletonContext);
17
+ const systemScheme = useColorScheme();
18
+ return useMemo(() => {
19
+ if (ctx) {
20
+ const colors = ctx.getVariantColors(colorVariant);
21
+ return {
22
+ isDark: ctx.isDark,
23
+ background: colors.background,
24
+ highlight: colors.highlight
25
+ };
26
+ }
27
+ const isDark = systemScheme === "dark";
28
+ const fallback = getDefaultThemeColors(isDark);
29
+ const colors = resolveThemeColors({
30
+ isDark,
31
+ ambient: fallback
32
+ });
33
+ return {
34
+ isDark,
35
+ background: colors.background,
36
+ highlight: colors.highlight
37
+ };
38
+ }, [ctx, systemScheme, colorVariant]);
39
+ }
40
+ //# sourceMappingURL=useSkeletonTheme.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["useContext","useMemo","useColorScheme","SkeletonContext","getDefaultThemeColors","resolveThemeColors","useSkeletonTheme","colorVariant","ctx","systemScheme","colors","getVariantColors","isDark","background","highlight","fallback","ambient"],"sourceRoot":"../../../src","sources":["hooks/useSkeletonTheme.ts"],"mappings":"AAAA,SAASA,UAAU,EAAEC,OAAO,QAAQ,OAAO;AAC3C,SAASC,cAAc,QAAQ,cAAc;AAC7C,SAASC,eAAe,QAAQ,+BAA+B;AAC/D,SAASC,qBAAqB,QAAQ,gBAAgB;AACtD,SAASC,kBAAkB,QAAQ,iBAAiB;AAGpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,gBAAgBA,CAACC,YAAqB,EAAyB;EAC3E,MAAMC,GAAG,GAAGR,UAAU,CAACG,eAAe,CAAC;EACvC,MAAMM,YAAY,GAAGP,cAAc,CAAC,CAAC;EAErC,OAAOD,OAAO,CAAC,MAAM;IACjB,IAAIO,GAAG,EAAE;MACL,MAAME,MAAM,GAAGF,GAAG,CAACG,gBAAgB,CAACJ,YAAY,CAAC;MACjD,OAAO;QACHK,MAAM,EAAEJ,GAAG,CAACI,MAAM;QAClBC,UAAU,EAAEH,MAAM,CAACG,UAAU;QAC7BC,SAAS,EAAEJ,MAAM,CAACI;MACtB,CAAC;IACL;IAEA,MAAMF,MAAM,GAAGH,YAAY,KAAK,MAAM;IACtC,MAAMM,QAAQ,GAAGX,qBAAqB,CAACQ,MAAM,CAAC;IAE9C,MAAMF,MAAM,GAAGL,kBAAkB,CAAC;MAC9BO,MAAM;MACNI,OAAO,EAAED;IACb,CAAC,CAAC;IAEF,OAAO;MACHH,MAAM;MACNC,UAAU,EAAEH,MAAM,CAACG,UAAU;MAC7BC,SAAS,EAAEJ,MAAM,CAACI;IACtB,CAAC;EACL,CAAC,EAAE,CAACN,GAAG,EAAEC,YAAY,EAAEF,YAAY,CAAC,CAAC;AACzC","ignoreList":[]}
@@ -0,0 +1,50 @@
1
+ import SkeletonBase from "./components/Skeleton";
2
+ import Rect from "./components/Rect";
3
+ import Circle from "./components/Circle";
4
+ import Square from "./components/Square";
5
+ import Pill from "./components/Pill";
6
+ import Group from "./components/Group";
7
+ import Profile from "./presets/Profile";
8
+ import Card from "./presets/Card";
9
+ import Chat from "./presets/Chat";
10
+ import Product from "./presets/Product";
11
+ import Video from "./presets/Video";
12
+ import SkeletonClone from "./clone/SkeletonClone";
13
+ export { SkeletonProvider, SkeletonContext } from "./providers/SkeletonProvider";
14
+ export { useSkeletonTheme } from "./hooks/useSkeletonTheme";
15
+ export { useReducedMotion } from "./hooks/useReducedMotion";
16
+
17
+ /**
18
+ * `Skeleton` is the library's primary export: a callable base component
19
+ * (`<Skeleton />`) that also carries every shape, the layout-grouping
20
+ * helper, and every smart preset as static properties — so you only ever
21
+ * need a single import.
22
+ *
23
+ * @example
24
+ * import { Skeleton, SkeletonProvider } from "react-native-smart-skeleton";
25
+ *
26
+ * <SkeletonProvider>
27
+ * <Skeleton.Rect width={200} height={20} />
28
+ * <Skeleton.Circle size={48} />
29
+ * <Skeleton.Profile lines={2} />
30
+ * </SkeletonProvider>
31
+ */
32
+
33
+ const Skeleton = SkeletonBase;
34
+ Skeleton.Rect = Rect;
35
+ Skeleton.Circle = Circle;
36
+ Skeleton.Square = Square;
37
+ Skeleton.Pill = Pill;
38
+ Skeleton.Group = Group;
39
+ Skeleton.Clone = SkeletonClone;
40
+ Skeleton.Profile = Profile;
41
+ Skeleton.Card = Card;
42
+ Skeleton.Chat = Chat;
43
+ Skeleton.Product = Product;
44
+ Skeleton.Video = Video;
45
+ export { Skeleton };
46
+ export { SkeletonBase };
47
+ export { Rect, Circle, Square, Pill, Group, SkeletonClone };
48
+ export { Profile, Card, Chat, Product, Video };
49
+ export default Skeleton;
50
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["SkeletonBase","Rect","Circle","Square","Pill","Group","Profile","Card","Chat","Product","Video","SkeletonClone","SkeletonProvider","SkeletonContext","useSkeletonTheme","useReducedMotion","Skeleton","Clone"],"sourceRoot":"../../src","sources":["index.ts"],"mappings":"AAAA,OAAOA,YAAY,MAAM,uBAAuB;AAChD,OAAOC,IAAI,MAAM,mBAAmB;AACpC,OAAOC,MAAM,MAAM,qBAAqB;AACxC,OAAOC,MAAM,MAAM,qBAAqB;AACxC,OAAOC,IAAI,MAAM,mBAAmB;AACpC,OAAOC,KAAK,MAAM,oBAAoB;AAEtC,OAAOC,OAAO,MAAM,mBAAmB;AACvC,OAAOC,IAAI,MAAM,gBAAgB;AACjC,OAAOC,IAAI,MAAM,gBAAgB;AACjC,OAAOC,OAAO,MAAM,mBAAmB;AACvC,OAAOC,KAAK,MAAM,iBAAiB;AAEnC,OAAOC,aAAa,MAAM,uBAAuB;AAEjD,SAASC,gBAAgB,EAAEC,eAAe,QAAQ,8BAA8B;AAChF,SAASC,gBAAgB,QAAQ,0BAA0B;AAC3D,SAASC,gBAAgB,QAAQ,0BAA0B;;AA4B3D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAeA,MAAMC,QAAQ,GAAGhB,YAAiC;AAElDgB,QAAQ,CAACf,IAAI,GAAGA,IAAI;AACpBe,QAAQ,CAACd,MAAM,GAAGA,MAAM;AACxBc,QAAQ,CAACb,MAAM,GAAGA,MAAM;AACxBa,QAAQ,CAACZ,IAAI,GAAGA,IAAI;AACpBY,QAAQ,CAACX,KAAK,GAAGA,KAAK;AACtBW,QAAQ,CAACC,KAAK,GAAGN,aAAa;AAC9BK,QAAQ,CAACV,OAAO,GAAGA,OAAO;AAC1BU,QAAQ,CAACT,IAAI,GAAGA,IAAI;AACpBS,QAAQ,CAACR,IAAI,GAAGA,IAAI;AACpBQ,QAAQ,CAACP,OAAO,GAAGA,OAAO;AAC1BO,QAAQ,CAACN,KAAK,GAAGA,KAAK;AAEtB,SAASM,QAAQ;AACjB,SAAShB,YAAY;AACrB,SAASC,IAAI,EAAEC,MAAM,EAAEC,MAAM,EAAEC,IAAI,EAAEC,KAAK,EAAEM,aAAa;AACzD,SAASL,OAAO,EAAEC,IAAI,EAAEC,IAAI,EAAEC,OAAO,EAAEC,KAAK;AAE5C,eAAeM,QAAQ","ignoreList":[]}
@@ -0,0 +1,76 @@
1
+ function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
2
+ import React from "react";
3
+ import { View } from "react-native";
4
+ import Skeleton from "../components/Skeleton";
5
+ import Circle from "../components/Circle";
6
+ import Group from "../components/Group";
7
+ /**
8
+ * A ready-made skeleton block mimicking a typical content card: an image
9
+ * area on top, optionally a small avatar + name row, then body text lines.
10
+ *
11
+ * @example
12
+ * <Skeleton.Card imageHeight={160} lines={3} />
13
+ */
14
+ export default function Card({
15
+ imageHeight = 160,
16
+ lines = 3,
17
+ showAvatar = false,
18
+ count = 1,
19
+ gap = 20,
20
+ animation,
21
+ style,
22
+ testID
23
+ }) {
24
+ return /*#__PURE__*/React.createElement(View, {
25
+ style: style,
26
+ testID: testID
27
+ }, Array.from({
28
+ length: count
29
+ }).map((_, blockIndex) => /*#__PURE__*/React.createElement(View, {
30
+ key: blockIndex,
31
+ style: {
32
+ marginTop: blockIndex === 0 ? 0 : gap
33
+ }
34
+ }, /*#__PURE__*/React.createElement(Skeleton, {
35
+ width: "100%",
36
+ height: imageHeight,
37
+ borderRadius: 12,
38
+ animation: animation
39
+ }), showAvatar && /*#__PURE__*/React.createElement(View, {
40
+ style: {
41
+ flexDirection: "row",
42
+ alignItems: "center",
43
+ marginTop: 12
44
+ }
45
+ }, /*#__PURE__*/React.createElement(Circle, {
46
+ size: 32,
47
+ animation: animation
48
+ }), /*#__PURE__*/React.createElement(Skeleton, {
49
+ width: "40%",
50
+ height: 12,
51
+ style: {
52
+ marginLeft: 8
53
+ },
54
+ animation: animation
55
+ })), /*#__PURE__*/React.createElement(Group, {
56
+ staggerDelay: 60,
57
+ animation: animation,
58
+ style: {
59
+ marginTop: showAvatar ? 12 : 16
60
+ }
61
+ }, Array.from({
62
+ length: lines
63
+ }, (__, lineIndex) => {
64
+ const lineProps = {
65
+ width: lineIndex === lines - 1 ? "50%" : "100%",
66
+ height: 12,
67
+ style: {
68
+ marginTop: lineIndex === 0 ? 0 : 8
69
+ }
70
+ };
71
+ return /*#__PURE__*/React.createElement(Skeleton, _extends({
72
+ key: lineIndex
73
+ }, lineProps));
74
+ })))));
75
+ }
76
+ //# sourceMappingURL=Card.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["React","View","Skeleton","Circle","Group","Card","imageHeight","lines","showAvatar","count","gap","animation","style","testID","createElement","Array","from","length","map","_","blockIndex","key","marginTop","width","height","borderRadius","flexDirection","alignItems","size","marginLeft","staggerDelay","__","lineIndex","lineProps","_extends"],"sourceRoot":"../../../src","sources":["presets/Card.tsx"],"mappings":";AAAA,OAAOA,KAAK,MAAM,OAAO;AACzB,SAASC,IAAI,QAAQ,cAAc;AACnC,OAAOC,QAAQ,MAAM,wBAAwB;AAC7C,OAAOC,MAAM,MAAM,sBAAsB;AACzC,OAAOC,KAAK,MAAM,qBAAqB;AAGvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,SAASC,IAAIA,CAAC;EACzBC,WAAW,GAAG,GAAG;EACjBC,KAAK,GAAG,CAAC;EACTC,UAAU,GAAG,KAAK;EAClBC,KAAK,GAAG,CAAC;EACTC,GAAG,GAAG,EAAE;EACRC,SAAS;EACTC,KAAK;EACLC;AACqB,CAAC,EAAE;EACxB,oBACIb,KAAA,CAAAc,aAAA,CAACb,IAAI;IAACW,KAAK,EAAEA,KAAM;IAACC,MAAM,EAAEA;EAAO,GAC9BE,KAAK,CAACC,IAAI,CAAC;IAAEC,MAAM,EAAER;EAAM,CAAC,CAAC,CAACS,GAAG,CAAC,CAACC,CAAC,EAAEC,UAAU,kBAC7CpB,KAAA,CAAAc,aAAA,CAACb,IAAI;IAACoB,GAAG,EAAED,UAAW;IAACR,KAAK,EAAE;MAAEU,SAAS,EAAEF,UAAU,KAAK,CAAC,GAAG,CAAC,GAAGV;IAAI;EAAE,gBACpEV,KAAA,CAAAc,aAAA,CAACZ,QAAQ;IAACqB,KAAK,EAAC,MAAM;IAACC,MAAM,EAAElB,WAAY;IAACmB,YAAY,EAAE,EAAG;IAACd,SAAS,EAAEA;EAAU,CAAE,CAAC,EAErFH,UAAU,iBACPR,KAAA,CAAAc,aAAA,CAACb,IAAI;IAACW,KAAK,EAAE;MAAEc,aAAa,EAAE,KAAK;MAAEC,UAAU,EAAE,QAAQ;MAAEL,SAAS,EAAE;IAAG;EAAE,gBACvEtB,KAAA,CAAAc,aAAA,CAACX,MAAM;IAACyB,IAAI,EAAE,EAAG;IAACjB,SAAS,EAAEA;EAAU,CAAE,CAAC,eAC1CX,KAAA,CAAAc,aAAA,CAACZ,QAAQ;IAACqB,KAAK,EAAC,KAAK;IAACC,MAAM,EAAE,EAAG;IAACZ,KAAK,EAAE;MAAEiB,UAAU,EAAE;IAAE,CAAE;IAAClB,SAAS,EAAEA;EAAU,CAAE,CACjF,CACT,eAEDX,KAAA,CAAAc,aAAA,CAACV,KAAK;IACF0B,YAAY,EAAE,EAAG;IACjBnB,SAAS,EAAEA,SAAU;IACrBC,KAAK,EAAE;MAAEU,SAAS,EAAEd,UAAU,GAAG,EAAE,GAAG;IAAG;EAAE,GAE1CO,KAAK,CAACC,IAAI,CAAC;IAAEC,MAAM,EAAEV;EAAM,CAAC,EAAE,CAACwB,EAAE,EAAEC,SAAS,KAAK;IAC9C,MAAMC,SAAwB,GAAG;MAC7BV,KAAK,EAAES,SAAS,KAAKzB,KAAK,GAAG,CAAC,GAAG,KAAK,GAAG,MAAM;MAC/CiB,MAAM,EAAE,EAAE;MACVZ,KAAK,EAAE;QAAEU,SAAS,EAAEU,SAAS,KAAK,CAAC,GAAG,CAAC,GAAG;MAAE;IAChD,CAAC;IACD,oBAAOhC,KAAA,CAAAc,aAAA,CAACZ,QAAQ,EAAAgC,QAAA;MAACb,GAAG,EAAEW;IAAU,GAAKC,SAAS,CAAG,CAAC;EACtD,CAAC,CACE,CACL,CACT,CACC,CAAC;AAEf","ignoreList":[]}
@@ -0,0 +1,47 @@
1
+ import React from "react";
2
+ import { View } from "react-native";
3
+ import Skeleton from "../components/Skeleton";
4
+ const BUBBLE_WIDTHS = ["55%", "70%", "45%", "62%"];
5
+
6
+ /**
7
+ * A ready-made skeleton block mimicking a chat conversation: a series of
8
+ * message bubbles, alternating left/right alignment by default to read as
9
+ * a two-party conversation while loading.
10
+ *
11
+ * @example
12
+ * <Skeleton.Chat messages={5} />
13
+ */
14
+ export default function Chat({
15
+ messages = 4,
16
+ alternate = true,
17
+ gap = 12,
18
+ animation,
19
+ style,
20
+ testID
21
+ }) {
22
+ return /*#__PURE__*/React.createElement(View, {
23
+ style: style,
24
+ testID: testID
25
+ }, Array.from({
26
+ length: messages
27
+ }).map((_, index) => {
28
+ const isRight = alternate && index % 2 === 1;
29
+ const width = BUBBLE_WIDTHS[index % BUBBLE_WIDTHS.length];
30
+ const height = 18 + index % 3 * 6;
31
+ return /*#__PURE__*/React.createElement(View, {
32
+ key: index,
33
+ style: {
34
+ flexDirection: "row",
35
+ justifyContent: isRight ? "flex-end" : "flex-start",
36
+ marginTop: index === 0 ? 0 : gap
37
+ }
38
+ }, /*#__PURE__*/React.createElement(Skeleton, {
39
+ width: width,
40
+ height: height,
41
+ borderRadius: 14,
42
+ animation: animation,
43
+ delay: index * 70
44
+ }));
45
+ }));
46
+ }
47
+ //# sourceMappingURL=Chat.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["React","View","Skeleton","BUBBLE_WIDTHS","Chat","messages","alternate","gap","animation","style","testID","createElement","Array","from","length","map","_","index","isRight","width","height","key","flexDirection","justifyContent","marginTop","borderRadius","delay"],"sourceRoot":"../../../src","sources":["presets/Chat.tsx"],"mappings":"AAAA,OAAOA,KAAK,MAAM,OAAO;AACzB,SAASC,IAAI,QAAQ,cAAc;AACnC,OAAOC,QAAQ,MAAM,wBAAwB;AAG7C,MAAMC,aAAa,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC;;AAElD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,SAASC,IAAIA,CAAC;EACzBC,QAAQ,GAAG,CAAC;EACZC,SAAS,GAAG,IAAI;EAChBC,GAAG,GAAG,EAAE;EACRC,SAAS;EACTC,KAAK;EACLC;AACqB,CAAC,EAAE;EACxB,oBACIV,KAAA,CAAAW,aAAA,CAACV,IAAI;IAACQ,KAAK,EAAEA,KAAM;IAACC,MAAM,EAAEA;EAAO,GAC9BE,KAAK,CAACC,IAAI,CAAC;IAAEC,MAAM,EAAET;EAAS,CAAC,CAAC,CAACU,GAAG,CAAC,CAACC,CAAC,EAAEC,KAAK,KAAK;IAChD,MAAMC,OAAO,GAAGZ,SAAS,IAAIW,KAAK,GAAG,CAAC,KAAK,CAAC;IAC5C,MAAME,KAAK,GAAGhB,aAAa,CAACc,KAAK,GAAGd,aAAa,CAACW,MAAM,CAAC;IACzD,MAAMM,MAAM,GAAG,EAAE,GAAKH,KAAK,GAAG,CAAC,GAAI,CAAE;IAErC,oBACIjB,KAAA,CAAAW,aAAA,CAACV,IAAI;MACDoB,GAAG,EAAEJ,KAAM;MACXR,KAAK,EAAE;QACHa,aAAa,EAAE,KAAK;QACpBC,cAAc,EAAEL,OAAO,GAAG,UAAU,GAAG,YAAY;QACnDM,SAAS,EAAEP,KAAK,KAAK,CAAC,GAAG,CAAC,GAAGV;MACjC;IAAE,gBAEFP,KAAA,CAAAW,aAAA,CAACT,QAAQ;MACLiB,KAAK,EAAEA,KAAM;MACbC,MAAM,EAAEA,MAAO;MACfK,YAAY,EAAE,EAAG;MACjBjB,SAAS,EAAEA,SAAU;MACrBkB,KAAK,EAAET,KAAK,GAAG;IAAG,CACrB,CACC,CAAC;EAEf,CAAC,CACC,CAAC;AAEf","ignoreList":[]}
@@ -0,0 +1,63 @@
1
+ import React from "react";
2
+ import { View } from "react-native";
3
+ import Skeleton from "../components/Skeleton";
4
+ import { getRecommendedColumns } from "../utils/responsive";
5
+ /**
6
+ * A ready-made skeleton grid mimicking a product listing (e.g. e-commerce
7
+ * catalog or search results): square-ish image, title line, and price line,
8
+ * tiled into a responsive grid.
9
+ *
10
+ * @example
11
+ * <Skeleton.Product count={6} columns={2} />
12
+ */
13
+ export default function Product({
14
+ imageHeight = 140,
15
+ columns,
16
+ count = 4,
17
+ gap = 16,
18
+ animation,
19
+ style,
20
+ testID
21
+ }) {
22
+ const resolvedColumns = columns ?? getRecommendedColumns();
23
+ const itemWidth = `${100 / resolvedColumns}%`;
24
+ return /*#__PURE__*/React.createElement(View, {
25
+ style: [{
26
+ flexDirection: "row",
27
+ flexWrap: "wrap"
28
+ }, style],
29
+ testID: testID
30
+ }, Array.from({
31
+ length: count
32
+ }).map((_, index) => /*#__PURE__*/React.createElement(View, {
33
+ key: index,
34
+ style: {
35
+ width: itemWidth,
36
+ paddingHorizontal: gap / 2,
37
+ marginBottom: gap
38
+ }
39
+ }, /*#__PURE__*/React.createElement(Skeleton, {
40
+ width: "100%",
41
+ height: imageHeight,
42
+ borderRadius: 10,
43
+ animation: animation,
44
+ delay: index * 40
45
+ }), /*#__PURE__*/React.createElement(Skeleton, {
46
+ width: "80%",
47
+ height: 12,
48
+ style: {
49
+ marginTop: 8
50
+ },
51
+ animation: animation,
52
+ delay: index * 40
53
+ }), /*#__PURE__*/React.createElement(Skeleton, {
54
+ width: "40%",
55
+ height: 12,
56
+ style: {
57
+ marginTop: 6
58
+ },
59
+ animation: animation,
60
+ delay: index * 40
61
+ }))));
62
+ }
63
+ //# sourceMappingURL=Product.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["React","View","Skeleton","getRecommendedColumns","Product","imageHeight","columns","count","gap","animation","style","testID","resolvedColumns","itemWidth","createElement","flexDirection","flexWrap","Array","from","length","map","_","index","key","width","paddingHorizontal","marginBottom","height","borderRadius","delay","marginTop"],"sourceRoot":"../../../src","sources":["presets/Product.tsx"],"mappings":"AAAA,OAAOA,KAAK,MAAM,OAAO;AACzB,SAASC,IAAI,QAAQ,cAAc;AACnC,OAAOC,QAAQ,MAAM,wBAAwB;AAC7C,SAASC,qBAAqB,QAAQ,qBAAqB;AAG3D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,SAASC,OAAOA,CAAC;EAC5BC,WAAW,GAAG,GAAG;EACjBC,OAAO;EACPC,KAAK,GAAG,CAAC;EACTC,GAAG,GAAG,EAAE;EACRC,SAAS;EACTC,KAAK;EACLC;AACwB,CAAC,EAAE;EAC3B,MAAMC,eAAe,GAAGN,OAAO,IAAIH,qBAAqB,CAAC,CAAC;EAC1D,MAAMU,SAAS,GAAG,GAAG,GAAG,GAAGD,eAAe,GAAG;EAE7C,oBACIZ,KAAA,CAAAc,aAAA,CAACb,IAAI;IAACS,KAAK,EAAE,CAAC;MAAEK,aAAa,EAAE,KAAK;MAAEC,QAAQ,EAAE;IAAO,CAAC,EAAEN,KAAK,CAAE;IAACC,MAAM,EAAEA;EAAO,GAC5EM,KAAK,CAACC,IAAI,CAAC;IAAEC,MAAM,EAAEZ;EAAM,CAAC,CAAC,CAACa,GAAG,CAAC,CAACC,CAAC,EAAEC,KAAK,kBACxCtB,KAAA,CAAAc,aAAA,CAACb,IAAI;IACDsB,GAAG,EAAED,KAAM;IACXZ,KAAK,EAAE;MACHc,KAAK,EAAEX,SAAgB;MACvBY,iBAAiB,EAAEjB,GAAG,GAAG,CAAC;MAC1BkB,YAAY,EAAElB;IAClB;EAAE,gBAEFR,KAAA,CAAAc,aAAA,CAACZ,QAAQ;IAACsB,KAAK,EAAC,MAAM;IAACG,MAAM,EAAEtB,WAAY;IAACuB,YAAY,EAAE,EAAG;IAACnB,SAAS,EAAEA,SAAU;IAACoB,KAAK,EAAEP,KAAK,GAAG;EAAG,CAAE,CAAC,eACzGtB,KAAA,CAAAc,aAAA,CAACZ,QAAQ;IAACsB,KAAK,EAAC,KAAK;IAACG,MAAM,EAAE,EAAG;IAACjB,KAAK,EAAE;MAAEoB,SAAS,EAAE;IAAE,CAAE;IAACrB,SAAS,EAAEA,SAAU;IAACoB,KAAK,EAAEP,KAAK,GAAG;EAAG,CAAE,CAAC,eACtGtB,KAAA,CAAAc,aAAA,CAACZ,QAAQ;IAACsB,KAAK,EAAC,KAAK;IAACG,MAAM,EAAE,EAAG;IAACjB,KAAK,EAAE;MAAEoB,SAAS,EAAE;IAAE,CAAE;IAACrB,SAAS,EAAEA,SAAU;IAACoB,KAAK,EAAEP,KAAK,GAAG;EAAG,CAAE,CACnG,CACT,CACC,CAAC;AAEf","ignoreList":[]}
@@ -0,0 +1,60 @@
1
+ function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
2
+ import React from "react";
3
+ import { View } from "react-native";
4
+ import Skeleton from "../components/Skeleton";
5
+ import Circle from "../components/Circle";
6
+ import Group from "../components/Group";
7
+ /**
8
+ * A ready-made skeleton block mimicking a profile header: a circular avatar
9
+ * beside a name line and one or more secondary text lines (e.g. handle/bio).
10
+ *
11
+ * @example
12
+ * <Skeleton.Profile avatarSize={56} lines={2} />
13
+ */
14
+ export default function Profile({
15
+ avatarSize = 56,
16
+ lines = 2,
17
+ count = 1,
18
+ gap = 16,
19
+ animation,
20
+ style,
21
+ testID
22
+ }) {
23
+ return /*#__PURE__*/React.createElement(View, {
24
+ style: style,
25
+ testID: testID
26
+ }, Array.from({
27
+ length: count
28
+ }).map((_, blockIndex) => /*#__PURE__*/React.createElement(View, {
29
+ key: blockIndex,
30
+ style: {
31
+ flexDirection: "row",
32
+ alignItems: "center",
33
+ marginTop: blockIndex === 0 ? 0 : gap
34
+ }
35
+ }, /*#__PURE__*/React.createElement(Circle, {
36
+ size: avatarSize,
37
+ animation: animation
38
+ }), /*#__PURE__*/React.createElement(Group, {
39
+ staggerDelay: 60,
40
+ animation: animation,
41
+ style: {
42
+ marginLeft: 12,
43
+ flex: 1
44
+ }
45
+ }, Array.from({
46
+ length: lines
47
+ }, (__, lineIndex) => {
48
+ const lineProps = {
49
+ width: lineIndex === 0 ? "60%" : `${85 - lineIndex * 15}%`,
50
+ height: lineIndex === 0 ? 16 : 12,
51
+ style: {
52
+ marginTop: lineIndex === 0 ? 0 : 8
53
+ }
54
+ };
55
+ return /*#__PURE__*/React.createElement(Skeleton, _extends({
56
+ key: lineIndex
57
+ }, lineProps));
58
+ })))));
59
+ }
60
+ //# sourceMappingURL=Profile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["React","View","Skeleton","Circle","Group","Profile","avatarSize","lines","count","gap","animation","style","testID","createElement","Array","from","length","map","_","blockIndex","key","flexDirection","alignItems","marginTop","size","staggerDelay","marginLeft","flex","__","lineIndex","lineProps","width","height","_extends"],"sourceRoot":"../../../src","sources":["presets/Profile.tsx"],"mappings":";AAAA,OAAOA,KAAK,MAAM,OAAO;AACzB,SAASC,IAAI,QAAQ,cAAc;AACnC,OAAOC,QAAQ,MAAM,wBAAwB;AAC7C,OAAOC,MAAM,MAAM,sBAAsB;AACzC,OAAOC,KAAK,MAAM,qBAAqB;AAGvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,SAASC,OAAOA,CAAC;EAC5BC,UAAU,GAAG,EAAE;EACfC,KAAK,GAAG,CAAC;EACTC,KAAK,GAAG,CAAC;EACTC,GAAG,GAAG,EAAE;EACRC,SAAS;EACTC,KAAK;EACLC;AACwB,CAAC,EAAE;EAC3B,oBACIZ,KAAA,CAAAa,aAAA,CAACZ,IAAI;IAACU,KAAK,EAAEA,KAAM;IAACC,MAAM,EAAEA;EAAO,GAC9BE,KAAK,CAACC,IAAI,CAAC;IAAEC,MAAM,EAAER;EAAM,CAAC,CAAC,CAACS,GAAG,CAAC,CAACC,CAAC,EAAEC,UAAU,kBAC7CnB,KAAA,CAAAa,aAAA,CAACZ,IAAI;IACDmB,GAAG,EAAED,UAAW;IAChBR,KAAK,EAAE;MACHU,aAAa,EAAE,KAAK;MACpBC,UAAU,EAAE,QAAQ;MACpBC,SAAS,EAAEJ,UAAU,KAAK,CAAC,GAAG,CAAC,GAAGV;IACtC;EAAE,gBAEFT,KAAA,CAAAa,aAAA,CAACV,MAAM;IAACqB,IAAI,EAAElB,UAAW;IAACI,SAAS,EAAEA;EAAU,CAAE,CAAC,eAClDV,KAAA,CAAAa,aAAA,CAACT,KAAK;IACFqB,YAAY,EAAE,EAAG;IACjBf,SAAS,EAAEA,SAAU;IACrBC,KAAK,EAAE;MAAEe,UAAU,EAAE,EAAE;MAAEC,IAAI,EAAE;IAAE;EAAE,GAElCb,KAAK,CAACC,IAAI,CAAC;IAAEC,MAAM,EAAET;EAAM,CAAC,EAAE,CAACqB,EAAE,EAAEC,SAAS,KAAK;IAC9C,MAAMC,SAAwB,GAAG;MAC7BC,KAAK,EAAEF,SAAS,KAAK,CAAC,GAAG,KAAK,GAAG,GAAG,EAAE,GAAGA,SAAS,GAAG,EAAE,GAAG;MAC1DG,MAAM,EAAEH,SAAS,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE;MACjClB,KAAK,EAAE;QAAEY,SAAS,EAAEM,SAAS,KAAK,CAAC,GAAG,CAAC,GAAG;MAAE;IAChD,CAAC;IACD,oBAAO7B,KAAA,CAAAa,aAAA,CAACX,QAAQ,EAAA+B,QAAA;MAACb,GAAG,EAAES;IAAU,GAAKC,SAAS,CAAG,CAAC;EACtD,CAAC,CACE,CACL,CACT,CACC,CAAC;AAEf","ignoreList":[]}