@lifecorner/angular-ui-kit 3.21.1 → 3.22.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/fesm2022/lifecorner-angular-ui-kit-code-block.mjs +3 -3
- package/fesm2022/lifecorner-angular-ui-kit-code-block.mjs.map +1 -1
- package/fesm2022/lifecorner-angular-ui-kit-copy-field.mjs +3 -3
- package/fesm2022/lifecorner-angular-ui-kit-copy-field.mjs.map +1 -1
- package/fesm2022/lifecorner-angular-ui-kit-icon.mjs +2 -2
- package/fesm2022/lifecorner-angular-ui-kit-icon.mjs.map +1 -1
- package/fesm2022/lifecorner-angular-ui-kit-icons.mjs +80 -2
- package/fesm2022/lifecorner-angular-ui-kit-icons.mjs.map +1 -1
- package/fesm2022/lifecorner-angular-ui-kit-internal-icon-set.mjs +34 -2
- package/fesm2022/lifecorner-angular-ui-kit-internal-icon-set.mjs.map +1 -1
- package/fesm2022/lifecorner-angular-ui-kit-kanban-board.mjs +3 -3
- package/fesm2022/lifecorner-angular-ui-kit-kanban-board.mjs.map +1 -1
- package/fesm2022/lifecorner-angular-ui-kit-log-viewer.mjs +17 -3
- package/fesm2022/lifecorner-angular-ui-kit-log-viewer.mjs.map +1 -1
- package/fesm2022/lifecorner-angular-ui-kit-search-input.mjs +3 -3
- package/fesm2022/lifecorner-angular-ui-kit-search-input.mjs.map +1 -1
- package/fesm2022/lifecorner-angular-ui-kit-tree-view.mjs +3 -1
- package/fesm2022/lifecorner-angular-ui-kit-tree-view.mjs.map +1 -1
- package/package.json +1 -1
- package/types/lifecorner-angular-ui-kit-icons.d.ts +14 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lifecorner-angular-ui-kit-icon.mjs","names":[],"sources":["../../../../libs/angular-ui-kit/src/lib/icon/icon-aliases.ts","../../../../libs/angular-ui-kit/src/lib/icon/icon-inline-index.data.ts","../../../../libs/angular-ui-kit/src/lib/icon/icon-inline-lookup.ts","../../../../libs/angular-ui-kit/src/lib/icon/icon-svg-builder.ts","../../../../libs/angular-ui-kit/src/lib/icon/icon-placeholder.ts","../../../../libs/angular-ui-kit/src/lib/icon/icon-trusted-types.ts","../../../../libs/angular-ui-kit/src/lib/icon/icon-dom.ts","../../../../libs/angular-ui-kit/src/lib/icon/icon-registry.ts","../../../../libs/angular-ui-kit/src/lib/icon/icon-set-loader.ts","../../../../libs/angular-ui-kit/src/lib/icon/icon.component.ts","../../../../libs/angular-ui-kit/src/lib/icon/icon.component.html","../../../../libs/angular-ui-kit/src/lib/icon/icon-catalog.ts"],"sourcesContent":["/**\n * Alias map for non-Tabler icon names.\n *\n * `lc-icon` serves the **Tabler** icon set, but components across the ecosystem\n * frequently reference **Heroicon** (and a few Material Design) names, which use\n * different identifiers. Each entry here maps such an alias to its Tabler\n * equivalent so HTTP loading resolves correctly.\n *\n * This map is part of the public API so consumers can see exactly which\n * non-Tabler names are supported (and lint against them). Every key is also\n * included in {@link ICON_NAMES} as a valid `lc-icon` name.\n *\n * @see ICON_NAMES\n * @see isValidIconName\n */\nexport const ICON_ALIASES: Readonly<Record<string, string>> = {\n // ── Material Design aliases ──\n account_balance: 'building-bank',\n analytics: 'chart-line',\n notifications_active: 'bell-ringing',\n today: 'calendar',\n create: 'pencil',\n done: 'check',\n error: 'circle-x',\n run: 'play',\n copy: 'copy',\n\n // ── Heroicon → Tabler name map ──\n // Components reference Heroicon names, but the served icon set is Tabler,\n // which uses different names. Translate them here so HTTP loading resolves.\n 'magnifying-glass': 'search',\n 'cog-6-tooth': 'settings',\n 'cog-8-tooth': 'settings',\n cog: 'settings',\n 'x-mark': 'x',\n 'x-circle': 'circle-x',\n 'check-circle': 'circle-check',\n 'information-circle': 'info-circle',\n 'exclamation-circle': 'alert-circle',\n 'exclamation-triangle': 'alert-triangle',\n 'arrow-trending-up': 'trending-up',\n 'arrow-trending-down': 'trending-down',\n 'trending-up': 'trending-up',\n 'trending-down': 'trending-down',\n 'arrow-up': 'arrow-up',\n 'arrow-down': 'arrow-down',\n 'arrow-left': 'arrow-left',\n 'arrow-right': 'arrow-right',\n 'arrow-down-tray': 'download',\n 'arrow-up-tray': 'upload',\n 'arrow-top-right-on-square': 'external-link',\n 'arrows-pointing-out': 'arrows-maximize',\n 'arrows-pointing-in': 'arrows-minimize',\n document: 'file',\n 'document-text': 'file-text',\n 'document-duplicate': 'copy',\n 'clipboard-document': 'clipboard',\n 'clipboard-document-check': 'clipboard-check',\n 'clipboard-document-list': 'clipboard-list',\n 'archive-box': 'archive',\n 'cpu-chip': 'cpu',\n 'puzzle-piece': 'puzzle',\n 'paper-airplane': 'send',\n 'presentation-chart-bar': 'presentation-analytics',\n 'chat-bubble-left': 'message-circle',\n 'chat-bubble-left-right': 'messages',\n 'building-office': 'building',\n 'rocket-launch': 'rocket',\n // Heroicon's logout arrow — v2 name plus the v1 spelling still in the wild.\n 'arrow-right-start-on-rectangle': 'logout',\n 'arrow-right-on-rectangle': 'logout',\n folder: 'folder',\n 'folder-open': 'folder-open',\n envelope: 'mail',\n bell: 'bell',\n 'bell-alert': 'bell-ringing',\n trash: 'trash',\n users: 'users',\n 'user-group': 'users',\n 'user-circle': 'user-circle',\n 'credit-card': 'credit-card',\n 'currency-dollar': 'currency-dollar',\n 'globe-alt': 'world',\n 'map-pin': 'map-pin',\n phone: 'phone',\n heart: 'heart',\n inbox: 'inbox',\n sparkles: 'sparkles',\n 'shield-check': 'shield-check',\n truck: 'truck',\n 'cloud-arrow-up': 'cloud-upload',\n 'cloud-arrow-down': 'cloud-download',\n 'eye-slash': 'eye-off',\n 'lock-closed': 'lock',\n 'lock-open': 'lock-open',\n locked: 'lock',\n identification: 'id',\n 'chart-bar': 'chart-bar',\n 'chart-bar-square': 'chart-bar',\n 'chevron-up': 'chevron-up',\n 'chevron-down': 'chevron-down',\n 'chevron-left': 'chevron-left',\n 'chevron-right': 'chevron-right',\n 'bars-3': 'menu-2',\n 'bars-3-bottom-left': 'menu-2',\n 'bars-3-bottom-right': 'menu-2',\n 'ellipsis-horizontal': 'dots',\n 'ellipsis-vertical': 'dots-vertical',\n bold: 'bold',\n italic: 'italic',\n underline: 'underline',\n share: 'share',\n percent: 'percentage',\n 'plus-circle': 'circle-plus',\n 'minus-circle': 'circle-minus',\n};\n","// AUTO-GENERATED by scripts/generate-icon-names.mjs — do not edit by hand.\n// Regenerate with: node scripts/generate-icon-names.mjs\n\n/**\n * The keys of the kit's inline set without their markup (3.6, AS-17): which\n * names rendered from bundled markup in 3.5.1. `lc-icon` needs them to keep\n * 3.5.1's lookup order (and `isInlineIconName`) while the markup itself lives\n * in `@lifecorner/angular-ui-kit/icons` and the lazy `internal/icon-set`.\n * Space-joined, split on first use.\n */\n\n/** The hand-picked keys (`INLINE_ICON_SVGS`); each has an outline and a solid glyph. */\nexport const INLINE_HAND_KEYS =\n 'home chart-bar-square light-bulb banknotes play-circle x-mark bars-3 globe-alt calendar hashtag sun moon user chevron-down chevron-up eye eye-slash check-circle exclamation-triangle information-circle exclamation-circle clock arrow-path building-library arrow-trending-up arrow-trending-down percent-badge presentation-chart-line bell-alert pencil play check document-duplicate chart-bar bolt star plus bell-slash';\n\n/** The inlined Tabler keys (`INLINE_TABLER_SVGS`) with an outline glyph. */\nexport const INLINE_TABLER_OUTLINE_KEYS =\n 'mail file-text file arrow-right arrow-left external-link world menu-2 x users user-plus settings logout dots wifi-off chevron-right chevron-left login key password shield-check robot plug-connected device-mobile device-desktop device-laptop copy share link trash info-circle circle-check alert-triangle alert-circle circle-x wallet building-bank shield-lock';\n\n/** The inlined Tabler keys with a solid (filled) glyph. */\nexport const INLINE_TABLER_SOLID_KEYS =\n 'mail file-text file external-link world menu-2 x settings dots chevron-right key shield-check device-mobile device-desktop copy link trash info-circle circle-check alert-triangle alert-circle circle-x shield-lock';\n","import type { IconVariant } from './icon.component';\nimport { ICON_ALIASES } from './icon-aliases';\nimport { INLINE_HAND_KEYS, INLINE_TABLER_OUTLINE_KEYS, INLINE_TABLER_SOLID_KEYS } from './icon-inline-index.data';\n\ninterface InlineIndex {\n readonly hand: ReadonlySet<string>;\n readonly tabler: Readonly<Record<IconVariant, ReadonlySet<string>>>;\n}\n\nlet index: InlineIndex | undefined;\n\nfunction inlineIndex(): InlineIndex {\n if (!index) {\n const set = (keys: string) => new Set(keys.split(' '));\n index = {\n hand: set(INLINE_HAND_KEYS),\n tabler: { outline: set(INLINE_TABLER_OUTLINE_KEYS), solid: set(INLINE_TABLER_SOLID_KEYS) },\n };\n }\n return index;\n}\n\n/**\n * The key of the kit glyph a name and variant rendered from in 3.5.1, or\n * `undefined` when the icon has to be fetched. Order (3.3, gap G-7):\n *\n * 1. the hand-picked set by the name as written — many of its keys are\n * aliases themselves (`x-mark`, `check-circle`, `information-circle`);\n * 2. the same set by the alias target;\n * 3. the Tabler icons inlined at build time by the alias target.\n *\n * The two sets share no key, so the key names the glyph (and its `ICON_*`\n * constant). Since 3.6 (AS-17) this knows the keys only; the markup comes\n * from a registered constant or the lazy `internal/icon-set` entry.\n *\n * @internal\n */\nexport function resolveInlineGlyph(name: string, variant: IconVariant): string | undefined {\n // A variant outside the type (an untyped template) had no markup in 3.5.1 either.\n if (variant !== 'outline' && variant !== 'solid') return undefined;\n const resolved = ICON_ALIASES[name] ?? name;\n const { hand, tabler } = inlineIndex();\n if (hand.has(name)) return name;\n if (hand.has(resolved)) return resolved;\n if (tabler[variant].has(resolved)) return resolved;\n return undefined;\n}\n\n/**\n * The `@lifecorner/angular-ui-kit/icons` constant of a glyph key: `x-mark`\n * → `ICON_X_MARK`, solid → `ICON_X_MARK_SOLID`.\n *\n * @internal\n */\nexport function iconConstantName(key: string, variant: IconVariant): string {\n return `ICON_${key.toUpperCase().replace(/-/g, '_')}${variant === 'solid' ? '_SOLID' : ''}`;\n}\n","/**\n * The sink-free SVG builder of `lc-icon` (3.5, gap AS-14).\n *\n * Fetched icon files are not the kit's own strings, so they never go through\n * the `lc-icon` Trusted Types policy. Instead this strict tokenizer reads the\n * text and creates the `<svg>` with `createElementNS`, `setAttribute` and\n * `createTextNode` only — no HTML or XML parser, so no Trusted Types sink in\n * any browser. It accepts a small allow-list: basic shapes with paint and\n * geometry attributes (Tabler's files use only `svg` and `path`). Anything\n * else rejects the whole icon with a reason for the console, and `lc-icon`\n * shows its placeholder. The server renders the kit's bundled icons through\n * it too, so prerendered HTML and the browser carry the same SVG.\n *\n * @internal\n */\n\nexport const SVG_NS = 'http://www.w3.org/2000/svg';\nconst XMLNS_NS = 'http://www.w3.org/2000/xmlns/';\n\n/** Longest accepted input, in characters (Tabler's largest file has 2,666 bytes). */\nexport const MAX_SVG_LENGTH = 32_768;\nconst MAX_DEPTH = 16;\n\n/** Elements an icon may contain; `svg` only as the root. Any other element rejects the icon. */\nconst ELEMENTS: ReadonlySet<string> = new Set([\n 'svg', 'g', 'path', 'circle', 'ellipse', 'line', 'polyline', 'polygon', 'rect', 'text',\n]);\n\n/** Attributes that are kept (in source order); every other one is dropped silently. */\nconst ATTRIBUTES: ReadonlySet<string> = new Set([\n 'viewBox', 'width', 'height', 'preserveAspectRatio', 'class',\n 'd', 'points', 'x', 'y', 'x1', 'y1', 'x2', 'y2', 'cx', 'cy', 'r', 'rx', 'ry', 'transform', 'pathLength',\n 'fill', 'fill-rule', 'fill-opacity', 'clip-rule', 'stroke', 'stroke-width', 'stroke-linecap',\n 'stroke-linejoin', 'stroke-miterlimit', 'stroke-dasharray', 'stroke-dashoffset', 'stroke-opacity',\n 'opacity', 'color', 'vector-effect', 'shape-rendering',\n 'text-anchor', 'dominant-baseline', 'font-family', 'font-size', 'font-weight', 'font-style', 'letter-spacing',\n]);\n\nconst NAMED_ENTITIES: Readonly<Record<string, string>> = { amp: '&', lt: '<', gt: '>', quot: '\"', apos: \"'\" };\nconst ENTITY = /&(?:#x([0-9a-fA-F]{1,6})|#([0-9]{1,7})|(amp|lt|gt|quot|apos));/g;\nconst NAME = /[A-Za-z_][A-Za-z0-9_.:-]*/y;\nconst WHITESPACE = /[ \\t\\r\\n]*/y;\n\n/** The reasons `buildSvg` gives; they end up in the console warning. */\nexport const SVG_REJECTION = {\n tooLarge: 'it is larger than 32 KB',\n doctype: 'a DOCTYPE is not allowed',\n malformed: 'it is not well-formed',\n element: (name: string) => `<${name}> is not allowed`,\n attribute: (name: string) => `the attribute \"${name}\" is not allowed`,\n reference: (value: string) => `a reference to \"${value}\" is not allowed`,\n} as const;\n\n/** The built `<svg>`, or why the text was rejected. */\nexport type SvgBuildResult = { svg: SVGElement; reason?: undefined } | { svg?: undefined; reason: string };\n\nclass SvgRejected extends Error {\n constructor(readonly reason: string) {\n super(reason);\n }\n}\n\n/**\n * Builds an `<svg>` element of `doc` from SVG text, through the allow-list.\n * Never throws for bad input: the result names the reason instead.\n */\nexport function buildSvg(doc: Document, text: string): SvgBuildResult {\n if (text.length > MAX_SVG_LENGTH) return { reason: SVG_REJECTION.tooLarge };\n try {\n return { svg: new SvgBuilder(doc, text).build() };\n } catch (error) {\n if (error instanceof SvgRejected) return { reason: error.reason };\n throw error;\n }\n}\n\n/**\n * Whether the text is meant to be an SVG document (its first element is\n * `<svg>`), as opposed to an HTML page such as a SPA's `index.html` fallback.\n * Only decides which console message `lc-icon` prints; `buildSvg` decides\n * what renders.\n */\nexport function looksLikeSvgDocument(text: string): boolean {\n return /^\\uFEFF?\\s*(?:<\\?xml[^>]*\\?>\\s*)?(?:<!--[\\s\\S]*?-->\\s*)*(?:<!DOCTYPE[^[>]*(?:\\[[\\s\\S]*?\\])?\\s*>\\s*)?(?:<!--[\\s\\S]*?-->\\s*)*<svg[\\s/>]/i.test(\n text,\n );\n}\n\nclass SvgBuilder {\n private i = 0;\n\n constructor(\n private readonly doc: Document,\n private readonly text: string,\n ) {}\n\n build(): SVGElement {\n const { text } = this;\n if (text.charCodeAt(0) === 0xfeff) this.i = 1;\n if (text.startsWith('<?xml', this.i)) {\n const end = text.indexOf('?>', this.i);\n if (end < 0 || !/^<\\?xml[ \\t\\r\\n?]/.test(text.slice(this.i, this.i + 6))) this.reject(SVG_REJECTION.malformed);\n this.i = end + 2;\n }\n this.skipMisc();\n if (text[this.i] !== '<') this.reject(SVG_REJECTION.malformed);\n const root = this.element(1);\n this.skipMisc();\n if (this.i !== text.length) this.reject(SVG_REJECTION.malformed);\n return root;\n }\n\n /** Whitespace and comments around the root element; anything else that starts with `<!` or `<?` is rejected. */\n private skipMisc(): void {\n for (;;) {\n this.skipWhitespace();\n if (this.text.startsWith('<!--', this.i)) this.skipComment();\n else if (this.text.startsWith('<!', this.i) || this.text.startsWith('<?', this.i)) this.rejectMarkupDeclaration();\n else return;\n }\n }\n\n private skipComment(): void {\n const end = this.text.indexOf('-->', this.i + 4);\n if (end < 0) this.reject(SVG_REJECTION.malformed);\n this.i = end + 3;\n }\n\n private rejectMarkupDeclaration(): never {\n const head = this.text.slice(this.i, this.i + 9).toUpperCase();\n this.reject(head.startsWith('<!DOCTYPE') || head.startsWith('<!ENTITY') ? SVG_REJECTION.doctype : SVG_REJECTION.malformed);\n }\n\n private skipWhitespace(): boolean {\n WHITESPACE.lastIndex = this.i;\n WHITESPACE.exec(this.text);\n const moved = WHITESPACE.lastIndex > this.i;\n this.i = WHITESPACE.lastIndex;\n return moved;\n }\n\n private name(): string {\n NAME.lastIndex = this.i;\n const match = NAME.exec(this.text);\n if (!match) this.reject(SVG_REJECTION.malformed);\n this.i = NAME.lastIndex;\n return match[0];\n }\n\n /** One element and its content; the cursor is on its `<`. */\n private element(depth: number): SVGElement {\n const { text } = this;\n this.i++;\n const name = this.name();\n if (depth > MAX_DEPTH) this.reject(SVG_REJECTION.malformed);\n const isRoot = depth === 1;\n if (!ELEMENTS.has(name) || isRoot !== (name === 'svg')) this.reject(SVG_REJECTION.element(name));\n const element = this.doc.createElementNS(SVG_NS, name) as SVGElement;\n\n const seen = new Set<string>();\n let selfClosing = false;\n for (;;) {\n const separated = this.skipWhitespace();\n if (text.startsWith('/>', this.i)) {\n this.i += 2;\n selfClosing = true;\n break;\n }\n if (text[this.i] === '>') {\n this.i++;\n break;\n }\n if (!separated) this.reject(SVG_REJECTION.malformed);\n const attribute = this.name();\n this.skipWhitespace();\n if (text[this.i] !== '=') this.reject(SVG_REJECTION.malformed);\n this.i++;\n this.skipWhitespace();\n const quote = text[this.i];\n if (quote !== '\"' && quote !== \"'\") this.reject(SVG_REJECTION.malformed);\n const end = text.indexOf(quote, this.i + 1);\n if (end < 0) this.reject(SVG_REJECTION.malformed);\n const raw = text.slice(this.i + 1, end);\n if (raw.includes('<')) this.reject(SVG_REJECTION.malformed);\n this.i = end + 1;\n if (seen.has(attribute)) this.reject(SVG_REJECTION.malformed);\n seen.add(attribute);\n // XML attribute-value normalisation: literal tabs and line breaks become spaces.\n this.attribute(element, attribute, this.decode(raw.replace(/[\\t\\r\\n]/g, ' ')), isRoot);\n }\n\n if (!selfClosing) this.content(element, name, depth);\n return element;\n }\n\n private attribute(element: SVGElement, name: string, value: string, isRoot: boolean): void {\n const lower = name.toLowerCase();\n if (lower.startsWith('on')) this.reject(SVG_REJECTION.attribute(name));\n if (lower === 'href' || lower.endsWith(':href')) this.reject(SVG_REJECTION.reference(value));\n if (/url\\s*\\(|javascript:/i.test(value)) this.reject(SVG_REJECTION.reference(value));\n if (name === 'xmlns') {\n if (value !== SVG_NS) this.reject(SVG_REJECTION.malformed);\n if (isRoot) element.setAttributeNS(XMLNS_NS, 'xmlns', value);\n return;\n }\n if (ATTRIBUTES.has(name)) element.setAttribute(name, value);\n }\n\n /** Children and text up to the closing tag of `name`. */\n private content(element: SVGElement, name: string, depth: number): void {\n const { text } = this;\n for (;;) {\n if (this.i >= text.length) this.reject(SVG_REJECTION.malformed);\n if (text.startsWith('</', this.i)) {\n this.i += 2;\n const closing = this.name();\n this.skipWhitespace();\n if (closing !== name || text[this.i] !== '>') this.reject(SVG_REJECTION.malformed);\n this.i++;\n return;\n }\n if (text.startsWith('<!--', this.i)) {\n this.skipComment();\n continue;\n }\n if (text.startsWith('<!', this.i) || text.startsWith('<?', this.i)) this.rejectMarkupDeclaration();\n if (text[this.i] === '<') {\n element.appendChild(this.element(depth + 1));\n continue;\n }\n const next = text.indexOf('<', this.i);\n const end = next < 0 ? text.length : next;\n const value = this.decode(text.slice(this.i, end));\n this.i = end;\n // Text only inside <text>; elsewhere only whitespace, kept so the DOM\n // equals what an XML parser makes of the same string.\n if (name !== 'text' && /[^ \\t\\r\\n]/.test(value)) this.reject(SVG_REJECTION.malformed);\n if (value) element.appendChild(this.doc.createTextNode(value));\n }\n }\n\n /** Resolves the five predefined entities and numeric references; any other `&` rejects the icon. */\n private decode(raw: string): string {\n if (!raw.includes('&')) return raw;\n if (raw.replace(ENTITY, '').includes('&')) this.reject(SVG_REJECTION.malformed);\n return raw.replace(ENTITY, (_, hex: string | undefined, dec: string | undefined, named: string | undefined) => {\n if (named) return NAMED_ENTITIES[named];\n const code = hex ? parseInt(hex, 16) : parseInt(dec ?? '', 10);\n if (!code || code > 0x10ffff || (code >= 0xd800 && code <= 0xdfff)) this.reject(SVG_REJECTION.malformed);\n return String.fromCodePoint(code);\n });\n }\n\n private reject(reason: string): never {\n throw new SvgRejected(reason);\n }\n}\n","/**\n * Visible placeholder rendered when an icon cannot be resolved (unknown name,\n * failed asset load, a dropped response, or a Trusted Types policy the page\n * refused). Deliberately distinct from any real icon — a dashed frame with a\n * \"?\" — so missing icons are immediately obvious instead of showing an empty\n * space or an ambiguous glyph.\n *\n * @internal\n */\nexport const ICON_FALLBACK_SVG =\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\">' +\n '<rect x=\"3.5\" y=\"3.5\" width=\"17\" height=\"17\" rx=\"3\" stroke-dasharray=\"2.5 2.5\" />' +\n '<text x=\"12\" y=\"16.5\" text-anchor=\"middle\" font-size=\"12\" font-weight=\"700\" font-family=\"system-ui, -apple-system, sans-serif\" fill=\"currentColor\" stroke=\"none\">?</text>' +\n '</svg>';\n","import { ICON_FALLBACK_SVG } from './icon-placeholder';\nimport { buildSvg } from './icon-svg-builder';\n\n/**\n * The `lc-icon` Trusted Types policy (3.5, gap AS-14).\n *\n * Bundled icons are the kit's own SVG strings. In a browser with\n * `window.trustedTypes` they are parsed through exactly one policy, named\n * `lc-icon`, whose `createHTML` returns its input only when it is identical\n * to one of those strings and throws for anything else. The policy is created\n * on the first icon render, never at import time and never on the server, and\n * at most once per page: when the page's CSP refuses it, the kit says so once\n * and never asks again. Not exported from the entry.\n *\n * Since 3.6 (AS-17) the kit's strings are no longer all in the bundle. \"The\n * kit's own strings\" are those it was handed as glyphs — registered\n * `ICON_*` constants and the lazily loaded set — plus the placeholder, and\n * each of them must also pass the allow-list builder that fetched icons go\n * through. A registered string that fails it is never parsed.\n *\n * @internal\n */\nexport const ICON_POLICY_NAME = 'lc-icon';\n\n/** The few Trusted Types shapes this module needs, declared locally (no dependency, no global types). */\nexport interface IconTrustedHtml {\n toString(): string;\n}\nexport interface IconPolicyRules {\n createHTML(input: string): string;\n}\ninterface IconPolicy {\n createHTML(input: string): IconTrustedHtml;\n}\ninterface TrustedTypePolicyFactoryLike {\n createPolicy(name: string, rules: IconPolicyRules): IconPolicy;\n}\n\n/** What a page has: a policy, no Trusted Types at all, or a CSP that refused the policy. */\nexport type IconPolicyState = { kind: 'ready'; policy: IconPolicy } | { kind: 'none' } | { kind: 'refused' };\n\nconst NONE: IconPolicyState = { kind: 'none' };\nconst REFUSED: IconPolicyState = { kind: 'refused' };\n\nexport const ICON_POLICY_REFUSED_WARNING =\n '[lc-icon] Icons render a placeholder: the Trusted Types policy \"lc-icon\" could not be created. ' +\n 'Add lc-icon to the trusted-types directive of the Content Security Policy.';\n\n/** One state per page (keyed by its window). */\nlet states = new WeakMap<object, IconPolicyState>();\n/** The strings the kit was handed as glyphs (registered or loaded), and the placeholder. */\nlet offered = new Set<string>([ICON_FALLBACK_SVG]);\n/** The allow-list builder's verdict per offered string, checked once. */\nlet verdicts = new Map<string, boolean>();\n\n/** Hands glyph markup to the policy: a registered constant or a string of the loaded kit set. */\nexport function offerIconSvgs(svgs: Iterable<string>): void {\n for (const svg of svgs) offered.add(svg);\n}\n\n/** Every SVG string the kit was handed so far: registered glyphs, the loaded set and the placeholder. */\nexport function bundledIconSvgs(): ReadonlySet<string> {\n return offered;\n}\n\n/**\n * Whether `svg` may be parsed: it was handed to the kit as a glyph and the\n * allow-list builder accepts it (same rules as a fetched icon).\n */\nexport function isAdmittedIconSvg(doc: Document, svg: string): boolean {\n if (typeof svg !== 'string' || !offered.has(svg)) return false;\n let ok = verdicts.get(svg);\n if (ok === undefined) {\n ok = buildSvg(doc, svg).svg !== undefined;\n verdicts.set(svg, ok);\n }\n return ok;\n}\n\n/** The policy's rules: `createHTML` only, and only for the kit's own strings. */\nexport function iconPolicyRules(doc?: Document): IconPolicyRules {\n return {\n createHTML(input: string): string {\n const owner = doc ?? (typeof document === 'undefined' ? undefined : document);\n if (owner && isAdmittedIconSvg(owner, input)) return input;\n throw new TypeError('lc-icon: not a bundled icon');\n },\n };\n}\n\n/**\n * The page's policy state, creating the policy on the first call in a\n * browser that has Trusted Types. Feature-detected through the window, so\n * it is safe without Trusted Types, in jsdom and in Angular 21 apps.\n */\nexport function iconPolicy(win: Window | null): IconPolicyState {\n if (!win) return NONE;\n const known = states.get(win);\n if (known) return known;\n const factory = (win as unknown as { trustedTypes?: TrustedTypePolicyFactoryLike }).trustedTypes;\n let state: IconPolicyState = NONE;\n if (factory && typeof factory.createPolicy === 'function') {\n try {\n state = { kind: 'ready', policy: factory.createPolicy(ICON_POLICY_NAME, iconPolicyRules(win.document)) };\n } catch {\n state = REFUSED;\n console.warn(ICON_POLICY_REFUSED_WARNING);\n }\n }\n states.set(win, state);\n return state;\n}\n\n/**\n * Forgets the policy state of every page. Unit tests only (a real page must\n * never create the policy twice).\n * @internal\n */\nexport function resetIconPolicy(): void {\n states = new WeakMap();\n offered = new Set([ICON_FALLBACK_SVG]);\n verdicts = new Map();\n}\n","import { buildSvg } from './icon-svg-builder';\nimport { ICON_FALLBACK_SVG } from './icon-placeholder';\nimport { iconPolicy, isAdmittedIconSvg, resetIconPolicy } from './icon-trusted-types';\n\n/**\n * How `lc-icon` turns markup into DOM (3.5, gap AS-14). Every `<svg>` is a\n * fresh element that the component appends to its container; there is no\n * HTML binding and no sanitizer bypass.\n *\n * | Source | Server | Browser without Trusted Types | Browser with the policy | Policy refused |\n * |-------------------|---------|-------------------------------|--------------------------------|----------------|\n * | bundled constant | builder | XML parse of the constant | XML parse of `createHTML(…)` | placeholder (builder) |\n * | fetched text | — | builder | builder | builder |\n *\n * @internal\n */\n\n/** The parsed bundled constants of each page, cloned per instance (the policy runs once per distinct icon). */\nlet parsed = new WeakMap<Document, Map<string, SVGElement>>();\n\n/**\n * A bundled SVG constant as a fresh `<svg>` of `doc`, for the browser. `null`\n * when the page refused the `lc-icon` policy (the caller shows the\n * placeholder through the builder), the constant would not parse, or it was\n * not handed to the kit as a glyph or fails the allow-list (3.6, AS-17).\n */\nexport function parseBundledSvg(doc: Document, markup: string): SVGElement | null {\n const state = iconPolicy(doc.defaultView);\n if (state.kind === 'refused') return null;\n let cache = parsed.get(doc);\n if (!cache) parsed.set(doc, (cache = new Map()));\n let template = cache.get(markup);\n if (!template) {\n // Registered markup is not necessarily the kit's: it passes the\n // allow-list builder before any parser sees it, with or without a policy.\n if (!isAdmittedIconSvg(doc, markup)) return null;\n if (typeof DOMParser === 'undefined') return buildSvg(doc, markup).svg ?? null;\n // With Trusted Types the parser only takes the policy's TrustedHTML; the\n // policy hands back nothing but the kit's own strings.\n const input = state.kind === 'ready' ? state.policy.createHTML(markup) : markup;\n const xml = new DOMParser().parseFromString(input as string, 'image/svg+xml');\n const root = xml.documentElement;\n if (root.nodeName !== 'svg' || xml.getElementsByTagName('parsererror').length > 0) return null;\n template = doc.importNode(root, true) as unknown as SVGElement;\n cache.set(markup, template);\n }\n return template.cloneNode(true) as SVGElement;\n}\n\n/** The placeholder as a fresh `<svg>`: parsed like a bundled icon in the browser, built everywhere else. */\nexport function placeholderSvg(doc: Document, browser: boolean): SVGElement {\n return (browser ? parseBundledSvg(doc, ICON_FALLBACK_SVG) : null) ?? (buildSvg(doc, ICON_FALLBACK_SVG).svg as SVGElement);\n}\n\n/** What the component applies to its `<svg>`; consumer values reach attributes and `style.color` only. */\nexport interface IconDecoration {\n size: string;\n color: string;\n decorative: boolean;\n label: string | undefined;\n}\n\n/** `currentColor` in any letter case, or empty: the stylesheet's `color: inherit` colours the glyph. */\nexport function isDefaultIconColor(color: string): boolean {\n const value = color.trim();\n return value === '' || value.toLowerCase() === 'currentcolor';\n}\n\n/**\n * Sets size, colour and accessibility on the element in place (the order 3.4\n * used). The default colour writes no `style` (3.11.1, G-37: a `style-src\n * 'self'` CSP blocks every `style` attribute in prerendered HTML) and takes\n * back a custom colour of an earlier decoration. A custom colour goes through\n * CSSOM (`style.color`), which such a CSP allows in the browser; never\n * `setAttribute('style', …)` or markup.\n */\nexport function decorateSvg(svg: SVGElement, decoration: IconDecoration): void {\n svg.setAttribute('width', decoration.size);\n svg.setAttribute('height', decoration.size);\n const style = (svg as Partial<ElementCSSInlineStyle>).style;\n if (!isDefaultIconColor(decoration.color)) {\n if (style) style.color = decoration.color;\n } else if (svg.hasAttribute('style')) {\n style?.removeProperty('color');\n if (!svg.getAttribute('style')?.trim()) svg.removeAttribute('style');\n }\n if (decoration.decorative) {\n svg.setAttribute('aria-hidden', 'true');\n svg.removeAttribute('role');\n svg.removeAttribute('aria-label');\n } else {\n svg.setAttribute('role', 'img');\n svg.removeAttribute('aria-hidden');\n if (decoration.label) svg.setAttribute('aria-label', decoration.label);\n else svg.removeAttribute('aria-label');\n }\n}\n\n/**\n * Forgets the parsed constants and the policy state. Unit tests only.\n * @internal\n */\nexport function resetIconRendering(): void {\n parsed = new WeakMap();\n resetIconPolicy();\n}\n","import { InjectionToken, Provider, inject } from '@angular/core';\nimport type { IconVariant } from './icon.component';\nimport { offerIconSvgs } from './icon-trusted-types';\n\n/**\n * One glyph shipped by the kit (3.6, AS-17). Import the constants from\n * `@lifecorner/angular-ui-kit/icons` (`ICON_HOME`, `ICON_X_MARK_SOLID`, …) and\n * register them with {@link provideLcIcons}. Markup you write yourself is not\n * supported: it has to pass the same allow-list as fetched icons, or it\n * renders the placeholder.\n */\nexport interface LcIconDefinition {\n /** The 3.5.1 key of the glyph, e.g. `x-mark` or `mail` (aliases resolve to it). */\n readonly name: string;\n /** The variant the glyph draws. */\n readonly variant: IconVariant;\n /** The SVG markup. */\n readonly svg: string;\n}\n\n/**\n * What a kit glyph does that nobody registered (see {@link LcIconOptions}):\n * `'load'` loads the kit's whole set once, as a lazy chunk, and renders it;\n * `'placeholder'` shows the placeholder and warns, so the set never loads.\n */\nexport type LcIconFallback = 'load' | 'placeholder';\n\n/** App-wide `lc-icon` options. Set them once, in `app.config`. */\nexport interface LcIconOptions {\n /**\n * What a kit glyph does that nobody registered: `'load'` loads the kit's\n * whole set once, as a lazy chunk, and renders it (the 3.5.1 output, a\n * moment later in a client-only render; prerendered HTML is unchanged);\n * `'placeholder'` shows the placeholder and warns once per name (in\n * production too), so the set never loads. With `'placeholder'`,\n * `<lc-icon [strict]=\"true\">` also throws in development. For\n * `unregistered`, the nearest `provideLcIcons` call that sets it wins.\n * @default 'load'\n */\n readonly unregistered?: LcIconFallback;\n}\n\n/**\n * The glyphs one injector registered, linked to the scope above it.\n * @internal\n */\nexport interface IconScope {\n readonly parent: IconScope | null;\n /** Markup by `variant:name`. */\n readonly glyphs: ReadonlyMap<string, string>;\n /** Set by an app's {@link provideLcIcons} call only. */\n readonly unregistered: LcIconFallback | undefined;\n /** `true` for an app's call, `false` for a kit component's own glyphs. */\n readonly byApp: boolean;\n}\n\n/** @internal */\nexport const LC_ICON_SCOPE = new InjectionToken<IconScope>('LC_ICON_SCOPE');\n\ninterface IconContribution {\n readonly icons: readonly LcIconDefinition[];\n readonly options: LcIconOptions;\n}\n\n/** Every provideLcIcons call of one injector (several calls add up). */\nconst LC_ICON_CONTRIBUTIONS = new InjectionToken<readonly IconContribution[]>('LC_ICON_CONTRIBUTIONS');\n\nconst glyphKey = (name: string, variant: IconVariant) => `${variant}:${name}`;\n\nfunction glyphMap(icons: readonly LcIconDefinition[]): Map<string, string> {\n const glyphs = new Map<string, string>();\n for (const icon of icons) glyphs.set(glyphKey(icon.name, icon.variant), icon.svg);\n return glyphs;\n}\n\nfunction parentScope(): IconScope | null {\n return inject(LC_ICON_SCOPE, { skipSelf: true, optional: true });\n}\n\nfunction appScope(): IconScope {\n const glyphs = new Map<string, string>();\n let unregistered: LcIconFallback | undefined;\n for (const { icons, options } of inject(LC_ICON_CONTRIBUTIONS)) {\n for (const [key, svg] of glyphMap(icons)) glyphs.set(key, svg);\n if (options.unregistered) unregistered = options.unregistered;\n }\n offerIconSvgs(glyphs.values());\n return { parent: parentScope(), glyphs, unregistered, byApp: true };\n}\n\n/**\n * Registers kit glyphs for every `lc-icon` below this injector: `app.config`,\n * a route's `providers` or a component's `providers` (3.6, AS-17). Registered\n * glyphs render synchronously, in prerendered HTML too, and only they (plus\n * the kit's internal ones) are bundled. Glyphs add up along the injector tree\n * and across several calls in one injector; for `unregistered`, the nearest\n * call that sets it wins.\n *\n * Without any call, every 3.5.1 name still renders: the kit's set loads once,\n * lazily (see {@link LcIconOptions}).\n *\n * @example\n * ```ts\n * // app.config.ts — provideLcIcons from the icon entry, the ICON_* constants\n * // from the icons entry (@lifecorner/angular-ui-kit/icons).\n * export const appConfig: ApplicationConfig = {\n * providers: [provideLcIcons([ICON_HOME, ICON_MAIL, ICON_X_MARK], { unregistered: 'placeholder' })],\n * };\n * ```\n */\nexport function provideLcIcons(icons: readonly LcIconDefinition[], options: LcIconOptions = {}): Provider[] {\n return [\n { provide: LC_ICON_CONTRIBUTIONS, multi: true, useValue: { icons, options } satisfies IconContribution },\n { provide: LC_ICON_SCOPE, useFactory: appScope },\n ];\n}\n\n/**\n * The glyphs a kit component renders itself (chevrons, close, status icons),\n * for its `viewProviders`. Sets no `unregistered` mode and does not count as\n * the app registering glyphs. Not documented for apps; use\n * {@link provideLcIcons}.\n */\nexport function ɵprovideKitIcons(icons: readonly LcIconDefinition[]): Provider {\n const glyphs = glyphMap(icons);\n return {\n provide: LC_ICON_SCOPE,\n useFactory: (): IconScope => ({ parent: parentScope(), glyphs, unregistered: undefined, byApp: false }),\n };\n}\n\n/**\n * The registered markup for a name and variant, nearest scope first.\n * @internal\n */\nexport function findRegisteredGlyph(scope: IconScope | null, name: string, variant: IconVariant): string | undefined {\n const key = glyphKey(name, variant);\n for (let s = scope; s; s = s.parent) {\n const svg = s.glyphs.get(key);\n if (svg !== undefined) return svg;\n }\n return undefined;\n}\n\n/**\n * The nearest `unregistered` setting, `'load'` when nobody set one.\n * @internal\n */\nexport function unregisteredFallback(scope: IconScope | null): LcIconFallback {\n for (let s = scope; s; s = s.parent) if (s.unregistered) return s.unregistered;\n return 'load';\n}\n\n/**\n * Whether the app registers glyphs anywhere above this scope.\n * @internal\n */\nexport function appRegistersIcons(scope: IconScope | null): boolean {\n for (let s = scope; s; s = s.parent) if (s.byApp) return true;\n return false;\n}\n","import type { IconVariant } from './icon.component';\n\n/**\n * The kit's whole 3.5.1 inline set, loaded lazily (3.6, AS-17).\n *\n * `lc-icon` asks for it only when a 3.5.1 inline name renders that nobody\n * registered and the app keeps `unregistered: 'load'` (the default). The\n * dynamic `import()` of the internal entry makes bundlers emit the set as a\n * separate chunk, fetched once per page; on the server it is read from the\n * server bundle. A failed import is forgotten, so the next icon tries again.\n *\n * @internal\n */\nexport interface LoadedIconSet {\n /** The markup of a glyph key (see `resolveInlineGlyph`) and variant. */\n svg(key: string, variant: IconVariant): string | undefined;\n}\n\nlet loading: Promise<LoadedIconSet> | null = null;\nlet loaded: LoadedIconSet | null = null;\n\n/** The set when it has loaded already (then icons render synchronously), else `null`. */\nexport function loadedIconSet(): LoadedIconSet | null {\n return loaded;\n}\n\n/** Loads the set once per page; concurrent callers share the request. */\nexport function loadIconSet(): Promise<LoadedIconSet> {\n if (!loading) {\n loading = import('@lifecorner/angular-ui-kit/internal/icon-set').then(\n ({ INLINE_ICON_SVGS, INLINE_TABLER_SVGS }) => {\n const set: LoadedIconSet = {\n svg: (key, variant) => INLINE_ICON_SVGS[key]?.[variant] ?? INLINE_TABLER_SVGS[key]?.[variant],\n };\n loaded = set;\n return set;\n },\n (error: unknown) => {\n loading = null;\n throw error;\n },\n );\n }\n return loading;\n}\n\n/**\n * Forgets the loaded set. Unit tests only.\n * @internal\n */\nexport function resetIconSet(): void {\n loading = null;\n loaded = null;\n}\n","import {\n Component,\n ElementRef,\n input,\n computed,\n signal,\n effect,\n isDevMode,\n ChangeDetectionStrategy,\n inject,\n PendingTasks,\n PLATFORM_ID,\n viewChild,\n} from '@angular/core';\nimport { DOCUMENT, isPlatformBrowser } from '@angular/common';\nimport { HttpClient, HttpErrorResponse } from '@angular/common/http';\nimport { Observable, catchError, map, of, retry, shareReplay, tap, throwError, timer } from 'rxjs';\nimport { isValidIconName } from '@lifecorner/angular-ui-kit/icon-names';\nimport { ICON_ALIASES } from './icon-aliases';\nimport { iconConstantName, resolveInlineGlyph } from './icon-inline-lookup';\nimport { buildSvg, looksLikeSvgDocument } from './icon-svg-builder';\nimport { decorateSvg, parseBundledSvg, placeholderSvg } from './icon-dom';\nimport { LC_ICON_SCOPE, appRegistersIcons, findRegisteredGlyph, unregisteredFallback } from './icon-registry';\nimport { loadIconSet, loadedIconSet } from './icon-set-loader';\nimport { offerIconSvgs } from './icon-trusted-types';\n\nexport type IconVariant = 'outline' | 'solid';\nexport type IconSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n\n/**\n * The form every icon name has (all 5,161 do): lower-case words joined by `-`\n * or `_`, at most 64 characters. Production builds check names by this form\n * only; the full list is for development builds (3.5, AS-15).\n */\nconst ICON_NAME_FORM = /^[a-z0-9]+(?:[-_][a-z0-9]+)*$/;\nconst MAX_ICON_NAME_LENGTH = 64;\n\n/**\n * Icon names already reported to the console. A page with dozens of instances\n * of the same typo must produce exactly one warning, not one per instance —\n * and the warning fires in production too (unlike the old dev-only warning,\n * which left prod incidents invisible in the console).\n */\nconst warnedIconNames = new Set<string>();\n\nfunction warnOnce(name: string, message: string): void {\n if (warnedIconNames.has(name)) return;\n warnedIconNames.add(name);\n console.warn(message);\n}\n\n/**\n * Clears the warn-once-per-name registry. Only needed by unit tests that\n * assert on console warnings across multiple cases.\n * @internal\n */\nexport function resetIconWarnings(): void {\n warnedIconNames.clear();\n}\n\nconst unknownIconMessage = (name: string) =>\n `[lc-icon] Unknown icon \"${name}\". Use a Tabler name or a documented alias (see ICON_NAMES / ICON_ALIASES). Rendering a placeholder instead.`;\n\n/** 3.6 (AS-17): a kit glyph that nobody registered with provideLcIcons(). */\nconst unregisteredMessage = (name: string, constant: string, outcome: string) =>\n `[lc-icon] \"${name}\" is not registered. Add ${constant} from @lifecorner/angular-ui-kit/icons to provideLcIcons(). ${outcome}`;\n\nconst iconSetFailedMessage = (reason: string) =>\n `[lc-icon] The kit's icon set could not be loaded (${reason}). Rendering a placeholder instead.`;\n\n/**\n * Outcome of one asset fetch. A 404 is an outcome too, so the cache keeps it\n * and a later instance of the same missing name asks no second time.\n */\ntype IconFetchResult =\n | { kind: 'svg'; svg: SVGElement }\n | { kind: 'non-svg'; contentType: string }\n | { kind: 'dropped'; reason: string }\n | { kind: 'failed'; status: string };\n\n/**\n * One in-flight/completed fetch per asset path, shared by every `lc-icon`\n * instance on the page (a table with 200 rows of the same status icon used to\n * fire 200 identical requests). Transient failures are evicted so the next\n * instance tries again; a completed one — valid, dropped or 404 — is kept.\n */\nconst iconFetchCache = new Map<string, Observable<IconFetchResult>>();\n\nconst isNotFound = (error: unknown) => error instanceof HttpErrorResponse && error.status === 404;\n\nfunction fetchIcon(http: HttpClient, doc: Document, path: string): Observable<IconFetchResult> {\n let cached = iconFetchCache.get(path);\n if (!cached) {\n cached = http.get(path, { observe: 'response', responseType: 'text' }).pipe(\n // Transient failures (connection reset, timeout, 5xx) — e.g. a burst of\n // icons overwhelming the dev server — are retried with a short backoff\n // before falling back, so a hiccup does not leave an otherwise-valid\n // icon stuck on the placeholder. A genuine 404 (missing asset) is not\n // retried.\n retry({\n count: 2,\n delay: (error, retryCount) => (isNotFound(error) ? throwError(() => error) : timer(200 * retryCount)),\n }),\n // Validate before anything touches the DOM: SPA deployments answer\n // missing asset paths with `index.html` and status 200 — that document\n // must be dropped, never rendered. A text/html content-type is rejected\n // outright; everything else is rebuilt through the allow-list builder,\n // which creates the <svg> node by node and never hands text to a parser.\n map((response): IconFetchResult => {\n const contentType = response.headers.get('content-type') ?? '';\n const body = response.body ?? '';\n if (contentType.includes('text/html') || !looksLikeSvgDocument(body)) return { kind: 'non-svg', contentType };\n const built = buildSvg(doc, body);\n return built.svg ? { kind: 'svg', svg: built.svg } : { kind: 'dropped', reason: built.reason };\n }),\n catchError((error: unknown) => (isNotFound(error) ? of<IconFetchResult>({ kind: 'failed', status: '404' }) : throwError(() => error))),\n tap({ error: () => iconFetchCache.delete(path) }),\n shareReplay({ bufferSize: 1, refCount: false })\n );\n iconFetchCache.set(path, cached);\n }\n return cached;\n}\n\n/**\n * Clears the shared per-path fetch cache. Only needed by unit tests, whose\n * `HttpTestingController` is recreated per test.\n * @internal\n */\nexport function resetIconCache(): void {\n iconFetchCache.clear();\n}\n\n/**\n * What the container shows: nothing, a bundled constant, a fetched (built)\n * icon, or the placeholder. `pending` waits for the kit's lazy set (3.6): the\n * container stays as it is, so a prerendered `<svg>` survives hydration.\n */\ntype IconSource =\n | { kind: 'none' }\n | { kind: 'pending' }\n | { kind: 'bundled'; markup: string }\n | { kind: 'fetched'; svg: SVGElement }\n | { kind: 'placeholder' };\n\nconst NO_ICON: IconSource = { kind: 'none' };\nconst PENDING: IconSource = { kind: 'pending' };\nconst PLACEHOLDER: IconSource = { kind: 'placeholder' };\n\n/**\n * Icon component - Tabler Icons wrapper for displaying SVG icons\n *\n * Features:\n * - Signal-based reactive API\n * - Support for outline and solid variants\n * - Multiple size options (xs, sm, md, lg, xl)\n * - Custom color support (CSS colors, variables)\n * - Accessibility attributes (ARIA labels, decorative icons)\n * - Inline SVGs for the common icons (a hand-picked set plus Tabler icons\n * inlined at build time, see {@link isInlineIconName}): no request, they\n * render offline and in prerendered HTML; looked up by the name as written,\n * then by its alias target\n * - Tree-shakable glyphs (3.6, AS-17): register the ones an app renders with\n * `provideLcIcons([ICON_HOME, …])` (constants from\n * `@lifecorner/angular-ui-kit/icons`); only those, and the glyphs the kit's\n * own components render, are bundled. A registered glyph renders\n * synchronously. An inline name that nobody registered loads the kit's whole\n * set once, lazily (`unregistered: 'load'`, the default: the 3.5.1 output,\n * prerendered HTML unchanged), or shows the placeholder and warns\n * (`unregistered: 'placeholder'`)\n * - Dynamic SVG loading from Tabler Icons for everything else\n * - Fail-loud on unknown names: a console warning (once per name, in dev AND\n * prod) + a visible placeholder (never a silent empty space). Development\n * builds check every name against {@link ICON_NAMES} / {@link isValidIconName}\n * and request **no** unknown name, because in SPA deployments the server\n * answers missing asset paths with the index.html fallback. Production\n * builds leave the ~5,000 names out of the bundle (3.5, AS-15): they check\n * a name only by its form, request a well-formed unknown name once per\n * page, and show the placeholder when the answer is not an icon. See\n * {@link ICON_ALIASES} for the supported Heroicon/Material aliases.\n * - Fetched responses are validated before anything reaches the page: a\n * `text/html` or non-SVG response (e.g. the SPA index.html fallback) is\n * dropped, and an SVG is rebuilt from an allow-list — basic shapes (`g`,\n * `path`, `circle`, `ellipse`, `line`, `polyline`, `polygon`, `rect`,\n * `text`) with paint and geometry attributes. Scripts, event handlers,\n * references (`href`, `url(…)`) and anything else drop the icon, which\n * then shows the placeholder.\n * - One request per asset path per page (shared cache, a 404 included); a\n * name change cancels the instance's pending load so a slow old response\n * never overwrites the newer icon; `size` / `color` / `decorative` /\n * `ariaLabel` re-decorate the rendered `<svg>` in place, without refetching.\n *\n * **Trusted Types** (3.5, AS-14): bundled icons go through one policy,\n * `lc-icon`, created on the first icon render; it accepts only the kit's own\n * SVG strings. If your Content Security Policy enforces Trusted Types, add\n * `lc-icon` to its `trusted-types` directive (with two copies of the kit on\n * one page, the second needs `'allow-duplicates'`). Fetched icons need no\n * policy: they are rebuilt node by node from the allow-list above. When the\n * page refuses the policy, bundled icons show the placeholder and the console\n * says so once. No sanitizer bypass, no HTML binding.\n *\n * @example\n * ```html\n * <!-- Basic usage -->\n * <lc-icon name=\"user\" />\n *\n * <!-- With variant and size -->\n * <lc-icon name=\"check\" variant=\"solid\" size=\"lg\" />\n *\n * <!-- With custom color -->\n * <lc-icon name=\"arrow-right\" color=\"#FF5733\" />\n *\n * <!-- With CSS variable color -->\n * <lc-icon name=\"star\" color=\"var(--color-primary-500)\" />\n *\n * <!-- With accessibility label -->\n * <lc-icon name=\"user\" ariaLabel=\"User profile\" />\n *\n * <!-- Decorative icon (hidden from screen readers) -->\n * <lc-icon name=\"sparkles\" [decorative]=\"true\" />\n *\n * <!-- Strict: throw in dev when the name is unknown (catch typos in CI) -->\n * <lc-icon name=\"beaker\" [strict]=\"true\" />\n * ```\n */\n@Component({\n selector: 'lc-icon',\n standalone: true,\n imports: [],\n templateUrl: './icon.component.html',\n styleUrls: ['./icon.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class IconComponent {\n private readonly http = inject(HttpClient);\n private readonly doc = inject(DOCUMENT);\n /**\n * Fetching needs a browser; the server renders inline icons and the\n * placeholder (through the allow-list builder) and leaves fetched names\n * empty — the client takes over on hydration.\n */\n private readonly isBrowser = isPlatformBrowser(inject(PLATFORM_ID));\n /** The registered glyphs above this icon (3.6, AS-17): kit components' own, then the app's. */\n private readonly scope = inject(LC_ICON_SCOPE, { optional: true });\n /** Keeps the server (and `whenStable()`) waiting while the kit's set loads. */\n private readonly pendingTasks = inject(PendingTasks);\n private readonly container = viewChild.required<ElementRef<HTMLElement>>('container');\n /** Whether the container was written once; until then a pending icon leaves a prerendered `<svg>` alone. */\n private rendered = false;\n\n /**\n * Icon name from Tabler Icons library\n * @example \"user\", \"check\", \"arrow-right\"\n */\n readonly name = input<string>('');\n\n /**\n * Icon variant (outline or solid)\n * @default \"outline\"\n */\n readonly variant = input<IconVariant>('outline');\n\n /**\n * Icon size\n * - xs: 16px\n * - sm: 20px\n * - md: 24px (default)\n * - lg: 32px\n * - xl: 40px\n *\n * Set by the `icon-<size>` class in the component stylesheet; `lc-icon`\n * writes no inline size (3.11.1).\n * @default \"md\"\n */\n readonly size = input<IconSize>('md');\n\n /**\n * Icon colour. By default the icon takes the text colour of its parent\n * (`currentColor`, through the stylesheet) and `lc-icon` renders **no\n * `style` attribute**, so it works under a `style-src 'self'` CSP (3.11.1).\n *\n * Any other value, a CSS colour (`#FF5733`, `rgb(…)`) or a variable\n * (`var(--color-primary-500)`), becomes the `<svg>`'s inline `color`, set\n * through CSSOM, which such a CSP allows in the browser. In prerendered HTML\n * it is a `style` attribute, which that CSP blocks until the app hydrates,\n * so the icon shows the parent's colour until then. Under a strict CSP,\n * colour the icon from your stylesheet instead: set `color` on `lc-icon` or\n * on its parent. `currentColor` in any letter case, and an empty string,\n * mean the default.\n * @default \"currentColor\"\n */\n readonly color = input<string>('currentColor');\n\n /**\n * Accessible label for screen readers\n * Required if icon has semantic meaning\n */\n readonly ariaLabel = input<string>();\n\n /**\n * Whether icon is purely decorative (hidden from screen readers)\n * @default false\n */\n readonly decorative = input<boolean>(false);\n\n /**\n * Strict mode. When `true` and the name is not a valid icon (see\n * {@link isValidIconName}), the component **throws** in development mode\n * instead of only warning — useful as a CI guard to catch typos/unknown\n * names. With `provideLcIcons(…, { unregistered: 'placeholder' })` (3.6), a\n * kit glyph that is not registered also throws in development. No effect in\n * production builds.\n * @default false\n */\n readonly strict = input<boolean>(false);\n\n /**\n * What the container shows for the current name/variant. Loading writes\n * here; the element and its decoration are derived below.\n */\n private readonly source = signal<IconSource>(NO_ICON);\n\n /**\n * A fresh `<svg>` for the current source, undecorated. It depends on the\n * source only, so a change of `size`, `color`, `decorative` or `ariaLabel`\n * re-decorates the same element instead of building a new one.\n */\n private readonly svgElement = computed<SVGElement | null>(() => {\n const source = this.source();\n switch (source.kind) {\n case 'none':\n case 'pending':\n return null;\n case 'fetched':\n return source.svg.cloneNode(true) as SVGElement;\n case 'bundled': {\n const svg = this.isBrowser ? parseBundledSvg(this.doc, source.markup) : (buildSvg(this.doc, source.markup).svg ?? null);\n return svg ?? placeholderSvg(this.doc, this.isBrowser);\n }\n case 'placeholder':\n return placeholderSvg(this.doc, this.isBrowser);\n }\n });\n\n /**\n * Computed path to SVG file\n * @internal\n */\n readonly iconPath = computed(() => {\n const rawName = this.name();\n const iconVariant = this.variant();\n if (!rawName) return '';\n const iconName = ICON_ALIASES[rawName] ?? rawName;\n const tablerVariant = iconVariant === 'solid' ? 'filled' : 'outline';\n return `/tabler-icons/${tablerVariant}/${iconName}.svg`;\n });\n\n /**\n * Computed size in pixels, for the svg's `width`/`height` attributes; the\n * same values as the `icon-<size>` rules in icon.component.scss\n * @internal\n */\n readonly sizeInPixels = computed(() => {\n const sizeMap: Record<IconSize, string> = {\n xs: '16px',\n sm: '20px',\n md: '24px',\n lg: '32px',\n xl: '40px',\n };\n return sizeMap[this.size()];\n });\n\n /**\n * Computed CSS classes\n * @internal\n */\n readonly computedClasses = computed(() => {\n const classes = ['icon-container', `icon-${this.size()}`, `icon-${this.variant()}`];\n\n return classes.join(' ');\n });\n\n /**\n * The `color` input as handed to the svg: a custom value becomes its inline\n * colour (CSSOM), the default writes nothing (see `decorateSvg`)\n * @internal\n */\n readonly colorStyle = computed(() => {\n return this.color();\n });\n\n constructor() {\n // Resolve the source when name or variant changes.\n effect((onCleanup) => {\n const rawName = this.name();\n const iconVariant = this.variant();\n\n if (!rawName) {\n this.source.set(NO_ICON);\n return;\n }\n\n // Fail loud on names outside the canonical set (typos, un-aliased\n // Heroicon names, …), once per name. Development builds check the full\n // list and never fetch an unknown name: in SPA deployments the server\n // answers missing asset paths with the index.html fallback (status 200).\n // Production builds fold this branch away (ngDevMode is false there),\n // so the list stays out of the bundle; they check the name's form and\n // validate whatever the server answers instead.\n if (typeof ngDevMode === 'undefined' || ngDevMode) {\n if (!isValidIconName(rawName)) {\n warnOnce(rawName, unknownIconMessage(rawName));\n if (isDevMode() && this.strict()) {\n throw new Error(\n `[lc-icon] Unknown icon \"${rawName}\" (strict mode). Use a Tabler name or a documented alias.`\n );\n }\n this.source.set(PLACEHOLDER);\n return;\n }\n } else if (rawName.length > MAX_ICON_NAME_LENGTH || !ICON_NAME_FORM.test(rawName)) {\n warnOnce(rawName, unknownIconMessage(rawName));\n this.source.set(PLACEHOLDER);\n return;\n }\n\n // A registered glyph first (no request; renders synchronously, offline\n // and in prerendered HTML): by the name as written, then by its alias\n // target (G-7), nearest scope first (3.6, AS-17).\n const aliasTarget = ICON_ALIASES[rawName] ?? rawName;\n const registered =\n findRegisteredGlyph(this.scope, rawName, iconVariant) ??\n (aliasTarget === rawName ? undefined : findRegisteredGlyph(this.scope, aliasTarget, iconVariant));\n if (registered !== undefined) {\n offerIconSvgs([registered]);\n this.source.set({ kind: 'bundled', markup: registered });\n return;\n }\n\n // A 3.5.1 inline name nobody registered: the kit's whole set, loaded\n // once and lazily ('load', the default), or the placeholder.\n const glyph = resolveInlineGlyph(rawName, iconVariant);\n if (glyph) {\n this.resolveUnregistered(rawName, glyph, iconVariant, onCleanup);\n return;\n }\n\n // Everything else is fetched, in the browser only. While it loads the\n // container is empty (it keeps its px size).\n const path = this.iconPath();\n this.source.set(NO_ICON);\n if (!path || !this.isBrowser) return;\n\n const subscription = fetchIcon(this.http, this.doc, path).subscribe({\n next: (result) => {\n switch (result.kind) {\n case 'svg':\n this.source.set({ kind: 'fetched', svg: result.svg });\n return;\n case 'non-svg':\n warnOnce(\n rawName,\n `[lc-icon] \"${rawName}\": ${path} returned non-SVG content` +\n (result.contentType ? ` (${result.contentType})` : '') +\n ' — dropped. In SPA deployments this is typically the index.html fallback for a missing asset.'\n );\n break;\n case 'dropped':\n warnOnce(\n rawName,\n `[lc-icon] \"${rawName}\": ${path} was dropped: ${result.reason}. Fetched icons may contain only basic shapes with paint and geometry attributes. Rendering a placeholder instead.`\n );\n break;\n case 'failed':\n this.warnLoadFailure(rawName, path, result.status);\n break;\n }\n this.source.set(PLACEHOLDER);\n },\n error: (error: unknown) => {\n // Asset unreachable after the retries: render a visible placeholder\n // so the gap is obvious rather than an empty space.\n this.warnLoadFailure(rawName, path, error instanceof HttpErrorResponse && error.status ? String(error.status) : 'network error');\n this.source.set(PLACEHOLDER);\n },\n });\n // A name/variant change (or destroy) while the load is in flight: stop\n // listening, so a slow old response cannot overwrite the newer icon.\n onCleanup(() => subscription.unsubscribe());\n });\n\n // Put the element into the container and decorate it with the CURRENT\n // inputs. Runs during change detection, so it also runs on the server and\n // the prerendered HTML carries the decorated <svg>. After hydration it\n // replaces the server's <svg> with the client's. Built with the document's\n // own DOM APIs, never the renderer: the renderer would stamp _ngcontent\n // attributes onto every node and change the SVG's DOM.\n effect(() => {\n const host = this.container().nativeElement;\n // Waiting for the kit's set: leave the first render alone (on hydration\n // the container holds the server's <svg> for exactly this glyph); a\n // later name change empties the box like a fetch does.\n if (this.source().kind === 'pending' && !this.rendered) return;\n this.rendered = true;\n const svg = this.svgElement();\n if (svg) {\n decorateSvg(svg, {\n size: this.sizeInPixels(),\n color: this.colorStyle(),\n decorative: this.decorative(),\n label: this.ariaLabel(),\n });\n }\n const inPlace = svg ? host.childNodes.length === 1 && host.firstChild === svg : host.childNodes.length === 0;\n if (inPlace) return;\n while (host.firstChild) host.removeChild(host.firstChild);\n if (svg) host.appendChild(svg);\n });\n }\n\n /**\n * A 3.5.1 inline name that no scope registered (3.6, AS-17). `'load'`\n * renders it from the kit's lazily loaded set: synchronously once the set\n * is there, otherwise after the chunk, with the server and `whenStable()`\n * waiting through `PendingTasks`. `'placeholder'` never loads the set.\n */\n private resolveUnregistered(\n name: string,\n glyph: string,\n variant: IconVariant,\n onCleanup: (cleanup: () => void) => void,\n ): void {\n const constant = iconConstantName(glyph, variant);\n if (unregisteredFallback(this.scope) === 'placeholder') {\n warnOnce(`${variant}:${name}`, unregisteredMessage(name, constant, 'Rendering a placeholder instead.'));\n if (isDevMode() && this.strict()) {\n throw new Error(`[lc-icon] \"${name}\" is not registered (strict mode). Add ${constant} to provideLcIcons().`);\n }\n this.source.set(PLACEHOLDER);\n return;\n }\n // Only an app that registers glyphs wants to hear about the ones it\n // missed; an app that opted into nothing gets 3.5.1's output quietly.\n if ((typeof ngDevMode === 'undefined' || ngDevMode) && appRegistersIcons(this.scope)) {\n warnOnce(`${variant}:${name}`, unregisteredMessage(name, constant, \"Loading the kit's icon set instead.\"));\n }\n const set = loadedIconSet();\n if (set) {\n this.showFromSet(set.svg(glyph, variant));\n return;\n }\n this.source.set(PENDING);\n let current = true;\n onCleanup(() => (current = false));\n const done = this.pendingTasks.add();\n loadIconSet()\n .then(\n (loaded) => {\n if (current) this.showFromSet(loaded.svg(glyph, variant));\n },\n (error: unknown) => {\n warnOnce('[lc-icon set]', iconSetFailedMessage(error instanceof Error ? error.message : String(error)));\n if (current) this.source.set(PLACEHOLDER);\n },\n )\n .finally(done);\n }\n\n private showFromSet(markup: string | undefined): void {\n if (markup === undefined) {\n this.source.set(PLACEHOLDER);\n return;\n }\n offerIconSvgs([markup]);\n this.source.set({ kind: 'bundled', markup });\n }\n\n /**\n * A known name whose asset can't be loaded stays quiet in development (as\n * before: unit tests and offline work have no assets). Production can't\n * tell it from a typo — the list isn't there — so it says so, once.\n */\n private warnLoadFailure(name: string, path: string, status: string): void {\n if (typeof ngDevMode === 'undefined' || ngDevMode) return;\n warnOnce(\n name,\n `[lc-icon] \"${name}\": ${path} could not be loaded (${status}) — an unknown name or a missing asset. Rendering a placeholder instead.`\n );\n }\n}\n","<div #container [class]=\"computedClasses()\"></div>\n","// `lc-icon` name helpers (public API). The full name list and `isValidIconName`\n// live in `@lifecorner/angular-ui-kit/icon-names`.\nimport type { IconVariant } from './icon.component';\nimport { resolveInlineGlyph } from './icon-inline-lookup';\n\nexport { ICON_ALIASES } from './icon-aliases';\n\n/**\n * A valid `lc-icon` name.\n *\n * There are ~5000 valid names, so this is intentionally a broad `string` alias\n * rather than a giant union type (which would bloat editors and builds). Prefer\n * runtime validation via {@link isValidIconName}, or lint your usages against\n * the {@link ICON_NAMES} array (also shipped as `icon-names.json`), both from\n * `@lifecorner/angular-ui-kit/icon-names`.\n */\nexport type IconName = string;\n\n/**\n * Whether `name` renders from markup shipped in the kit — no request, so it\n * shows offline and in prerendered HTML (3.3, gap G-7): registered with\n * `provideLcIcons()` or loaded with the kit's set (3.6, AS-17). Covers the\n * hand-picked inline set, the Tabler icons inlined at build time (mail,\n * users, settings, logout, key, chevron-right, …) and aliases that resolve\n * to either — the names of 3.5.1, plus `wallet`, `building-bank` and\n * `shield-lock` since 3.16 (TD-3). Use it to lint an app or a static\n * site against icons that would be fetched.\n *\n * @example\n * ```ts\n * isInlineIconName('x-mark'); // true (hand-picked, by its alias name)\n * isInlineIconName('envelope'); // true (alias of the inlined Tabler `mail`)\n * isInlineIconName('anchor'); // false (fetched from the Tabler assets)\n * isInlineIconName('robot', 'solid'); // false (Tabler has no filled robot)\n * ```\n */\nexport function isInlineIconName(name: string, variant: IconVariant = 'outline'): boolean {\n return resolveInlineGlyph(name, variant) !== undefined;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"lifecorner-angular-ui-kit-icon.mjs","names":[],"sources":["../../../../libs/angular-ui-kit/src/lib/icon/icon-aliases.ts","../../../../libs/angular-ui-kit/src/lib/icon/icon-inline-index.data.ts","../../../../libs/angular-ui-kit/src/lib/icon/icon-inline-lookup.ts","../../../../libs/angular-ui-kit/src/lib/icon/icon-svg-builder.ts","../../../../libs/angular-ui-kit/src/lib/icon/icon-placeholder.ts","../../../../libs/angular-ui-kit/src/lib/icon/icon-trusted-types.ts","../../../../libs/angular-ui-kit/src/lib/icon/icon-dom.ts","../../../../libs/angular-ui-kit/src/lib/icon/icon-registry.ts","../../../../libs/angular-ui-kit/src/lib/icon/icon-set-loader.ts","../../../../libs/angular-ui-kit/src/lib/icon/icon.component.ts","../../../../libs/angular-ui-kit/src/lib/icon/icon.component.html","../../../../libs/angular-ui-kit/src/lib/icon/icon-catalog.ts"],"sourcesContent":["/**\n * Alias map for non-Tabler icon names.\n *\n * `lc-icon` serves the **Tabler** icon set, but components across the ecosystem\n * frequently reference **Heroicon** (and a few Material Design) names, which use\n * different identifiers. Each entry here maps such an alias to its Tabler\n * equivalent so HTTP loading resolves correctly.\n *\n * This map is part of the public API so consumers can see exactly which\n * non-Tabler names are supported (and lint against them). Every key is also\n * included in {@link ICON_NAMES} as a valid `lc-icon` name.\n *\n * @see ICON_NAMES\n * @see isValidIconName\n */\nexport const ICON_ALIASES: Readonly<Record<string, string>> = {\n // ── Material Design aliases ──\n account_balance: 'building-bank',\n analytics: 'chart-line',\n notifications_active: 'bell-ringing',\n today: 'calendar',\n create: 'pencil',\n done: 'check',\n error: 'circle-x',\n run: 'play',\n copy: 'copy',\n\n // ── Heroicon → Tabler name map ──\n // Components reference Heroicon names, but the served icon set is Tabler,\n // which uses different names. Translate them here so HTTP loading resolves.\n 'magnifying-glass': 'search',\n 'cog-6-tooth': 'settings',\n 'cog-8-tooth': 'settings',\n cog: 'settings',\n 'x-mark': 'x',\n 'x-circle': 'circle-x',\n 'check-circle': 'circle-check',\n 'information-circle': 'info-circle',\n 'exclamation-circle': 'alert-circle',\n 'exclamation-triangle': 'alert-triangle',\n 'arrow-trending-up': 'trending-up',\n 'arrow-trending-down': 'trending-down',\n 'trending-up': 'trending-up',\n 'trending-down': 'trending-down',\n 'arrow-up': 'arrow-up',\n 'arrow-down': 'arrow-down',\n 'arrow-left': 'arrow-left',\n 'arrow-right': 'arrow-right',\n 'arrow-down-tray': 'download',\n 'arrow-up-tray': 'upload',\n 'arrow-top-right-on-square': 'external-link',\n 'arrows-pointing-out': 'arrows-maximize',\n 'arrows-pointing-in': 'arrows-minimize',\n document: 'file',\n 'document-text': 'file-text',\n 'document-duplicate': 'copy',\n 'clipboard-document': 'clipboard',\n 'clipboard-document-check': 'clipboard-check',\n 'clipboard-document-list': 'clipboard-list',\n 'archive-box': 'archive',\n 'cpu-chip': 'cpu',\n 'puzzle-piece': 'puzzle',\n 'paper-airplane': 'send',\n 'presentation-chart-bar': 'presentation-analytics',\n 'chat-bubble-left': 'message-circle',\n 'chat-bubble-left-right': 'messages',\n 'building-office': 'building',\n 'rocket-launch': 'rocket',\n // Heroicon's logout arrow — v2 name plus the v1 spelling still in the wild.\n 'arrow-right-start-on-rectangle': 'logout',\n 'arrow-right-on-rectangle': 'logout',\n folder: 'folder',\n 'folder-open': 'folder-open',\n envelope: 'mail',\n bell: 'bell',\n 'bell-alert': 'bell-ringing',\n trash: 'trash',\n users: 'users',\n 'user-group': 'users',\n 'user-circle': 'user-circle',\n 'credit-card': 'credit-card',\n 'currency-dollar': 'currency-dollar',\n 'globe-alt': 'world',\n 'map-pin': 'map-pin',\n phone: 'phone',\n heart: 'heart',\n inbox: 'inbox',\n sparkles: 'sparkles',\n 'shield-check': 'shield-check',\n truck: 'truck',\n 'cloud-arrow-up': 'cloud-upload',\n 'cloud-arrow-down': 'cloud-download',\n 'eye-slash': 'eye-off',\n 'lock-closed': 'lock',\n 'lock-open': 'lock-open',\n locked: 'lock',\n identification: 'id',\n 'chart-bar': 'chart-bar',\n 'chart-bar-square': 'chart-bar',\n 'chevron-up': 'chevron-up',\n 'chevron-down': 'chevron-down',\n 'chevron-left': 'chevron-left',\n 'chevron-right': 'chevron-right',\n 'bars-3': 'menu-2',\n 'bars-3-bottom-left': 'menu-2',\n 'bars-3-bottom-right': 'menu-2',\n 'ellipsis-horizontal': 'dots',\n 'ellipsis-vertical': 'dots-vertical',\n bold: 'bold',\n italic: 'italic',\n underline: 'underline',\n share: 'share',\n percent: 'percentage',\n 'plus-circle': 'circle-plus',\n 'minus-circle': 'circle-minus',\n};\n","// AUTO-GENERATED by scripts/generate-icon-names.mjs — do not edit by hand.\n// Regenerate with: node scripts/generate-icon-names.mjs\n\n/**\n * The keys of the kit's inline set without their markup (3.6, AS-17): which\n * names rendered from bundled markup in 3.5.1. `lc-icon` needs them to keep\n * 3.5.1's lookup order (and `isInlineIconName`) while the markup itself lives\n * in `@lifecorner/angular-ui-kit/icons` and the lazy `internal/icon-set`.\n * Space-joined, split on first use.\n */\n\n/** The hand-picked keys (`INLINE_ICON_SVGS`); each has an outline and a solid glyph. */\nexport const INLINE_HAND_KEYS =\n 'home chart-bar-square light-bulb banknotes play-circle x-mark bars-3 globe-alt calendar hashtag sun moon user chevron-down chevron-up eye eye-slash check-circle exclamation-triangle information-circle exclamation-circle clock arrow-path building-library arrow-trending-up arrow-trending-down percent-badge presentation-chart-line bell-alert pencil play check document-duplicate chart-bar bolt star plus bell-slash';\n\n/** The inlined Tabler keys (`INLINE_TABLER_SVGS`) with an outline glyph. */\nexport const INLINE_TABLER_OUTLINE_KEYS =\n 'mail file-text file arrow-right arrow-left external-link world menu-2 x users user-plus settings logout dots wifi-off chevron-right chevron-left login key password shield-check robot plug-connected device-mobile device-desktop device-laptop copy share link trash info-circle circle-check alert-triangle alert-circle circle-x wallet building-bank shield-lock search lock device-tablet player-play player-pause clipboard arrow-down';\n\n/** The inlined Tabler keys with a solid (filled) glyph. */\nexport const INLINE_TABLER_SOLID_KEYS =\n 'mail file-text file external-link world menu-2 x settings dots chevron-right key shield-check device-mobile device-desktop copy link trash info-circle circle-check alert-triangle alert-circle circle-x shield-lock search lock device-tablet player-play player-pause clipboard';\n","import type { IconVariant } from './icon.component';\nimport { ICON_ALIASES } from './icon-aliases';\nimport { INLINE_HAND_KEYS, INLINE_TABLER_OUTLINE_KEYS, INLINE_TABLER_SOLID_KEYS } from './icon-inline-index.data';\n\ninterface InlineIndex {\n readonly hand: ReadonlySet<string>;\n readonly tabler: Readonly<Record<IconVariant, ReadonlySet<string>>>;\n}\n\nlet index: InlineIndex | undefined;\n\nfunction inlineIndex(): InlineIndex {\n if (!index) {\n const set = (keys: string) => new Set(keys.split(' '));\n index = {\n hand: set(INLINE_HAND_KEYS),\n tabler: { outline: set(INLINE_TABLER_OUTLINE_KEYS), solid: set(INLINE_TABLER_SOLID_KEYS) },\n };\n }\n return index;\n}\n\n/**\n * The key of the kit glyph a name and variant rendered from in 3.5.1, or\n * `undefined` when the icon has to be fetched. Order (3.3, gap G-7):\n *\n * 1. the hand-picked set by the name as written — many of its keys are\n * aliases themselves (`x-mark`, `check-circle`, `information-circle`);\n * 2. the same set by the alias target;\n * 3. the Tabler icons inlined at build time by the alias target.\n *\n * The two sets share no key, so the key names the glyph (and its `ICON_*`\n * constant). Since 3.6 (AS-17) this knows the keys only; the markup comes\n * from a registered constant or the lazy `internal/icon-set` entry.\n *\n * @internal\n */\nexport function resolveInlineGlyph(name: string, variant: IconVariant): string | undefined {\n // A variant outside the type (an untyped template) had no markup in 3.5.1 either.\n if (variant !== 'outline' && variant !== 'solid') return undefined;\n const resolved = ICON_ALIASES[name] ?? name;\n const { hand, tabler } = inlineIndex();\n if (hand.has(name)) return name;\n if (hand.has(resolved)) return resolved;\n if (tabler[variant].has(resolved)) return resolved;\n return undefined;\n}\n\n/**\n * The `@lifecorner/angular-ui-kit/icons` constant of a glyph key: `x-mark`\n * → `ICON_X_MARK`, solid → `ICON_X_MARK_SOLID`.\n *\n * @internal\n */\nexport function iconConstantName(key: string, variant: IconVariant): string {\n return `ICON_${key.toUpperCase().replace(/-/g, '_')}${variant === 'solid' ? '_SOLID' : ''}`;\n}\n","/**\n * The sink-free SVG builder of `lc-icon` (3.5, gap AS-14).\n *\n * Fetched icon files are not the kit's own strings, so they never go through\n * the `lc-icon` Trusted Types policy. Instead this strict tokenizer reads the\n * text and creates the `<svg>` with `createElementNS`, `setAttribute` and\n * `createTextNode` only — no HTML or XML parser, so no Trusted Types sink in\n * any browser. It accepts a small allow-list: basic shapes with paint and\n * geometry attributes (Tabler's files use only `svg` and `path`). Anything\n * else rejects the whole icon with a reason for the console, and `lc-icon`\n * shows its placeholder. The server renders the kit's bundled icons through\n * it too, so prerendered HTML and the browser carry the same SVG.\n *\n * @internal\n */\n\nexport const SVG_NS = 'http://www.w3.org/2000/svg';\nconst XMLNS_NS = 'http://www.w3.org/2000/xmlns/';\n\n/** Longest accepted input, in characters (Tabler's largest file has 2,666 bytes). */\nexport const MAX_SVG_LENGTH = 32_768;\nconst MAX_DEPTH = 16;\n\n/** Elements an icon may contain; `svg` only as the root. Any other element rejects the icon. */\nconst ELEMENTS: ReadonlySet<string> = new Set([\n 'svg', 'g', 'path', 'circle', 'ellipse', 'line', 'polyline', 'polygon', 'rect', 'text',\n]);\n\n/** Attributes that are kept (in source order); every other one is dropped silently. */\nconst ATTRIBUTES: ReadonlySet<string> = new Set([\n 'viewBox', 'width', 'height', 'preserveAspectRatio', 'class',\n 'd', 'points', 'x', 'y', 'x1', 'y1', 'x2', 'y2', 'cx', 'cy', 'r', 'rx', 'ry', 'transform', 'pathLength',\n 'fill', 'fill-rule', 'fill-opacity', 'clip-rule', 'stroke', 'stroke-width', 'stroke-linecap',\n 'stroke-linejoin', 'stroke-miterlimit', 'stroke-dasharray', 'stroke-dashoffset', 'stroke-opacity',\n 'opacity', 'color', 'vector-effect', 'shape-rendering',\n 'text-anchor', 'dominant-baseline', 'font-family', 'font-size', 'font-weight', 'font-style', 'letter-spacing',\n]);\n\nconst NAMED_ENTITIES: Readonly<Record<string, string>> = { amp: '&', lt: '<', gt: '>', quot: '\"', apos: \"'\" };\nconst ENTITY = /&(?:#x([0-9a-fA-F]{1,6})|#([0-9]{1,7})|(amp|lt|gt|quot|apos));/g;\nconst NAME = /[A-Za-z_][A-Za-z0-9_.:-]*/y;\nconst WHITESPACE = /[ \\t\\r\\n]*/y;\n\n/** The reasons `buildSvg` gives; they end up in the console warning. */\nexport const SVG_REJECTION = {\n tooLarge: 'it is larger than 32 KB',\n doctype: 'a DOCTYPE is not allowed',\n malformed: 'it is not well-formed',\n element: (name: string) => `<${name}> is not allowed`,\n attribute: (name: string) => `the attribute \"${name}\" is not allowed`,\n reference: (value: string) => `a reference to \"${value}\" is not allowed`,\n} as const;\n\n/** The built `<svg>`, or why the text was rejected. */\nexport type SvgBuildResult = { svg: SVGElement; reason?: undefined } | { svg?: undefined; reason: string };\n\nclass SvgRejected extends Error {\n constructor(readonly reason: string) {\n super(reason);\n }\n}\n\n/**\n * Builds an `<svg>` element of `doc` from SVG text, through the allow-list.\n * Never throws for bad input: the result names the reason instead.\n */\nexport function buildSvg(doc: Document, text: string): SvgBuildResult {\n if (text.length > MAX_SVG_LENGTH) return { reason: SVG_REJECTION.tooLarge };\n try {\n return { svg: new SvgBuilder(doc, text).build() };\n } catch (error) {\n if (error instanceof SvgRejected) return { reason: error.reason };\n throw error;\n }\n}\n\n/**\n * Whether the text is meant to be an SVG document (its first element is\n * `<svg>`), as opposed to an HTML page such as a SPA's `index.html` fallback.\n * Only decides which console message `lc-icon` prints; `buildSvg` decides\n * what renders.\n */\nexport function looksLikeSvgDocument(text: string): boolean {\n return /^\\uFEFF?\\s*(?:<\\?xml[^>]*\\?>\\s*)?(?:<!--[\\s\\S]*?-->\\s*)*(?:<!DOCTYPE[^[>]*(?:\\[[\\s\\S]*?\\])?\\s*>\\s*)?(?:<!--[\\s\\S]*?-->\\s*)*<svg[\\s/>]/i.test(\n text,\n );\n}\n\nclass SvgBuilder {\n private i = 0;\n\n constructor(\n private readonly doc: Document,\n private readonly text: string,\n ) {}\n\n build(): SVGElement {\n const { text } = this;\n if (text.charCodeAt(0) === 0xfeff) this.i = 1;\n if (text.startsWith('<?xml', this.i)) {\n const end = text.indexOf('?>', this.i);\n if (end < 0 || !/^<\\?xml[ \\t\\r\\n?]/.test(text.slice(this.i, this.i + 6))) this.reject(SVG_REJECTION.malformed);\n this.i = end + 2;\n }\n this.skipMisc();\n if (text[this.i] !== '<') this.reject(SVG_REJECTION.malformed);\n const root = this.element(1);\n this.skipMisc();\n if (this.i !== text.length) this.reject(SVG_REJECTION.malformed);\n return root;\n }\n\n /** Whitespace and comments around the root element; anything else that starts with `<!` or `<?` is rejected. */\n private skipMisc(): void {\n for (;;) {\n this.skipWhitespace();\n if (this.text.startsWith('<!--', this.i)) this.skipComment();\n else if (this.text.startsWith('<!', this.i) || this.text.startsWith('<?', this.i)) this.rejectMarkupDeclaration();\n else return;\n }\n }\n\n private skipComment(): void {\n const end = this.text.indexOf('-->', this.i + 4);\n if (end < 0) this.reject(SVG_REJECTION.malformed);\n this.i = end + 3;\n }\n\n private rejectMarkupDeclaration(): never {\n const head = this.text.slice(this.i, this.i + 9).toUpperCase();\n this.reject(head.startsWith('<!DOCTYPE') || head.startsWith('<!ENTITY') ? SVG_REJECTION.doctype : SVG_REJECTION.malformed);\n }\n\n private skipWhitespace(): boolean {\n WHITESPACE.lastIndex = this.i;\n WHITESPACE.exec(this.text);\n const moved = WHITESPACE.lastIndex > this.i;\n this.i = WHITESPACE.lastIndex;\n return moved;\n }\n\n private name(): string {\n NAME.lastIndex = this.i;\n const match = NAME.exec(this.text);\n if (!match) this.reject(SVG_REJECTION.malformed);\n this.i = NAME.lastIndex;\n return match[0];\n }\n\n /** One element and its content; the cursor is on its `<`. */\n private element(depth: number): SVGElement {\n const { text } = this;\n this.i++;\n const name = this.name();\n if (depth > MAX_DEPTH) this.reject(SVG_REJECTION.malformed);\n const isRoot = depth === 1;\n if (!ELEMENTS.has(name) || isRoot !== (name === 'svg')) this.reject(SVG_REJECTION.element(name));\n const element = this.doc.createElementNS(SVG_NS, name) as SVGElement;\n\n const seen = new Set<string>();\n let selfClosing = false;\n for (;;) {\n const separated = this.skipWhitespace();\n if (text.startsWith('/>', this.i)) {\n this.i += 2;\n selfClosing = true;\n break;\n }\n if (text[this.i] === '>') {\n this.i++;\n break;\n }\n if (!separated) this.reject(SVG_REJECTION.malformed);\n const attribute = this.name();\n this.skipWhitespace();\n if (text[this.i] !== '=') this.reject(SVG_REJECTION.malformed);\n this.i++;\n this.skipWhitespace();\n const quote = text[this.i];\n if (quote !== '\"' && quote !== \"'\") this.reject(SVG_REJECTION.malformed);\n const end = text.indexOf(quote, this.i + 1);\n if (end < 0) this.reject(SVG_REJECTION.malformed);\n const raw = text.slice(this.i + 1, end);\n if (raw.includes('<')) this.reject(SVG_REJECTION.malformed);\n this.i = end + 1;\n if (seen.has(attribute)) this.reject(SVG_REJECTION.malformed);\n seen.add(attribute);\n // XML attribute-value normalisation: literal tabs and line breaks become spaces.\n this.attribute(element, attribute, this.decode(raw.replace(/[\\t\\r\\n]/g, ' ')), isRoot);\n }\n\n if (!selfClosing) this.content(element, name, depth);\n return element;\n }\n\n private attribute(element: SVGElement, name: string, value: string, isRoot: boolean): void {\n const lower = name.toLowerCase();\n if (lower.startsWith('on')) this.reject(SVG_REJECTION.attribute(name));\n if (lower === 'href' || lower.endsWith(':href')) this.reject(SVG_REJECTION.reference(value));\n if (/url\\s*\\(|javascript:/i.test(value)) this.reject(SVG_REJECTION.reference(value));\n if (name === 'xmlns') {\n if (value !== SVG_NS) this.reject(SVG_REJECTION.malformed);\n if (isRoot) element.setAttributeNS(XMLNS_NS, 'xmlns', value);\n return;\n }\n if (ATTRIBUTES.has(name)) element.setAttribute(name, value);\n }\n\n /** Children and text up to the closing tag of `name`. */\n private content(element: SVGElement, name: string, depth: number): void {\n const { text } = this;\n for (;;) {\n if (this.i >= text.length) this.reject(SVG_REJECTION.malformed);\n if (text.startsWith('</', this.i)) {\n this.i += 2;\n const closing = this.name();\n this.skipWhitespace();\n if (closing !== name || text[this.i] !== '>') this.reject(SVG_REJECTION.malformed);\n this.i++;\n return;\n }\n if (text.startsWith('<!--', this.i)) {\n this.skipComment();\n continue;\n }\n if (text.startsWith('<!', this.i) || text.startsWith('<?', this.i)) this.rejectMarkupDeclaration();\n if (text[this.i] === '<') {\n element.appendChild(this.element(depth + 1));\n continue;\n }\n const next = text.indexOf('<', this.i);\n const end = next < 0 ? text.length : next;\n const value = this.decode(text.slice(this.i, end));\n this.i = end;\n // Text only inside <text>; elsewhere only whitespace, kept so the DOM\n // equals what an XML parser makes of the same string.\n if (name !== 'text' && /[^ \\t\\r\\n]/.test(value)) this.reject(SVG_REJECTION.malformed);\n if (value) element.appendChild(this.doc.createTextNode(value));\n }\n }\n\n /** Resolves the five predefined entities and numeric references; any other `&` rejects the icon. */\n private decode(raw: string): string {\n if (!raw.includes('&')) return raw;\n if (raw.replace(ENTITY, '').includes('&')) this.reject(SVG_REJECTION.malformed);\n return raw.replace(ENTITY, (_, hex: string | undefined, dec: string | undefined, named: string | undefined) => {\n if (named) return NAMED_ENTITIES[named];\n const code = hex ? parseInt(hex, 16) : parseInt(dec ?? '', 10);\n if (!code || code > 0x10ffff || (code >= 0xd800 && code <= 0xdfff)) this.reject(SVG_REJECTION.malformed);\n return String.fromCodePoint(code);\n });\n }\n\n private reject(reason: string): never {\n throw new SvgRejected(reason);\n }\n}\n","/**\n * Visible placeholder rendered when an icon cannot be resolved (unknown name,\n * failed asset load, a dropped response, or a Trusted Types policy the page\n * refused). Deliberately distinct from any real icon — a dashed frame with a\n * \"?\" — so missing icons are immediately obvious instead of showing an empty\n * space or an ambiguous glyph.\n *\n * @internal\n */\nexport const ICON_FALLBACK_SVG =\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\">' +\n '<rect x=\"3.5\" y=\"3.5\" width=\"17\" height=\"17\" rx=\"3\" stroke-dasharray=\"2.5 2.5\" />' +\n '<text x=\"12\" y=\"16.5\" text-anchor=\"middle\" font-size=\"12\" font-weight=\"700\" font-family=\"system-ui, -apple-system, sans-serif\" fill=\"currentColor\" stroke=\"none\">?</text>' +\n '</svg>';\n","import { ICON_FALLBACK_SVG } from './icon-placeholder';\nimport { buildSvg } from './icon-svg-builder';\n\n/**\n * The `lc-icon` Trusted Types policy (3.5, gap AS-14).\n *\n * Bundled icons are the kit's own SVG strings. In a browser with\n * `window.trustedTypes` they are parsed through exactly one policy, named\n * `lc-icon`, whose `createHTML` returns its input only when it is identical\n * to one of those strings and throws for anything else. The policy is created\n * on the first icon render, never at import time and never on the server, and\n * at most once per page: when the page's CSP refuses it, the kit says so once\n * and never asks again. Not exported from the entry.\n *\n * Since 3.6 (AS-17) the kit's strings are no longer all in the bundle. \"The\n * kit's own strings\" are those it was handed as glyphs — registered\n * `ICON_*` constants and the lazily loaded set — plus the placeholder, and\n * each of them must also pass the allow-list builder that fetched icons go\n * through. A registered string that fails it is never parsed.\n *\n * @internal\n */\nexport const ICON_POLICY_NAME = 'lc-icon';\n\n/** The few Trusted Types shapes this module needs, declared locally (no dependency, no global types). */\nexport interface IconTrustedHtml {\n toString(): string;\n}\nexport interface IconPolicyRules {\n createHTML(input: string): string;\n}\ninterface IconPolicy {\n createHTML(input: string): IconTrustedHtml;\n}\ninterface TrustedTypePolicyFactoryLike {\n createPolicy(name: string, rules: IconPolicyRules): IconPolicy;\n}\n\n/** What a page has: a policy, no Trusted Types at all, or a CSP that refused the policy. */\nexport type IconPolicyState = { kind: 'ready'; policy: IconPolicy } | { kind: 'none' } | { kind: 'refused' };\n\nconst NONE: IconPolicyState = { kind: 'none' };\nconst REFUSED: IconPolicyState = { kind: 'refused' };\n\nexport const ICON_POLICY_REFUSED_WARNING =\n '[lc-icon] Icons render a placeholder: the Trusted Types policy \"lc-icon\" could not be created. ' +\n 'Add lc-icon to the trusted-types directive of the Content Security Policy.';\n\n/** One state per page (keyed by its window). */\nlet states = new WeakMap<object, IconPolicyState>();\n/** The strings the kit was handed as glyphs (registered or loaded), and the placeholder. */\nlet offered = new Set<string>([ICON_FALLBACK_SVG]);\n/** The allow-list builder's verdict per offered string, checked once. */\nlet verdicts = new Map<string, boolean>();\n\n/** Hands glyph markup to the policy: a registered constant or a string of the loaded kit set. */\nexport function offerIconSvgs(svgs: Iterable<string>): void {\n for (const svg of svgs) offered.add(svg);\n}\n\n/** Every SVG string the kit was handed so far: registered glyphs, the loaded set and the placeholder. */\nexport function bundledIconSvgs(): ReadonlySet<string> {\n return offered;\n}\n\n/**\n * Whether `svg` may be parsed: it was handed to the kit as a glyph and the\n * allow-list builder accepts it (same rules as a fetched icon).\n */\nexport function isAdmittedIconSvg(doc: Document, svg: string): boolean {\n if (typeof svg !== 'string' || !offered.has(svg)) return false;\n let ok = verdicts.get(svg);\n if (ok === undefined) {\n ok = buildSvg(doc, svg).svg !== undefined;\n verdicts.set(svg, ok);\n }\n return ok;\n}\n\n/** The policy's rules: `createHTML` only, and only for the kit's own strings. */\nexport function iconPolicyRules(doc?: Document): IconPolicyRules {\n return {\n createHTML(input: string): string {\n const owner = doc ?? (typeof document === 'undefined' ? undefined : document);\n if (owner && isAdmittedIconSvg(owner, input)) return input;\n throw new TypeError('lc-icon: not a bundled icon');\n },\n };\n}\n\n/**\n * The page's policy state, creating the policy on the first call in a\n * browser that has Trusted Types. Feature-detected through the window, so\n * it is safe without Trusted Types, in jsdom and in Angular 21 apps.\n */\nexport function iconPolicy(win: Window | null): IconPolicyState {\n if (!win) return NONE;\n const known = states.get(win);\n if (known) return known;\n const factory = (win as unknown as { trustedTypes?: TrustedTypePolicyFactoryLike }).trustedTypes;\n let state: IconPolicyState = NONE;\n if (factory && typeof factory.createPolicy === 'function') {\n try {\n state = { kind: 'ready', policy: factory.createPolicy(ICON_POLICY_NAME, iconPolicyRules(win.document)) };\n } catch {\n state = REFUSED;\n console.warn(ICON_POLICY_REFUSED_WARNING);\n }\n }\n states.set(win, state);\n return state;\n}\n\n/**\n * Forgets the policy state of every page. Unit tests only (a real page must\n * never create the policy twice).\n * @internal\n */\nexport function resetIconPolicy(): void {\n states = new WeakMap();\n offered = new Set([ICON_FALLBACK_SVG]);\n verdicts = new Map();\n}\n","import { buildSvg } from './icon-svg-builder';\nimport { ICON_FALLBACK_SVG } from './icon-placeholder';\nimport { iconPolicy, isAdmittedIconSvg, resetIconPolicy } from './icon-trusted-types';\n\n/**\n * How `lc-icon` turns markup into DOM (3.5, gap AS-14). Every `<svg>` is a\n * fresh element that the component appends to its container; there is no\n * HTML binding and no sanitizer bypass.\n *\n * | Source | Server | Browser without Trusted Types | Browser with the policy | Policy refused |\n * |-------------------|---------|-------------------------------|--------------------------------|----------------|\n * | bundled constant | builder | XML parse of the constant | XML parse of `createHTML(…)` | placeholder (builder) |\n * | fetched text | — | builder | builder | builder |\n *\n * @internal\n */\n\n/** The parsed bundled constants of each page, cloned per instance (the policy runs once per distinct icon). */\nlet parsed = new WeakMap<Document, Map<string, SVGElement>>();\n\n/**\n * A bundled SVG constant as a fresh `<svg>` of `doc`, for the browser. `null`\n * when the page refused the `lc-icon` policy (the caller shows the\n * placeholder through the builder), the constant would not parse, or it was\n * not handed to the kit as a glyph or fails the allow-list (3.6, AS-17).\n */\nexport function parseBundledSvg(doc: Document, markup: string): SVGElement | null {\n const state = iconPolicy(doc.defaultView);\n if (state.kind === 'refused') return null;\n let cache = parsed.get(doc);\n if (!cache) parsed.set(doc, (cache = new Map()));\n let template = cache.get(markup);\n if (!template) {\n // Registered markup is not necessarily the kit's: it passes the\n // allow-list builder before any parser sees it, with or without a policy.\n if (!isAdmittedIconSvg(doc, markup)) return null;\n if (typeof DOMParser === 'undefined') return buildSvg(doc, markup).svg ?? null;\n // With Trusted Types the parser only takes the policy's TrustedHTML; the\n // policy hands back nothing but the kit's own strings.\n const input = state.kind === 'ready' ? state.policy.createHTML(markup) : markup;\n const xml = new DOMParser().parseFromString(input as string, 'image/svg+xml');\n const root = xml.documentElement;\n if (root.nodeName !== 'svg' || xml.getElementsByTagName('parsererror').length > 0) return null;\n template = doc.importNode(root, true) as unknown as SVGElement;\n cache.set(markup, template);\n }\n return template.cloneNode(true) as SVGElement;\n}\n\n/** The placeholder as a fresh `<svg>`: parsed like a bundled icon in the browser, built everywhere else. */\nexport function placeholderSvg(doc: Document, browser: boolean): SVGElement {\n return (browser ? parseBundledSvg(doc, ICON_FALLBACK_SVG) : null) ?? (buildSvg(doc, ICON_FALLBACK_SVG).svg as SVGElement);\n}\n\n/** What the component applies to its `<svg>`; consumer values reach attributes and `style.color` only. */\nexport interface IconDecoration {\n size: string;\n color: string;\n decorative: boolean;\n label: string | undefined;\n}\n\n/** `currentColor` in any letter case, or empty: the stylesheet's `color: inherit` colours the glyph. */\nexport function isDefaultIconColor(color: string): boolean {\n const value = color.trim();\n return value === '' || value.toLowerCase() === 'currentcolor';\n}\n\n/**\n * Sets size, colour and accessibility on the element in place (the order 3.4\n * used). The default colour writes no `style` (3.11.1, G-37: a `style-src\n * 'self'` CSP blocks every `style` attribute in prerendered HTML) and takes\n * back a custom colour of an earlier decoration. A custom colour goes through\n * CSSOM (`style.color`), which such a CSP allows in the browser; never\n * `setAttribute('style', …)` or markup.\n */\nexport function decorateSvg(svg: SVGElement, decoration: IconDecoration): void {\n svg.setAttribute('width', decoration.size);\n svg.setAttribute('height', decoration.size);\n const style = (svg as Partial<ElementCSSInlineStyle>).style;\n if (!isDefaultIconColor(decoration.color)) {\n if (style) style.color = decoration.color;\n } else if (svg.hasAttribute('style')) {\n style?.removeProperty('color');\n if (!svg.getAttribute('style')?.trim()) svg.removeAttribute('style');\n }\n if (decoration.decorative) {\n svg.setAttribute('aria-hidden', 'true');\n svg.removeAttribute('role');\n svg.removeAttribute('aria-label');\n } else {\n svg.setAttribute('role', 'img');\n svg.removeAttribute('aria-hidden');\n if (decoration.label) svg.setAttribute('aria-label', decoration.label);\n else svg.removeAttribute('aria-label');\n }\n}\n\n/**\n * Forgets the parsed constants and the policy state. Unit tests only.\n * @internal\n */\nexport function resetIconRendering(): void {\n parsed = new WeakMap();\n resetIconPolicy();\n}\n","import { InjectionToken, Provider, inject } from '@angular/core';\nimport type { IconVariant } from './icon.component';\nimport { offerIconSvgs } from './icon-trusted-types';\n\n/**\n * One glyph shipped by the kit (3.6, AS-17). Import the constants from\n * `@lifecorner/angular-ui-kit/icons` (`ICON_HOME`, `ICON_X_MARK_SOLID`, …) and\n * register them with {@link provideLcIcons}. Markup you write yourself is not\n * supported: it has to pass the same allow-list as fetched icons, or it\n * renders the placeholder.\n */\nexport interface LcIconDefinition {\n /** The 3.5.1 key of the glyph, e.g. `x-mark` or `mail` (aliases resolve to it). */\n readonly name: string;\n /** The variant the glyph draws. */\n readonly variant: IconVariant;\n /** The SVG markup. */\n readonly svg: string;\n}\n\n/**\n * What a kit glyph does that nobody registered (see {@link LcIconOptions}):\n * `'load'` loads the kit's whole set once, as a lazy chunk, and renders it;\n * `'placeholder'` shows the placeholder and warns, so the set never loads.\n */\nexport type LcIconFallback = 'load' | 'placeholder';\n\n/** App-wide `lc-icon` options. Set them once, in `app.config`. */\nexport interface LcIconOptions {\n /**\n * What a kit glyph does that nobody registered: `'load'` loads the kit's\n * whole set once, as a lazy chunk, and renders it (the 3.5.1 output, a\n * moment later in a client-only render; prerendered HTML is unchanged);\n * `'placeholder'` shows the placeholder and warns once per name (in\n * production too), so the set never loads. With `'placeholder'`,\n * `<lc-icon [strict]=\"true\">` also throws in development. For\n * `unregistered`, the nearest `provideLcIcons` call that sets it wins.\n * @default 'load'\n */\n readonly unregistered?: LcIconFallback;\n}\n\n/**\n * The glyphs one injector registered, linked to the scope above it.\n * @internal\n */\nexport interface IconScope {\n readonly parent: IconScope | null;\n /** Markup by `variant:name`. */\n readonly glyphs: ReadonlyMap<string, string>;\n /** Set by an app's {@link provideLcIcons} call only. */\n readonly unregistered: LcIconFallback | undefined;\n /** `true` for an app's call, `false` for a kit component's own glyphs. */\n readonly byApp: boolean;\n}\n\n/** @internal */\nexport const LC_ICON_SCOPE = new InjectionToken<IconScope>('LC_ICON_SCOPE');\n\ninterface IconContribution {\n readonly icons: readonly LcIconDefinition[];\n readonly options: LcIconOptions;\n}\n\n/** Every provideLcIcons call of one injector (several calls add up). */\nconst LC_ICON_CONTRIBUTIONS = new InjectionToken<readonly IconContribution[]>('LC_ICON_CONTRIBUTIONS');\n\nconst glyphKey = (name: string, variant: IconVariant) => `${variant}:${name}`;\n\nfunction glyphMap(icons: readonly LcIconDefinition[]): Map<string, string> {\n const glyphs = new Map<string, string>();\n for (const icon of icons) glyphs.set(glyphKey(icon.name, icon.variant), icon.svg);\n return glyphs;\n}\n\nfunction parentScope(): IconScope | null {\n return inject(LC_ICON_SCOPE, { skipSelf: true, optional: true });\n}\n\nfunction appScope(): IconScope {\n const glyphs = new Map<string, string>();\n let unregistered: LcIconFallback | undefined;\n for (const { icons, options } of inject(LC_ICON_CONTRIBUTIONS)) {\n for (const [key, svg] of glyphMap(icons)) glyphs.set(key, svg);\n if (options.unregistered) unregistered = options.unregistered;\n }\n offerIconSvgs(glyphs.values());\n return { parent: parentScope(), glyphs, unregistered, byApp: true };\n}\n\n/**\n * Registers kit glyphs for every `lc-icon` below this injector: `app.config`,\n * a route's `providers` or a component's `providers` (3.6, AS-17). Registered\n * glyphs render synchronously, in prerendered HTML too, and only they (plus\n * the kit's internal ones) are bundled. Glyphs add up along the injector tree\n * and across several calls in one injector; for `unregistered`, the nearest\n * call that sets it wins.\n *\n * Without any call, every 3.5.1 name still renders: the kit's set loads once,\n * lazily (see {@link LcIconOptions}).\n *\n * @example\n * ```ts\n * // app.config.ts — provideLcIcons from the icon entry, the ICON_* constants\n * // from the icons entry (@lifecorner/angular-ui-kit/icons).\n * export const appConfig: ApplicationConfig = {\n * providers: [provideLcIcons([ICON_HOME, ICON_MAIL, ICON_X_MARK], { unregistered: 'placeholder' })],\n * };\n * ```\n */\nexport function provideLcIcons(icons: readonly LcIconDefinition[], options: LcIconOptions = {}): Provider[] {\n return [\n { provide: LC_ICON_CONTRIBUTIONS, multi: true, useValue: { icons, options } satisfies IconContribution },\n { provide: LC_ICON_SCOPE, useFactory: appScope },\n ];\n}\n\n/**\n * The glyphs a kit component renders itself (chevrons, close, status icons),\n * for its `viewProviders`. Sets no `unregistered` mode and does not count as\n * the app registering glyphs. Not documented for apps; use\n * {@link provideLcIcons}.\n */\nexport function ɵprovideKitIcons(icons: readonly LcIconDefinition[]): Provider {\n const glyphs = glyphMap(icons);\n return {\n provide: LC_ICON_SCOPE,\n useFactory: (): IconScope => ({ parent: parentScope(), glyphs, unregistered: undefined, byApp: false }),\n };\n}\n\n/**\n * The registered markup for a name and variant, nearest scope first.\n * @internal\n */\nexport function findRegisteredGlyph(scope: IconScope | null, name: string, variant: IconVariant): string | undefined {\n const key = glyphKey(name, variant);\n for (let s = scope; s; s = s.parent) {\n const svg = s.glyphs.get(key);\n if (svg !== undefined) return svg;\n }\n return undefined;\n}\n\n/**\n * The nearest `unregistered` setting, `'load'` when nobody set one.\n * @internal\n */\nexport function unregisteredFallback(scope: IconScope | null): LcIconFallback {\n for (let s = scope; s; s = s.parent) if (s.unregistered) return s.unregistered;\n return 'load';\n}\n\n/**\n * Whether the app registers glyphs anywhere above this scope.\n * @internal\n */\nexport function appRegistersIcons(scope: IconScope | null): boolean {\n for (let s = scope; s; s = s.parent) if (s.byApp) return true;\n return false;\n}\n","import type { IconVariant } from './icon.component';\n\n/**\n * The kit's whole 3.5.1 inline set, loaded lazily (3.6, AS-17).\n *\n * `lc-icon` asks for it only when a 3.5.1 inline name renders that nobody\n * registered and the app keeps `unregistered: 'load'` (the default). The\n * dynamic `import()` of the internal entry makes bundlers emit the set as a\n * separate chunk, fetched once per page; on the server it is read from the\n * server bundle. A failed import is forgotten, so the next icon tries again.\n *\n * @internal\n */\nexport interface LoadedIconSet {\n /** The markup of a glyph key (see `resolveInlineGlyph`) and variant. */\n svg(key: string, variant: IconVariant): string | undefined;\n}\n\nlet loading: Promise<LoadedIconSet> | null = null;\nlet loaded: LoadedIconSet | null = null;\n\n/** The set when it has loaded already (then icons render synchronously), else `null`. */\nexport function loadedIconSet(): LoadedIconSet | null {\n return loaded;\n}\n\n/** Loads the set once per page; concurrent callers share the request. */\nexport function loadIconSet(): Promise<LoadedIconSet> {\n if (!loading) {\n loading = import('@lifecorner/angular-ui-kit/internal/icon-set').then(\n ({ INLINE_ICON_SVGS, INLINE_TABLER_SVGS }) => {\n const set: LoadedIconSet = {\n svg: (key, variant) => INLINE_ICON_SVGS[key]?.[variant] ?? INLINE_TABLER_SVGS[key]?.[variant],\n };\n loaded = set;\n return set;\n },\n (error: unknown) => {\n loading = null;\n throw error;\n },\n );\n }\n return loading;\n}\n\n/**\n * Forgets the loaded set. Unit tests only.\n * @internal\n */\nexport function resetIconSet(): void {\n loading = null;\n loaded = null;\n}\n","import {\n Component,\n ElementRef,\n input,\n computed,\n signal,\n effect,\n isDevMode,\n ChangeDetectionStrategy,\n inject,\n PendingTasks,\n PLATFORM_ID,\n viewChild,\n} from '@angular/core';\nimport { DOCUMENT, isPlatformBrowser } from '@angular/common';\nimport { HttpClient, HttpErrorResponse } from '@angular/common/http';\nimport { Observable, catchError, map, of, retry, shareReplay, tap, throwError, timer } from 'rxjs';\nimport { isValidIconName } from '@lifecorner/angular-ui-kit/icon-names';\nimport { ICON_ALIASES } from './icon-aliases';\nimport { iconConstantName, resolveInlineGlyph } from './icon-inline-lookup';\nimport { buildSvg, looksLikeSvgDocument } from './icon-svg-builder';\nimport { decorateSvg, parseBundledSvg, placeholderSvg } from './icon-dom';\nimport { LC_ICON_SCOPE, appRegistersIcons, findRegisteredGlyph, unregisteredFallback } from './icon-registry';\nimport { loadIconSet, loadedIconSet } from './icon-set-loader';\nimport { offerIconSvgs } from './icon-trusted-types';\n\nexport type IconVariant = 'outline' | 'solid';\nexport type IconSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n\n/**\n * The form every icon name has (all 5,161 do): lower-case words joined by `-`\n * or `_`, at most 64 characters. Production builds check names by this form\n * only; the full list is for development builds (3.5, AS-15).\n */\nconst ICON_NAME_FORM = /^[a-z0-9]+(?:[-_][a-z0-9]+)*$/;\nconst MAX_ICON_NAME_LENGTH = 64;\n\n/**\n * Icon names already reported to the console. A page with dozens of instances\n * of the same typo must produce exactly one warning, not one per instance —\n * and the warning fires in production too (unlike the old dev-only warning,\n * which left prod incidents invisible in the console).\n */\nconst warnedIconNames = new Set<string>();\n\nfunction warnOnce(name: string, message: string): void {\n if (warnedIconNames.has(name)) return;\n warnedIconNames.add(name);\n console.warn(message);\n}\n\n/**\n * Clears the warn-once-per-name registry. Only needed by unit tests that\n * assert on console warnings across multiple cases.\n * @internal\n */\nexport function resetIconWarnings(): void {\n warnedIconNames.clear();\n}\n\nconst unknownIconMessage = (name: string) =>\n `[lc-icon] Unknown icon \"${name}\". Use a Tabler name or a documented alias (see ICON_NAMES / ICON_ALIASES). Rendering a placeholder instead.`;\n\n/** 3.6 (AS-17): a kit glyph that nobody registered with provideLcIcons(). */\nconst unregisteredMessage = (name: string, constant: string, outcome: string) =>\n `[lc-icon] \"${name}\" is not registered. Add ${constant} from @lifecorner/angular-ui-kit/icons to provideLcIcons(). ${outcome}`;\n\nconst iconSetFailedMessage = (reason: string) =>\n `[lc-icon] The kit's icon set could not be loaded (${reason}). Rendering a placeholder instead.`;\n\n/**\n * Outcome of one asset fetch. A 404 is an outcome too, so the cache keeps it\n * and a later instance of the same missing name asks no second time.\n */\ntype IconFetchResult =\n | { kind: 'svg'; svg: SVGElement }\n | { kind: 'non-svg'; contentType: string }\n | { kind: 'dropped'; reason: string }\n | { kind: 'failed'; status: string };\n\n/**\n * One in-flight/completed fetch per asset path, shared by every `lc-icon`\n * instance on the page (a table with 200 rows of the same status icon used to\n * fire 200 identical requests). Transient failures are evicted so the next\n * instance tries again; a completed one — valid, dropped or 404 — is kept.\n */\nconst iconFetchCache = new Map<string, Observable<IconFetchResult>>();\n\nconst isNotFound = (error: unknown) => error instanceof HttpErrorResponse && error.status === 404;\n\nfunction fetchIcon(http: HttpClient, doc: Document, path: string): Observable<IconFetchResult> {\n let cached = iconFetchCache.get(path);\n if (!cached) {\n cached = http.get(path, { observe: 'response', responseType: 'text' }).pipe(\n // Transient failures (connection reset, timeout, 5xx) — e.g. a burst of\n // icons overwhelming the dev server — are retried with a short backoff\n // before falling back, so a hiccup does not leave an otherwise-valid\n // icon stuck on the placeholder. A genuine 404 (missing asset) is not\n // retried.\n retry({\n count: 2,\n delay: (error, retryCount) => (isNotFound(error) ? throwError(() => error) : timer(200 * retryCount)),\n }),\n // Validate before anything touches the DOM: SPA deployments answer\n // missing asset paths with `index.html` and status 200 — that document\n // must be dropped, never rendered. A text/html content-type is rejected\n // outright; everything else is rebuilt through the allow-list builder,\n // which creates the <svg> node by node and never hands text to a parser.\n map((response): IconFetchResult => {\n const contentType = response.headers.get('content-type') ?? '';\n const body = response.body ?? '';\n if (contentType.includes('text/html') || !looksLikeSvgDocument(body)) return { kind: 'non-svg', contentType };\n const built = buildSvg(doc, body);\n return built.svg ? { kind: 'svg', svg: built.svg } : { kind: 'dropped', reason: built.reason };\n }),\n catchError((error: unknown) => (isNotFound(error) ? of<IconFetchResult>({ kind: 'failed', status: '404' }) : throwError(() => error))),\n tap({ error: () => iconFetchCache.delete(path) }),\n shareReplay({ bufferSize: 1, refCount: false })\n );\n iconFetchCache.set(path, cached);\n }\n return cached;\n}\n\n/**\n * Clears the shared per-path fetch cache. Only needed by unit tests, whose\n * `HttpTestingController` is recreated per test.\n * @internal\n */\nexport function resetIconCache(): void {\n iconFetchCache.clear();\n}\n\n/**\n * What the container shows: nothing, a bundled constant, a fetched (built)\n * icon, or the placeholder. `pending` waits for the kit's lazy set (3.6): the\n * container stays as it is, so a prerendered `<svg>` survives hydration.\n */\ntype IconSource =\n | { kind: 'none' }\n | { kind: 'pending' }\n | { kind: 'bundled'; markup: string }\n | { kind: 'fetched'; svg: SVGElement }\n | { kind: 'placeholder' };\n\nconst NO_ICON: IconSource = { kind: 'none' };\nconst PENDING: IconSource = { kind: 'pending' };\nconst PLACEHOLDER: IconSource = { kind: 'placeholder' };\n\n/**\n * Icon component - Tabler Icons wrapper for displaying SVG icons\n *\n * Features:\n * - Signal-based reactive API\n * - Support for outline and solid variants\n * - Multiple size options (xs, sm, md, lg, xl)\n * - Custom color support (CSS colors, variables)\n * - Accessibility attributes (ARIA labels, decorative icons)\n * - Inline SVGs for the common icons (a hand-picked set plus Tabler icons\n * inlined at build time, see {@link isInlineIconName}): no request, they\n * render offline and in prerendered HTML; looked up by the name as written,\n * then by its alias target\n * - Tree-shakable glyphs (3.6, AS-17): register the ones an app renders with\n * `provideLcIcons([ICON_HOME, …])` (constants from\n * `@lifecorner/angular-ui-kit/icons`); only those, and the glyphs the kit's\n * own components render, are bundled. A registered glyph renders\n * synchronously. An inline name that nobody registered loads the kit's whole\n * set once, lazily (`unregistered: 'load'`, the default: the 3.5.1 output,\n * prerendered HTML unchanged), or shows the placeholder and warns\n * (`unregistered: 'placeholder'`)\n * - Dynamic SVG loading from Tabler Icons for everything else\n * - Fail-loud on unknown names: a console warning (once per name, in dev AND\n * prod) + a visible placeholder (never a silent empty space). Development\n * builds check every name against {@link ICON_NAMES} / {@link isValidIconName}\n * and request **no** unknown name, because in SPA deployments the server\n * answers missing asset paths with the index.html fallback. Production\n * builds leave the ~5,000 names out of the bundle (3.5, AS-15): they check\n * a name only by its form, request a well-formed unknown name once per\n * page, and show the placeholder when the answer is not an icon. See\n * {@link ICON_ALIASES} for the supported Heroicon/Material aliases.\n * - Fetched responses are validated before anything reaches the page: a\n * `text/html` or non-SVG response (e.g. the SPA index.html fallback) is\n * dropped, and an SVG is rebuilt from an allow-list — basic shapes (`g`,\n * `path`, `circle`, `ellipse`, `line`, `polyline`, `polygon`, `rect`,\n * `text`) with paint and geometry attributes. Scripts, event handlers,\n * references (`href`, `url(…)`) and anything else drop the icon, which\n * then shows the placeholder.\n * - One request per asset path per page (shared cache, a 404 included); a\n * name change cancels the instance's pending load so a slow old response\n * never overwrites the newer icon; `size` / `color` / `decorative` /\n * `ariaLabel` re-decorate the rendered `<svg>` in place, without refetching.\n *\n * **Trusted Types** (3.5, AS-14): bundled icons go through one policy,\n * `lc-icon`, created on the first icon render; it accepts only the kit's own\n * SVG strings. If your Content Security Policy enforces Trusted Types, add\n * `lc-icon` to its `trusted-types` directive (with two copies of the kit on\n * one page, the second needs `'allow-duplicates'`). Fetched icons need no\n * policy: they are rebuilt node by node from the allow-list above. When the\n * page refuses the policy, bundled icons show the placeholder and the console\n * says so once. No sanitizer bypass, no HTML binding.\n *\n * @example\n * ```html\n * <!-- Basic usage -->\n * <lc-icon name=\"user\" />\n *\n * <!-- With variant and size -->\n * <lc-icon name=\"check\" variant=\"solid\" size=\"lg\" />\n *\n * <!-- With custom color -->\n * <lc-icon name=\"arrow-right\" color=\"#FF5733\" />\n *\n * <!-- With CSS variable color -->\n * <lc-icon name=\"star\" color=\"var(--color-primary-500)\" />\n *\n * <!-- With accessibility label -->\n * <lc-icon name=\"user\" ariaLabel=\"User profile\" />\n *\n * <!-- Decorative icon (hidden from screen readers) -->\n * <lc-icon name=\"sparkles\" [decorative]=\"true\" />\n *\n * <!-- Strict: throw in dev when the name is unknown (catch typos in CI) -->\n * <lc-icon name=\"beaker\" [strict]=\"true\" />\n * ```\n */\n@Component({\n selector: 'lc-icon',\n standalone: true,\n imports: [],\n templateUrl: './icon.component.html',\n styleUrls: ['./icon.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class IconComponent {\n private readonly http = inject(HttpClient);\n private readonly doc = inject(DOCUMENT);\n /**\n * Fetching needs a browser; the server renders inline icons and the\n * placeholder (through the allow-list builder) and leaves fetched names\n * empty — the client takes over on hydration.\n */\n private readonly isBrowser = isPlatformBrowser(inject(PLATFORM_ID));\n /** The registered glyphs above this icon (3.6, AS-17): kit components' own, then the app's. */\n private readonly scope = inject(LC_ICON_SCOPE, { optional: true });\n /** Keeps the server (and `whenStable()`) waiting while the kit's set loads. */\n private readonly pendingTasks = inject(PendingTasks);\n private readonly container = viewChild.required<ElementRef<HTMLElement>>('container');\n /** Whether the container was written once; until then a pending icon leaves a prerendered `<svg>` alone. */\n private rendered = false;\n\n /**\n * Icon name from Tabler Icons library\n * @example \"user\", \"check\", \"arrow-right\"\n */\n readonly name = input<string>('');\n\n /**\n * Icon variant (outline or solid)\n * @default \"outline\"\n */\n readonly variant = input<IconVariant>('outline');\n\n /**\n * Icon size\n * - xs: 16px\n * - sm: 20px\n * - md: 24px (default)\n * - lg: 32px\n * - xl: 40px\n *\n * Set by the `icon-<size>` class in the component stylesheet; `lc-icon`\n * writes no inline size (3.11.1).\n * @default \"md\"\n */\n readonly size = input<IconSize>('md');\n\n /**\n * Icon colour. By default the icon takes the text colour of its parent\n * (`currentColor`, through the stylesheet) and `lc-icon` renders **no\n * `style` attribute**, so it works under a `style-src 'self'` CSP (3.11.1).\n *\n * Any other value, a CSS colour (`#FF5733`, `rgb(…)`) or a variable\n * (`var(--color-primary-500)`), becomes the `<svg>`'s inline `color`, set\n * through CSSOM, which such a CSP allows in the browser. In prerendered HTML\n * it is a `style` attribute, which that CSP blocks until the app hydrates,\n * so the icon shows the parent's colour until then. Under a strict CSP,\n * colour the icon from your stylesheet instead: set `color` on `lc-icon` or\n * on its parent. `currentColor` in any letter case, and an empty string,\n * mean the default.\n * @default \"currentColor\"\n */\n readonly color = input<string>('currentColor');\n\n /**\n * Accessible label for screen readers\n * Required if icon has semantic meaning\n */\n readonly ariaLabel = input<string>();\n\n /**\n * Whether icon is purely decorative (hidden from screen readers)\n * @default false\n */\n readonly decorative = input<boolean>(false);\n\n /**\n * Strict mode. When `true` and the name is not a valid icon (see\n * {@link isValidIconName}), the component **throws** in development mode\n * instead of only warning — useful as a CI guard to catch typos/unknown\n * names. With `provideLcIcons(…, { unregistered: 'placeholder' })` (3.6), a\n * kit glyph that is not registered also throws in development. No effect in\n * production builds.\n * @default false\n */\n readonly strict = input<boolean>(false);\n\n /**\n * What the container shows for the current name/variant. Loading writes\n * here; the element and its decoration are derived below.\n */\n private readonly source = signal<IconSource>(NO_ICON);\n\n /**\n * A fresh `<svg>` for the current source, undecorated. It depends on the\n * source only, so a change of `size`, `color`, `decorative` or `ariaLabel`\n * re-decorates the same element instead of building a new one.\n */\n private readonly svgElement = computed<SVGElement | null>(() => {\n const source = this.source();\n switch (source.kind) {\n case 'none':\n case 'pending':\n return null;\n case 'fetched':\n return source.svg.cloneNode(true) as SVGElement;\n case 'bundled': {\n const svg = this.isBrowser ? parseBundledSvg(this.doc, source.markup) : (buildSvg(this.doc, source.markup).svg ?? null);\n return svg ?? placeholderSvg(this.doc, this.isBrowser);\n }\n case 'placeholder':\n return placeholderSvg(this.doc, this.isBrowser);\n }\n });\n\n /**\n * Computed path to SVG file\n * @internal\n */\n readonly iconPath = computed(() => {\n const rawName = this.name();\n const iconVariant = this.variant();\n if (!rawName) return '';\n const iconName = ICON_ALIASES[rawName] ?? rawName;\n const tablerVariant = iconVariant === 'solid' ? 'filled' : 'outline';\n return `/tabler-icons/${tablerVariant}/${iconName}.svg`;\n });\n\n /**\n * Computed size in pixels, for the svg's `width`/`height` attributes; the\n * same values as the `icon-<size>` rules in icon.component.scss\n * @internal\n */\n readonly sizeInPixels = computed(() => {\n const sizeMap: Record<IconSize, string> = {\n xs: '16px',\n sm: '20px',\n md: '24px',\n lg: '32px',\n xl: '40px',\n };\n return sizeMap[this.size()];\n });\n\n /**\n * Computed CSS classes\n * @internal\n */\n readonly computedClasses = computed(() => {\n const classes = ['icon-container', `icon-${this.size()}`, `icon-${this.variant()}`];\n\n return classes.join(' ');\n });\n\n /**\n * The `color` input as handed to the svg: a custom value becomes its inline\n * colour (CSSOM), the default writes nothing (see `decorateSvg`)\n * @internal\n */\n readonly colorStyle = computed(() => {\n return this.color();\n });\n\n constructor() {\n // Resolve the source when name or variant changes.\n effect((onCleanup) => {\n const rawName = this.name();\n const iconVariant = this.variant();\n\n if (!rawName) {\n this.source.set(NO_ICON);\n return;\n }\n\n // Fail loud on names outside the canonical set (typos, un-aliased\n // Heroicon names, …), once per name. Development builds check the full\n // list and never fetch an unknown name: in SPA deployments the server\n // answers missing asset paths with the index.html fallback (status 200).\n // Production builds fold this branch away (ngDevMode is false there),\n // so the list stays out of the bundle; they check the name's form and\n // validate whatever the server answers instead.\n if (typeof ngDevMode === 'undefined' || ngDevMode) {\n if (!isValidIconName(rawName)) {\n warnOnce(rawName, unknownIconMessage(rawName));\n if (isDevMode() && this.strict()) {\n throw new Error(\n `[lc-icon] Unknown icon \"${rawName}\" (strict mode). Use a Tabler name or a documented alias.`\n );\n }\n this.source.set(PLACEHOLDER);\n return;\n }\n } else if (rawName.length > MAX_ICON_NAME_LENGTH || !ICON_NAME_FORM.test(rawName)) {\n warnOnce(rawName, unknownIconMessage(rawName));\n this.source.set(PLACEHOLDER);\n return;\n }\n\n // A registered glyph first (no request; renders synchronously, offline\n // and in prerendered HTML): by the name as written, then by its alias\n // target (G-7), nearest scope first (3.6, AS-17).\n const aliasTarget = ICON_ALIASES[rawName] ?? rawName;\n const registered =\n findRegisteredGlyph(this.scope, rawName, iconVariant) ??\n (aliasTarget === rawName ? undefined : findRegisteredGlyph(this.scope, aliasTarget, iconVariant));\n if (registered !== undefined) {\n offerIconSvgs([registered]);\n this.source.set({ kind: 'bundled', markup: registered });\n return;\n }\n\n // A 3.5.1 inline name nobody registered: the kit's whole set, loaded\n // once and lazily ('load', the default), or the placeholder.\n const glyph = resolveInlineGlyph(rawName, iconVariant);\n if (glyph) {\n this.resolveUnregistered(rawName, glyph, iconVariant, onCleanup);\n return;\n }\n\n // Everything else is fetched, in the browser only. While it loads the\n // container is empty (it keeps its px size).\n const path = this.iconPath();\n this.source.set(NO_ICON);\n if (!path || !this.isBrowser) return;\n\n const subscription = fetchIcon(this.http, this.doc, path).subscribe({\n next: (result) => {\n switch (result.kind) {\n case 'svg':\n this.source.set({ kind: 'fetched', svg: result.svg });\n return;\n case 'non-svg':\n warnOnce(\n rawName,\n `[lc-icon] \"${rawName}\": ${path} returned non-SVG content` +\n (result.contentType ? ` (${result.contentType})` : '') +\n ' — dropped. In SPA deployments this is typically the index.html fallback for a missing asset.'\n );\n break;\n case 'dropped':\n warnOnce(\n rawName,\n `[lc-icon] \"${rawName}\": ${path} was dropped: ${result.reason}. Fetched icons may contain only basic shapes with paint and geometry attributes. Rendering a placeholder instead.`\n );\n break;\n case 'failed':\n this.warnLoadFailure(rawName, path, result.status);\n break;\n }\n this.source.set(PLACEHOLDER);\n },\n error: (error: unknown) => {\n // Asset unreachable after the retries: render a visible placeholder\n // so the gap is obvious rather than an empty space.\n this.warnLoadFailure(rawName, path, error instanceof HttpErrorResponse && error.status ? String(error.status) : 'network error');\n this.source.set(PLACEHOLDER);\n },\n });\n // A name/variant change (or destroy) while the load is in flight: stop\n // listening, so a slow old response cannot overwrite the newer icon.\n onCleanup(() => subscription.unsubscribe());\n });\n\n // Put the element into the container and decorate it with the CURRENT\n // inputs. Runs during change detection, so it also runs on the server and\n // the prerendered HTML carries the decorated <svg>. After hydration it\n // replaces the server's <svg> with the client's. Built with the document's\n // own DOM APIs, never the renderer: the renderer would stamp _ngcontent\n // attributes onto every node and change the SVG's DOM.\n effect(() => {\n const host = this.container().nativeElement;\n // Waiting for the kit's set: leave the first render alone (on hydration\n // the container holds the server's <svg> for exactly this glyph); a\n // later name change empties the box like a fetch does.\n if (this.source().kind === 'pending' && !this.rendered) return;\n this.rendered = true;\n const svg = this.svgElement();\n if (svg) {\n decorateSvg(svg, {\n size: this.sizeInPixels(),\n color: this.colorStyle(),\n decorative: this.decorative(),\n label: this.ariaLabel(),\n });\n }\n const inPlace = svg ? host.childNodes.length === 1 && host.firstChild === svg : host.childNodes.length === 0;\n if (inPlace) return;\n while (host.firstChild) host.removeChild(host.firstChild);\n if (svg) host.appendChild(svg);\n });\n }\n\n /**\n * A 3.5.1 inline name that no scope registered (3.6, AS-17). `'load'`\n * renders it from the kit's lazily loaded set: synchronously once the set\n * is there, otherwise after the chunk, with the server and `whenStable()`\n * waiting through `PendingTasks`. `'placeholder'` never loads the set.\n */\n private resolveUnregistered(\n name: string,\n glyph: string,\n variant: IconVariant,\n onCleanup: (cleanup: () => void) => void,\n ): void {\n const constant = iconConstantName(glyph, variant);\n if (unregisteredFallback(this.scope) === 'placeholder') {\n warnOnce(`${variant}:${name}`, unregisteredMessage(name, constant, 'Rendering a placeholder instead.'));\n if (isDevMode() && this.strict()) {\n throw new Error(`[lc-icon] \"${name}\" is not registered (strict mode). Add ${constant} to provideLcIcons().`);\n }\n this.source.set(PLACEHOLDER);\n return;\n }\n // Only an app that registers glyphs wants to hear about the ones it\n // missed; an app that opted into nothing gets 3.5.1's output quietly.\n if ((typeof ngDevMode === 'undefined' || ngDevMode) && appRegistersIcons(this.scope)) {\n warnOnce(`${variant}:${name}`, unregisteredMessage(name, constant, \"Loading the kit's icon set instead.\"));\n }\n const set = loadedIconSet();\n if (set) {\n this.showFromSet(set.svg(glyph, variant));\n return;\n }\n this.source.set(PENDING);\n let current = true;\n onCleanup(() => (current = false));\n const done = this.pendingTasks.add();\n loadIconSet()\n .then(\n (loaded) => {\n if (current) this.showFromSet(loaded.svg(glyph, variant));\n },\n (error: unknown) => {\n warnOnce('[lc-icon set]', iconSetFailedMessage(error instanceof Error ? error.message : String(error)));\n if (current) this.source.set(PLACEHOLDER);\n },\n )\n .finally(done);\n }\n\n private showFromSet(markup: string | undefined): void {\n if (markup === undefined) {\n this.source.set(PLACEHOLDER);\n return;\n }\n offerIconSvgs([markup]);\n this.source.set({ kind: 'bundled', markup });\n }\n\n /**\n * A known name whose asset can't be loaded stays quiet in development (as\n * before: unit tests and offline work have no assets). Production can't\n * tell it from a typo — the list isn't there — so it says so, once.\n */\n private warnLoadFailure(name: string, path: string, status: string): void {\n if (typeof ngDevMode === 'undefined' || ngDevMode) return;\n warnOnce(\n name,\n `[lc-icon] \"${name}\": ${path} could not be loaded (${status}) — an unknown name or a missing asset. Rendering a placeholder instead.`\n );\n }\n}\n","<div #container [class]=\"computedClasses()\"></div>\n","// `lc-icon` name helpers (public API). The full name list and `isValidIconName`\n// live in `@lifecorner/angular-ui-kit/icon-names`.\nimport type { IconVariant } from './icon.component';\nimport { resolveInlineGlyph } from './icon-inline-lookup';\n\nexport { ICON_ALIASES } from './icon-aliases';\n\n/**\n * A valid `lc-icon` name.\n *\n * There are ~5000 valid names, so this is intentionally a broad `string` alias\n * rather than a giant union type (which would bloat editors and builds). Prefer\n * runtime validation via {@link isValidIconName}, or lint your usages against\n * the {@link ICON_NAMES} array (also shipped as `icon-names.json`), both from\n * `@lifecorner/angular-ui-kit/icon-names`.\n */\nexport type IconName = string;\n\n/**\n * Whether `name` renders from markup shipped in the kit — no request, so it\n * shows offline and in prerendered HTML (3.3, gap G-7): registered with\n * `provideLcIcons()` or loaded with the kit's set (3.6, AS-17). Covers the\n * hand-picked inline set, the Tabler icons inlined at build time (mail,\n * users, settings, logout, key, chevron-right, …) and aliases that resolve\n * to either — the names of 3.5.1, plus `wallet`, `building-bank` and\n * `shield-lock` since 3.16 (TD-3). Use it to lint an app or a static\n * site against icons that would be fetched.\n *\n * @example\n * ```ts\n * isInlineIconName('x-mark'); // true (hand-picked, by its alias name)\n * isInlineIconName('envelope'); // true (alias of the inlined Tabler `mail`)\n * isInlineIconName('anchor'); // false (fetched from the Tabler assets)\n * isInlineIconName('robot', 'solid'); // false (Tabler has no filled robot)\n * ```\n */\nexport function isInlineIconName(name: string, variant: IconVariant = 'outline'): boolean {\n return resolveInlineGlyph(name, variant) !== undefined;\n}\n"],"mappings":"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"}
|
|
@@ -683,6 +683,71 @@ const ICON_SHIELD_LOCK_SOLID = {
|
|
|
683
683
|
variant: "solid",
|
|
684
684
|
svg: "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M11.998 2l.118 .007l.059 .008l.061 .013l.111 .034a.993 .993 0 0 1 .217 .112l.104 .082l.255 .218a11 11 0 0 0 7.189 2.537l.342 -.01a1 1 0 0 1 1.005 .717a13 13 0 0 1 -9.208 16.25a1 1 0 0 1 -.502 0a13 13 0 0 1 -9.209 -16.25a1 1 0 0 1 1.005 -.717a11 11 0 0 0 7.531 -2.527l.263 -.225l.096 -.075a.993 .993 0 0 1 .217 -.112l.112 -.034a.97 .97 0 0 1 .119 -.021l.115 -.007zm.002 7a2 2 0 0 0 -1.995 1.85l-.005 .15l.005 .15a2 2 0 0 0 .995 1.581v1.769l.007 .117a1 1 0 0 0 1.993 -.117l.001 -1.768a2 2 0 0 0 -1.001 -3.732z\"/></svg>"
|
|
685
685
|
};
|
|
686
|
+
const ICON_SEARCH = {
|
|
687
|
+
name: "search",
|
|
688
|
+
variant: "outline",
|
|
689
|
+
svg: "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M3 10a7 7 0 1 0 14 0a7 7 0 1 0 -14 0\"/><path d=\"M21 21l-6 -6\"/></svg>"
|
|
690
|
+
};
|
|
691
|
+
const ICON_SEARCH_SOLID = {
|
|
692
|
+
name: "search",
|
|
693
|
+
variant: "solid",
|
|
694
|
+
svg: "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M14 3.072a8 8 0 0 1 2.32 11.834l5.387 5.387a1 1 0 0 1 -1.414 1.414l-5.388 -5.387a8 8 0 1 1 -.905 -13.249\"/></svg>"
|
|
695
|
+
};
|
|
696
|
+
const ICON_LOCK = {
|
|
697
|
+
name: "lock",
|
|
698
|
+
variant: "outline",
|
|
699
|
+
svg: "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M5 13a2 2 0 0 1 2 -2h10a2 2 0 0 1 2 2v6a2 2 0 0 1 -2 2h-10a2 2 0 0 1 -2 -2v-6\"/><path d=\"M11 16a1 1 0 1 0 2 0a1 1 0 0 0 -2 0\"/><path d=\"M8 11v-4a4 4 0 1 1 8 0v4\"/></svg>"
|
|
700
|
+
};
|
|
701
|
+
const ICON_LOCK_SOLID = {
|
|
702
|
+
name: "lock",
|
|
703
|
+
variant: "solid",
|
|
704
|
+
svg: "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M12 2a5 5 0 0 1 5 5v3a3 3 0 0 1 3 3v6a3 3 0 0 1 -3 3h-10a3 3 0 0 1 -3 -3v-6a3 3 0 0 1 3 -3v-3a5 5 0 0 1 5 -5m0 12a2 2 0 0 0 -1.995 1.85l-.005 .15a2 2 0 1 0 2 -2m0 -10a3 3 0 0 0 -3 3v3h6v-3a3 3 0 0 0 -3 -3\"/></svg>"
|
|
705
|
+
};
|
|
706
|
+
const ICON_DEVICE_TABLET = {
|
|
707
|
+
name: "device-tablet",
|
|
708
|
+
variant: "outline",
|
|
709
|
+
svg: "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M5 4a1 1 0 0 1 1 -1h12a1 1 0 0 1 1 1v16a1 1 0 0 1 -1 1h-12a1 1 0 0 1 -1 -1v-16\"/><path d=\"M11 17a1 1 0 1 0 2 0a1 1 0 0 0 -2 0\"/></svg>"
|
|
710
|
+
};
|
|
711
|
+
const ICON_DEVICE_TABLET_SOLID = {
|
|
712
|
+
name: "device-tablet",
|
|
713
|
+
variant: "solid",
|
|
714
|
+
svg: "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M18 2a2 2 0 0 1 1.995 1.85l.005 .15v16a2 2 0 0 1 -1.85 1.995l-.15 .005h-12a2 2 0 0 1 -1.995 -1.85l-.005 -.15v-16a2 2 0 0 1 1.85 -1.995l.15 -.005h12zm-6 13a2 2 0 0 0 -1.977 1.697l-.018 .154l-.005 .149l.005 .15a2 2 0 1 0 1.995 -2.15z\"/></svg>"
|
|
715
|
+
};
|
|
716
|
+
const ICON_PLAYER_PLAY = {
|
|
717
|
+
name: "player-play",
|
|
718
|
+
variant: "outline",
|
|
719
|
+
svg: "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M7 4v16l13 -8l-13 -8\"/></svg>"
|
|
720
|
+
};
|
|
721
|
+
const ICON_PLAYER_PLAY_SOLID = {
|
|
722
|
+
name: "player-play",
|
|
723
|
+
variant: "solid",
|
|
724
|
+
svg: "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M6 4v16a1 1 0 0 0 1.524 .852l13 -8a1 1 0 0 0 0 -1.704l-13 -8a1 1 0 0 0 -1.524 .852z\"/></svg>"
|
|
725
|
+
};
|
|
726
|
+
const ICON_PLAYER_PAUSE = {
|
|
727
|
+
name: "player-pause",
|
|
728
|
+
variant: "outline",
|
|
729
|
+
svg: "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M6 6a1 1 0 0 1 1 -1h2a1 1 0 0 1 1 1v12a1 1 0 0 1 -1 1h-2a1 1 0 0 1 -1 -1l0 -12\"/><path d=\"M14 6a1 1 0 0 1 1 -1h2a1 1 0 0 1 1 1v12a1 1 0 0 1 -1 1h-2a1 1 0 0 1 -1 -1l0 -12\"/></svg>"
|
|
730
|
+
};
|
|
731
|
+
const ICON_PLAYER_PAUSE_SOLID = {
|
|
732
|
+
name: "player-pause",
|
|
733
|
+
variant: "solid",
|
|
734
|
+
svg: "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M9 4h-2a2 2 0 0 0 -2 2v12a2 2 0 0 0 2 2h2a2 2 0 0 0 2 -2v-12a2 2 0 0 0 -2 -2z\"/><path d=\"M17 4h-2a2 2 0 0 0 -2 2v12a2 2 0 0 0 2 2h2a2 2 0 0 0 2 -2v-12a2 2 0 0 0 -2 -2z\"/></svg>"
|
|
735
|
+
};
|
|
736
|
+
const ICON_CLIPBOARD = {
|
|
737
|
+
name: "clipboard",
|
|
738
|
+
variant: "outline",
|
|
739
|
+
svg: "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M9 5h-2a2 2 0 0 0 -2 2v12a2 2 0 0 0 2 2h10a2 2 0 0 0 2 -2v-12a2 2 0 0 0 -2 -2h-2\"/><path d=\"M9 5a2 2 0 0 1 2 -2h2a2 2 0 0 1 2 2a2 2 0 0 1 -2 2h-2a2 2 0 0 1 -2 -2\"/></svg>"
|
|
740
|
+
};
|
|
741
|
+
const ICON_CLIPBOARD_SOLID = {
|
|
742
|
+
name: "clipboard",
|
|
743
|
+
variant: "solid",
|
|
744
|
+
svg: "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M17.997 4.17a3 3 0 0 1 2.003 2.83v12a3 3 0 0 1 -3 3h-10a3 3 0 0 1 -3 -3v-12a3 3 0 0 1 2.003 -2.83a4 4 0 0 0 3.997 3.83h4a4 4 0 0 0 3.98 -3.597zm-3.997 -2.17a2 2 0 1 1 0 4h-4a2 2 0 1 1 0 -4z\"/></svg>"
|
|
745
|
+
};
|
|
746
|
+
const ICON_ARROW_DOWN = {
|
|
747
|
+
name: "arrow-down",
|
|
748
|
+
variant: "outline",
|
|
749
|
+
svg: "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M12 5l0 14\"/><path d=\"M18 13l-6 6\"/><path d=\"M6 13l6 6\"/></svg>"
|
|
750
|
+
};
|
|
686
751
|
const BUNDLED_ICONS = [
|
|
687
752
|
ICON_HOME,
|
|
688
753
|
ICON_HOME_SOLID,
|
|
@@ -820,8 +885,21 @@ const BUNDLED_ICONS = [
|
|
|
820
885
|
ICON_WALLET,
|
|
821
886
|
ICON_BUILDING_BANK,
|
|
822
887
|
ICON_SHIELD_LOCK,
|
|
823
|
-
ICON_SHIELD_LOCK_SOLID
|
|
888
|
+
ICON_SHIELD_LOCK_SOLID,
|
|
889
|
+
ICON_SEARCH,
|
|
890
|
+
ICON_SEARCH_SOLID,
|
|
891
|
+
ICON_LOCK,
|
|
892
|
+
ICON_LOCK_SOLID,
|
|
893
|
+
ICON_DEVICE_TABLET,
|
|
894
|
+
ICON_DEVICE_TABLET_SOLID,
|
|
895
|
+
ICON_PLAYER_PLAY,
|
|
896
|
+
ICON_PLAYER_PLAY_SOLID,
|
|
897
|
+
ICON_PLAYER_PAUSE,
|
|
898
|
+
ICON_PLAYER_PAUSE_SOLID,
|
|
899
|
+
ICON_CLIPBOARD,
|
|
900
|
+
ICON_CLIPBOARD_SOLID,
|
|
901
|
+
ICON_ARROW_DOWN
|
|
824
902
|
];
|
|
825
|
-
export { BUNDLED_ICONS, ICON_ALERT_CIRCLE, ICON_ALERT_CIRCLE_SOLID, ICON_ALERT_TRIANGLE, ICON_ALERT_TRIANGLE_SOLID, ICON_ARROW_LEFT, ICON_ARROW_PATH, ICON_ARROW_PATH_SOLID, ICON_ARROW_RIGHT, ICON_ARROW_TRENDING_DOWN, ICON_ARROW_TRENDING_DOWN_SOLID, ICON_ARROW_TRENDING_UP, ICON_ARROW_TRENDING_UP_SOLID, ICON_BANKNOTES, ICON_BANKNOTES_SOLID, ICON_BARS_3, ICON_BARS_3_SOLID, ICON_BELL_ALERT, ICON_BELL_ALERT_SOLID, ICON_BELL_SLASH, ICON_BELL_SLASH_SOLID, ICON_BOLT, ICON_BOLT_SOLID, ICON_BUILDING_BANK, ICON_BUILDING_LIBRARY, ICON_BUILDING_LIBRARY_SOLID, ICON_CALENDAR, ICON_CALENDAR_SOLID, ICON_CHART_BAR, ICON_CHART_BAR_SOLID, ICON_CHART_BAR_SQUARE, ICON_CHART_BAR_SQUARE_SOLID, ICON_CHECK, ICON_CHECK_CIRCLE, ICON_CHECK_CIRCLE_SOLID, ICON_CHECK_SOLID, ICON_CHEVRON_DOWN, ICON_CHEVRON_DOWN_SOLID, ICON_CHEVRON_LEFT, ICON_CHEVRON_RIGHT, ICON_CHEVRON_RIGHT_SOLID, ICON_CHEVRON_UP, ICON_CHEVRON_UP_SOLID, ICON_CIRCLE_CHECK, ICON_CIRCLE_CHECK_SOLID, ICON_CIRCLE_X, ICON_CIRCLE_X_SOLID, ICON_CLOCK, ICON_CLOCK_SOLID, ICON_COPY, ICON_COPY_SOLID, ICON_DEVICE_DESKTOP, ICON_DEVICE_DESKTOP_SOLID, ICON_DEVICE_LAPTOP, ICON_DEVICE_MOBILE, ICON_DEVICE_MOBILE_SOLID, ICON_DOCUMENT_DUPLICATE, ICON_DOCUMENT_DUPLICATE_SOLID, ICON_DOTS, ICON_DOTS_SOLID, ICON_EXCLAMATION_CIRCLE, ICON_EXCLAMATION_CIRCLE_SOLID, ICON_EXCLAMATION_TRIANGLE, ICON_EXCLAMATION_TRIANGLE_SOLID, ICON_EXTERNAL_LINK, ICON_EXTERNAL_LINK_SOLID, ICON_EYE, ICON_EYE_SLASH, ICON_EYE_SLASH_SOLID, ICON_EYE_SOLID, ICON_FILE, ICON_FILE_SOLID, ICON_FILE_TEXT, ICON_FILE_TEXT_SOLID, ICON_GLOBE_ALT, ICON_GLOBE_ALT_SOLID, ICON_HASHTAG, ICON_HASHTAG_SOLID, ICON_HOME, ICON_HOME_SOLID, ICON_INFORMATION_CIRCLE, ICON_INFORMATION_CIRCLE_SOLID, ICON_INFO_CIRCLE, ICON_INFO_CIRCLE_SOLID, ICON_KEY, ICON_KEY_SOLID, ICON_LIGHT_BULB, ICON_LIGHT_BULB_SOLID, ICON_LINK, ICON_LINK_SOLID, ICON_LOGIN, ICON_LOGOUT, ICON_MAIL, ICON_MAIL_SOLID, ICON_MENU_2, ICON_MENU_2_SOLID, ICON_MOON, ICON_MOON_SOLID, ICON_PASSWORD, ICON_PENCIL, ICON_PENCIL_SOLID, ICON_PERCENT_BADGE, ICON_PERCENT_BADGE_SOLID, ICON_PLAY, ICON_PLAY_CIRCLE, ICON_PLAY_CIRCLE_SOLID, ICON_PLAY_SOLID, ICON_PLUG_CONNECTED, ICON_PLUS, ICON_PLUS_SOLID, ICON_PRESENTATION_CHART_LINE, ICON_PRESENTATION_CHART_LINE_SOLID, ICON_ROBOT, ICON_SETTINGS, ICON_SETTINGS_SOLID, ICON_SHARE, ICON_SHIELD_CHECK, ICON_SHIELD_CHECK_SOLID, ICON_SHIELD_LOCK, ICON_SHIELD_LOCK_SOLID, ICON_STAR, ICON_STAR_SOLID, ICON_SUN, ICON_SUN_SOLID, ICON_TRASH, ICON_TRASH_SOLID, ICON_USER, ICON_USERS, ICON_USER_PLUS, ICON_USER_SOLID, ICON_WALLET, ICON_WIFI_OFF, ICON_WORLD, ICON_WORLD_SOLID, ICON_X, ICON_X_MARK, ICON_X_MARK_SOLID, ICON_X_SOLID };
|
|
903
|
+
export { BUNDLED_ICONS, ICON_ALERT_CIRCLE, ICON_ALERT_CIRCLE_SOLID, ICON_ALERT_TRIANGLE, ICON_ALERT_TRIANGLE_SOLID, ICON_ARROW_DOWN, ICON_ARROW_LEFT, ICON_ARROW_PATH, ICON_ARROW_PATH_SOLID, ICON_ARROW_RIGHT, ICON_ARROW_TRENDING_DOWN, ICON_ARROW_TRENDING_DOWN_SOLID, ICON_ARROW_TRENDING_UP, ICON_ARROW_TRENDING_UP_SOLID, ICON_BANKNOTES, ICON_BANKNOTES_SOLID, ICON_BARS_3, ICON_BARS_3_SOLID, ICON_BELL_ALERT, ICON_BELL_ALERT_SOLID, ICON_BELL_SLASH, ICON_BELL_SLASH_SOLID, ICON_BOLT, ICON_BOLT_SOLID, ICON_BUILDING_BANK, ICON_BUILDING_LIBRARY, ICON_BUILDING_LIBRARY_SOLID, ICON_CALENDAR, ICON_CALENDAR_SOLID, ICON_CHART_BAR, ICON_CHART_BAR_SOLID, ICON_CHART_BAR_SQUARE, ICON_CHART_BAR_SQUARE_SOLID, ICON_CHECK, ICON_CHECK_CIRCLE, ICON_CHECK_CIRCLE_SOLID, ICON_CHECK_SOLID, ICON_CHEVRON_DOWN, ICON_CHEVRON_DOWN_SOLID, ICON_CHEVRON_LEFT, ICON_CHEVRON_RIGHT, ICON_CHEVRON_RIGHT_SOLID, ICON_CHEVRON_UP, ICON_CHEVRON_UP_SOLID, ICON_CIRCLE_CHECK, ICON_CIRCLE_CHECK_SOLID, ICON_CIRCLE_X, ICON_CIRCLE_X_SOLID, ICON_CLIPBOARD, ICON_CLIPBOARD_SOLID, ICON_CLOCK, ICON_CLOCK_SOLID, ICON_COPY, ICON_COPY_SOLID, ICON_DEVICE_DESKTOP, ICON_DEVICE_DESKTOP_SOLID, ICON_DEVICE_LAPTOP, ICON_DEVICE_MOBILE, ICON_DEVICE_MOBILE_SOLID, ICON_DEVICE_TABLET, ICON_DEVICE_TABLET_SOLID, ICON_DOCUMENT_DUPLICATE, ICON_DOCUMENT_DUPLICATE_SOLID, ICON_DOTS, ICON_DOTS_SOLID, ICON_EXCLAMATION_CIRCLE, ICON_EXCLAMATION_CIRCLE_SOLID, ICON_EXCLAMATION_TRIANGLE, ICON_EXCLAMATION_TRIANGLE_SOLID, ICON_EXTERNAL_LINK, ICON_EXTERNAL_LINK_SOLID, ICON_EYE, ICON_EYE_SLASH, ICON_EYE_SLASH_SOLID, ICON_EYE_SOLID, ICON_FILE, ICON_FILE_SOLID, ICON_FILE_TEXT, ICON_FILE_TEXT_SOLID, ICON_GLOBE_ALT, ICON_GLOBE_ALT_SOLID, ICON_HASHTAG, ICON_HASHTAG_SOLID, ICON_HOME, ICON_HOME_SOLID, ICON_INFORMATION_CIRCLE, ICON_INFORMATION_CIRCLE_SOLID, ICON_INFO_CIRCLE, ICON_INFO_CIRCLE_SOLID, ICON_KEY, ICON_KEY_SOLID, ICON_LIGHT_BULB, ICON_LIGHT_BULB_SOLID, ICON_LINK, ICON_LINK_SOLID, ICON_LOCK, ICON_LOCK_SOLID, ICON_LOGIN, ICON_LOGOUT, ICON_MAIL, ICON_MAIL_SOLID, ICON_MENU_2, ICON_MENU_2_SOLID, ICON_MOON, ICON_MOON_SOLID, ICON_PASSWORD, ICON_PENCIL, ICON_PENCIL_SOLID, ICON_PERCENT_BADGE, ICON_PERCENT_BADGE_SOLID, ICON_PLAY, ICON_PLAYER_PAUSE, ICON_PLAYER_PAUSE_SOLID, ICON_PLAYER_PLAY, ICON_PLAYER_PLAY_SOLID, ICON_PLAY_CIRCLE, ICON_PLAY_CIRCLE_SOLID, ICON_PLAY_SOLID, ICON_PLUG_CONNECTED, ICON_PLUS, ICON_PLUS_SOLID, ICON_PRESENTATION_CHART_LINE, ICON_PRESENTATION_CHART_LINE_SOLID, ICON_ROBOT, ICON_SEARCH, ICON_SEARCH_SOLID, ICON_SETTINGS, ICON_SETTINGS_SOLID, ICON_SHARE, ICON_SHIELD_CHECK, ICON_SHIELD_CHECK_SOLID, ICON_SHIELD_LOCK, ICON_SHIELD_LOCK_SOLID, ICON_STAR, ICON_STAR_SOLID, ICON_SUN, ICON_SUN_SOLID, ICON_TRASH, ICON_TRASH_SOLID, ICON_USER, ICON_USERS, ICON_USER_PLUS, ICON_USER_SOLID, ICON_WALLET, ICON_WIFI_OFF, ICON_WORLD, ICON_WORLD_SOLID, ICON_X, ICON_X_MARK, ICON_X_MARK_SOLID, ICON_X_SOLID };
|
|
826
904
|
|
|
827
905
|
//# sourceMappingURL=lifecorner-angular-ui-kit-icons.mjs.map
|