@shimmer-from-structure/angular 2.2.3 → 2.3.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.
- package/README.md +124 -4
- package/fesm2022/shimmer-from-structure-angular.mjs.map +1 -1
- package/package.json +3 -3
- package/public-api.d.ts +1 -1
package/README.md
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
# ✨ Shimmer From Structure
|
|
2
2
|
|
|
3
|
-
A **React, Vue, Svelte &
|
|
3
|
+
A **React, Vue, Svelte, Angular & SolidJS** shimmer/skeleton library that **automatically adapts to your component's runtime structure**. Unlike traditional shimmer libraries that require pre-defined skeleton structures, this library analyzes your actual component's DOM at runtime and generates a shimmer effect that perfectly matches its layout.
|
|
4
4
|
|
|
5
5
|

|
|
6
6
|

|
|
7
7
|

|
|
8
8
|

|
|
9
|
+

|
|
9
10
|
|
|
10
11
|

|
|
11
12
|
|
|
@@ -19,7 +20,7 @@ Traditional shimmer libraries require you to:
|
|
|
19
20
|
|
|
20
21
|
**Shimmer From Structure** eliminates all of that:
|
|
21
22
|
|
|
22
|
-
- ✅ **Works with React, Vue, Svelte &
|
|
23
|
+
- ✅ **Works with React, Vue, Svelte, Angular & SolidJS** - Simple, framework-specific adapters
|
|
23
24
|
- ✅ Automatically measures your component's structure at runtime
|
|
24
25
|
- ✅ Generates shimmer effects that match actual dimensions
|
|
25
26
|
- ✅ Zero maintenance - works with any layout changes
|
|
@@ -44,7 +45,7 @@ Shimmer From Structure provides dedicated packages for **React and Vue**.
|
|
|
44
45
|
|
|
45
46
|
### React
|
|
46
47
|
|
|
47
|
-
React support is built
|
|
48
|
+
React support is built into the main package for backward compatibility:
|
|
48
49
|
|
|
49
50
|
```javascript
|
|
50
51
|
// React projects (or @shimmer-from-structure/react)
|
|
@@ -78,6 +79,15 @@ Angular support requires importing from the specific adapter:
|
|
|
78
79
|
import { ShimmerComponent } from '@shimmer-from-structure/angular';
|
|
79
80
|
```
|
|
80
81
|
|
|
82
|
+
### SolidJS
|
|
83
|
+
|
|
84
|
+
SolidJS support requires importing from the specific adapter:
|
|
85
|
+
|
|
86
|
+
```tsx
|
|
87
|
+
// SolidJS projects
|
|
88
|
+
import { Shimmer } from '@shimmer-from-structure/solid';
|
|
89
|
+
```
|
|
90
|
+
|
|
81
91
|
---
|
|
82
92
|
|
|
83
93
|
# 📖 Basic Usage
|
|
@@ -174,6 +184,29 @@ export class UserCardComponent {
|
|
|
174
184
|
}
|
|
175
185
|
```
|
|
176
186
|
|
|
187
|
+
## SolidJS
|
|
188
|
+
|
|
189
|
+
### Static Content
|
|
190
|
+
|
|
191
|
+
```tsx
|
|
192
|
+
import { createSignal } from 'solid-js';
|
|
193
|
+
import { Shimmer } from '@shimmer-from-structure/solid';
|
|
194
|
+
|
|
195
|
+
function UserCard() {
|
|
196
|
+
const [isLoading, setIsLoading] = createSignal(true);
|
|
197
|
+
|
|
198
|
+
return (
|
|
199
|
+
<Shimmer loading={isLoading()}>
|
|
200
|
+
<div class="card">
|
|
201
|
+
<img src="avatar.jpg" class="avatar" />
|
|
202
|
+
<h2>John Doe</h2>
|
|
203
|
+
<p>Software Engineer</p>
|
|
204
|
+
</div>
|
|
205
|
+
</Shimmer>
|
|
206
|
+
);
|
|
207
|
+
}
|
|
208
|
+
```
|
|
209
|
+
|
|
177
210
|
---
|
|
178
211
|
|
|
179
212
|
### Dynamic Content with `templateProps`
|
|
@@ -287,6 +320,31 @@ export class AppComponent {
|
|
|
287
320
|
}
|
|
288
321
|
```
|
|
289
322
|
|
|
323
|
+
**SolidJS**
|
|
324
|
+
|
|
325
|
+
```tsx
|
|
326
|
+
import { createSignal } from 'solid-js';
|
|
327
|
+
import { Shimmer } from '@shimmer-from-structure/solid';
|
|
328
|
+
import { UserCard } from './UserCard';
|
|
329
|
+
|
|
330
|
+
function App() {
|
|
331
|
+
const [loading, setLoading] = createSignal(true);
|
|
332
|
+
const [user, setUser] = createSignal(null);
|
|
333
|
+
|
|
334
|
+
const userTemplate = {
|
|
335
|
+
name: 'Loading...',
|
|
336
|
+
role: 'Loading role...',
|
|
337
|
+
avatar: 'placeholder.jpg',
|
|
338
|
+
};
|
|
339
|
+
|
|
340
|
+
return (
|
|
341
|
+
<Shimmer loading={loading()} templateProps={{ user: userTemplate }}>
|
|
342
|
+
<UserCard user={user() || userTemplate} />
|
|
343
|
+
</Shimmer>
|
|
344
|
+
);
|
|
345
|
+
}
|
|
346
|
+
```
|
|
347
|
+
|
|
290
348
|
The `templateProps` object is spread onto the first child component when loading, allowing it to render with mock data for measurement.
|
|
291
349
|
|
|
292
350
|
## 🎨 API Reference
|
|
@@ -378,6 +436,24 @@ The `templateProps` object is spread onto the first child component when loading
|
|
|
378
436
|
</shimmer>
|
|
379
437
|
```
|
|
380
438
|
|
|
439
|
+
**SolidJS**
|
|
440
|
+
|
|
441
|
+
```tsx
|
|
442
|
+
<Shimmer
|
|
443
|
+
loading={isLoading()}
|
|
444
|
+
shimmerColor="rgba(255, 255, 255, 0.2)"
|
|
445
|
+
backgroundColor="rgba(255, 255, 255, 0.1)"
|
|
446
|
+
duration={2}
|
|
447
|
+
fallbackBorderRadius={8}
|
|
448
|
+
templateProps={{
|
|
449
|
+
user: userTemplate,
|
|
450
|
+
settings: settingsTemplate,
|
|
451
|
+
}}
|
|
452
|
+
>
|
|
453
|
+
<MyComponent user={user()} settings={settings()} />
|
|
454
|
+
</Shimmer>
|
|
455
|
+
```
|
|
456
|
+
|
|
381
457
|
## 🔧 How It Works
|
|
382
458
|
|
|
383
459
|
1. **Visible Container Rendering**: When `loading={true}`, your component renders with transparent text but **visible container backgrounds**
|
|
@@ -702,6 +778,27 @@ bootstrapApplication(AppComponent, {
|
|
|
702
778
|
});
|
|
703
779
|
```
|
|
704
780
|
|
|
781
|
+
### SolidJS (ShimmerProvider)
|
|
782
|
+
|
|
783
|
+
```tsx
|
|
784
|
+
import { Shimmer, ShimmerProvider } from '@shimmer-from-structure/solid';
|
|
785
|
+
|
|
786
|
+
function App() {
|
|
787
|
+
return (
|
|
788
|
+
<ShimmerProvider
|
|
789
|
+
config={{
|
|
790
|
+
shimmerColor: 'rgba(56, 189, 248, 0.4)',
|
|
791
|
+
backgroundColor: 'rgba(56, 189, 248, 0.1)',
|
|
792
|
+
duration: 2.5,
|
|
793
|
+
fallbackBorderRadius: 8,
|
|
794
|
+
}}
|
|
795
|
+
>
|
|
796
|
+
<Dashboard />
|
|
797
|
+
</ShimmerProvider>
|
|
798
|
+
);
|
|
799
|
+
}
|
|
800
|
+
```
|
|
801
|
+
|
|
705
802
|
---
|
|
706
803
|
|
|
707
804
|
Components inside the provider automatically inherit values. You can still override them locally:
|
|
@@ -746,6 +843,16 @@ Components inside the provider automatically inherit values. You can still overr
|
|
|
746
843
|
<shimmer [loading]="true" [duration]="0.5"><app-fast-card /></shimmer>
|
|
747
844
|
```
|
|
748
845
|
|
|
846
|
+
**SolidJS**
|
|
847
|
+
|
|
848
|
+
```tsx
|
|
849
|
+
<!-- Inherits blue theme from provider -->
|
|
850
|
+
<Shimmer loading={true()}><UserCard /></Shimmer>
|
|
851
|
+
|
|
852
|
+
<!-- Overrides provider settings -->
|
|
853
|
+
<Shimmer loading={true()} duration={0.5}><FastCard /></Shimmer>
|
|
854
|
+
```
|
|
855
|
+
|
|
749
856
|
### Accessing Config in Hooks/Composables
|
|
750
857
|
|
|
751
858
|
If you need to access the current configuration in your own components:
|
|
@@ -794,6 +901,17 @@ export class MyComponent {
|
|
|
794
901
|
}
|
|
795
902
|
```
|
|
796
903
|
|
|
904
|
+
**SolidJS**
|
|
905
|
+
|
|
906
|
+
```tsx
|
|
907
|
+
import { useShimmerConfig } from '@shimmer-from-structure/solid';
|
|
908
|
+
|
|
909
|
+
function MyComponent() {
|
|
910
|
+
const config = useShimmerConfig();
|
|
911
|
+
return <div style={{ background: config.backgroundColor }}>...</div>;
|
|
912
|
+
}
|
|
913
|
+
```
|
|
914
|
+
|
|
797
915
|
## Best Practices
|
|
798
916
|
|
|
799
917
|
### 1. Use `templateProps` for Dynamic Data
|
|
@@ -890,9 +1008,10 @@ This library is organized as a monorepo with four packages:
|
|
|
890
1008
|
| `@shimmer-from-structure/vue` | Vue 3 adapter | 3.89 kB |
|
|
891
1009
|
| `@shimmer-from-structure/svelte` | Svelte adapter | 4.60 kB |
|
|
892
1010
|
| `@shimmer-from-structure/angular` | Angular adapter | 6.83 kB |
|
|
1011
|
+
| `@shimmer-from-structure/solid` | SolidJS adapter | 4.01 kB |
|
|
893
1012
|
| `shimmer-from-structure` | Main package (React backward compatibility) | 0.93 kB |
|
|
894
1013
|
|
|
895
|
-
The core package contains all DOM measurement logic, while React, Vue, Svelte and
|
|
1014
|
+
The core package contains all DOM measurement logic, while React, Vue, Svelte, Angular and SolidJS packages are thin wrappers that provide framework-specific APIs.
|
|
896
1015
|
|
|
897
1016
|
## 🚧 Roadmap
|
|
898
1017
|
|
|
@@ -902,6 +1021,7 @@ The core package contains all DOM measurement logic, while React, Vue, Svelte an
|
|
|
902
1021
|
- [x] **Vue.js adapter**
|
|
903
1022
|
- [x] **Svelte adapter**
|
|
904
1023
|
- [x] **Angular adapter**
|
|
1024
|
+
- [x] **SolidJS adapter**
|
|
905
1025
|
- [ ] Better async component support
|
|
906
1026
|
- [ ] Customizable shimmer direction (vertical, diagonal)
|
|
907
1027
|
- [ ] React Native support
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shimmer-from-structure-angular.mjs","sources":["../../src/shimmer-config.service.ts","../../src/shimmer.component.ts","../../src/public-api.ts","../../src/shimmer-from-structure-angular.ts"],"sourcesContent":["import { InjectionToken, inject } from '@angular/core';\nimport type { ShimmerConfig, ShimmerContextValue } from '@shimmer-from-structure/core';\nimport { shimmerDefaults } from '@shimmer-from-structure/core';\n\n/**\n * Injection token for global shimmer configuration.\n * Use `provideShimmerConfig()` to configure in your app.\n */\nexport const SHIMMER_CONFIG = new InjectionToken<ShimmerConfig>('SHIMMER_CONFIG');\n\n/**\n * Provider function for shimmer configuration.\n * Use in your app's providers array.\n *\n * @example\n * ```typescript\n * bootstrapApplication(AppComponent, {\n * providers: [\n * provideShimmerConfig({\n * shimmerColor: 'rgba(255, 255, 255, 0.3)',\n * duration: 1.5\n * })\n * ]\n * });\n * ```\n */\nexport function provideShimmerConfig(config: ShimmerConfig) {\n return { provide: SHIMMER_CONFIG, useValue: config };\n}\n\n/**\n * Inject and resolve shimmer configuration.\n * Merges injected config with defaults.\n * Returns fully resolved ShimmerContextValue with all properties defined.\n */\nexport function injectShimmerConfig(): ShimmerContextValue {\n const config = inject(SHIMMER_CONFIG, { optional: true }) ?? {};\n\n return {\n shimmerColor: config.shimmerColor ?? shimmerDefaults.shimmerColor,\n backgroundColor: config.backgroundColor ?? shimmerDefaults.backgroundColor,\n duration: config.duration ?? shimmerDefaults.duration,\n fallbackBorderRadius: config.fallbackBorderRadius ?? shimmerDefaults.fallbackBorderRadius,\n };\n}\n\n// Re-export defaults for testing and reference\nexport { shimmerDefaults };\n","import {\n Component,\n input,\n signal,\n computed,\n effect,\n ElementRef,\n viewChild,\n AfterViewInit,\n OnDestroy,\n ChangeDetectionStrategy,\n ViewEncapsulation,\n inject,\n PLATFORM_ID,\n} from '@angular/core';\nimport { NgIf, NgFor, isPlatformBrowser } from '@angular/common';\nimport {\n extractElementInfo,\n createResizeObserver,\n type ElementInfo,\n} from '@shimmer-from-structure/core';\nimport { injectShimmerConfig } from './shimmer-config.service';\n\n/**\n * Shimmer component that creates loading skeleton overlays based on content structure.\n * Automatically measures projected content and creates matching shimmer blocks.\n *\n * @example\n * ```html\n * <shimmer [loading]=\"isLoading\">\n * <div class=\"card\">\n * <h2>{{ title }}</h2>\n * <p>{{ description }}</p>\n * </div>\n * </shimmer>\n * ```\n */\n@Component({\n selector: 'shimmer',\n standalone: true,\n imports: [NgIf, NgFor],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n template: `\n <div style=\"position: relative;\">\n <!-- Always render content -->\n <div\n #measureContainer\n [class.shimmer-measure-container]=\"loading()\"\n [attr.aria-hidden]=\"loading() ? 'true' : null\"\n [style.pointer-events]=\"loading() ? 'none' : null\"\n >\n <ng-content></ng-content>\n </div>\n\n <!-- Shimmer overlay - only when loading -->\n @if (loading()) {\n <div\n style=\"\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n overflow: hidden;\n pointer-events: none;\n \"\n >\n @for (element of elements(); track $index) {\n <div\n [style.position]=\"'absolute'\"\n [style.left.px]=\"element.x\"\n [style.top.px]=\"element.y\"\n [style.width.px]=\"element.width\"\n [style.height.px]=\"element.height\"\n [style.backgroundColor]=\"resolvedBackgroundColor()\"\n [style.borderRadius]=\"\n element.borderRadius === '0px'\n ? resolvedFallbackBorderRadius() + 'px'\n : element.borderRadius\n \"\n [style.overflow]=\"'hidden'\"\n >\n <div\n class=\"shimmer-animation-element\"\n [style.background]=\"\n 'linear-gradient(90deg, transparent, ' + resolvedShimmerColor() + ', transparent)'\n \"\n [style.animationDuration]=\"resolvedDuration() + 's'\"\n ></div>\n </div>\n }\n </div>\n }\n </div>\n `,\n styles: [\n `\n :host {\n display: contents;\n }\n\n .shimmer-measure-container * {\n color: transparent !important;\n }\n\n .shimmer-measure-container img,\n .shimmer-measure-container svg,\n .shimmer-measure-container video {\n opacity: 0;\n }\n\n .shimmer-animation-element {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n animation: shimmer-animation 1.5s infinite;\n }\n\n @keyframes shimmer-animation {\n 0% {\n transform: translateX(-100%);\n }\n 100% {\n transform: translateX(100%);\n }\n }\n `,\n ],\n})\nexport class ShimmerComponent implements AfterViewInit, OnDestroy {\n // Inputs using Angular signals\n loading = input<boolean>(true);\n shimmerColor = input<string | undefined>(undefined);\n backgroundColor = input<string | undefined>(undefined);\n duration = input<number | undefined>(undefined);\n fallbackBorderRadius = input<number | undefined>(undefined);\n\n // View child reference\n measureContainer = viewChild<ElementRef<HTMLDivElement>>('measureContainer');\n\n // Internal state\n elements = signal<ElementInfo[]>([]);\n\n // Inject dependencies\n private contextConfig = injectShimmerConfig();\n private platformId = inject(PLATFORM_ID);\n private isBrowser = isPlatformBrowser(this.platformId);\n\n // Resolved values (props > context > defaults)\n resolvedShimmerColor = computed(() => this.shimmerColor() ?? this.contextConfig.shimmerColor);\n resolvedBackgroundColor = computed(\n () => this.backgroundColor() ?? this.contextConfig.backgroundColor\n );\n resolvedDuration = computed(() => this.duration() ?? this.contextConfig.duration);\n resolvedFallbackBorderRadius = computed(\n () => this.fallbackBorderRadius() ?? this.contextConfig.fallbackBorderRadius\n );\n\n // Cleanup function for ResizeObserver\n private resizeCleanup: (() => void) | undefined;\n private mutationObserver: MutationObserver | undefined;\n\n constructor() {\n // Effect to re-measure when loading state changes\n effect((onCleanup) => {\n // Skip effect on server\n if (!this.isBrowser) return;\n\n const isLoading = this.loading();\n const container = this.measureContainer();\n\n if (isLoading && container) {\n // Clean up existing observers before setting up new ones\n this.cleanup();\n\n // Set up observers for this loading session\n this.setupObservers();\n\n // Defer measurement to next frame to ensure content is rendered\n requestAnimationFrame(() => this.measureElements());\n } else {\n // Cleanup when not loading\n this.cleanup();\n }\n\n // Cleanup on effect re-run or component destruction\n onCleanup(() => {\n this.cleanup();\n });\n });\n }\n\n ngAfterViewInit(): void {\n // Effect will handle setup when container becomes available\n }\n\n ngOnDestroy(): void {\n this.cleanup();\n }\n\n private setupObservers(): void {\n if (!this.isBrowser) return;\n\n const container = this.measureContainer()?.nativeElement;\n if (!container) return;\n\n // Set up ResizeObserver\n this.resizeCleanup = createResizeObserver(container, () => this.measureElements());\n\n // Set up MutationObserver for content changes\n this.mutationObserver = new MutationObserver(() => {\n if (this.loading()) {\n this.measureElements();\n }\n });\n\n this.mutationObserver.observe(container, {\n childList: true,\n subtree: true,\n characterData: true,\n attributes: false,\n });\n }\n\n private measureElements(): void {\n if (!this.isBrowser) return;\n\n const container = this.measureContainer()?.nativeElement;\n if (!container || !this.loading()) return;\n\n // Temporarily disconnect mutation observer to avoid recursion\n this.mutationObserver?.disconnect();\n\n const containerRect = container.getBoundingClientRect();\n const extractedElements: ElementInfo[] = [];\n\n Array.from(container.children).forEach((child) => {\n extractedElements.push(...extractElementInfo(child, containerRect));\n });\n\n this.elements.set(extractedElements);\n\n // Reconnect mutation observer\n if (this.mutationObserver && container) {\n this.mutationObserver.observe(container, {\n childList: true,\n subtree: true,\n characterData: true,\n attributes: false,\n });\n }\n }\n\n private cleanup(): void {\n if (this.resizeCleanup) {\n this.resizeCleanup();\n this.resizeCleanup = undefined;\n }\n if (this.mutationObserver) {\n this.mutationObserver.disconnect();\n this.mutationObserver = undefined;\n }\n }\n\n /**\n * Manually trigger re-measurement of elements.\n * Useful when content changes programmatically.\n */\n remeasure(): void {\n if (this.isBrowser) {\n this.measureElements();\n }\n }\n}\n","// Public API Surface\nexport { ShimmerComponent } from './shimmer.component';\nexport {\n SHIMMER_CONFIG,\n provideShimmerConfig,\n injectShimmerConfig,\n shimmerDefaults,\n} from './shimmer-config.service';\nexport type {\n ShimmerInputs,\n ShimmerConfig,\n ShimmerContextValue,\n ElementInfo,\n} from './types';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"shimmer-from-structure-angular.mjs","sources":["../../src/shimmer-config.service.ts","../../src/shimmer.component.ts","../../src/public-api.ts","../../src/shimmer-from-structure-angular.ts"],"sourcesContent":["import { InjectionToken, inject } from '@angular/core';\nimport type { ShimmerConfig, ShimmerContextValue } from '@shimmer-from-structure/core';\nimport { shimmerDefaults } from '@shimmer-from-structure/core';\n\n/**\n * Injection token for global shimmer configuration.\n * Use `provideShimmerConfig()` to configure in your app.\n */\nexport const SHIMMER_CONFIG = new InjectionToken<ShimmerConfig>('SHIMMER_CONFIG');\n\n/**\n * Provider function for shimmer configuration.\n * Use in your app's providers array.\n *\n * @example\n * ```typescript\n * bootstrapApplication(AppComponent, {\n * providers: [\n * provideShimmerConfig({\n * shimmerColor: 'rgba(255, 255, 255, 0.3)',\n * duration: 1.5\n * })\n * ]\n * });\n * ```\n */\nexport function provideShimmerConfig(config: ShimmerConfig) {\n return { provide: SHIMMER_CONFIG, useValue: config };\n}\n\n/**\n * Inject and resolve shimmer configuration.\n * Merges injected config with defaults.\n * Returns fully resolved ShimmerContextValue with all properties defined.\n */\nexport function injectShimmerConfig(): ShimmerContextValue {\n const config = inject(SHIMMER_CONFIG, { optional: true }) ?? {};\n\n return {\n shimmerColor: config.shimmerColor ?? shimmerDefaults.shimmerColor,\n backgroundColor: config.backgroundColor ?? shimmerDefaults.backgroundColor,\n duration: config.duration ?? shimmerDefaults.duration,\n fallbackBorderRadius: config.fallbackBorderRadius ?? shimmerDefaults.fallbackBorderRadius,\n };\n}\n\n// Re-export defaults for testing and reference\nexport { shimmerDefaults };\n","import {\n Component,\n input,\n signal,\n computed,\n effect,\n ElementRef,\n viewChild,\n AfterViewInit,\n OnDestroy,\n ChangeDetectionStrategy,\n ViewEncapsulation,\n inject,\n PLATFORM_ID,\n} from '@angular/core';\nimport { NgIf, NgFor, isPlatformBrowser } from '@angular/common';\nimport {\n extractElementInfo,\n createResizeObserver,\n type ElementInfo,\n} from '@shimmer-from-structure/core';\nimport { injectShimmerConfig } from './shimmer-config.service';\n\n/**\n * Shimmer component that creates loading skeleton overlays based on content structure.\n * Automatically measures projected content and creates matching shimmer blocks.\n *\n * @example\n * ```html\n * <shimmer [loading]=\"isLoading\">\n * <div class=\"card\">\n * <h2>{{ title }}</h2>\n * <p>{{ description }}</p>\n * </div>\n * </shimmer>\n * ```\n */\n@Component({\n selector: 'shimmer',\n standalone: true,\n imports: [NgIf, NgFor],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n template: `\n <div style=\"position: relative;\">\n <!-- Always render content -->\n <div\n #measureContainer\n [class.shimmer-measure-container]=\"loading()\"\n [attr.aria-hidden]=\"loading() ? 'true' : null\"\n [style.pointer-events]=\"loading() ? 'none' : null\"\n >\n <ng-content></ng-content>\n </div>\n\n <!-- Shimmer overlay - only when loading -->\n @if (loading()) {\n <div\n style=\"\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n overflow: hidden;\n pointer-events: none;\n \"\n >\n @for (element of elements(); track $index) {\n <div\n [style.position]=\"'absolute'\"\n [style.left.px]=\"element.x\"\n [style.top.px]=\"element.y\"\n [style.width.px]=\"element.width\"\n [style.height.px]=\"element.height\"\n [style.backgroundColor]=\"resolvedBackgroundColor()\"\n [style.borderRadius]=\"\n element.borderRadius === '0px'\n ? resolvedFallbackBorderRadius() + 'px'\n : element.borderRadius\n \"\n [style.overflow]=\"'hidden'\"\n >\n <div\n class=\"shimmer-animation-element\"\n [style.background]=\"\n 'linear-gradient(90deg, transparent, ' + resolvedShimmerColor() + ', transparent)'\n \"\n [style.animationDuration]=\"resolvedDuration() + 's'\"\n ></div>\n </div>\n }\n </div>\n }\n </div>\n `,\n styles: [\n `\n :host {\n display: contents;\n }\n\n .shimmer-measure-container * {\n color: transparent !important;\n }\n\n .shimmer-measure-container img,\n .shimmer-measure-container svg,\n .shimmer-measure-container video {\n opacity: 0;\n }\n\n .shimmer-animation-element {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n animation: shimmer-animation 1.5s infinite;\n }\n\n @keyframes shimmer-animation {\n 0% {\n transform: translateX(-100%);\n }\n 100% {\n transform: translateX(100%);\n }\n }\n `,\n ],\n})\nexport class ShimmerComponent implements AfterViewInit, OnDestroy {\n // Inputs using Angular signals\n loading = input<boolean>(true);\n shimmerColor = input<string | undefined>(undefined);\n backgroundColor = input<string | undefined>(undefined);\n duration = input<number | undefined>(undefined);\n fallbackBorderRadius = input<number | undefined>(undefined);\n\n // View child reference\n measureContainer = viewChild<ElementRef<HTMLDivElement>>('measureContainer');\n\n // Internal state\n elements = signal<ElementInfo[]>([]);\n\n // Inject dependencies\n private contextConfig = injectShimmerConfig();\n private platformId = inject(PLATFORM_ID);\n private isBrowser = isPlatformBrowser(this.platformId);\n\n // Resolved values (props > context > defaults)\n resolvedShimmerColor = computed(() => this.shimmerColor() ?? this.contextConfig.shimmerColor);\n resolvedBackgroundColor = computed(\n () => this.backgroundColor() ?? this.contextConfig.backgroundColor\n );\n resolvedDuration = computed(() => this.duration() ?? this.contextConfig.duration);\n resolvedFallbackBorderRadius = computed(\n () => this.fallbackBorderRadius() ?? this.contextConfig.fallbackBorderRadius\n );\n\n // Cleanup function for ResizeObserver\n private resizeCleanup: (() => void) | undefined;\n private mutationObserver: MutationObserver | undefined;\n\n constructor() {\n // Effect to re-measure when loading state changes\n effect((onCleanup) => {\n // Skip effect on server\n if (!this.isBrowser) return;\n\n const isLoading = this.loading();\n const container = this.measureContainer();\n\n if (isLoading && container) {\n // Clean up existing observers before setting up new ones\n this.cleanup();\n\n // Set up observers for this loading session\n this.setupObservers();\n\n // Defer measurement to next frame to ensure content is rendered\n requestAnimationFrame(() => this.measureElements());\n } else {\n // Cleanup when not loading\n this.cleanup();\n }\n\n // Cleanup on effect re-run or component destruction\n onCleanup(() => {\n this.cleanup();\n });\n });\n }\n\n ngAfterViewInit(): void {\n // Effect will handle setup when container becomes available\n }\n\n ngOnDestroy(): void {\n this.cleanup();\n }\n\n private setupObservers(): void {\n if (!this.isBrowser) return;\n\n const container = this.measureContainer()?.nativeElement;\n if (!container) return;\n\n // Set up ResizeObserver\n this.resizeCleanup = createResizeObserver(container, () => this.measureElements());\n\n // Set up MutationObserver for content changes\n this.mutationObserver = new MutationObserver(() => {\n if (this.loading()) {\n this.measureElements();\n }\n });\n\n this.mutationObserver.observe(container, {\n childList: true,\n subtree: true,\n characterData: true,\n attributes: false,\n });\n }\n\n private measureElements(): void {\n if (!this.isBrowser) return;\n\n const container = this.measureContainer()?.nativeElement;\n if (!container || !this.loading()) return;\n\n // Temporarily disconnect mutation observer to avoid recursion\n this.mutationObserver?.disconnect();\n\n const containerRect = container.getBoundingClientRect();\n const extractedElements: ElementInfo[] = [];\n\n Array.from(container.children).forEach((child) => {\n extractedElements.push(...extractElementInfo(child, containerRect));\n });\n\n this.elements.set(extractedElements);\n\n // Reconnect mutation observer\n if (this.mutationObserver && container) {\n this.mutationObserver.observe(container, {\n childList: true,\n subtree: true,\n characterData: true,\n attributes: false,\n });\n }\n }\n\n private cleanup(): void {\n if (this.resizeCleanup) {\n this.resizeCleanup();\n this.resizeCleanup = undefined;\n }\n if (this.mutationObserver) {\n this.mutationObserver.disconnect();\n this.mutationObserver = undefined;\n }\n }\n\n /**\n * Manually trigger re-measurement of elements.\n * Useful when content changes programmatically.\n */\n remeasure(): void {\n if (this.isBrowser) {\n this.measureElements();\n }\n }\n}\n","// Public API Surface\nexport { ShimmerComponent } from './shimmer.component';\nexport {\n SHIMMER_CONFIG,\n provideShimmerConfig,\n injectShimmerConfig,\n shimmerDefaults,\n} from './shimmer-config.service';\nexport type { ShimmerInputs, ShimmerConfig, ShimmerContextValue, ElementInfo } from './types';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@shimmer-from-structure/angular",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.3.1",
|
|
4
4
|
"description": "Angular adapter for shimmer-from-structure",
|
|
5
5
|
"peerDependencies": {
|
|
6
|
-
"@angular/
|
|
7
|
-
"@angular/
|
|
6
|
+
"@angular/common": "^19.0.0 || ^20.0.0 || ^21.0.0",
|
|
7
|
+
"@angular/core": "^19.0.0 || ^20.0.0 || ^21.0.0"
|
|
8
8
|
},
|
|
9
9
|
"dependencies": {
|
|
10
10
|
"@shimmer-from-structure/core": "*",
|
package/public-api.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
export { ShimmerComponent } from './shimmer.component';
|
|
2
2
|
export { SHIMMER_CONFIG, provideShimmerConfig, injectShimmerConfig, shimmerDefaults, } from './shimmer-config.service';
|
|
3
|
-
export type { ShimmerInputs, ShimmerConfig, ShimmerContextValue, ElementInfo
|
|
3
|
+
export type { ShimmerInputs, ShimmerConfig, ShimmerContextValue, ElementInfo } from './types';
|