@tacdaed/fragments 1.0.0-beta.7 → 1.0.0-beta.9

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.
@@ -0,0 +1,122 @@
1
+ /* ==========================================================================
2
+ FONT DEFINITIONS
3
+ Path: assets/resources/fonts/
4
+ ========================================================================== */
5
+
6
+ /* =======================
7
+ OPEN SANS
8
+ ======================= */
9
+ @font-face {
10
+ font-family: 'Open Sans';
11
+ font-style: normal;
12
+ font-weight: 100 900;
13
+ font-display: swap;
14
+ src: url('/assets/resources/fonts/OpenSans/OpenSans-VariableFont_wdth_wght.ttf') format('truetype');
15
+ }
16
+
17
+ @font-face {
18
+ font-family: 'Open Sans';
19
+ font-style: italic;
20
+ font-weight: 100 900;
21
+ font-display: swap;
22
+ src: url('/assets/resources/fonts/OpenSans/OpenSans-Italic-VariableFont_wdth_wght.ttf') format('truetype');
23
+ }
24
+
25
+ /* =======================
26
+ ROBOTO
27
+ ======================= */
28
+ @font-face {
29
+ font-family: 'Roboto';
30
+ src: url('/assets/resources/fonts/Roboto/Roboto-Thin.ttf') format('truetype');
31
+ font-weight: 100;
32
+ font-style: normal;
33
+ font-display: swap;
34
+ }
35
+
36
+ @font-face {
37
+ font-family: 'Roboto';
38
+ src: url('/assets/resources/fonts/Roboto/Roboto-ThinItalic.ttf') format('truetype');
39
+ font-weight: 100;
40
+ font-style: italic;
41
+ font-display: swap;
42
+ }
43
+
44
+ @font-face {
45
+ font-family: 'Roboto';
46
+ src: url('/assets/resources/fonts/Roboto/Roboto-Light.ttf') format('truetype');
47
+ font-weight: 300;
48
+ font-style: normal;
49
+ font-display: swap;
50
+ }
51
+
52
+ @font-face {
53
+ font-family: 'Roboto';
54
+ src: url('/assets/resources/fonts/Roboto/Roboto-LightItalic.ttf') format('truetype');
55
+ font-weight: 300;
56
+ font-style: italic;
57
+ font-display: swap;
58
+ }
59
+
60
+ @font-face {
61
+ font-family: 'Roboto';
62
+ src: url('/assets/resources/fonts/Roboto/Roboto-Regular.ttf') format('truetype');
63
+ font-weight: 400;
64
+ font-style: normal;
65
+ font-display: swap;
66
+ }
67
+
68
+ @font-face {
69
+ font-family: 'Roboto';
70
+ src: url('/assets/resources/fonts/Roboto/Roboto-Italic.ttf') format('truetype');
71
+ font-weight: 400;
72
+ font-style: italic;
73
+ font-display: swap;
74
+ }
75
+
76
+ @font-face {
77
+ font-family: 'Roboto';
78
+ src: url('/assets/resources/fonts/Roboto/Roboto-Medium.ttf') format('truetype');
79
+ font-weight: 500;
80
+ font-style: normal;
81
+ font-display: swap;
82
+ }
83
+
84
+ @font-face {
85
+ font-family: 'Roboto';
86
+ src: url('/assets/resources/fonts/Roboto/Roboto-MediumItalic.ttf') format('truetype');
87
+ font-weight: 500;
88
+ font-style: italic;
89
+ font-display: swap;
90
+ }
91
+
92
+ @font-face {
93
+ font-family: 'Roboto';
94
+ src: url('/assets/resources/fonts/Roboto/Roboto-Bold.ttf') format('truetype');
95
+ font-weight: 700;
96
+ font-style: normal;
97
+ font-display: swap;
98
+ }
99
+
100
+ @font-face {
101
+ font-family: 'Roboto';
102
+ src: url('/assets/resources/fonts/Roboto/Roboto-BoldItalic.ttf') format('truetype');
103
+ font-weight: 700;
104
+ font-style: italic;
105
+ font-display: swap;
106
+ }
107
+
108
+ @font-face {
109
+ font-family: 'Roboto';
110
+ src: url('/assets/resources/fonts/Roboto/Roboto-Black.ttf') format('truetype');
111
+ font-weight: 900;
112
+ font-style: normal;
113
+ font-display: swap;
114
+ }
115
+
116
+ @font-face {
117
+ font-family: 'Roboto';
118
+ src: url('/assets/resources/fonts/Roboto/Roboto-BlackItalic.ttf') format('truetype');
119
+ font-weight: 900;
120
+ font-style: italic;
121
+ font-display: swap;
122
+ }
@@ -1,5 +1,5 @@
1
1
  import * as i1 from '@angular/common';
2
- import { NgTemplateOutlet, NgClass, CommonModule, NgFor, formatDate, AsyncPipe } from '@angular/common';
2
+ import { NgTemplateOutlet, NgClass, CommonModule, formatDate, AsyncPipe } from '@angular/common';
3
3
  import * as i0 from '@angular/core';
4
4
  import { EventEmitter, TemplateRef, ViewChildren, ContentChild, Output, Input, Component, HostListener, inject, ChangeDetectorRef, ViewChild, ChangeDetectionStrategy, HostBinding, ElementRef, Renderer2, Directive, Pipe, Injector, LOCALE_ID } from '@angular/core';
5
5
  import { RouterLink, RouterLinkActive, Router, ActivatedRoute, NavigationEnd } from '@angular/router';
@@ -1556,11 +1556,11 @@ class BlobMorphComponent extends MorphBase {
1556
1556
  this.loadEvent.emit();
1557
1557
  }
1558
1558
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.2.3", ngImport: i0, type: BlobMorphComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
1559
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.2.3", type: BlobMorphComponent, isStandalone: true, selector: "app-blob-morph", inputs: { imageUrl: "imageUrl", fillColor: "fillColor", pathStart: "pathStart", pathEnd: "pathEnd", duration: "duration" }, outputs: { loadEvent: "loadEvent" }, viewQueries: [{ propertyName: "morphPathRef", first: true, predicate: ["morphPath"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<div class=\"blob-container\">\r\n <svg\r\n viewBox=\"0 0 200 200\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n class=\"blob-svg\"\r\n [class.hidden]=\"!isLoaded\"\r\n >\r\n <defs>\r\n <clipPath [attr.id]=\"clipId\" transform=\"translate(100 100)\">\r\n <path #morphPath [attr.d]=\"pathStart\" />\r\n </clipPath>\r\n <path [attr.id]=\"'morph-path-end-' + clipId\" [attr.d]=\"pathEnd\" />\r\n </defs>\r\n\r\n @if (imageUrl) {\r\n <image\r\n [attr.href]=\"imageUrl\"\r\n width=\"100%\"\r\n height=\"100%\"\r\n preserveAspectRatio=\"xMidYMid slice\"\r\n [attr.clip-path]=\"'url(#' + clipId + ')'\"\r\n (load)=\"onLoadEvent()\"\r\n />\r\n } @else {\r\n <g [attr.clip-path]=\"'url(#' + clipId + ')'\">\r\n <rect width=\"100%\" height=\"100%\" [attr.fill]=\"fillColor || '#ccc'\" />\r\n </g>\r\n }\r\n </svg>\r\n\r\n @if (!isLoaded) {\r\n <frg-spinner [isOverlayItem]=\"true\"></frg-spinner>\r\n }\r\n</div>\r\n", styles: [":host{display:block}:host .blob-container{position:relative}\n"], dependencies: [{ kind: "component", type: SpinnerComponent, selector: "frg-spinner", inputs: ["size", "isCentered", "isOverlay", "isOverlayItem", "label", "styleType"] }] }); }
1559
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.2.3", type: BlobMorphComponent, isStandalone: true, selector: "frg-blob-morph", inputs: { imageUrl: "imageUrl", fillColor: "fillColor", pathStart: "pathStart", pathEnd: "pathEnd", duration: "duration" }, outputs: { loadEvent: "loadEvent" }, viewQueries: [{ propertyName: "morphPathRef", first: true, predicate: ["morphPath"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<div class=\"blob-container\">\r\n <svg\r\n viewBox=\"0 0 200 200\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n class=\"blob-svg\"\r\n [class.hidden]=\"!isLoaded\"\r\n >\r\n <defs>\r\n <clipPath [attr.id]=\"clipId\" transform=\"translate(100 100)\">\r\n <path #morphPath [attr.d]=\"pathStart\" />\r\n </clipPath>\r\n <path [attr.id]=\"'morph-path-end-' + clipId\" [attr.d]=\"pathEnd\" />\r\n </defs>\r\n\r\n @if (imageUrl) {\r\n <image\r\n [attr.href]=\"imageUrl\"\r\n width=\"100%\"\r\n height=\"100%\"\r\n preserveAspectRatio=\"xMidYMid slice\"\r\n [attr.clip-path]=\"'url(#' + clipId + ')'\"\r\n (load)=\"onLoadEvent()\"\r\n />\r\n } @else {\r\n <g [attr.clip-path]=\"'url(#' + clipId + ')'\">\r\n <rect width=\"100%\" height=\"100%\" [attr.fill]=\"fillColor || '#ccc'\" />\r\n </g>\r\n }\r\n </svg>\r\n\r\n @if (!isLoaded) {\r\n <frg-spinner [isOverlayItem]=\"true\"></frg-spinner>\r\n }\r\n</div>\r\n", styles: [":host{display:block}:host .blob-container{position:relative}\n"], dependencies: [{ kind: "component", type: SpinnerComponent, selector: "frg-spinner", inputs: ["size", "isCentered", "isOverlay", "isOverlayItem", "label", "styleType"] }] }); }
1560
1560
  }
1561
1561
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.2.3", ngImport: i0, type: BlobMorphComponent, decorators: [{
1562
1562
  type: Component,
1563
- args: [{ selector: 'app-blob-morph', imports: [SpinnerComponent], template: "<div class=\"blob-container\">\r\n <svg\r\n viewBox=\"0 0 200 200\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n class=\"blob-svg\"\r\n [class.hidden]=\"!isLoaded\"\r\n >\r\n <defs>\r\n <clipPath [attr.id]=\"clipId\" transform=\"translate(100 100)\">\r\n <path #morphPath [attr.d]=\"pathStart\" />\r\n </clipPath>\r\n <path [attr.id]=\"'morph-path-end-' + clipId\" [attr.d]=\"pathEnd\" />\r\n </defs>\r\n\r\n @if (imageUrl) {\r\n <image\r\n [attr.href]=\"imageUrl\"\r\n width=\"100%\"\r\n height=\"100%\"\r\n preserveAspectRatio=\"xMidYMid slice\"\r\n [attr.clip-path]=\"'url(#' + clipId + ')'\"\r\n (load)=\"onLoadEvent()\"\r\n />\r\n } @else {\r\n <g [attr.clip-path]=\"'url(#' + clipId + ')'\">\r\n <rect width=\"100%\" height=\"100%\" [attr.fill]=\"fillColor || '#ccc'\" />\r\n </g>\r\n }\r\n </svg>\r\n\r\n @if (!isLoaded) {\r\n <frg-spinner [isOverlayItem]=\"true\"></frg-spinner>\r\n }\r\n</div>\r\n", styles: [":host{display:block}:host .blob-container{position:relative}\n"] }]
1563
+ args: [{ selector: 'frg-blob-morph', imports: [SpinnerComponent], template: "<div class=\"blob-container\">\r\n <svg\r\n viewBox=\"0 0 200 200\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n class=\"blob-svg\"\r\n [class.hidden]=\"!isLoaded\"\r\n >\r\n <defs>\r\n <clipPath [attr.id]=\"clipId\" transform=\"translate(100 100)\">\r\n <path #morphPath [attr.d]=\"pathStart\" />\r\n </clipPath>\r\n <path [attr.id]=\"'morph-path-end-' + clipId\" [attr.d]=\"pathEnd\" />\r\n </defs>\r\n\r\n @if (imageUrl) {\r\n <image\r\n [attr.href]=\"imageUrl\"\r\n width=\"100%\"\r\n height=\"100%\"\r\n preserveAspectRatio=\"xMidYMid slice\"\r\n [attr.clip-path]=\"'url(#' + clipId + ')'\"\r\n (load)=\"onLoadEvent()\"\r\n />\r\n } @else {\r\n <g [attr.clip-path]=\"'url(#' + clipId + ')'\">\r\n <rect width=\"100%\" height=\"100%\" [attr.fill]=\"fillColor || '#ccc'\" />\r\n </g>\r\n }\r\n </svg>\r\n\r\n @if (!isLoaded) {\r\n <frg-spinner [isOverlayItem]=\"true\"></frg-spinner>\r\n }\r\n</div>\r\n", styles: [":host{display:block}:host .blob-container{position:relative}\n"] }]
1564
1564
  }], propDecorators: { imageUrl: [{
1565
1565
  type: Input
1566
1566
  }], fillColor: [{
@@ -1578,10 +1578,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.2.3", ngImpor
1578
1578
  args: ['morphPath', { static: false }]
1579
1579
  }] } });
1580
1580
 
1581
- class SparkleFieldComponent {
1581
+ class SparkleSectionComponent {
1582
1582
  constructor() {
1583
- this.width = 260;
1584
- this.height = 160;
1583
+ /* Layout */
1584
+ this.width = null;
1585
+ this.height = null;
1586
+ /* Sparkles */
1585
1587
  this.count = 12;
1586
1588
  this.minSize = 2;
1587
1589
  this.maxSize = 6;
@@ -1591,22 +1593,18 @@ class SparkleFieldComponent {
1591
1593
  this.loop = true;
1592
1594
  this.color = null;
1593
1595
  this.sparkles = [];
1594
- this.sparkleAnimations = [];
1595
- this.sparkleChangesSub = null;
1596
- this.fallbackWidth = 260;
1597
- this.fallbackHeight = 160;
1596
+ this.animations = [];
1597
+ this.changesSub = null;
1598
1598
  }
1599
+ /* Host sizing (ONLY when provided) */
1599
1600
  get hostWidth() {
1600
- return this.widthStyle;
1601
+ return this.width ? this.formatSize(this.width) : null;
1601
1602
  }
1602
1603
  get hostHeight() {
1603
- return this.heightStyle;
1604
+ return this.height ? this.formatSize(this.height) : null;
1604
1605
  }
1605
- get hostMinWidth() {
1606
- return this.needsMinSize(this.width) ? `${this.fallbackWidth}px` : null;
1607
- }
1608
- get hostMinHeight() {
1609
- return this.needsMinSize(this.height) ? `${this.fallbackHeight}px` : null;
1606
+ get hostColor() {
1607
+ return this.color;
1610
1608
  }
1611
1609
  ngOnInit() {
1612
1610
  this.buildSparkles();
@@ -1617,91 +1615,72 @@ class SparkleFieldComponent {
1617
1615
  changes['maxSize'] ||
1618
1616
  changes['drift'] ||
1619
1617
  changes['minDuration'] ||
1620
- changes['maxDuration'] ||
1621
- changes['loop']) {
1618
+ changes['maxDuration']) {
1622
1619
  this.buildSparkles();
1623
1620
  this.restartAnimation();
1624
1621
  }
1625
1622
  }
1626
1623
  ngAfterViewInit() {
1627
- this.sparkleChangesSub = this.sparkleRefs.changes.subscribe(() => this.restartAnimation());
1624
+ this.changesSub = this.sparkleRefs.changes.subscribe(() => this.restartAnimation());
1628
1625
  this.restartAnimation();
1629
1626
  }
1630
1627
  ngOnDestroy() {
1631
- this.sparkleAnimations.forEach((animation) => animation.pause());
1632
- this.sparkleChangesSub?.unsubscribe();
1628
+ this.animations.forEach(a => a.pause());
1629
+ this.changesSub?.unsubscribe();
1633
1630
  }
1634
1631
  buildSparkles() {
1635
1632
  const count = Math.max(0, Math.floor(this.count));
1636
1633
  const minSize = Math.min(this.minSize, this.maxSize);
1637
1634
  const maxSize = Math.max(this.minSize, this.maxSize);
1638
- const minDuration = Math.min(this.minDuration, this.maxDuration);
1639
- const maxDuration = Math.max(this.minDuration, this.maxDuration);
1635
+ const minDur = Math.min(this.minDuration, this.maxDuration);
1636
+ const maxDur = Math.max(this.minDuration, this.maxDuration);
1640
1637
  this.sparkles = Array.from({ length: count }, () => ({
1641
- x: this.randomInRange(0, 100),
1642
- y: this.randomInRange(0, 100),
1643
- size: this.randomInRange(minSize, maxSize),
1644
- delay: this.randomInRange(0, 900),
1645
- duration: this.randomInRange(minDuration, maxDuration),
1646
- driftX: this.randomInRange(-this.drift, this.drift),
1647
- driftY: this.randomInRange(-this.drift, this.drift),
1638
+ x: this.rand(0, 100),
1639
+ y: this.rand(0, 100),
1640
+ size: this.rand(minSize, maxSize),
1641
+ delay: this.rand(0, 900),
1642
+ duration: this.rand(minDur, maxDur),
1643
+ driftX: this.rand(-this.drift, this.drift),
1644
+ driftY: this.rand(-this.drift, this.drift),
1648
1645
  }));
1649
1646
  }
1650
1647
  restartAnimation() {
1651
- if (!this.sparkleRefs || this.sparkleRefs.length === 0) {
1648
+ if (!this.sparkleRefs?.length)
1652
1649
  return;
1653
- }
1654
- this.sparkleAnimations.forEach((animation) => animation.pause());
1655
- this.sparkleAnimations = [];
1656
- const targets = this.sparkleRefs.toArray();
1657
- targets.forEach((ref, i) => {
1650
+ this.animations.forEach(a => a.pause());
1651
+ this.animations = [];
1652
+ this.sparkleRefs.forEach((ref, i) => {
1658
1653
  const sparkle = this.sparkles[i];
1659
- if (!sparkle) {
1654
+ if (!sparkle)
1660
1655
  return;
1661
- }
1662
- const animation = animate(ref.nativeElement, {
1656
+ const anim = animate(ref.nativeElement, {
1663
1657
  translateX: [-sparkle.driftX, sparkle.driftX],
1664
1658
  translateY: [-sparkle.driftY, sparkle.driftY],
1665
1659
  scale: [0.7, 1.2],
1666
1660
  opacity: [0.35, 1],
1667
- duration: sparkle.duration ?? 3000,
1661
+ duration: sparkle.duration,
1668
1662
  alternate: true,
1669
1663
  loop: this.loop,
1670
- ease: 'inOut',
1664
+ easing: 'easeInOutSine',
1671
1665
  });
1672
1666
  if (sparkle.delay > 0) {
1673
- animation.seek(sparkle.delay % (sparkle.duration || 3000));
1667
+ anim.seek(sparkle.delay % sparkle.duration);
1674
1668
  }
1675
- this.sparkleAnimations.push(animation);
1669
+ this.animations.push(anim);
1676
1670
  });
1677
1671
  }
1678
- randomInRange(min, max) {
1679
- if (min === max) {
1680
- return min;
1681
- }
1672
+ rand(min, max) {
1682
1673
  return min + Math.random() * (max - min);
1683
1674
  }
1684
- get widthStyle() {
1685
- return this.formatSize(this.width);
1686
- }
1687
- get heightStyle() {
1688
- return this.formatSize(this.height);
1689
- }
1690
1675
  formatSize(value) {
1691
- if (typeof value === 'number') {
1692
- return `${value}px`;
1693
- }
1694
- return value;
1676
+ return typeof value === 'number' ? `${value}px` : (value || '');
1695
1677
  }
1696
- needsMinSize(value) {
1697
- return typeof value === 'string' && value.trim().endsWith('%');
1698
- }
1699
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.2.3", ngImport: i0, type: SparkleFieldComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1700
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.2.3", type: SparkleFieldComponent, isStandalone: true, selector: "frg-sparkle-field", inputs: { width: "width", height: "height", count: "count", minSize: "minSize", maxSize: "maxSize", drift: "drift", minDuration: "minDuration", maxDuration: "maxDuration", loop: "loop", color: "color" }, host: { properties: { "style.width": "this.hostWidth", "style.height": "this.hostHeight", "style.minWidth": "this.hostMinWidth", "style.minHeight": "this.hostMinHeight" } }, viewQueries: [{ propertyName: "sparkleRefs", predicate: ["sparkle"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div\r\n class=\"frg-sparkle-field\"\r\n [style.--frg-sparkle-color]=\"color || null\"\r\n>\r\n <span\r\n #sparkle\r\n *ngFor=\"let sparkle of sparkles\"\r\n class=\"frg-sparkle\"\r\n [style.left.%]=\"sparkle.x\"\r\n [style.top.%]=\"sparkle.y\"\r\n [style.width.px]=\"sparkle.size\"\r\n [style.height.px]=\"sparkle.size\"\r\n ></span>\r\n</div>\r\n", styles: [":host{display:inline-block}.frg-sparkle-field{position:relative;overflow:hidden;width:100%;height:100%}.frg-sparkle{position:absolute;border-radius:999px;background:var(--frg-sparkle-color, currentColor);opacity:.6;filter:blur(.2px);transform:translateZ(0);will-change:transform,opacity}\n"], dependencies: [{ kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }] }); }
1678
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.2.3", ngImport: i0, type: SparkleSectionComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1679
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.2.3", type: SparkleSectionComponent, isStandalone: true, selector: "frg-sparkle-section", inputs: { width: "width", height: "height", count: "count", minSize: "minSize", maxSize: "maxSize", drift: "drift", minDuration: "minDuration", maxDuration: "maxDuration", loop: "loop", color: "color" }, host: { properties: { "style.width": "this.hostWidth", "style.height": "this.hostHeight", "style.color": "this.hostColor" } }, viewQueries: [{ propertyName: "sparkleRefs", predicate: ["sparkle"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"frg-sparkle-layer\" aria-hidden=\"true\">\r\n @for (sparkle of sparkles; track $index) {\r\n <span\r\n #sparkle\r\n class=\"frg-sparkle\"\r\n [style.left.%]=\"sparkle.x\"\r\n [style.top.%]=\"sparkle.y\"\r\n [style.width.px]=\"sparkle.size\"\r\n [style.height.px]=\"sparkle.size\">\r\n </span>\r\n }\r\n</div>\r\n\r\n<div class=\"frg-sparkle-content\">\r\n <ng-content></ng-content>\r\n</div>\r\n", styles: [":host{display:block;position:relative;overflow:hidden}.frg-sparkle-layer{position:absolute;inset:0;pointer-events:none;z-index:0}.frg-sparkle-content{position:relative;z-index:1}.frg-sparkle{position:absolute;border-radius:50%;background:radial-gradient(circle,currentColor 0%,#fdfdfd 35%,#3d3d3d 70%);opacity:.6;will-change:transform,opacity;transform:translateZ(0)}\n"] }); }
1701
1680
  }
1702
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.2.3", ngImport: i0, type: SparkleFieldComponent, decorators: [{
1681
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.2.3", ngImport: i0, type: SparkleSectionComponent, decorators: [{
1703
1682
  type: Component,
1704
- args: [{ selector: 'frg-sparkle-field', imports: [NgFor], template: "<div\r\n class=\"frg-sparkle-field\"\r\n [style.--frg-sparkle-color]=\"color || null\"\r\n>\r\n <span\r\n #sparkle\r\n *ngFor=\"let sparkle of sparkles\"\r\n class=\"frg-sparkle\"\r\n [style.left.%]=\"sparkle.x\"\r\n [style.top.%]=\"sparkle.y\"\r\n [style.width.px]=\"sparkle.size\"\r\n [style.height.px]=\"sparkle.size\"\r\n ></span>\r\n</div>\r\n", styles: [":host{display:inline-block}.frg-sparkle-field{position:relative;overflow:hidden;width:100%;height:100%}.frg-sparkle{position:absolute;border-radius:999px;background:var(--frg-sparkle-color, currentColor);opacity:.6;filter:blur(.2px);transform:translateZ(0);will-change:transform,opacity}\n"] }]
1683
+ args: [{ selector: 'frg-sparkle-section', standalone: true, template: "<div class=\"frg-sparkle-layer\" aria-hidden=\"true\">\r\n @for (sparkle of sparkles; track $index) {\r\n <span\r\n #sparkle\r\n class=\"frg-sparkle\"\r\n [style.left.%]=\"sparkle.x\"\r\n [style.top.%]=\"sparkle.y\"\r\n [style.width.px]=\"sparkle.size\"\r\n [style.height.px]=\"sparkle.size\">\r\n </span>\r\n }\r\n</div>\r\n\r\n<div class=\"frg-sparkle-content\">\r\n <ng-content></ng-content>\r\n</div>\r\n", styles: [":host{display:block;position:relative;overflow:hidden}.frg-sparkle-layer{position:absolute;inset:0;pointer-events:none;z-index:0}.frg-sparkle-content{position:relative;z-index:1}.frg-sparkle{position:absolute;border-radius:50%;background:radial-gradient(circle,currentColor 0%,#fdfdfd 35%,#3d3d3d 70%);opacity:.6;will-change:transform,opacity;transform:translateZ(0)}\n"] }]
1705
1684
  }], propDecorators: { width: [{
1706
1685
  type: Input
1707
1686
  }], height: [{
@@ -1731,12 +1710,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.2.3", ngImpor
1731
1710
  }], hostHeight: [{
1732
1711
  type: HostBinding,
1733
1712
  args: ['style.height']
1734
- }], hostMinWidth: [{
1735
- type: HostBinding,
1736
- args: ['style.minWidth']
1737
- }], hostMinHeight: [{
1713
+ }], hostColor: [{
1738
1714
  type: HostBinding,
1739
- args: ['style.minHeight']
1715
+ args: ['style.color']
1740
1716
  }] } });
1741
1717
 
1742
1718
  class SmallPaginationComponent {
@@ -8924,5 +8900,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.2.3", ngImpor
8924
8900
  * Generated bundle index. Do not edit.
8925
8901
  */
8926
8902
 
8927
- export { AccordionComponent, BlobMorphComponent, BreadcrumbComponent, ButtonComponent, CardComponent, ChipComponent, ChunkPipe, CodeBlockComponent, ContainerComponent, ContentBlurComponent, DividerComponent, DynamicPipe, EnumDirectionSortTable, FieldArrayPositionPipe, FragmentsPopoverDirective, FragmentsTooltipDirective, FrgBadgeDirective, InputCalendarComponent, InputCheckboxComponent, InputCheckboxGroupComponent, InputClockPickerComponent, InputDateComponent, InputDateTimeComponent, InputFileUploadComponent, InputNumberComponent, InputRadioGroupComponent, InputSliderComponent, InputTextComponent, InputTimeComponent, InputToggleSwitchComponent, InputValidationComponent, ModalComponent, MultiSelectComponent, PillComponent, ProgressBarComponent, PulseLoaderComponent, SafeHtmlPipe, SanitizeHtmlPipe, SectionComponent, SelectionListComponent, SeparatorComponent, SideNavComponent, SkeletonLoaderComponent, SmallPaginationComponent, SnackbarComponent, SparkleFieldComponent, SpinnerComponent, StepperComponent, TableComponent, TabsComponent, TagComponent, TitleBarComponent, ToastComponent, ToastStackComponent, TypeOfArrayPipe, generateId, generateNumberId, generateUUID, generateUniqueId, getActivatedRouteChild, getTimestampISO, getTimestampMillis, isObjectEmpty, normalizeNumber, orderList, paginationList, sortTable };
8903
+ export { AccordionComponent, BlobMorphComponent, BreadcrumbComponent, ButtonComponent, CardComponent, ChipComponent, ChunkPipe, CodeBlockComponent, ContainerComponent, ContentBlurComponent, DividerComponent, DynamicPipe, EnumDirectionSortTable, FieldArrayPositionPipe, FragmentsPopoverDirective, FragmentsTooltipDirective, FrgBadgeDirective, InputCalendarComponent, InputCheckboxComponent, InputCheckboxGroupComponent, InputClockPickerComponent, InputDateComponent, InputDateTimeComponent, InputFileUploadComponent, InputNumberComponent, InputRadioGroupComponent, InputSliderComponent, InputTextComponent, InputTimeComponent, InputToggleSwitchComponent, InputValidationComponent, ModalComponent, MultiSelectComponent, PillComponent, ProgressBarComponent, PulseLoaderComponent, SafeHtmlPipe, SanitizeHtmlPipe, SectionComponent, SelectionListComponent, SeparatorComponent, SideNavComponent, SkeletonLoaderComponent, SmallPaginationComponent, SnackbarComponent, SparkleSectionComponent, SpinnerComponent, StepperComponent, TableComponent, TabsComponent, TagComponent, TitleBarComponent, ToastComponent, ToastStackComponent, TypeOfArrayPipe, generateId, generateNumberId, generateUUID, generateUniqueId, getActivatedRouteChild, getTimestampISO, getTimestampMillis, isObjectEmpty, normalizeNumber, orderList, paginationList, sortTable };
8928
8904
  //# sourceMappingURL=tacdaed-fragments.mjs.map
package/index.d.ts CHANGED
@@ -792,10 +792,11 @@ declare class BlobMorphComponent extends MorphBase implements AfterViewInit {
792
792
  protected generateRandomPath(points?: number, radius?: number, variability?: number): string;
793
793
  onLoadEvent(): void;
794
794
  static ɵfac: i0.ɵɵFactoryDeclaration<BlobMorphComponent, never>;
795
- static ɵcmp: i0.ɵɵComponentDeclaration<BlobMorphComponent, "app-blob-morph", never, { "imageUrl": { "alias": "imageUrl"; "required": false; }; "fillColor": { "alias": "fillColor"; "required": false; }; "pathStart": { "alias": "pathStart"; "required": false; }; "pathEnd": { "alias": "pathEnd"; "required": false; }; "duration": { "alias": "duration"; "required": false; }; }, { "loadEvent": "loadEvent"; }, never, never, true, never>;
795
+ static ɵcmp: i0.ɵɵComponentDeclaration<BlobMorphComponent, "frg-blob-morph", never, { "imageUrl": { "alias": "imageUrl"; "required": false; }; "fillColor": { "alias": "fillColor"; "required": false; }; "pathStart": { "alias": "pathStart"; "required": false; }; "pathEnd": { "alias": "pathEnd"; "required": false; }; "duration": { "alias": "duration"; "required": false; }; }, { "loadEvent": "loadEvent"; }, never, never, true, never>;
796
796
  }
797
797
 
798
- interface Sparkle {
798
+ type SizeValue = number | string | null;
799
+ interface ISparkleConfiguration {
799
800
  x: number;
800
801
  y: number;
801
802
  size: number;
@@ -804,9 +805,10 @@ interface Sparkle {
804
805
  driftX: number;
805
806
  driftY: number;
806
807
  }
807
- declare class SparkleFieldComponent implements OnInit, OnChanges, AfterViewInit, OnDestroy {
808
- width: number | string;
809
- height: number | string;
808
+
809
+ declare class SparkleSectionComponent implements OnInit, OnChanges, AfterViewInit, OnDestroy {
810
+ width: SizeValue;
811
+ height: SizeValue;
810
812
  count: number;
811
813
  minSize: number;
812
814
  maxSize: number;
@@ -815,29 +817,23 @@ declare class SparkleFieldComponent implements OnInit, OnChanges, AfterViewInit,
815
817
  maxDuration: number;
816
818
  loop: boolean;
817
819
  color: string | null;
818
- sparkles: Sparkle[];
820
+ sparkles: ISparkleConfiguration[];
819
821
  sparkleRefs: QueryList<ElementRef<HTMLSpanElement>>;
820
- private sparkleAnimations;
821
- private sparkleChangesSub;
822
- private readonly fallbackWidth;
823
- private readonly fallbackHeight;
824
- get hostWidth(): string;
825
- get hostHeight(): string;
826
- get hostMinWidth(): string | null;
827
- get hostMinHeight(): string | null;
822
+ private animations;
823
+ private changesSub;
824
+ get hostWidth(): string | null;
825
+ get hostHeight(): string | null;
826
+ get hostColor(): string | null;
828
827
  ngOnInit(): void;
829
828
  ngOnChanges(changes: SimpleChanges): void;
830
829
  ngAfterViewInit(): void;
831
830
  ngOnDestroy(): void;
832
831
  private buildSparkles;
833
832
  private restartAnimation;
834
- private randomInRange;
835
- get widthStyle(): string;
836
- get heightStyle(): string;
833
+ private rand;
837
834
  private formatSize;
838
- private needsMinSize;
839
- static ɵfac: i0.ɵɵFactoryDeclaration<SparkleFieldComponent, never>;
840
- static ɵcmp: i0.ɵɵComponentDeclaration<SparkleFieldComponent, "frg-sparkle-field", never, { "width": { "alias": "width"; "required": false; }; "height": { "alias": "height"; "required": false; }; "count": { "alias": "count"; "required": false; }; "minSize": { "alias": "minSize"; "required": false; }; "maxSize": { "alias": "maxSize"; "required": false; }; "drift": { "alias": "drift"; "required": false; }; "minDuration": { "alias": "minDuration"; "required": false; }; "maxDuration": { "alias": "maxDuration"; "required": false; }; "loop": { "alias": "loop"; "required": false; }; "color": { "alias": "color"; "required": false; }; }, {}, never, never, true, never>;
835
+ static ɵfac: i0.ɵɵFactoryDeclaration<SparkleSectionComponent, never>;
836
+ static ɵcmp: i0.ɵɵComponentDeclaration<SparkleSectionComponent, "frg-sparkle-section", never, { "width": { "alias": "width"; "required": false; }; "height": { "alias": "height"; "required": false; }; "count": { "alias": "count"; "required": false; }; "minSize": { "alias": "minSize"; "required": false; }; "maxSize": { "alias": "maxSize"; "required": false; }; "drift": { "alias": "drift"; "required": false; }; "minDuration": { "alias": "minDuration"; "required": false; }; "maxDuration": { "alias": "maxDuration"; "required": false; }; "loop": { "alias": "loop"; "required": false; }; "color": { "alias": "color"; "required": false; }; }, {}, never, ["*"], true, never>;
841
837
  }
842
838
 
843
839
  interface IPaginationOutput<T> {
@@ -3925,5 +3921,5 @@ declare function getTimestampMillis(): number;
3925
3921
  */
3926
3922
  declare function generateUniqueId(prefix?: string): string;
3927
3923
 
3928
- export { AccordionComponent, BlobMorphComponent, BreadcrumbComponent, ButtonComponent, CardComponent, ChipComponent, ChunkPipe, CodeBlockComponent, ContainerComponent, ContentBlurComponent, DividerComponent, DynamicPipe, EnumDirectionSortTable, FieldArrayPositionPipe, FragmentsPopoverDirective, FragmentsTooltipDirective, FrgBadgeDirective, InputCalendarComponent, InputCheckboxComponent, InputCheckboxGroupComponent, InputClockPickerComponent, InputDateComponent, InputDateTimeComponent, InputFileUploadComponent, InputNumberComponent, InputRadioGroupComponent, InputSliderComponent, InputTextComponent, InputTimeComponent, InputToggleSwitchComponent, InputValidationComponent, ModalComponent, MultiSelectComponent, PillComponent, ProgressBarComponent, PulseLoaderComponent, SafeHtmlPipe, SanitizeHtmlPipe, SectionComponent, SelectionListComponent, SeparatorComponent, SideNavComponent, SkeletonLoaderComponent, SmallPaginationComponent, SnackbarComponent, SparkleFieldComponent, SpinnerComponent, StepperComponent, TableComponent, TabsComponent, TagComponent, TitleBarComponent, ToastComponent, ToastStackComponent, TypeOfArrayPipe, generateId, generateNumberId, generateUUID, generateUniqueId, getActivatedRouteChild, getTimestampISO, getTimestampMillis, isObjectEmpty, normalizeNumber, orderList, paginationList, sortTable };
3924
+ export { AccordionComponent, BlobMorphComponent, BreadcrumbComponent, ButtonComponent, CardComponent, ChipComponent, ChunkPipe, CodeBlockComponent, ContainerComponent, ContentBlurComponent, DividerComponent, DynamicPipe, EnumDirectionSortTable, FieldArrayPositionPipe, FragmentsPopoverDirective, FragmentsTooltipDirective, FrgBadgeDirective, InputCalendarComponent, InputCheckboxComponent, InputCheckboxGroupComponent, InputClockPickerComponent, InputDateComponent, InputDateTimeComponent, InputFileUploadComponent, InputNumberComponent, InputRadioGroupComponent, InputSliderComponent, InputTextComponent, InputTimeComponent, InputToggleSwitchComponent, InputValidationComponent, ModalComponent, MultiSelectComponent, PillComponent, ProgressBarComponent, PulseLoaderComponent, SafeHtmlPipe, SanitizeHtmlPipe, SectionComponent, SelectionListComponent, SeparatorComponent, SideNavComponent, SkeletonLoaderComponent, SmallPaginationComponent, SnackbarComponent, SparkleSectionComponent, SpinnerComponent, StepperComponent, TableComponent, TabsComponent, TagComponent, TitleBarComponent, ToastComponent, ToastStackComponent, TypeOfArrayPipe, generateId, generateNumberId, generateUUID, generateUniqueId, getActivatedRouteChild, getTimestampISO, getTimestampMillis, isObjectEmpty, normalizeNumber, orderList, paginationList, sortTable };
3929
3925
  export type { AccordionItem, AccordionItemContext, AccordionToggleEvent, ArrayOneOrMore, Badge, BreadcrumbItem, Chip, CodeBlockBody, CodeBlockConfig, CodeBlockFooter, CodeBlockHeader, DateFormat, DateTimeFormat, GenericFunction, IActionElement, IBaseAction, IConfigTable, IEventAction, IFieldPipe, ILinkAction, IPaginationOutput, ISideNavConfig, ISideNavItem, ISideNavSection, ITBody, ITBodyAction, ITBodyCell, ITBodyCellIcon, ITBodyColumn, ITCaption, ITHead, ITHeadAction, ITHeadColumn, ITPagination, ITSort, ITTitleBar, ITTitleBarFilter, ITTitleBarSearch, ITooltipElement, InputCheckboxGroupItem, InputRadioGroupItem, ModalCloseEvent, NgClassValue, Pill, SelectionListItem, SnackbarCloseEvent, StatusIndicator, StepChangeEvent, StepItem, StepItemContext, StepValidationContext, StepValidationEvent, StepValidator, TAccordionSize, TAccordionStyle, TBasePosition, TBaseSideNavSize, TBaseSideNavStyle, TBaseSize, TBaseStatusIconPosition, TBaseStatusSize, TBaseStatusStyle, TBaseStyle, TBehaviourAction, TButtonIconPosition, TButtonShape, TButtonSize, TButtonStyle, TButtonType, TCardStyle, TChipIconPosition, TChipSize, TChipType, TContainerSize, TCustomNgClass, TDividerOrientation, TDividerSpacing, THLJSLanguage, TIconPosition, TInputType, TModalCloseReason, TModalSize, TPillIconPosition, TPillSize, TPillType, TProgressBarAnimation, TProgressBarSize, TProgressBarType, TPulseLoaderSize, TPulseLoaderType, TSectionHeading, TSectionSpacing, TSeparatorSize, TSideNavLink, TSkeletonLoaderSize, TSkeletonLoaderType, TSnackbarCloseReason, TSnackbarPosition, TSnackbarSize, TSnackbarStyle, TSpinnerSize, TSpinnerType, TStepNavigationSource, TStepperMotion, TStepperOrientation, TTabSize, TTabStyle, TTagIconPosition, TTagSize, TTagType, TToastCloseReason, TToastPosition, TToastSize, TToastStyle, TabChangeEvent, TabItem, TabItemContext, Tag, TimeFormat, ToastCloseEvent, ToastStackCloseEvent, ToastStackItem, TooltipPosition, TypeForm, Without, XOR };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tacdaed/fragments",
3
- "version": "1.0.0-beta.7",
3
+ "version": "1.0.0-beta.9",
4
4
  "peerDependencies": {
5
5
  "@angular/common": "^20.2.0",
6
6
  "@angular/core": "^20.2.0",