@getvitops/utils 8.0.1 → 8.2.0-alpha.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.
Files changed (77) hide show
  1. package/CHANGELOG.md +289 -8
  2. package/dist/{adc-BFrzpMHq.d.mts → adc-BoEoogyo.d.mts} +2 -3
  3. package/dist/adc-BoEoogyo.d.mts.map +1 -0
  4. package/dist/ads/index.d.mts +50 -17
  5. package/dist/ads/index.d.mts.map +1 -1
  6. package/dist/ads/index.mjs +77 -8
  7. package/dist/ads/index.mjs.map +1 -1
  8. package/dist/cloudflare-BiK61Oq4.d.mts.map +1 -1
  9. package/dist/{cloudflare-CgAsXiqe.mjs → cloudflare-CD8vwrgj.mjs} +2 -24
  10. package/dist/cloudflare-CD8vwrgj.mjs.map +1 -0
  11. package/dist/color/index.d.mts +34 -35
  12. package/dist/color/index.d.mts.map +1 -1
  13. package/dist/color/index.mjs +3 -1
  14. package/dist/color/index.mjs.map +1 -1
  15. package/dist/crm/index.d.mts +288 -0
  16. package/dist/crm/index.d.mts.map +1 -0
  17. package/dist/crm/index.mjs +731 -0
  18. package/dist/crm/index.mjs.map +1 -0
  19. package/dist/email/index.d.mts +216 -0
  20. package/dist/email/index.d.mts.map +1 -0
  21. package/dist/email/index.mjs +331 -0
  22. package/dist/email/index.mjs.map +1 -0
  23. package/dist/favicon.d.mts +8 -9
  24. package/dist/favicon.d.mts.map +1 -1
  25. package/dist/git/index.d.mts +65 -0
  26. package/dist/git/index.d.mts.map +1 -0
  27. package/dist/git/index.mjs +107 -0
  28. package/dist/git/index.mjs.map +1 -0
  29. package/dist/hosting/index.d.mts +184 -0
  30. package/dist/hosting/index.d.mts.map +1 -0
  31. package/dist/hosting/index.mjs +553 -0
  32. package/dist/hosting/index.mjs.map +1 -0
  33. package/dist/identity-BoRddTx3.mjs +35 -0
  34. package/dist/identity-BoRddTx3.mjs.map +1 -0
  35. package/dist/index.d.mts +24 -25
  36. package/dist/index.d.mts.map +1 -1
  37. package/dist/index.mjs +5 -5
  38. package/dist/index.mjs.map +1 -1
  39. package/dist/indexing/index.d.mts +23 -24
  40. package/dist/indexing/index.d.mts.map +1 -1
  41. package/dist/media/index.d.mts +24 -24
  42. package/dist/media/index.d.mts.map +1 -1
  43. package/dist/media/index.mjs +3 -3
  44. package/dist/media/index.mjs.map +1 -1
  45. package/dist/notify/index.d.mts +26 -15
  46. package/dist/notify/index.d.mts.map +1 -1
  47. package/dist/notify/index.mjs +50 -20
  48. package/dist/notify/index.mjs.map +1 -1
  49. package/dist/onboarding/index.d.mts +10 -141
  50. package/dist/onboarding/index.d.mts.map +1 -1
  51. package/dist/onboarding/index.mjs +2 -144
  52. package/dist/onboarding/index.mjs.map +1 -1
  53. package/dist/plan-BLKikoOG.mjs +150 -0
  54. package/dist/plan-BLKikoOG.mjs.map +1 -0
  55. package/dist/plan-Hq8Pb0Uw.d.mts +133 -0
  56. package/dist/plan-Hq8Pb0Uw.d.mts.map +1 -0
  57. package/dist/plan-format-A18SvJ7C.mjs +24 -0
  58. package/dist/plan-format-A18SvJ7C.mjs.map +1 -0
  59. package/dist/reviews/index.d.mts +12 -13
  60. package/dist/reviews/index.d.mts.map +1 -1
  61. package/dist/schema/index.d.mts +7 -7
  62. package/dist/schema/index.d.mts.map +1 -1
  63. package/dist/security/index.d.mts +2 -2
  64. package/dist/security/index.d.mts.map +1 -1
  65. package/dist/{token-Bz_-igw-.d.mts → token-DmmoQ7um.d.mts} +6 -3
  66. package/dist/token-DmmoQ7um.d.mts.map +1 -0
  67. package/dist/tracking/index.d.mts +43 -17
  68. package/dist/tracking/index.d.mts.map +1 -1
  69. package/dist/tracking/index.mjs +2 -1
  70. package/dist/tracking/index.mjs.map +1 -1
  71. package/dist/{types-CHHjzRrv.d.mts → types-7ELci8RQ.d.mts} +4 -2
  72. package/dist/types-7ELci8RQ.d.mts.map +1 -0
  73. package/package.json +18 -4
  74. package/dist/adc-BFrzpMHq.d.mts.map +0 -1
  75. package/dist/cloudflare-CgAsXiqe.mjs.map +0 -1
  76. package/dist/token-Bz_-igw-.d.mts.map +0 -1
  77. package/dist/types-CHHjzRrv.d.mts.map +0 -1
package/dist/index.d.mts CHANGED
@@ -1,6 +1,5 @@
1
1
  import { FaviconLink, FaviconOptions, FaviconTagOptions, WebManifestOptions, faviconLinks, faviconManifest, generateFavicons, writeFaviconManifest } from "./favicon.mjs";
2
2
  import { DefaultTreeAdapterTypes } from "parse5";
3
-
4
3
  //#region src/content.d.ts
5
4
  /**
6
5
  * Framework-agnostic content-model types, guards, i18n, and part-attr resolution.
@@ -62,35 +61,35 @@ type ContentNode = string | {
62
61
  text?: Localizable;
63
62
  children?: ContentNode[];
64
63
  };
65
- declare function isElmnt<T, Tag extends string = 'div'>(item: any): item is Elmnt<T, Tag>;
66
- declare function isLink(item: any): item is Link;
67
- declare function isTextLink(item: any): item is TextLink;
68
- declare function isImageLink(item: any): item is ImageLink;
64
+ export declare function isElmnt<T, Tag extends string = 'div'>(item: any): item is Elmnt<T, Tag>;
65
+ export declare function isLink(item: any): item is Link;
66
+ export declare function isTextLink(item: any): item is TextLink;
67
+ export declare function isImageLink(item: any): item is ImageLink;
69
68
  /**
70
69
  * Resolve a Localizable value to a string for the given locale. A plain string
71
70
  * is returned as-is; a locale map returns the best match (locale → default → '').
72
71
  */
73
- declare function t(value: Localizable | undefined, locale: string, defaultLocale: string): string;
72
+ export declare function t(value: Localizable | undefined, locale: string, defaultLocale: string): string;
74
73
  /**
75
74
  * Resolve per-part attrs from a presentation-type config. For the `root` part,
76
75
  * merges legacy `attrs` with `parts.root` (backward compat).
77
76
  */
78
- declare function partAttrs(present: {
77
+ export declare function partAttrs(present: {
79
78
  attrs?: Attrs;
80
79
  parts?: Record<string, Attrs>;
81
80
  } | undefined, part: string): Attrs;
82
81
  //#endregion
83
82
  //#region src/html.d.ts
84
83
  type ChildNode = DefaultTreeAdapterTypes.ChildNode;
85
- declare function parseRenderedSlots(html: string): ChildNode[];
86
- declare function getAttribute(node: ChildNode, attrName: string): string | null;
87
- declare function serialize(nodes: ChildNode | ChildNode[]): string[];
84
+ export declare function parseRenderedSlots(html: string): ChildNode[];
85
+ export declare function getAttribute(node: ChildNode, attrName: string): string | null;
86
+ export declare function serialize(nodes: ChildNode | ChildNode[]): string[];
88
87
  /** Style value types that can be combined (camelCase or --custom-prop keys). */
89
88
  type StyleObject = Record<string, string | number | null | undefined>;
90
89
  type StyleValue = string | StyleObject | null | undefined;
91
90
  type StyleList = StyleValue | StyleValue[];
92
91
  /** Combine multiple style formats into one CSS string (like `class:list` for styles). */
93
- declare function styleList(...styles: StyleList[]): string;
92
+ export declare function styleList(...styles: StyleList[]): string;
94
93
  /** Element descriptor: a tag name, text content, and optional attributes. */
95
94
  interface El<Tag extends string = string> {
96
95
  text: string;
@@ -98,9 +97,9 @@ interface El<Tag extends string = string> {
98
97
  attributes?: Record<string, unknown>;
99
98
  }
100
99
  /** Normalize a string or `El` object into an HTML string (for `set:html`). */
101
- declare function toHtml<Tag extends string>(content: string | El<Tag>): string;
100
+ export declare function toHtml<Tag extends string>(content: string | El<Tag>): string;
102
101
  /** Render an array of `ContentNode`s to an HTML string. */
103
- declare function nodesToHtml(nodes: ContentNode[], resolveText?: (value: Localizable) => string): string;
102
+ export declare function nodesToHtml(nodes: ContentNode[], resolveText?: (value: Localizable) => string): string;
104
103
  //#endregion
105
104
  //#region src/icons.d.ts
106
105
  /**
@@ -124,7 +123,7 @@ declare function nodesToHtml(nodes: ContentNode[], resolveText?: (value: Localiz
124
123
  * FA7 variants (fa7-solid, fa7-regular, etc.) all share the same icon names
125
124
  * and map to the 'fa7' key. Other sets map to themselves.
126
125
  */
127
- declare const prefixToMapKey: Record<string, string>;
126
+ export declare const prefixToMapKey: Record<string, string>;
128
127
  /**
129
128
  * Sets whose weights are a name SUFFIX inside one collection rather than
130
129
  * separate prefixed collections. Phosphor is the case that forced this:
@@ -134,8 +133,8 @@ declare const prefixToMapKey: Record<string, string>;
134
133
  *
135
134
  * The first entry is the unsuffixed default — asking for it adds nothing.
136
135
  */
137
- declare const WEIGHTED_SETS: Record<string, readonly string[]>;
138
- declare const iconMap: {
136
+ export declare const WEIGHTED_SETS: Record<string, readonly string[]>;
137
+ export declare const iconMap: {
139
138
  readonly fa7: {
140
139
  readonly menu: "bars";
141
140
  readonly close: "xmark";
@@ -590,7 +589,7 @@ type BrandIcon = keyof (typeof iconMap)['simple-icons'];
590
589
  * sets that aren't suffix-weighted; an unknown weight throws rather than silently
591
590
  * resolving to the regular glyph, which would be indistinguishable from a typo.
592
591
  */
593
- declare function resolveIcon(name: string, prefix: string, opts?: {
592
+ export declare function resolveIcon(name: string, prefix: string, opts?: {
594
593
  weight?: string;
595
594
  }): string;
596
595
  /**
@@ -600,7 +599,7 @@ declare function resolveIcon(name: string, prefix: string, opts?: {
600
599
  * @param name - Semantic brand name ('facebook') or fully-qualified ('simple-icons:facebook')
601
600
  * @param prefix - astro-icon prefix, e.g. 'simple-icons', 'fa7-brands'
602
601
  */
603
- declare function resolveBrandIcon(name: string, prefix: string): string;
602
+ export declare function resolveBrandIcon(name: string, prefix: string): string;
604
603
  /**
605
604
  * Generate the astro-icon `include` map from configured icon sets.
606
605
  *
@@ -614,7 +613,7 @@ declare function resolveBrandIcon(name: string, prefix: string): string;
614
613
  * @param iconsConfig - Icons config from site.config.yaml (icons section)
615
614
  * @returns Record<string, string[]> for astro-icon's `include` option
616
615
  */
617
- declare function generateIconInclude(iconsConfig?: {
616
+ export declare function generateIconInclude(iconsConfig?: {
618
617
  ui?: string;
619
618
  brand?: string;
620
619
  weight?: string;
@@ -638,16 +637,16 @@ interface ScanOptions {
638
637
  * Extensions worth scanning: every template language the framework's classes
639
638
  * and icon names can appear in, plus the markdown that can embed them.
640
639
  */
641
- declare const SCAN_EXT: ReadonlySet<string>;
640
+ export declare const SCAN_EXT: ReadonlySet<string>;
642
641
  /** Directories that only ever hold dependencies or build output. */
643
- declare const SCAN_SKIP: ReadonlySet<string>;
642
+ export declare const SCAN_SKIP: ReadonlySet<string>;
644
643
  /**
645
644
  * Recursively read every scannable file under `dir`.
646
645
  *
647
646
  * Dotfiles and dot-directories are skipped wholesale — they hold tooling config,
648
647
  * not templates, and `.astro`/`.git` would otherwise be walked twice over.
649
648
  */
650
- declare function scanFiles(dir: string, opts?: ScanOptions): SourceFile[];
649
+ export declare function scanFiles(dir: string, opts?: ScanOptions): SourceFile[];
651
650
  //#endregion
652
651
  //#region src/icons-scan.d.ts
653
652
  /**
@@ -693,15 +692,15 @@ interface IconScanOptions {
693
692
  props?: string[];
694
693
  }
695
694
  /** Extract every icon reference from one file's text. */
696
- declare function extractIconRefs(src: string, file?: string, opts?: IconScanOptions): {
695
+ export declare function extractIconRefs(src: string, file?: string, opts?: IconScanOptions): {
697
696
  refs: IconRef[];
698
697
  dynamic: DynamicIconRef[];
699
698
  };
700
699
  /** Run `extractIconRefs` across a file set and collect unique names. */
701
- declare function collectIconRefs(files: readonly {
700
+ export declare function collectIconRefs(files: readonly {
702
701
  path: string;
703
702
  text: string;
704
703
  }[], opts?: IconScanOptions): IconScanResult;
705
704
  //#endregion
706
- export { type Attrs, type BrandIcon, type ChildNode, type ContentNode, type DynamicIconRef, type El, type Elmnt, type FaviconLink, type FaviconOptions, type FaviconTagOptions, type IconRef, type IconRefKind, type IconScanOptions, type IconScanResult, type IconSet, type ImageLink, type ImageRef, type Link, type Localizable, SCAN_EXT, SCAN_SKIP, type ScanOptions, type SemanticIcon, type SourceFile, type StyleList, type StyleValue, type TextLink, WEIGHTED_SETS, type WebManifestOptions, collectIconRefs, extractIconRefs, faviconLinks, faviconManifest, generateFavicons, generateIconInclude, getAttribute, iconMap, isElmnt, isImageLink, isLink, isTextLink, nodesToHtml, parseRenderedSlots, partAttrs, prefixToMapKey, resolveBrandIcon, resolveIcon, scanFiles, serialize, styleList, t, toHtml, writeFaviconManifest };
705
+ export { type Attrs, type BrandIcon, type ChildNode, type ContentNode, type DynamicIconRef, type El, type Elmnt, type FaviconLink, type FaviconOptions, type FaviconTagOptions, type IconRef, type IconRefKind, type IconScanOptions, type IconScanResult, type IconSet, type ImageLink, type ImageRef, type Link, type Localizable, type ScanOptions, type SemanticIcon, type SourceFile, type StyleList, type StyleValue, type TextLink, type WebManifestOptions, faviconLinks, faviconManifest, generateFavicons, writeFaviconManifest };
707
706
  //# sourceMappingURL=index.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.mts","names":[],"sources":["../src/content.ts","../src/html.ts","../src/icons.ts","../src/scan.ts","../src/icons-scan.ts"],"mappings":"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"}
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../src/content.ts","../src/html.ts","../src/icons.ts","../src/scan.ts","../src/icons-scan.ts"],"mappings":";;;;;;;;;;;KAWY,uBAAuB;;;;;UAMlB;EACf;GACC;;;UAIc;EACf;EACA,MAAM;GACL;;;UAIc;EACf,OAAO;EACP;EACA,QAAQ;GACP;;;UAIc;EACf,OAAO;EACP;EACA,QAAQ;GACP;;;KAIS,OAAO,WAAW;;;;;UAMb,MAAM,aAAa;EAClC;EACA,MAAM;EACN,QAAQ;EACR,UAAU;GACT;;;;;;KAOS;EAGN;EACA,QAAQ;EACR,OAAO;EACP,WAAW;;wBAKD,QAAQ,GAAG,4BAA4B,YAAY,QAAQ,MAAM,GAAG;wBAIpE,OAAO,YAAY,QAAQ;wBAI3B,WAAW,YAAY,QAAQ;wBAI/B,YAAY,YAAY,QAAQ;;;;;wBAUhC,EAAE,OAAO,yBAAyB,gBAAgB;;;;;wBAYlD,UACd;EAAW,QAAQ;EAAO,QAAQ,eAAe;eACjD,eACC;;;KCxGS,YAAY,wBAAwB;wBAEhC,mBAAmB,eAAe;wBAIlC,aAAa,MAAM,WAAW;wBAQ9B,UAAU,OAAO,YAAY;;KAOxC,cAAc;KACP,sBAAsB;KACtB,YAAY,aAAa;;wBAerB,aAAa,QAAQ;;UAmBpB,GAAG;EAClB;EACA,KAAK;EACL,aAAa;;;wBA4BC,OAAO,oBAAoB,kBAAkB,GAAG;;wBAkDhD,YACd,OAAO,eACP,eAAc,OAAO;;;;;;;;;;;;;;;;;;;;;;;;qBC9HV,gBAAgB;;;;;;;;;;qBAqBhB,eAAe;qBAIf;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAgiBD,uBAAuB;KACvB,6BAA6B;KAC7B,0BAA0B;;;;;;;;;;;;wBAatB,YAAY,cAAc,gBAAgB;EAAS;;;;;;;;;wBAiCnD,iBAAiB,cAAc;;;;;;;;;;;;;;wBAwB/B,oBAAoB;EAClC;EACA;EACA;EACA;GACC;IACC;;;;UC5oBa;EACf;EACA;;UAGe;;EAEf,OAAO;;EAEP,WAAW;;;;;;qBAOA,UAAU;;qBAgBV,WAAW;;;;;;;wBAeR,UAAU,aAAa,OAAO,cAAc;;;;;;;;;;;;;;;;;;;KC/ChD;;UAGK;EACf;EACA,MAAM;EACN;EACA;EACA;;;UAIe;EACf;EACA;EACA;EACA;;UAGe;EACf,MAAM;EACN,SAAS;;EAET;;UAGe;;EAEf;;;wBAmEc,gBACd,aACA,eACA,OAAO;EACJ,MAAM;EAAW,SAAS;;;wBA2Cf,gBACd;EAAkB;EAAc;KAChC,OAAO,kBACN"}
package/dist/index.mjs CHANGED
@@ -115,7 +115,7 @@ function toHtml(content) {
115
115
  const t = String(tag);
116
116
  return attrStr ? `<${t} ${attrStr}>${text}</${t}>` : `<${t}>${text}</${t}>`;
117
117
  }
118
- const VOID_ELEMENTS = new Set([
118
+ const VOID_ELEMENTS = /* @__PURE__ */ new Set([
119
119
  "area",
120
120
  "base",
121
121
  "br",
@@ -706,7 +706,7 @@ function generateIconInclude(iconsConfig) {
706
706
  const brandPrefix = iconsConfig?.brand ?? "simple-icons";
707
707
  const include = {};
708
708
  const addToInclude = (prefix, names) => {
709
- include[prefix] = [...new Set([...include[prefix] ?? [], ...names])];
709
+ include[prefix] = [.../* @__PURE__ */ new Set([...include[prefix] ?? [], ...names])];
710
710
  };
711
711
  for (const [key, val] of Object.entries(iconsConfig ?? {})) if (key !== "ui" && key !== "brand" && key !== "weight" && key !== "semantic" && Array.isArray(val)) addToInclude(key, val);
712
712
  const uiMapKey = prefixToMapKey[uiPrefix];
@@ -746,7 +746,7 @@ function generateIconInclude(iconsConfig) {
746
746
  * Extensions worth scanning: every template language the framework's classes
747
747
  * and icon names can appear in, plus the markdown that can embed them.
748
748
  */
749
- const SCAN_EXT = new Set([
749
+ const SCAN_EXT = /* @__PURE__ */ new Set([
750
750
  ".astro",
751
751
  ".html",
752
752
  ".htm",
@@ -761,7 +761,7 @@ const SCAN_EXT = new Set([
761
761
  ".mdx"
762
762
  ]);
763
763
  /** Directories that only ever hold dependencies or build output. */
764
- const SCAN_SKIP = new Set([
764
+ const SCAN_SKIP = /* @__PURE__ */ new Set([
765
765
  "node_modules",
766
766
  "dist",
767
767
  ".git",
@@ -854,7 +854,7 @@ function readValue(groups) {
854
854
  }
855
855
  /** Extract every icon reference from one file's text. */
856
856
  function extractIconRefs(src, file = "<source>", opts) {
857
- const props = [...new Set([...DEFAULT_PROPS, ...opts?.props ?? []])];
857
+ const props = [.../* @__PURE__ */ new Set([...DEFAULT_PROPS, ...opts?.props ?? []])];
858
858
  const refs = [];
859
859
  const dynamic = [];
860
860
  const NAME = nameAttr();
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":["s"],"sources":["../src/content.ts","../src/html.ts","../src/icons.ts","../src/scan.ts","../src/icons-scan.ts"],"sourcesContent":["/**\n * Framework-agnostic content-model types, guards, i18n, and part-attr resolution.\n *\n * Extracted from @getvitops/astro so the pure-TS helpers live in one place (no\n * Astro dependency). The Astro-typed element tag was `astro/types`' `HTMLTag`;\n * here it's a plain `string` (any tag name), keeping these fully framework-neutral.\n */\n\n// ── content-model types ──────────────────────────────────────────────────────\n\n/** A translatable value: a plain string, or a locale → string map. */\nexport type Localizable = string | Record<string, string>;\n\n/**\n * An HTML attribute bag. `class` may be a string or a class:list-style array\n * (falsy entries dropped); everything else is passed through to the element.\n */\nexport interface Attrs {\n class?: string | (string | false | null | undefined)[];\n [attr: string]: unknown;\n}\n\n/** An image reference used by image links. */\nexport interface ImageRef {\n src: string;\n alt?: Localizable;\n [key: string]: unknown;\n}\n\n/** A link with a text label. */\nexport interface TextLink {\n label: Localizable;\n href: string;\n attrs?: Attrs;\n [key: string]: unknown;\n}\n\n/** A link whose content is an image. */\nexport interface ImageLink {\n image: ImageRef;\n href: string;\n attrs?: Attrs;\n [key: string]: unknown;\n}\n\n/** Any link — text or image. */\nexport type Link = TextLink | ImageLink;\n\n/**\n * A generic content element wrapper (discriminated by `type: 'element'`),\n * carrying a payload `T` rendered as `Tag` (any HTML tag name).\n */\nexport interface Elmnt<T = unknown, Tag extends string = 'div'> {\n type: 'element';\n tag?: Tag;\n attrs?: Attrs;\n content?: T;\n [key: string]: unknown;\n}\n\n/**\n * A renderable node tree — a text string (Localizable) or an element with\n * optional attrs and either `text` shorthand or `children`.\n */\nexport type ContentNode =\n | string\n | {\n tag: string;\n attrs?: Attrs;\n text?: Localizable;\n children?: ContentNode[];\n };\n\n// ── type guards ──────────────────────────────────────────────────────────────\n\nexport function isElmnt<T, Tag extends string = 'div'>(item: any): item is Elmnt<T, Tag> {\n return item && item.type === 'element';\n}\n\nexport function isLink(item: any): item is Link {\n return item && ('label' in item || 'image' in item) && 'href' in item;\n}\n\nexport function isTextLink(item: any): item is TextLink {\n return item && 'label' in item && 'href' in item;\n}\n\nexport function isImageLink(item: any): item is ImageLink {\n return item && 'image' in item && 'href' in item;\n}\n\n// ── i18n ─────────────────────────────────────────────────────────────────────\n\n/**\n * Resolve a Localizable value to a string for the given locale. A plain string\n * is returned as-is; a locale map returns the best match (locale → default → '').\n */\nexport function t(value: Localizable | undefined, locale: string, defaultLocale: string): string {\n if (value == null) return '';\n if (typeof value === 'string') return value;\n return value[locale] ?? value[defaultLocale] ?? '';\n}\n\n// ── part-attr resolution ─────────────────────────────────────────────────────\n\n/**\n * Resolve per-part attrs from a presentation-type config. For the `root` part,\n * merges legacy `attrs` with `parts.root` (backward compat).\n */\nexport function partAttrs(\n present: { attrs?: Attrs; parts?: Record<string, Attrs> } | undefined,\n part: string,\n): Attrs {\n const fromParts = present?.parts?.[part];\n if (part === 'root') {\n const legacy = present?.attrs;\n if (!legacy && !fromParts) return {};\n const { class: lc, ...lr } = legacy ?? {};\n const { class: pc, ...pr } = fromParts ?? {};\n const classes = [lc, pc].flat().filter((c): c is string => typeof c === 'string' && c !== '');\n return {\n ...(classes.length ? { class: classes } : {}),\n ...lr,\n ...pr,\n };\n }\n return fromParts ?? {};\n}\n","/**\n * Framework-agnostic HTML/markup helpers (parse5-based). Extracted from\n * @getvitops/astro — no Astro runtime dependency; the Astro-typed `HTMLTag` /\n * `HTMLAttributes` are generalized to `string` / `Record<string, unknown>`.\n */\nimport { parseFragment, serialize as s, type DefaultTreeAdapterTypes } from 'parse5';\nimport type { Localizable, ContentNode } from './content.ts';\n\nexport type ChildNode = DefaultTreeAdapterTypes.ChildNode;\n\nexport function parseRenderedSlots(html: string): ChildNode[] {\n return parseFragment(html).childNodes;\n}\n\nexport function getAttribute(node: ChildNode, attrName: string): string | null {\n if ('attrs' in node) {\n const attr = node.attrs.find((a) => a.name === attrName);\n return attr ? attr.value : null;\n }\n return null;\n}\n\nexport function serialize(nodes: ChildNode | ChildNode[]): string[] {\n return (Array.isArray(nodes) ? nodes : [nodes]).map((node) =>\n s(node as DefaultTreeAdapterTypes.ParentNode),\n );\n}\n\n/** Style value types that can be combined (camelCase or --custom-prop keys). */\ntype StyleObject = Record<string, string | number | null | undefined>;\nexport type StyleValue = string | StyleObject | null | undefined;\nexport type StyleList = StyleValue | StyleValue[];\n\n/** camelCase → kebab-case, preserving CSS custom properties (`--var-name`). */\nfunction toKebabCase(str: string): string {\n if (str.startsWith('--')) return str;\n return str.replace(/([A-Z])/g, '-$1').toLowerCase();\n}\nfunction styleObjectToString(obj: StyleObject): string {\n return Object.entries(obj)\n .filter(([, value]) => value != null)\n .map(([key, value]) => `${toKebabCase(key)}: ${value}`)\n .join('; ');\n}\n\n/** Combine multiple style formats into one CSS string (like `class:list` for styles). */\nexport function styleList(...styles: StyleList[]): string {\n const result: string[] = [];\n const process = (item: StyleList): void => {\n if (item == null) return;\n if (Array.isArray(item)) {\n item.forEach(process);\n } else if (typeof item === 'string') {\n const trimmed = item.trim();\n if (trimmed) result.push(trimmed);\n } else {\n const str = styleObjectToString(item as StyleObject);\n if (str) result.push(str);\n }\n };\n styles.forEach(process);\n return result.join('; ');\n}\n\n/** Element descriptor: a tag name, text content, and optional attributes. */\nexport interface El<Tag extends string = string> {\n text: string;\n tag: Tag;\n attributes?: Record<string, unknown>;\n}\n\nfunction isEl(value: string | El): value is El {\n return typeof value === 'object' && value !== null && 'tag' in value && 'text' in value;\n}\n\nfunction attributesToString(attrs: Record<string, unknown>): string {\n const parts: string[] = [];\n for (const [key, value] of Object.entries(attrs)) {\n if (value == null || value === false) continue;\n if (value === true) {\n parts.push(key);\n } else if (key === 'style' && typeof value === 'object') {\n parts.push(`style=\"${styleList(value as StyleValue)}\"`);\n } else {\n const text = Array.isArray(value)\n ? value.filter((v): v is string => typeof v === 'string' && v !== '').join(' ')\n : typeof value === 'object'\n ? JSON.stringify(value)\n : String(value as string | number | boolean);\n parts.push(`${key}=\"${text.replace(/\"/g, '&quot;')}\"`);\n }\n }\n return parts.join(' ');\n}\n\n/** Normalize a string or `El` object into an HTML string (for `set:html`). */\nexport function toHtml<Tag extends string>(content: string | El<Tag>): string {\n if (!isEl(content)) return content;\n const { tag, text, attributes } = content;\n const attrStr = attributes ? attributesToString(attributes) : '';\n const t = String(tag);\n return attrStr ? `<${t} ${attrStr}>${text}</${t}>` : `<${t}>${text}</${t}>`;\n}\n\n// ── node-tree renderer — { tag, attrs, children } ────────────────────────────\nconst VOID_ELEMENTS = new Set([\n 'area',\n 'base',\n 'br',\n 'col',\n 'embed',\n 'hr',\n 'img',\n 'input',\n 'link',\n 'meta',\n 'param',\n 'source',\n 'track',\n 'wbr',\n]);\n\nfunction defaultResolveText(value: Localizable): string {\n if (typeof value === 'string') return value;\n const values = Object.values(value);\n return values[0] ?? '';\n}\n\nfunction escapeHtml(text: string): string {\n return text.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');\n}\n\nfunction nodeToHtml(node: ContentNode, resolveText: (value: Localizable) => string): string {\n if (typeof node === 'string') return escapeHtml(resolveText(node));\n const { tag, attrs, text, children } = node;\n const attrStr = attrs ? attributesToString(attrs) : '';\n const open = attrStr ? `<${tag} ${attrStr}>` : `<${tag}>`;\n if (VOID_ELEMENTS.has(tag)) return open;\n let inner = '';\n if (text != null) inner = escapeHtml(resolveText(text));\n else if (children?.length)\n inner = children.map((child) => nodeToHtml(child, resolveText)).join('');\n return `${open}${inner}</${tag}>`;\n}\n\n/** Render an array of `ContentNode`s to an HTML string. */\nexport function nodesToHtml(\n nodes: ContentNode[],\n resolveText: (value: Localizable) => string = defaultResolveText,\n): string {\n return nodes.map((node) => nodeToHtml(node, resolveText)).join('');\n}\n","/**\n * Semantic icon name mapping across icon sets.\n *\n * Keys are functional/semantic names (what the icon means).\n * Values are the actual icon names in each set.\n *\n * Two consumers:\n * - `generateIconInclude()` (below) — build time. Turns the semantic names a project\n * declares into the `include` map astro-icon needs, so the icon set can be swapped\n * without touching call sites.\n * - `<wc-icon-picker>` (@getvitops/core) — browser. Its `semantic` mode lists these\n * keys so an icon can be chosen by meaning rather than by set-specific name.\n *\n * `resolveIcon`/`resolveBrandIcon` map one semantic name to a fully-qualified\n * `prefix:name` string for a given set.\n */\n\n/**\n * Maps astro-icon prefixes to iconMap lookup keys.\n * FA7 variants (fa7-solid, fa7-regular, etc.) all share the same icon names\n * and map to the 'fa7' key. Other sets map to themselves.\n */\nexport const prefixToMapKey: Record<string, string> = {\n 'fa7-solid': 'fa7',\n 'fa7-regular': 'fa7',\n 'fa7-light': 'fa7',\n 'fa7-thin': 'fa7',\n 'fa7-brands': 'fa7-brands',\n 'simple-icons': 'simple-icons',\n 'material-symbols': 'material-symbols',\n lucide: 'lucide',\n ph: 'ph',\n};\n\n/**\n * Sets whose weights are a name SUFFIX inside one collection rather than\n * separate prefixed collections. Phosphor is the case that forced this:\n * `ph:lightning`, `ph:lightning-bold`, `ph:lightning-fill` all live in `ph`,\n * whereas Font Awesome splits the same idea across `fa7-solid`/`fa7-regular`/…\n * (which is what `prefixToMapKey` collapses).\n *\n * The first entry is the unsuffixed default — asking for it adds nothing.\n */\nexport const WEIGHTED_SETS: Record<string, readonly string[]> = {\n ph: ['regular', 'bold', 'duotone', 'fill', 'light', 'thin'],\n};\n\nexport const iconMap = {\n fa7: {\n // Navigation / UI\n menu: 'bars',\n close: 'xmark',\n home: 'home',\n settings: 'gear',\n search: 'magnifying-glass',\n 'chevron-left': 'chevron-left',\n 'chevron-right': 'chevron-right',\n 'chevron-up': 'chevron-up',\n 'chevron-down': 'chevron-down',\n 'arrow-left': 'arrow-left',\n 'arrow-right': 'arrow-right',\n 'arrow-up': 'arrow-up',\n 'arrow-down': 'arrow-down',\n 'external-link': 'arrow-up-right-from-square',\n 'more-vert': 'ellipsis-vertical',\n 'more-horiz': 'ellipsis',\n\n // Actions\n add: 'plus',\n remove: 'minus',\n delete: 'trash',\n edit: 'pen',\n save: 'floppy-disk',\n copy: 'copy',\n paste: 'paste',\n attach: 'paperclip',\n upload: 'upload',\n download: 'download',\n share: 'share',\n bookmark: 'bookmark',\n favorite: 'heart',\n star: 'star',\n 'star-half': 'star-half-stroke',\n login: 'right-to-bracket',\n logout: 'right-from-bracket',\n\n // Communication\n email: 'envelope',\n phone: 'phone',\n location: 'location-dot',\n globe: 'globe',\n link: 'link',\n\n // Time\n clock: 'clock',\n calendar: 'calendar',\n schedule: 'calendar-days',\n\n // People\n person: 'user',\n group: 'users',\n\n // Content / Files\n file: 'file',\n 'file-add': 'file-circle-plus',\n folder: 'folder',\n 'folder-open': 'folder-open',\n 'folder-add': 'folder-plus',\n image: 'image',\n export: 'file-export',\n import: 'file-import',\n backup: 'cloud-arrow-up',\n compress: 'compress',\n\n // Status / Feedback\n check: 'check',\n error: 'circle-exclamation',\n warning: 'triangle-exclamation',\n info: 'circle-info',\n help: 'circle-question',\n\n // Commerce\n cart: 'cart-shopping',\n tag: 'tag',\n 'credit-card': 'credit-card',\n receipt: 'receipt',\n\n // Nature (landscaping context)\n leaf: 'leaf',\n tree: 'tree',\n seedling: 'seedling',\n trowel: 'trowel',\n droplet: 'droplet',\n snowflake: 'snowflake',\n sun: 'sun',\n cloud: 'cloud',\n\n // Layout / View\n grid: 'table-cells',\n list: 'list',\n filter: 'filter',\n sort: 'sort',\n fullscreen: 'expand',\n collapse: 'compress',\n\n // Misc\n building: 'building',\n video: 'video',\n lock: 'lock',\n unlock: 'lock-open',\n eye: 'eye',\n 'eye-off': 'eye-slash',\n print: 'print',\n code: 'code',\n palette: 'palette',\n lightbulb: 'lightbulb',\n lightning: 'bolt',\n },\n\n 'fa7-brands': {\n // Social Media\n facebook: 'facebook',\n instagram: 'instagram',\n x: 'x-twitter',\n bluesky: 'bluesky',\n threads: 'threads',\n mastodon: 'mastodon',\n linkedin: 'linkedin',\n youtube: 'youtube',\n tiktok: 'tiktok',\n pinterest: 'pinterest-p',\n reddit: 'reddit',\n snapchat: 'snapchat',\n github: 'github',\n\n // Messaging\n whatsapp: 'whatsapp',\n telegram: 'telegram',\n discord: 'discord',\n\n // Payment\n stripe: 'stripe',\n paypal: 'paypal',\n visa: 'cc-visa',\n mastercard: 'cc-mastercard',\n amex: 'cc-amex',\n discover: 'cc-discover',\n 'apple-pay': 'apple-pay',\n 'google-pay': 'google-pay',\n 'amazon-pay': 'amazon-pay',\n\n // Review / Directory\n yelp: 'yelp',\n google: 'google',\n\n // Platforms\n apple: 'apple',\n microsoft: 'microsoft',\n amazon: 'amazon',\n shopify: 'shopify',\n wordpress: 'wordpress',\n cloudflare: 'cloudflare',\n },\n\n 'simple-icons': {\n // Social Media\n facebook: 'facebook',\n instagram: 'instagram',\n x: 'x',\n bluesky: 'bluesky',\n threads: 'threads',\n mastodon: 'mastodon',\n linkedin: 'linkedin',\n youtube: 'youtube',\n tiktok: 'tiktok',\n pinterest: 'pinterest',\n reddit: 'reddit',\n snapchat: 'snapchat',\n github: 'github',\n\n // Messaging\n whatsapp: 'whatsapp',\n telegram: 'telegram',\n discord: 'discord',\n\n // Payment\n stripe: 'stripe',\n paypal: 'paypal',\n visa: 'visa',\n mastercard: 'mastercard',\n amex: 'americanexpress',\n discover: 'discover',\n 'apple-pay': 'applepay',\n 'google-pay': 'googlepay',\n 'amazon-pay': 'amazonpay',\n klarna: 'klarna',\n afterpay: 'afterpay',\n square: 'square',\n cashapp: 'cashapp',\n interac: 'interac',\n\n // Review / Directory\n yelp: 'yelp',\n google: 'google',\n tripadvisor: 'tripadvisor',\n trustpilot: 'trustpilot',\n 'google-maps': 'googlemaps',\n homeadvisor: 'homeadvisor',\n houzz: 'houzz',\n nextdoor: 'nextdoor',\n bbb: 'bbb',\n\n // Platforms\n apple: 'apple',\n microsoft: 'microsoft',\n amazon: 'amazon',\n shopify: 'shopify',\n wordpress: 'wordpress',\n cloudflare: 'cloudflare',\n waze: 'waze',\n },\n\n 'material-symbols': {\n // Navigation / UI\n menu: 'menu',\n close: 'close',\n home: 'home',\n settings: 'settings',\n search: 'search',\n 'chevron-left': 'chevron-left',\n 'chevron-right': 'chevron-right',\n // Material Symbols' chevrons are only named `chevron-*` on the horizontal\n // axis; the vertical pair is `expand-more`/`expand-less`, same glyph.\n 'chevron-up': 'expand-less',\n 'chevron-down': 'expand-more',\n 'arrow-left': 'arrow-back',\n 'arrow-right': 'arrow-forward',\n 'arrow-up': 'arrow-upward',\n 'arrow-down': 'arrow-downward',\n 'external-link': 'open-in-new',\n 'more-vert': 'more-vert',\n 'more-horiz': 'more-horiz',\n\n // Actions\n add: 'add',\n remove: 'remove',\n delete: 'delete',\n edit: 'edit',\n save: 'save',\n copy: 'content-copy',\n paste: 'content-paste',\n attach: 'attach-file',\n upload: 'upload',\n download: 'download',\n share: 'share',\n bookmark: 'bookmark',\n favorite: 'favorite',\n star: 'star',\n 'star-half': 'star-half',\n login: 'login',\n logout: 'logout',\n\n // Communication\n email: 'mail',\n phone: 'call',\n location: 'location-on',\n globe: 'language',\n link: 'link',\n\n // Time\n clock: 'schedule',\n calendar: 'calendar-today',\n schedule: 'calendar-month',\n\n // People\n person: 'person',\n group: 'group',\n\n // Content / Files\n file: 'description',\n 'file-add': 'note-add',\n folder: 'folder',\n 'folder-open': 'folder-open',\n 'folder-add': 'create-new-folder',\n image: 'image',\n export: 'upload-file',\n import: 'download',\n backup: 'backup',\n compress: 'compress',\n\n // Status / Feedback\n check: 'check-circle',\n error: 'error',\n warning: 'warning',\n info: 'info',\n help: 'help',\n\n // Commerce\n cart: 'shopping-cart',\n tag: 'sell',\n 'credit-card': 'credit-card',\n receipt: 'receipt-long',\n\n // Nature (landscaping context)\n leaf: 'eco',\n tree: 'forest',\n seedling: 'potted-plant',\n trowel: 'construction',\n droplet: 'water-drop',\n snowflake: 'ac-unit',\n sun: 'light-mode',\n cloud: 'cloud',\n\n // Layout / View\n grid: 'grid-view',\n list: 'list',\n filter: 'filter-list',\n sort: 'sort',\n fullscreen: 'fullscreen',\n collapse: 'fullscreen-exit',\n\n // Misc\n building: 'domain',\n video: 'videocam',\n lock: 'lock',\n unlock: 'lock-open',\n eye: 'visibility',\n 'eye-off': 'visibility-off',\n print: 'print',\n code: 'code',\n palette: 'palette',\n lightbulb: 'lightbulb',\n lightning: 'bolt',\n },\n lucide: {\n // Navigation / UI\n menu: 'menu',\n close: 'x',\n home: 'house',\n settings: 'settings',\n search: 'search',\n 'chevron-left': 'chevron-left',\n 'chevron-right': 'chevron-right',\n 'chevron-up': 'chevron-up',\n 'chevron-down': 'chevron-down',\n 'arrow-left': 'arrow-left',\n 'arrow-right': 'arrow-right',\n 'arrow-up': 'arrow-up',\n 'arrow-down': 'arrow-down',\n 'external-link': 'external-link',\n 'more-vert': 'ellipsis-vertical',\n 'more-horiz': 'ellipsis',\n\n // Actions\n add: 'plus',\n remove: 'minus',\n delete: 'trash-2',\n edit: 'pencil',\n save: 'save',\n copy: 'copy',\n paste: 'clipboard-paste',\n attach: 'paperclip',\n upload: 'upload',\n download: 'download',\n share: 'share-2',\n bookmark: 'bookmark',\n favorite: 'heart',\n star: 'star',\n 'star-half': 'star-half',\n login: 'log-in',\n logout: 'log-out',\n\n // Communication\n email: 'mail',\n phone: 'phone',\n location: 'map-pin',\n globe: 'globe',\n link: 'link',\n\n // Time\n clock: 'clock',\n calendar: 'calendar',\n schedule: 'calendar-days',\n\n // People\n person: 'user',\n group: 'users',\n\n // Content / Files\n file: 'file',\n 'file-add': 'file-plus',\n folder: 'folder',\n 'folder-open': 'folder-open',\n 'folder-add': 'folder-plus',\n image: 'image',\n export: 'file-output',\n import: 'file-input',\n backup: 'hard-drive-upload',\n compress: 'minimize-2',\n\n // Status / Feedback\n check: 'check-circle',\n error: 'circle-alert',\n warning: 'triangle-alert',\n info: 'info',\n help: 'circle-help',\n\n // Commerce\n cart: 'shopping-cart',\n tag: 'tag',\n 'credit-card': 'credit-card',\n receipt: 'receipt',\n\n // Nature (landscaping context)\n leaf: 'leaf',\n tree: 'tree-pine',\n seedling: 'sprout',\n trowel: 'shovel',\n droplet: 'droplet',\n snowflake: 'snowflake',\n sun: 'sun',\n cloud: 'cloud',\n\n // Layout / View\n grid: 'layout-grid',\n list: 'list',\n filter: 'filter',\n sort: 'arrow-up-down',\n fullscreen: 'maximize',\n collapse: 'minimize',\n\n // Misc\n building: 'building-2',\n video: 'video',\n lock: 'lock',\n unlock: 'lock-open',\n eye: 'eye',\n 'eye-off': 'eye-off',\n print: 'printer',\n code: 'code',\n palette: 'palette',\n lightbulb: 'lightbulb',\n lightning: 'zap',\n },\n // Phosphor. Unlike fa7, the weights are NOT separate collections — `ph` is one\n // collection and the weight is a name SUFFIX (`lightning`, `lightning-bold`,\n // `lightning-fill`, …), which is why `prefixToMapKey` maps `ph` to itself with\n // nothing to collapse. See WEIGHTED_SETS / resolveIcon's `weight` option.\n ph: {\n // Navigation / UI\n menu: 'list',\n close: 'x',\n home: 'house',\n settings: 'gear',\n search: 'magnifying-glass',\n // Phosphor's chevron is the `caret` family; `ph:chevron-*` doesn't exist.\n 'chevron-left': 'caret-left',\n 'chevron-right': 'caret-right',\n 'chevron-up': 'caret-up',\n 'chevron-down': 'caret-down',\n 'arrow-left': 'arrow-left',\n 'arrow-right': 'arrow-right',\n 'arrow-up': 'arrow-up',\n 'arrow-down': 'arrow-down',\n 'external-link': 'arrow-square-out',\n 'more-vert': 'dots-three-vertical',\n 'more-horiz': 'dots-three',\n // Actions\n add: 'plus',\n remove: 'minus',\n delete: 'trash',\n edit: 'pencil',\n save: 'floppy-disk',\n copy: 'copy',\n paste: 'clipboard',\n attach: 'paperclip',\n upload: 'upload',\n download: 'download',\n share: 'share',\n bookmark: 'bookmark',\n favorite: 'heart',\n star: 'star',\n 'star-half': 'star-half',\n login: 'sign-in',\n logout: 'sign-out',\n // Communication\n email: 'envelope',\n phone: 'phone',\n location: 'map-pin',\n globe: 'globe',\n link: 'link',\n // Time\n clock: 'clock',\n calendar: 'calendar',\n schedule: 'calendar-dots',\n // People\n person: 'person',\n group: 'users',\n // Content / files\n file: 'file',\n 'file-add': 'file-plus',\n folder: 'folder',\n 'folder-open': 'folder-open',\n 'folder-add': 'folder-plus',\n image: 'image',\n export: 'upload-simple',\n import: 'download-simple',\n backup: 'cloud-arrow-up',\n compress: 'arrows-in',\n // Status / feedback\n check: 'check',\n error: 'warning-circle',\n warning: 'warning',\n info: 'info',\n help: 'question',\n // Commerce\n cart: 'shopping-cart',\n tag: 'tag',\n 'credit-card': 'credit-card',\n receipt: 'receipt',\n // Nature (landscaping)\n leaf: 'leaf',\n tree: 'tree',\n seedling: 'plant',\n trowel: 'shovel',\n droplet: 'drop',\n snowflake: 'snowflake',\n sun: 'sun',\n cloud: 'cloud',\n // Layout / view\n grid: 'squares-four',\n list: 'list',\n filter: 'funnel',\n sort: 'arrows-down-up',\n fullscreen: 'corners-out',\n collapse: 'corners-in',\n // Misc\n building: 'building',\n video: 'video',\n lock: 'lock',\n unlock: 'lock-open',\n eye: 'eye',\n 'eye-off': 'eye-slash',\n print: 'printer',\n code: 'code',\n palette: 'palette',\n lightbulb: 'lightbulb',\n lightning: 'lightning',\n },\n} as const satisfies Record<string, Record<string, string>>;\n\nexport type IconSet = keyof typeof iconMap;\nexport type SemanticIcon = keyof (typeof iconMap)['fa7'];\nexport type BrandIcon = keyof (typeof iconMap)['simple-icons'];\n\n/**\n * Resolve a semantic icon name to a fully-qualified astro-icon string.\n * Names containing ':' are returned as-is (pass-through for fully-qualified names).\n *\n * @param name - Semantic name ('email') or fully-qualified ('fa7-solid:envelope')\n * @param prefix - astro-icon prefix, e.g. 'fa7-solid', 'material-symbols', 'lucide', 'ph'\n * @param opts.weight - Weight for suffix-weighted sets (see `WEIGHTED_SETS`), e.g.\n * `resolveIcon('menu', 'ph', { weight: 'bold' })` → `'ph:list-bold'`. Ignored for\n * sets that aren't suffix-weighted; an unknown weight throws rather than silently\n * resolving to the regular glyph, which would be indistinguishable from a typo.\n */\nexport function resolveIcon(name: string, prefix: string, opts?: { weight?: string }): string {\n if (name.includes(':')) return name;\n const mapKey = prefixToMapKey[prefix] as IconSet | undefined;\n if (!mapKey)\n throw new Error(\n `Unknown icon prefix \"${prefix}\". Valid: ${Object.keys(prefixToMapKey).join(', ')}`,\n );\n const map = iconMap[mapKey];\n const resolved = map[name as keyof typeof map];\n if (!resolved)\n throw new Error(`Icon \"${name}\" not found in set \"${prefix}\" (map key: \"${mapKey}\")`);\n return `${prefix}:${applyWeight(resolved, prefix, opts?.weight)}`;\n}\n\n/** Append a weight suffix for suffix-weighted sets. The first weight is the bare default. */\nfunction applyWeight(name: string, prefix: string, weight?: string): string {\n if (!weight) return name;\n const weights = WEIGHTED_SETS[prefix];\n if (!weights) return name;\n if (!weights.includes(weight))\n throw new Error(\n `Unknown weight \"${weight}\" for icon set \"${prefix}\". Valid: ${weights.join(', ')}.`,\n );\n return weight === weights[0] ? name : `${name}-${weight}`;\n}\n\n/**\n * Resolve a brand icon name to a fully-qualified astro-icon string.\n * Names containing ':' are returned as-is (pass-through).\n *\n * @param name - Semantic brand name ('facebook') or fully-qualified ('simple-icons:facebook')\n * @param prefix - astro-icon prefix, e.g. 'simple-icons', 'fa7-brands'\n */\nexport function resolveBrandIcon(name: string, prefix: string): string {\n if (name.includes(':')) return name;\n const mapKey = prefixToMapKey[prefix] as IconSet | undefined;\n if (!mapKey) throw new Error(`Unknown brand icon prefix \"${prefix}\"`);\n const map = iconMap[mapKey];\n const resolved = map[name as keyof typeof map];\n if (!resolved)\n throw new Error(`Brand icon \"${name}\" not found in set \"${prefix}\" (map key: \"${mapKey}\")`);\n return `${prefix}:${resolved}`;\n}\n\n/**\n * Generate the astro-icon `include` map from configured icon sets.\n *\n * Resolves two kinds of entries from the `icons` section of `site.config.yaml`:\n * - Per-set lists (e.g. `'fa7-solid': ['bars', 'plus']`) are passed through as-is.\n * - `semantic` names are looked up in the configured `ui` and `brand` prefix maps,\n * and the resolved icon names are merged into those sets' lists.\n *\n * Only explicitly configured icons are included — there is no fallback to all icons.\n *\n * @param iconsConfig - Icons config from site.config.yaml (icons section)\n * @returns Record<string, string[]> for astro-icon's `include` option\n */\nexport function generateIconInclude(iconsConfig?: {\n ui?: string;\n brand?: string;\n weight?: string;\n semantic?: string[];\n [prefix: string]: string | string[] | undefined;\n}): Record<string, string[]> {\n const uiPrefix = iconsConfig?.ui ?? 'fa7-solid';\n const brandPrefix = iconsConfig?.brand ?? 'simple-icons';\n const include: Record<string, string[]> = {};\n\n const addToInclude = (prefix: string, names: string[]) => {\n include[prefix] = [...new Set([...(include[prefix] ?? []), ...names])];\n };\n\n // Pass through per-set explicit lists directly\n for (const [key, val] of Object.entries(iconsConfig ?? {})) {\n if (\n key !== 'ui' &&\n key !== 'brand' &&\n key !== 'weight' &&\n key !== 'semantic' &&\n Array.isArray(val)\n ) {\n addToInclude(key, val as string[]);\n }\n }\n\n const uiMapKey = prefixToMapKey[uiPrefix] as IconSet | undefined;\n const brandMapKey = prefixToMapKey[brandPrefix] as IconSet | undefined;\n const unknownPrefix: string[] = [];\n if (!uiMapKey) unknownPrefix.push(`ui: '${uiPrefix}'`);\n if (!brandMapKey) unknownPrefix.push(`brand: '${brandPrefix}'`);\n if (unknownPrefix.length)\n throw new Error(\n `[vitops icons] Unknown icon set ${unknownPrefix.join(' and ')}. ` +\n `Known sets: ${Object.keys(prefixToMapKey).join(', ')}.`,\n );\n\n const unresolved: string[] = [];\n for (const name of iconsConfig?.semantic ?? []) {\n const ui = (iconMap[uiMapKey!] as Record<string, string>)[name];\n const brand = (iconMap[brandMapKey!] as Record<string, string>)[name];\n // The weight is part of the icon NAME for suffix-weighted sets, so the\n // bundled name has to carry it — including `ph:list-bold` but not\n // `ph:list` would ship the wrong glyph (or nothing) under output: 'server'.\n if (ui) addToInclude(uiPrefix, [applyWeight(ui, uiPrefix, iconsConfig?.weight)]);\n if (brand) addToInclude(brandPrefix, [applyWeight(brand, brandPrefix, iconsConfig?.weight)]);\n if (!ui && !brand) unresolved.push(name);\n }\n\n // Fail the build rather than silently omitting the icon. Skipping quietly is\n // what makes swapping icon sets frightening: the swap \"succeeds\" and the gaps\n // only show up as missing glyphs in production.\n if (unresolved.length)\n throw new Error(\n `[vitops icons] ${unresolved.length} semantic icon name(s) not found in ` +\n `ui set '${uiPrefix}' or brand set '${brandPrefix}': ${unresolved.join(', ')}.\\n` +\n `Either add them to iconMap in @getvitops/core, or drop them from the ` +\n `\\`semantic\\` list. Available in '${uiPrefix}': ` +\n `${Object.keys(iconMap[uiMapKey!]).slice(0, 12).join(', ')}…`,\n );\n\n return include;\n}\n","/**\n * Consumer source discovery.\n *\n * Lifted verbatim out of `@getvitops/cli`, where it was a private helper behind\n * `vitops lint`. It lives here now because a second caller needs it: the Astro\n * integration scans for icon usage during `astro:config:setup`, and it cannot\n * import the CLI — `@getvitops/cli` exposes only a `bin`, and its entry calls\n * `main()` at module scope, so importing it would run the CLI.\n *\n * Deliberately hand-rolled rather than a glob dependency: the whole job is one\n * `readdirSync` recursion with two allow/deny sets, and it runs synchronously\n * inside a config hook where an async glob would have to be awaited anyway.\n */\nimport { readFileSync, readdirSync } from 'node:fs';\nimport { extname, join } from 'node:path';\n\n/** A file the scanner found, with its contents already read. */\nexport interface SourceFile {\n path: string;\n text: string;\n}\n\nexport interface ScanOptions {\n /** File extensions to read. Defaults to `SCAN_EXT`. */\n exts?: Iterable<string>;\n /** Directory names to skip entirely. Defaults to `SCAN_SKIP`. */\n skipDirs?: Iterable<string>;\n}\n\n/**\n * Extensions worth scanning: every template language the framework's classes\n * and icon names can appear in, plus the markdown that can embed them.\n */\nexport const SCAN_EXT: ReadonlySet<string> = new Set([\n '.astro',\n '.html',\n '.htm',\n '.js',\n '.jsx',\n '.ts',\n '.tsx',\n '.vue',\n '.svelte',\n '.php',\n '.md',\n '.mdx',\n]);\n\n/** Directories that only ever hold dependencies or build output. */\nexport const SCAN_SKIP: ReadonlySet<string> = new Set([\n 'node_modules',\n 'dist',\n '.git',\n '.astro',\n 'build',\n 'coverage',\n]);\n\n/**\n * Recursively read every scannable file under `dir`.\n *\n * Dotfiles and dot-directories are skipped wholesale — they hold tooling config,\n * not templates, and `.astro`/`.git` would otherwise be walked twice over.\n */\nexport function scanFiles(dir: string, opts?: ScanOptions): SourceFile[] {\n const exts = opts?.exts ? new Set(opts.exts) : SCAN_EXT;\n const skip = opts?.skipDirs ? new Set(opts.skipDirs) : SCAN_SKIP;\n const acc: SourceFile[] = [];\n walk(dir, exts, skip, acc);\n return acc;\n}\n\nfunction walk(\n dir: string,\n exts: ReadonlySet<string>,\n skip: ReadonlySet<string>,\n acc: SourceFile[],\n): void {\n for (const e of readdirSync(dir, { withFileTypes: true })) {\n if (e.name.startsWith('.') && e.name !== '.') continue;\n const p = join(dir, e.name);\n if (e.isDirectory()) {\n if (!skip.has(e.name)) walk(p, exts, skip, acc);\n } else if (exts.has(extname(e.name))) {\n acc.push({ path: p, text: readFileSync(p, 'utf8') });\n }\n }\n}\n","/**\n * Find the icons a consumer's source actually uses.\n *\n * This exists for one reason: bundle size under `output: 'server'`. astro-icon\n * is zero-config for static builds, but on a server/hybrid build it bundles\n * EVERY icon in a set unless given an `include` map — so consumers hand-maintain\n * a list, and hand-maintained lists rot. Scanning derives it instead.\n *\n * The judgement call throughout is the same one `vitops lint`'s `extractClasses`\n * makes, and for the same reason: a template hole (`name={expr}`) is not a typo\n * and must not be guessed at. An unresolvable reference is REPORTED, never\n * invented — the caller warns and asks the author to declare it. Quietly\n * inferring would produce an `include` that is confidently wrong, which is worse\n * than one that is honestly incomplete.\n */\n\n/** How an icon reference was written. Useful for phrasing the warning. */\nexport type IconRefKind = 'component' | 'prop' | 'object' | 'sprite';\n\n/** A statically resolvable icon name. */\nexport interface IconRef {\n name: string;\n kind: IconRefKind;\n attr: string;\n file: string;\n line: number;\n}\n\n/** A reference whose name is computed at runtime and cannot be read statically. */\nexport interface DynamicIconRef {\n expr: string;\n attr: string;\n file: string;\n line: number;\n}\n\nexport interface IconScanResult {\n refs: IconRef[];\n dynamic: DynamicIconRef[];\n /** Unique static names, in first-seen order. */\n names: string[];\n}\n\nexport interface IconScanOptions {\n /** Extra prop names to treat as icon-bearing, beyond the defaults. */\n props?: string[];\n}\n\n/**\n * Props that carry an icon name. `icon` covers the component convention\n * (`Popover`/`Drawer`/`Details` triggers); the start/end pair covers adornments\n * on links and buttons.\n */\nconst DEFAULT_PROPS = ['icon', 'startIcon', 'endIcon', 'leadingIcon', 'trailingIcon'];\n\n/**\n * `<Icon …>` and any capitalised component whose name ends in `Icon`.\n * Requires a capital or the literal `Icon`, so `<iconButton>` and plain HTML\n * never match.\n */\nconst COMPONENT = /<([A-Z][\\w.]*Icon|Icon)\\b([^>]*?)\\/?>/g;\n\n/** Sprite references: `<use href=\"…/icons.svg#menu\">`, incl. legacy `xlink:href`. */\nconst SPRITE_USE = /<use\\b[^>]*?\\b(?:xlink:)?href\\s*=\\s*(?:\"([^\"#]*)#([^\"]*)\"|'([^'#]*)#([^']*)')/g;\n\n/**\n * An attribute value: a quoted literal, a braced single literal, or a braced\n * expression. The final alternative is what marks a value as dynamic — it is\n * matched on purpose so the reference can be REPORTED rather than skipped.\n *\n * That last alternative stops at the first `}`, so a reported expression\n * containing its own braces (`{\\`a:${b}\\`}`) is truncated in the warning text.\n * Deliberate: balancing braces with a regex buys nothing here, because the\n * actionable part of the report is the file and line, not the expression.\n */\nconst VALUE = String.raw`(?:\"([^\"]*)\"|'([^']*)'|\\{\\s*(?:\"([^\"]*)\"|'([^']*)'|\\`([^\\`$]*)\\`)\\s*\\}|(\\{[^}]*\\}))`;\n\n/**\n * `\\b` is not enough of a left boundary here: `-` is a non-word character, so\n * `\\bicon` happily matches inside `data-icon=` and `aria-icon=`. Requiring that\n * the previous character be neither a word character nor a hyphen keeps the\n * match to a genuine standalone prop.\n */\nconst LEFT = String.raw`(?<![\\w-])`;\n\nconst nameAttr = () => new RegExp(String.raw`${LEFT}name\\s*=\\s*${VALUE}`);\nconst iconProp = (props: string[]) =>\n new RegExp(String.raw`${LEFT}(${props.join('|')})\\s*=\\s*${VALUE}`, 'g');\n/** Object-literal form: `trigger={{ icon: 'bars' }}`, or a data array of `{ icon: '…' }`. */\nconst iconKey = (props: string[]) =>\n new RegExp(\n String.raw`${LEFT}(${props.join('|')})\\s*:\\s*(?:\"([^\"]*)\"|'([^']*)'|\\`([^\\`$]*)\\`)`,\n 'g',\n );\n\nconst lineOf = (src: string, index: number) => src.slice(0, index).split('\\n').length;\n\n/**\n * Pull the literal out of a VALUE match, or report it as dynamic.\n * Groups run: \"double\", 'single', {\"double\"}, {'single'}, {`template`}, {expr}.\n */\nfunction readValue(groups: (string | undefined)[]): { literal?: string; expr?: string } {\n const [dq, sq, bdq, bsq, btpl, expr] = groups;\n if (expr !== undefined) return { expr };\n const literal = dq ?? sq ?? bdq ?? bsq ?? btpl;\n if (literal === undefined) return {};\n // A template literal with an interpolation is dynamic even inside quotes.\n if (literal.includes('${')) return { expr: literal };\n return { literal };\n}\n\n/** Extract every icon reference from one file's text. */\nexport function extractIconRefs(\n src: string,\n file = '<source>',\n opts?: IconScanOptions,\n): { refs: IconRef[]; dynamic: DynamicIconRef[] } {\n const props = [...new Set([...DEFAULT_PROPS, ...(opts?.props ?? [])])];\n const refs: IconRef[] = [];\n const dynamic: DynamicIconRef[] = [];\n\n // 1. <Icon name=\"…\" /> — the name attribute inside an icon component tag.\n const NAME = nameAttr();\n for (const m of src.matchAll(COMPONENT)) {\n const attrs = m[2] ?? '';\n const hit = NAME.exec(attrs);\n if (!hit) continue;\n const line = lineOf(src, m.index!);\n const { literal, expr } = readValue(hit.slice(1));\n if (literal) refs.push({ name: literal, kind: 'component', attr: 'name', file, line });\n else if (expr) dynamic.push({ expr, attr: 'name', file, line });\n }\n\n // 2. icon= / startIcon= / endIcon= on any tag.\n for (const m of src.matchAll(iconProp(props))) {\n const line = lineOf(src, m.index!);\n const { literal, expr } = readValue(m.slice(2));\n if (literal) refs.push({ name: literal, kind: 'prop', attr: m[1]!, file, line });\n else if (expr) dynamic.push({ expr, attr: m[1]!, file, line });\n }\n\n // 3. `icon: '…'` inside an object literal or data array.\n for (const m of src.matchAll(iconKey(props))) {\n const literal = m[2] ?? m[3] ?? m[4];\n if (!literal || literal.includes('${')) continue;\n refs.push({ name: literal, kind: 'object', attr: m[1]!, file, line: lineOf(src, m.index!) });\n }\n\n // 4. Sprite <use href=\"…#id\">.\n for (const m of src.matchAll(SPRITE_USE)) {\n const id = m[2] ?? m[4];\n if (!id) continue;\n refs.push({ name: id, kind: 'sprite', attr: 'href', file, line: lineOf(src, m.index!) });\n }\n\n return { refs, dynamic };\n}\n\n/** Run `extractIconRefs` across a file set and collect unique names. */\nexport function collectIconRefs(\n files: readonly { path: string; text: string }[],\n opts?: IconScanOptions,\n): IconScanResult {\n const refs: IconRef[] = [];\n const dynamic: DynamicIconRef[] = [];\n for (const f of files) {\n const r = extractIconRefs(f.text, f.path, opts);\n refs.push(...r.refs);\n dynamic.push(...r.dynamic);\n }\n return { refs, dynamic, names: [...new Set(refs.map((r) => r.name))] };\n}\n"],"mappings":";;;;;;AA2EA,SAAgB,QAAuC,MAAkC;CACvF,OAAO,QAAQ,KAAK,SAAS;AAC/B;AAEA,SAAgB,OAAO,MAAyB;CAC9C,OAAO,SAAS,WAAW,QAAQ,WAAW,SAAS,UAAU;AACnE;AAEA,SAAgB,WAAW,MAA6B;CACtD,OAAO,QAAQ,WAAW,QAAQ,UAAU;AAC9C;AAEA,SAAgB,YAAY,MAA8B;CACxD,OAAO,QAAQ,WAAW,QAAQ,UAAU;AAC9C;;;;;AAQA,SAAgB,EAAE,OAAgC,QAAgB,eAA+B;CAC/F,IAAI,SAAS,MAAM,OAAO;CAC1B,IAAI,OAAO,UAAU,UAAU,OAAO;CACtC,OAAO,MAAM,WAAW,MAAM,kBAAkB;AAClD;;;;;AAQA,SAAgB,UACd,SACA,MACO;CACP,MAAM,YAAY,SAAS,QAAQ;CACnC,IAAI,SAAS,QAAQ;EACnB,MAAM,SAAS,SAAS;EACxB,IAAI,CAAC,UAAU,CAAC,WAAW,OAAO,CAAC;EACnC,MAAM,EAAE,OAAO,IAAI,GAAG,OAAO,UAAU,CAAC;EACxC,MAAM,EAAE,OAAO,IAAI,GAAG,OAAO,aAAa,CAAC;EAC3C,MAAM,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,QAAQ,MAAmB,OAAO,MAAM,YAAY,MAAM,EAAE;EAC5F,OAAO;GACL,GAAI,QAAQ,SAAS,EAAE,OAAO,QAAQ,IAAI,CAAC;GAC3C,GAAG;GACH,GAAG;EACL;CACF;CACA,OAAO,aAAa,CAAC;AACvB;;;;;;;;;ACrHA,SAAgB,mBAAmB,MAA2B;CAC5D,OAAO,cAAc,IAAI,CAAC,CAAC;AAC7B;AAEA,SAAgB,aAAa,MAAiB,UAAiC;CAC7E,IAAI,WAAW,MAAM;EACnB,MAAM,OAAO,KAAK,MAAM,MAAM,MAAM,EAAE,SAAS,QAAQ;EACvD,OAAO,OAAO,KAAK,QAAQ;CAC7B;CACA,OAAO;AACT;AAEA,SAAgB,UAAU,OAA0C;CAClE,QAAQ,MAAM,QAAQ,KAAK,IAAI,QAAQ,CAAC,KAAK,EAAC,CAAE,KAAK,SACnDA,YAAE,IAA0C,CAC9C;AACF;;AAQA,SAAS,YAAY,KAAqB;CACxC,IAAI,IAAI,WAAW,IAAI,GAAG,OAAO;CACjC,OAAO,IAAI,QAAQ,YAAY,KAAK,CAAC,CAAC,YAAY;AACpD;AACA,SAAS,oBAAoB,KAA0B;CACrD,OAAO,OAAO,QAAQ,GAAG,CAAC,CACvB,QAAQ,GAAG,WAAW,SAAS,IAAI,CAAC,CACpC,KAAK,CAAC,KAAK,WAAW,GAAG,YAAY,GAAG,EAAE,IAAI,OAAO,CAAC,CACtD,KAAK,IAAI;AACd;;AAGA,SAAgB,UAAU,GAAG,QAA6B;CACxD,MAAM,SAAmB,CAAC;CAC1B,MAAM,WAAW,SAA0B;EACzC,IAAI,QAAQ,MAAM;EAClB,IAAI,MAAM,QAAQ,IAAI,GACpB,KAAK,QAAQ,OAAO;OACf,IAAI,OAAO,SAAS,UAAU;GACnC,MAAM,UAAU,KAAK,KAAK;GAC1B,IAAI,SAAS,OAAO,KAAK,OAAO;EAClC,OAAO;GACL,MAAM,MAAM,oBAAoB,IAAmB;GACnD,IAAI,KAAK,OAAO,KAAK,GAAG;EAC1B;CACF;CACA,OAAO,QAAQ,OAAO;CACtB,OAAO,OAAO,KAAK,IAAI;AACzB;AASA,SAAS,KAAK,OAAiC;CAC7C,OAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,SAAS,SAAS,UAAU;AACpF;AAEA,SAAS,mBAAmB,OAAwC;CAClE,MAAM,QAAkB,CAAC;CACzB,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,KAAK,GAAG;EAChD,IAAI,SAAS,QAAQ,UAAU,OAAO;EACtC,IAAI,UAAU,MACZ,MAAM,KAAK,GAAG;OACT,IAAI,QAAQ,WAAW,OAAO,UAAU,UAC7C,MAAM,KAAK,UAAU,UAAU,KAAmB,EAAE,EAAE;OACjD;GACL,MAAM,OAAO,MAAM,QAAQ,KAAK,IAC5B,MAAM,QAAQ,MAAmB,OAAO,MAAM,YAAY,MAAM,EAAE,CAAC,CAAC,KAAK,GAAG,IAC5E,OAAO,UAAU,WACf,KAAK,UAAU,KAAK,IACpB,OAAO,KAAkC;GAC/C,MAAM,KAAK,GAAG,IAAI,IAAI,KAAK,QAAQ,MAAM,QAAQ,EAAE,EAAE;EACvD;CACF;CACA,OAAO,MAAM,KAAK,GAAG;AACvB;;AAGA,SAAgB,OAA2B,SAAmC;CAC5E,IAAI,CAAC,KAAK,OAAO,GAAG,OAAO;CAC3B,MAAM,EAAE,KAAK,MAAM,eAAe;CAClC,MAAM,UAAU,aAAa,mBAAmB,UAAU,IAAI;CAC9D,MAAM,IAAI,OAAO,GAAG;CACpB,OAAO,UAAU,IAAI,EAAE,GAAG,QAAQ,GAAG,KAAK,IAAI,EAAE,KAAK,IAAI,EAAE,GAAG,KAAK,IAAI,EAAE;AAC3E;AAGA,MAAM,gBAAgB,IAAI,IAAI;CAC5B;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF,CAAC;AAED,SAAS,mBAAmB,OAA4B;CACtD,IAAI,OAAO,UAAU,UAAU,OAAO;CAEtC,OADe,OAAO,OAAO,KACjB,CAAC,CAAC,MAAM;AACtB;AAEA,SAAS,WAAW,MAAsB;CACxC,OAAO,KAAK,QAAQ,MAAM,OAAO,CAAC,CAAC,QAAQ,MAAM,MAAM,CAAC,CAAC,QAAQ,MAAM,MAAM;AAC/E;AAEA,SAAS,WAAW,MAAmB,aAAqD;CAC1F,IAAI,OAAO,SAAS,UAAU,OAAO,WAAW,YAAY,IAAI,CAAC;CACjE,MAAM,EAAE,KAAK,OAAO,MAAM,aAAa;CACvC,MAAM,UAAU,QAAQ,mBAAmB,KAAK,IAAI;CACpD,MAAM,OAAO,UAAU,IAAI,IAAI,GAAG,QAAQ,KAAK,IAAI,IAAI;CACvD,IAAI,cAAc,IAAI,GAAG,GAAG,OAAO;CACnC,IAAI,QAAQ;CACZ,IAAI,QAAQ,MAAM,QAAQ,WAAW,YAAY,IAAI,CAAC;MACjD,IAAI,UAAU,QACjB,QAAQ,SAAS,KAAK,UAAU,WAAW,OAAO,WAAW,CAAC,CAAC,CAAC,KAAK,EAAE;CACzE,OAAO,GAAG,OAAO,MAAM,IAAI,IAAI;AACjC;;AAGA,SAAgB,YACd,OACA,cAA8C,oBACtC;CACR,OAAO,MAAM,KAAK,SAAS,WAAW,MAAM,WAAW,CAAC,CAAC,CAAC,KAAK,EAAE;AACnE;;;;;;;;;;;;;;;;;;;;;;;;;ACjIA,MAAa,iBAAyC;CACpD,aAAa;CACb,eAAe;CACf,aAAa;CACb,YAAY;CACZ,cAAc;CACd,gBAAgB;CAChB,oBAAoB;CACpB,QAAQ;CACR,IAAI;AACN;;;;;;;;;;AAWA,MAAa,gBAAmD,EAC9D,IAAI;CAAC;CAAW;CAAQ;CAAW;CAAQ;CAAS;AAAM,EAC5D;AAEA,MAAa,UAAU;CACrB,KAAK;EAEH,MAAM;EACN,OAAO;EACP,MAAM;EACN,UAAU;EACV,QAAQ;EACR,gBAAgB;EAChB,iBAAiB;EACjB,cAAc;EACd,gBAAgB;EAChB,cAAc;EACd,eAAe;EACf,YAAY;EACZ,cAAc;EACd,iBAAiB;EACjB,aAAa;EACb,cAAc;EAGd,KAAK;EACL,QAAQ;EACR,QAAQ;EACR,MAAM;EACN,MAAM;EACN,MAAM;EACN,OAAO;EACP,QAAQ;EACR,QAAQ;EACR,UAAU;EACV,OAAO;EACP,UAAU;EACV,UAAU;EACV,MAAM;EACN,aAAa;EACb,OAAO;EACP,QAAQ;EAGR,OAAO;EACP,OAAO;EACP,UAAU;EACV,OAAO;EACP,MAAM;EAGN,OAAO;EACP,UAAU;EACV,UAAU;EAGV,QAAQ;EACR,OAAO;EAGP,MAAM;EACN,YAAY;EACZ,QAAQ;EACR,eAAe;EACf,cAAc;EACd,OAAO;EACP,QAAQ;EACR,QAAQ;EACR,QAAQ;EACR,UAAU;EAGV,OAAO;EACP,OAAO;EACP,SAAS;EACT,MAAM;EACN,MAAM;EAGN,MAAM;EACN,KAAK;EACL,eAAe;EACf,SAAS;EAGT,MAAM;EACN,MAAM;EACN,UAAU;EACV,QAAQ;EACR,SAAS;EACT,WAAW;EACX,KAAK;EACL,OAAO;EAGP,MAAM;EACN,MAAM;EACN,QAAQ;EACR,MAAM;EACN,YAAY;EACZ,UAAU;EAGV,UAAU;EACV,OAAO;EACP,MAAM;EACN,QAAQ;EACR,KAAK;EACL,WAAW;EACX,OAAO;EACP,MAAM;EACN,SAAS;EACT,WAAW;EACX,WAAW;CACb;CAEA,cAAc;EAEZ,UAAU;EACV,WAAW;EACX,GAAG;EACH,SAAS;EACT,SAAS;EACT,UAAU;EACV,UAAU;EACV,SAAS;EACT,QAAQ;EACR,WAAW;EACX,QAAQ;EACR,UAAU;EACV,QAAQ;EAGR,UAAU;EACV,UAAU;EACV,SAAS;EAGT,QAAQ;EACR,QAAQ;EACR,MAAM;EACN,YAAY;EACZ,MAAM;EACN,UAAU;EACV,aAAa;EACb,cAAc;EACd,cAAc;EAGd,MAAM;EACN,QAAQ;EAGR,OAAO;EACP,WAAW;EACX,QAAQ;EACR,SAAS;EACT,WAAW;EACX,YAAY;CACd;CAEA,gBAAgB;EAEd,UAAU;EACV,WAAW;EACX,GAAG;EACH,SAAS;EACT,SAAS;EACT,UAAU;EACV,UAAU;EACV,SAAS;EACT,QAAQ;EACR,WAAW;EACX,QAAQ;EACR,UAAU;EACV,QAAQ;EAGR,UAAU;EACV,UAAU;EACV,SAAS;EAGT,QAAQ;EACR,QAAQ;EACR,MAAM;EACN,YAAY;EACZ,MAAM;EACN,UAAU;EACV,aAAa;EACb,cAAc;EACd,cAAc;EACd,QAAQ;EACR,UAAU;EACV,QAAQ;EACR,SAAS;EACT,SAAS;EAGT,MAAM;EACN,QAAQ;EACR,aAAa;EACb,YAAY;EACZ,eAAe;EACf,aAAa;EACb,OAAO;EACP,UAAU;EACV,KAAK;EAGL,OAAO;EACP,WAAW;EACX,QAAQ;EACR,SAAS;EACT,WAAW;EACX,YAAY;EACZ,MAAM;CACR;CAEA,oBAAoB;EAElB,MAAM;EACN,OAAO;EACP,MAAM;EACN,UAAU;EACV,QAAQ;EACR,gBAAgB;EAChB,iBAAiB;EAGjB,cAAc;EACd,gBAAgB;EAChB,cAAc;EACd,eAAe;EACf,YAAY;EACZ,cAAc;EACd,iBAAiB;EACjB,aAAa;EACb,cAAc;EAGd,KAAK;EACL,QAAQ;EACR,QAAQ;EACR,MAAM;EACN,MAAM;EACN,MAAM;EACN,OAAO;EACP,QAAQ;EACR,QAAQ;EACR,UAAU;EACV,OAAO;EACP,UAAU;EACV,UAAU;EACV,MAAM;EACN,aAAa;EACb,OAAO;EACP,QAAQ;EAGR,OAAO;EACP,OAAO;EACP,UAAU;EACV,OAAO;EACP,MAAM;EAGN,OAAO;EACP,UAAU;EACV,UAAU;EAGV,QAAQ;EACR,OAAO;EAGP,MAAM;EACN,YAAY;EACZ,QAAQ;EACR,eAAe;EACf,cAAc;EACd,OAAO;EACP,QAAQ;EACR,QAAQ;EACR,QAAQ;EACR,UAAU;EAGV,OAAO;EACP,OAAO;EACP,SAAS;EACT,MAAM;EACN,MAAM;EAGN,MAAM;EACN,KAAK;EACL,eAAe;EACf,SAAS;EAGT,MAAM;EACN,MAAM;EACN,UAAU;EACV,QAAQ;EACR,SAAS;EACT,WAAW;EACX,KAAK;EACL,OAAO;EAGP,MAAM;EACN,MAAM;EACN,QAAQ;EACR,MAAM;EACN,YAAY;EACZ,UAAU;EAGV,UAAU;EACV,OAAO;EACP,MAAM;EACN,QAAQ;EACR,KAAK;EACL,WAAW;EACX,OAAO;EACP,MAAM;EACN,SAAS;EACT,WAAW;EACX,WAAW;CACb;CACA,QAAQ;EAEN,MAAM;EACN,OAAO;EACP,MAAM;EACN,UAAU;EACV,QAAQ;EACR,gBAAgB;EAChB,iBAAiB;EACjB,cAAc;EACd,gBAAgB;EAChB,cAAc;EACd,eAAe;EACf,YAAY;EACZ,cAAc;EACd,iBAAiB;EACjB,aAAa;EACb,cAAc;EAGd,KAAK;EACL,QAAQ;EACR,QAAQ;EACR,MAAM;EACN,MAAM;EACN,MAAM;EACN,OAAO;EACP,QAAQ;EACR,QAAQ;EACR,UAAU;EACV,OAAO;EACP,UAAU;EACV,UAAU;EACV,MAAM;EACN,aAAa;EACb,OAAO;EACP,QAAQ;EAGR,OAAO;EACP,OAAO;EACP,UAAU;EACV,OAAO;EACP,MAAM;EAGN,OAAO;EACP,UAAU;EACV,UAAU;EAGV,QAAQ;EACR,OAAO;EAGP,MAAM;EACN,YAAY;EACZ,QAAQ;EACR,eAAe;EACf,cAAc;EACd,OAAO;EACP,QAAQ;EACR,QAAQ;EACR,QAAQ;EACR,UAAU;EAGV,OAAO;EACP,OAAO;EACP,SAAS;EACT,MAAM;EACN,MAAM;EAGN,MAAM;EACN,KAAK;EACL,eAAe;EACf,SAAS;EAGT,MAAM;EACN,MAAM;EACN,UAAU;EACV,QAAQ;EACR,SAAS;EACT,WAAW;EACX,KAAK;EACL,OAAO;EAGP,MAAM;EACN,MAAM;EACN,QAAQ;EACR,MAAM;EACN,YAAY;EACZ,UAAU;EAGV,UAAU;EACV,OAAO;EACP,MAAM;EACN,QAAQ;EACR,KAAK;EACL,WAAW;EACX,OAAO;EACP,MAAM;EACN,SAAS;EACT,WAAW;EACX,WAAW;CACb;CAKA,IAAI;EAEF,MAAM;EACN,OAAO;EACP,MAAM;EACN,UAAU;EACV,QAAQ;EAER,gBAAgB;EAChB,iBAAiB;EACjB,cAAc;EACd,gBAAgB;EAChB,cAAc;EACd,eAAe;EACf,YAAY;EACZ,cAAc;EACd,iBAAiB;EACjB,aAAa;EACb,cAAc;EAEd,KAAK;EACL,QAAQ;EACR,QAAQ;EACR,MAAM;EACN,MAAM;EACN,MAAM;EACN,OAAO;EACP,QAAQ;EACR,QAAQ;EACR,UAAU;EACV,OAAO;EACP,UAAU;EACV,UAAU;EACV,MAAM;EACN,aAAa;EACb,OAAO;EACP,QAAQ;EAER,OAAO;EACP,OAAO;EACP,UAAU;EACV,OAAO;EACP,MAAM;EAEN,OAAO;EACP,UAAU;EACV,UAAU;EAEV,QAAQ;EACR,OAAO;EAEP,MAAM;EACN,YAAY;EACZ,QAAQ;EACR,eAAe;EACf,cAAc;EACd,OAAO;EACP,QAAQ;EACR,QAAQ;EACR,QAAQ;EACR,UAAU;EAEV,OAAO;EACP,OAAO;EACP,SAAS;EACT,MAAM;EACN,MAAM;EAEN,MAAM;EACN,KAAK;EACL,eAAe;EACf,SAAS;EAET,MAAM;EACN,MAAM;EACN,UAAU;EACV,QAAQ;EACR,SAAS;EACT,WAAW;EACX,KAAK;EACL,OAAO;EAEP,MAAM;EACN,MAAM;EACN,QAAQ;EACR,MAAM;EACN,YAAY;EACZ,UAAU;EAEV,UAAU;EACV,OAAO;EACP,MAAM;EACN,QAAQ;EACR,KAAK;EACL,WAAW;EACX,OAAO;EACP,MAAM;EACN,SAAS;EACT,WAAW;EACX,WAAW;CACb;AACF;;;;;;;;;;;;AAiBA,SAAgB,YAAY,MAAc,QAAgB,MAAoC;CAC5F,IAAI,KAAK,SAAS,GAAG,GAAG,OAAO;CAC/B,MAAM,SAAS,eAAe;CAC9B,IAAI,CAAC,QACH,MAAM,IAAI,MACR,wBAAwB,OAAO,YAAY,OAAO,KAAK,cAAc,CAAC,CAAC,KAAK,IAAI,GAClF;CAEF,MAAM,WADM,QAAQ,OACA,CAAC;CACrB,IAAI,CAAC,UACH,MAAM,IAAI,MAAM,SAAS,KAAK,sBAAsB,OAAO,eAAe,OAAO,GAAG;CACtF,OAAO,GAAG,OAAO,GAAG,YAAY,UAAU,QAAQ,MAAM,MAAM;AAChE;;AAGA,SAAS,YAAY,MAAc,QAAgB,QAAyB;CAC1E,IAAI,CAAC,QAAQ,OAAO;CACpB,MAAM,UAAU,cAAc;CAC9B,IAAI,CAAC,SAAS,OAAO;CACrB,IAAI,CAAC,QAAQ,SAAS,MAAM,GAC1B,MAAM,IAAI,MACR,mBAAmB,OAAO,kBAAkB,OAAO,YAAY,QAAQ,KAAK,IAAI,EAAE,EACpF;CACF,OAAO,WAAW,QAAQ,KAAK,OAAO,GAAG,KAAK,GAAG;AACnD;;;;;;;;AASA,SAAgB,iBAAiB,MAAc,QAAwB;CACrE,IAAI,KAAK,SAAS,GAAG,GAAG,OAAO;CAC/B,MAAM,SAAS,eAAe;CAC9B,IAAI,CAAC,QAAQ,MAAM,IAAI,MAAM,8BAA8B,OAAO,EAAE;CAEpE,MAAM,WADM,QAAQ,OACA,CAAC;CACrB,IAAI,CAAC,UACH,MAAM,IAAI,MAAM,eAAe,KAAK,sBAAsB,OAAO,eAAe,OAAO,GAAG;CAC5F,OAAO,GAAG,OAAO,GAAG;AACtB;;;;;;;;;;;;;;AAeA,SAAgB,oBAAoB,aAMP;CAC3B,MAAM,WAAW,aAAa,MAAM;CACpC,MAAM,cAAc,aAAa,SAAS;CAC1C,MAAM,UAAoC,CAAC;CAE3C,MAAM,gBAAgB,QAAgB,UAAoB;EACxD,QAAQ,UAAU,CAAC,GAAG,IAAI,IAAI,CAAC,GAAI,QAAQ,WAAW,CAAC,GAAI,GAAG,KAAK,CAAC,CAAC;CACvE;CAGA,KAAK,MAAM,CAAC,KAAK,QAAQ,OAAO,QAAQ,eAAe,CAAC,CAAC,GACvD,IACE,QAAQ,QACR,QAAQ,WACR,QAAQ,YACR,QAAQ,cACR,MAAM,QAAQ,GAAG,GAEjB,aAAa,KAAK,GAAe;CAIrC,MAAM,WAAW,eAAe;CAChC,MAAM,cAAc,eAAe;CACnC,MAAM,gBAA0B,CAAC;CACjC,IAAI,CAAC,UAAU,cAAc,KAAK,QAAQ,SAAS,EAAE;CACrD,IAAI,CAAC,aAAa,cAAc,KAAK,WAAW,YAAY,EAAE;CAC9D,IAAI,cAAc,QAChB,MAAM,IAAI,MACR,mCAAmC,cAAc,KAAK,OAAO,EAAE,gBAC9C,OAAO,KAAK,cAAc,CAAC,CAAC,KAAK,IAAI,EAAE,EAC1D;CAEF,MAAM,aAAuB,CAAC;CAC9B,KAAK,MAAM,QAAQ,aAAa,YAAY,CAAC,GAAG;EAC9C,MAAM,KAAM,QAAQ,SAAU,CAA4B;EAC1D,MAAM,QAAS,QAAQ,YAAa,CAA4B;EAIhE,IAAI,IAAI,aAAa,UAAU,CAAC,YAAY,IAAI,UAAU,aAAa,MAAM,CAAC,CAAC;EAC/E,IAAI,OAAO,aAAa,aAAa,CAAC,YAAY,OAAO,aAAa,aAAa,MAAM,CAAC,CAAC;EAC3F,IAAI,CAAC,MAAM,CAAC,OAAO,WAAW,KAAK,IAAI;CACzC;CAKA,IAAI,WAAW,QACb,MAAM,IAAI,MACR,kBAAkB,WAAW,OAAO,8CACvB,SAAS,kBAAkB,YAAY,KAAK,WAAW,KAAK,IAAI,EAAE,2GAEzC,SAAS,KAC1C,OAAO,KAAK,QAAQ,SAAU,CAAC,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,KAAK,IAAI,EAAE,EAC/D;CAEF,OAAO;AACT;;;;;;;;;;;;;;;;;;;;;ACtrBA,MAAa,WAAgC,IAAI,IAAI;CACnD;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF,CAAC;;AAGD,MAAa,YAAiC,IAAI,IAAI;CACpD;CACA;CACA;CACA;CACA;CACA;AACF,CAAC;;;;;;;AAQD,SAAgB,UAAU,KAAa,MAAkC;CACvE,MAAM,OAAO,MAAM,OAAO,IAAI,IAAI,KAAK,IAAI,IAAI;CAC/C,MAAM,OAAO,MAAM,WAAW,IAAI,IAAI,KAAK,QAAQ,IAAI;CACvD,MAAM,MAAoB,CAAC;CAC3B,KAAK,KAAK,MAAM,MAAM,GAAG;CACzB,OAAO;AACT;AAEA,SAAS,KACP,KACA,MACA,MACA,KACM;CACN,KAAK,MAAM,KAAK,YAAY,KAAK,EAAE,eAAe,KAAK,CAAC,GAAG;EACzD,IAAI,EAAE,KAAK,WAAW,GAAG,KAAK,EAAE,SAAS,KAAK;EAC9C,MAAM,IAAI,KAAK,KAAK,EAAE,IAAI;EAC1B,IAAI,EAAE,YAAY,GAChB;OAAI,CAAC,KAAK,IAAI,EAAE,IAAI,GAAG,KAAK,GAAG,MAAM,MAAM,GAAG;EAAC,OAC1C,IAAI,KAAK,IAAI,QAAQ,EAAE,IAAI,CAAC,GACjC,IAAI,KAAK;GAAE,MAAM;GAAG,MAAM,aAAa,GAAG,MAAM;EAAE,CAAC;CAEvD;AACF;;;;;;;;;AClCA,MAAM,gBAAgB;CAAC;CAAQ;CAAa;CAAW;CAAe;AAAc;;;;;;AAOpF,MAAM,YAAY;;AAGlB,MAAM,aAAa;;;;;;;;;;;AAYnB,MAAM,QAAQ,OAAO,GAAG;;;;;;;AAQxB,MAAM,OAAO,OAAO,GAAG;AAEvB,MAAM,iBAAiB,IAAI,OAAO,OAAO,GAAG,GAAG,KAAK,aAAa,OAAO;AACxE,MAAM,YAAY,UAChB,IAAI,OAAO,OAAO,GAAG,GAAG,KAAK,GAAG,MAAM,KAAK,GAAG,EAAE,UAAU,SAAS,GAAG;;AAExE,MAAM,WAAW,UACf,IAAI,OACF,OAAO,GAAG,GAAG,KAAK,GAAG,MAAM,KAAK,GAAG,EAAE,gDACrC,GACF;AAEF,MAAM,UAAU,KAAa,UAAkB,IAAI,MAAM,GAAG,KAAK,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC;;;;;AAM/E,SAAS,UAAU,QAAqE;CACtF,MAAM,CAAC,IAAI,IAAI,KAAK,KAAK,MAAM,QAAQ;CACvC,IAAI,SAAS,QAAW,OAAO,EAAE,KAAK;CACtC,MAAM,UAAU,MAAM,MAAM,OAAO,OAAO;CAC1C,IAAI,YAAY,QAAW,OAAO,CAAC;CAEnC,IAAI,QAAQ,SAAS,IAAI,GAAG,OAAO,EAAE,MAAM,QAAQ;CACnD,OAAO,EAAE,QAAQ;AACnB;;AAGA,SAAgB,gBACd,KACA,OAAO,YACP,MACgD;CAChD,MAAM,QAAQ,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,eAAe,GAAI,MAAM,SAAS,CAAC,CAAE,CAAC,CAAC;CACrE,MAAM,OAAkB,CAAC;CACzB,MAAM,UAA4B,CAAC;CAGnC,MAAM,OAAO,SAAS;CACtB,KAAK,MAAM,KAAK,IAAI,SAAS,SAAS,GAAG;EACvC,MAAM,QAAQ,EAAE,MAAM;EACtB,MAAM,MAAM,KAAK,KAAK,KAAK;EAC3B,IAAI,CAAC,KAAK;EACV,MAAM,OAAO,OAAO,KAAK,EAAE,KAAM;EACjC,MAAM,EAAE,SAAS,SAAS,UAAU,IAAI,MAAM,CAAC,CAAC;EAChD,IAAI,SAAS,KAAK,KAAK;GAAE,MAAM;GAAS,MAAM;GAAa,MAAM;GAAQ;GAAM;EAAK,CAAC;OAChF,IAAI,MAAM,QAAQ,KAAK;GAAE;GAAM,MAAM;GAAQ;GAAM;EAAK,CAAC;CAChE;CAGA,KAAK,MAAM,KAAK,IAAI,SAAS,SAAS,KAAK,CAAC,GAAG;EAC7C,MAAM,OAAO,OAAO,KAAK,EAAE,KAAM;EACjC,MAAM,EAAE,SAAS,SAAS,UAAU,EAAE,MAAM,CAAC,CAAC;EAC9C,IAAI,SAAS,KAAK,KAAK;GAAE,MAAM;GAAS,MAAM;GAAQ,MAAM,EAAE;GAAK;GAAM;EAAK,CAAC;OAC1E,IAAI,MAAM,QAAQ,KAAK;GAAE;GAAM,MAAM,EAAE;GAAK;GAAM;EAAK,CAAC;CAC/D;CAGA,KAAK,MAAM,KAAK,IAAI,SAAS,QAAQ,KAAK,CAAC,GAAG;EAC5C,MAAM,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE;EAClC,IAAI,CAAC,WAAW,QAAQ,SAAS,IAAI,GAAG;EACxC,KAAK,KAAK;GAAE,MAAM;GAAS,MAAM;GAAU,MAAM,EAAE;GAAK;GAAM,MAAM,OAAO,KAAK,EAAE,KAAM;EAAE,CAAC;CAC7F;CAGA,KAAK,MAAM,KAAK,IAAI,SAAS,UAAU,GAAG;EACxC,MAAM,KAAK,EAAE,MAAM,EAAE;EACrB,IAAI,CAAC,IAAI;EACT,KAAK,KAAK;GAAE,MAAM;GAAI,MAAM;GAAU,MAAM;GAAQ;GAAM,MAAM,OAAO,KAAK,EAAE,KAAM;EAAE,CAAC;CACzF;CAEA,OAAO;EAAE;EAAM;CAAQ;AACzB;;AAGA,SAAgB,gBACd,OACA,MACgB;CAChB,MAAM,OAAkB,CAAC;CACzB,MAAM,UAA4B,CAAC;CACnC,KAAK,MAAM,KAAK,OAAO;EACrB,MAAM,IAAI,gBAAgB,EAAE,MAAM,EAAE,MAAM,IAAI;EAC9C,KAAK,KAAK,GAAG,EAAE,IAAI;EACnB,QAAQ,KAAK,GAAG,EAAE,OAAO;CAC3B;CACA,OAAO;EAAE;EAAM;EAAS,OAAO,CAAC,GAAG,IAAI,IAAI,KAAK,KAAK,MAAM,EAAE,IAAI,CAAC,CAAC;CAAE;AACvE"}
1
+ {"version":3,"file":"index.mjs","names":["s"],"sources":["../src/content.ts","../src/html.ts","../src/icons.ts","../src/scan.ts","../src/icons-scan.ts"],"sourcesContent":["/**\n * Framework-agnostic content-model types, guards, i18n, and part-attr resolution.\n *\n * Extracted from @getvitops/astro so the pure-TS helpers live in one place (no\n * Astro dependency). The Astro-typed element tag was `astro/types`' `HTMLTag`;\n * here it's a plain `string` (any tag name), keeping these fully framework-neutral.\n */\n\n// ── content-model types ──────────────────────────────────────────────────────\n\n/** A translatable value: a plain string, or a locale → string map. */\nexport type Localizable = string | Record<string, string>;\n\n/**\n * An HTML attribute bag. `class` may be a string or a class:list-style array\n * (falsy entries dropped); everything else is passed through to the element.\n */\nexport interface Attrs {\n class?: string | (string | false | null | undefined)[];\n [attr: string]: unknown;\n}\n\n/** An image reference used by image links. */\nexport interface ImageRef {\n src: string;\n alt?: Localizable;\n [key: string]: unknown;\n}\n\n/** A link with a text label. */\nexport interface TextLink {\n label: Localizable;\n href: string;\n attrs?: Attrs;\n [key: string]: unknown;\n}\n\n/** A link whose content is an image. */\nexport interface ImageLink {\n image: ImageRef;\n href: string;\n attrs?: Attrs;\n [key: string]: unknown;\n}\n\n/** Any link — text or image. */\nexport type Link = TextLink | ImageLink;\n\n/**\n * A generic content element wrapper (discriminated by `type: 'element'`),\n * carrying a payload `T` rendered as `Tag` (any HTML tag name).\n */\nexport interface Elmnt<T = unknown, Tag extends string = 'div'> {\n type: 'element';\n tag?: Tag;\n attrs?: Attrs;\n content?: T;\n [key: string]: unknown;\n}\n\n/**\n * A renderable node tree — a text string (Localizable) or an element with\n * optional attrs and either `text` shorthand or `children`.\n */\nexport type ContentNode =\n | string\n | {\n tag: string;\n attrs?: Attrs;\n text?: Localizable;\n children?: ContentNode[];\n };\n\n// ── type guards ──────────────────────────────────────────────────────────────\n\nexport function isElmnt<T, Tag extends string = 'div'>(item: any): item is Elmnt<T, Tag> {\n return item && item.type === 'element';\n}\n\nexport function isLink(item: any): item is Link {\n return item && ('label' in item || 'image' in item) && 'href' in item;\n}\n\nexport function isTextLink(item: any): item is TextLink {\n return item && 'label' in item && 'href' in item;\n}\n\nexport function isImageLink(item: any): item is ImageLink {\n return item && 'image' in item && 'href' in item;\n}\n\n// ── i18n ─────────────────────────────────────────────────────────────────────\n\n/**\n * Resolve a Localizable value to a string for the given locale. A plain string\n * is returned as-is; a locale map returns the best match (locale → default → '').\n */\nexport function t(value: Localizable | undefined, locale: string, defaultLocale: string): string {\n if (value == null) return '';\n if (typeof value === 'string') return value;\n return value[locale] ?? value[defaultLocale] ?? '';\n}\n\n// ── part-attr resolution ─────────────────────────────────────────────────────\n\n/**\n * Resolve per-part attrs from a presentation-type config. For the `root` part,\n * merges legacy `attrs` with `parts.root` (backward compat).\n */\nexport function partAttrs(\n present: { attrs?: Attrs; parts?: Record<string, Attrs> } | undefined,\n part: string,\n): Attrs {\n const fromParts = present?.parts?.[part];\n if (part === 'root') {\n const legacy = present?.attrs;\n if (!legacy && !fromParts) return {};\n const { class: lc, ...lr } = legacy ?? {};\n const { class: pc, ...pr } = fromParts ?? {};\n const classes = [lc, pc].flat().filter((c): c is string => typeof c === 'string' && c !== '');\n return {\n ...(classes.length ? { class: classes } : {}),\n ...lr,\n ...pr,\n };\n }\n return fromParts ?? {};\n}\n","/**\n * Framework-agnostic HTML/markup helpers (parse5-based). Extracted from\n * @getvitops/astro — no Astro runtime dependency; the Astro-typed `HTMLTag` /\n * `HTMLAttributes` are generalized to `string` / `Record<string, unknown>`.\n */\nimport { parseFragment, serialize as s, type DefaultTreeAdapterTypes } from 'parse5';\nimport type { Localizable, ContentNode } from './content.ts';\n\nexport type ChildNode = DefaultTreeAdapterTypes.ChildNode;\n\nexport function parseRenderedSlots(html: string): ChildNode[] {\n return parseFragment(html).childNodes;\n}\n\nexport function getAttribute(node: ChildNode, attrName: string): string | null {\n if ('attrs' in node) {\n const attr = node.attrs.find((a) => a.name === attrName);\n return attr ? attr.value : null;\n }\n return null;\n}\n\nexport function serialize(nodes: ChildNode | ChildNode[]): string[] {\n return (Array.isArray(nodes) ? nodes : [nodes]).map((node) =>\n s(node as DefaultTreeAdapterTypes.ParentNode),\n );\n}\n\n/** Style value types that can be combined (camelCase or --custom-prop keys). */\ntype StyleObject = Record<string, string | number | null | undefined>;\nexport type StyleValue = string | StyleObject | null | undefined;\nexport type StyleList = StyleValue | StyleValue[];\n\n/** camelCase → kebab-case, preserving CSS custom properties (`--var-name`). */\nfunction toKebabCase(str: string): string {\n if (str.startsWith('--')) return str;\n return str.replace(/([A-Z])/g, '-$1').toLowerCase();\n}\nfunction styleObjectToString(obj: StyleObject): string {\n return Object.entries(obj)\n .filter(([, value]) => value != null)\n .map(([key, value]) => `${toKebabCase(key)}: ${value}`)\n .join('; ');\n}\n\n/** Combine multiple style formats into one CSS string (like `class:list` for styles). */\nexport function styleList(...styles: StyleList[]): string {\n const result: string[] = [];\n const process = (item: StyleList): void => {\n if (item == null) return;\n if (Array.isArray(item)) {\n item.forEach(process);\n } else if (typeof item === 'string') {\n const trimmed = item.trim();\n if (trimmed) result.push(trimmed);\n } else {\n const str = styleObjectToString(item as StyleObject);\n if (str) result.push(str);\n }\n };\n styles.forEach(process);\n return result.join('; ');\n}\n\n/** Element descriptor: a tag name, text content, and optional attributes. */\nexport interface El<Tag extends string = string> {\n text: string;\n tag: Tag;\n attributes?: Record<string, unknown>;\n}\n\nfunction isEl(value: string | El): value is El {\n return typeof value === 'object' && value !== null && 'tag' in value && 'text' in value;\n}\n\nfunction attributesToString(attrs: Record<string, unknown>): string {\n const parts: string[] = [];\n for (const [key, value] of Object.entries(attrs)) {\n if (value == null || value === false) continue;\n if (value === true) {\n parts.push(key);\n } else if (key === 'style' && typeof value === 'object') {\n parts.push(`style=\"${styleList(value as StyleValue)}\"`);\n } else {\n const text = Array.isArray(value)\n ? value.filter((v): v is string => typeof v === 'string' && v !== '').join(' ')\n : typeof value === 'object'\n ? JSON.stringify(value)\n : String(value as string | number | boolean);\n parts.push(`${key}=\"${text.replace(/\"/g, '&quot;')}\"`);\n }\n }\n return parts.join(' ');\n}\n\n/** Normalize a string or `El` object into an HTML string (for `set:html`). */\nexport function toHtml<Tag extends string>(content: string | El<Tag>): string {\n if (!isEl(content)) return content;\n const { tag, text, attributes } = content;\n const attrStr = attributes ? attributesToString(attributes) : '';\n const t = String(tag);\n return attrStr ? `<${t} ${attrStr}>${text}</${t}>` : `<${t}>${text}</${t}>`;\n}\n\n// ── node-tree renderer — { tag, attrs, children } ────────────────────────────\nconst VOID_ELEMENTS = new Set([\n 'area',\n 'base',\n 'br',\n 'col',\n 'embed',\n 'hr',\n 'img',\n 'input',\n 'link',\n 'meta',\n 'param',\n 'source',\n 'track',\n 'wbr',\n]);\n\nfunction defaultResolveText(value: Localizable): string {\n if (typeof value === 'string') return value;\n const values = Object.values(value);\n return values[0] ?? '';\n}\n\nfunction escapeHtml(text: string): string {\n return text.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');\n}\n\nfunction nodeToHtml(node: ContentNode, resolveText: (value: Localizable) => string): string {\n if (typeof node === 'string') return escapeHtml(resolveText(node));\n const { tag, attrs, text, children } = node;\n const attrStr = attrs ? attributesToString(attrs) : '';\n const open = attrStr ? `<${tag} ${attrStr}>` : `<${tag}>`;\n if (VOID_ELEMENTS.has(tag)) return open;\n let inner = '';\n if (text != null) inner = escapeHtml(resolveText(text));\n else if (children?.length)\n inner = children.map((child) => nodeToHtml(child, resolveText)).join('');\n return `${open}${inner}</${tag}>`;\n}\n\n/** Render an array of `ContentNode`s to an HTML string. */\nexport function nodesToHtml(\n nodes: ContentNode[],\n resolveText: (value: Localizable) => string = defaultResolveText,\n): string {\n return nodes.map((node) => nodeToHtml(node, resolveText)).join('');\n}\n","/**\n * Semantic icon name mapping across icon sets.\n *\n * Keys are functional/semantic names (what the icon means).\n * Values are the actual icon names in each set.\n *\n * Two consumers:\n * - `generateIconInclude()` (below) — build time. Turns the semantic names a project\n * declares into the `include` map astro-icon needs, so the icon set can be swapped\n * without touching call sites.\n * - `<wc-icon-picker>` (@getvitops/core) — browser. Its `semantic` mode lists these\n * keys so an icon can be chosen by meaning rather than by set-specific name.\n *\n * `resolveIcon`/`resolveBrandIcon` map one semantic name to a fully-qualified\n * `prefix:name` string for a given set.\n */\n\n/**\n * Maps astro-icon prefixes to iconMap lookup keys.\n * FA7 variants (fa7-solid, fa7-regular, etc.) all share the same icon names\n * and map to the 'fa7' key. Other sets map to themselves.\n */\nexport const prefixToMapKey: Record<string, string> = {\n 'fa7-solid': 'fa7',\n 'fa7-regular': 'fa7',\n 'fa7-light': 'fa7',\n 'fa7-thin': 'fa7',\n 'fa7-brands': 'fa7-brands',\n 'simple-icons': 'simple-icons',\n 'material-symbols': 'material-symbols',\n lucide: 'lucide',\n ph: 'ph',\n};\n\n/**\n * Sets whose weights are a name SUFFIX inside one collection rather than\n * separate prefixed collections. Phosphor is the case that forced this:\n * `ph:lightning`, `ph:lightning-bold`, `ph:lightning-fill` all live in `ph`,\n * whereas Font Awesome splits the same idea across `fa7-solid`/`fa7-regular`/…\n * (which is what `prefixToMapKey` collapses).\n *\n * The first entry is the unsuffixed default — asking for it adds nothing.\n */\nexport const WEIGHTED_SETS: Record<string, readonly string[]> = {\n ph: ['regular', 'bold', 'duotone', 'fill', 'light', 'thin'],\n};\n\nexport const iconMap = {\n fa7: {\n // Navigation / UI\n menu: 'bars',\n close: 'xmark',\n home: 'home',\n settings: 'gear',\n search: 'magnifying-glass',\n 'chevron-left': 'chevron-left',\n 'chevron-right': 'chevron-right',\n 'chevron-up': 'chevron-up',\n 'chevron-down': 'chevron-down',\n 'arrow-left': 'arrow-left',\n 'arrow-right': 'arrow-right',\n 'arrow-up': 'arrow-up',\n 'arrow-down': 'arrow-down',\n 'external-link': 'arrow-up-right-from-square',\n 'more-vert': 'ellipsis-vertical',\n 'more-horiz': 'ellipsis',\n\n // Actions\n add: 'plus',\n remove: 'minus',\n delete: 'trash',\n edit: 'pen',\n save: 'floppy-disk',\n copy: 'copy',\n paste: 'paste',\n attach: 'paperclip',\n upload: 'upload',\n download: 'download',\n share: 'share',\n bookmark: 'bookmark',\n favorite: 'heart',\n star: 'star',\n 'star-half': 'star-half-stroke',\n login: 'right-to-bracket',\n logout: 'right-from-bracket',\n\n // Communication\n email: 'envelope',\n phone: 'phone',\n location: 'location-dot',\n globe: 'globe',\n link: 'link',\n\n // Time\n clock: 'clock',\n calendar: 'calendar',\n schedule: 'calendar-days',\n\n // People\n person: 'user',\n group: 'users',\n\n // Content / Files\n file: 'file',\n 'file-add': 'file-circle-plus',\n folder: 'folder',\n 'folder-open': 'folder-open',\n 'folder-add': 'folder-plus',\n image: 'image',\n export: 'file-export',\n import: 'file-import',\n backup: 'cloud-arrow-up',\n compress: 'compress',\n\n // Status / Feedback\n check: 'check',\n error: 'circle-exclamation',\n warning: 'triangle-exclamation',\n info: 'circle-info',\n help: 'circle-question',\n\n // Commerce\n cart: 'cart-shopping',\n tag: 'tag',\n 'credit-card': 'credit-card',\n receipt: 'receipt',\n\n // Nature (landscaping context)\n leaf: 'leaf',\n tree: 'tree',\n seedling: 'seedling',\n trowel: 'trowel',\n droplet: 'droplet',\n snowflake: 'snowflake',\n sun: 'sun',\n cloud: 'cloud',\n\n // Layout / View\n grid: 'table-cells',\n list: 'list',\n filter: 'filter',\n sort: 'sort',\n fullscreen: 'expand',\n collapse: 'compress',\n\n // Misc\n building: 'building',\n video: 'video',\n lock: 'lock',\n unlock: 'lock-open',\n eye: 'eye',\n 'eye-off': 'eye-slash',\n print: 'print',\n code: 'code',\n palette: 'palette',\n lightbulb: 'lightbulb',\n lightning: 'bolt',\n },\n\n 'fa7-brands': {\n // Social Media\n facebook: 'facebook',\n instagram: 'instagram',\n x: 'x-twitter',\n bluesky: 'bluesky',\n threads: 'threads',\n mastodon: 'mastodon',\n linkedin: 'linkedin',\n youtube: 'youtube',\n tiktok: 'tiktok',\n pinterest: 'pinterest-p',\n reddit: 'reddit',\n snapchat: 'snapchat',\n github: 'github',\n\n // Messaging\n whatsapp: 'whatsapp',\n telegram: 'telegram',\n discord: 'discord',\n\n // Payment\n stripe: 'stripe',\n paypal: 'paypal',\n visa: 'cc-visa',\n mastercard: 'cc-mastercard',\n amex: 'cc-amex',\n discover: 'cc-discover',\n 'apple-pay': 'apple-pay',\n 'google-pay': 'google-pay',\n 'amazon-pay': 'amazon-pay',\n\n // Review / Directory\n yelp: 'yelp',\n google: 'google',\n\n // Platforms\n apple: 'apple',\n microsoft: 'microsoft',\n amazon: 'amazon',\n shopify: 'shopify',\n wordpress: 'wordpress',\n cloudflare: 'cloudflare',\n },\n\n 'simple-icons': {\n // Social Media\n facebook: 'facebook',\n instagram: 'instagram',\n x: 'x',\n bluesky: 'bluesky',\n threads: 'threads',\n mastodon: 'mastodon',\n linkedin: 'linkedin',\n youtube: 'youtube',\n tiktok: 'tiktok',\n pinterest: 'pinterest',\n reddit: 'reddit',\n snapchat: 'snapchat',\n github: 'github',\n\n // Messaging\n whatsapp: 'whatsapp',\n telegram: 'telegram',\n discord: 'discord',\n\n // Payment\n stripe: 'stripe',\n paypal: 'paypal',\n visa: 'visa',\n mastercard: 'mastercard',\n amex: 'americanexpress',\n discover: 'discover',\n 'apple-pay': 'applepay',\n 'google-pay': 'googlepay',\n 'amazon-pay': 'amazonpay',\n klarna: 'klarna',\n afterpay: 'afterpay',\n square: 'square',\n cashapp: 'cashapp',\n interac: 'interac',\n\n // Review / Directory\n yelp: 'yelp',\n google: 'google',\n tripadvisor: 'tripadvisor',\n trustpilot: 'trustpilot',\n 'google-maps': 'googlemaps',\n homeadvisor: 'homeadvisor',\n houzz: 'houzz',\n nextdoor: 'nextdoor',\n bbb: 'bbb',\n\n // Platforms\n apple: 'apple',\n microsoft: 'microsoft',\n amazon: 'amazon',\n shopify: 'shopify',\n wordpress: 'wordpress',\n cloudflare: 'cloudflare',\n waze: 'waze',\n },\n\n 'material-symbols': {\n // Navigation / UI\n menu: 'menu',\n close: 'close',\n home: 'home',\n settings: 'settings',\n search: 'search',\n 'chevron-left': 'chevron-left',\n 'chevron-right': 'chevron-right',\n // Material Symbols' chevrons are only named `chevron-*` on the horizontal\n // axis; the vertical pair is `expand-more`/`expand-less`, same glyph.\n 'chevron-up': 'expand-less',\n 'chevron-down': 'expand-more',\n 'arrow-left': 'arrow-back',\n 'arrow-right': 'arrow-forward',\n 'arrow-up': 'arrow-upward',\n 'arrow-down': 'arrow-downward',\n 'external-link': 'open-in-new',\n 'more-vert': 'more-vert',\n 'more-horiz': 'more-horiz',\n\n // Actions\n add: 'add',\n remove: 'remove',\n delete: 'delete',\n edit: 'edit',\n save: 'save',\n copy: 'content-copy',\n paste: 'content-paste',\n attach: 'attach-file',\n upload: 'upload',\n download: 'download',\n share: 'share',\n bookmark: 'bookmark',\n favorite: 'favorite',\n star: 'star',\n 'star-half': 'star-half',\n login: 'login',\n logout: 'logout',\n\n // Communication\n email: 'mail',\n phone: 'call',\n location: 'location-on',\n globe: 'language',\n link: 'link',\n\n // Time\n clock: 'schedule',\n calendar: 'calendar-today',\n schedule: 'calendar-month',\n\n // People\n person: 'person',\n group: 'group',\n\n // Content / Files\n file: 'description',\n 'file-add': 'note-add',\n folder: 'folder',\n 'folder-open': 'folder-open',\n 'folder-add': 'create-new-folder',\n image: 'image',\n export: 'upload-file',\n import: 'download',\n backup: 'backup',\n compress: 'compress',\n\n // Status / Feedback\n check: 'check-circle',\n error: 'error',\n warning: 'warning',\n info: 'info',\n help: 'help',\n\n // Commerce\n cart: 'shopping-cart',\n tag: 'sell',\n 'credit-card': 'credit-card',\n receipt: 'receipt-long',\n\n // Nature (landscaping context)\n leaf: 'eco',\n tree: 'forest',\n seedling: 'potted-plant',\n trowel: 'construction',\n droplet: 'water-drop',\n snowflake: 'ac-unit',\n sun: 'light-mode',\n cloud: 'cloud',\n\n // Layout / View\n grid: 'grid-view',\n list: 'list',\n filter: 'filter-list',\n sort: 'sort',\n fullscreen: 'fullscreen',\n collapse: 'fullscreen-exit',\n\n // Misc\n building: 'domain',\n video: 'videocam',\n lock: 'lock',\n unlock: 'lock-open',\n eye: 'visibility',\n 'eye-off': 'visibility-off',\n print: 'print',\n code: 'code',\n palette: 'palette',\n lightbulb: 'lightbulb',\n lightning: 'bolt',\n },\n lucide: {\n // Navigation / UI\n menu: 'menu',\n close: 'x',\n home: 'house',\n settings: 'settings',\n search: 'search',\n 'chevron-left': 'chevron-left',\n 'chevron-right': 'chevron-right',\n 'chevron-up': 'chevron-up',\n 'chevron-down': 'chevron-down',\n 'arrow-left': 'arrow-left',\n 'arrow-right': 'arrow-right',\n 'arrow-up': 'arrow-up',\n 'arrow-down': 'arrow-down',\n 'external-link': 'external-link',\n 'more-vert': 'ellipsis-vertical',\n 'more-horiz': 'ellipsis',\n\n // Actions\n add: 'plus',\n remove: 'minus',\n delete: 'trash-2',\n edit: 'pencil',\n save: 'save',\n copy: 'copy',\n paste: 'clipboard-paste',\n attach: 'paperclip',\n upload: 'upload',\n download: 'download',\n share: 'share-2',\n bookmark: 'bookmark',\n favorite: 'heart',\n star: 'star',\n 'star-half': 'star-half',\n login: 'log-in',\n logout: 'log-out',\n\n // Communication\n email: 'mail',\n phone: 'phone',\n location: 'map-pin',\n globe: 'globe',\n link: 'link',\n\n // Time\n clock: 'clock',\n calendar: 'calendar',\n schedule: 'calendar-days',\n\n // People\n person: 'user',\n group: 'users',\n\n // Content / Files\n file: 'file',\n 'file-add': 'file-plus',\n folder: 'folder',\n 'folder-open': 'folder-open',\n 'folder-add': 'folder-plus',\n image: 'image',\n export: 'file-output',\n import: 'file-input',\n backup: 'hard-drive-upload',\n compress: 'minimize-2',\n\n // Status / Feedback\n check: 'check-circle',\n error: 'circle-alert',\n warning: 'triangle-alert',\n info: 'info',\n help: 'circle-help',\n\n // Commerce\n cart: 'shopping-cart',\n tag: 'tag',\n 'credit-card': 'credit-card',\n receipt: 'receipt',\n\n // Nature (landscaping context)\n leaf: 'leaf',\n tree: 'tree-pine',\n seedling: 'sprout',\n trowel: 'shovel',\n droplet: 'droplet',\n snowflake: 'snowflake',\n sun: 'sun',\n cloud: 'cloud',\n\n // Layout / View\n grid: 'layout-grid',\n list: 'list',\n filter: 'filter',\n sort: 'arrow-up-down',\n fullscreen: 'maximize',\n collapse: 'minimize',\n\n // Misc\n building: 'building-2',\n video: 'video',\n lock: 'lock',\n unlock: 'lock-open',\n eye: 'eye',\n 'eye-off': 'eye-off',\n print: 'printer',\n code: 'code',\n palette: 'palette',\n lightbulb: 'lightbulb',\n lightning: 'zap',\n },\n // Phosphor. Unlike fa7, the weights are NOT separate collections — `ph` is one\n // collection and the weight is a name SUFFIX (`lightning`, `lightning-bold`,\n // `lightning-fill`, …), which is why `prefixToMapKey` maps `ph` to itself with\n // nothing to collapse. See WEIGHTED_SETS / resolveIcon's `weight` option.\n ph: {\n // Navigation / UI\n menu: 'list',\n close: 'x',\n home: 'house',\n settings: 'gear',\n search: 'magnifying-glass',\n // Phosphor's chevron is the `caret` family; `ph:chevron-*` doesn't exist.\n 'chevron-left': 'caret-left',\n 'chevron-right': 'caret-right',\n 'chevron-up': 'caret-up',\n 'chevron-down': 'caret-down',\n 'arrow-left': 'arrow-left',\n 'arrow-right': 'arrow-right',\n 'arrow-up': 'arrow-up',\n 'arrow-down': 'arrow-down',\n 'external-link': 'arrow-square-out',\n 'more-vert': 'dots-three-vertical',\n 'more-horiz': 'dots-three',\n // Actions\n add: 'plus',\n remove: 'minus',\n delete: 'trash',\n edit: 'pencil',\n save: 'floppy-disk',\n copy: 'copy',\n paste: 'clipboard',\n attach: 'paperclip',\n upload: 'upload',\n download: 'download',\n share: 'share',\n bookmark: 'bookmark',\n favorite: 'heart',\n star: 'star',\n 'star-half': 'star-half',\n login: 'sign-in',\n logout: 'sign-out',\n // Communication\n email: 'envelope',\n phone: 'phone',\n location: 'map-pin',\n globe: 'globe',\n link: 'link',\n // Time\n clock: 'clock',\n calendar: 'calendar',\n schedule: 'calendar-dots',\n // People\n person: 'person',\n group: 'users',\n // Content / files\n file: 'file',\n 'file-add': 'file-plus',\n folder: 'folder',\n 'folder-open': 'folder-open',\n 'folder-add': 'folder-plus',\n image: 'image',\n export: 'upload-simple',\n import: 'download-simple',\n backup: 'cloud-arrow-up',\n compress: 'arrows-in',\n // Status / feedback\n check: 'check',\n error: 'warning-circle',\n warning: 'warning',\n info: 'info',\n help: 'question',\n // Commerce\n cart: 'shopping-cart',\n tag: 'tag',\n 'credit-card': 'credit-card',\n receipt: 'receipt',\n // Nature (landscaping)\n leaf: 'leaf',\n tree: 'tree',\n seedling: 'plant',\n trowel: 'shovel',\n droplet: 'drop',\n snowflake: 'snowflake',\n sun: 'sun',\n cloud: 'cloud',\n // Layout / view\n grid: 'squares-four',\n list: 'list',\n filter: 'funnel',\n sort: 'arrows-down-up',\n fullscreen: 'corners-out',\n collapse: 'corners-in',\n // Misc\n building: 'building',\n video: 'video',\n lock: 'lock',\n unlock: 'lock-open',\n eye: 'eye',\n 'eye-off': 'eye-slash',\n print: 'printer',\n code: 'code',\n palette: 'palette',\n lightbulb: 'lightbulb',\n lightning: 'lightning',\n },\n} as const satisfies Record<string, Record<string, string>>;\n\nexport type IconSet = keyof typeof iconMap;\nexport type SemanticIcon = keyof (typeof iconMap)['fa7'];\nexport type BrandIcon = keyof (typeof iconMap)['simple-icons'];\n\n/**\n * Resolve a semantic icon name to a fully-qualified astro-icon string.\n * Names containing ':' are returned as-is (pass-through for fully-qualified names).\n *\n * @param name - Semantic name ('email') or fully-qualified ('fa7-solid:envelope')\n * @param prefix - astro-icon prefix, e.g. 'fa7-solid', 'material-symbols', 'lucide', 'ph'\n * @param opts.weight - Weight for suffix-weighted sets (see `WEIGHTED_SETS`), e.g.\n * `resolveIcon('menu', 'ph', { weight: 'bold' })` → `'ph:list-bold'`. Ignored for\n * sets that aren't suffix-weighted; an unknown weight throws rather than silently\n * resolving to the regular glyph, which would be indistinguishable from a typo.\n */\nexport function resolveIcon(name: string, prefix: string, opts?: { weight?: string }): string {\n if (name.includes(':')) return name;\n const mapKey = prefixToMapKey[prefix] as IconSet | undefined;\n if (!mapKey)\n throw new Error(\n `Unknown icon prefix \"${prefix}\". Valid: ${Object.keys(prefixToMapKey).join(', ')}`,\n );\n const map = iconMap[mapKey];\n const resolved = map[name as keyof typeof map];\n if (!resolved)\n throw new Error(`Icon \"${name}\" not found in set \"${prefix}\" (map key: \"${mapKey}\")`);\n return `${prefix}:${applyWeight(resolved, prefix, opts?.weight)}`;\n}\n\n/** Append a weight suffix for suffix-weighted sets. The first weight is the bare default. */\nfunction applyWeight(name: string, prefix: string, weight?: string): string {\n if (!weight) return name;\n const weights = WEIGHTED_SETS[prefix];\n if (!weights) return name;\n if (!weights.includes(weight))\n throw new Error(\n `Unknown weight \"${weight}\" for icon set \"${prefix}\". Valid: ${weights.join(', ')}.`,\n );\n return weight === weights[0] ? name : `${name}-${weight}`;\n}\n\n/**\n * Resolve a brand icon name to a fully-qualified astro-icon string.\n * Names containing ':' are returned as-is (pass-through).\n *\n * @param name - Semantic brand name ('facebook') or fully-qualified ('simple-icons:facebook')\n * @param prefix - astro-icon prefix, e.g. 'simple-icons', 'fa7-brands'\n */\nexport function resolveBrandIcon(name: string, prefix: string): string {\n if (name.includes(':')) return name;\n const mapKey = prefixToMapKey[prefix] as IconSet | undefined;\n if (!mapKey) throw new Error(`Unknown brand icon prefix \"${prefix}\"`);\n const map = iconMap[mapKey];\n const resolved = map[name as keyof typeof map];\n if (!resolved)\n throw new Error(`Brand icon \"${name}\" not found in set \"${prefix}\" (map key: \"${mapKey}\")`);\n return `${prefix}:${resolved}`;\n}\n\n/**\n * Generate the astro-icon `include` map from configured icon sets.\n *\n * Resolves two kinds of entries from the `icons` section of `site.config.yaml`:\n * - Per-set lists (e.g. `'fa7-solid': ['bars', 'plus']`) are passed through as-is.\n * - `semantic` names are looked up in the configured `ui` and `brand` prefix maps,\n * and the resolved icon names are merged into those sets' lists.\n *\n * Only explicitly configured icons are included — there is no fallback to all icons.\n *\n * @param iconsConfig - Icons config from site.config.yaml (icons section)\n * @returns Record<string, string[]> for astro-icon's `include` option\n */\nexport function generateIconInclude(iconsConfig?: {\n ui?: string;\n brand?: string;\n weight?: string;\n semantic?: string[];\n [prefix: string]: string | string[] | undefined;\n}): Record<string, string[]> {\n const uiPrefix = iconsConfig?.ui ?? 'fa7-solid';\n const brandPrefix = iconsConfig?.brand ?? 'simple-icons';\n const include: Record<string, string[]> = {};\n\n const addToInclude = (prefix: string, names: string[]) => {\n include[prefix] = [...new Set([...(include[prefix] ?? []), ...names])];\n };\n\n // Pass through per-set explicit lists directly\n for (const [key, val] of Object.entries(iconsConfig ?? {})) {\n if (\n key !== 'ui' &&\n key !== 'brand' &&\n key !== 'weight' &&\n key !== 'semantic' &&\n Array.isArray(val)\n ) {\n addToInclude(key, val as string[]);\n }\n }\n\n const uiMapKey = prefixToMapKey[uiPrefix] as IconSet | undefined;\n const brandMapKey = prefixToMapKey[brandPrefix] as IconSet | undefined;\n const unknownPrefix: string[] = [];\n if (!uiMapKey) unknownPrefix.push(`ui: '${uiPrefix}'`);\n if (!brandMapKey) unknownPrefix.push(`brand: '${brandPrefix}'`);\n if (unknownPrefix.length)\n throw new Error(\n `[vitops icons] Unknown icon set ${unknownPrefix.join(' and ')}. ` +\n `Known sets: ${Object.keys(prefixToMapKey).join(', ')}.`,\n );\n\n const unresolved: string[] = [];\n for (const name of iconsConfig?.semantic ?? []) {\n const ui = (iconMap[uiMapKey!] as Record<string, string>)[name];\n const brand = (iconMap[brandMapKey!] as Record<string, string>)[name];\n // The weight is part of the icon NAME for suffix-weighted sets, so the\n // bundled name has to carry it — including `ph:list-bold` but not\n // `ph:list` would ship the wrong glyph (or nothing) under output: 'server'.\n if (ui) addToInclude(uiPrefix, [applyWeight(ui, uiPrefix, iconsConfig?.weight)]);\n if (brand) addToInclude(brandPrefix, [applyWeight(brand, brandPrefix, iconsConfig?.weight)]);\n if (!ui && !brand) unresolved.push(name);\n }\n\n // Fail the build rather than silently omitting the icon. Skipping quietly is\n // what makes swapping icon sets frightening: the swap \"succeeds\" and the gaps\n // only show up as missing glyphs in production.\n if (unresolved.length)\n throw new Error(\n `[vitops icons] ${unresolved.length} semantic icon name(s) not found in ` +\n `ui set '${uiPrefix}' or brand set '${brandPrefix}': ${unresolved.join(', ')}.\\n` +\n `Either add them to iconMap in @getvitops/core, or drop them from the ` +\n `\\`semantic\\` list. Available in '${uiPrefix}': ` +\n `${Object.keys(iconMap[uiMapKey!]).slice(0, 12).join(', ')}…`,\n );\n\n return include;\n}\n","/**\n * Consumer source discovery.\n *\n * Lifted verbatim out of `@getvitops/cli`, where it was a private helper behind\n * `vitops lint`. It lives here now because a second caller needs it: the Astro\n * integration scans for icon usage during `astro:config:setup`, and it cannot\n * import the CLI — `@getvitops/cli` exposes only a `bin`, and its entry calls\n * `main()` at module scope, so importing it would run the CLI.\n *\n * Deliberately hand-rolled rather than a glob dependency: the whole job is one\n * `readdirSync` recursion with two allow/deny sets, and it runs synchronously\n * inside a config hook where an async glob would have to be awaited anyway.\n */\nimport { readFileSync, readdirSync } from 'node:fs';\nimport { extname, join } from 'node:path';\n\n/** A file the scanner found, with its contents already read. */\nexport interface SourceFile {\n path: string;\n text: string;\n}\n\nexport interface ScanOptions {\n /** File extensions to read. Defaults to `SCAN_EXT`. */\n exts?: Iterable<string>;\n /** Directory names to skip entirely. Defaults to `SCAN_SKIP`. */\n skipDirs?: Iterable<string>;\n}\n\n/**\n * Extensions worth scanning: every template language the framework's classes\n * and icon names can appear in, plus the markdown that can embed them.\n */\nexport const SCAN_EXT: ReadonlySet<string> = new Set([\n '.astro',\n '.html',\n '.htm',\n '.js',\n '.jsx',\n '.ts',\n '.tsx',\n '.vue',\n '.svelte',\n '.php',\n '.md',\n '.mdx',\n]);\n\n/** Directories that only ever hold dependencies or build output. */\nexport const SCAN_SKIP: ReadonlySet<string> = new Set([\n 'node_modules',\n 'dist',\n '.git',\n '.astro',\n 'build',\n 'coverage',\n]);\n\n/**\n * Recursively read every scannable file under `dir`.\n *\n * Dotfiles and dot-directories are skipped wholesale — they hold tooling config,\n * not templates, and `.astro`/`.git` would otherwise be walked twice over.\n */\nexport function scanFiles(dir: string, opts?: ScanOptions): SourceFile[] {\n const exts = opts?.exts ? new Set(opts.exts) : SCAN_EXT;\n const skip = opts?.skipDirs ? new Set(opts.skipDirs) : SCAN_SKIP;\n const acc: SourceFile[] = [];\n walk(dir, exts, skip, acc);\n return acc;\n}\n\nfunction walk(\n dir: string,\n exts: ReadonlySet<string>,\n skip: ReadonlySet<string>,\n acc: SourceFile[],\n): void {\n for (const e of readdirSync(dir, { withFileTypes: true })) {\n if (e.name.startsWith('.') && e.name !== '.') continue;\n const p = join(dir, e.name);\n if (e.isDirectory()) {\n if (!skip.has(e.name)) walk(p, exts, skip, acc);\n } else if (exts.has(extname(e.name))) {\n acc.push({ path: p, text: readFileSync(p, 'utf8') });\n }\n }\n}\n","/**\n * Find the icons a consumer's source actually uses.\n *\n * This exists for one reason: bundle size under `output: 'server'`. astro-icon\n * is zero-config for static builds, but on a server/hybrid build it bundles\n * EVERY icon in a set unless given an `include` map — so consumers hand-maintain\n * a list, and hand-maintained lists rot. Scanning derives it instead.\n *\n * The judgement call throughout is the same one `vitops lint`'s `extractClasses`\n * makes, and for the same reason: a template hole (`name={expr}`) is not a typo\n * and must not be guessed at. An unresolvable reference is REPORTED, never\n * invented — the caller warns and asks the author to declare it. Quietly\n * inferring would produce an `include` that is confidently wrong, which is worse\n * than one that is honestly incomplete.\n */\n\n/** How an icon reference was written. Useful for phrasing the warning. */\nexport type IconRefKind = 'component' | 'prop' | 'object' | 'sprite';\n\n/** A statically resolvable icon name. */\nexport interface IconRef {\n name: string;\n kind: IconRefKind;\n attr: string;\n file: string;\n line: number;\n}\n\n/** A reference whose name is computed at runtime and cannot be read statically. */\nexport interface DynamicIconRef {\n expr: string;\n attr: string;\n file: string;\n line: number;\n}\n\nexport interface IconScanResult {\n refs: IconRef[];\n dynamic: DynamicIconRef[];\n /** Unique static names, in first-seen order. */\n names: string[];\n}\n\nexport interface IconScanOptions {\n /** Extra prop names to treat as icon-bearing, beyond the defaults. */\n props?: string[];\n}\n\n/**\n * Props that carry an icon name. `icon` covers the component convention\n * (`Popover`/`Drawer`/`Details` triggers); the start/end pair covers adornments\n * on links and buttons.\n */\nconst DEFAULT_PROPS = ['icon', 'startIcon', 'endIcon', 'leadingIcon', 'trailingIcon'];\n\n/**\n * `<Icon …>` and any capitalised component whose name ends in `Icon`.\n * Requires a capital or the literal `Icon`, so `<iconButton>` and plain HTML\n * never match.\n */\nconst COMPONENT = /<([A-Z][\\w.]*Icon|Icon)\\b([^>]*?)\\/?>/g;\n\n/** Sprite references: `<use href=\"…/icons.svg#menu\">`, incl. legacy `xlink:href`. */\nconst SPRITE_USE = /<use\\b[^>]*?\\b(?:xlink:)?href\\s*=\\s*(?:\"([^\"#]*)#([^\"]*)\"|'([^'#]*)#([^']*)')/g;\n\n/**\n * An attribute value: a quoted literal, a braced single literal, or a braced\n * expression. The final alternative is what marks a value as dynamic — it is\n * matched on purpose so the reference can be REPORTED rather than skipped.\n *\n * That last alternative stops at the first `}`, so a reported expression\n * containing its own braces (`{\\`a:${b}\\`}`) is truncated in the warning text.\n * Deliberate: balancing braces with a regex buys nothing here, because the\n * actionable part of the report is the file and line, not the expression.\n */\nconst VALUE = String.raw`(?:\"([^\"]*)\"|'([^']*)'|\\{\\s*(?:\"([^\"]*)\"|'([^']*)'|\\`([^\\`$]*)\\`)\\s*\\}|(\\{[^}]*\\}))`;\n\n/**\n * `\\b` is not enough of a left boundary here: `-` is a non-word character, so\n * `\\bicon` happily matches inside `data-icon=` and `aria-icon=`. Requiring that\n * the previous character be neither a word character nor a hyphen keeps the\n * match to a genuine standalone prop.\n */\nconst LEFT = String.raw`(?<![\\w-])`;\n\nconst nameAttr = () => new RegExp(String.raw`${LEFT}name\\s*=\\s*${VALUE}`);\nconst iconProp = (props: string[]) =>\n new RegExp(String.raw`${LEFT}(${props.join('|')})\\s*=\\s*${VALUE}`, 'g');\n/** Object-literal form: `trigger={{ icon: 'bars' }}`, or a data array of `{ icon: '…' }`. */\nconst iconKey = (props: string[]) =>\n new RegExp(\n String.raw`${LEFT}(${props.join('|')})\\s*:\\s*(?:\"([^\"]*)\"|'([^']*)'|\\`([^\\`$]*)\\`)`,\n 'g',\n );\n\nconst lineOf = (src: string, index: number) => src.slice(0, index).split('\\n').length;\n\n/**\n * Pull the literal out of a VALUE match, or report it as dynamic.\n * Groups run: \"double\", 'single', {\"double\"}, {'single'}, {`template`}, {expr}.\n */\nfunction readValue(groups: (string | undefined)[]): { literal?: string; expr?: string } {\n const [dq, sq, bdq, bsq, btpl, expr] = groups;\n if (expr !== undefined) return { expr };\n const literal = dq ?? sq ?? bdq ?? bsq ?? btpl;\n if (literal === undefined) return {};\n // A template literal with an interpolation is dynamic even inside quotes.\n if (literal.includes('${')) return { expr: literal };\n return { literal };\n}\n\n/** Extract every icon reference from one file's text. */\nexport function extractIconRefs(\n src: string,\n file = '<source>',\n opts?: IconScanOptions,\n): { refs: IconRef[]; dynamic: DynamicIconRef[] } {\n const props = [...new Set([...DEFAULT_PROPS, ...(opts?.props ?? [])])];\n const refs: IconRef[] = [];\n const dynamic: DynamicIconRef[] = [];\n\n // 1. <Icon name=\"…\" /> — the name attribute inside an icon component tag.\n const NAME = nameAttr();\n for (const m of src.matchAll(COMPONENT)) {\n const attrs = m[2] ?? '';\n const hit = NAME.exec(attrs);\n if (!hit) continue;\n const line = lineOf(src, m.index!);\n const { literal, expr } = readValue(hit.slice(1));\n if (literal) refs.push({ name: literal, kind: 'component', attr: 'name', file, line });\n else if (expr) dynamic.push({ expr, attr: 'name', file, line });\n }\n\n // 2. icon= / startIcon= / endIcon= on any tag.\n for (const m of src.matchAll(iconProp(props))) {\n const line = lineOf(src, m.index!);\n const { literal, expr } = readValue(m.slice(2));\n if (literal) refs.push({ name: literal, kind: 'prop', attr: m[1]!, file, line });\n else if (expr) dynamic.push({ expr, attr: m[1]!, file, line });\n }\n\n // 3. `icon: '…'` inside an object literal or data array.\n for (const m of src.matchAll(iconKey(props))) {\n const literal = m[2] ?? m[3] ?? m[4];\n if (!literal || literal.includes('${')) continue;\n refs.push({ name: literal, kind: 'object', attr: m[1]!, file, line: lineOf(src, m.index!) });\n }\n\n // 4. Sprite <use href=\"…#id\">.\n for (const m of src.matchAll(SPRITE_USE)) {\n const id = m[2] ?? m[4];\n if (!id) continue;\n refs.push({ name: id, kind: 'sprite', attr: 'href', file, line: lineOf(src, m.index!) });\n }\n\n return { refs, dynamic };\n}\n\n/** Run `extractIconRefs` across a file set and collect unique names. */\nexport function collectIconRefs(\n files: readonly { path: string; text: string }[],\n opts?: IconScanOptions,\n): IconScanResult {\n const refs: IconRef[] = [];\n const dynamic: DynamicIconRef[] = [];\n for (const f of files) {\n const r = extractIconRefs(f.text, f.path, opts);\n refs.push(...r.refs);\n dynamic.push(...r.dynamic);\n }\n return { refs, dynamic, names: [...new Set(refs.map((r) => r.name))] };\n}\n"],"mappings":"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"}