ng-hub-ui-skeleton 22.2.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.
@@ -0,0 +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":"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"}
Binary file
package/package.json ADDED
@@ -0,0 +1,50 @@
1
+ {
2
+ "name": "ng-hub-ui-skeleton",
3
+ "version": "22.2.0",
4
+ "license": "MIT",
5
+ "description": "Dynamic Angular skeleton placeholders with presets, inline DSL templates, responsive variants, and programmatic preset registration.",
6
+ "author": "Carlos Morcillo <carlos.morcillo@me.com> (https://www.carlosmorcillo.com)",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "https://github.com/carlos-morcillo/ng-hub-ui-skeleton.git"
10
+ },
11
+ "bugs": {
12
+ "url": "https://github.com/carlos-morcillo/ng-hub-ui-skeleton/issues"
13
+ },
14
+ "homepage": "https://hubui.dev/",
15
+ "keywords": [
16
+ "angular",
17
+ "skeleton",
18
+ "placeholder",
19
+ "loading",
20
+ "shimmer",
21
+ "ui-component",
22
+ "angular-library",
23
+ "ng-hub-ui",
24
+ "typescript",
25
+ "angular21"
26
+ ],
27
+ "peerDependencies": {
28
+ "@angular/common": ">=21.0.0",
29
+ "@angular/core": ">=21.0.0"
30
+ },
31
+ "dependencies": {
32
+ "tslib": "^2.3.0"
33
+ },
34
+ "publishConfig": {
35
+ "access": "public"
36
+ },
37
+ "sideEffects": false,
38
+ "module": "fesm2022/ng-hub-ui-skeleton.mjs",
39
+ "typings": "types/ng-hub-ui-skeleton.d.ts",
40
+ "exports": {
41
+ "./package.json": {
42
+ "default": "./package.json"
43
+ },
44
+ ".": {
45
+ "types": "./types/ng-hub-ui-skeleton.d.ts",
46
+ "default": "./fesm2022/ng-hub-ui-skeleton.mjs"
47
+ }
48
+ },
49
+ "type": "module"
50
+ }
@@ -0,0 +1,10 @@
1
+ // ─────────────────────────────────────────────────────────────────────────
2
+ // ng-hub-ui-skeleton — theming entry
3
+ // ─────────────────────────────────────────────────────────────────────────
4
+ // Opt-in one-call theming mixin, forwarded so consumers can `@use` it from the
5
+ // package root:
6
+ //
7
+ // @use 'ng-hub-ui-skeleton/styles' as *;
8
+ // ─────────────────────────────────────────────────────────────────────────
9
+
10
+ @forward 'mixins/skeleton-theme';
@@ -0,0 +1,52 @@
1
+ // ─────────────────────────────────────────────────────────────────────────
2
+ // hub-skeleton-theme — one-call theming for `<hub-skeleton>`
3
+ // ─────────────────────────────────────────────────────────────────────────
4
+ //
5
+ // Override the `--hub-skeleton-*` design tokens in a single include. Every
6
+ // parameter is OPTIONAL and defaults to `null`: only the parameters you pass
7
+ // are emitted, so the rest keep the component's defaults. Token-based and
8
+ // self-contained (no Bootstrap dependencies).
9
+ //
10
+ // A skeleton is a neutral loading placeholder — there is no semantic colour
11
+ // variant; tune the base / highlight surfaces, the corner radius, the gap
12
+ // between nodes and the shimmer speed instead. (Per-node sizes come from the
13
+ // template DSL / presets, not from this mixin.)
14
+ //
15
+ // @example
16
+ //
17
+ // @use 'ng-hub-ui-skeleton/styles' as *;
18
+ //
19
+ // hub-skeleton.on-dark {
20
+ // @include hub-skeleton-theme(
21
+ // $bg: rgba(255, 255, 255, 0.10),
22
+ // $highlight: rgba(255, 255, 255, 0.22),
23
+ // $radius: 8px,
24
+ // $animation-duration: 1.8s
25
+ // );
26
+ // }
27
+ //
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
+ ) {
36
+ @if $bg != null {
37
+ --hub-skeleton-bg: #{$bg};
38
+ }
39
+ @if $highlight != null {
40
+ --hub-skeleton-highlight: #{$highlight};
41
+ }
42
+ @if $radius != null {
43
+ --hub-skeleton-radius: #{$radius};
44
+ }
45
+ @if $gap != null {
46
+ --hub-skeleton-gap: #{$gap};
47
+ }
48
+ @if $animation-duration != null {
49
+ --hub-skeleton-animation-duration: #{$animation-duration};
50
+ }
51
+ }
52
+ // scss-docs-end hub-skeleton-theme
@@ -0,0 +1,170 @@
1
+ import * as ng_hub_ui_skeleton from 'ng-hub-ui-skeleton';
2
+ import * as _angular_core from '@angular/core';
3
+ import { OnInit, OnDestroy, InjectionToken, EnvironmentProviders } from '@angular/core';
4
+
5
+ /**
6
+ * Available breakpoint identifiers resolved by the skeleton renderer.
7
+ */
8
+ type HubSkeletonBreakpoint = 'base' | 'sm' | 'md' | 'lg' | 'xl';
9
+ /**
10
+ * Primitive values accepted by the DSL and public params API.
11
+ */
12
+ type HubSkeletonPrimitive = string | number | boolean;
13
+ /**
14
+ * Breakpoint-aware primitive values.
15
+ */
16
+ type HubSkeletonResponsiveValue<T extends HubSkeletonPrimitive = HubSkeletonPrimitive> = T | Partial<Record<HubSkeletonBreakpoint, T>>;
17
+ /**
18
+ * Serializable params accepted by presets and inline templates.
19
+ */
20
+ type HubSkeletonParams = Record<string, HubSkeletonPrimitive | undefined>;
21
+ /**
22
+ * Public visual appearance presets.
23
+ */
24
+ type HubSkeletonAppearance = 'default' | 'subtle' | 'contrast';
25
+ /**
26
+ * Template value accepted by the public component API.
27
+ */
28
+ type HubSkeletonTemplateInput = string | HubSkeletonTemplateDefinition;
29
+ /**
30
+ * Programmatic template definition with explicit responsive overrides.
31
+ */
32
+ interface HubSkeletonTemplateDefinition {
33
+ /** Base compact DSL string. */
34
+ readonly dsl: string;
35
+ /** Optional breakpoint-specific DSL replacement. */
36
+ readonly responsive?: Partial<Record<Exclude<HubSkeletonBreakpoint, 'base'>, string>>;
37
+ }
38
+ /**
39
+ * Public preset contract used by bundled and custom presets.
40
+ */
41
+ interface HubSkeletonPreset {
42
+ /** Stable preset identifier used in the `preset` input and DSL alias composition. */
43
+ readonly name: string;
44
+ /** Main preset template. */
45
+ readonly template: HubSkeletonTemplateInput;
46
+ /** Optional parameter defaults merged before template interpolation. */
47
+ readonly defaults?: HubSkeletonParams;
48
+ /** Optional preset-level variants. */
49
+ readonly variants?: Record<string, {
50
+ readonly template?: HubSkeletonTemplateInput;
51
+ readonly defaults?: HubSkeletonParams;
52
+ }>;
53
+ /** Optional human-friendly summary used by docs. */
54
+ readonly description?: string;
55
+ }
56
+ /**
57
+ * Parsed DSL node before alias expansion.
58
+ */
59
+ interface HubSkeletonAstNode {
60
+ /** Stable node name parsed from the DSL token. */
61
+ readonly name: string;
62
+ /** Parsed modifier map. */
63
+ readonly props: Readonly<Record<string, string>>;
64
+ /** Optional inline variant selector parsed from `name@variant`. */
65
+ readonly variant?: string;
66
+ /** Child nodes attached via the `>` operator. */
67
+ readonly children: readonly HubSkeletonAstNode[];
68
+ /** Repetition count parsed from the `*N` suffix. */
69
+ readonly repeat: number;
70
+ }
71
+ /**
72
+ * Internal normalized render node after preset and responsive resolution.
73
+ */
74
+ interface HubSkeletonRenderNode {
75
+ /** Stable generated node identifier. */
76
+ readonly id: string;
77
+ /** Renderable node type. */
78
+ readonly type: 'line' | 'block' | 'circle' | 'stack' | 'grid';
79
+ /** Final string props after param interpolation and breakpoint resolution. */
80
+ readonly props: Readonly<Record<string, string>>;
81
+ /** Nested child nodes for container types. */
82
+ readonly children: readonly HubSkeletonRenderNode[];
83
+ /** Marks whether the node paints a visible skeleton surface. */
84
+ readonly isSurface: boolean;
85
+ }
86
+
87
+ /**
88
+ * Dynamic skeleton component that renders bundled presets or compact inline DSL templates.
89
+ */
90
+ declare class HubSkeletonComponent implements OnInit, OnDestroy {
91
+ /** Built-in or registered preset name. */
92
+ readonly preset: _angular_core.InputSignal<string | null>;
93
+ /** Inline compact DSL template or template definition object. */
94
+ readonly template: _angular_core.InputSignal<HubSkeletonTemplateInput | null>;
95
+ /** Serializable params interpolated before parsing. */
96
+ readonly params: _angular_core.InputSignal<HubSkeletonParams>;
97
+ /** Optional named variant. */
98
+ readonly variant: _angular_core.InputSignal<string | null>;
99
+ /** Toggles shimmer animation. */
100
+ readonly animated: _angular_core.InputSignal<boolean>;
101
+ /** Visual appearance preset. */
102
+ readonly appearance: _angular_core.InputSignal<HubSkeletonAppearance>;
103
+ /** Optional accessible label applied to the container. */
104
+ readonly ariaLabel: _angular_core.InputSignal<string>;
105
+ private readonly document;
106
+ private readonly platformId;
107
+ private readonly registry;
108
+ private resizeCleanup;
109
+ private readonly viewportWidth;
110
+ readonly activeBreakpoint: _angular_core.Signal<ng_hub_ui_skeleton.HubSkeletonBreakpoint>;
111
+ /** Resolved render nodes after preset expansion and breakpoint evaluation. */
112
+ readonly resolvedNodes: _angular_core.Signal<readonly HubSkeletonRenderNode[]>;
113
+ ngOnInit(): void;
114
+ ngOnDestroy(): void;
115
+ /**
116
+ * Converts node props into CSS custom properties consumed by the template.
117
+ *
118
+ * @param node Render node.
119
+ * @returns Style object.
120
+ */
121
+ buildStyles(node: HubSkeletonRenderNode): Record<string, string | null>;
122
+ private resolveRuntimeTemplate;
123
+ private toCssSize;
124
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<HubSkeletonComponent, never>;
125
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<HubSkeletonComponent, "hub-skeleton", never, { "preset": { "alias": "preset"; "required": false; "isSignal": true; }; "template": { "alias": "template"; "required": false; "isSignal": true; }; "params": { "alias": "params"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "animated": { "alias": "animated"; "required": false; "isSignal": true; }; "appearance": { "alias": "appearance"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
126
+ }
127
+
128
+ /**
129
+ * NgModule wrapper kept for compatibility with module-based Angular apps.
130
+ */
131
+ declare class HubSkeletonModule {
132
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<HubSkeletonModule, never>;
133
+ static ɵmod: _angular_core.ɵɵNgModuleDeclaration<HubSkeletonModule, never, [typeof HubSkeletonComponent], [typeof HubSkeletonComponent]>;
134
+ static ɵinj: _angular_core.ɵɵInjectorDeclaration<HubSkeletonModule>;
135
+ }
136
+
137
+ /**
138
+ * Bundled preset catalogue used by the skeleton library.
139
+ */
140
+ declare const HUB_SKELETON_DEFAULT_PRESETS: readonly HubSkeletonPreset[];
141
+
142
+ /** Multi-provider token for consumer-defined skeleton preset groups. */
143
+ declare const HUB_SKELETON_PRESETS: InjectionToken<readonly (readonly HubSkeletonPreset[])[]>;
144
+ /**
145
+ * Registers one or more custom presets for the active injector tree.
146
+ *
147
+ * @param presets Custom presets to append to the bundled catalogue.
148
+ * @returns Environment providers ready for app-level registration.
149
+ */
150
+ declare function provideHubSkeletonPresets(presets: readonly HubSkeletonPreset[]): EnvironmentProviders;
151
+ /**
152
+ * Resolves the full preset catalogue available to the current injector.
153
+ */
154
+ declare class HubSkeletonPresetRegistryService {
155
+ private readonly customPresetGroups;
156
+ /** All presets merged by name, where later entries override earlier ones. */
157
+ readonly presets: _angular_core.Signal<Map<string, HubSkeletonPreset>>;
158
+ /**
159
+ * Returns a single preset by name.
160
+ *
161
+ * @param name Preset identifier.
162
+ * @returns Matching preset, when available.
163
+ */
164
+ getPreset(name: string): HubSkeletonPreset | undefined;
165
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<HubSkeletonPresetRegistryService, never>;
166
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<HubSkeletonPresetRegistryService>;
167
+ }
168
+
169
+ export { HUB_SKELETON_DEFAULT_PRESETS, HUB_SKELETON_PRESETS, HubSkeletonComponent, HubSkeletonModule, HubSkeletonPresetRegistryService, provideHubSkeletonPresets };
170
+ export type { HubSkeletonAppearance, HubSkeletonAstNode, HubSkeletonBreakpoint, HubSkeletonParams, HubSkeletonPreset, HubSkeletonPrimitive, HubSkeletonRenderNode, HubSkeletonResponsiveValue, HubSkeletonTemplateDefinition, HubSkeletonTemplateInput };