@getvitops/utils 0.7.0 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +2 -0
- package/dist/index.d.mts +398 -1
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +438 -1
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
package/dist/index.d.mts
CHANGED
|
@@ -202,5 +202,402 @@ interface OrganizationGraphOptions {
|
|
|
202
202
|
/** Build a schema.org Organization JSON-LD graph. */
|
|
203
203
|
declare function organizationGraph(options: OrganizationGraphOptions): Record<string, unknown>;
|
|
204
204
|
//#endregion
|
|
205
|
-
|
|
205
|
+
//#region src/icons.d.ts
|
|
206
|
+
/**
|
|
207
|
+
* Semantic icon name mapping across icon sets.
|
|
208
|
+
*
|
|
209
|
+
* Keys are functional/semantic names (what the icon means).
|
|
210
|
+
* Values are the actual icon names in each set.
|
|
211
|
+
*
|
|
212
|
+
* Usage:
|
|
213
|
+
* import { icon } from '../utils/icon-resolver';
|
|
214
|
+
* <Icon name={icon('save')} /> // resolves via configured UI set
|
|
215
|
+
* <Icon name={icon('facebook')} /> // resolves via configured brand set
|
|
216
|
+
*/
|
|
217
|
+
/**
|
|
218
|
+
* Maps astro-icon prefixes to iconMap lookup keys.
|
|
219
|
+
* FA7 variants (fa7-solid, fa7-regular, etc.) all share the same icon names
|
|
220
|
+
* and map to the 'fa7' key. Other sets map to themselves.
|
|
221
|
+
*/
|
|
222
|
+
declare const prefixToMapKey: Record<string, string>;
|
|
223
|
+
declare const iconMap: {
|
|
224
|
+
readonly fa7: {
|
|
225
|
+
readonly menu: "bars";
|
|
226
|
+
readonly close: "xmark";
|
|
227
|
+
readonly home: "home";
|
|
228
|
+
readonly settings: "gear";
|
|
229
|
+
readonly search: "magnifying-glass";
|
|
230
|
+
readonly 'expand-more': "chevron-down";
|
|
231
|
+
readonly 'expand-less': "chevron-up";
|
|
232
|
+
readonly 'chevron-right': "chevron-right";
|
|
233
|
+
readonly 'chevron-left': "chevron-left";
|
|
234
|
+
readonly 'arrow-back': "arrow-left";
|
|
235
|
+
readonly 'arrow-forward': "arrow-right";
|
|
236
|
+
readonly 'external-link': "arrow-up-right-from-square";
|
|
237
|
+
readonly 'more-vert': "ellipsis-vertical";
|
|
238
|
+
readonly 'more-horiz': "ellipsis";
|
|
239
|
+
readonly add: "plus";
|
|
240
|
+
readonly remove: "minus";
|
|
241
|
+
readonly delete: "trash";
|
|
242
|
+
readonly edit: "pen";
|
|
243
|
+
readonly save: "floppy-disk";
|
|
244
|
+
readonly copy: "copy";
|
|
245
|
+
readonly paste: "paste";
|
|
246
|
+
readonly attach: "paperclip";
|
|
247
|
+
readonly upload: "upload";
|
|
248
|
+
readonly download: "download";
|
|
249
|
+
readonly share: "share";
|
|
250
|
+
readonly bookmark: "bookmark";
|
|
251
|
+
readonly favorite: "heart";
|
|
252
|
+
readonly star: "star";
|
|
253
|
+
readonly login: "login";
|
|
254
|
+
readonly logout: "logout";
|
|
255
|
+
readonly email: "envelope";
|
|
256
|
+
readonly phone: "phone";
|
|
257
|
+
readonly location: "location-dot";
|
|
258
|
+
readonly globe: "globe";
|
|
259
|
+
readonly link: "link";
|
|
260
|
+
readonly clock: "clock";
|
|
261
|
+
readonly calendar: "calendar";
|
|
262
|
+
readonly schedule: "calendar-days";
|
|
263
|
+
readonly person: "user";
|
|
264
|
+
readonly group: "users";
|
|
265
|
+
readonly file: "file";
|
|
266
|
+
readonly 'file-add': "file-circle-plus";
|
|
267
|
+
readonly folder: "folder";
|
|
268
|
+
readonly 'folder-open': "folder-open";
|
|
269
|
+
readonly 'folder-add': "folder-plus";
|
|
270
|
+
readonly image: "image";
|
|
271
|
+
readonly export: "file-export";
|
|
272
|
+
readonly import: "file-import";
|
|
273
|
+
readonly backup: "backup";
|
|
274
|
+
readonly compress: "compress";
|
|
275
|
+
readonly check: "check";
|
|
276
|
+
readonly error: "circle-exclamation";
|
|
277
|
+
readonly warning: "triangle-exclamation";
|
|
278
|
+
readonly info: "circle-info";
|
|
279
|
+
readonly help: "circle-question";
|
|
280
|
+
readonly cart: "cart-shopping";
|
|
281
|
+
readonly tag: "tag";
|
|
282
|
+
readonly 'credit-card': "credit-card";
|
|
283
|
+
readonly receipt: "receipt";
|
|
284
|
+
readonly leaf: "leaf";
|
|
285
|
+
readonly tree: "tree";
|
|
286
|
+
readonly seedling: "seedling";
|
|
287
|
+
readonly trowel: "trowel";
|
|
288
|
+
readonly droplet: "droplet";
|
|
289
|
+
readonly snowflake: "snowflake";
|
|
290
|
+
readonly sun: "sun";
|
|
291
|
+
readonly cloud: "cloud";
|
|
292
|
+
readonly grid: "table-cells";
|
|
293
|
+
readonly list: "list";
|
|
294
|
+
readonly filter: "filter";
|
|
295
|
+
readonly sort: "sort";
|
|
296
|
+
readonly fullscreen: "expand";
|
|
297
|
+
readonly collapse: "compress";
|
|
298
|
+
readonly building: "building";
|
|
299
|
+
readonly video: "video";
|
|
300
|
+
readonly lock: "lock";
|
|
301
|
+
readonly unlock: "lock-open";
|
|
302
|
+
readonly eye: "eye";
|
|
303
|
+
readonly 'eye-off': "eye-slash";
|
|
304
|
+
readonly print: "print";
|
|
305
|
+
readonly code: "code";
|
|
306
|
+
readonly palette: "palette";
|
|
307
|
+
readonly lightbulb: "lightbulb";
|
|
308
|
+
};
|
|
309
|
+
readonly 'fa7-brands': {
|
|
310
|
+
readonly facebook: "facebook";
|
|
311
|
+
readonly instagram: "instagram";
|
|
312
|
+
readonly x: "x-twitter";
|
|
313
|
+
readonly bluesky: "bluesky";
|
|
314
|
+
readonly threads: "threads";
|
|
315
|
+
readonly mastodon: "mastodon";
|
|
316
|
+
readonly linkedin: "linkedin";
|
|
317
|
+
readonly youtube: "youtube";
|
|
318
|
+
readonly tiktok: "tiktok";
|
|
319
|
+
readonly pinterest: "pinterest-p";
|
|
320
|
+
readonly reddit: "reddit";
|
|
321
|
+
readonly snapchat: "snapchat";
|
|
322
|
+
readonly github: "github";
|
|
323
|
+
readonly whatsapp: "whatsapp";
|
|
324
|
+
readonly telegram: "telegram";
|
|
325
|
+
readonly discord: "discord";
|
|
326
|
+
readonly stripe: "stripe";
|
|
327
|
+
readonly paypal: "paypal";
|
|
328
|
+
readonly visa: "cc-visa";
|
|
329
|
+
readonly mastercard: "cc-mastercard";
|
|
330
|
+
readonly amex: "cc-amex";
|
|
331
|
+
readonly discover: "cc-discover";
|
|
332
|
+
readonly 'apple-pay': "apple-pay";
|
|
333
|
+
readonly 'google-pay': "google-pay";
|
|
334
|
+
readonly 'amazon-pay': "amazon-pay";
|
|
335
|
+
readonly yelp: "yelp";
|
|
336
|
+
readonly google: "google";
|
|
337
|
+
readonly apple: "apple";
|
|
338
|
+
readonly microsoft: "microsoft";
|
|
339
|
+
readonly amazon: "amazon";
|
|
340
|
+
readonly shopify: "shopify";
|
|
341
|
+
readonly wordpress: "wordpress";
|
|
342
|
+
readonly cloudflare: "cloudflare";
|
|
343
|
+
};
|
|
344
|
+
readonly 'simple-icons': {
|
|
345
|
+
readonly facebook: "facebook";
|
|
346
|
+
readonly instagram: "instagram";
|
|
347
|
+
readonly x: "x";
|
|
348
|
+
readonly bluesky: "bluesky";
|
|
349
|
+
readonly threads: "threads";
|
|
350
|
+
readonly mastodon: "mastodon";
|
|
351
|
+
readonly linkedin: "linkedin";
|
|
352
|
+
readonly youtube: "youtube";
|
|
353
|
+
readonly tiktok: "tiktok";
|
|
354
|
+
readonly pinterest: "pinterest";
|
|
355
|
+
readonly reddit: "reddit";
|
|
356
|
+
readonly snapchat: "snapchat";
|
|
357
|
+
readonly github: "github";
|
|
358
|
+
readonly whatsapp: "whatsapp";
|
|
359
|
+
readonly telegram: "telegram";
|
|
360
|
+
readonly discord: "discord";
|
|
361
|
+
readonly stripe: "stripe";
|
|
362
|
+
readonly paypal: "paypal";
|
|
363
|
+
readonly visa: "visa";
|
|
364
|
+
readonly mastercard: "mastercard";
|
|
365
|
+
readonly amex: "americanexpress";
|
|
366
|
+
readonly discover: "discover";
|
|
367
|
+
readonly 'apple-pay': "applepay";
|
|
368
|
+
readonly 'google-pay': "googlepay";
|
|
369
|
+
readonly 'amazon-pay': "amazonpay";
|
|
370
|
+
readonly klarna: "klarna";
|
|
371
|
+
readonly afterpay: "afterpay";
|
|
372
|
+
readonly square: "square";
|
|
373
|
+
readonly cashapp: "cashapp";
|
|
374
|
+
readonly interac: "interac";
|
|
375
|
+
readonly yelp: "yelp";
|
|
376
|
+
readonly google: "google";
|
|
377
|
+
readonly tripadvisor: "tripadvisor";
|
|
378
|
+
readonly trustpilot: "trustpilot";
|
|
379
|
+
readonly 'google-maps': "googlemaps";
|
|
380
|
+
readonly homeadvisor: "homeadvisor";
|
|
381
|
+
readonly houzz: "houzz";
|
|
382
|
+
readonly nextdoor: "nextdoor";
|
|
383
|
+
readonly bbb: "bbb";
|
|
384
|
+
readonly apple: "apple";
|
|
385
|
+
readonly microsoft: "microsoft";
|
|
386
|
+
readonly amazon: "amazon";
|
|
387
|
+
readonly shopify: "shopify";
|
|
388
|
+
readonly wordpress: "wordpress";
|
|
389
|
+
readonly cloudflare: "cloudflare";
|
|
390
|
+
readonly waze: "waze";
|
|
391
|
+
};
|
|
392
|
+
readonly 'material-symbols': {
|
|
393
|
+
readonly menu: "menu";
|
|
394
|
+
readonly close: "close";
|
|
395
|
+
readonly home: "home";
|
|
396
|
+
readonly settings: "settings";
|
|
397
|
+
readonly search: "search";
|
|
398
|
+
readonly 'expand-more': "expand-more";
|
|
399
|
+
readonly 'expand-less': "expand-less";
|
|
400
|
+
readonly 'chevron-right': "chevron-right";
|
|
401
|
+
readonly 'chevron-left': "chevron-left";
|
|
402
|
+
readonly 'arrow-back': "arrow-back";
|
|
403
|
+
readonly 'arrow-forward': "arrow-forward";
|
|
404
|
+
readonly 'external-link': "open-in-new";
|
|
405
|
+
readonly 'more-vert': "more-vert";
|
|
406
|
+
readonly 'more-horiz': "more-horiz";
|
|
407
|
+
readonly add: "add";
|
|
408
|
+
readonly remove: "remove";
|
|
409
|
+
readonly delete: "delete";
|
|
410
|
+
readonly edit: "edit";
|
|
411
|
+
readonly save: "save";
|
|
412
|
+
readonly copy: "content-copy";
|
|
413
|
+
readonly paste: "content-paste";
|
|
414
|
+
readonly attach: "attach-file";
|
|
415
|
+
readonly upload: "upload";
|
|
416
|
+
readonly download: "download";
|
|
417
|
+
readonly share: "share";
|
|
418
|
+
readonly bookmark: "bookmark";
|
|
419
|
+
readonly favorite: "favorite";
|
|
420
|
+
readonly star: "star";
|
|
421
|
+
readonly login: "login";
|
|
422
|
+
readonly logout: "logout";
|
|
423
|
+
readonly email: "mail";
|
|
424
|
+
readonly phone: "call";
|
|
425
|
+
readonly location: "location-on";
|
|
426
|
+
readonly globe: "language";
|
|
427
|
+
readonly link: "link";
|
|
428
|
+
readonly clock: "schedule";
|
|
429
|
+
readonly calendar: "calendar-today";
|
|
430
|
+
readonly schedule: "calendar-month";
|
|
431
|
+
readonly person: "person";
|
|
432
|
+
readonly group: "group";
|
|
433
|
+
readonly file: "description";
|
|
434
|
+
readonly 'file-add': "note-add";
|
|
435
|
+
readonly folder: "folder";
|
|
436
|
+
readonly 'folder-open': "folder-open";
|
|
437
|
+
readonly 'folder-add': "create-new-folder";
|
|
438
|
+
readonly image: "image";
|
|
439
|
+
readonly export: "upload-file";
|
|
440
|
+
readonly import: "download";
|
|
441
|
+
readonly backup: "backup";
|
|
442
|
+
readonly compress: "compress";
|
|
443
|
+
readonly check: "check-circle";
|
|
444
|
+
readonly error: "error";
|
|
445
|
+
readonly warning: "warning";
|
|
446
|
+
readonly info: "info";
|
|
447
|
+
readonly help: "help";
|
|
448
|
+
readonly cart: "shopping-cart";
|
|
449
|
+
readonly tag: "sell";
|
|
450
|
+
readonly 'credit-card': "credit-card";
|
|
451
|
+
readonly receipt: "receipt-long";
|
|
452
|
+
readonly leaf: "eco";
|
|
453
|
+
readonly tree: "forest";
|
|
454
|
+
readonly seedling: "potted-plant";
|
|
455
|
+
readonly trowel: "construction";
|
|
456
|
+
readonly droplet: "water-drop";
|
|
457
|
+
readonly snowflake: "ac-unit";
|
|
458
|
+
readonly sun: "light-mode";
|
|
459
|
+
readonly cloud: "cloud";
|
|
460
|
+
readonly grid: "grid-view";
|
|
461
|
+
readonly list: "list";
|
|
462
|
+
readonly filter: "filter-list";
|
|
463
|
+
readonly sort: "sort";
|
|
464
|
+
readonly fullscreen: "fullscreen";
|
|
465
|
+
readonly collapse: "fullscreen-exit";
|
|
466
|
+
readonly building: "domain";
|
|
467
|
+
readonly video: "videocam";
|
|
468
|
+
readonly lock: "lock";
|
|
469
|
+
readonly unlock: "lock-open";
|
|
470
|
+
readonly eye: "visibility";
|
|
471
|
+
readonly 'eye-off': "visibility-off";
|
|
472
|
+
readonly print: "print";
|
|
473
|
+
readonly code: "code";
|
|
474
|
+
readonly palette: "palette";
|
|
475
|
+
readonly lightbulb: "lightbulb";
|
|
476
|
+
};
|
|
477
|
+
readonly lucide: {
|
|
478
|
+
readonly menu: "menu";
|
|
479
|
+
readonly close: "x";
|
|
480
|
+
readonly home: "house";
|
|
481
|
+
readonly settings: "settings";
|
|
482
|
+
readonly search: "search";
|
|
483
|
+
readonly 'expand-more': "chevron-down";
|
|
484
|
+
readonly 'expand-less': "chevron-up";
|
|
485
|
+
readonly 'chevron-right': "chevron-right";
|
|
486
|
+
readonly 'chevron-left': "chevron-left";
|
|
487
|
+
readonly 'arrow-back': "arrow-left";
|
|
488
|
+
readonly 'arrow-forward': "arrow-right";
|
|
489
|
+
readonly 'external-link': "external-link";
|
|
490
|
+
readonly 'more-vert': "ellipsis-vertical";
|
|
491
|
+
readonly 'more-horiz': "ellipsis";
|
|
492
|
+
readonly add: "plus";
|
|
493
|
+
readonly remove: "minus";
|
|
494
|
+
readonly delete: "trash-2";
|
|
495
|
+
readonly edit: "pencil";
|
|
496
|
+
readonly save: "save";
|
|
497
|
+
readonly copy: "copy";
|
|
498
|
+
readonly paste: "clipboard-paste";
|
|
499
|
+
readonly attach: "paperclip";
|
|
500
|
+
readonly upload: "upload";
|
|
501
|
+
readonly download: "download";
|
|
502
|
+
readonly share: "share-2";
|
|
503
|
+
readonly bookmark: "bookmark";
|
|
504
|
+
readonly favorite: "heart";
|
|
505
|
+
readonly star: "star";
|
|
506
|
+
readonly login: "log-in";
|
|
507
|
+
readonly logout: "log-out";
|
|
508
|
+
readonly email: "mail";
|
|
509
|
+
readonly phone: "phone";
|
|
510
|
+
readonly location: "map-pin";
|
|
511
|
+
readonly globe: "globe";
|
|
512
|
+
readonly link: "link";
|
|
513
|
+
readonly clock: "clock";
|
|
514
|
+
readonly calendar: "calendar";
|
|
515
|
+
readonly schedule: "calendar-days";
|
|
516
|
+
readonly person: "user";
|
|
517
|
+
readonly group: "users";
|
|
518
|
+
readonly file: "file";
|
|
519
|
+
readonly 'file-add': "file-plus";
|
|
520
|
+
readonly folder: "folder";
|
|
521
|
+
readonly 'folder-open': "folder-open";
|
|
522
|
+
readonly 'folder-add': "folder-plus";
|
|
523
|
+
readonly image: "image";
|
|
524
|
+
readonly export: "file-output";
|
|
525
|
+
readonly import: "file-input";
|
|
526
|
+
readonly backup: "hard-drive-upload";
|
|
527
|
+
readonly compress: "minimize-2";
|
|
528
|
+
readonly check: "check-circle";
|
|
529
|
+
readonly error: "circle-alert";
|
|
530
|
+
readonly warning: "triangle-alert";
|
|
531
|
+
readonly info: "info";
|
|
532
|
+
readonly help: "circle-help";
|
|
533
|
+
readonly cart: "shopping-cart";
|
|
534
|
+
readonly tag: "tag";
|
|
535
|
+
readonly 'credit-card': "credit-card";
|
|
536
|
+
readonly receipt: "receipt";
|
|
537
|
+
readonly leaf: "leaf";
|
|
538
|
+
readonly tree: "tree-pine";
|
|
539
|
+
readonly seedling: "sprout";
|
|
540
|
+
readonly trowel: "shovel";
|
|
541
|
+
readonly droplet: "droplet";
|
|
542
|
+
readonly snowflake: "snowflake";
|
|
543
|
+
readonly sun: "sun";
|
|
544
|
+
readonly cloud: "cloud";
|
|
545
|
+
readonly grid: "layout-grid";
|
|
546
|
+
readonly list: "list";
|
|
547
|
+
readonly filter: "filter";
|
|
548
|
+
readonly sort: "arrow-up-down";
|
|
549
|
+
readonly fullscreen: "maximize";
|
|
550
|
+
readonly collapse: "minimize";
|
|
551
|
+
readonly building: "building-2";
|
|
552
|
+
readonly video: "video";
|
|
553
|
+
readonly lock: "lock";
|
|
554
|
+
readonly unlock: "lock-open";
|
|
555
|
+
readonly eye: "eye";
|
|
556
|
+
readonly 'eye-off': "eye-off";
|
|
557
|
+
readonly print: "printer";
|
|
558
|
+
readonly code: "code";
|
|
559
|
+
readonly palette: "palette";
|
|
560
|
+
readonly lightbulb: "lightbulb";
|
|
561
|
+
};
|
|
562
|
+
};
|
|
563
|
+
type IconSet = keyof typeof iconMap;
|
|
564
|
+
type SemanticIcon = keyof (typeof iconMap)['fa7'];
|
|
565
|
+
type BrandIcon = keyof (typeof iconMap)['simple-icons'];
|
|
566
|
+
/**
|
|
567
|
+
* Resolve a semantic icon name to a fully-qualified astro-icon string.
|
|
568
|
+
* Names containing ':' are returned as-is (pass-through for fully-qualified names).
|
|
569
|
+
*
|
|
570
|
+
* @param name - Semantic name ('email') or fully-qualified ('fa7-solid:envelope')
|
|
571
|
+
* @param prefix - astro-icon prefix, e.g. 'fa7-solid', 'material-symbols', 'lucide'
|
|
572
|
+
*/
|
|
573
|
+
declare function resolveIcon(name: string, prefix: string): string;
|
|
574
|
+
/**
|
|
575
|
+
* Resolve a brand icon name to a fully-qualified astro-icon string.
|
|
576
|
+
* Names containing ':' are returned as-is (pass-through).
|
|
577
|
+
*
|
|
578
|
+
* @param name - Semantic brand name ('facebook') or fully-qualified ('simple-icons:facebook')
|
|
579
|
+
* @param prefix - astro-icon prefix, e.g. 'simple-icons', 'fa7-brands'
|
|
580
|
+
*/
|
|
581
|
+
declare function resolveBrandIcon(name: string, prefix: string): string;
|
|
582
|
+
/**
|
|
583
|
+
* Generate the astro-icon `include` map from configured icon sets.
|
|
584
|
+
*
|
|
585
|
+
* Resolves two kinds of entries from the `icons` section of `site.config.yaml`:
|
|
586
|
+
* - Per-set lists (e.g. `'fa7-solid': ['bars', 'plus']`) are passed through as-is.
|
|
587
|
+
* - `semantic` names are looked up in the configured `ui` and `brand` prefix maps,
|
|
588
|
+
* and the resolved icon names are merged into those sets' lists.
|
|
589
|
+
*
|
|
590
|
+
* Only explicitly configured icons are included — there is no fallback to all icons.
|
|
591
|
+
*
|
|
592
|
+
* @param iconsConfig - Icons config from site.config.yaml (icons section)
|
|
593
|
+
* @returns Record<string, string[]> for astro-icon's `include` option
|
|
594
|
+
*/
|
|
595
|
+
declare function generateIconInclude(iconsConfig?: {
|
|
596
|
+
ui?: string;
|
|
597
|
+
brand?: string;
|
|
598
|
+
semantic?: string[];
|
|
599
|
+
[prefix: string]: string | string[] | undefined;
|
|
600
|
+
}): Record<string, string[]>;
|
|
601
|
+
//#endregion
|
|
602
|
+
export { type ArticleAuthor, type ArticleGraphOptions, type Attrs, type BrandIcon, type BreadcrumbGraphOptions, type BreadcrumbItem, type ChildNode, type ContentNode, type El, type Elmnt, type FAQGraphOptions, type FAQItem, type FaviconLink, type FaviconOptions, type FaviconTagOptions, type IconSet, type ImageLink, type ImageRef, type Link, type Localizable, type OrganizationGraphOptions, type SemanticIcon, type StyleList, type StyleValue, type TextLink, type WebManifestOptions, articleGraph, breadcrumbGraph, faqGraph, faviconLinks, faviconManifest, generateFavicons, generateIconInclude, getAttribute, iconMap, isElmnt, isImageLink, isLink, isTextLink, nodesToHtml, organizationGraph, parseRenderedSlots, partAttrs, prefixToMapKey, resolveBrandIcon, resolveIcon, serialize, styleList, t, toHtml, writeFaviconManifest };
|
|
206
603
|
//# sourceMappingURL=index.d.mts.map
|
package/dist/index.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.mts","names":[],"sources":["../src/content.ts","../src/html.ts","../src/schema/article.ts","../src/schema/breadcrumb.ts","../src/schema/faq.ts","../src/schema/organization.ts"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.d.mts","names":[],"sources":["../src/content.ts","../src/html.ts","../src/schema/article.ts","../src/schema/breadcrumb.ts","../src/schema/faq.ts","../src/schema/organization.ts","../src/icons.ts"],"mappings":"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"}
|
package/dist/index.mjs
CHANGED
|
@@ -297,5 +297,442 @@ function organizationGraph(options) {
|
|
|
297
297
|
}
|
|
298
298
|
|
|
299
299
|
//#endregion
|
|
300
|
-
|
|
300
|
+
//#region src/icons.ts
|
|
301
|
+
/**
|
|
302
|
+
* Semantic icon name mapping across icon sets.
|
|
303
|
+
*
|
|
304
|
+
* Keys are functional/semantic names (what the icon means).
|
|
305
|
+
* Values are the actual icon names in each set.
|
|
306
|
+
*
|
|
307
|
+
* Usage:
|
|
308
|
+
* import { icon } from '../utils/icon-resolver';
|
|
309
|
+
* <Icon name={icon('save')} /> // resolves via configured UI set
|
|
310
|
+
* <Icon name={icon('facebook')} /> // resolves via configured brand set
|
|
311
|
+
*/
|
|
312
|
+
/**
|
|
313
|
+
* Maps astro-icon prefixes to iconMap lookup keys.
|
|
314
|
+
* FA7 variants (fa7-solid, fa7-regular, etc.) all share the same icon names
|
|
315
|
+
* and map to the 'fa7' key. Other sets map to themselves.
|
|
316
|
+
*/
|
|
317
|
+
const prefixToMapKey = {
|
|
318
|
+
"fa7-solid": "fa7",
|
|
319
|
+
"fa7-regular": "fa7",
|
|
320
|
+
"fa7-light": "fa7",
|
|
321
|
+
"fa7-thin": "fa7",
|
|
322
|
+
"fa7-brands": "fa7-brands",
|
|
323
|
+
"simple-icons": "simple-icons",
|
|
324
|
+
"material-symbols": "material-symbols",
|
|
325
|
+
lucide: "lucide"
|
|
326
|
+
};
|
|
327
|
+
const iconMap = {
|
|
328
|
+
fa7: {
|
|
329
|
+
menu: "bars",
|
|
330
|
+
close: "xmark",
|
|
331
|
+
home: "home",
|
|
332
|
+
settings: "gear",
|
|
333
|
+
search: "magnifying-glass",
|
|
334
|
+
"expand-more": "chevron-down",
|
|
335
|
+
"expand-less": "chevron-up",
|
|
336
|
+
"chevron-right": "chevron-right",
|
|
337
|
+
"chevron-left": "chevron-left",
|
|
338
|
+
"arrow-back": "arrow-left",
|
|
339
|
+
"arrow-forward": "arrow-right",
|
|
340
|
+
"external-link": "arrow-up-right-from-square",
|
|
341
|
+
"more-vert": "ellipsis-vertical",
|
|
342
|
+
"more-horiz": "ellipsis",
|
|
343
|
+
add: "plus",
|
|
344
|
+
remove: "minus",
|
|
345
|
+
delete: "trash",
|
|
346
|
+
edit: "pen",
|
|
347
|
+
save: "floppy-disk",
|
|
348
|
+
copy: "copy",
|
|
349
|
+
paste: "paste",
|
|
350
|
+
attach: "paperclip",
|
|
351
|
+
upload: "upload",
|
|
352
|
+
download: "download",
|
|
353
|
+
share: "share",
|
|
354
|
+
bookmark: "bookmark",
|
|
355
|
+
favorite: "heart",
|
|
356
|
+
star: "star",
|
|
357
|
+
login: "login",
|
|
358
|
+
logout: "logout",
|
|
359
|
+
email: "envelope",
|
|
360
|
+
phone: "phone",
|
|
361
|
+
location: "location-dot",
|
|
362
|
+
globe: "globe",
|
|
363
|
+
link: "link",
|
|
364
|
+
clock: "clock",
|
|
365
|
+
calendar: "calendar",
|
|
366
|
+
schedule: "calendar-days",
|
|
367
|
+
person: "user",
|
|
368
|
+
group: "users",
|
|
369
|
+
file: "file",
|
|
370
|
+
"file-add": "file-circle-plus",
|
|
371
|
+
folder: "folder",
|
|
372
|
+
"folder-open": "folder-open",
|
|
373
|
+
"folder-add": "folder-plus",
|
|
374
|
+
image: "image",
|
|
375
|
+
export: "file-export",
|
|
376
|
+
import: "file-import",
|
|
377
|
+
backup: "backup",
|
|
378
|
+
compress: "compress",
|
|
379
|
+
check: "check",
|
|
380
|
+
error: "circle-exclamation",
|
|
381
|
+
warning: "triangle-exclamation",
|
|
382
|
+
info: "circle-info",
|
|
383
|
+
help: "circle-question",
|
|
384
|
+
cart: "cart-shopping",
|
|
385
|
+
tag: "tag",
|
|
386
|
+
"credit-card": "credit-card",
|
|
387
|
+
receipt: "receipt",
|
|
388
|
+
leaf: "leaf",
|
|
389
|
+
tree: "tree",
|
|
390
|
+
seedling: "seedling",
|
|
391
|
+
trowel: "trowel",
|
|
392
|
+
droplet: "droplet",
|
|
393
|
+
snowflake: "snowflake",
|
|
394
|
+
sun: "sun",
|
|
395
|
+
cloud: "cloud",
|
|
396
|
+
grid: "table-cells",
|
|
397
|
+
list: "list",
|
|
398
|
+
filter: "filter",
|
|
399
|
+
sort: "sort",
|
|
400
|
+
fullscreen: "expand",
|
|
401
|
+
collapse: "compress",
|
|
402
|
+
building: "building",
|
|
403
|
+
video: "video",
|
|
404
|
+
lock: "lock",
|
|
405
|
+
unlock: "lock-open",
|
|
406
|
+
eye: "eye",
|
|
407
|
+
"eye-off": "eye-slash",
|
|
408
|
+
print: "print",
|
|
409
|
+
code: "code",
|
|
410
|
+
palette: "palette",
|
|
411
|
+
lightbulb: "lightbulb"
|
|
412
|
+
},
|
|
413
|
+
"fa7-brands": {
|
|
414
|
+
facebook: "facebook",
|
|
415
|
+
instagram: "instagram",
|
|
416
|
+
x: "x-twitter",
|
|
417
|
+
bluesky: "bluesky",
|
|
418
|
+
threads: "threads",
|
|
419
|
+
mastodon: "mastodon",
|
|
420
|
+
linkedin: "linkedin",
|
|
421
|
+
youtube: "youtube",
|
|
422
|
+
tiktok: "tiktok",
|
|
423
|
+
pinterest: "pinterest-p",
|
|
424
|
+
reddit: "reddit",
|
|
425
|
+
snapchat: "snapchat",
|
|
426
|
+
github: "github",
|
|
427
|
+
whatsapp: "whatsapp",
|
|
428
|
+
telegram: "telegram",
|
|
429
|
+
discord: "discord",
|
|
430
|
+
stripe: "stripe",
|
|
431
|
+
paypal: "paypal",
|
|
432
|
+
visa: "cc-visa",
|
|
433
|
+
mastercard: "cc-mastercard",
|
|
434
|
+
amex: "cc-amex",
|
|
435
|
+
discover: "cc-discover",
|
|
436
|
+
"apple-pay": "apple-pay",
|
|
437
|
+
"google-pay": "google-pay",
|
|
438
|
+
"amazon-pay": "amazon-pay",
|
|
439
|
+
yelp: "yelp",
|
|
440
|
+
google: "google",
|
|
441
|
+
apple: "apple",
|
|
442
|
+
microsoft: "microsoft",
|
|
443
|
+
amazon: "amazon",
|
|
444
|
+
shopify: "shopify",
|
|
445
|
+
wordpress: "wordpress",
|
|
446
|
+
cloudflare: "cloudflare"
|
|
447
|
+
},
|
|
448
|
+
"simple-icons": {
|
|
449
|
+
facebook: "facebook",
|
|
450
|
+
instagram: "instagram",
|
|
451
|
+
x: "x",
|
|
452
|
+
bluesky: "bluesky",
|
|
453
|
+
threads: "threads",
|
|
454
|
+
mastodon: "mastodon",
|
|
455
|
+
linkedin: "linkedin",
|
|
456
|
+
youtube: "youtube",
|
|
457
|
+
tiktok: "tiktok",
|
|
458
|
+
pinterest: "pinterest",
|
|
459
|
+
reddit: "reddit",
|
|
460
|
+
snapchat: "snapchat",
|
|
461
|
+
github: "github",
|
|
462
|
+
whatsapp: "whatsapp",
|
|
463
|
+
telegram: "telegram",
|
|
464
|
+
discord: "discord",
|
|
465
|
+
stripe: "stripe",
|
|
466
|
+
paypal: "paypal",
|
|
467
|
+
visa: "visa",
|
|
468
|
+
mastercard: "mastercard",
|
|
469
|
+
amex: "americanexpress",
|
|
470
|
+
discover: "discover",
|
|
471
|
+
"apple-pay": "applepay",
|
|
472
|
+
"google-pay": "googlepay",
|
|
473
|
+
"amazon-pay": "amazonpay",
|
|
474
|
+
klarna: "klarna",
|
|
475
|
+
afterpay: "afterpay",
|
|
476
|
+
square: "square",
|
|
477
|
+
cashapp: "cashapp",
|
|
478
|
+
interac: "interac",
|
|
479
|
+
yelp: "yelp",
|
|
480
|
+
google: "google",
|
|
481
|
+
tripadvisor: "tripadvisor",
|
|
482
|
+
trustpilot: "trustpilot",
|
|
483
|
+
"google-maps": "googlemaps",
|
|
484
|
+
homeadvisor: "homeadvisor",
|
|
485
|
+
houzz: "houzz",
|
|
486
|
+
nextdoor: "nextdoor",
|
|
487
|
+
bbb: "bbb",
|
|
488
|
+
apple: "apple",
|
|
489
|
+
microsoft: "microsoft",
|
|
490
|
+
amazon: "amazon",
|
|
491
|
+
shopify: "shopify",
|
|
492
|
+
wordpress: "wordpress",
|
|
493
|
+
cloudflare: "cloudflare",
|
|
494
|
+
waze: "waze"
|
|
495
|
+
},
|
|
496
|
+
"material-symbols": {
|
|
497
|
+
menu: "menu",
|
|
498
|
+
close: "close",
|
|
499
|
+
home: "home",
|
|
500
|
+
settings: "settings",
|
|
501
|
+
search: "search",
|
|
502
|
+
"expand-more": "expand-more",
|
|
503
|
+
"expand-less": "expand-less",
|
|
504
|
+
"chevron-right": "chevron-right",
|
|
505
|
+
"chevron-left": "chevron-left",
|
|
506
|
+
"arrow-back": "arrow-back",
|
|
507
|
+
"arrow-forward": "arrow-forward",
|
|
508
|
+
"external-link": "open-in-new",
|
|
509
|
+
"more-vert": "more-vert",
|
|
510
|
+
"more-horiz": "more-horiz",
|
|
511
|
+
add: "add",
|
|
512
|
+
remove: "remove",
|
|
513
|
+
delete: "delete",
|
|
514
|
+
edit: "edit",
|
|
515
|
+
save: "save",
|
|
516
|
+
copy: "content-copy",
|
|
517
|
+
paste: "content-paste",
|
|
518
|
+
attach: "attach-file",
|
|
519
|
+
upload: "upload",
|
|
520
|
+
download: "download",
|
|
521
|
+
share: "share",
|
|
522
|
+
bookmark: "bookmark",
|
|
523
|
+
favorite: "favorite",
|
|
524
|
+
star: "star",
|
|
525
|
+
login: "login",
|
|
526
|
+
logout: "logout",
|
|
527
|
+
email: "mail",
|
|
528
|
+
phone: "call",
|
|
529
|
+
location: "location-on",
|
|
530
|
+
globe: "language",
|
|
531
|
+
link: "link",
|
|
532
|
+
clock: "schedule",
|
|
533
|
+
calendar: "calendar-today",
|
|
534
|
+
schedule: "calendar-month",
|
|
535
|
+
person: "person",
|
|
536
|
+
group: "group",
|
|
537
|
+
file: "description",
|
|
538
|
+
"file-add": "note-add",
|
|
539
|
+
folder: "folder",
|
|
540
|
+
"folder-open": "folder-open",
|
|
541
|
+
"folder-add": "create-new-folder",
|
|
542
|
+
image: "image",
|
|
543
|
+
export: "upload-file",
|
|
544
|
+
import: "download",
|
|
545
|
+
backup: "backup",
|
|
546
|
+
compress: "compress",
|
|
547
|
+
check: "check-circle",
|
|
548
|
+
error: "error",
|
|
549
|
+
warning: "warning",
|
|
550
|
+
info: "info",
|
|
551
|
+
help: "help",
|
|
552
|
+
cart: "shopping-cart",
|
|
553
|
+
tag: "sell",
|
|
554
|
+
"credit-card": "credit-card",
|
|
555
|
+
receipt: "receipt-long",
|
|
556
|
+
leaf: "eco",
|
|
557
|
+
tree: "forest",
|
|
558
|
+
seedling: "potted-plant",
|
|
559
|
+
trowel: "construction",
|
|
560
|
+
droplet: "water-drop",
|
|
561
|
+
snowflake: "ac-unit",
|
|
562
|
+
sun: "light-mode",
|
|
563
|
+
cloud: "cloud",
|
|
564
|
+
grid: "grid-view",
|
|
565
|
+
list: "list",
|
|
566
|
+
filter: "filter-list",
|
|
567
|
+
sort: "sort",
|
|
568
|
+
fullscreen: "fullscreen",
|
|
569
|
+
collapse: "fullscreen-exit",
|
|
570
|
+
building: "domain",
|
|
571
|
+
video: "videocam",
|
|
572
|
+
lock: "lock",
|
|
573
|
+
unlock: "lock-open",
|
|
574
|
+
eye: "visibility",
|
|
575
|
+
"eye-off": "visibility-off",
|
|
576
|
+
print: "print",
|
|
577
|
+
code: "code",
|
|
578
|
+
palette: "palette",
|
|
579
|
+
lightbulb: "lightbulb"
|
|
580
|
+
},
|
|
581
|
+
lucide: {
|
|
582
|
+
menu: "menu",
|
|
583
|
+
close: "x",
|
|
584
|
+
home: "house",
|
|
585
|
+
settings: "settings",
|
|
586
|
+
search: "search",
|
|
587
|
+
"expand-more": "chevron-down",
|
|
588
|
+
"expand-less": "chevron-up",
|
|
589
|
+
"chevron-right": "chevron-right",
|
|
590
|
+
"chevron-left": "chevron-left",
|
|
591
|
+
"arrow-back": "arrow-left",
|
|
592
|
+
"arrow-forward": "arrow-right",
|
|
593
|
+
"external-link": "external-link",
|
|
594
|
+
"more-vert": "ellipsis-vertical",
|
|
595
|
+
"more-horiz": "ellipsis",
|
|
596
|
+
add: "plus",
|
|
597
|
+
remove: "minus",
|
|
598
|
+
delete: "trash-2",
|
|
599
|
+
edit: "pencil",
|
|
600
|
+
save: "save",
|
|
601
|
+
copy: "copy",
|
|
602
|
+
paste: "clipboard-paste",
|
|
603
|
+
attach: "paperclip",
|
|
604
|
+
upload: "upload",
|
|
605
|
+
download: "download",
|
|
606
|
+
share: "share-2",
|
|
607
|
+
bookmark: "bookmark",
|
|
608
|
+
favorite: "heart",
|
|
609
|
+
star: "star",
|
|
610
|
+
login: "log-in",
|
|
611
|
+
logout: "log-out",
|
|
612
|
+
email: "mail",
|
|
613
|
+
phone: "phone",
|
|
614
|
+
location: "map-pin",
|
|
615
|
+
globe: "globe",
|
|
616
|
+
link: "link",
|
|
617
|
+
clock: "clock",
|
|
618
|
+
calendar: "calendar",
|
|
619
|
+
schedule: "calendar-days",
|
|
620
|
+
person: "user",
|
|
621
|
+
group: "users",
|
|
622
|
+
file: "file",
|
|
623
|
+
"file-add": "file-plus",
|
|
624
|
+
folder: "folder",
|
|
625
|
+
"folder-open": "folder-open",
|
|
626
|
+
"folder-add": "folder-plus",
|
|
627
|
+
image: "image",
|
|
628
|
+
export: "file-output",
|
|
629
|
+
import: "file-input",
|
|
630
|
+
backup: "hard-drive-upload",
|
|
631
|
+
compress: "minimize-2",
|
|
632
|
+
check: "check-circle",
|
|
633
|
+
error: "circle-alert",
|
|
634
|
+
warning: "triangle-alert",
|
|
635
|
+
info: "info",
|
|
636
|
+
help: "circle-help",
|
|
637
|
+
cart: "shopping-cart",
|
|
638
|
+
tag: "tag",
|
|
639
|
+
"credit-card": "credit-card",
|
|
640
|
+
receipt: "receipt",
|
|
641
|
+
leaf: "leaf",
|
|
642
|
+
tree: "tree-pine",
|
|
643
|
+
seedling: "sprout",
|
|
644
|
+
trowel: "shovel",
|
|
645
|
+
droplet: "droplet",
|
|
646
|
+
snowflake: "snowflake",
|
|
647
|
+
sun: "sun",
|
|
648
|
+
cloud: "cloud",
|
|
649
|
+
grid: "layout-grid",
|
|
650
|
+
list: "list",
|
|
651
|
+
filter: "filter",
|
|
652
|
+
sort: "arrow-up-down",
|
|
653
|
+
fullscreen: "maximize",
|
|
654
|
+
collapse: "minimize",
|
|
655
|
+
building: "building-2",
|
|
656
|
+
video: "video",
|
|
657
|
+
lock: "lock",
|
|
658
|
+
unlock: "lock-open",
|
|
659
|
+
eye: "eye",
|
|
660
|
+
"eye-off": "eye-off",
|
|
661
|
+
print: "printer",
|
|
662
|
+
code: "code",
|
|
663
|
+
palette: "palette",
|
|
664
|
+
lightbulb: "lightbulb"
|
|
665
|
+
}
|
|
666
|
+
};
|
|
667
|
+
/**
|
|
668
|
+
* Resolve a semantic icon name to a fully-qualified astro-icon string.
|
|
669
|
+
* Names containing ':' are returned as-is (pass-through for fully-qualified names).
|
|
670
|
+
*
|
|
671
|
+
* @param name - Semantic name ('email') or fully-qualified ('fa7-solid:envelope')
|
|
672
|
+
* @param prefix - astro-icon prefix, e.g. 'fa7-solid', 'material-symbols', 'lucide'
|
|
673
|
+
*/
|
|
674
|
+
function resolveIcon(name, prefix) {
|
|
675
|
+
if (name.includes(":")) return name;
|
|
676
|
+
const mapKey = prefixToMapKey[prefix];
|
|
677
|
+
if (!mapKey) throw new Error(`Unknown icon prefix "${prefix}". Valid: ${Object.keys(prefixToMapKey).join(", ")}`);
|
|
678
|
+
const resolved = iconMap[mapKey][name];
|
|
679
|
+
if (!resolved) throw new Error(`Icon "${name}" not found in set "${prefix}" (map key: "${mapKey}")`);
|
|
680
|
+
return `${prefix}:${resolved}`;
|
|
681
|
+
}
|
|
682
|
+
/**
|
|
683
|
+
* Resolve a brand icon name to a fully-qualified astro-icon string.
|
|
684
|
+
* Names containing ':' are returned as-is (pass-through).
|
|
685
|
+
*
|
|
686
|
+
* @param name - Semantic brand name ('facebook') or fully-qualified ('simple-icons:facebook')
|
|
687
|
+
* @param prefix - astro-icon prefix, e.g. 'simple-icons', 'fa7-brands'
|
|
688
|
+
*/
|
|
689
|
+
function resolveBrandIcon(name, prefix) {
|
|
690
|
+
if (name.includes(":")) return name;
|
|
691
|
+
const mapKey = prefixToMapKey[prefix];
|
|
692
|
+
if (!mapKey) throw new Error(`Unknown brand icon prefix "${prefix}"`);
|
|
693
|
+
const resolved = iconMap[mapKey][name];
|
|
694
|
+
if (!resolved) throw new Error(`Brand icon "${name}" not found in set "${prefix}" (map key: "${mapKey}")`);
|
|
695
|
+
return `${prefix}:${resolved}`;
|
|
696
|
+
}
|
|
697
|
+
/**
|
|
698
|
+
* Generate the astro-icon `include` map from configured icon sets.
|
|
699
|
+
*
|
|
700
|
+
* Resolves two kinds of entries from the `icons` section of `site.config.yaml`:
|
|
701
|
+
* - Per-set lists (e.g. `'fa7-solid': ['bars', 'plus']`) are passed through as-is.
|
|
702
|
+
* - `semantic` names are looked up in the configured `ui` and `brand` prefix maps,
|
|
703
|
+
* and the resolved icon names are merged into those sets' lists.
|
|
704
|
+
*
|
|
705
|
+
* Only explicitly configured icons are included — there is no fallback to all icons.
|
|
706
|
+
*
|
|
707
|
+
* @param iconsConfig - Icons config from site.config.yaml (icons section)
|
|
708
|
+
* @returns Record<string, string[]> for astro-icon's `include` option
|
|
709
|
+
*/
|
|
710
|
+
function generateIconInclude(iconsConfig) {
|
|
711
|
+
const uiPrefix = iconsConfig?.ui ?? "fa7-solid";
|
|
712
|
+
const brandPrefix = iconsConfig?.brand ?? "simple-icons";
|
|
713
|
+
const include = {};
|
|
714
|
+
const addToInclude = (prefix, names) => {
|
|
715
|
+
include[prefix] = [...new Set([...include[prefix] ?? [], ...names])];
|
|
716
|
+
};
|
|
717
|
+
for (const [key, val] of Object.entries(iconsConfig ?? {})) if (key !== "ui" && key !== "brand" && key !== "semantic" && Array.isArray(val)) addToInclude(key, val);
|
|
718
|
+
const uiMapKey = prefixToMapKey[uiPrefix];
|
|
719
|
+
const brandMapKey = prefixToMapKey[brandPrefix];
|
|
720
|
+
const unknownPrefix = [];
|
|
721
|
+
if (!uiMapKey) unknownPrefix.push(`ui: '${uiPrefix}'`);
|
|
722
|
+
if (!brandMapKey) unknownPrefix.push(`brand: '${brandPrefix}'`);
|
|
723
|
+
if (unknownPrefix.length) throw new Error(`[vitops icons] Unknown icon set ${unknownPrefix.join(" and ")}. Known sets: ${Object.keys(prefixToMapKey).join(", ")}.`);
|
|
724
|
+
const unresolved = [];
|
|
725
|
+
for (const name of iconsConfig?.semantic ?? []) {
|
|
726
|
+
const ui = iconMap[uiMapKey][name];
|
|
727
|
+
const brand = iconMap[brandMapKey][name];
|
|
728
|
+
if (ui) addToInclude(uiPrefix, [ui]);
|
|
729
|
+
if (brand) addToInclude(brandPrefix, [brand]);
|
|
730
|
+
if (!ui && !brand) unresolved.push(name);
|
|
731
|
+
}
|
|
732
|
+
if (unresolved.length) throw new Error(`[vitops icons] ${unresolved.length} semantic icon name(s) not found in ui set '${uiPrefix}' or brand set '${brandPrefix}': ${unresolved.join(", ")}.\nEither add them to iconMap in @getvitops/core, or drop them from the \`semantic\` list. Available in '${uiPrefix}': ${Object.keys(iconMap[uiMapKey]).slice(0, 12).join(", ")}…`);
|
|
733
|
+
return include;
|
|
734
|
+
}
|
|
735
|
+
|
|
736
|
+
//#endregion
|
|
737
|
+
export { articleGraph, breadcrumbGraph, faqGraph, faviconLinks, faviconManifest, generateFavicons, generateIconInclude, getAttribute, iconMap, isElmnt, isImageLink, isLink, isTextLink, nodesToHtml, organizationGraph, parseRenderedSlots, partAttrs, prefixToMapKey, resolveBrandIcon, resolveIcon, serialize, styleList, t, toHtml, writeFaviconManifest };
|
|
301
738
|
//# sourceMappingURL=index.mjs.map
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":["s"],"sources":["../src/content.ts","../src/html.ts","../src/schema/article.ts","../src/schema/breadcrumb.ts","../src/schema/faq.ts","../src/schema/organization.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, '"')}\"`);\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, '&').replace(/</g, '<').replace(/>/g, '>');\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","export interface ArticleAuthor {\n name: string;\n url?: string;\n}\n\nexport interface ArticleGraphOptions {\n headline: string;\n description?: string;\n image?: string | string[];\n datePublished: string;\n dateModified?: string;\n author: ArticleAuthor | ArticleAuthor[];\n publisher?: {\n name: string;\n logo?: string;\n };\n mainEntityOfPage?: string;\n articleSection?: string;\n wordCount?: number;\n keywords?: string[];\n}\n\n/** Build a schema.org Article JSON-LD graph. */\nexport function articleGraph(options: ArticleGraphOptions): Record<string, unknown> {\n const {\n headline,\n description,\n image,\n datePublished,\n dateModified,\n author,\n publisher,\n mainEntityOfPage,\n articleSection,\n wordCount,\n keywords,\n } = options;\n\n const authors = Array.isArray(author) ? author : [author];\n\n return {\n '@context': 'https://schema.org',\n '@type': 'Article',\n headline,\n ...(description && { description }),\n ...(image && { image: Array.isArray(image) ? image : [image] }),\n datePublished,\n ...(dateModified && { dateModified }),\n author: authors.map((a) => ({\n '@type': 'Person',\n name: a.name,\n ...(a.url && { url: a.url }),\n })),\n ...(publisher && {\n publisher: {\n '@type': 'Organization',\n name: publisher.name,\n ...(publisher.logo && { logo: { '@type': 'ImageObject', url: publisher.logo } }),\n },\n }),\n ...(mainEntityOfPage && { mainEntityOfPage: { '@type': 'WebPage', '@id': mainEntityOfPage } }),\n ...(articleSection && { articleSection }),\n ...(wordCount && { wordCount }),\n ...(keywords && { keywords: keywords.join(', ') }),\n };\n}\n","export interface BreadcrumbItem {\n name: string;\n url: string;\n}\n\nexport interface BreadcrumbGraphOptions {\n items: BreadcrumbItem[];\n}\n\n/** Build a schema.org BreadcrumbList JSON-LD graph. */\nexport function breadcrumbGraph(options: BreadcrumbGraphOptions): Record<string, unknown> {\n return {\n '@context': 'https://schema.org',\n '@type': 'BreadcrumbList',\n itemListElement: options.items.map((item, index) => ({\n '@type': 'ListItem',\n position: index + 1,\n name: item.name,\n item: item.url,\n })),\n };\n}\n","export interface FAQItem {\n question: string;\n answer: string;\n}\n\nexport interface FAQGraphOptions {\n items: FAQItem[];\n}\n\n/**\n * Build a schema.org FAQPage JSON-LD graph.\n *\n * NOTE: Google recommends FAQ markup only for authoritative government\n * and health sites. For other sites, consider using QAPage schema instead.\n */\nexport function faqGraph(options: FAQGraphOptions): Record<string, unknown> {\n return {\n '@context': 'https://schema.org',\n '@type': 'FAQPage',\n mainEntity: options.items.map((item) => ({\n '@type': 'Question',\n name: item.question,\n acceptedAnswer: {\n '@type': 'Answer',\n text: item.answer,\n },\n })),\n };\n}\n","export interface OrganizationGraphOptions {\n name: string;\n url?: string;\n logo?: string;\n description?: string;\n email?: string;\n telephone?: string;\n address?: {\n streetAddress?: string;\n addressLocality?: string;\n addressRegion?: string;\n postalCode?: string;\n addressCountry?: string;\n };\n sameAs?: string[];\n foundingDate?: string;\n founders?: string[];\n numberOfEmployees?: number | { minValue: number; maxValue: number };\n parentOrganization?: {\n name: string;\n url?: string;\n };\n subOrganization?: {\n name: string;\n url?: string;\n }[];\n contactPoint?: {\n type?: 'customer service' | 'technical support' | 'sales' | 'billing support' | 'reservations';\n telephone: string;\n email?: string;\n contactType: string;\n availableLanguage?: string[];\n areaServed?: string[];\n }[];\n areaServed?: string[];\n brand?: string;\n award?: string[];\n memberOf?: {\n name: string;\n url?: string;\n }[];\n}\n\n/** Build a schema.org Organization JSON-LD graph. */\nexport function organizationGraph(options: OrganizationGraphOptions): Record<string, unknown> {\n const {\n name,\n url,\n logo,\n description,\n email,\n telephone,\n address,\n sameAs,\n foundingDate,\n founders,\n numberOfEmployees,\n parentOrganization,\n subOrganization,\n contactPoint,\n areaServed,\n brand,\n award,\n memberOf,\n } = options;\n\n return {\n '@context': 'https://schema.org',\n '@type': 'Organization',\n name,\n ...(url && { url }),\n ...(logo && { logo }),\n ...(description && { description }),\n ...(email && { email }),\n ...(telephone && { telephone }),\n ...(address && {\n address: {\n '@type': 'PostalAddress',\n ...(address.streetAddress && { streetAddress: address.streetAddress }),\n ...(address.addressLocality && { addressLocality: address.addressLocality }),\n ...(address.addressRegion && { addressRegion: address.addressRegion }),\n ...(address.postalCode && { postalCode: address.postalCode }),\n ...(address.addressCountry && { addressCountry: address.addressCountry }),\n },\n }),\n ...(sameAs && { sameAs }),\n ...(foundingDate && { foundingDate }),\n ...(founders && {\n founders: founders.map((f) => ({\n '@type': 'Person',\n name: f,\n })),\n }),\n ...(numberOfEmployees && {\n numberOfEmployees:\n typeof numberOfEmployees === 'number'\n ? { '@type': 'QuantitativeValue', value: numberOfEmployees }\n : {\n '@type': 'QuantitativeValue',\n minValue: numberOfEmployees.minValue,\n maxValue: numberOfEmployees.maxValue,\n },\n }),\n ...(parentOrganization && {\n parentOrganization: {\n '@type': 'Organization',\n name: parentOrganization.name,\n ...(parentOrganization.url && { url: parentOrganization.url }),\n },\n }),\n ...(subOrganization && {\n subOrganization: subOrganization.map((sub) => ({\n '@type': 'Organization',\n name: sub.name,\n ...(sub.url && { url: sub.url }),\n })),\n }),\n ...(contactPoint && {\n contactPoint: contactPoint.map((cp) => ({\n '@type': 'ContactPoint',\n telephone: cp.telephone,\n contactType: cp.contactType,\n ...(cp.email && { email: cp.email }),\n ...(cp.availableLanguage && { availableLanguage: cp.availableLanguage }),\n ...(cp.areaServed && { areaServed: cp.areaServed }),\n })),\n }),\n ...(areaServed && { areaServed }),\n ...(brand && { brand: { '@type': 'Brand', name: brand } }),\n ...(award && { award }),\n ...(memberOf && {\n memberOf: memberOf.map((m) => ({\n '@type': 'Organization',\n name: m.name,\n ...(m.url && { url: m.url }),\n })),\n }),\n };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","names":["s"],"sources":["../src/content.ts","../src/html.ts","../src/schema/article.ts","../src/schema/breadcrumb.ts","../src/schema/faq.ts","../src/schema/organization.ts","../src/icons.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, '"')}\"`);\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, '&').replace(/</g, '<').replace(/>/g, '>');\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","export interface ArticleAuthor {\n name: string;\n url?: string;\n}\n\nexport interface ArticleGraphOptions {\n headline: string;\n description?: string;\n image?: string | string[];\n datePublished: string;\n dateModified?: string;\n author: ArticleAuthor | ArticleAuthor[];\n publisher?: {\n name: string;\n logo?: string;\n };\n mainEntityOfPage?: string;\n articleSection?: string;\n wordCount?: number;\n keywords?: string[];\n}\n\n/** Build a schema.org Article JSON-LD graph. */\nexport function articleGraph(options: ArticleGraphOptions): Record<string, unknown> {\n const {\n headline,\n description,\n image,\n datePublished,\n dateModified,\n author,\n publisher,\n mainEntityOfPage,\n articleSection,\n wordCount,\n keywords,\n } = options;\n\n const authors = Array.isArray(author) ? author : [author];\n\n return {\n '@context': 'https://schema.org',\n '@type': 'Article',\n headline,\n ...(description && { description }),\n ...(image && { image: Array.isArray(image) ? image : [image] }),\n datePublished,\n ...(dateModified && { dateModified }),\n author: authors.map((a) => ({\n '@type': 'Person',\n name: a.name,\n ...(a.url && { url: a.url }),\n })),\n ...(publisher && {\n publisher: {\n '@type': 'Organization',\n name: publisher.name,\n ...(publisher.logo && { logo: { '@type': 'ImageObject', url: publisher.logo } }),\n },\n }),\n ...(mainEntityOfPage && { mainEntityOfPage: { '@type': 'WebPage', '@id': mainEntityOfPage } }),\n ...(articleSection && { articleSection }),\n ...(wordCount && { wordCount }),\n ...(keywords && { keywords: keywords.join(', ') }),\n };\n}\n","export interface BreadcrumbItem {\n name: string;\n url: string;\n}\n\nexport interface BreadcrumbGraphOptions {\n items: BreadcrumbItem[];\n}\n\n/** Build a schema.org BreadcrumbList JSON-LD graph. */\nexport function breadcrumbGraph(options: BreadcrumbGraphOptions): Record<string, unknown> {\n return {\n '@context': 'https://schema.org',\n '@type': 'BreadcrumbList',\n itemListElement: options.items.map((item, index) => ({\n '@type': 'ListItem',\n position: index + 1,\n name: item.name,\n item: item.url,\n })),\n };\n}\n","export interface FAQItem {\n question: string;\n answer: string;\n}\n\nexport interface FAQGraphOptions {\n items: FAQItem[];\n}\n\n/**\n * Build a schema.org FAQPage JSON-LD graph.\n *\n * NOTE: Google recommends FAQ markup only for authoritative government\n * and health sites. For other sites, consider using QAPage schema instead.\n */\nexport function faqGraph(options: FAQGraphOptions): Record<string, unknown> {\n return {\n '@context': 'https://schema.org',\n '@type': 'FAQPage',\n mainEntity: options.items.map((item) => ({\n '@type': 'Question',\n name: item.question,\n acceptedAnswer: {\n '@type': 'Answer',\n text: item.answer,\n },\n })),\n };\n}\n","export interface OrganizationGraphOptions {\n name: string;\n url?: string;\n logo?: string;\n description?: string;\n email?: string;\n telephone?: string;\n address?: {\n streetAddress?: string;\n addressLocality?: string;\n addressRegion?: string;\n postalCode?: string;\n addressCountry?: string;\n };\n sameAs?: string[];\n foundingDate?: string;\n founders?: string[];\n numberOfEmployees?: number | { minValue: number; maxValue: number };\n parentOrganization?: {\n name: string;\n url?: string;\n };\n subOrganization?: {\n name: string;\n url?: string;\n }[];\n contactPoint?: {\n type?: 'customer service' | 'technical support' | 'sales' | 'billing support' | 'reservations';\n telephone: string;\n email?: string;\n contactType: string;\n availableLanguage?: string[];\n areaServed?: string[];\n }[];\n areaServed?: string[];\n brand?: string;\n award?: string[];\n memberOf?: {\n name: string;\n url?: string;\n }[];\n}\n\n/** Build a schema.org Organization JSON-LD graph. */\nexport function organizationGraph(options: OrganizationGraphOptions): Record<string, unknown> {\n const {\n name,\n url,\n logo,\n description,\n email,\n telephone,\n address,\n sameAs,\n foundingDate,\n founders,\n numberOfEmployees,\n parentOrganization,\n subOrganization,\n contactPoint,\n areaServed,\n brand,\n award,\n memberOf,\n } = options;\n\n return {\n '@context': 'https://schema.org',\n '@type': 'Organization',\n name,\n ...(url && { url }),\n ...(logo && { logo }),\n ...(description && { description }),\n ...(email && { email }),\n ...(telephone && { telephone }),\n ...(address && {\n address: {\n '@type': 'PostalAddress',\n ...(address.streetAddress && { streetAddress: address.streetAddress }),\n ...(address.addressLocality && { addressLocality: address.addressLocality }),\n ...(address.addressRegion && { addressRegion: address.addressRegion }),\n ...(address.postalCode && { postalCode: address.postalCode }),\n ...(address.addressCountry && { addressCountry: address.addressCountry }),\n },\n }),\n ...(sameAs && { sameAs }),\n ...(foundingDate && { foundingDate }),\n ...(founders && {\n founders: founders.map((f) => ({\n '@type': 'Person',\n name: f,\n })),\n }),\n ...(numberOfEmployees && {\n numberOfEmployees:\n typeof numberOfEmployees === 'number'\n ? { '@type': 'QuantitativeValue', value: numberOfEmployees }\n : {\n '@type': 'QuantitativeValue',\n minValue: numberOfEmployees.minValue,\n maxValue: numberOfEmployees.maxValue,\n },\n }),\n ...(parentOrganization && {\n parentOrganization: {\n '@type': 'Organization',\n name: parentOrganization.name,\n ...(parentOrganization.url && { url: parentOrganization.url }),\n },\n }),\n ...(subOrganization && {\n subOrganization: subOrganization.map((sub) => ({\n '@type': 'Organization',\n name: sub.name,\n ...(sub.url && { url: sub.url }),\n })),\n }),\n ...(contactPoint && {\n contactPoint: contactPoint.map((cp) => ({\n '@type': 'ContactPoint',\n telephone: cp.telephone,\n contactType: cp.contactType,\n ...(cp.email && { email: cp.email }),\n ...(cp.availableLanguage && { availableLanguage: cp.availableLanguage }),\n ...(cp.areaServed && { areaServed: cp.areaServed }),\n })),\n }),\n ...(areaServed && { areaServed }),\n ...(brand && { brand: { '@type': 'Brand', name: brand } }),\n ...(award && { award }),\n ...(memberOf && {\n memberOf: memberOf.map((m) => ({\n '@type': 'Organization',\n name: m.name,\n ...(m.url && { url: m.url }),\n })),\n }),\n };\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 * Usage:\n * import { icon } from '../utils/icon-resolver';\n * <Icon name={icon('save')} /> // resolves via configured UI set\n * <Icon name={icon('facebook')} /> // resolves via configured brand 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};\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 'expand-more': 'chevron-down',\n 'expand-less': 'chevron-up',\n 'chevron-right': 'chevron-right',\n 'chevron-left': 'chevron-left',\n 'arrow-back': 'arrow-left',\n 'arrow-forward': 'arrow-right',\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 login: 'login',\n logout: 'logout',\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: 'backup',\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 },\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 'expand-more': 'expand-more',\n 'expand-less': 'expand-less',\n 'chevron-right': 'chevron-right',\n 'chevron-left': 'chevron-left',\n 'arrow-back': 'arrow-back',\n 'arrow-forward': 'arrow-forward',\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 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 },\n lucide: {\n // Navigation / UI\n menu: 'menu',\n close: 'x',\n home: 'house',\n settings: 'settings',\n search: 'search',\n 'expand-more': 'chevron-down',\n 'expand-less': 'chevron-up',\n 'chevron-right': 'chevron-right',\n 'chevron-left': 'chevron-left',\n 'arrow-back': 'arrow-left',\n 'arrow-forward': 'arrow-right',\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 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 },\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'\n */\nexport function resolveIcon(name: string, prefix: 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}:${resolved}`;\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 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 (key !== 'ui' && key !== 'brand' && key !== 'semantic' && Array.isArray(val)) {\n addToInclude(key, val as string[]);\n }\n }\n\n // Resolve semantic names through ui and brand prefix maps.\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 if (ui) addToInclude(uiPrefix, [ui]);\n if (brand) addToInclude(brandPrefix, [brand]);\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"],"mappings":"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"}
|