@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 CHANGED
@@ -1,11 +1,12 @@
1
1
  # ✨ Shimmer From Structure
2
2
 
3
- A **React, Vue, Svelte & Angular** 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.
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
  ![React](https://img.shields.io/badge/React-%2320232a.svg?style=for-the-badge&logo=react&logoColor=%2361DAFB)
6
6
  ![Vue](https://img.shields.io/badge/Vue.js-35495E?style=for-the-badge&logo=vuedotjs&logoColor=4FC08D)
7
7
  ![Svelte](https://img.shields.io/badge/Svelte-ff3e00?style=for-the-badge&logo=svelte&logoColor=white)
8
8
  ![Angular](https://img.shields.io/badge/Angular-DD0031?style=for-the-badge&logo=angular&logoColor=white)
9
+ ![SolidJS](https://img.shields.io/badge/SolidJS-%232c4f7c?style=for-the-badge&logo=solid&logoColor=white)
9
10
 
10
11
  ![Shimmer From Structure Demo](https://github.com/darula-hpp/shimmer-from-structure/raw/main/example/preview.gif)
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 & Angular** - Simple, framework-specific adapters
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-in to the main package for backward compatibility:
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 Angular packages are thin wrappers that provide framework-specific APIs.
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.2.3",
3
+ "version": "2.3.1",
4
4
  "description": "Angular adapter for shimmer-from-structure",
5
5
  "peerDependencies": {
6
- "@angular/core": "^19.0.0 || ^20.0.0 || ^21.0.0",
7
- "@angular/common": "^19.0.0 || ^20.0.0 || ^21.0.0"
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, } from './types';
3
+ export type { ShimmerInputs, ShimmerConfig, ShimmerContextValue, ElementInfo } from './types';