shimmer-trace 1.1.0 → 1.1.2
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 +110 -110
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -73,13 +73,13 @@ pnpm add shimmer-trace
|
|
|
73
73
|
import { Shimmer } from "shimmer-trace";
|
|
74
74
|
|
|
75
75
|
function ProfilePage() {
|
|
76
|
-
|
|
76
|
+
const [loading, setLoading] = useState(true);
|
|
77
77
|
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
78
|
+
return (
|
|
79
|
+
<Shimmer loading={loading}>
|
|
80
|
+
<UserCard />
|
|
81
|
+
</Shimmer>
|
|
82
|
+
);
|
|
83
83
|
}
|
|
84
84
|
```
|
|
85
85
|
|
|
@@ -95,18 +95,18 @@ The core component. Wrap anything with it.
|
|
|
95
95
|
|
|
96
96
|
```tsx
|
|
97
97
|
<Shimmer
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
98
|
+
loading={boolean} // required — controls shimmer on/off
|
|
99
|
+
animation="wave" // 'wave' | 'pulse' | 'shine' | 'glow' | 'gradient'
|
|
100
|
+
baseColor="#e0e0e0" // skeleton base color
|
|
101
|
+
highlightColor="#f5f5f5" // shimmer highlight color
|
|
102
|
+
speed={1.5} // animation duration in seconds
|
|
103
|
+
borderRadius="4px" // override auto-detected border-radius
|
|
104
|
+
dummyLength={10} // list mode: number of skeleton items
|
|
105
|
+
stopPropagation={false} // force this Shimmer to be a master
|
|
106
|
+
className="my-class" // applied to the container div
|
|
107
|
+
style={{ display: "flex" }} // merged into container styles
|
|
108
108
|
>
|
|
109
|
-
|
|
109
|
+
{children}
|
|
110
110
|
</Shimmer>
|
|
111
111
|
```
|
|
112
112
|
|
|
@@ -136,20 +136,20 @@ Wrap any component — shimmer-trace handles the rest.
|
|
|
136
136
|
import { Shimmer } from "shimmer-trace";
|
|
137
137
|
|
|
138
138
|
function App() {
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
139
|
+
const [loading, setLoading] = useState(true);
|
|
140
|
+
|
|
141
|
+
return (
|
|
142
|
+
<Shimmer loading={loading}>
|
|
143
|
+
<div className="profile-card">
|
|
144
|
+
<img src={user.avatar} alt="Avatar" />
|
|
145
|
+
<div>
|
|
146
|
+
<h3>{user.name}</h3>
|
|
147
|
+
<span>{user.role}</span>
|
|
148
|
+
<p>{user.bio}</p>
|
|
149
|
+
</div>
|
|
150
|
+
</div>
|
|
151
|
+
</Shimmer>
|
|
152
|
+
);
|
|
153
153
|
}
|
|
154
154
|
```
|
|
155
155
|
|
|
@@ -159,15 +159,15 @@ Works out of the box with inputs, labels, and buttons.
|
|
|
159
159
|
|
|
160
160
|
```tsx
|
|
161
161
|
<Shimmer loading={loading}>
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
162
|
+
<form>
|
|
163
|
+
<label>Email</label>
|
|
164
|
+
<input type="email" placeholder="you@example.com" />
|
|
165
165
|
|
|
166
|
-
|
|
167
|
-
|
|
166
|
+
<label>Message</label>
|
|
167
|
+
<textarea placeholder="Your message..." />
|
|
168
168
|
|
|
169
|
-
|
|
170
|
-
|
|
169
|
+
<button type="submit">Send</button>
|
|
170
|
+
</form>
|
|
171
171
|
</Shimmer>
|
|
172
172
|
```
|
|
173
173
|
|
|
@@ -177,16 +177,16 @@ Loading a list from an API? `dummyLength` clones your list item template to show
|
|
|
177
177
|
|
|
178
178
|
```tsx
|
|
179
179
|
<Shimmer loading={loading} dummyLength={10}>
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
180
|
+
{posts.map((post) => (
|
|
181
|
+
<div className="post-row" key={post.id}>
|
|
182
|
+
<img src={post.thumbnail} alt="" />
|
|
183
|
+
<div>
|
|
184
|
+
<h4>{post.title}</h4>
|
|
185
|
+
<span>{post.author}</span>
|
|
186
|
+
</div>
|
|
187
|
+
<span className="badge">{post.category}</span>
|
|
188
|
+
</div>
|
|
189
|
+
))}
|
|
190
190
|
</Shimmer>
|
|
191
191
|
```
|
|
192
192
|
|
|
@@ -202,9 +202,9 @@ One `<Shimmer>` wraps multiple cards. One overlay. One perfectly synchronized wa
|
|
|
202
202
|
|
|
203
203
|
```tsx
|
|
204
204
|
<Shimmer loading={loading} style={{ display: "flex", gap: "1rem" }}>
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
205
|
+
<StatCard value="4,821" label="Total Users" />
|
|
206
|
+
<StatCard value="98.4%" label="Uptime" />
|
|
207
|
+
<StatCard value="142ms" label="Avg Latency" />
|
|
208
208
|
</Shimmer>
|
|
209
209
|
```
|
|
210
210
|
|
|
@@ -214,7 +214,7 @@ No separate shimmers per card. One master overlay covers them all — the wave s
|
|
|
214
214
|
|
|
215
215
|
```tsx
|
|
216
216
|
<Shimmer loading={loading} baseColor="#1e1e3a" highlightColor="#2d2d52">
|
|
217
|
-
|
|
217
|
+
<DashboardWidget />
|
|
218
218
|
</Shimmer>
|
|
219
219
|
```
|
|
220
220
|
|
|
@@ -229,19 +229,19 @@ import { createShimmer } from "shimmer-trace";
|
|
|
229
229
|
|
|
230
230
|
// Create a pre-configured Shimmer component
|
|
231
231
|
const DarkShimmer = createShimmer({
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
232
|
+
baseColor: "#1e1e3a",
|
|
233
|
+
highlightColor: "#2d2d52",
|
|
234
|
+
animation: "wave",
|
|
235
|
+
speed: 1.2,
|
|
236
236
|
});
|
|
237
237
|
|
|
238
238
|
// Use it like a regular component — just add `loading`
|
|
239
239
|
function App() {
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
240
|
+
return (
|
|
241
|
+
<DarkShimmer loading={loading}>
|
|
242
|
+
<UserCard />
|
|
243
|
+
</DarkShimmer>
|
|
244
|
+
);
|
|
245
245
|
}
|
|
246
246
|
```
|
|
247
247
|
|
|
@@ -263,26 +263,26 @@ Pass the same component without data as `template`. Zero shimmer-awareness neede
|
|
|
263
263
|
|
|
264
264
|
```tsx
|
|
265
265
|
function UserCard({ user }) {
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
266
|
+
return (
|
|
267
|
+
<div className="card">
|
|
268
|
+
<img src={user.avatar} alt="" />
|
|
269
|
+
<h3>{user.name}</h3>
|
|
270
|
+
<p>{user.bio}</p>
|
|
271
|
+
</div>
|
|
272
|
+
);
|
|
273
273
|
}
|
|
274
274
|
|
|
275
275
|
// Same shape, no data — used as skeleton template
|
|
276
276
|
const UserCardSkeleton = () => (
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
277
|
+
<div className="card">
|
|
278
|
+
<img src="" alt="" />
|
|
279
|
+
<h3> </h3>
|
|
280
|
+
<p> </p>
|
|
281
|
+
</div>
|
|
282
282
|
);
|
|
283
283
|
|
|
284
284
|
<ShimmerSuspense template={<UserCardSkeleton />}>
|
|
285
|
-
|
|
285
|
+
<UserCard resource={resource} />
|
|
286
286
|
</ShimmerSuspense>;
|
|
287
287
|
```
|
|
288
288
|
|
|
@@ -294,22 +294,22 @@ No template needed. The component detects shimmer mode and renders an empty shap
|
|
|
294
294
|
import { useIsShimmering } from "shimmer-trace";
|
|
295
295
|
|
|
296
296
|
function UserCard({ resource }) {
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
297
|
+
const isShimmering = useIsShimmering();
|
|
298
|
+
|
|
299
|
+
// Skip data fetching in shimmer mode (avoids nested Suspense throw)
|
|
300
|
+
const user = isShimmering ? null : resource.read();
|
|
301
|
+
|
|
302
|
+
return (
|
|
303
|
+
<div className="card">
|
|
304
|
+
<img src={user?.avatar ?? ""} alt="" />
|
|
305
|
+
<h3>{user?.name ?? " "}</h3>
|
|
306
|
+
<p>{user?.bio ?? " "}</p>
|
|
307
|
+
</div>
|
|
308
|
+
);
|
|
309
309
|
}
|
|
310
310
|
|
|
311
311
|
<ShimmerSuspense>
|
|
312
|
-
|
|
312
|
+
<UserCard resource={resource} />
|
|
313
313
|
</ShimmerSuspense>;
|
|
314
314
|
```
|
|
315
315
|
|
|
@@ -317,12 +317,12 @@ function UserCard({ resource }) {
|
|
|
317
317
|
|
|
318
318
|
```tsx
|
|
319
319
|
<ShimmerSuspense
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
320
|
+
template={<UserCardSkeleton />}
|
|
321
|
+
animation="pulse"
|
|
322
|
+
baseColor="#1e1e3a"
|
|
323
|
+
highlightColor="#2d2d52"
|
|
324
324
|
>
|
|
325
|
-
|
|
325
|
+
<UserCard resource={resource} />
|
|
326
326
|
</ShimmerSuspense>
|
|
327
327
|
```
|
|
328
328
|
|
|
@@ -334,13 +334,13 @@ function UserCard({ resource }) {
|
|
|
334
334
|
|
|
335
335
|
```tsx
|
|
336
336
|
<Shimmer loading={loading}>
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
337
|
+
<PageHeader>
|
|
338
|
+
{/* This nested Shimmer contributes its rects to the parent overlay */}
|
|
339
|
+
<Shimmer loading={loading}>
|
|
340
|
+
<NavigationMenu />
|
|
341
|
+
</Shimmer>
|
|
342
|
+
</PageHeader>
|
|
343
|
+
<MainContent />
|
|
344
344
|
</Shimmer>
|
|
345
345
|
```
|
|
346
346
|
|
|
@@ -348,12 +348,12 @@ Use `stopPropagation` to force an independent shimmer:
|
|
|
348
348
|
|
|
349
349
|
```tsx
|
|
350
350
|
<Shimmer loading={outerLoading}>
|
|
351
|
-
|
|
351
|
+
<Sidebar />
|
|
352
352
|
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
353
|
+
{/* Independent shimmer — own overlay, own animation */}
|
|
354
|
+
<Shimmer loading={innerLoading} stopPropagation>
|
|
355
|
+
<Feed />
|
|
356
|
+
</Shimmer>
|
|
357
357
|
</Shimmer>
|
|
358
358
|
```
|
|
359
359
|
|
|
@@ -395,11 +395,11 @@ Full types exported:
|
|
|
395
395
|
|
|
396
396
|
```ts
|
|
397
397
|
import type {
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
398
|
+
ShimmerProps, // Props for <Shimmer>
|
|
399
|
+
ShimmerConfig, // Config options (colors, speed, animation)
|
|
400
|
+
ShimmerRect, // Measured element rectangle
|
|
401
|
+
AnimationType, // 'wave' | 'pulse' | 'breathe'
|
|
402
|
+
ShimmerSuspenseProps,
|
|
403
403
|
} from "shimmer-trace";
|
|
404
404
|
```
|
|
405
405
|
|
|
@@ -421,4 +421,4 @@ import type {
|
|
|
421
421
|
|
|
422
422
|
## License
|
|
423
423
|
|
|
424
|
-
|
|
424
|
+
MIT — [Jeet Vora](https://github.com/jeetvora331)
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "shimmer-trace",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.2",
|
|
4
4
|
"description": "High-performance React skeleton loaders that automatically trace your UI dimensions. Synchronized animations, zero CLS, and one-line implementation.",
|
|
5
5
|
"main": "./dist/index.cjs",
|
|
6
6
|
"module": "./dist/index.mjs",
|
|
@@ -43,7 +43,7 @@
|
|
|
43
43
|
"ui"
|
|
44
44
|
],
|
|
45
45
|
"author": "Jeet Vora",
|
|
46
|
-
"license": "
|
|
46
|
+
"license": "MIT",
|
|
47
47
|
"bugs": {
|
|
48
48
|
"url": "https://github.com/jeetvora331/shimmer-trace/issues"
|
|
49
49
|
},
|