@shival99/z-ui 2.1.5 → 2.1.7

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.
@@ -254,6 +254,51 @@ function normalizeLucideSvg(svg) {
254
254
  const cssVar = 'style="stroke-width: var(--ng-icon__stroke-width, 2)"';
255
255
  return svg.replace(/stroke-width="[^"]*"/gi, cssVar);
256
256
  }
257
+ /**
258
+ * Phosphor SVGs already ship with fill="currentColor" and no stroke-width,
259
+ * so no normalization is required. Kept as an explicit passthrough for parity
260
+ * with the other icon families.
261
+ */
262
+ function normalizePhosphorSvg(svg) {
263
+ return svg;
264
+ }
265
+ /**
266
+ * HugeIcons ships each icon as an ESM module exporting a path-array
267
+ * (e.g. `const HeartIcon = [["path", { d: "...", stroke: "currentColor", strokeWidth: "1.5" }]]`),
268
+ * not a ready-made SVG. This converts that module source into an `<svg>` string
269
+ * suitable for ng-icon, mapping camelCase attributes to kebab-case and wiring
270
+ * stroke-width to the ng-icon CSS variable.
271
+ */
272
+ function normalizeHugeIconModule(moduleSource) {
273
+ const elements = [];
274
+ const elementRegex = /\[\s*"([a-zA-Z]+)"\s*,\s*\{([^}]*)\}\s*\]/g;
275
+ let match;
276
+ while ((match = elementRegex.exec(moduleSource)) !== null) {
277
+ const tag = match[1];
278
+ const attrsBody = match[2];
279
+ const attrs = [];
280
+ const attrRegex = /([a-zA-Z]+)\s*:\s*"([^"]*)"/g;
281
+ let attrMatch;
282
+ while ((attrMatch = attrRegex.exec(attrsBody)) !== null) {
283
+ const rawKey = attrMatch[1];
284
+ const value = attrMatch[2];
285
+ if (rawKey === 'key') {
286
+ continue;
287
+ }
288
+ if (rawKey === 'strokeWidth') {
289
+ attrs.push(`style="stroke-width:var(--ng-icon__stroke-width, ${value})"`);
290
+ continue;
291
+ }
292
+ const attrName = rawKey.replace(/([a-z])([A-Z])/g, '$1-$2').toLowerCase();
293
+ attrs.push(`${attrName}="${value}"`);
294
+ }
295
+ elements.push(`<${tag} ${attrs.join(' ')}></${tag}>`);
296
+ }
297
+ if (elements.length === 0) {
298
+ return '';
299
+ }
300
+ return `<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" xmlns="http://www.w3.org/2000/svg">${elements.join('')}</svg>`;
301
+ }
257
302
  function getFallbackIcon(name) {
258
303
  const icon = Z_ICONS[name];
259
304
  if (icon) {
@@ -307,8 +352,49 @@ function convertIconSaxIconName(name) {
307
352
  .replace(/--+/g, '-');
308
353
  return { style: styleFolder, iconName };
309
354
  }
355
+ /**
356
+ * Converts ng-icons Phosphor icon name to CDN format.
357
+ * Phosphor weights map to folders, and every weight except "regular" carries a
358
+ * file-name suffix (e.g. heart-bold.svg), while regular is just heart.svg.
359
+ * Examples:
360
+ * - phosphorHeart -> regular/heart
361
+ * - phosphorHeartBold -> bold/heart-bold
362
+ * - phosphorHeartFill -> fill/heart-fill
363
+ * - phosphorHeartDuotone -> duotone/heart-duotone
364
+ * - phosphorAddressBookTabsLight -> light/address-book-tabs-light
365
+ */
366
+ function convertPhosphorIconName(name) {
367
+ let iconPart = name.replace(/^phosphor/, '');
368
+ const weightMatch = iconPart.match(/(Bold|Fill|Light|Thin|Duotone)$/);
369
+ const weight = weightMatch ? weightMatch[1].toLowerCase() : 'regular';
370
+ if (weightMatch) {
371
+ iconPart = iconPart.replace(/(Bold|Fill|Light|Thin|Duotone)$/, '');
372
+ }
373
+ const kebab = iconPart
374
+ .replace(/([a-z0-9])([A-Z])/g, '$1-$2')
375
+ .replace(/([A-Z])([A-Z][a-z])/g, '$1-$2')
376
+ .toLowerCase()
377
+ .replace(/^-/, '')
378
+ .replace(/--+/g, '-');
379
+ const iconName = weight === 'regular' ? kebab : `${kebab}-${weight}`;
380
+ return { weight, iconName };
381
+ }
382
+ /**
383
+ * Converts ng-icons-style Huge icon name to the @hugeicons/core-free-icons
384
+ * CDN module name. We expose icons with a `huge` prefix over the original
385
+ * PascalCase export name, so we just strip the prefix and append `Icon`.
386
+ * Examples:
387
+ * - hugeHeart -> HeartIcon
388
+ * - hugeHome01 -> Home01Icon
389
+ * - hugeFirstBracketCircle -> FirstBracketCircleIcon
390
+ */
391
+ function convertHugeIconName(name) {
392
+ return `${name.replace(/^huge/, '')}Icon`;
393
+ }
310
394
  const LUCIDE_CDN_URL = 'https://cdn.jsdelivr.net/npm/lucide-static@latest/icons';
311
395
  const SAX_CDN_URL = 'https://cdn.jsdelivr.net/gh/placetopay-org/iconsax-vue@main/src/Base';
396
+ const PHOSPHOR_CDN_URL = 'https://cdn.jsdelivr.net/npm/@phosphor-icons/core@latest/assets';
397
+ const HUGE_CDN_URL = 'https://cdn.jsdelivr.net/npm/@hugeicons/core-free-icons@4.2.1/dist/esm';
312
398
  /**
313
399
  * Provides hybrid icon loading from CDN with fallback to bundled icons:
314
400
  * - Primary: Load icons from CDN (Lucide & Iconsax)
@@ -354,6 +440,16 @@ function provideZIconLoader() {
354
440
  const url = `${LUCIDE_CDN_URL}/${iconName}.svg`;
355
441
  return loadWithCache(name, url, http, normalizeLucideSvg);
356
442
  }
443
+ if (name.startsWith('phosphor')) {
444
+ const { weight, iconName } = convertPhosphorIconName(name);
445
+ const url = `${PHOSPHOR_CDN_URL}/${weight}/${iconName}.svg`;
446
+ return loadWithCache(name, url, http, normalizePhosphorSvg);
447
+ }
448
+ if (name.startsWith('huge')) {
449
+ const moduleName = convertHugeIconName(name);
450
+ const url = `${HUGE_CDN_URL}/${moduleName}.js`;
451
+ return loadWithCache(name, url, http, normalizeHugeIconModule);
452
+ }
357
453
  // console.warn(`[ZIcon] Unknown icon: "${name}"`);
358
454
  return of(getFallbackIcon(name));
359
455
  }, withCaching()),
@@ -1 +1 @@
1
- {"version":3,"file":"shival99-z-ui-components-z-icon.mjs","sources":["../../../../libs/core-ui/components/z-icon/z-animated-icons.ts","../../../../libs/core-ui/components/z-icon/z-icon-cache.ts","../../../../libs/core-ui/components/z-icon/z-icon.variants.ts","../../../../libs/core-ui/components/z-icon/z-icon.component.ts","../../../../libs/core-ui/components/z-icon/z-icon.component.html","../../../../libs/core-ui/components/z-icon/z-icons.ts","../../../../libs/core-ui/components/z-icon/z-icon-loader.provider.ts","../../../../libs/core-ui/components/z-icon/shival99-z-ui-components-z-icon.ts"],"sourcesContent":["import { type Type } from '@angular/core';\nimport * as animatedIcons from 'ng-animated-icons';\n\ntype ZAnimatedIconExport = Extract<keyof typeof animatedIcons, `${string}Icon`>;\ntype ZBrokenAnimatedIconExport = 'AudioLinesIcon';\ntype ZSafeAnimatedIconExport = Exclude<ZAnimatedIconExport, ZBrokenAnimatedIconExport>;\n\ntype ZStripIconSuffix<T extends string> = T extends `${infer Name}Icon` ? Name : T;\n\ntype ZKebabCase<T extends string, Previous extends string = ''> = T extends `${infer Head}${infer Tail}`\n ? Tail extends Uncapitalize<Tail>\n ? Head extends `${number}`\n ? Previous extends '' | '-' | `${number}`\n ? `${Head}${ZKebabCase<Tail, Head>}`\n : `-${Head}${ZKebabCase<Tail, Head>}`\n : `${Lowercase<Head>}${ZKebabCase<Tail, Head>}`\n : `${Lowercase<Head>}-${ZKebabCase<Tail, '-'>}`\n : T;\n\ntype ZAnimatedIconName = ZKebabCase<ZStripIconSuffix<ZSafeAnimatedIconExport>>;\n\nexport type ZAnimatedIcon = ZAnimatedIconName;\n\nconst ANIMATED_ICONS = animatedIcons as unknown as Record<ZAnimatedIconExport, Type<unknown>>;\nconst BROKEN_ANIMATED_ICON_EXPORTS = new Set<ZAnimatedIconExport>(['AudioLinesIcon']);\n\nexport const Z_ANIMATED_ICONS = Object.fromEntries(\n (\n Object.entries(ANIMATED_ICONS).filter(\n ([exportName]) =>\n exportName.endsWith('Icon') && !BROKEN_ANIMATED_ICON_EXPORTS.has(exportName as ZAnimatedIconExport)\n ) as [ZSafeAnimatedIconExport, Type<unknown>][]\n ).map(([exportName, icon]) => [toKebabIconName(exportName), icon])\n) as Record<ZAnimatedIcon, Type<unknown>>;\n\nexport function getZAnimatedIconComponent(iconName: ZAnimatedIcon): Type<unknown> | null {\n return Z_ANIMATED_ICONS[iconName] ?? null;\n}\n\nfunction toKebabIconName(exportName: string): ZAnimatedIcon {\n const iconName = exportName.endsWith('Icon') ? exportName.slice(0, -4) : exportName;\n\n return iconName\n .replace(/([a-z])([0-9])/g, '$1-$2')\n .replace(/([0-9])([A-Z])/g, '$1-$2')\n .replace(/([a-z0-9])([A-Z])/g, '$1-$2')\n .toLowerCase() as ZAnimatedIcon;\n}\n","import { isDevMode } from '@angular/core';\nimport { ZIndexDbService } from '@shival99/z-ui/services';\n\nexport const Z_ICON_CACHE_DB_NAME = 'ZIconCache';\nexport const Z_ICON_CACHE_STORE = 'zIcons';\n\nexport const zIconCacheDb = new ZIndexDbService({\n dbName: Z_ICON_CACHE_DB_NAME,\n version: 1,\n stores: [{ name: Z_ICON_CACHE_STORE, encrypt: !isDevMode() }],\n defaultStore: Z_ICON_CACHE_STORE,\n});\n","import { cva, type VariantProps } from 'class-variance-authority';\n\nconst zIconSizeVariants = Object.fromEntries(\n Array.from({ length: 100 - 10 + 1 }, (_, index) => {\n const size = String(10 + index);\n return [size, `size-${size}`];\n })\n);\n\nexport const zIconVariants = cva('', {\n variants: {\n zSize: zIconSizeVariants,\n },\n defaultVariants: {\n zSize: '16',\n },\n});\n\nexport type ZIconSize = `${number}`;\nexport type ZIconVariants = VariantProps<typeof zIconVariants>;\n","import { NgComponentOutlet } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n input,\n signal,\n type Type,\n ViewEncapsulation,\n} from '@angular/core';\nimport { NgIconComponent as NgIcon } from '@ng-icons/core';\nimport { zMergeClasses } from '@shival99/z-ui/utils';\nimport type { ClassValue } from 'clsx';\nimport { getZAnimatedIconComponent, type ZAnimatedIcon } from './z-animated-icons';\nimport { Z_ICON_CACHE_STORE, zIconCacheDb } from './z-icon-cache';\nimport { zIconVariants, type ZIconVariants } from './z-icon.variants';\nimport { type ZIcon } from './z-icons';\n\nexport type ZIconAnimationTrigger = 'manual' | 'hover' | 'focus' | 'interaction' | 'always';\n\n@Component({\n selector: 'z-icon, [z-icon]',\n imports: [NgIcon, NgComponentOutlet],\n standalone: true,\n templateUrl: './z-icon.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: {\n '[class]': 'zClasses()',\n '[style.width]': 'normalizedSize() + \"px\"',\n '[style.height]': 'normalizedSize() + \"px\"',\n '(mouseenter)': 'setHoverActive(true)',\n '(mouseleave)': 'setHoverActive(false)',\n '(focusin)': 'setFocusActive(true)',\n '(focusout)': 'setFocusActive(false)',\n '(touchstart)': 'setTouchActive(true)',\n '(touchend)': 'setTouchActive(false)',\n },\n})\nexport class ZIconComponent {\n public readonly class = input<ClassValue>('');\n public readonly zType = input<ZIcon>();\n public readonly zAnimatedType = input<ZAnimatedIcon>();\n public readonly zAnimate = input(false);\n public readonly zAnimationTrigger = input<ZIconAnimationTrigger>('manual');\n public readonly zSize = input<ZIconVariants['zSize']>('16');\n public readonly zStrokeWidth = input<number>(2);\n public readonly zSvg = input<string>('');\n protected readonly resolvedSvg = signal('');\n protected readonly isHoverActive = signal(false);\n protected readonly isFocusActive = signal(false);\n protected readonly isTouchActive = signal(false);\n protected readonly normalizedSize = computed(() => {\n const size = this.zSize();\n if (size === null || size === undefined || size === '') {\n return '16';\n }\n\n return String(size);\n });\n\n private readonly _svgFetchError = signal<string>('');\n\n protected readonly zClasses = computed(() =>\n zMergeClasses(\n zIconVariants({ zSize: this.zSize() }),\n this.class(),\n this.zStrokeWidth() === 0 ? 'stroke-none' : '',\n 'inline-flex shrink-0'\n )\n );\n\n protected readonly animatedIcon = computed<Type<unknown> | null>(() => {\n const animatedType = this.zAnimatedType();\n if (!animatedType) {\n return null;\n }\n\n return getZAnimatedIconComponent(animatedType);\n });\n\n protected readonly animatedIconInputs = computed<Record<string, unknown>>(() => ({\n animate: this.shouldAnimate(),\n color: 'currentColor',\n size: Number(this.normalizedSize()),\n strokeWidth: this.zStrokeWidth(),\n }));\n\n protected readonly shouldAnimate = computed(() => {\n const trigger = this.zAnimationTrigger();\n if (trigger === 'always' || this.zAnimate()) {\n return true;\n }\n\n if (trigger === 'hover') {\n return this.isHoverActive() || this.isTouchActive();\n }\n\n if (trigger === 'focus') {\n return this.isFocusActive();\n }\n\n if (trigger === 'interaction') {\n return this.isHoverActive() || this.isFocusActive() || this.isTouchActive();\n }\n\n return false;\n });\n\n constructor() {\n effect(onCleanup => {\n const svgInput = this.zSvg().trim();\n if (!svgInput) {\n this.resolvedSvg.set('');\n this._svgFetchError.set('');\n return;\n }\n\n if (this._isRawSvg(svgInput)) {\n this.resolvedSvg.set(this._normalizeCustomSvg(svgInput));\n this._svgFetchError.set('');\n return;\n }\n\n if (!this._isSvgPath(svgInput)) {\n this.resolvedSvg.set('');\n this._svgFetchError.set('Unsupported SVG input format.');\n return;\n }\n\n const controller = new AbortController();\n onCleanup(() => controller.abort());\n\n const cacheKey = `zsvg:path:${svgInput}`;\n void zIconCacheDb\n .get<string>(cacheKey, { storeName: Z_ICON_CACHE_STORE })\n .then(cachedSvg => {\n if (controller.signal.aborted) {\n return null;\n }\n if (cachedSvg && this._isRawSvg(cachedSvg.trim())) {\n this.resolvedSvg.set(this._normalizeCustomSvg(cachedSvg));\n this._svgFetchError.set('');\n return null;\n }\n\n return fetch(svgInput, { signal: controller.signal }).then(response => {\n if (!response.ok) {\n throw new Error(`Failed to fetch SVG from \"${svgInput}\"`);\n }\n return response.text();\n });\n })\n .then(svgContent => {\n if (controller.signal.aborted || !svgContent) {\n return;\n }\n\n if (!this._isRawSvg(svgContent.trim())) {\n throw new Error(`Invalid SVG content loaded from \"${svgInput}\"`);\n }\n\n const normalizedSvg = this._normalizeCustomSvg(svgContent);\n this.resolvedSvg.set(normalizedSvg);\n this._svgFetchError.set('');\n void zIconCacheDb.set(cacheKey, normalizedSvg, { storeName: Z_ICON_CACHE_STORE }).catch(console.error);\n })\n .catch(error => {\n if (controller.signal.aborted) {\n return;\n }\n console.error('[z-icon] Failed to load zSvg path:', error);\n this.resolvedSvg.set('');\n this._svgFetchError.set('Unable to load SVG path.');\n });\n });\n }\n\n private _isRawSvg(value: string): boolean {\n return value.startsWith('<svg');\n }\n\n protected setHoverActive(isActive: boolean): void {\n this.isHoverActive.set(isActive);\n }\n\n protected setFocusActive(isActive: boolean): void {\n this.isFocusActive.set(isActive);\n }\n\n protected setTouchActive(isActive: boolean): void {\n this.isTouchActive.set(isActive);\n }\n\n private _isSvgPath(value: string): boolean {\n return value.endsWith('.svg') || value.includes('/');\n }\n\n private _normalizeCustomSvg(svg: string): string {\n try {\n const parser = new DOMParser();\n const doc = parser.parseFromString(svg, 'image/svg+xml');\n const svgEl = doc.documentElement;\n if (svgEl.tagName.toLowerCase() !== 'svg') {\n return svg;\n }\n\n const width = svgEl.getAttribute('width');\n const height = svgEl.getAttribute('height');\n if (\n !svgEl.getAttribute('viewBox') &&\n width &&\n height &&\n !Number.isNaN(Number(width)) &&\n !Number.isNaN(Number(height))\n ) {\n svgEl.setAttribute('viewBox', `0 0 ${width} ${height}`);\n }\n\n svgEl.removeAttribute('width');\n svgEl.removeAttribute('height');\n\n const allNodes = [svgEl, ...Array.from(svgEl.querySelectorAll('*'))];\n allNodes.forEach(node => {\n const fill = node.getAttribute('fill');\n if (fill && fill !== 'none' && fill !== 'currentColor') {\n node.setAttribute('fill', 'currentColor');\n }\n\n const stroke = node.getAttribute('stroke');\n if (stroke && stroke !== 'none' && stroke !== 'currentColor') {\n node.setAttribute('stroke', 'currentColor');\n }\n\n if (node.hasAttribute('stroke-width')) {\n node.removeAttribute('stroke-width');\n const currentStyle = node.getAttribute('style') ?? '';\n const normalizedStyle = currentStyle.trim();\n const strokeWidthStyle = 'stroke-width: var(--ng-icon__stroke-width, 2)';\n node.setAttribute('style', normalizedStyle ? `${normalizedStyle}; ${strokeWidthStyle}` : strokeWidthStyle);\n }\n });\n\n return svgEl.outerHTML;\n } catch {\n return svg;\n }\n }\n}\n","@if (animatedIcon()) {\n <ng-container [ngComponentOutlet]=\"animatedIcon()\" [ngComponentOutletInputs]=\"animatedIconInputs()\" />\n} @else if (resolvedSvg()) {\n <ng-icon [svg]=\"resolvedSvg()\" [size]=\"normalizedSize()\" [strokeWidth]=\"zStrokeWidth()\" />\n} @else if (!zSvg()) {\n <ng-icon [name]=\"zType()\" [size]=\"normalizedSize()\" [strokeWidth]=\"zStrokeWidth()\" />\n}\n","import { type IconType } from '@ng-icons/core';\nimport type * as saxBoldIcons from '@ng-icons/iconsax/bold';\nimport type * as saxOutlineIcons from '@ng-icons/iconsax/outline';\nimport type * as lucideIcons from '@ng-icons/lucide';\n\ntype ZLucideIcon = Extract<keyof typeof lucideIcons, `lucide${string}`>;\ntype ZSaxIcon = Extract<keyof typeof saxBoldIcons | keyof typeof saxOutlineIcons, `sax${string}`>;\n\nexport const Z_ICONS = {} as const satisfies Record<string, IconType>;\n\nexport type ZIcon = ZLucideIcon | ZSaxIcon;\n","import { HttpClient } from '@angular/common/http';\nimport { type EnvironmentProviders, inject, makeEnvironmentProviders } from '@angular/core';\nimport { provideNgIconLoader, withCaching } from '@ng-icons/core';\nimport { catchError, from, map, type Observable, of, switchMap, tap } from 'rxjs';\nimport { Z_ICON_CACHE_STORE, zIconCacheDb } from './z-icon-cache';\nimport { Z_ICONS } from './z-icons';\n\n/**\n * Normalizes Sax SVG to use currentColor and CSS variable for stroke-width.\n * This allows the icon to inherit color and strokeWidth from ng-icon props.\n */\nfunction normalizeSaxSvg(svg: string): string {\n const cssVar = 'style=\"stroke-width: var(--ng-icon__stroke-width, 2)\"';\n const normalized = svg.replace(/fill=\"#292D32\"/gi, 'fill=\"currentColor\"');\n return normalized.replace(/stroke-width=\"[^\"]*\"/gi, cssVar);\n}\n\n/**\n * Normalizes Lucide SVG to use CSS variable for stroke-width.\n * This allows ng-icon strokeWidth prop to work correctly.\n * Replaces hardcoded stroke-width with var(--ng-icon__stroke-width, 2).\n */\nfunction normalizeLucideSvg(svg: string): string {\n const cssVar = 'style=\"stroke-width: var(--ng-icon__stroke-width, 2)\"';\n return svg.replace(/stroke-width=\"[^\"]*\"/gi, cssVar);\n}\n\nfunction getFallbackIcon(name: string): string {\n const icon = Z_ICONS[name as keyof typeof Z_ICONS];\n if (icon) {\n // console.warn(`[ZIcon] Using bundled fallback for \"${name}\"`);\n return icon;\n }\n return '';\n}\n\n/**\n * Converts ng-icons icon name to Lucide CDN format.\n * Examples:\n * - lucideArrowLeft -> arrow-left\n * - lucideAlertCircle -> alert-circle\n * - lucideTrash2 -> trash-2\n * - lucideGrid3x3 -> grid-3-x-3\n */\nfunction convertLucideIconName(name: string): string {\n return name\n .replace(/^lucide/, '')\n .replace(/([A-Z])/g, '-$1')\n .replace(/(\\d+)/g, '-$1')\n .replace(/(\\d)([a-z])/g, '$1-$2')\n .toLowerCase()\n .replace(/^-/, '')\n .replace(/--+/g, '-');\n}\n\n/**\n * Converts ng-icons Sax icon name to CDN format.\n * Examples:\n * - saxCloudChangeBold -> bold/cloud-change\n * - saxPauseBold -> bold/pause\n * - saxRefreshBold -> bold/refresh\n * - saxHomeOutline -> outline/home\n * - saxUserLinear -> linear/user\n */\nfunction convertIconSaxIconName(name: string): { style: string; iconName: string } | null {\n let iconPart = name.replace(/^sax/, '');\n // Extract style suffix (Bold, Outline, Linear, Bulk, Broken, TwoTone)\n const styleMatch = iconPart.match(/(Bold|Outline|Linear|Bulk|Broken|TwoTone)$/i);\n if (!styleMatch) {\n return null;\n }\n\n const style = styleMatch[1].toLowerCase();\n const styleFolder = style === 'twotone' ? 'twotone' : style;\n iconPart = iconPart.replace(/(Bold|Outline|Linear|Bulk|Broken|TwoTone)$/i, '');\n const iconName = iconPart\n .replace(/([A-Z])/g, '-$1')\n .replace(/(\\d+)/g, '-$1')\n .toLowerCase()\n .replace(/^-/, '')\n .replace(/--+/g, '-');\n\n return { style: styleFolder, iconName };\n}\n\nconst LUCIDE_CDN_URL = 'https://cdn.jsdelivr.net/npm/lucide-static@latest/icons';\nconst SAX_CDN_URL = 'https://cdn.jsdelivr.net/gh/placetopay-org/iconsax-vue@main/src/Base';\n\n/**\n * Provides hybrid icon loading from CDN with fallback to bundled icons:\n * - Primary: Load icons from CDN (Lucide & Iconsax)\n * - Fallback: Use bundled icons from Z_ICONS if CDN fails\n *\n * @example\n * ```typescript\n * // app.config.ts\n * providers: [\n * provideHttpClient(),\n * provideZIconLoader(),\n * ]\n * ```\n */\nfunction loadWithCache(\n name: string,\n url: string,\n http: HttpClient,\n normalizer: (svg: string) => string\n): Observable<string> {\n return from(zIconCacheDb.get<string>(name, { storeName: Z_ICON_CACHE_STORE })).pipe(\n switchMap(cached => {\n if (cached) {\n return of(cached);\n }\n\n return http.get(url, { responseType: 'text' }).pipe(\n map(normalizer),\n tap(svg => {\n void zIconCacheDb.set(name, svg, { storeName: Z_ICON_CACHE_STORE });\n }),\n catchError(error => {\n console.error(`[ZIcon] Failed to load \"${name}\" from ${url}`, error);\n return of(getFallbackIcon(name));\n })\n );\n }),\n catchError(() => of(getFallbackIcon(name)))\n );\n}\n\nexport function provideZIconLoader(): EnvironmentProviders {\n return makeEnvironmentProviders([\n provideNgIconLoader(name => {\n const http = inject(HttpClient);\n if (name.startsWith('sax')) {\n const parsed = convertIconSaxIconName(name);\n if (!parsed) {\n console.warn(`[ZIcon] Invalid Sax icon name: \"${name}\"`);\n return of(getFallbackIcon(name));\n }\n\n const url = `${SAX_CDN_URL}/${parsed.style}/${parsed.iconName}.svg`;\n return loadWithCache(name, url, http, normalizeSaxSvg);\n }\n\n if (name.startsWith('lucide')) {\n const iconName = convertLucideIconName(name);\n const url = `${LUCIDE_CDN_URL}/${iconName}.svg`;\n return loadWithCache(name, url, http, normalizeLucideSvg);\n }\n\n // console.warn(`[ZIcon] Unknown icon: \"${name}\"`);\n return of(getFallbackIcon(name));\n }, withCaching()),\n ]);\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["NgIcon"],"mappings":"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"}
1
+ {"version":3,"file":"shival99-z-ui-components-z-icon.mjs","sources":["../../../../libs/core-ui/components/z-icon/z-animated-icons.ts","../../../../libs/core-ui/components/z-icon/z-icon-cache.ts","../../../../libs/core-ui/components/z-icon/z-icon.variants.ts","../../../../libs/core-ui/components/z-icon/z-icon.component.ts","../../../../libs/core-ui/components/z-icon/z-icon.component.html","../../../../libs/core-ui/components/z-icon/z-icons.ts","../../../../libs/core-ui/components/z-icon/z-icon-loader.provider.ts","../../../../libs/core-ui/components/z-icon/shival99-z-ui-components-z-icon.ts"],"sourcesContent":["import { type Type } from '@angular/core';\nimport * as animatedIcons from 'ng-animated-icons';\n\ntype ZAnimatedIconExport = Extract<keyof typeof animatedIcons, `${string}Icon`>;\ntype ZBrokenAnimatedIconExport = 'AudioLinesIcon';\ntype ZSafeAnimatedIconExport = Exclude<ZAnimatedIconExport, ZBrokenAnimatedIconExport>;\n\ntype ZStripIconSuffix<T extends string> = T extends `${infer Name}Icon` ? Name : T;\n\ntype ZKebabCase<T extends string, Previous extends string = ''> = T extends `${infer Head}${infer Tail}`\n ? Tail extends Uncapitalize<Tail>\n ? Head extends `${number}`\n ? Previous extends '' | '-' | `${number}`\n ? `${Head}${ZKebabCase<Tail, Head>}`\n : `-${Head}${ZKebabCase<Tail, Head>}`\n : `${Lowercase<Head>}${ZKebabCase<Tail, Head>}`\n : `${Lowercase<Head>}-${ZKebabCase<Tail, '-'>}`\n : T;\n\ntype ZAnimatedIconName = ZKebabCase<ZStripIconSuffix<ZSafeAnimatedIconExport>>;\n\nexport type ZAnimatedIcon = ZAnimatedIconName;\n\nconst ANIMATED_ICONS = animatedIcons as unknown as Record<ZAnimatedIconExport, Type<unknown>>;\nconst BROKEN_ANIMATED_ICON_EXPORTS = new Set<ZAnimatedIconExport>(['AudioLinesIcon']);\n\nexport const Z_ANIMATED_ICONS = Object.fromEntries(\n (\n Object.entries(ANIMATED_ICONS).filter(\n ([exportName]) =>\n exportName.endsWith('Icon') && !BROKEN_ANIMATED_ICON_EXPORTS.has(exportName as ZAnimatedIconExport)\n ) as [ZSafeAnimatedIconExport, Type<unknown>][]\n ).map(([exportName, icon]) => [toKebabIconName(exportName), icon])\n) as Record<ZAnimatedIcon, Type<unknown>>;\n\nexport function getZAnimatedIconComponent(iconName: ZAnimatedIcon): Type<unknown> | null {\n return Z_ANIMATED_ICONS[iconName] ?? null;\n}\n\nfunction toKebabIconName(exportName: string): ZAnimatedIcon {\n const iconName = exportName.endsWith('Icon') ? exportName.slice(0, -4) : exportName;\n\n return iconName\n .replace(/([a-z])([0-9])/g, '$1-$2')\n .replace(/([0-9])([A-Z])/g, '$1-$2')\n .replace(/([a-z0-9])([A-Z])/g, '$1-$2')\n .toLowerCase() as ZAnimatedIcon;\n}\n","import { isDevMode } from '@angular/core';\nimport { ZIndexDbService } from '@shival99/z-ui/services';\n\nexport const Z_ICON_CACHE_DB_NAME = 'ZIconCache';\nexport const Z_ICON_CACHE_STORE = 'zIcons';\n\nexport const zIconCacheDb = new ZIndexDbService({\n dbName: Z_ICON_CACHE_DB_NAME,\n version: 1,\n stores: [{ name: Z_ICON_CACHE_STORE, encrypt: !isDevMode() }],\n defaultStore: Z_ICON_CACHE_STORE,\n});\n","import { cva, type VariantProps } from 'class-variance-authority';\n\nconst zIconSizeVariants = Object.fromEntries(\n Array.from({ length: 100 - 10 + 1 }, (_, index) => {\n const size = String(10 + index);\n return [size, `size-${size}`];\n })\n);\n\nexport const zIconVariants = cva('', {\n variants: {\n zSize: zIconSizeVariants,\n },\n defaultVariants: {\n zSize: '16',\n },\n});\n\nexport type ZIconSize = `${number}`;\nexport type ZIconVariants = VariantProps<typeof zIconVariants>;\n","import { NgComponentOutlet } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n input,\n signal,\n type Type,\n ViewEncapsulation,\n} from '@angular/core';\nimport { NgIconComponent as NgIcon } from '@ng-icons/core';\nimport { zMergeClasses } from '@shival99/z-ui/utils';\nimport type { ClassValue } from 'clsx';\nimport { getZAnimatedIconComponent, type ZAnimatedIcon } from './z-animated-icons';\nimport { Z_ICON_CACHE_STORE, zIconCacheDb } from './z-icon-cache';\nimport { zIconVariants, type ZIconVariants } from './z-icon.variants';\nimport { type ZIcon } from './z-icons';\n\nexport type ZIconAnimationTrigger = 'manual' | 'hover' | 'focus' | 'interaction' | 'always';\n\n@Component({\n selector: 'z-icon, [z-icon]',\n imports: [NgIcon, NgComponentOutlet],\n standalone: true,\n templateUrl: './z-icon.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: {\n '[class]': 'zClasses()',\n '[style.width]': 'normalizedSize() + \"px\"',\n '[style.height]': 'normalizedSize() + \"px\"',\n '(mouseenter)': 'setHoverActive(true)',\n '(mouseleave)': 'setHoverActive(false)',\n '(focusin)': 'setFocusActive(true)',\n '(focusout)': 'setFocusActive(false)',\n '(touchstart)': 'setTouchActive(true)',\n '(touchend)': 'setTouchActive(false)',\n },\n})\nexport class ZIconComponent {\n public readonly class = input<ClassValue>('');\n public readonly zType = input<ZIcon>();\n public readonly zAnimatedType = input<ZAnimatedIcon>();\n public readonly zAnimate = input(false);\n public readonly zAnimationTrigger = input<ZIconAnimationTrigger>('manual');\n public readonly zSize = input<ZIconVariants['zSize']>('16');\n public readonly zStrokeWidth = input<number>(2);\n public readonly zSvg = input<string>('');\n protected readonly resolvedSvg = signal('');\n protected readonly isHoverActive = signal(false);\n protected readonly isFocusActive = signal(false);\n protected readonly isTouchActive = signal(false);\n protected readonly normalizedSize = computed(() => {\n const size = this.zSize();\n if (size === null || size === undefined || size === '') {\n return '16';\n }\n\n return String(size);\n });\n\n private readonly _svgFetchError = signal<string>('');\n\n protected readonly zClasses = computed(() =>\n zMergeClasses(\n zIconVariants({ zSize: this.zSize() }),\n this.class(),\n this.zStrokeWidth() === 0 ? 'stroke-none' : '',\n 'inline-flex shrink-0'\n )\n );\n\n protected readonly animatedIcon = computed<Type<unknown> | null>(() => {\n const animatedType = this.zAnimatedType();\n if (!animatedType) {\n return null;\n }\n\n return getZAnimatedIconComponent(animatedType);\n });\n\n protected readonly animatedIconInputs = computed<Record<string, unknown>>(() => ({\n animate: this.shouldAnimate(),\n color: 'currentColor',\n size: Number(this.normalizedSize()),\n strokeWidth: this.zStrokeWidth(),\n }));\n\n protected readonly shouldAnimate = computed(() => {\n const trigger = this.zAnimationTrigger();\n if (trigger === 'always' || this.zAnimate()) {\n return true;\n }\n\n if (trigger === 'hover') {\n return this.isHoverActive() || this.isTouchActive();\n }\n\n if (trigger === 'focus') {\n return this.isFocusActive();\n }\n\n if (trigger === 'interaction') {\n return this.isHoverActive() || this.isFocusActive() || this.isTouchActive();\n }\n\n return false;\n });\n\n constructor() {\n effect(onCleanup => {\n const svgInput = this.zSvg().trim();\n if (!svgInput) {\n this.resolvedSvg.set('');\n this._svgFetchError.set('');\n return;\n }\n\n if (this._isRawSvg(svgInput)) {\n this.resolvedSvg.set(this._normalizeCustomSvg(svgInput));\n this._svgFetchError.set('');\n return;\n }\n\n if (!this._isSvgPath(svgInput)) {\n this.resolvedSvg.set('');\n this._svgFetchError.set('Unsupported SVG input format.');\n return;\n }\n\n const controller = new AbortController();\n onCleanup(() => controller.abort());\n\n const cacheKey = `zsvg:path:${svgInput}`;\n void zIconCacheDb\n .get<string>(cacheKey, { storeName: Z_ICON_CACHE_STORE })\n .then(cachedSvg => {\n if (controller.signal.aborted) {\n return null;\n }\n if (cachedSvg && this._isRawSvg(cachedSvg.trim())) {\n this.resolvedSvg.set(this._normalizeCustomSvg(cachedSvg));\n this._svgFetchError.set('');\n return null;\n }\n\n return fetch(svgInput, { signal: controller.signal }).then(response => {\n if (!response.ok) {\n throw new Error(`Failed to fetch SVG from \"${svgInput}\"`);\n }\n return response.text();\n });\n })\n .then(svgContent => {\n if (controller.signal.aborted || !svgContent) {\n return;\n }\n\n if (!this._isRawSvg(svgContent.trim())) {\n throw new Error(`Invalid SVG content loaded from \"${svgInput}\"`);\n }\n\n const normalizedSvg = this._normalizeCustomSvg(svgContent);\n this.resolvedSvg.set(normalizedSvg);\n this._svgFetchError.set('');\n void zIconCacheDb.set(cacheKey, normalizedSvg, { storeName: Z_ICON_CACHE_STORE }).catch(console.error);\n })\n .catch(error => {\n if (controller.signal.aborted) {\n return;\n }\n console.error('[z-icon] Failed to load zSvg path:', error);\n this.resolvedSvg.set('');\n this._svgFetchError.set('Unable to load SVG path.');\n });\n });\n }\n\n private _isRawSvg(value: string): boolean {\n return value.startsWith('<svg');\n }\n\n protected setHoverActive(isActive: boolean): void {\n this.isHoverActive.set(isActive);\n }\n\n protected setFocusActive(isActive: boolean): void {\n this.isFocusActive.set(isActive);\n }\n\n protected setTouchActive(isActive: boolean): void {\n this.isTouchActive.set(isActive);\n }\n\n private _isSvgPath(value: string): boolean {\n return value.endsWith('.svg') || value.includes('/');\n }\n\n private _normalizeCustomSvg(svg: string): string {\n try {\n const parser = new DOMParser();\n const doc = parser.parseFromString(svg, 'image/svg+xml');\n const svgEl = doc.documentElement;\n if (svgEl.tagName.toLowerCase() !== 'svg') {\n return svg;\n }\n\n const width = svgEl.getAttribute('width');\n const height = svgEl.getAttribute('height');\n if (\n !svgEl.getAttribute('viewBox') &&\n width &&\n height &&\n !Number.isNaN(Number(width)) &&\n !Number.isNaN(Number(height))\n ) {\n svgEl.setAttribute('viewBox', `0 0 ${width} ${height}`);\n }\n\n svgEl.removeAttribute('width');\n svgEl.removeAttribute('height');\n\n const allNodes = [svgEl, ...Array.from(svgEl.querySelectorAll('*'))];\n allNodes.forEach(node => {\n const fill = node.getAttribute('fill');\n if (fill && fill !== 'none' && fill !== 'currentColor') {\n node.setAttribute('fill', 'currentColor');\n }\n\n const stroke = node.getAttribute('stroke');\n if (stroke && stroke !== 'none' && stroke !== 'currentColor') {\n node.setAttribute('stroke', 'currentColor');\n }\n\n if (node.hasAttribute('stroke-width')) {\n node.removeAttribute('stroke-width');\n const currentStyle = node.getAttribute('style') ?? '';\n const normalizedStyle = currentStyle.trim();\n const strokeWidthStyle = 'stroke-width: var(--ng-icon__stroke-width, 2)';\n node.setAttribute('style', normalizedStyle ? `${normalizedStyle}; ${strokeWidthStyle}` : strokeWidthStyle);\n }\n });\n\n return svgEl.outerHTML;\n } catch {\n return svg;\n }\n }\n}\n","@if (animatedIcon()) {\n <ng-container [ngComponentOutlet]=\"animatedIcon()\" [ngComponentOutletInputs]=\"animatedIconInputs()\" />\n} @else if (resolvedSvg()) {\n <ng-icon [svg]=\"resolvedSvg()\" [size]=\"normalizedSize()\" [strokeWidth]=\"zStrokeWidth()\" />\n} @else if (!zSvg()) {\n <ng-icon [name]=\"zType()\" [size]=\"normalizedSize()\" [strokeWidth]=\"zStrokeWidth()\" />\n}\n","import type * as hugeIcons from '@hugeicons/core-free-icons';\nimport { type IconType } from '@ng-icons/core';\nimport type * as saxBoldIcons from '@ng-icons/iconsax/bold';\nimport type * as saxOutlineIcons from '@ng-icons/iconsax/outline';\nimport type * as lucideIcons from '@ng-icons/lucide';\nimport type * as phosphorBoldIcons from '@ng-icons/phosphor-icons/bold';\nimport type * as phosphorDuotoneIcons from '@ng-icons/phosphor-icons/duotone';\nimport type * as phosphorFillIcons from '@ng-icons/phosphor-icons/fill';\nimport type * as phosphorLightIcons from '@ng-icons/phosphor-icons/light';\nimport type * as phosphorRegularIcons from '@ng-icons/phosphor-icons/regular';\nimport type * as phosphorThinIcons from '@ng-icons/phosphor-icons/thin';\n\ntype ZLucideIcon = Extract<keyof typeof lucideIcons, `lucide${string}`>;\ntype ZSaxIcon = Extract<keyof typeof saxBoldIcons | keyof typeof saxOutlineIcons, `sax${string}`>;\ntype ZPhosphorIcon = Extract<\n | keyof typeof phosphorRegularIcons\n | keyof typeof phosphorBoldIcons\n | keyof typeof phosphorFillIcons\n | keyof typeof phosphorLightIcons\n | keyof typeof phosphorThinIcons\n | keyof typeof phosphorDuotoneIcons,\n `phosphor${string}`\n>;\n\n/**\n * HugeIcons exports are PascalCase with an `Icon` suffix (e.g. `HeartIcon`,\n * `Home01Icon`). We re-expose them with a `huge` prefix to stay consistent\n * with the other families (e.g. `hugeHeart`, `hugeHome01`).\n */\ntype ZHugeIcon = {\n [K in keyof typeof hugeIcons as K extends `${infer Name}Icon` ? `huge${Name}` : never]: true;\n} extends infer M\n ? Extract<keyof M, `huge${string}`>\n : never;\n\nexport const Z_ICONS = {} as const satisfies Record<string, IconType>;\n\nexport type ZIcon = ZLucideIcon | ZSaxIcon | ZPhosphorIcon | ZHugeIcon;\n","import { HttpClient } from '@angular/common/http';\nimport { type EnvironmentProviders, inject, makeEnvironmentProviders } from '@angular/core';\nimport { provideNgIconLoader, withCaching } from '@ng-icons/core';\nimport { catchError, from, map, type Observable, of, switchMap, tap } from 'rxjs';\nimport { Z_ICON_CACHE_STORE, zIconCacheDb } from './z-icon-cache';\nimport { Z_ICONS } from './z-icons';\n\n/**\n * Normalizes Sax SVG to use currentColor and CSS variable for stroke-width.\n * This allows the icon to inherit color and strokeWidth from ng-icon props.\n */\nfunction normalizeSaxSvg(svg: string): string {\n const cssVar = 'style=\"stroke-width: var(--ng-icon__stroke-width, 2)\"';\n const normalized = svg.replace(/fill=\"#292D32\"/gi, 'fill=\"currentColor\"');\n return normalized.replace(/stroke-width=\"[^\"]*\"/gi, cssVar);\n}\n\n/**\n * Normalizes Lucide SVG to use CSS variable for stroke-width.\n * This allows ng-icon strokeWidth prop to work correctly.\n * Replaces hardcoded stroke-width with var(--ng-icon__stroke-width, 2).\n */\nfunction normalizeLucideSvg(svg: string): string {\n const cssVar = 'style=\"stroke-width: var(--ng-icon__stroke-width, 2)\"';\n return svg.replace(/stroke-width=\"[^\"]*\"/gi, cssVar);\n}\n\n/**\n * Phosphor SVGs already ship with fill=\"currentColor\" and no stroke-width,\n * so no normalization is required. Kept as an explicit passthrough for parity\n * with the other icon families.\n */\nfunction normalizePhosphorSvg(svg: string): string {\n return svg;\n}\n\n/**\n * HugeIcons ships each icon as an ESM module exporting a path-array\n * (e.g. `const HeartIcon = [[\"path\", { d: \"...\", stroke: \"currentColor\", strokeWidth: \"1.5\" }]]`),\n * not a ready-made SVG. This converts that module source into an `<svg>` string\n * suitable for ng-icon, mapping camelCase attributes to kebab-case and wiring\n * stroke-width to the ng-icon CSS variable.\n */\nfunction normalizeHugeIconModule(moduleSource: string): string {\n const elements: string[] = [];\n const elementRegex = /\\[\\s*\"([a-zA-Z]+)\"\\s*,\\s*\\{([^}]*)\\}\\s*\\]/g;\n let match: RegExpExecArray | null;\n\n while ((match = elementRegex.exec(moduleSource)) !== null) {\n const tag = match[1];\n const attrsBody = match[2];\n const attrs: string[] = [];\n const attrRegex = /([a-zA-Z]+)\\s*:\\s*\"([^\"]*)\"/g;\n let attrMatch: RegExpExecArray | null;\n\n while ((attrMatch = attrRegex.exec(attrsBody)) !== null) {\n const rawKey = attrMatch[1];\n const value = attrMatch[2];\n if (rawKey === 'key') {\n continue;\n }\n if (rawKey === 'strokeWidth') {\n attrs.push(`style=\"stroke-width:var(--ng-icon__stroke-width, ${value})\"`);\n continue;\n }\n const attrName = rawKey.replace(/([a-z])([A-Z])/g, '$1-$2').toLowerCase();\n attrs.push(`${attrName}=\"${value}\"`);\n }\n\n elements.push(`<${tag} ${attrs.join(' ')}></${tag}>`);\n }\n\n if (elements.length === 0) {\n return '';\n }\n\n return `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" xmlns=\"http://www.w3.org/2000/svg\">${elements.join('')}</svg>`;\n}\n\nfunction getFallbackIcon(name: string): string {\n const icon = Z_ICONS[name as keyof typeof Z_ICONS];\n if (icon) {\n // console.warn(`[ZIcon] Using bundled fallback for \"${name}\"`);\n return icon;\n }\n return '';\n}\n\n/**\n * Converts ng-icons icon name to Lucide CDN format.\n * Examples:\n * - lucideArrowLeft -> arrow-left\n * - lucideAlertCircle -> alert-circle\n * - lucideTrash2 -> trash-2\n * - lucideGrid3x3 -> grid-3-x-3\n */\nfunction convertLucideIconName(name: string): string {\n return name\n .replace(/^lucide/, '')\n .replace(/([A-Z])/g, '-$1')\n .replace(/(\\d+)/g, '-$1')\n .replace(/(\\d)([a-z])/g, '$1-$2')\n .toLowerCase()\n .replace(/^-/, '')\n .replace(/--+/g, '-');\n}\n\n/**\n * Converts ng-icons Sax icon name to CDN format.\n * Examples:\n * - saxCloudChangeBold -> bold/cloud-change\n * - saxPauseBold -> bold/pause\n * - saxRefreshBold -> bold/refresh\n * - saxHomeOutline -> outline/home\n * - saxUserLinear -> linear/user\n */\nfunction convertIconSaxIconName(name: string): { style: string; iconName: string } | null {\n let iconPart = name.replace(/^sax/, '');\n // Extract style suffix (Bold, Outline, Linear, Bulk, Broken, TwoTone)\n const styleMatch = iconPart.match(/(Bold|Outline|Linear|Bulk|Broken|TwoTone)$/i);\n if (!styleMatch) {\n return null;\n }\n\n const style = styleMatch[1].toLowerCase();\n const styleFolder = style === 'twotone' ? 'twotone' : style;\n iconPart = iconPart.replace(/(Bold|Outline|Linear|Bulk|Broken|TwoTone)$/i, '');\n const iconName = iconPart\n .replace(/([A-Z])/g, '-$1')\n .replace(/(\\d+)/g, '-$1')\n .toLowerCase()\n .replace(/^-/, '')\n .replace(/--+/g, '-');\n\n return { style: styleFolder, iconName };\n}\n\n/**\n * Converts ng-icons Phosphor icon name to CDN format.\n * Phosphor weights map to folders, and every weight except \"regular\" carries a\n * file-name suffix (e.g. heart-bold.svg), while regular is just heart.svg.\n * Examples:\n * - phosphorHeart -> regular/heart\n * - phosphorHeartBold -> bold/heart-bold\n * - phosphorHeartFill -> fill/heart-fill\n * - phosphorHeartDuotone -> duotone/heart-duotone\n * - phosphorAddressBookTabsLight -> light/address-book-tabs-light\n */\nfunction convertPhosphorIconName(name: string): { weight: string; iconName: string } {\n let iconPart = name.replace(/^phosphor/, '');\n const weightMatch = iconPart.match(/(Bold|Fill|Light|Thin|Duotone)$/);\n const weight = weightMatch ? weightMatch[1].toLowerCase() : 'regular';\n if (weightMatch) {\n iconPart = iconPart.replace(/(Bold|Fill|Light|Thin|Duotone)$/, '');\n }\n\n const kebab = iconPart\n .replace(/([a-z0-9])([A-Z])/g, '$1-$2')\n .replace(/([A-Z])([A-Z][a-z])/g, '$1-$2')\n .toLowerCase()\n .replace(/^-/, '')\n .replace(/--+/g, '-');\n\n const iconName = weight === 'regular' ? kebab : `${kebab}-${weight}`;\n\n return { weight, iconName };\n}\n\n/**\n * Converts ng-icons-style Huge icon name to the @hugeicons/core-free-icons\n * CDN module name. We expose icons with a `huge` prefix over the original\n * PascalCase export name, so we just strip the prefix and append `Icon`.\n * Examples:\n * - hugeHeart -> HeartIcon\n * - hugeHome01 -> Home01Icon\n * - hugeFirstBracketCircle -> FirstBracketCircleIcon\n */\nfunction convertHugeIconName(name: string): string {\n return `${name.replace(/^huge/, '')}Icon`;\n}\n\nconst LUCIDE_CDN_URL = 'https://cdn.jsdelivr.net/npm/lucide-static@latest/icons';\nconst SAX_CDN_URL = 'https://cdn.jsdelivr.net/gh/placetopay-org/iconsax-vue@main/src/Base';\nconst PHOSPHOR_CDN_URL = 'https://cdn.jsdelivr.net/npm/@phosphor-icons/core@latest/assets';\nconst HUGE_CDN_URL = 'https://cdn.jsdelivr.net/npm/@hugeicons/core-free-icons@4.2.1/dist/esm';\n\n/**\n * Provides hybrid icon loading from CDN with fallback to bundled icons:\n * - Primary: Load icons from CDN (Lucide & Iconsax)\n * - Fallback: Use bundled icons from Z_ICONS if CDN fails\n *\n * @example\n * ```typescript\n * // app.config.ts\n * providers: [\n * provideHttpClient(),\n * provideZIconLoader(),\n * ]\n * ```\n */\nfunction loadWithCache(\n name: string,\n url: string,\n http: HttpClient,\n normalizer: (svg: string) => string\n): Observable<string> {\n return from(zIconCacheDb.get<string>(name, { storeName: Z_ICON_CACHE_STORE })).pipe(\n switchMap(cached => {\n if (cached) {\n return of(cached);\n }\n\n return http.get(url, { responseType: 'text' }).pipe(\n map(normalizer),\n tap(svg => {\n void zIconCacheDb.set(name, svg, { storeName: Z_ICON_CACHE_STORE });\n }),\n catchError(error => {\n console.error(`[ZIcon] Failed to load \"${name}\" from ${url}`, error);\n return of(getFallbackIcon(name));\n })\n );\n }),\n catchError(() => of(getFallbackIcon(name)))\n );\n}\n\nexport function provideZIconLoader(): EnvironmentProviders {\n return makeEnvironmentProviders([\n provideNgIconLoader(name => {\n const http = inject(HttpClient);\n if (name.startsWith('sax')) {\n const parsed = convertIconSaxIconName(name);\n if (!parsed) {\n console.warn(`[ZIcon] Invalid Sax icon name: \"${name}\"`);\n return of(getFallbackIcon(name));\n }\n\n const url = `${SAX_CDN_URL}/${parsed.style}/${parsed.iconName}.svg`;\n return loadWithCache(name, url, http, normalizeSaxSvg);\n }\n\n if (name.startsWith('lucide')) {\n const iconName = convertLucideIconName(name);\n const url = `${LUCIDE_CDN_URL}/${iconName}.svg`;\n return loadWithCache(name, url, http, normalizeLucideSvg);\n }\n\n if (name.startsWith('phosphor')) {\n const { weight, iconName } = convertPhosphorIconName(name);\n const url = `${PHOSPHOR_CDN_URL}/${weight}/${iconName}.svg`;\n return loadWithCache(name, url, http, normalizePhosphorSvg);\n }\n\n if (name.startsWith('huge')) {\n const moduleName = convertHugeIconName(name);\n const url = `${HUGE_CDN_URL}/${moduleName}.js`;\n return loadWithCache(name, url, http, normalizeHugeIconModule);\n }\n\n // console.warn(`[ZIcon] Unknown icon: \"${name}\"`);\n return of(getFallbackIcon(name));\n }, withCaching()),\n ]);\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["NgIcon"],"mappings":"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"}
@@ -1135,22 +1135,23 @@ class ZPopoverDirective {
1135
1135
  _setupTriggers() {
1136
1136
  this._cleanupListeners();
1137
1137
  const trigger = this._trigger();
1138
+ const triggerElement = this._getTriggerElement();
1138
1139
  // Manual trigger: no automatic listeners, control via zControl only
1139
1140
  if (trigger === 'manual') {
1140
1141
  return;
1141
1142
  }
1142
1143
  if (trigger === 'hover') {
1143
- this._listenerCleanups.push(this._renderer.listen(this._elementRef.nativeElement, 'mouseenter', () => this.show()), this._renderer.listen(this._elementRef.nativeElement, 'focus', () => this.show()));
1144
+ this._listenerCleanups.push(this._renderer.listen(triggerElement, 'mouseenter', () => this.show()), this._renderer.listen(triggerElement, 'focus', () => this.show()));
1144
1145
  if (!this.zManualClose()) {
1145
- this._listenerCleanups.push(this._renderer.listen(this._elementRef.nativeElement, 'mouseleave', () => this.hide()), this._renderer.listen(this._elementRef.nativeElement, 'blur', () => this.hide()));
1146
+ this._listenerCleanups.push(this._renderer.listen(triggerElement, 'mouseleave', () => this.hide()), this._renderer.listen(triggerElement, 'blur', () => this.hide()));
1146
1147
  }
1147
1148
  return;
1148
1149
  }
1149
1150
  if (trigger === 'click') {
1150
- this._listenerCleanups.push(this._renderer.listen(this._elementRef.nativeElement, 'click', (event) => {
1151
+ this._listenerCleanups.push(this._renderer.listen(triggerElement, 'click', (event) => {
1151
1152
  event.stopPropagation();
1152
1153
  this.toggle();
1153
- }), this._renderer.listen(this._elementRef.nativeElement, 'touchend', (event) => {
1154
+ }), this._renderer.listen(triggerElement, 'touchend', (event) => {
1154
1155
  if (event.cancelable) {
1155
1156
  event.preventDefault();
1156
1157
  }
@@ -1168,7 +1169,7 @@ class ZPopoverDirective {
1168
1169
  .pipe(filter(() => !this.zManualClose() || this.zOutsideClickClose()), filter(() => this._trigger() === 'click' || this._trigger() === 'manual'), filter(event => {
1169
1170
  const target = event.target;
1170
1171
  // Check if click is inside trigger element
1171
- if (this._elementRef.nativeElement.contains(target)) {
1172
+ if (this._getTriggerElement().contains(target)) {
1172
1173
  return false;
1173
1174
  }
1174
1175
  // Check if click is inside overlay element (dropdown content)