ng-hub-ui-skeleton 22.2.3 → 22.3.0

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
@@ -88,7 +88,7 @@ npm install ng-hub-ui-skeleton
88
88
 
89
89
  ## 🚀 Usage
90
90
 
91
- Import the standalone component (or the optional `HubSkeletonModule` for module-based apps):
91
+ Import the standalone component:
92
92
 
93
93
  ```typescript
94
94
  import { HubSkeletonComponent } from 'ng-hub-ui-skeleton';
@@ -277,7 +277,7 @@ Selector: `hub-skeleton`
277
277
  | `variant` | `string \| null` | `null` | Named preset variant to apply. |
278
278
  | `animated` | `boolean` | `true` | Toggles the shimmer animation. |
279
279
  | `appearance` | `HubSkeletonAppearance` | `'default'` | Visual tone: `'default' \| 'subtle' \| 'contrast'`. |
280
- | `ariaLabel` | `string` | `'Loading placeholder'` | Accessible label applied to the container. |
280
+ | `ariaLabel` | `string` | `'Loading placeholder'` | Accessible name of the container's `role="status"` live region. |
281
281
 
282
282
  > Either `preset` or `template` must be provided; otherwise the component throws. An unknown preset name also throws.
283
283
 
@@ -331,7 +331,9 @@ interface HubSkeletonPreset {
331
331
  }
332
332
  ```
333
333
 
334
- Additional DSL helpers are also exported (`parseHubSkeletonDsl`, `interpolateHubSkeletonParams`, `resolveTemplateDsl`, `resolveResponsiveToken`, `resolveBreakpointFromWidth`, `resolveHubSkeletonNodes`) along with the `HUB_SKELETON_DEFAULT_PRESETS` catalogue and the `HubSkeletonModule`.
334
+ Additional DSL helpers are also exported (`parseHubSkeletonDsl`, `interpolateHubSkeletonParams`, `resolveTemplateDsl`, `resolveResponsiveToken`, `resolveBreakpointFromWidth`, `resolveHubSkeletonNodes`) along with the `HUB_SKELETON_DEFAULT_PRESETS` catalogue and `HubSkeletonModule`.
335
+
336
+ `HubSkeletonModule` is **deprecated and removed in 23.0.0**: it only re-exports `HubSkeletonComponent`, so a module-based application imports the component directly. Custom presets go through `provideHubSkeletonPresets()`, which never travelled through the module. See `BREAKING_CHANGES.md`.
335
337
 
336
338
  ## 🎨 Styling / CSS Variables
337
339
 
@@ -361,7 +363,7 @@ The `appearance` input swaps the base/highlight colors for `subtle` and `contras
361
363
  For Sass-based projects, the `hub-skeleton-theme()` mixin overrides the `--hub-skeleton-*` tokens in a single include. Every parameter is optional and defaults to `null`, so only the ones you pass are emitted — the rest keep the component defaults. It is token-based and self-contained (no Bootstrap dependency). A skeleton is a neutral placeholder, so there is no semantic color variant: tune the base / highlight surfaces, the corner radius, the gap between nodes and the shimmer speed instead (per-node sizes still come from the template DSL / presets).
362
364
 
363
365
  ```scss
364
- @use 'ng-hub-ui-skeleton/styles/mixins/skeleton-theme' as *;
366
+ @use 'ng-hub-ui-skeleton/styles' as *;
365
367
 
366
368
  hub-skeleton.on-dark {
367
369
  @include hub-skeleton-theme(
@@ -558,7 +558,10 @@ class HubSkeletonComponent {
558
558
  /** Visual appearance preset. */
559
559
  appearance = input('default', /* @ts-ignore */
560
560
  ...(ngDevMode ? [{ debugName: "appearance" }] : /* istanbul ignore next */ []));
561
- /** Optional accessible label applied to the container. */
561
+ /**
562
+ * Accessible name of the container. The placeholder shapes are all `aria-hidden`,
563
+ * so this label is the only thing assistive technology can perceive while loading.
564
+ */
562
565
  ariaLabel = input('Loading placeholder', /* @ts-ignore */
563
566
  ...(ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []));
564
567
  document = inject(DOCUMENT);
@@ -653,14 +656,16 @@ class HubSkeletonComponent {
653
656
  return value;
654
657
  }
655
658
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: HubSkeletonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
656
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: HubSkeletonComponent, isStandalone: true, selector: "hub-skeleton", inputs: { preset: { classPropertyName: "preset", publicName: "preset", isSignal: true, isRequired: false, transformFunction: null }, template: { classPropertyName: "template", publicName: "template", isSignal: true, isRequired: false, transformFunction: null }, params: { classPropertyName: "params", publicName: "params", isSignal: true, isRequired: false, transformFunction: null }, variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, animated: { classPropertyName: "animated", publicName: "animated", isSignal: true, isRequired: false, transformFunction: null }, appearance: { classPropertyName: "appearance", publicName: "appearance", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null } }, providers: [HubSkeletonPresetRegistryService], ngImport: i0, template: `
659
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: HubSkeletonComponent, isStandalone: true, selector: "hub-skeleton", inputs: { preset: { classPropertyName: "preset", publicName: "preset", isSignal: true, isRequired: false, transformFunction: null }, template: { classPropertyName: "template", publicName: "template", isSignal: true, isRequired: false, transformFunction: null }, params: { classPropertyName: "params", publicName: "params", isSignal: true, isRequired: false, transformFunction: null }, variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, animated: { classPropertyName: "animated", publicName: "animated", isSignal: true, isRequired: false, transformFunction: null }, appearance: { classPropertyName: "appearance", publicName: "appearance", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
657
660
  <div
658
661
  class="hub-skeleton"
659
662
  [class.hub-skeleton--animated]="animated()"
660
663
  [class.hub-skeleton--subtle]="appearance() === 'subtle'"
661
664
  [class.hub-skeleton--contrast]="appearance() === 'contrast'"
662
665
  [attr.aria-label]="ariaLabel()"
663
- role="presentation"
666
+ role="status"
667
+ aria-live="polite"
668
+ aria-busy="true"
664
669
  >
665
670
  <ng-container *ngTemplateOutlet="renderNodes; context: { $implicit: resolvedNodes() }"></ng-container>
666
671
  </div>
@@ -690,14 +695,16 @@ class HubSkeletonComponent {
690
695
  }
691
696
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: HubSkeletonComponent, decorators: [{
692
697
  type: Component,
693
- args: [{ selector: 'hub-skeleton', standalone: true, imports: [NgTemplateOutlet], providers: [HubSkeletonPresetRegistryService], changeDetection: ChangeDetectionStrategy.OnPush, template: `
698
+ args: [{ selector: 'hub-skeleton', standalone: true, imports: [NgTemplateOutlet], changeDetection: ChangeDetectionStrategy.OnPush, template: `
694
699
  <div
695
700
  class="hub-skeleton"
696
701
  [class.hub-skeleton--animated]="animated()"
697
702
  [class.hub-skeleton--subtle]="appearance() === 'subtle'"
698
703
  [class.hub-skeleton--contrast]="appearance() === 'contrast'"
699
704
  [attr.aria-label]="ariaLabel()"
700
- role="presentation"
705
+ role="status"
706
+ aria-live="polite"
707
+ aria-busy="true"
701
708
  >
702
709
  <ng-container *ngTemplateOutlet="renderNodes; context: { $implicit: resolvedNodes() }"></ng-container>
703
710
  </div>
@@ -727,7 +734,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
727
734
  }], propDecorators: { preset: [{ type: i0.Input, args: [{ isSignal: true, alias: "preset", required: false }] }], template: [{ type: i0.Input, args: [{ isSignal: true, alias: "template", required: false }] }], params: [{ type: i0.Input, args: [{ isSignal: true, alias: "params", required: false }] }], variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }], animated: [{ type: i0.Input, args: [{ isSignal: true, alias: "animated", required: false }] }], appearance: [{ type: i0.Input, args: [{ isSignal: true, alias: "appearance", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }] } });
728
735
 
729
736
  /**
730
- * NgModule wrapper kept for compatibility with module-based Angular apps.
737
+ * Backward-compatibility module for NgModule-based applications.
738
+ *
739
+ * @deprecated Import the standalone `HubSkeletonComponent` directly; this module only
740
+ * re-exports it and provides nothing of its own. Custom presets are registered with
741
+ * `provideHubSkeletonPresets()`, which never travelled through here. Scheduled for
742
+ * removal in **23.0.0**.
731
743
  */
732
744
  class HubSkeletonModule {
733
745
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: HubSkeletonModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
@@ -1 +1 @@
1
- {"version":3,"file":"ng-hub-ui-skeleton.mjs","sources":["../../../projects/skeleton/src/lib/presets/hub-skeleton-default-presets.ts","../../../projects/skeleton/src/lib/services/hub-skeleton-preset-registry.service.ts","../../../projects/skeleton/src/lib/utils/hub-skeleton-dsl.ts","../../../projects/skeleton/src/lib/hub-skeleton.component.ts","../../../projects/skeleton/src/lib/hub-skeleton.module.ts","../../../projects/skeleton/src/public-api.ts","../../../projects/skeleton/src/ng-hub-ui-skeleton.ts"],"sourcesContent":["import { HubSkeletonPreset } from '../models/hub-skeleton.types';\n\n/**\n * Bundled preset catalogue used by the skeleton library.\n */\nexport const HUB_SKELETON_DEFAULT_PRESETS: readonly HubSkeletonPreset[] = [\n\t{\n\t\tname: 'card',\n\t\tdescription: 'Generic content card with media, title and body lines.',\n\t\ttemplate:\n\t\t\t'stack(gap:16)>block(height:{{mediaHeight}},radius:{{radius}})+line(height:{{titleHeight}},width:{{titleWidth}})+stack(gap:{{bodyGap}})>line(height:{{lineHeight}},width:100%)*{{rows}}+line(height:{{lineHeight}},width:{{lastLineWidth}})',\n\t\tdefaults: {\n\t\t\tmediaHeight: 180,\n\t\t\tradius: 18,\n\t\t\ttitleHeight: 18,\n\t\t\ttitleWidth: '56%',\n\t\t\tbodyGap: 10,\n\t\t\tlineHeight: 12,\n\t\t\trows: 2,\n\t\t\tlastLineWidth: '76%'\n\t\t},\n\t\tvariants: {\n\t\t\tcompact: {\n\t\t\t\tdefaults: {\n\t\t\t\t\tmediaHeight: 120,\n\t\t\t\t\tradius: 14,\n\t\t\t\t\ttitleHeight: 16,\n\t\t\t\t\tbodyGap: 8,\n\t\t\t\t\tlineHeight: 10,\n\t\t\t\t\trows: 1,\n\t\t\t\t\tlastLineWidth: '68%'\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\t{\n\t\tname: 'list-item',\n\t\tdescription: 'Avatar row with title and subtitle lines.',\n\t\ttemplate:\n\t\t\t'stack(direction:row,gap:12,align:center)>circle(size:{{avatarSize}})+stack(gap:{{gap}},grow:1)>line(height:{{titleHeight}},width:{{titleWidth}})+line(height:{{lineHeight}},width:{{lineWidth}})',\n\t\tdefaults: {\n\t\t\tavatarSize: 44,\n\t\t\tgap: 8,\n\t\t\ttitleHeight: 14,\n\t\t\ttitleWidth: '42%',\n\t\t\tlineHeight: 10,\n\t\t\tlineWidth: '68%'\n\t\t},\n\t\tvariants: {\n\t\t\tcompact: {\n\t\t\t\tdefaults: {\n\t\t\t\t\tavatarSize: 36,\n\t\t\t\t\tgap: 6,\n\t\t\t\t\ttitleHeight: 12,\n\t\t\t\t\tlineHeight: 8\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\t{\n\t\tname: 'table-row',\n\t\tdescription: 'Grid row that adapts to the configured column count.',\n\t\ttemplate: 'grid(columns:{{columns}},gap:12|md=16)>line(height:{{lineHeight}},width:{{cellWidth}})*{{columns}}',\n\t\tdefaults: {\n\t\t\tcolumns: 4,\n\t\t\tlineHeight: 12,\n\t\t\tcellWidth: '88%'\n\t\t}\n\t},\n\t{\n\t\tname: 'detail-view',\n\t\tdescription: 'Two-column detail layout with hero block and metadata rows.',\n\t\ttemplate:\n\t\t\t'grid(columns:1|lg=2,gap:20)>block(height:220|lg=280,radius:20)+stack(gap:14)>line(height:20,width:48%)+line(height:12,width:78%)+line(height:12,width:92%)+line(height:12,width:70%)+grid(columns:2,gap:12)>block(height:64)*4'\n\t},\n\t{\n\t\tname: 'form-section',\n\t\tdescription: 'Grouped form controls with header and responsive fields.',\n\t\ttemplate:\n\t\t\t'stack(gap:18)>line(height:18,width:32%)+grid(columns:1|md=2,gap:14)>stack(gap:8)>line(height:10,width:28%)+block(height:44,radius:12)*{{fields}}',\n\t\tdefaults: {\n\t\t\tfields: 4\n\t\t}\n\t},\n\t{\n\t\tname: 'dashboard-widget',\n\t\tdescription: 'Panel header with metric rows and footer actions.',\n\t\ttemplate:\n\t\t\t'stack(gap:16)>stack(direction:row,gap:12,justify:space-between,align:center)>line(height:16,width:36%)+circle(size:20)+block(height:132,radius:18)+grid(columns:2,gap:12)>line(height:12,width:72%)*4'\n\t},\n\t{\n\t\tname: 'stat-card',\n\t\tdescription: 'Metric summary card with title, large value and trend.',\n\t\ttemplate:\n\t\t\t'stack(gap:14)>line(height:12,width:34%)+line(height:34,width:44%)+line(height:10,width:28%)+block(height:44,radius:14)'\n\t},\n\t{\n\t\tname: 'chart-panel',\n\t\tdescription: 'Chart block with legend rows.',\n\t\ttemplate:\n\t\t\t'stack(gap:16)>stack(direction:row,gap:12,justify:space-between,align:center)>line(height:16,width:40%)+line(height:10,width:18%)+block(height:220,radius:18)+grid(columns:2,gap:10)>stack(direction:row,gap:8,align:center)>circle(size:10)+line(height:10,width:60%)*4'\n\t},\n\t{\n\t\tname: 'profile-summary',\n\t\tdescription: 'Profile card with avatar, identity and summary metrics.',\n\t\ttemplate:\n\t\t\t'stack(gap:16,align:center)>circle(size:88)+line(height:18,width:46%)+line(height:12,width:62%)+grid(columns:3,gap:12)>block(height:56,radius:14)*3'\n\t},\n\t{\n\t\tname: 'master-detail',\n\t\tdescription: 'List panel and detail panel skeleton pair.',\n\t\ttemplate:\n\t\t\t'grid(columns:1|lg=3,gap:20)>stack(gap:12)>list-item*4+stack(gap:16)>block(height:220,radius:18)+line(height:18,width:42%)+line(height:12,width:92%)*3+line(height:12,width:70%)'\n\t},\n\t{\n\t\tname: 'kanban-card',\n\t\tdescription: 'Compact board card with title, metadata and footer chips.',\n\t\ttemplate:\n\t\t\t'stack(gap:12)>line(height:14,width:58%)+line(height:10,width:80%)+stack(direction:row,gap:8)>block(height:24,width:76,radius:999)+block(height:24,width:92,radius:999)'\n\t},\n\t{\n\t\tname: 'feed-item',\n\t\tdescription: 'Activity feed row with avatar and content snippets.',\n\t\ttemplate:\n\t\t\t'stack(direction:row,gap:12,align:flex-start)>circle(size:40)+stack(gap:8,grow:1)>line(height:12,width:34%)+line(height:12,width:94%)+line(height:12,width:74%)'\n\t},\n\t{\n\t\tname: 'search-result',\n\t\tdescription: 'Search result card with title, metadata and excerpt.',\n\t\ttemplate:\n\t\t\t'stack(gap:12)>line(height:18,width:56%)+stack(direction:row,gap:10)>line(height:10,width:20%)+line(height:10,width:18%)+line(height:10,width:24%)+line(height:12,width:92%)*2+line(height:12,width:76%)'\n\t},\n\t{\n\t\tname: 'table-toolbar',\n\t\tdescription: 'Toolbar with title, filters and actions.',\n\t\ttemplate:\n\t\t\t'grid(columns:1|md=2,gap:16,align:center)>line(height:18,width:38%)+stack(direction:row,gap:10,justify:flex-end)>block(height:38,width:180,radius:12)+block(height:38,width:110,radius:12)+block(height:38,width:92,radius:12)'\n\t},\n\t{\n\t\tname: 'filter-bar',\n\t\tdescription: 'Row of filter controls with mobile stacking.',\n\t\ttemplate:\n\t\t\t'grid(columns:1|md=4,gap:12)>block(height:40,radius:12)*{{filters}}',\n\t\tdefaults: {\n\t\t\tfilters: 4\n\t\t}\n\t},\n\t{\n\t\tname: 'empty-state-skeleton',\n\t\tdescription: 'Illustrative empty-state placeholder with title and actions.',\n\t\ttemplate:\n\t\t\t'stack(gap:18,align:center)>block(height:160,width:240,radius:28)+line(height:18,width:36%)+line(height:12,width:64%)+line(height:12,width:52%)+stack(direction:row,gap:12)>block(height:40,width:120,radius:999)+block(height:40,width:84,radius:999)'\n\t}\n] as const;\n","import { EnvironmentProviders, Injectable, InjectionToken, computed, inject, makeEnvironmentProviders } from '@angular/core';\nimport { HUB_SKELETON_DEFAULT_PRESETS } from '../presets/hub-skeleton-default-presets';\nimport { HubSkeletonPreset } from '../models/hub-skeleton.types';\n\n/** Multi-provider token for consumer-defined skeleton preset groups. */\nexport const HUB_SKELETON_PRESETS = new InjectionToken<readonly (readonly HubSkeletonPreset[])[]>(\n\t'HUB_SKELETON_PRESETS',\n\t{\n\tfactory: () => []\n\t}\n);\n\n/**\n * Registers one or more custom presets for the active injector tree.\n *\n * @param presets Custom presets to append to the bundled catalogue.\n * @returns Environment providers ready for app-level registration.\n */\nexport function provideHubSkeletonPresets(presets: readonly HubSkeletonPreset[]): EnvironmentProviders {\n\treturn makeEnvironmentProviders([\n\t\t{\n\t\t\tprovide: HUB_SKELETON_PRESETS,\n\t\t\tmulti: true,\n\t\t\tuseValue: presets\n\t\t}\n\t]);\n}\n\n/**\n * Resolves the full preset catalogue available to the current injector.\n */\n@Injectable({ providedIn: 'root' })\nexport class HubSkeletonPresetRegistryService {\n\tprivate readonly customPresetGroups = inject(HUB_SKELETON_PRESETS);\n\n\t/** All presets merged by name, where later entries override earlier ones. */\n\treadonly presets = computed(() => {\n\t\tconst merged = new Map<string, HubSkeletonPreset>();\n\n\t\tfor (const preset of HUB_SKELETON_DEFAULT_PRESETS) {\n\t\t\tmerged.set(preset.name, preset);\n\t\t}\n\n\t\tfor (const presetGroup of this.customPresetGroups) {\n\t\t\tfor (const preset of presetGroup) {\n\t\t\t\tmerged.set(preset.name, preset);\n\t\t\t}\n\t\t}\n\n\t\treturn merged;\n\t});\n\n\t/**\n\t * Returns a single preset by name.\n\t *\n\t * @param name Preset identifier.\n\t * @returns Matching preset, when available.\n\t */\n\tgetPreset(name: string): HubSkeletonPreset | undefined {\n\t\treturn this.presets().get(name);\n\t}\n}\n","import {\n\tHubSkeletonAstNode,\n\tHubSkeletonBreakpoint,\n\tHubSkeletonParams,\n\tHubSkeletonPreset,\n\tHubSkeletonPrimitive,\n\tHubSkeletonRenderNode,\n\tHubSkeletonResponsiveValue,\n\tHubSkeletonTemplateDefinition,\n\tHubSkeletonTemplateInput\n} from '../models/hub-skeleton.types';\n\nconst BUILTIN_NODE_TYPES = new Set(['line', 'block', 'circle', 'stack', 'grid']);\nconst BREAKPOINT_ORDER: readonly HubSkeletonBreakpoint[] = ['base', 'sm', 'md', 'lg', 'xl'];\nconst BREAKPOINT_WIDTHS: Record<Exclude<HubSkeletonBreakpoint, 'base'>, number> = {\n\tsm: 576,\n\tmd: 768,\n\tlg: 992,\n\txl: 1280\n};\n\n/**\n * Lightweight DSL parser for the compact skeleton syntax.\n */\nclass HubSkeletonDslParser {\n\tprivate index = 0;\n\n\tconstructor(private readonly source: string) {}\n\n\t/**\n\t * Parses the full source string into sibling root nodes.\n\t *\n\t * @returns Root nodes declared in the DSL.\n\t */\n\tparse(): readonly HubSkeletonAstNode[] {\n\t\tconst nodes = this.parseSiblings();\n\t\tthis.skipWhitespace();\n\n\t\tif (this.index < this.source.length) {\n\t\t\tthrow new Error(`Unexpected token \"${this.source[this.index]}\" at position ${this.index}.`);\n\t\t}\n\n\t\treturn nodes;\n\t}\n\n\tprivate parseSiblings(): HubSkeletonAstNode[] {\n\t\tconst nodes = [this.parseNode()];\n\n\t\twhile (true) {\n\t\t\tthis.skipWhitespace();\n\t\t\tif (this.peek() !== '+') {\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tthis.index += 1;\n\t\t\tnodes.push(this.parseNode());\n\t\t}\n\n\t\treturn nodes;\n\t}\n\n\tprivate parseNode(): HubSkeletonAstNode {\n\t\tthis.skipWhitespace();\n\t\tconst name = this.readIdentifier();\n\t\tlet variant: string | undefined;\n\n\t\tif (this.peek() === '@') {\n\t\t\tthis.index += 1;\n\t\t\tvariant = this.readIdentifier();\n\t\t}\n\n\t\tconst props = this.peek() === '(' ? this.readProps() : {};\n\t\tlet children: readonly HubSkeletonAstNode[] = [];\n\n\t\tthis.skipWhitespace();\n\t\tif (this.peek() === '>') {\n\t\t\tthis.index += 1;\n\t\t\tchildren = this.parseSiblings();\n\t\t}\n\n\t\tthis.skipWhitespace();\n\t\tlet repeat = 1;\n\t\tif (this.peek() === '*') {\n\t\t\tthis.index += 1;\n\t\t\tconst rawRepeat = this.readUntilDelimiter(['+', '>', ')']).trim();\n\t\t\trepeat = Number.parseInt(rawRepeat, 10);\n\t\t\tif (!Number.isFinite(repeat) || repeat < 1) {\n\t\t\t\tthrow new Error(`Invalid repeat value \"${rawRepeat}\" near position ${this.index}.`);\n\t\t\t}\n\t\t}\n\n\t\treturn { name, props, variant, children, repeat };\n\t}\n\n\tprivate readProps(): Record<string, string> {\n\t\tconst props: Record<string, string> = {};\n\t\tthis.expect('(');\n\t\tlet chunk = '';\n\t\tlet depth = 1;\n\n\t\twhile (this.index < this.source.length && depth > 0) {\n\t\t\tconst char = this.source[this.index++];\n\t\t\tif (char === '(') {\n\t\t\t\tdepth += 1;\n\t\t\t\tchunk += char;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (char === ')') {\n\t\t\t\tdepth -= 1;\n\t\t\t\tif (depth === 0) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tchunk += char;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tchunk += char;\n\t\t}\n\n\t\tif (depth !== 0) {\n\t\t\tthrow new Error('Unclosed modifier block in skeleton DSL.');\n\t\t}\n\n\t\tfor (const entry of this.splitTopLevel(chunk, ',')) {\n\t\t\tconst trimmedEntry = entry.trim();\n\t\t\tif (!trimmedEntry) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst [rawKey, ...rawValueParts] = trimmedEntry.split(':');\n\t\t\tif (!rawKey) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tprops[rawKey.trim()] = rawValueParts.length > 0 ? rawValueParts.join(':').trim() : 'true';\n\t\t}\n\n\t\treturn props;\n\t}\n\n\tprivate splitTopLevel(value: string, separator: string): string[] {\n\t\tconst parts: string[] = [];\n\t\tlet current = '';\n\t\tlet depth = 0;\n\n\t\tfor (const char of value) {\n\t\t\tif (char === '(') {\n\t\t\t\tdepth += 1;\n\t\t\t} else if (char === ')') {\n\t\t\t\tdepth -= 1;\n\t\t\t}\n\n\t\t\tif (char === separator && depth === 0) {\n\t\t\t\tparts.push(current);\n\t\t\t\tcurrent = '';\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tcurrent += char;\n\t\t}\n\n\t\tif (current) {\n\t\t\tparts.push(current);\n\t\t}\n\n\t\treturn parts;\n\t}\n\n\tprivate readIdentifier(): string {\n\t\tthis.skipWhitespace();\n\t\tconst start = this.index;\n\t\twhile (this.index < this.source.length && /[a-zA-Z0-9-]/.test(this.source[this.index])) {\n\t\t\tthis.index += 1;\n\t\t}\n\n\t\tif (start === this.index) {\n\t\t\tthrow new Error(`Expected identifier near position ${this.index}.`);\n\t\t}\n\n\t\treturn this.source.slice(start, this.index);\n\t}\n\n\tprivate readUntilDelimiter(delimiters: readonly string[]): string {\n\t\tconst start = this.index;\n\t\twhile (this.index < this.source.length && !delimiters.includes(this.source[this.index])) {\n\t\t\tthis.index += 1;\n\t\t}\n\t\treturn this.source.slice(start, this.index);\n\t}\n\n\tprivate expect(char: string): void {\n\t\tthis.skipWhitespace();\n\t\tif (this.peek() !== char) {\n\t\t\tthrow new Error(`Expected \"${char}\" near position ${this.index}.`);\n\t\t}\n\t\tthis.index += 1;\n\t}\n\n\tprivate skipWhitespace(): void {\n\t\twhile (this.index < this.source.length && /\\s/.test(this.source[this.index])) {\n\t\t\tthis.index += 1;\n\t\t}\n\t}\n\n\tprivate peek(): string | undefined {\n\t\treturn this.source[this.index];\n\t}\n}\n\n/**\n * Parses a DSL string into a raw AST.\n *\n * @param dsl Source template string.\n * @returns Parsed root nodes.\n */\nexport function parseHubSkeletonDsl(dsl: string): readonly HubSkeletonAstNode[] {\n\treturn new HubSkeletonDslParser(dsl).parse();\n}\n\n/**\n * Interpolates `{{param}}` placeholders using a serializable params map.\n *\n * @param source Source DSL or modifier value.\n * @param params Runtime params.\n * @returns Interpolated string.\n */\nexport function interpolateHubSkeletonParams(source: string, params: HubSkeletonParams): string {\n\treturn source.replace(/\\{\\{\\s*([a-zA-Z0-9_-]+)\\s*\\}\\}/g, (_, key: string) => String(params[key] ?? ''));\n}\n\n/**\n * Resolves the concrete DSL string to use for the current breakpoint.\n *\n * @param template Source template definition.\n * @param breakpoint Current active breakpoint.\n * @returns DSL string to parse.\n */\nexport function resolveTemplateDsl(\n\ttemplate: HubSkeletonTemplateInput,\n\tbreakpoint: HubSkeletonBreakpoint\n): string {\n\tif (typeof template === 'string') {\n\t\treturn template;\n\t}\n\n\tif (breakpoint !== 'base' && template.responsive?.[breakpoint]) {\n\t\treturn template.responsive[breakpoint]!;\n\t}\n\n\treturn template.dsl;\n}\n\n/**\n * Resolves a primitive or responsive value token to a string for the active breakpoint.\n *\n * @param value Raw modifier value.\n * @param breakpoint Current breakpoint.\n * @returns Breakpoint-resolved string.\n */\nexport function resolveResponsiveToken(value: string, breakpoint: HubSkeletonBreakpoint): string {\n\tconst parsed = parseResponsiveToken(value);\n\tif (typeof parsed !== 'object' || parsed === null) {\n\t\treturn String(parsed);\n\t}\n\n\tlet resolved: HubSkeletonPrimitive | undefined = parsed.base;\n\tfor (const key of BREAKPOINT_ORDER) {\n\t\tif (key === 'base') {\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (BREAKPOINT_ORDER.indexOf(key) <= BREAKPOINT_ORDER.indexOf(breakpoint) && parsed[key] !== undefined) {\n\t\t\tresolved = parsed[key];\n\t\t}\n\t}\n\n\treturn String(resolved ?? '');\n}\n\n/**\n * Maps the current viewport width to the nearest supported breakpoint id.\n *\n * @param width Viewport width in pixels.\n * @returns Breakpoint identifier.\n */\nexport function resolveBreakpointFromWidth(width: number): HubSkeletonBreakpoint {\n\tif (width >= BREAKPOINT_WIDTHS.xl) {\n\t\treturn 'xl';\n\t}\n\tif (width >= BREAKPOINT_WIDTHS.lg) {\n\t\treturn 'lg';\n\t}\n\tif (width >= BREAKPOINT_WIDTHS.md) {\n\t\treturn 'md';\n\t}\n\tif (width >= BREAKPOINT_WIDTHS.sm) {\n\t\treturn 'sm';\n\t}\n\treturn 'base';\n}\n\n/**\n * Resolves an AST into render nodes, expanding preset aliases recursively.\n *\n * @param nodes AST nodes to resolve.\n * @param options Resolution context.\n * @returns Render nodes ready for the component template.\n */\nexport function resolveHubSkeletonNodes(\n\tnodes: readonly HubSkeletonAstNode[],\n\toptions: {\n\t\treadonly breakpoint: HubSkeletonBreakpoint;\n\t\treadonly params: HubSkeletonParams;\n\t\treadonly registry: { getPreset(name: string): HubSkeletonPreset | undefined };\n\t\treadonly fallbackVariant?: string;\n\t}\n): readonly HubSkeletonRenderNode[] {\n\tconst counter = { value: 0 };\n\n\tconst resolveNode = (\n\t\tnode: HubSkeletonAstNode,\n\t\tinheritedParams: HubSkeletonParams,\n\t\tinheritedVariant?: string\n\t): HubSkeletonRenderNode[] => {\n\t\tconst runtimeVariant = node.variant ?? inheritedVariant;\n\t\tconst runtimeParams = {\n\t\t\t...inheritedParams,\n\t\t\t...convertNodePropsToParams(node.props, options.breakpoint)\n\t\t};\n\n\t\tif (BUILTIN_NODE_TYPES.has(node.name)) {\n\t\t\tconst props = resolveProps(node.props, options.breakpoint);\n\t\t\tconst builtNode: HubSkeletonRenderNode = {\n\t\t\t\tid: `hub-skeleton-node-${counter.value++}`,\n\t\t\t\ttype: node.name as HubSkeletonRenderNode['type'],\n\t\t\t\tprops,\n\t\t\t\tchildren: resolveNodes(node.children, runtimeParams, runtimeVariant),\n\t\t\t\tisSurface: node.name === 'line' || node.name === 'block' || node.name === 'circle'\n\t\t\t};\n\n\t\t\treturn Array.from({ length: node.repeat }, () => builtNode).map((entry, index) => ({\n\t\t\t\t...entry,\n\t\t\t\tid: `${entry.id}-${index}`\n\t\t\t}));\n\t\t}\n\n\t\tconst preset = options.registry.getPreset(node.name);\n\t\tif (!preset) {\n\t\t\tthrow new Error(`Unknown skeleton node or preset alias \"${node.name}\".`);\n\t\t}\n\n\t\tconst activeVariant = runtimeVariant ?? options.fallbackVariant;\n\t\tconst variantDef = activeVariant ? preset.variants?.[activeVariant] : undefined;\n\t\tconst presetParams = {\n\t\t\t...preset.defaults,\n\t\t\t...variantDef?.defaults,\n\t\t\t...runtimeParams\n\t\t};\n\t\tconst presetTemplate = variantDef?.template ?? preset.template;\n\t\tconst presetDsl = interpolateHubSkeletonParams(\n\t\t\tresolveTemplateDsl(presetTemplate, options.breakpoint),\n\t\t\tpresetParams\n\t\t);\n\t\tconst presetAst = parseHubSkeletonDsl(presetDsl);\n\t\tconst resolvedPresetNodes = resolveNodes(presetAst, presetParams, activeVariant);\n\n\t\treturn Array.from({ length: node.repeat }, () => resolvedPresetNodes).flat();\n\t};\n\n\tconst resolveNodes = (\n\t\tinputNodes: readonly HubSkeletonAstNode[],\n\t\tparams: HubSkeletonParams,\n\t\tvariant?: string\n\t): HubSkeletonRenderNode[] => inputNodes.flatMap((node) => resolveNode(node, params, variant));\n\n\treturn resolveNodes(nodes, options.params, options.fallbackVariant);\n}\n\nfunction resolveProps(\n\tprops: Readonly<Record<string, string>>,\n\tbreakpoint: HubSkeletonBreakpoint\n): Record<string, string> {\n\treturn Object.fromEntries(\n\t\tObject.entries(props).map(([key, value]) => [key, resolveResponsiveToken(value, breakpoint)])\n\t);\n}\n\nfunction convertNodePropsToParams(\n\tprops: Readonly<Record<string, string>>,\n\tbreakpoint: HubSkeletonBreakpoint\n): HubSkeletonParams {\n\tconst entries = Object.entries(props).map(([key, value]) => {\n\t\tconst resolvedValue = resolveResponsiveToken(value, breakpoint);\n\t\treturn [key, parsePrimitiveToken(resolvedValue)];\n\t});\n\n\treturn Object.fromEntries(entries);\n}\n\nfunction parseResponsiveToken(value: string): HubSkeletonResponsiveValue {\n\tif (!value.includes('|')) {\n\t\treturn parsePrimitiveToken(value);\n\t}\n\n\tconst responsive: Partial<Record<HubSkeletonBreakpoint, HubSkeletonPrimitive>> = {};\n\tfor (const part of value.split('|')) {\n\t\tconst trimmedPart = part.trim();\n\t\tif (!trimmedPart) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (!trimmedPart.includes('=')) {\n\t\t\tresponsive.base = parsePrimitiveToken(trimmedPart);\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst [breakpoint, rawToken] = trimmedPart.split('=');\n\t\tconst normalizedBreakpoint = breakpoint.trim();\n\t\tif (isBreakpoint(normalizedBreakpoint)) {\n\t\t\tresponsive[normalizedBreakpoint] = parsePrimitiveToken(rawToken.trim());\n\t\t}\n\t}\n\n\treturn responsive;\n}\n\nfunction isBreakpoint(value: string): value is HubSkeletonBreakpoint {\n\treturn BREAKPOINT_ORDER.includes(value as HubSkeletonBreakpoint);\n}\n\nfunction parsePrimitiveToken(value: string): HubSkeletonPrimitive {\n\tconst trimmedValue = value.trim();\n\tif (trimmedValue === 'true') {\n\t\treturn true;\n\t}\n\tif (trimmedValue === 'false') {\n\t\treturn false;\n\t}\n\tif (/^-?\\d+(\\.\\d+)?$/.test(trimmedValue)) {\n\t\treturn Number(trimmedValue);\n\t}\n\treturn trimmedValue;\n}\n","import { DOCUMENT, NgTemplateOutlet, isPlatformBrowser } from '@angular/common';\nimport {\n\tChangeDetectionStrategy,\n\tComponent,\n\tOnDestroy,\n\tOnInit,\n\tPLATFORM_ID,\n\tcomputed,\n\tinject,\n\tinput,\n\tsignal\n} from '@angular/core';\nimport {\n\tHubSkeletonAppearance,\n\tHubSkeletonParams,\n\tHubSkeletonRenderNode,\n\tHubSkeletonTemplateInput\n} from './models/hub-skeleton.types';\nimport { HubSkeletonPresetRegistryService } from './services/hub-skeleton-preset-registry.service';\nimport {\n\tinterpolateHubSkeletonParams,\n\tparseHubSkeletonDsl,\n\tresolveBreakpointFromWidth,\n\tresolveHubSkeletonNodes,\n\tresolveTemplateDsl\n} from './utils/hub-skeleton-dsl';\n\n/**\n * Dynamic skeleton component that renders bundled presets or compact inline DSL templates.\n */\n@Component({\n\tselector: 'hub-skeleton',\n\tstandalone: true,\n\timports: [NgTemplateOutlet],\n\tproviders: [HubSkeletonPresetRegistryService],\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n\ttemplate: `\n\t\t<div\n\t\t\tclass=\"hub-skeleton\"\n\t\t\t[class.hub-skeleton--animated]=\"animated()\"\n\t\t\t[class.hub-skeleton--subtle]=\"appearance() === 'subtle'\"\n\t\t\t[class.hub-skeleton--contrast]=\"appearance() === 'contrast'\"\n\t\t\t[attr.aria-label]=\"ariaLabel()\"\n\t\t\trole=\"presentation\"\n\t\t>\n\t\t\t<ng-container *ngTemplateOutlet=\"renderNodes; context: { $implicit: resolvedNodes() }\"></ng-container>\n\t\t</div>\n\n\t\t<ng-template #renderNodes let-nodes>\n\t\t\t@for (node of nodes; track node.id) {\n\t\t\t\t<div\n\t\t\t\t\tclass=\"hub-skeleton__node\"\n\t\t\t\t\t[class.hub-skeleton__node--surface]=\"node.isSurface\"\n\t\t\t\t\t[class.hub-skeleton__node--line]=\"node.type === 'line'\"\n\t\t\t\t\t[class.hub-skeleton__node--block]=\"node.type === 'block'\"\n\t\t\t\t\t[class.hub-skeleton__node--circle]=\"node.type === 'circle'\"\n\t\t\t\t\t[class.hub-skeleton__node--stack]=\"node.type === 'stack'\"\n\t\t\t\t\t[class.hub-skeleton__node--grid]=\"node.type === 'grid'\"\n\t\t\t\t\t[class.hub-skeleton__node--row]=\"node.type === 'stack' && node.props['direction'] === 'row'\"\n\t\t\t\t\t[class.hub-skeleton__node--grow]=\"node.props['grow'] === 'true'\"\n\t\t\t\t\t[style]=\"buildStyles(node)\"\n\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t>\n\t\t\t\t\t@if (node.children.length > 0) {\n\t\t\t\t\t\t<ng-container *ngTemplateOutlet=\"renderNodes; context: { $implicit: node.children }\"></ng-container>\n\t\t\t\t\t}\n\t\t\t\t</div>\n\t\t\t}\n\t\t</ng-template>\n\t`,\n\tstyles: [\n\t\t`\n\t\t\t:host {\n\t\t\t\tdisplay: block;\n\t\t\t}\n\n\t\t\t.hub-skeleton {\n\t\t\t\t--hub-skeleton-bg: rgba(148, 163, 184, 0.18);\n\t\t\t\t--hub-skeleton-highlight: rgba(255, 255, 255, 0.52);\n\t\t\t\t--hub-skeleton-radius: 12px;\n\t\t\t\t--hub-skeleton-gap: 12px;\n\t\t\t\t--hub-skeleton-animation-duration: 1.35s;\n\t\t\t\tdisplay: block;\n\t\t\t\twidth: 100%;\n\t\t\t}\n\n\t\t\t.hub-skeleton--subtle {\n\t\t\t\t--hub-skeleton-bg: rgba(148, 163, 184, 0.12);\n\t\t\t\t--hub-skeleton-highlight: rgba(255, 255, 255, 0.38);\n\t\t\t}\n\n\t\t\t.hub-skeleton--contrast {\n\t\t\t\t--hub-skeleton-bg: rgba(71, 85, 105, 0.28);\n\t\t\t\t--hub-skeleton-highlight: rgba(255, 255, 255, 0.28);\n\t\t\t}\n\n\t\t\t.hub-skeleton__node {\n\t\t\t\tbox-sizing: border-box;\n\t\t\t\tmin-width: 0;\n\t\t\t}\n\n\t\t\t.hub-skeleton__node--surface {\n\t\t\t\tbackground: linear-gradient(\n\t\t\t\t\t90deg,\n\t\t\t\t\tvar(--hub-skeleton-bg) 0%,\n\t\t\t\t\tvar(--hub-skeleton-bg) 32%,\n\t\t\t\t\tvar(--hub-skeleton-highlight) 50%,\n\t\t\t\t\tvar(--hub-skeleton-bg) 68%,\n\t\t\t\t\tvar(--hub-skeleton-bg) 100%\n\t\t\t\t);\n\t\t\t\tbackground-size: 220% 100%;\n\t\t\t\tborder-radius: var(--hub-skeleton-node-radius, var(--hub-skeleton-radius));\n\t\t\t}\n\n\t\t\t.hub-skeleton--animated .hub-skeleton__node--surface {\n\t\t\t\tanimation: hub-skeleton-shimmer var(--hub-skeleton-animation-duration) ease-in-out infinite;\n\t\t\t}\n\n\t\t\t.hub-skeleton__node--line,\n\t\t\t.hub-skeleton__node--block,\n\t\t\t.hub-skeleton__node--circle {\n\t\t\t\twidth: var(--hub-skeleton-node-width, 100%);\n\t\t\t\theight: var(--hub-skeleton-node-height, 12px);\n\t\t\t}\n\n\t\t\t.hub-skeleton__node--circle {\n\t\t\t\twidth: var(--hub-skeleton-node-size, var(--hub-skeleton-node-width, 40px));\n\t\t\t\theight: var(--hub-skeleton-node-size, var(--hub-skeleton-node-height, 40px));\n\t\t\t\tborder-radius: 999px;\n\t\t\t}\n\n\t\t\t.hub-skeleton__node--stack {\n\t\t\t\tdisplay: flex;\n\t\t\t\tflex-direction: column;\n\t\t\t\tgap: var(--hub-skeleton-node-gap, var(--hub-skeleton-gap));\n\t\t\t\talign-items: var(--hub-skeleton-node-align, stretch);\n\t\t\t\tjustify-content: var(--hub-skeleton-node-justify, flex-start);\n\t\t\t}\n\n\t\t\t.hub-skeleton__node--row {\n\t\t\t\tflex-direction: row;\n\t\t\t}\n\n\t\t\t.hub-skeleton__node--grid {\n\t\t\t\tdisplay: grid;\n\t\t\t\tgrid-template-columns: repeat(var(--hub-skeleton-node-columns, 2), minmax(0, 1fr));\n\t\t\t\tgap: var(--hub-skeleton-node-gap, var(--hub-skeleton-gap));\n\t\t\t\talign-items: var(--hub-skeleton-node-align, stretch);\n\t\t\t}\n\n\t\t\t.hub-skeleton__node--grow {\n\t\t\t\tflex: 1 1 auto;\n\t\t\t}\n\n\t\t\t@keyframes hub-skeleton-shimmer {\n\t\t\t\tfrom {\n\t\t\t\t\tbackground-position: 100% 0;\n\t\t\t\t}\n\t\t\t\tto {\n\t\t\t\t\tbackground-position: -100% 0;\n\t\t\t\t}\n\t\t\t}\n\t\t`\n\t]\n})\nexport class HubSkeletonComponent implements OnInit, OnDestroy {\n\t/** Built-in or registered preset name. */\n\treadonly preset = input<string | null>(null);\n\n\t/** Inline compact DSL template or template definition object. */\n\treadonly template = input<HubSkeletonTemplateInput | null>(null);\n\n\t/** Serializable params interpolated before parsing. */\n\treadonly params = input<HubSkeletonParams>({});\n\n\t/** Optional named variant. */\n\treadonly variant = input<string | null>(null);\n\n\t/** Toggles shimmer animation. */\n\treadonly animated = input(true);\n\n\t/** Visual appearance preset. */\n\treadonly appearance = input<HubSkeletonAppearance>('default');\n\n\t/** Optional accessible label applied to the container. */\n\treadonly ariaLabel = input('Loading placeholder');\n\n\tprivate readonly document = inject(DOCUMENT);\n\tprivate readonly platformId = inject(PLATFORM_ID);\n\tprivate readonly registry = inject(HubSkeletonPresetRegistryService);\n\n\tprivate resizeCleanup: (() => void) | null = null;\n\tprivate readonly viewportWidth = signal(1200);\n\treadonly activeBreakpoint = computed(() => resolveBreakpointFromWidth(this.viewportWidth()));\n\n\t/** Resolved render nodes after preset expansion and breakpoint evaluation. */\n\treadonly resolvedNodes = computed<readonly HubSkeletonRenderNode[]>(() => {\n\t\tconst { template, params, variant } = this.resolveRuntimeTemplate();\n\t\tconst dsl = interpolateHubSkeletonParams(\n\t\t\tresolveTemplateDsl(template, this.activeBreakpoint()),\n\t\t\tparams\n\t\t);\n\t\tconst ast = parseHubSkeletonDsl(dsl);\n\n\t\treturn resolveHubSkeletonNodes(ast, {\n\t\t\tbreakpoint: this.activeBreakpoint(),\n\t\t\tparams,\n\t\t\tregistry: this.registry,\n\t\t\tfallbackVariant: variant ?? undefined\n\t\t});\n\t});\n\n\tngOnInit(): void {\n\t\tif (!isPlatformBrowser(this.platformId) || !this.document.defaultView) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst win = this.document.defaultView;\n\t\tthis.viewportWidth.set(win.innerWidth);\n\n\t\tconst listener = () => this.viewportWidth.set(win.innerWidth);\n\t\twin.addEventListener('resize', listener, { passive: true });\n\t\tthis.resizeCleanup = () => win.removeEventListener('resize', listener);\n\t}\n\n\tngOnDestroy(): void {\n\t\tthis.resizeCleanup?.();\n\t}\n\n\t/**\n\t * Converts node props into CSS custom properties consumed by the template.\n\t *\n\t * @param node Render node.\n\t * @returns Style object.\n\t */\n\tbuildStyles(node: HubSkeletonRenderNode): Record<string, string | null> {\n\t\tconst props = node.props;\n\t\treturn {\n\t\t\t'--hub-skeleton-node-width': props['width'] ?? null,\n\t\t\t'--hub-skeleton-node-height': this.toCssSize(props['height']),\n\t\t\t'--hub-skeleton-node-size': this.toCssSize(props['size']),\n\t\t\t'--hub-skeleton-node-radius': this.toCssSize(props['radius']),\n\t\t\t'--hub-skeleton-node-gap': this.toCssSize(props['gap']),\n\t\t\t'--hub-skeleton-node-columns': props['columns'] ?? null,\n\t\t\t'--hub-skeleton-node-align': props['align'] ?? null,\n\t\t\t'--hub-skeleton-node-justify': props['justify'] ?? null\n\t\t};\n\t}\n\n\tprivate resolveRuntimeTemplate(): {\n\t\treadonly template: HubSkeletonTemplateInput;\n\t\treadonly params: HubSkeletonParams;\n\t\treadonly variant: string | null;\n\t} {\n\t\tconst presetName = this.preset();\n\t\tconst variantName = this.variant();\n\t\tconst inlineTemplate = this.template();\n\n\t\tif (presetName) {\n\t\t\tconst preset = this.registry.getPreset(presetName);\n\t\t\tif (!preset) {\n\t\t\t\tthrow new Error(`Unknown skeleton preset \"${presetName}\".`);\n\t\t\t}\n\n\t\t\tconst activeVariant = variantName ? preset.variants?.[variantName] : undefined;\n\t\t\treturn {\n\t\t\t\ttemplate: activeVariant?.template ?? preset.template,\n\t\t\t\tparams: {\n\t\t\t\t\t...preset.defaults,\n\t\t\t\t\t...activeVariant?.defaults,\n\t\t\t\t\t...this.params()\n\t\t\t\t},\n\t\t\t\tvariant: variantName\n\t\t\t};\n\t\t}\n\n\t\tif (!inlineTemplate) {\n\t\t\tthrow new Error('hub-skeleton requires either `preset` or `template`.');\n\t\t}\n\n\t\treturn {\n\t\t\ttemplate: inlineTemplate,\n\t\t\tparams: this.params(),\n\t\t\tvariant: variantName\n\t\t};\n\t}\n\n\tprivate toCssSize(value: string | undefined): string | null {\n\t\tif (!value) {\n\t\t\treturn null;\n\t\t}\n\n\t\tif (/^-?\\d+(\\.\\d+)?$/.test(value)) {\n\t\t\treturn `${value}px`;\n\t\t}\n\n\t\treturn value;\n\t}\n}\n","import { NgModule } from '@angular/core';\nimport { HubSkeletonComponent } from './hub-skeleton.component';\n\n/**\n * NgModule wrapper kept for compatibility with module-based Angular apps.\n */\n@NgModule({\n\timports: [HubSkeletonComponent],\n\texports: [HubSkeletonComponent]\n})\nexport class HubSkeletonModule {}\n","/*\n * Public API Surface of skeleton\n */\n\nexport * from './lib/hub-skeleton.component';\nexport * from './lib/hub-skeleton.module';\nexport * from './lib/models/hub-skeleton.types';\nexport * from './lib/presets/hub-skeleton-default-presets';\nexport * from './lib/services/hub-skeleton-preset-registry.service';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;AAEA;;AAEG;AACI,MAAM,4BAA4B,GAAiC;AACzE,IAAA;AACC,QAAA,IAAI,EAAE,MAAM;AACZ,QAAA,WAAW,EAAE,wDAAwD;AACrE,QAAA,QAAQ,EACP,4OAA4O;AAC7O,QAAA,QAAQ,EAAE;AACT,YAAA,WAAW,EAAE,GAAG;AAChB,YAAA,MAAM,EAAE,EAAE;AACV,YAAA,WAAW,EAAE,EAAE;AACf,YAAA,UAAU,EAAE,KAAK;AACjB,YAAA,OAAO,EAAE,EAAE;AACX,YAAA,UAAU,EAAE,EAAE;AACd,YAAA,IAAI,EAAE,CAAC;AACP,YAAA,aAAa,EAAE;AACf,SAAA;AACD,QAAA,QAAQ,EAAE;AACT,YAAA,OAAO,EAAE;AACR,gBAAA,QAAQ,EAAE;AACT,oBAAA,WAAW,EAAE,GAAG;AAChB,oBAAA,MAAM,EAAE,EAAE;AACV,oBAAA,WAAW,EAAE,EAAE;AACf,oBAAA,OAAO,EAAE,CAAC;AACV,oBAAA,UAAU,EAAE,EAAE;AACd,oBAAA,IAAI,EAAE,CAAC;AACP,oBAAA,aAAa,EAAE;AACf;AACD;AACD;AACD,KAAA;AACD,IAAA;AACC,QAAA,IAAI,EAAE,WAAW;AACjB,QAAA,WAAW,EAAE,2CAA2C;AACxD,QAAA,QAAQ,EACP,kMAAkM;AACnM,QAAA,QAAQ,EAAE;AACT,YAAA,UAAU,EAAE,EAAE;AACd,YAAA,GAAG,EAAE,CAAC;AACN,YAAA,WAAW,EAAE,EAAE;AACf,YAAA,UAAU,EAAE,KAAK;AACjB,YAAA,UAAU,EAAE,EAAE;AACd,YAAA,SAAS,EAAE;AACX,SAAA;AACD,QAAA,QAAQ,EAAE;AACT,YAAA,OAAO,EAAE;AACR,gBAAA,QAAQ,EAAE;AACT,oBAAA,UAAU,EAAE,EAAE;AACd,oBAAA,GAAG,EAAE,CAAC;AACN,oBAAA,WAAW,EAAE,EAAE;AACf,oBAAA,UAAU,EAAE;AACZ;AACD;AACD;AACD,KAAA;AACD,IAAA;AACC,QAAA,IAAI,EAAE,WAAW;AACjB,QAAA,WAAW,EAAE,sDAAsD;AACnE,QAAA,QAAQ,EAAE,oGAAoG;AAC9G,QAAA,QAAQ,EAAE;AACT,YAAA,OAAO,EAAE,CAAC;AACV,YAAA,UAAU,EAAE,EAAE;AACd,YAAA,SAAS,EAAE;AACX;AACD,KAAA;AACD,IAAA;AACC,QAAA,IAAI,EAAE,aAAa;AACnB,QAAA,WAAW,EAAE,6DAA6D;AAC1E,QAAA,QAAQ,EACP;AACD,KAAA;AACD,IAAA;AACC,QAAA,IAAI,EAAE,cAAc;AACpB,QAAA,WAAW,EAAE,0DAA0D;AACvE,QAAA,QAAQ,EACP,kJAAkJ;AACnJ,QAAA,QAAQ,EAAE;AACT,YAAA,MAAM,EAAE;AACR;AACD,KAAA;AACD,IAAA;AACC,QAAA,IAAI,EAAE,kBAAkB;AACxB,QAAA,WAAW,EAAE,mDAAmD;AAChE,QAAA,QAAQ,EACP;AACD,KAAA;AACD,IAAA;AACC,QAAA,IAAI,EAAE,WAAW;AACjB,QAAA,WAAW,EAAE,wDAAwD;AACrE,QAAA,QAAQ,EACP;AACD,KAAA;AACD,IAAA;AACC,QAAA,IAAI,EAAE,aAAa;AACnB,QAAA,WAAW,EAAE,+BAA+B;AAC5C,QAAA,QAAQ,EACP;AACD,KAAA;AACD,IAAA;AACC,QAAA,IAAI,EAAE,iBAAiB;AACvB,QAAA,WAAW,EAAE,yDAAyD;AACtE,QAAA,QAAQ,EACP;AACD,KAAA;AACD,IAAA;AACC,QAAA,IAAI,EAAE,eAAe;AACrB,QAAA,WAAW,EAAE,4CAA4C;AACzD,QAAA,QAAQ,EACP;AACD,KAAA;AACD,IAAA;AACC,QAAA,IAAI,EAAE,aAAa;AACnB,QAAA,WAAW,EAAE,2DAA2D;AACxE,QAAA,QAAQ,EACP;AACD,KAAA;AACD,IAAA;AACC,QAAA,IAAI,EAAE,WAAW;AACjB,QAAA,WAAW,EAAE,qDAAqD;AAClE,QAAA,QAAQ,EACP;AACD,KAAA;AACD,IAAA;AACC,QAAA,IAAI,EAAE,eAAe;AACrB,QAAA,WAAW,EAAE,sDAAsD;AACnE,QAAA,QAAQ,EACP;AACD,KAAA;AACD,IAAA;AACC,QAAA,IAAI,EAAE,eAAe;AACrB,QAAA,WAAW,EAAE,0CAA0C;AACvD,QAAA,QAAQ,EACP;AACD,KAAA;AACD,IAAA;AACC,QAAA,IAAI,EAAE,YAAY;AAClB,QAAA,WAAW,EAAE,8CAA8C;AAC3D,QAAA,QAAQ,EACP,oEAAoE;AACrE,QAAA,QAAQ,EAAE;AACT,YAAA,OAAO,EAAE;AACT;AACD,KAAA;AACD,IAAA;AACC,QAAA,IAAI,EAAE,sBAAsB;AAC5B,QAAA,WAAW,EAAE,8DAA8D;AAC3E,QAAA,QAAQ,EACP;AACD;;;ACpJF;MACa,oBAAoB,GAAG,IAAI,cAAc,CACrD,sBAAsB,EACtB;AACA,IAAA,OAAO,EAAE,MAAM;AACd,CAAA;AAGF;;;;;AAKG;AACG,SAAU,yBAAyB,CAAC,OAAqC,EAAA;AAC9E,IAAA,OAAO,wBAAwB,CAAC;AAC/B,QAAA;AACC,YAAA,OAAO,EAAE,oBAAoB;AAC7B,YAAA,KAAK,EAAE,IAAI;AACX,YAAA,QAAQ,EAAE;AACV;AACD,KAAA,CAAC;AACH;AAEA;;AAEG;MAEU,gCAAgC,CAAA;AAC3B,IAAA,kBAAkB,GAAG,MAAM,CAAC,oBAAoB,CAAC;;AAGzD,IAAA,OAAO,GAAG,QAAQ,CAAC,MAAK;AAChC,QAAA,MAAM,MAAM,GAAG,IAAI,GAAG,EAA6B;AAEnD,QAAA,KAAK,MAAM,MAAM,IAAI,4BAA4B,EAAE;YAClD,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC;QAChC;AAEA,QAAA,KAAK,MAAM,WAAW,IAAI,IAAI,CAAC,kBAAkB,EAAE;AAClD,YAAA,KAAK,MAAM,MAAM,IAAI,WAAW,EAAE;gBACjC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC;YAChC;QACD;AAEA,QAAA,OAAO,MAAM;IACd,CAAC;gFAAC;AAEF;;;;;AAKG;AACH,IAAA,SAAS,CAAC,IAAY,EAAA;QACrB,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC;IAChC;uGA5BY,gCAAgC,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAhC,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,gCAAgC,cADnB,MAAM,EAAA,CAAA;;2FACnB,gCAAgC,EAAA,UAAA,EAAA,CAAA;kBAD5C,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;ACnBlC,MAAM,kBAAkB,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;AAChF,MAAM,gBAAgB,GAAqC,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC;AAC3F,MAAM,iBAAiB,GAA2D;AACjF,IAAA,EAAE,EAAE,GAAG;AACP,IAAA,EAAE,EAAE,GAAG;AACP,IAAA,EAAE,EAAE,GAAG;AACP,IAAA,EAAE,EAAE;CACJ;AAED;;AAEG;AACH,MAAM,oBAAoB,CAAA;AAGI,IAAA,MAAA;IAFrB,KAAK,GAAG,CAAC;AAEjB,IAAA,WAAA,CAA6B,MAAc,EAAA;QAAd,IAAA,CAAA,MAAM,GAAN,MAAM;IAAW;AAE9C;;;;AAIG;IACH,KAAK,GAAA;AACJ,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,EAAE;QAClC,IAAI,CAAC,cAAc,EAAE;QAErB,IAAI,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE;AACpC,YAAA,MAAM,IAAI,KAAK,CAAC,qBAAqB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA,cAAA,EAAiB,IAAI,CAAC,KAAK,CAAA,CAAA,CAAG,CAAC;QAC5F;AAEA,QAAA,OAAO,KAAK;IACb;IAEQ,aAAa,GAAA;QACpB,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;QAEhC,OAAO,IAAI,EAAE;YACZ,IAAI,CAAC,cAAc,EAAE;AACrB,YAAA,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,GAAG,EAAE;gBACxB;YACD;AAEA,YAAA,IAAI,CAAC,KAAK,IAAI,CAAC;YACf,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;QAC7B;AAEA,QAAA,OAAO,KAAK;IACb;IAEQ,SAAS,GAAA;QAChB,IAAI,CAAC,cAAc,EAAE;AACrB,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,EAAE;AAClC,QAAA,IAAI,OAA2B;AAE/B,QAAA,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,GAAG,EAAE;AACxB,YAAA,IAAI,CAAC,KAAK,IAAI,CAAC;AACf,YAAA,OAAO,GAAG,IAAI,CAAC,cAAc,EAAE;QAChC;AAEA,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,KAAK,GAAG,GAAG,IAAI,CAAC,SAAS,EAAE,GAAG,EAAE;QACzD,IAAI,QAAQ,GAAkC,EAAE;QAEhD,IAAI,CAAC,cAAc,EAAE;AACrB,QAAA,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,GAAG,EAAE;AACxB,YAAA,IAAI,CAAC,KAAK,IAAI,CAAC;AACf,YAAA,QAAQ,GAAG,IAAI,CAAC,aAAa,EAAE;QAChC;QAEA,IAAI,CAAC,cAAc,EAAE;QACrB,IAAI,MAAM,GAAG,CAAC;AACd,QAAA,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,GAAG,EAAE;AACxB,YAAA,IAAI,CAAC,KAAK,IAAI,CAAC;AACf,YAAA,MAAM,SAAS,GAAG,IAAI,CAAC,kBAAkB,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE;YACjE,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,SAAS,EAAE,EAAE,CAAC;AACvC,YAAA,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC,EAAE;gBAC3C,MAAM,IAAI,KAAK,CAAC,CAAA,sBAAA,EAAyB,SAAS,CAAA,gBAAA,EAAmB,IAAI,CAAC,KAAK,CAAA,CAAA,CAAG,CAAC;YACpF;QACD;QAEA,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE;IAClD;IAEQ,SAAS,GAAA;QAChB,MAAM,KAAK,GAA2B,EAAE;AACxC,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC;QAChB,IAAI,KAAK,GAAG,EAAE;QACd,IAAI,KAAK,GAAG,CAAC;AAEb,QAAA,OAAO,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,KAAK,GAAG,CAAC,EAAE;YACpD,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;AACtC,YAAA,IAAI,IAAI,KAAK,GAAG,EAAE;gBACjB,KAAK,IAAI,CAAC;gBACV,KAAK,IAAI,IAAI;gBACb;YACD;AACA,YAAA,IAAI,IAAI,KAAK,GAAG,EAAE;gBACjB,KAAK,IAAI,CAAC;AACV,gBAAA,IAAI,KAAK,KAAK,CAAC,EAAE;oBAChB;gBACD;gBACA,KAAK,IAAI,IAAI;gBACb;YACD;YACA,KAAK,IAAI,IAAI;QACd;AAEA,QAAA,IAAI,KAAK,KAAK,CAAC,EAAE;AAChB,YAAA,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC;QAC5D;AAEA,QAAA,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE;AACnD,YAAA,MAAM,YAAY,GAAG,KAAK,CAAC,IAAI,EAAE;YACjC,IAAI,CAAC,YAAY,EAAE;gBAClB;YACD;AAEA,YAAA,MAAM,CAAC,MAAM,EAAE,GAAG,aAAa,CAAC,GAAG,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC;YAC1D,IAAI,CAAC,MAAM,EAAE;gBACZ;YACD;AAEA,YAAA,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,GAAG,aAAa,CAAC,MAAM,GAAG,CAAC,GAAG,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,GAAG,MAAM;QAC1F;AAEA,QAAA,OAAO,KAAK;IACb;IAEQ,aAAa,CAAC,KAAa,EAAE,SAAiB,EAAA;QACrD,MAAM,KAAK,GAAa,EAAE;QAC1B,IAAI,OAAO,GAAG,EAAE;QAChB,IAAI,KAAK,GAAG,CAAC;AAEb,QAAA,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;AACzB,YAAA,IAAI,IAAI,KAAK,GAAG,EAAE;gBACjB,KAAK,IAAI,CAAC;YACX;AAAO,iBAAA,IAAI,IAAI,KAAK,GAAG,EAAE;gBACxB,KAAK,IAAI,CAAC;YACX;YAEA,IAAI,IAAI,KAAK,SAAS,IAAI,KAAK,KAAK,CAAC,EAAE;AACtC,gBAAA,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC;gBACnB,OAAO,GAAG,EAAE;gBACZ;YACD;YAEA,OAAO,IAAI,IAAI;QAChB;QAEA,IAAI,OAAO,EAAE;AACZ,YAAA,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC;QACpB;AAEA,QAAA,OAAO,KAAK;IACb;IAEQ,cAAc,GAAA;QACrB,IAAI,CAAC,cAAc,EAAE;AACrB,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK;QACxB,OAAO,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE;AACvF,YAAA,IAAI,CAAC,KAAK,IAAI,CAAC;QAChB;AAEA,QAAA,IAAI,KAAK,KAAK,IAAI,CAAC,KAAK,EAAE;YACzB,MAAM,IAAI,KAAK,CAAC,CAAA,kCAAA,EAAqC,IAAI,CAAC,KAAK,CAAA,CAAA,CAAG,CAAC;QACpE;AAEA,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC;IAC5C;AAEQ,IAAA,kBAAkB,CAAC,UAA6B,EAAA;AACvD,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK;QACxB,OAAO,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE;AACxF,YAAA,IAAI,CAAC,KAAK,IAAI,CAAC;QAChB;AACA,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC;IAC5C;AAEQ,IAAA,MAAM,CAAC,IAAY,EAAA;QAC1B,IAAI,CAAC,cAAc,EAAE;AACrB,QAAA,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,IAAI,EAAE;YACzB,MAAM,IAAI,KAAK,CAAC,CAAA,UAAA,EAAa,IAAI,CAAA,gBAAA,EAAmB,IAAI,CAAC,KAAK,CAAA,CAAA,CAAG,CAAC;QACnE;AACA,QAAA,IAAI,CAAC,KAAK,IAAI,CAAC;IAChB;IAEQ,cAAc,GAAA;QACrB,OAAO,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE;AAC7E,YAAA,IAAI,CAAC,KAAK,IAAI,CAAC;QAChB;IACD;IAEQ,IAAI,GAAA;QACX,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;IAC/B;AACA;AAED;;;;;AAKG;AACG,SAAU,mBAAmB,CAAC,GAAW,EAAA;IAC9C,OAAO,IAAI,oBAAoB,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE;AAC7C;AAEA;;;;;;AAMG;AACG,SAAU,4BAA4B,CAAC,MAAc,EAAE,MAAyB,EAAA;IACrF,OAAO,MAAM,CAAC,OAAO,CAAC,iCAAiC,EAAE,CAAC,CAAC,EAAE,GAAW,KAAK,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;AACxG;AAEA;;;;;;AAMG;AACG,SAAU,kBAAkB,CACjC,QAAkC,EAClC,UAAiC,EAAA;AAEjC,IAAA,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE;AACjC,QAAA,OAAO,QAAQ;IAChB;AAEA,IAAA,IAAI,UAAU,KAAK,MAAM,IAAI,QAAQ,CAAC,UAAU,GAAG,UAAU,CAAC,EAAE;AAC/D,QAAA,OAAO,QAAQ,CAAC,UAAU,CAAC,UAAU,CAAE;IACxC;IAEA,OAAO,QAAQ,CAAC,GAAG;AACpB;AAEA;;;;;;AAMG;AACG,SAAU,sBAAsB,CAAC,KAAa,EAAE,UAAiC,EAAA;AACtF,IAAA,MAAM,MAAM,GAAG,oBAAoB,CAAC,KAAK,CAAC;IAC1C,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,EAAE;AAClD,QAAA,OAAO,MAAM,CAAC,MAAM,CAAC;IACtB;AAEA,IAAA,IAAI,QAAQ,GAAqC,MAAM,CAAC,IAAI;AAC5D,IAAA,KAAK,MAAM,GAAG,IAAI,gBAAgB,EAAE;AACnC,QAAA,IAAI,GAAG,KAAK,MAAM,EAAE;YACnB;QACD;QAEA,IAAI,gBAAgB,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,gBAAgB,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,KAAK,SAAS,EAAE;AACvG,YAAA,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC;QACvB;IACD;AAEA,IAAA,OAAO,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC;AAC9B;AAEA;;;;;AAKG;AACG,SAAU,0BAA0B,CAAC,KAAa,EAAA;AACvD,IAAA,IAAI,KAAK,IAAI,iBAAiB,CAAC,EAAE,EAAE;AAClC,QAAA,OAAO,IAAI;IACZ;AACA,IAAA,IAAI,KAAK,IAAI,iBAAiB,CAAC,EAAE,EAAE;AAClC,QAAA,OAAO,IAAI;IACZ;AACA,IAAA,IAAI,KAAK,IAAI,iBAAiB,CAAC,EAAE,EAAE;AAClC,QAAA,OAAO,IAAI;IACZ;AACA,IAAA,IAAI,KAAK,IAAI,iBAAiB,CAAC,EAAE,EAAE;AAClC,QAAA,OAAO,IAAI;IACZ;AACA,IAAA,OAAO,MAAM;AACd;AAEA;;;;;;AAMG;AACG,SAAU,uBAAuB,CACtC,KAAoC,EACpC,OAKC,EAAA;AAED,IAAA,MAAM,OAAO,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE;IAE5B,MAAM,WAAW,GAAG,CACnB,IAAwB,EACxB,eAAkC,EAClC,gBAAyB,KACG;AAC5B,QAAA,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,IAAI,gBAAgB;AACvD,QAAA,MAAM,aAAa,GAAG;AACrB,YAAA,GAAG,eAAe;YAClB,GAAG,wBAAwB,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,UAAU;SAC1D;QAED,IAAI,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;AACtC,YAAA,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,UAAU,CAAC;AAC1D,YAAA,MAAM,SAAS,GAA0B;AACxC,gBAAA,EAAE,EAAE,CAAA,kBAAA,EAAqB,OAAO,CAAC,KAAK,EAAE,CAAA,CAAE;gBAC1C,IAAI,EAAE,IAAI,CAAC,IAAqC;gBAChD,KAAK;gBACL,QAAQ,EAAE,YAAY,CAAC,IAAI,CAAC,QAAQ,EAAE,aAAa,EAAE,cAAc,CAAC;AACpE,gBAAA,SAAS,EAAE,IAAI,CAAC,IAAI,KAAK,MAAM,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,IAAI,IAAI,CAAC,IAAI,KAAK;aAC1E;YAED,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,MAAM,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,MAAM;AAClF,gBAAA,GAAG,KAAK;AACR,gBAAA,EAAE,EAAE,CAAA,EAAG,KAAK,CAAC,EAAE,CAAA,CAAA,EAAI,KAAK,CAAA;AACxB,aAAA,CAAC,CAAC;QACJ;AAEA,QAAA,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC;QACpD,IAAI,CAAC,MAAM,EAAE;YACZ,MAAM,IAAI,KAAK,CAAC,CAAA,uCAAA,EAA0C,IAAI,CAAC,IAAI,CAAA,EAAA,CAAI,CAAC;QACzE;AAEA,QAAA,MAAM,aAAa,GAAG,cAAc,IAAI,OAAO,CAAC,eAAe;AAC/D,QAAA,MAAM,UAAU,GAAG,aAAa,GAAG,MAAM,CAAC,QAAQ,GAAG,aAAa,CAAC,GAAG,SAAS;AAC/E,QAAA,MAAM,YAAY,GAAG;YACpB,GAAG,MAAM,CAAC,QAAQ;YAClB,GAAG,UAAU,EAAE,QAAQ;AACvB,YAAA,GAAG;SACH;QACD,MAAM,cAAc,GAAG,UAAU,EAAE,QAAQ,IAAI,MAAM,CAAC,QAAQ;AAC9D,QAAA,MAAM,SAAS,GAAG,4BAA4B,CAC7C,kBAAkB,CAAC,cAAc,EAAE,OAAO,CAAC,UAAU,CAAC,EACtD,YAAY,CACZ;AACD,QAAA,MAAM,SAAS,GAAG,mBAAmB,CAAC,SAAS,CAAC;QAChD,MAAM,mBAAmB,GAAG,YAAY,CAAC,SAAS,EAAE,YAAY,EAAE,aAAa,CAAC;QAEhF,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,MAAM,mBAAmB,CAAC,CAAC,IAAI,EAAE;AAC7E,IAAA,CAAC;AAED,IAAA,MAAM,YAAY,GAAG,CACpB,UAAyC,EACzC,MAAyB,EACzB,OAAgB,KACa,UAAU,CAAC,OAAO,CAAC,CAAC,IAAI,KAAK,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;AAE9F,IAAA,OAAO,YAAY,CAAC,KAAK,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,eAAe,CAAC;AACpE;AAEA,SAAS,YAAY,CACpB,KAAuC,EACvC,UAAiC,EAAA;AAEjC,IAAA,OAAO,MAAM,CAAC,WAAW,CACxB,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,sBAAsB,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,CAC7F;AACF;AAEA,SAAS,wBAAwB,CAChC,KAAuC,EACvC,UAAiC,EAAA;AAEjC,IAAA,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,KAAI;QAC1D,MAAM,aAAa,GAAG,sBAAsB,CAAC,KAAK,EAAE,UAAU,CAAC;QAC/D,OAAO,CAAC,GAAG,EAAE,mBAAmB,CAAC,aAAa,CAAC,CAAC;AACjD,IAAA,CAAC,CAAC;AAEF,IAAA,OAAO,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC;AACnC;AAEA,SAAS,oBAAoB,CAAC,KAAa,EAAA;IAC1C,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;AACzB,QAAA,OAAO,mBAAmB,CAAC,KAAK,CAAC;IAClC;IAEA,MAAM,UAAU,GAAiE,EAAE;IACnF,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE;AACpC,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,EAAE;QAC/B,IAAI,CAAC,WAAW,EAAE;YACjB;QACD;QAEA,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;AAC/B,YAAA,UAAU,CAAC,IAAI,GAAG,mBAAmB,CAAC,WAAW,CAAC;YAClD;QACD;AAEA,QAAA,MAAM,CAAC,UAAU,EAAE,QAAQ,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC;AACrD,QAAA,MAAM,oBAAoB,GAAG,UAAU,CAAC,IAAI,EAAE;AAC9C,QAAA,IAAI,YAAY,CAAC,oBAAoB,CAAC,EAAE;YACvC,UAAU,CAAC,oBAAoB,CAAC,GAAG,mBAAmB,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;QACxE;IACD;AAEA,IAAA,OAAO,UAAU;AAClB;AAEA,SAAS,YAAY,CAAC,KAAa,EAAA;AAClC,IAAA,OAAO,gBAAgB,CAAC,QAAQ,CAAC,KAA8B,CAAC;AACjE;AAEA,SAAS,mBAAmB,CAAC,KAAa,EAAA;AACzC,IAAA,MAAM,YAAY,GAAG,KAAK,CAAC,IAAI,EAAE;AACjC,IAAA,IAAI,YAAY,KAAK,MAAM,EAAE;AAC5B,QAAA,OAAO,IAAI;IACZ;AACA,IAAA,IAAI,YAAY,KAAK,OAAO,EAAE;AAC7B,QAAA,OAAO,KAAK;IACb;AACA,IAAA,IAAI,iBAAiB,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE;AACzC,QAAA,OAAO,MAAM,CAAC,YAAY,CAAC;IAC5B;AACA,IAAA,OAAO,YAAY;AACpB;;AC9ZA;;AAEG;MAwIU,oBAAoB,CAAA;;IAEvB,MAAM,GAAG,KAAK,CAAgB,IAAI;+EAAC;;IAGnC,QAAQ,GAAG,KAAK,CAAkC,IAAI;iFAAC;;IAGvD,MAAM,GAAG,KAAK,CAAoB,EAAE;+EAAC;;IAGrC,OAAO,GAAG,KAAK,CAAgB,IAAI;gFAAC;;IAGpC,QAAQ,GAAG,KAAK,CAAC,IAAI;iFAAC;;IAGtB,UAAU,GAAG,KAAK,CAAwB,SAAS;mFAAC;;IAGpD,SAAS,GAAG,KAAK,CAAC,qBAAqB;kFAAC;AAEhC,IAAA,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;AAC3B,IAAA,UAAU,GAAG,MAAM,CAAC,WAAW,CAAC;AAChC,IAAA,QAAQ,GAAG,MAAM,CAAC,gCAAgC,CAAC;IAE5D,aAAa,GAAwB,IAAI;IAChC,aAAa,GAAG,MAAM,CAAC,IAAI;sFAAC;AACpC,IAAA,gBAAgB,GAAG,QAAQ,CAAC,MAAM,0BAA0B,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;yFAAC;;AAGnF,IAAA,aAAa,GAAG,QAAQ,CAAmC,MAAK;AACxE,QAAA,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,sBAAsB,EAAE;AACnE,QAAA,MAAM,GAAG,GAAG,4BAA4B,CACvC,kBAAkB,CAAC,QAAQ,EAAE,IAAI,CAAC,gBAAgB,EAAE,CAAC,EACrD,MAAM,CACN;AACD,QAAA,MAAM,GAAG,GAAG,mBAAmB,CAAC,GAAG,CAAC;QAEpC,OAAO,uBAAuB,CAAC,GAAG,EAAE;AACnC,YAAA,UAAU,EAAE,IAAI,CAAC,gBAAgB,EAAE;YACnC,MAAM;YACN,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,eAAe,EAAE,OAAO,IAAI;AAC5B,SAAA,CAAC;IACH,CAAC;sFAAC;IAEF,QAAQ,GAAA;AACP,QAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE;YACtE;QACD;AAEA,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW;QACrC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC;AAEtC,QAAA,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC;AAC7D,QAAA,GAAG,CAAC,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AAC3D,QAAA,IAAI,CAAC,aAAa,GAAG,MAAM,GAAG,CAAC,mBAAmB,CAAC,QAAQ,EAAE,QAAQ,CAAC;IACvE;IAEA,WAAW,GAAA;AACV,QAAA,IAAI,CAAC,aAAa,IAAI;IACvB;AAEA;;;;;AAKG;AACH,IAAA,WAAW,CAAC,IAA2B,EAAA;AACtC,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK;QACxB,OAAO;AACN,YAAA,2BAA2B,EAAE,KAAK,CAAC,OAAO,CAAC,IAAI,IAAI;YACnD,4BAA4B,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YAC7D,0BAA0B,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YACzD,4BAA4B,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YAC7D,yBAAyB,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;AACvD,YAAA,6BAA6B,EAAE,KAAK,CAAC,SAAS,CAAC,IAAI,IAAI;AACvD,YAAA,2BAA2B,EAAE,KAAK,CAAC,OAAO,CAAC,IAAI,IAAI;AACnD,YAAA,6BAA6B,EAAE,KAAK,CAAC,SAAS,CAAC,IAAI;SACnD;IACF;IAEQ,sBAAsB,GAAA;AAK7B,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,EAAE;AAChC,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,EAAE;AAClC,QAAA,MAAM,cAAc,GAAG,IAAI,CAAC,QAAQ,EAAE;QAEtC,IAAI,UAAU,EAAE;YACf,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,UAAU,CAAC;YAClD,IAAI,CAAC,MAAM,EAAE;AACZ,gBAAA,MAAM,IAAI,KAAK,CAAC,4BAA4B,UAAU,CAAA,EAAA,CAAI,CAAC;YAC5D;AAEA,YAAA,MAAM,aAAa,GAAG,WAAW,GAAG,MAAM,CAAC,QAAQ,GAAG,WAAW,CAAC,GAAG,SAAS;YAC9E,OAAO;AACN,gBAAA,QAAQ,EAAE,aAAa,EAAE,QAAQ,IAAI,MAAM,CAAC,QAAQ;AACpD,gBAAA,MAAM,EAAE;oBACP,GAAG,MAAM,CAAC,QAAQ;oBAClB,GAAG,aAAa,EAAE,QAAQ;oBAC1B,GAAG,IAAI,CAAC,MAAM;AACd,iBAAA;AACD,gBAAA,OAAO,EAAE;aACT;QACF;QAEA,IAAI,CAAC,cAAc,EAAE;AACpB,YAAA,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC;QACxE;QAEA,OAAO;AACN,YAAA,QAAQ,EAAE,cAAc;AACxB,YAAA,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE;AACrB,YAAA,OAAO,EAAE;SACT;IACF;AAEQ,IAAA,SAAS,CAAC,KAAyB,EAAA;QAC1C,IAAI,CAAC,KAAK,EAAE;AACX,YAAA,OAAO,IAAI;QACZ;AAEA,QAAA,IAAI,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE;YAClC,OAAO,CAAA,EAAG,KAAK,CAAA,EAAA,CAAI;QACpB;AAEA,QAAA,OAAO,KAAK;IACb;uGApIY,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAApB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,oBAAoB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,SAAA,EAnIrB,CAAC,gCAAgC,CAAC,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAEnC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiCT,CAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,48DAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EApCS,gBAAgB,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAoId,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBAvIhC,SAAS;AACC,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,cAAc,EAAA,UAAA,EACZ,IAAI,EAAA,OAAA,EACP,CAAC,gBAAgB,CAAC,EAAA,SAAA,EAChB,CAAC,gCAAgC,CAAC,EAAA,eAAA,EAC5B,uBAAuB,CAAC,MAAM,EAAA,QAAA,EACrC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiCT,CAAA,CAAA,EAAA,MAAA,EAAA,CAAA,48DAAA,CAAA,EAAA;;;AClEF;;AAEG;MAKU,iBAAiB,CAAA;uGAAjB,iBAAiB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA;wGAAjB,iBAAiB,EAAA,OAAA,EAAA,CAHnB,oBAAoB,CAAA,EAAA,OAAA,EAAA,CACpB,oBAAoB,CAAA,EAAA,CAAA;wGAElB,iBAAiB,EAAA,CAAA;;2FAAjB,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAJ7B,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;oBACT,OAAO,EAAE,CAAC,oBAAoB,CAAC;oBAC/B,OAAO,EAAE,CAAC,oBAAoB;AAC9B,iBAAA;;;ACTD;;AAEG;;ACFH;;AAEG;;;;"}
1
+ {"version":3,"file":"ng-hub-ui-skeleton.mjs","sources":["../../../projects/skeleton/src/lib/presets/hub-skeleton-default-presets.ts","../../../projects/skeleton/src/lib/services/hub-skeleton-preset-registry.service.ts","../../../projects/skeleton/src/lib/utils/hub-skeleton-dsl.ts","../../../projects/skeleton/src/lib/hub-skeleton.component.ts","../../../projects/skeleton/src/lib/hub-skeleton.module.ts","../../../projects/skeleton/src/public-api.ts","../../../projects/skeleton/src/ng-hub-ui-skeleton.ts"],"sourcesContent":["import { HubSkeletonPreset } from '../models/hub-skeleton.types';\n\n/**\n * Bundled preset catalogue used by the skeleton library.\n */\nexport const HUB_SKELETON_DEFAULT_PRESETS: readonly HubSkeletonPreset[] = [\n\t{\n\t\tname: 'card',\n\t\tdescription: 'Generic content card with media, title and body lines.',\n\t\ttemplate:\n\t\t\t'stack(gap:16)>block(height:{{mediaHeight}},radius:{{radius}})+line(height:{{titleHeight}},width:{{titleWidth}})+stack(gap:{{bodyGap}})>line(height:{{lineHeight}},width:100%)*{{rows}}+line(height:{{lineHeight}},width:{{lastLineWidth}})',\n\t\tdefaults: {\n\t\t\tmediaHeight: 180,\n\t\t\tradius: 18,\n\t\t\ttitleHeight: 18,\n\t\t\ttitleWidth: '56%',\n\t\t\tbodyGap: 10,\n\t\t\tlineHeight: 12,\n\t\t\trows: 2,\n\t\t\tlastLineWidth: '76%'\n\t\t},\n\t\tvariants: {\n\t\t\tcompact: {\n\t\t\t\tdefaults: {\n\t\t\t\t\tmediaHeight: 120,\n\t\t\t\t\tradius: 14,\n\t\t\t\t\ttitleHeight: 16,\n\t\t\t\t\tbodyGap: 8,\n\t\t\t\t\tlineHeight: 10,\n\t\t\t\t\trows: 1,\n\t\t\t\t\tlastLineWidth: '68%'\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\t{\n\t\tname: 'list-item',\n\t\tdescription: 'Avatar row with title and subtitle lines.',\n\t\ttemplate:\n\t\t\t'stack(direction:row,gap:12,align:center)>circle(size:{{avatarSize}})+stack(gap:{{gap}},grow:1)>line(height:{{titleHeight}},width:{{titleWidth}})+line(height:{{lineHeight}},width:{{lineWidth}})',\n\t\tdefaults: {\n\t\t\tavatarSize: 44,\n\t\t\tgap: 8,\n\t\t\ttitleHeight: 14,\n\t\t\ttitleWidth: '42%',\n\t\t\tlineHeight: 10,\n\t\t\tlineWidth: '68%'\n\t\t},\n\t\tvariants: {\n\t\t\tcompact: {\n\t\t\t\tdefaults: {\n\t\t\t\t\tavatarSize: 36,\n\t\t\t\t\tgap: 6,\n\t\t\t\t\ttitleHeight: 12,\n\t\t\t\t\tlineHeight: 8\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\t{\n\t\tname: 'table-row',\n\t\tdescription: 'Grid row that adapts to the configured column count.',\n\t\ttemplate: 'grid(columns:{{columns}},gap:12|md=16)>line(height:{{lineHeight}},width:{{cellWidth}})*{{columns}}',\n\t\tdefaults: {\n\t\t\tcolumns: 4,\n\t\t\tlineHeight: 12,\n\t\t\tcellWidth: '88%'\n\t\t}\n\t},\n\t{\n\t\tname: 'detail-view',\n\t\tdescription: 'Two-column detail layout with hero block and metadata rows.',\n\t\ttemplate:\n\t\t\t'grid(columns:1|lg=2,gap:20)>block(height:220|lg=280,radius:20)+stack(gap:14)>line(height:20,width:48%)+line(height:12,width:78%)+line(height:12,width:92%)+line(height:12,width:70%)+grid(columns:2,gap:12)>block(height:64)*4'\n\t},\n\t{\n\t\tname: 'form-section',\n\t\tdescription: 'Grouped form controls with header and responsive fields.',\n\t\ttemplate:\n\t\t\t'stack(gap:18)>line(height:18,width:32%)+grid(columns:1|md=2,gap:14)>stack(gap:8)>line(height:10,width:28%)+block(height:44,radius:12)*{{fields}}',\n\t\tdefaults: {\n\t\t\tfields: 4\n\t\t}\n\t},\n\t{\n\t\tname: 'dashboard-widget',\n\t\tdescription: 'Panel header with metric rows and footer actions.',\n\t\ttemplate:\n\t\t\t'stack(gap:16)>stack(direction:row,gap:12,justify:space-between,align:center)>line(height:16,width:36%)+circle(size:20)+block(height:132,radius:18)+grid(columns:2,gap:12)>line(height:12,width:72%)*4'\n\t},\n\t{\n\t\tname: 'stat-card',\n\t\tdescription: 'Metric summary card with title, large value and trend.',\n\t\ttemplate:\n\t\t\t'stack(gap:14)>line(height:12,width:34%)+line(height:34,width:44%)+line(height:10,width:28%)+block(height:44,radius:14)'\n\t},\n\t{\n\t\tname: 'chart-panel',\n\t\tdescription: 'Chart block with legend rows.',\n\t\ttemplate:\n\t\t\t'stack(gap:16)>stack(direction:row,gap:12,justify:space-between,align:center)>line(height:16,width:40%)+line(height:10,width:18%)+block(height:220,radius:18)+grid(columns:2,gap:10)>stack(direction:row,gap:8,align:center)>circle(size:10)+line(height:10,width:60%)*4'\n\t},\n\t{\n\t\tname: 'profile-summary',\n\t\tdescription: 'Profile card with avatar, identity and summary metrics.',\n\t\ttemplate:\n\t\t\t'stack(gap:16,align:center)>circle(size:88)+line(height:18,width:46%)+line(height:12,width:62%)+grid(columns:3,gap:12)>block(height:56,radius:14)*3'\n\t},\n\t{\n\t\tname: 'master-detail',\n\t\tdescription: 'List panel and detail panel skeleton pair.',\n\t\ttemplate:\n\t\t\t'grid(columns:1|lg=3,gap:20)>stack(gap:12)>list-item*4+stack(gap:16)>block(height:220,radius:18)+line(height:18,width:42%)+line(height:12,width:92%)*3+line(height:12,width:70%)'\n\t},\n\t{\n\t\tname: 'kanban-card',\n\t\tdescription: 'Compact board card with title, metadata and footer chips.',\n\t\ttemplate:\n\t\t\t'stack(gap:12)>line(height:14,width:58%)+line(height:10,width:80%)+stack(direction:row,gap:8)>block(height:24,width:76,radius:999)+block(height:24,width:92,radius:999)'\n\t},\n\t{\n\t\tname: 'feed-item',\n\t\tdescription: 'Activity feed row with avatar and content snippets.',\n\t\ttemplate:\n\t\t\t'stack(direction:row,gap:12,align:flex-start)>circle(size:40)+stack(gap:8,grow:1)>line(height:12,width:34%)+line(height:12,width:94%)+line(height:12,width:74%)'\n\t},\n\t{\n\t\tname: 'search-result',\n\t\tdescription: 'Search result card with title, metadata and excerpt.',\n\t\ttemplate:\n\t\t\t'stack(gap:12)>line(height:18,width:56%)+stack(direction:row,gap:10)>line(height:10,width:20%)+line(height:10,width:18%)+line(height:10,width:24%)+line(height:12,width:92%)*2+line(height:12,width:76%)'\n\t},\n\t{\n\t\tname: 'table-toolbar',\n\t\tdescription: 'Toolbar with title, filters and actions.',\n\t\ttemplate:\n\t\t\t'grid(columns:1|md=2,gap:16,align:center)>line(height:18,width:38%)+stack(direction:row,gap:10,justify:flex-end)>block(height:38,width:180,radius:12)+block(height:38,width:110,radius:12)+block(height:38,width:92,radius:12)'\n\t},\n\t{\n\t\tname: 'filter-bar',\n\t\tdescription: 'Row of filter controls with mobile stacking.',\n\t\ttemplate: 'grid(columns:1|md=4,gap:12)>block(height:40,radius:12)*{{filters}}',\n\t\tdefaults: {\n\t\t\tfilters: 4\n\t\t}\n\t},\n\t{\n\t\tname: 'empty-state-skeleton',\n\t\tdescription: 'Illustrative empty-state placeholder with title and actions.',\n\t\ttemplate:\n\t\t\t'stack(gap:18,align:center)>block(height:160,width:240,radius:28)+line(height:18,width:36%)+line(height:12,width:64%)+line(height:12,width:52%)+stack(direction:row,gap:12)>block(height:40,width:120,radius:999)+block(height:40,width:84,radius:999)'\n\t}\n] as const;\n","import { EnvironmentProviders, Injectable, InjectionToken, computed, inject, makeEnvironmentProviders } from '@angular/core';\nimport { HUB_SKELETON_DEFAULT_PRESETS } from '../presets/hub-skeleton-default-presets';\nimport { HubSkeletonPreset } from '../models/hub-skeleton.types';\n\n/** Multi-provider token for consumer-defined skeleton preset groups. */\nexport const HUB_SKELETON_PRESETS = new InjectionToken<readonly (readonly HubSkeletonPreset[])[]>('HUB_SKELETON_PRESETS', {\n\tfactory: () => []\n});\n\n/**\n * Registers one or more custom presets for the active injector tree.\n *\n * @param presets Custom presets to append to the bundled catalogue.\n * @returns Environment providers ready for app-level registration.\n */\nexport function provideHubSkeletonPresets(presets: readonly HubSkeletonPreset[]): EnvironmentProviders {\n\treturn makeEnvironmentProviders([\n\t\t{\n\t\t\tprovide: HUB_SKELETON_PRESETS,\n\t\t\tmulti: true,\n\t\t\tuseValue: presets\n\t\t}\n\t]);\n}\n\n/**\n * Resolves the full preset catalogue available to the current injector.\n */\n@Injectable({ providedIn: 'root' })\nexport class HubSkeletonPresetRegistryService {\n\tprivate readonly customPresetGroups = inject(HUB_SKELETON_PRESETS);\n\n\t/** All presets merged by name, where later entries override earlier ones. */\n\treadonly presets = computed(() => {\n\t\tconst merged = new Map<string, HubSkeletonPreset>();\n\n\t\tfor (const preset of HUB_SKELETON_DEFAULT_PRESETS) {\n\t\t\tmerged.set(preset.name, preset);\n\t\t}\n\n\t\tfor (const presetGroup of this.customPresetGroups) {\n\t\t\tfor (const preset of presetGroup) {\n\t\t\t\tmerged.set(preset.name, preset);\n\t\t\t}\n\t\t}\n\n\t\treturn merged;\n\t});\n\n\t/**\n\t * Returns a single preset by name.\n\t *\n\t * @param name Preset identifier.\n\t * @returns Matching preset, when available.\n\t */\n\tgetPreset(name: string): HubSkeletonPreset | undefined {\n\t\treturn this.presets().get(name);\n\t}\n}\n","import {\n\tHubSkeletonAstNode,\n\tHubSkeletonBreakpoint,\n\tHubSkeletonParams,\n\tHubSkeletonPreset,\n\tHubSkeletonPrimitive,\n\tHubSkeletonRenderNode,\n\tHubSkeletonResponsiveValue,\n\tHubSkeletonTemplateDefinition,\n\tHubSkeletonTemplateInput\n} from '../models/hub-skeleton.types';\n\nconst BUILTIN_NODE_TYPES = new Set(['line', 'block', 'circle', 'stack', 'grid']);\nconst BREAKPOINT_ORDER: readonly HubSkeletonBreakpoint[] = ['base', 'sm', 'md', 'lg', 'xl'];\nconst BREAKPOINT_WIDTHS: Record<Exclude<HubSkeletonBreakpoint, 'base'>, number> = {\n\tsm: 576,\n\tmd: 768,\n\tlg: 992,\n\txl: 1280\n};\n\n/**\n * Lightweight DSL parser for the compact skeleton syntax.\n */\nclass HubSkeletonDslParser {\n\tprivate index = 0;\n\n\tconstructor(private readonly source: string) {}\n\n\t/**\n\t * Parses the full source string into sibling root nodes.\n\t *\n\t * @returns Root nodes declared in the DSL.\n\t */\n\tparse(): readonly HubSkeletonAstNode[] {\n\t\tconst nodes = this.parseSiblings();\n\t\tthis.skipWhitespace();\n\n\t\tif (this.index < this.source.length) {\n\t\t\tthrow new Error(`Unexpected token \"${this.source[this.index]}\" at position ${this.index}.`);\n\t\t}\n\n\t\treturn nodes;\n\t}\n\n\tprivate parseSiblings(): HubSkeletonAstNode[] {\n\t\tconst nodes = [this.parseNode()];\n\n\t\twhile (true) {\n\t\t\tthis.skipWhitespace();\n\t\t\tif (this.peek() !== '+') {\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tthis.index += 1;\n\t\t\tnodes.push(this.parseNode());\n\t\t}\n\n\t\treturn nodes;\n\t}\n\n\tprivate parseNode(): HubSkeletonAstNode {\n\t\tthis.skipWhitespace();\n\t\tconst name = this.readIdentifier();\n\t\tlet variant: string | undefined;\n\n\t\tif (this.peek() === '@') {\n\t\t\tthis.index += 1;\n\t\t\tvariant = this.readIdentifier();\n\t\t}\n\n\t\tconst props = this.peek() === '(' ? this.readProps() : {};\n\t\tlet children: readonly HubSkeletonAstNode[] = [];\n\n\t\tthis.skipWhitespace();\n\t\tif (this.peek() === '>') {\n\t\t\tthis.index += 1;\n\t\t\tchildren = this.parseSiblings();\n\t\t}\n\n\t\tthis.skipWhitespace();\n\t\tlet repeat = 1;\n\t\tif (this.peek() === '*') {\n\t\t\tthis.index += 1;\n\t\t\tconst rawRepeat = this.readUntilDelimiter(['+', '>', ')']).trim();\n\t\t\trepeat = Number.parseInt(rawRepeat, 10);\n\t\t\tif (!Number.isFinite(repeat) || repeat < 1) {\n\t\t\t\tthrow new Error(`Invalid repeat value \"${rawRepeat}\" near position ${this.index}.`);\n\t\t\t}\n\t\t}\n\n\t\treturn { name, props, variant, children, repeat };\n\t}\n\n\tprivate readProps(): Record<string, string> {\n\t\tconst props: Record<string, string> = {};\n\t\tthis.expect('(');\n\t\tlet chunk = '';\n\t\tlet depth = 1;\n\n\t\twhile (this.index < this.source.length && depth > 0) {\n\t\t\tconst char = this.source[this.index++];\n\t\t\tif (char === '(') {\n\t\t\t\tdepth += 1;\n\t\t\t\tchunk += char;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (char === ')') {\n\t\t\t\tdepth -= 1;\n\t\t\t\tif (depth === 0) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tchunk += char;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tchunk += char;\n\t\t}\n\n\t\tif (depth !== 0) {\n\t\t\tthrow new Error('Unclosed modifier block in skeleton DSL.');\n\t\t}\n\n\t\tfor (const entry of this.splitTopLevel(chunk, ',')) {\n\t\t\tconst trimmedEntry = entry.trim();\n\t\t\tif (!trimmedEntry) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst [rawKey, ...rawValueParts] = trimmedEntry.split(':');\n\t\t\tif (!rawKey) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tprops[rawKey.trim()] = rawValueParts.length > 0 ? rawValueParts.join(':').trim() : 'true';\n\t\t}\n\n\t\treturn props;\n\t}\n\n\tprivate splitTopLevel(value: string, separator: string): string[] {\n\t\tconst parts: string[] = [];\n\t\tlet current = '';\n\t\tlet depth = 0;\n\n\t\tfor (const char of value) {\n\t\t\tif (char === '(') {\n\t\t\t\tdepth += 1;\n\t\t\t} else if (char === ')') {\n\t\t\t\tdepth -= 1;\n\t\t\t}\n\n\t\t\tif (char === separator && depth === 0) {\n\t\t\t\tparts.push(current);\n\t\t\t\tcurrent = '';\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tcurrent += char;\n\t\t}\n\n\t\tif (current) {\n\t\t\tparts.push(current);\n\t\t}\n\n\t\treturn parts;\n\t}\n\n\tprivate readIdentifier(): string {\n\t\tthis.skipWhitespace();\n\t\tconst start = this.index;\n\t\twhile (this.index < this.source.length && /[a-zA-Z0-9-]/.test(this.source[this.index])) {\n\t\t\tthis.index += 1;\n\t\t}\n\n\t\tif (start === this.index) {\n\t\t\tthrow new Error(`Expected identifier near position ${this.index}.`);\n\t\t}\n\n\t\treturn this.source.slice(start, this.index);\n\t}\n\n\tprivate readUntilDelimiter(delimiters: readonly string[]): string {\n\t\tconst start = this.index;\n\t\twhile (this.index < this.source.length && !delimiters.includes(this.source[this.index])) {\n\t\t\tthis.index += 1;\n\t\t}\n\t\treturn this.source.slice(start, this.index);\n\t}\n\n\tprivate expect(char: string): void {\n\t\tthis.skipWhitespace();\n\t\tif (this.peek() !== char) {\n\t\t\tthrow new Error(`Expected \"${char}\" near position ${this.index}.`);\n\t\t}\n\t\tthis.index += 1;\n\t}\n\n\tprivate skipWhitespace(): void {\n\t\twhile (this.index < this.source.length && /\\s/.test(this.source[this.index])) {\n\t\t\tthis.index += 1;\n\t\t}\n\t}\n\n\tprivate peek(): string | undefined {\n\t\treturn this.source[this.index];\n\t}\n}\n\n/**\n * Parses a DSL string into a raw AST.\n *\n * @param dsl Source template string.\n * @returns Parsed root nodes.\n */\nexport function parseHubSkeletonDsl(dsl: string): readonly HubSkeletonAstNode[] {\n\treturn new HubSkeletonDslParser(dsl).parse();\n}\n\n/**\n * Interpolates `{{param}}` placeholders using a serializable params map.\n *\n * @param source Source DSL or modifier value.\n * @param params Runtime params.\n * @returns Interpolated string.\n */\nexport function interpolateHubSkeletonParams(source: string, params: HubSkeletonParams): string {\n\treturn source.replace(/\\{\\{\\s*([a-zA-Z0-9_-]+)\\s*\\}\\}/g, (_, key: string) => String(params[key] ?? ''));\n}\n\n/**\n * Resolves the concrete DSL string to use for the current breakpoint.\n *\n * @param template Source template definition.\n * @param breakpoint Current active breakpoint.\n * @returns DSL string to parse.\n */\nexport function resolveTemplateDsl(template: HubSkeletonTemplateInput, breakpoint: HubSkeletonBreakpoint): string {\n\tif (typeof template === 'string') {\n\t\treturn template;\n\t}\n\n\tif (breakpoint !== 'base' && template.responsive?.[breakpoint]) {\n\t\treturn template.responsive[breakpoint]!;\n\t}\n\n\treturn template.dsl;\n}\n\n/**\n * Resolves a primitive or responsive value token to a string for the active breakpoint.\n *\n * @param value Raw modifier value.\n * @param breakpoint Current breakpoint.\n * @returns Breakpoint-resolved string.\n */\nexport function resolveResponsiveToken(value: string, breakpoint: HubSkeletonBreakpoint): string {\n\tconst parsed = parseResponsiveToken(value);\n\tif (typeof parsed !== 'object' || parsed === null) {\n\t\treturn String(parsed);\n\t}\n\n\tlet resolved: HubSkeletonPrimitive | undefined = parsed.base;\n\tfor (const key of BREAKPOINT_ORDER) {\n\t\tif (key === 'base') {\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (BREAKPOINT_ORDER.indexOf(key) <= BREAKPOINT_ORDER.indexOf(breakpoint) && parsed[key] !== undefined) {\n\t\t\tresolved = parsed[key];\n\t\t}\n\t}\n\n\treturn String(resolved ?? '');\n}\n\n/**\n * Maps the current viewport width to the nearest supported breakpoint id.\n *\n * @param width Viewport width in pixels.\n * @returns Breakpoint identifier.\n */\nexport function resolveBreakpointFromWidth(width: number): HubSkeletonBreakpoint {\n\tif (width >= BREAKPOINT_WIDTHS.xl) {\n\t\treturn 'xl';\n\t}\n\tif (width >= BREAKPOINT_WIDTHS.lg) {\n\t\treturn 'lg';\n\t}\n\tif (width >= BREAKPOINT_WIDTHS.md) {\n\t\treturn 'md';\n\t}\n\tif (width >= BREAKPOINT_WIDTHS.sm) {\n\t\treturn 'sm';\n\t}\n\treturn 'base';\n}\n\n/**\n * Resolves an AST into render nodes, expanding preset aliases recursively.\n *\n * @param nodes AST nodes to resolve.\n * @param options Resolution context.\n * @returns Render nodes ready for the component template.\n */\nexport function resolveHubSkeletonNodes(\n\tnodes: readonly HubSkeletonAstNode[],\n\toptions: {\n\t\treadonly breakpoint: HubSkeletonBreakpoint;\n\t\treadonly params: HubSkeletonParams;\n\t\treadonly registry: { getPreset(name: string): HubSkeletonPreset | undefined };\n\t\treadonly fallbackVariant?: string;\n\t}\n): readonly HubSkeletonRenderNode[] {\n\tconst counter = { value: 0 };\n\n\tconst resolveNode = (\n\t\tnode: HubSkeletonAstNode,\n\t\tinheritedParams: HubSkeletonParams,\n\t\tinheritedVariant?: string\n\t): HubSkeletonRenderNode[] => {\n\t\tconst runtimeVariant = node.variant ?? inheritedVariant;\n\t\tconst runtimeParams = {\n\t\t\t...inheritedParams,\n\t\t\t...convertNodePropsToParams(node.props, options.breakpoint)\n\t\t};\n\n\t\tif (BUILTIN_NODE_TYPES.has(node.name)) {\n\t\t\tconst props = resolveProps(node.props, options.breakpoint);\n\t\t\tconst builtNode: HubSkeletonRenderNode = {\n\t\t\t\tid: `hub-skeleton-node-${counter.value++}`,\n\t\t\t\ttype: node.name as HubSkeletonRenderNode['type'],\n\t\t\t\tprops,\n\t\t\t\tchildren: resolveNodes(node.children, runtimeParams, runtimeVariant),\n\t\t\t\tisSurface: node.name === 'line' || node.name === 'block' || node.name === 'circle'\n\t\t\t};\n\n\t\t\treturn Array.from({ length: node.repeat }, () => builtNode).map((entry, index) => ({\n\t\t\t\t...entry,\n\t\t\t\tid: `${entry.id}-${index}`\n\t\t\t}));\n\t\t}\n\n\t\tconst preset = options.registry.getPreset(node.name);\n\t\tif (!preset) {\n\t\t\tthrow new Error(`Unknown skeleton node or preset alias \"${node.name}\".`);\n\t\t}\n\n\t\tconst activeVariant = runtimeVariant ?? options.fallbackVariant;\n\t\tconst variantDef = activeVariant ? preset.variants?.[activeVariant] : undefined;\n\t\tconst presetParams = {\n\t\t\t...preset.defaults,\n\t\t\t...variantDef?.defaults,\n\t\t\t...runtimeParams\n\t\t};\n\t\tconst presetTemplate = variantDef?.template ?? preset.template;\n\t\tconst presetDsl = interpolateHubSkeletonParams(resolveTemplateDsl(presetTemplate, options.breakpoint), presetParams);\n\t\tconst presetAst = parseHubSkeletonDsl(presetDsl);\n\t\tconst resolvedPresetNodes = resolveNodes(presetAst, presetParams, activeVariant);\n\n\t\treturn Array.from({ length: node.repeat }, () => resolvedPresetNodes).flat();\n\t};\n\n\tconst resolveNodes = (\n\t\tinputNodes: readonly HubSkeletonAstNode[],\n\t\tparams: HubSkeletonParams,\n\t\tvariant?: string\n\t): HubSkeletonRenderNode[] => inputNodes.flatMap((node) => resolveNode(node, params, variant));\n\n\treturn resolveNodes(nodes, options.params, options.fallbackVariant);\n}\n\nfunction resolveProps(props: Readonly<Record<string, string>>, breakpoint: HubSkeletonBreakpoint): Record<string, string> {\n\treturn Object.fromEntries(Object.entries(props).map(([key, value]) => [key, resolveResponsiveToken(value, breakpoint)]));\n}\n\nfunction convertNodePropsToParams(\n\tprops: Readonly<Record<string, string>>,\n\tbreakpoint: HubSkeletonBreakpoint\n): HubSkeletonParams {\n\tconst entries = Object.entries(props).map(([key, value]) => {\n\t\tconst resolvedValue = resolveResponsiveToken(value, breakpoint);\n\t\treturn [key, parsePrimitiveToken(resolvedValue)];\n\t});\n\n\treturn Object.fromEntries(entries);\n}\n\nfunction parseResponsiveToken(value: string): HubSkeletonResponsiveValue {\n\tif (!value.includes('|')) {\n\t\treturn parsePrimitiveToken(value);\n\t}\n\n\tconst responsive: Partial<Record<HubSkeletonBreakpoint, HubSkeletonPrimitive>> = {};\n\tfor (const part of value.split('|')) {\n\t\tconst trimmedPart = part.trim();\n\t\tif (!trimmedPart) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (!trimmedPart.includes('=')) {\n\t\t\tresponsive.base = parsePrimitiveToken(trimmedPart);\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst [breakpoint, rawToken] = trimmedPart.split('=');\n\t\tconst normalizedBreakpoint = breakpoint.trim();\n\t\tif (isBreakpoint(normalizedBreakpoint)) {\n\t\t\tresponsive[normalizedBreakpoint] = parsePrimitiveToken(rawToken.trim());\n\t\t}\n\t}\n\n\treturn responsive;\n}\n\nfunction isBreakpoint(value: string): value is HubSkeletonBreakpoint {\n\treturn BREAKPOINT_ORDER.includes(value as HubSkeletonBreakpoint);\n}\n\nfunction parsePrimitiveToken(value: string): HubSkeletonPrimitive {\n\tconst trimmedValue = value.trim();\n\tif (trimmedValue === 'true') {\n\t\treturn true;\n\t}\n\tif (trimmedValue === 'false') {\n\t\treturn false;\n\t}\n\tif (/^-?\\d+(\\.\\d+)?$/.test(trimmedValue)) {\n\t\treturn Number(trimmedValue);\n\t}\n\treturn trimmedValue;\n}\n","import { DOCUMENT, NgTemplateOutlet, isPlatformBrowser } from '@angular/common';\nimport {\n\tChangeDetectionStrategy,\n\tComponent,\n\tOnDestroy,\n\tOnInit,\n\tPLATFORM_ID,\n\tcomputed,\n\tinject,\n\tinput,\n\tsignal\n} from '@angular/core';\nimport {\n\tHubSkeletonAppearance,\n\tHubSkeletonParams,\n\tHubSkeletonRenderNode,\n\tHubSkeletonTemplateInput\n} from './models/hub-skeleton.types';\nimport { HubSkeletonPresetRegistryService } from './services/hub-skeleton-preset-registry.service';\nimport {\n\tinterpolateHubSkeletonParams,\n\tparseHubSkeletonDsl,\n\tresolveBreakpointFromWidth,\n\tresolveHubSkeletonNodes,\n\tresolveTemplateDsl\n} from './utils/hub-skeleton-dsl';\n\n/**\n * Dynamic skeleton component that renders bundled presets or compact inline DSL templates.\n */\n@Component({\n\tselector: 'hub-skeleton',\n\tstandalone: true,\n\timports: [NgTemplateOutlet],\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n\ttemplate: `\n\t\t<div\n\t\t\tclass=\"hub-skeleton\"\n\t\t\t[class.hub-skeleton--animated]=\"animated()\"\n\t\t\t[class.hub-skeleton--subtle]=\"appearance() === 'subtle'\"\n\t\t\t[class.hub-skeleton--contrast]=\"appearance() === 'contrast'\"\n\t\t\t[attr.aria-label]=\"ariaLabel()\"\n\t\t\trole=\"status\"\n\t\t\taria-live=\"polite\"\n\t\t\taria-busy=\"true\"\n\t\t>\n\t\t\t<ng-container *ngTemplateOutlet=\"renderNodes; context: { $implicit: resolvedNodes() }\"></ng-container>\n\t\t</div>\n\n\t\t<ng-template #renderNodes let-nodes>\n\t\t\t@for (node of nodes; track node.id) {\n\t\t\t\t<div\n\t\t\t\t\tclass=\"hub-skeleton__node\"\n\t\t\t\t\t[class.hub-skeleton__node--surface]=\"node.isSurface\"\n\t\t\t\t\t[class.hub-skeleton__node--line]=\"node.type === 'line'\"\n\t\t\t\t\t[class.hub-skeleton__node--block]=\"node.type === 'block'\"\n\t\t\t\t\t[class.hub-skeleton__node--circle]=\"node.type === 'circle'\"\n\t\t\t\t\t[class.hub-skeleton__node--stack]=\"node.type === 'stack'\"\n\t\t\t\t\t[class.hub-skeleton__node--grid]=\"node.type === 'grid'\"\n\t\t\t\t\t[class.hub-skeleton__node--row]=\"node.type === 'stack' && node.props['direction'] === 'row'\"\n\t\t\t\t\t[class.hub-skeleton__node--grow]=\"node.props['grow'] === 'true'\"\n\t\t\t\t\t[style]=\"buildStyles(node)\"\n\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t>\n\t\t\t\t\t@if (node.children.length > 0) {\n\t\t\t\t\t\t<ng-container *ngTemplateOutlet=\"renderNodes; context: { $implicit: node.children }\"></ng-container>\n\t\t\t\t\t}\n\t\t\t\t</div>\n\t\t\t}\n\t\t</ng-template>\n\t`,\n\tstyles: [\n\t\t`\n\t\t\t:host {\n\t\t\t\tdisplay: block;\n\t\t\t}\n\n\t\t\t.hub-skeleton {\n\t\t\t\t--hub-skeleton-bg: rgba(148, 163, 184, 0.18);\n\t\t\t\t--hub-skeleton-highlight: rgba(255, 255, 255, 0.52);\n\t\t\t\t--hub-skeleton-radius: 12px;\n\t\t\t\t--hub-skeleton-gap: 12px;\n\t\t\t\t--hub-skeleton-animation-duration: 1.35s;\n\t\t\t\tdisplay: block;\n\t\t\t\twidth: 100%;\n\t\t\t}\n\n\t\t\t.hub-skeleton--subtle {\n\t\t\t\t--hub-skeleton-bg: rgba(148, 163, 184, 0.12);\n\t\t\t\t--hub-skeleton-highlight: rgba(255, 255, 255, 0.38);\n\t\t\t}\n\n\t\t\t.hub-skeleton--contrast {\n\t\t\t\t--hub-skeleton-bg: rgba(71, 85, 105, 0.28);\n\t\t\t\t--hub-skeleton-highlight: rgba(255, 255, 255, 0.28);\n\t\t\t}\n\n\t\t\t.hub-skeleton__node {\n\t\t\t\tbox-sizing: border-box;\n\t\t\t\tmin-width: 0;\n\t\t\t}\n\n\t\t\t.hub-skeleton__node--surface {\n\t\t\t\tbackground: linear-gradient(\n\t\t\t\t\t90deg,\n\t\t\t\t\tvar(--hub-skeleton-bg) 0%,\n\t\t\t\t\tvar(--hub-skeleton-bg) 32%,\n\t\t\t\t\tvar(--hub-skeleton-highlight) 50%,\n\t\t\t\t\tvar(--hub-skeleton-bg) 68%,\n\t\t\t\t\tvar(--hub-skeleton-bg) 100%\n\t\t\t\t);\n\t\t\t\tbackground-size: 220% 100%;\n\t\t\t\tborder-radius: var(--hub-skeleton-node-radius, var(--hub-skeleton-radius));\n\t\t\t}\n\n\t\t\t.hub-skeleton--animated .hub-skeleton__node--surface {\n\t\t\t\tanimation: hub-skeleton-shimmer var(--hub-skeleton-animation-duration) ease-in-out infinite;\n\t\t\t}\n\n\t\t\t.hub-skeleton__node--line,\n\t\t\t.hub-skeleton__node--block,\n\t\t\t.hub-skeleton__node--circle {\n\t\t\t\twidth: var(--hub-skeleton-node-width, 100%);\n\t\t\t\theight: var(--hub-skeleton-node-height, 12px);\n\t\t\t}\n\n\t\t\t.hub-skeleton__node--circle {\n\t\t\t\twidth: var(--hub-skeleton-node-size, var(--hub-skeleton-node-width, 40px));\n\t\t\t\theight: var(--hub-skeleton-node-size, var(--hub-skeleton-node-height, 40px));\n\t\t\t\tborder-radius: 999px;\n\t\t\t}\n\n\t\t\t.hub-skeleton__node--stack {\n\t\t\t\tdisplay: flex;\n\t\t\t\tflex-direction: column;\n\t\t\t\tgap: var(--hub-skeleton-node-gap, var(--hub-skeleton-gap));\n\t\t\t\talign-items: var(--hub-skeleton-node-align, stretch);\n\t\t\t\tjustify-content: var(--hub-skeleton-node-justify, flex-start);\n\t\t\t}\n\n\t\t\t.hub-skeleton__node--row {\n\t\t\t\tflex-direction: row;\n\t\t\t}\n\n\t\t\t.hub-skeleton__node--grid {\n\t\t\t\tdisplay: grid;\n\t\t\t\tgrid-template-columns: repeat(var(--hub-skeleton-node-columns, 2), minmax(0, 1fr));\n\t\t\t\tgap: var(--hub-skeleton-node-gap, var(--hub-skeleton-gap));\n\t\t\t\talign-items: var(--hub-skeleton-node-align, stretch);\n\t\t\t}\n\n\t\t\t.hub-skeleton__node--grow {\n\t\t\t\tflex: 1 1 auto;\n\t\t\t}\n\n\t\t\t@keyframes hub-skeleton-shimmer {\n\t\t\t\tfrom {\n\t\t\t\t\tbackground-position: 100% 0;\n\t\t\t\t}\n\t\t\t\tto {\n\t\t\t\t\tbackground-position: -100% 0;\n\t\t\t\t}\n\t\t\t}\n\t\t`\n\t]\n})\nexport class HubSkeletonComponent implements OnInit, OnDestroy {\n\t/** Built-in or registered preset name. */\n\treadonly preset = input<string | null>(null);\n\n\t/** Inline compact DSL template or template definition object. */\n\treadonly template = input<HubSkeletonTemplateInput | null>(null);\n\n\t/** Serializable params interpolated before parsing. */\n\treadonly params = input<HubSkeletonParams>({});\n\n\t/** Optional named variant. */\n\treadonly variant = input<string | null>(null);\n\n\t/** Toggles shimmer animation. */\n\treadonly animated = input(true);\n\n\t/** Visual appearance preset. */\n\treadonly appearance = input<HubSkeletonAppearance>('default');\n\n\t/**\n\t * Accessible name of the container. The placeholder shapes are all `aria-hidden`,\n\t * so this label is the only thing assistive technology can perceive while loading.\n\t */\n\treadonly ariaLabel = input('Loading placeholder');\n\n\tprivate readonly document = inject(DOCUMENT);\n\tprivate readonly platformId = inject(PLATFORM_ID);\n\tprivate readonly registry = inject(HubSkeletonPresetRegistryService);\n\n\tprivate resizeCleanup: (() => void) | null = null;\n\tprivate readonly viewportWidth = signal(1200);\n\treadonly activeBreakpoint = computed(() => resolveBreakpointFromWidth(this.viewportWidth()));\n\n\t/** Resolved render nodes after preset expansion and breakpoint evaluation. */\n\treadonly resolvedNodes = computed<readonly HubSkeletonRenderNode[]>(() => {\n\t\tconst { template, params, variant } = this.resolveRuntimeTemplate();\n\t\tconst dsl = interpolateHubSkeletonParams(resolveTemplateDsl(template, this.activeBreakpoint()), params);\n\t\tconst ast = parseHubSkeletonDsl(dsl);\n\n\t\treturn resolveHubSkeletonNodes(ast, {\n\t\t\tbreakpoint: this.activeBreakpoint(),\n\t\t\tparams,\n\t\t\tregistry: this.registry,\n\t\t\tfallbackVariant: variant ?? undefined\n\t\t});\n\t});\n\n\tngOnInit(): void {\n\t\tif (!isPlatformBrowser(this.platformId) || !this.document.defaultView) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst win = this.document.defaultView;\n\t\tthis.viewportWidth.set(win.innerWidth);\n\n\t\tconst listener = () => this.viewportWidth.set(win.innerWidth);\n\t\twin.addEventListener('resize', listener, { passive: true });\n\t\tthis.resizeCleanup = () => win.removeEventListener('resize', listener);\n\t}\n\n\tngOnDestroy(): void {\n\t\tthis.resizeCleanup?.();\n\t}\n\n\t/**\n\t * Converts node props into CSS custom properties consumed by the template.\n\t *\n\t * @param node Render node.\n\t * @returns Style object.\n\t */\n\tbuildStyles(node: HubSkeletonRenderNode): Record<string, string | null> {\n\t\tconst props = node.props;\n\t\treturn {\n\t\t\t'--hub-skeleton-node-width': props['width'] ?? null,\n\t\t\t'--hub-skeleton-node-height': this.toCssSize(props['height']),\n\t\t\t'--hub-skeleton-node-size': this.toCssSize(props['size']),\n\t\t\t'--hub-skeleton-node-radius': this.toCssSize(props['radius']),\n\t\t\t'--hub-skeleton-node-gap': this.toCssSize(props['gap']),\n\t\t\t'--hub-skeleton-node-columns': props['columns'] ?? null,\n\t\t\t'--hub-skeleton-node-align': props['align'] ?? null,\n\t\t\t'--hub-skeleton-node-justify': props['justify'] ?? null\n\t\t};\n\t}\n\n\tprivate resolveRuntimeTemplate(): {\n\t\treadonly template: HubSkeletonTemplateInput;\n\t\treadonly params: HubSkeletonParams;\n\t\treadonly variant: string | null;\n\t} {\n\t\tconst presetName = this.preset();\n\t\tconst variantName = this.variant();\n\t\tconst inlineTemplate = this.template();\n\n\t\tif (presetName) {\n\t\t\tconst preset = this.registry.getPreset(presetName);\n\t\t\tif (!preset) {\n\t\t\t\tthrow new Error(`Unknown skeleton preset \"${presetName}\".`);\n\t\t\t}\n\n\t\t\tconst activeVariant = variantName ? preset.variants?.[variantName] : undefined;\n\t\t\treturn {\n\t\t\t\ttemplate: activeVariant?.template ?? preset.template,\n\t\t\t\tparams: {\n\t\t\t\t\t...preset.defaults,\n\t\t\t\t\t...activeVariant?.defaults,\n\t\t\t\t\t...this.params()\n\t\t\t\t},\n\t\t\t\tvariant: variantName\n\t\t\t};\n\t\t}\n\n\t\tif (!inlineTemplate) {\n\t\t\tthrow new Error('hub-skeleton requires either `preset` or `template`.');\n\t\t}\n\n\t\treturn {\n\t\t\ttemplate: inlineTemplate,\n\t\t\tparams: this.params(),\n\t\t\tvariant: variantName\n\t\t};\n\t}\n\n\tprivate toCssSize(value: string | undefined): string | null {\n\t\tif (!value) {\n\t\t\treturn null;\n\t\t}\n\n\t\tif (/^-?\\d+(\\.\\d+)?$/.test(value)) {\n\t\t\treturn `${value}px`;\n\t\t}\n\n\t\treturn value;\n\t}\n}\n","import { NgModule } from '@angular/core';\nimport { HubSkeletonComponent } from './hub-skeleton.component';\n\n/**\n * Backward-compatibility module for NgModule-based applications.\n *\n * @deprecated Import the standalone `HubSkeletonComponent` directly; this module only\n * re-exports it and provides nothing of its own. Custom presets are registered with\n * `provideHubSkeletonPresets()`, which never travelled through here. Scheduled for\n * removal in **23.0.0**.\n */\n@NgModule({\n\timports: [HubSkeletonComponent],\n\texports: [HubSkeletonComponent]\n})\nexport class HubSkeletonModule {}\n","/*\n * Public API Surface of skeleton\n */\n\nexport * from './lib/hub-skeleton.component';\nexport * from './lib/hub-skeleton.module';\nexport * from './lib/models/hub-skeleton.types';\nexport * from './lib/presets/hub-skeleton-default-presets';\nexport * from './lib/services/hub-skeleton-preset-registry.service';\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,6 +1,6 @@
1
1
  {
2
2
  "name": "ng-hub-ui-skeleton",
3
- "version": "22.2.3",
3
+ "version": "22.3.0",
4
4
  "license": "MIT",
5
5
  "description": "Dynamic Angular skeleton placeholders with presets, inline DSL templates, responsive variants, and programmatic preset registration.",
6
6
  "author": "Carlos Morcillo <carlos.morcillo@me.com> (https://www.carlosmorcillo.com)",
@@ -11,7 +11,7 @@
11
11
  "bugs": {
12
12
  "url": "https://github.com/carlos-morcillo/ng-hub-ui-skeleton/issues"
13
13
  },
14
- "homepage": "https://hubui.dev/",
14
+ "homepage": "https://hubui.dev/en/skeleton/overview/",
15
15
  "keywords": [
16
16
  "angular",
17
17
  "skeleton",
@@ -35,9 +35,10 @@
35
35
  "access": "public"
36
36
  },
37
37
  "sideEffects": false,
38
- "module": "fesm2022/ng-hub-ui-skeleton.mjs",
39
- "typings": "types/ng-hub-ui-skeleton.d.ts",
40
38
  "exports": {
39
+ "./styles": "./styles/index.scss",
40
+ "./styles/index.scss": "./styles/index.scss",
41
+ "./styles/mixins/skeleton-theme": "./styles/mixins/_skeleton-theme.scss",
41
42
  "./package.json": {
42
43
  "default": "./package.json"
43
44
  },
@@ -46,5 +47,7 @@
46
47
  "default": "./fesm2022/ng-hub-ui-skeleton.mjs"
47
48
  }
48
49
  },
50
+ "module": "fesm2022/ng-hub-ui-skeleton.mjs",
51
+ "typings": "types/ng-hub-ui-skeleton.d.ts",
49
52
  "type": "module"
50
53
  }
@@ -26,13 +26,7 @@
26
26
  // }
27
27
  //
28
28
  // scss-docs-start hub-skeleton-theme
29
- @mixin hub-skeleton-theme(
30
- $bg: null,
31
- $highlight: null,
32
- $radius: null,
33
- $gap: null,
34
- $animation-duration: null
35
- ) {
29
+ @mixin hub-skeleton-theme($bg: null, $highlight: null, $radius: null, $gap: null, $animation-duration: null) {
36
30
  @if $bg != null {
37
31
  --hub-skeleton-bg: #{$bg};
38
32
  }
@@ -100,7 +100,10 @@ declare class HubSkeletonComponent implements OnInit, OnDestroy {
100
100
  readonly animated: _angular_core.InputSignal<boolean>;
101
101
  /** Visual appearance preset. */
102
102
  readonly appearance: _angular_core.InputSignal<HubSkeletonAppearance>;
103
- /** Optional accessible label applied to the container. */
103
+ /**
104
+ * Accessible name of the container. The placeholder shapes are all `aria-hidden`,
105
+ * so this label is the only thing assistive technology can perceive while loading.
106
+ */
104
107
  readonly ariaLabel: _angular_core.InputSignal<string>;
105
108
  private readonly document;
106
109
  private readonly platformId;
@@ -126,7 +129,12 @@ declare class HubSkeletonComponent implements OnInit, OnDestroy {
126
129
  }
127
130
 
128
131
  /**
129
- * NgModule wrapper kept for compatibility with module-based Angular apps.
132
+ * Backward-compatibility module for NgModule-based applications.
133
+ *
134
+ * @deprecated Import the standalone `HubSkeletonComponent` directly; this module only
135
+ * re-exports it and provides nothing of its own. Custom presets are registered with
136
+ * `provideHubSkeletonPresets()`, which never travelled through here. Scheduled for
137
+ * removal in **23.0.0**.
130
138
  */
131
139
  declare class HubSkeletonModule {
132
140
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<HubSkeletonModule, never>;
Binary file