shimmer-trace 1.1.1 → 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.
Files changed (2) hide show
  1. package/README.md +110 -110
  2. package/package.json +1 -1
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
- const [loading, setLoading] = useState(true);
76
+ const [loading, setLoading] = useState(true);
77
77
 
78
- return (
79
- <Shimmer loading={loading}>
80
- <UserCard />
81
- </Shimmer>
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
- 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
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
- {children}
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
- 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
- );
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
- <form>
163
- <label>Email</label>
164
- <input type="email" placeholder="you@example.com" />
162
+ <form>
163
+ <label>Email</label>
164
+ <input type="email" placeholder="you@example.com" />
165
165
 
166
- <label>Message</label>
167
- <textarea placeholder="Your message..." />
166
+ <label>Message</label>
167
+ <textarea placeholder="Your message..." />
168
168
 
169
- <button type="submit">Send</button>
170
- </form>
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
- {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
- ))}
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
- <StatCard value="4,821" label="Total Users" />
206
- <StatCard value="98.4%" label="Uptime" />
207
- <StatCard value="142ms" label="Avg Latency" />
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
- <DashboardWidget />
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
- baseColor: "#1e1e3a",
233
- highlightColor: "#2d2d52",
234
- animation: "wave",
235
- speed: 1.2,
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
- return (
241
- <DarkShimmer loading={loading}>
242
- <UserCard />
243
- </DarkShimmer>
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
- return (
267
- <div className="card">
268
- <img src={user.avatar} alt="" />
269
- <h3>{user.name}</h3>
270
- <p>{user.bio}</p>
271
- </div>
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
- <div className="card">
278
- <img src="" alt="" />
279
- <h3>&nbsp;</h3>
280
- <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
281
- </div>
277
+ <div className="card">
278
+ <img src="" alt="" />
279
+ <h3>&nbsp;</h3>
280
+ <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
281
+ </div>
282
282
  );
283
283
 
284
284
  <ShimmerSuspense template={<UserCardSkeleton />}>
285
- <UserCard resource={resource} />
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
- 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
- );
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
- <UserCard resource={resource} />
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
- template={<UserCardSkeleton />}
321
- animation="pulse"
322
- baseColor="#1e1e3a"
323
- highlightColor="#2d2d52"
320
+ template={<UserCardSkeleton />}
321
+ animation="pulse"
322
+ baseColor="#1e1e3a"
323
+ highlightColor="#2d2d52"
324
324
  >
325
- <UserCard resource={resource} />
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
- <PageHeader>
338
- {/* This nested Shimmer contributes its rects to the parent overlay */}
339
- <Shimmer loading={loading}>
340
- <NavigationMenu />
341
- </Shimmer>
342
- </PageHeader>
343
- <MainContent />
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
- <Sidebar />
351
+ <Sidebar />
352
352
 
353
- {/* Independent shimmer — own overlay, own animation */}
354
- <Shimmer loading={innerLoading} stopPropagation>
355
- <Feed />
356
- </Shimmer>
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
- ShimmerProps, // Props for <Shimmer>
399
- ShimmerConfig, // Config options (colors, speed, animation)
400
- ShimmerRect, // Measured element rectangle
401
- AnimationType, // 'wave' | 'pulse' | 'breathe'
402
- ShimmerSuspenseProps,
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
- ISC — [Jeet Vora](https://github.com/jeetvora331)
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.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",