@robosophy/ui-vue 1.0.15 → 1.0.16
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/dist/icon-manifest.json +28 -3
- package/dist/index.css +12 -29
- package/dist/vite.d.ts +1 -0
- package/dist/vite.d.ts.map +1 -1
- package/dist/vite.js +26 -39
- package/dist/vite.js.map +1 -1
- package/package.json +1 -1
package/dist/icon-manifest.json
CHANGED
|
@@ -1,16 +1,41 @@
|
|
|
1
1
|
{
|
|
2
2
|
"outlined": [
|
|
3
|
+
"alarm",
|
|
3
4
|
"arrow_drop_down",
|
|
4
5
|
"arrow_drop_up",
|
|
5
6
|
"arrow_left",
|
|
7
|
+
"block",
|
|
8
|
+
"check_circle",
|
|
6
9
|
"chevron_right",
|
|
7
10
|
"close",
|
|
11
|
+
"contract",
|
|
12
|
+
"error",
|
|
13
|
+
"favorite",
|
|
14
|
+
"help",
|
|
15
|
+
"home",
|
|
8
16
|
"icon",
|
|
17
|
+
"info",
|
|
18
|
+
"inventory",
|
|
9
19
|
"login",
|
|
10
|
-
"
|
|
20
|
+
"logout",
|
|
21
|
+
"manage_accounts",
|
|
22
|
+
"nest_eco_leaf",
|
|
23
|
+
"notifications",
|
|
24
|
+
"package_2",
|
|
25
|
+
"sell",
|
|
26
|
+
"settings",
|
|
27
|
+
"subtitles_gear",
|
|
28
|
+
"swap_vert",
|
|
29
|
+
"table_chart_view",
|
|
30
|
+
"upload",
|
|
31
|
+
"visibility_off",
|
|
32
|
+
"warning"
|
|
11
33
|
],
|
|
12
34
|
"rounded": [
|
|
13
|
-
"arrow_drop_down"
|
|
35
|
+
"arrow_drop_down",
|
|
36
|
+
"settings"
|
|
14
37
|
],
|
|
15
|
-
"sharp": [
|
|
38
|
+
"sharp": [
|
|
39
|
+
"settings"
|
|
40
|
+
]
|
|
16
41
|
}
|
package/dist/index.css
CHANGED
|
@@ -436,7 +436,8 @@
|
|
|
436
436
|
gap: 32px;
|
|
437
437
|
height: 100%;
|
|
438
438
|
overflow: hidden;
|
|
439
|
-
transition: width
|
|
439
|
+
transition: width 220ms cubic-bezier(0.4, 0, 0.2, 1);
|
|
440
|
+
will-change: width;
|
|
440
441
|
width: var(--rs-sidebar-width-collapsed);
|
|
441
442
|
}
|
|
442
443
|
.rs-sidebar--pc {
|
|
@@ -483,13 +484,14 @@
|
|
|
483
484
|
display: flex;
|
|
484
485
|
color: var(--rs-sidebar-active);
|
|
485
486
|
flex: 1;
|
|
486
|
-
gap:
|
|
487
|
+
gap: 6px;
|
|
487
488
|
min-width: 0;
|
|
488
|
-
|
|
489
|
+
padding-left: 24px;
|
|
490
|
+
transition: padding-left 220ms cubic-bezier(0.4, 0, 0.2, 1);
|
|
489
491
|
}
|
|
490
492
|
.rs-sidebar--expanded .rs-sidebar__brand,
|
|
491
493
|
.rs-sidebar--mobile-open .rs-sidebar__brand {
|
|
492
|
-
|
|
494
|
+
padding-left: 0;
|
|
493
495
|
}
|
|
494
496
|
.rs-sidebar__module-trigger {
|
|
495
497
|
align-items: center;
|
|
@@ -500,19 +502,14 @@
|
|
|
500
502
|
display: inline-flex;
|
|
501
503
|
justify-content: flex-start;
|
|
502
504
|
font: inherit;
|
|
503
|
-
gap:
|
|
505
|
+
gap: 6px;
|
|
504
506
|
min-width: 0;
|
|
505
507
|
appearance: none;
|
|
506
508
|
-webkit-appearance: none;
|
|
507
509
|
padding: 0;
|
|
508
510
|
text-align: left;
|
|
509
|
-
transition: gap 180ms ease-in-out;
|
|
510
511
|
width: 100%;
|
|
511
512
|
}
|
|
512
|
-
.rs-sidebar--expanded .rs-sidebar__module-trigger,
|
|
513
|
-
.rs-sidebar--mobile-open .rs-sidebar__module-trigger {
|
|
514
|
-
gap: 6px;
|
|
515
|
-
}
|
|
516
513
|
.rs-sidebar__module-trigger:hover:not(:disabled),
|
|
517
514
|
.rs-sidebar__module-trigger:active:not(:disabled) {
|
|
518
515
|
background: transparent;
|
|
@@ -527,19 +524,9 @@
|
|
|
527
524
|
margin-left: auto;
|
|
528
525
|
}
|
|
529
526
|
.rs-sidebar__module-trigger > .rs-icon:first-child {
|
|
530
|
-
margin-left: 24px;
|
|
531
|
-
transition: margin-left 180ms ease-in-out;
|
|
532
|
-
}
|
|
533
|
-
.rs-sidebar--expanded .rs-sidebar__module-trigger > .rs-icon:first-child,
|
|
534
|
-
.rs-sidebar--mobile-open .rs-sidebar__module-trigger > .rs-icon:first-child {
|
|
535
527
|
margin-left: 0;
|
|
536
528
|
}
|
|
537
529
|
.rs-sidebar__brand > .rs-icon:first-child {
|
|
538
|
-
margin-left: 24px;
|
|
539
|
-
transition: margin-left 180ms ease-in-out;
|
|
540
|
-
}
|
|
541
|
-
.rs-sidebar--expanded .rs-sidebar__brand > .rs-icon:first-child,
|
|
542
|
-
.rs-sidebar--mobile-open .rs-sidebar__brand > .rs-icon:first-child {
|
|
543
530
|
margin-left: 0;
|
|
544
531
|
}
|
|
545
532
|
.rs-sidebar__title,
|
|
@@ -550,8 +537,8 @@
|
|
|
550
537
|
opacity: 0;
|
|
551
538
|
overflow: hidden;
|
|
552
539
|
transition:
|
|
553
|
-
max-width
|
|
554
|
-
opacity
|
|
540
|
+
max-width 220ms cubic-bezier(0.4, 0, 0.2, 1),
|
|
541
|
+
opacity 220ms cubic-bezier(0.4, 0, 0.2, 1);
|
|
555
542
|
white-space: nowrap;
|
|
556
543
|
}
|
|
557
544
|
.rs-sidebar--expanded .rs-sidebar__title,
|
|
@@ -676,8 +663,9 @@
|
|
|
676
663
|
-webkit-appearance: none;
|
|
677
664
|
min-height: 27px;
|
|
678
665
|
padding: 7px 0;
|
|
666
|
+
padding-left: 24px;
|
|
679
667
|
text-align: left;
|
|
680
|
-
transition:
|
|
668
|
+
transition: padding-left 220ms cubic-bezier(0.4, 0, 0.2, 1);
|
|
681
669
|
width: 100%;
|
|
682
670
|
}
|
|
683
671
|
.rs-sidebar--expanded .rs-sidebar__item,
|
|
@@ -717,15 +705,10 @@
|
|
|
717
705
|
.rs-sidebar__item-icon {
|
|
718
706
|
flex: 0 0 auto;
|
|
719
707
|
color: var(--rs-sidebar-active);
|
|
720
|
-
margin-left:
|
|
721
|
-
transition: margin-left 180ms ease-in-out;
|
|
708
|
+
margin-left: 0;
|
|
722
709
|
width: 24px;
|
|
723
710
|
height: 24px;
|
|
724
711
|
}
|
|
725
|
-
.rs-sidebar--expanded .rs-sidebar__item-icon,
|
|
726
|
-
.rs-sidebar--mobile-open .rs-sidebar__item-icon {
|
|
727
|
-
margin-left: 16px;
|
|
728
|
-
}
|
|
729
712
|
.rs-sidebar__brand .rs-icon {
|
|
730
713
|
width: 24px;
|
|
731
714
|
height: 24px;
|
package/dist/vite.d.ts
CHANGED
|
@@ -8,6 +8,7 @@ export type RsIconFontDisplay = "block" | "swap" | "fallback" | "optional";
|
|
|
8
8
|
export type RobosophyMaterialSymbolsOptions = {
|
|
9
9
|
outputDir?: string;
|
|
10
10
|
fontDisplay?: RsIconFontDisplay;
|
|
11
|
+
fontVariant?: string;
|
|
11
12
|
include?: IconInput[];
|
|
12
13
|
preload?: boolean;
|
|
13
14
|
roots?: string[];
|
package/dist/vite.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vite.d.ts","sourceRoot":"","sources":["../src/vite.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,iBAAiB,EAA4B,MAAM,EAAE,cAAc,EAAE,MAAM,MAAM,CAAC;AAEhG,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAExD,KAAK,SAAS,GAAG,MAAM,GAAG;IAAE,MAAM,CAAC,EAAE,YAAY,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAClE,MAAM,MAAM,iBAAiB,GAAG,OAAO,GAAG,MAAM,GAAG,UAAU,GAAG,UAAU,CAAC;AAE3E,MAAM,MAAM,+BAA+B,GAAG;IAC5C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,iBAAiB,CAAC;IAChC,OAAO,CAAC,EAAE,SAAS,EAAE,CAAC;IACtB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB,CAAC;AAEF,KAAK,YAAY,GAAG,GAAG,CAAC,YAAY,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;AACnD,KAAK,yBAAyB,GAAG;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,IAAI,CAAC,kBAAkB,EAAE,MAAM,CAAC,EAAE,CAAC;CAC3C,CAAC;
|
|
1
|
+
{"version":3,"file":"vite.d.ts","sourceRoot":"","sources":["../src/vite.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,iBAAiB,EAA4B,MAAM,EAAE,cAAc,EAAE,MAAM,MAAM,CAAC;AAEhG,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAExD,KAAK,SAAS,GAAG,MAAM,GAAG;IAAE,MAAM,CAAC,EAAE,YAAY,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAClE,MAAM,MAAM,iBAAiB,GAAG,OAAO,GAAG,MAAM,GAAG,UAAU,GAAG,UAAU,CAAC;AAE3E,MAAM,MAAM,+BAA+B,GAAG;IAC5C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,iBAAiB,CAAC;IAChC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,SAAS,EAAE,CAAC;IACtB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB,CAAC;AAEF,KAAK,YAAY,GAAG,GAAG,CAAC,YAAY,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;AACnD,KAAK,yBAAyB,GAAG;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,IAAI,CAAC,kBAAkB,EAAE,MAAM,CAAC,EAAE,CAAC;CAC3C,CAAC;AAiCF,wBAAgB,wBAAwB,CACtC,OAAO,GAAE,+BAAoC,GAC5C,MAAM,CAsFR;AAED,KAAK,kBAAkB,GAAG;IACxB,MAAM,EAAE,YAAY,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAmDF,wBAAsB,2BAA2B,CAC/C,MAAM,EAAE,IAAI,CAAC,cAAc,EAAE,MAAM,CAAC,EACpC,OAAO,GAAE,+BAAoC,yBAsC9C;AAED,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,YAAY,EACpB,KAAK,EAAE,IAAI,CAAC,kBAAkB,EAAE,QAAQ,GAAG,UAAU,CAAC,EAAE,EACxD,OAAO,UAAQ,EACf,WAAW,GAAE,iBAAsC,UAuCpD;AAED,wBAAgB,4BAA4B,CAC1C,MAAM,EAAE,yBAAyB,EACjC,OAAO,GAAE,IAAI,CAAC,+BAA+B,EAAE,SAAS,CAAM,GAC7D,iBAAiB,EAAE,CA6BrB;AAED,wBAAgB,8BAA8B,CAC5C,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,yBAAyB,EACjC,OAAO,GAAE,IAAI,CAAC,+BAA+B,EAAE,SAAS,CAAM,UAS/D;AAmOD,wBAAgB,6BAA6B,CAAC,MAAM,EAAE,YAAY,UAIjE"}
|
package/dist/vite.js
CHANGED
|
@@ -27,23 +27,19 @@ const familyPackages = {
|
|
|
27
27
|
rounded: "@fontsource-variable/material-symbols-rounded",
|
|
28
28
|
sharp: "@fontsource-variable/material-symbols-sharp"
|
|
29
29
|
};
|
|
30
|
-
const familyFontVariants = {
|
|
31
|
-
outlined: "wght",
|
|
32
|
-
rounded: "wght",
|
|
33
|
-
sharp: "wght"
|
|
34
|
-
};
|
|
35
30
|
const defaultFontDisplay = "swap";
|
|
36
31
|
const defaultPreload = false;
|
|
37
32
|
const require$1 = createRequire(import.meta.url);
|
|
38
33
|
function robosophyMaterialSymbols(options = {}) {
|
|
39
34
|
const raw = (options.outputDir ?? "").trim().replace(/^\/+/, "");
|
|
40
35
|
const outputDir = raw.split("/").filter((part) => part && part !== "..").join("/") || "assets";
|
|
36
|
+
const fontVariant = options.fontVariant ?? "full";
|
|
41
37
|
let config;
|
|
42
38
|
let cachedAssets = null;
|
|
43
39
|
let cacheValid = false;
|
|
44
40
|
async function getAssets() {
|
|
45
41
|
if (cacheValid && cachedAssets) return cachedAssets;
|
|
46
|
-
cachedAssets = await ensureGeneratedAssets(config, options, outputDir);
|
|
42
|
+
cachedAssets = await ensureGeneratedAssets(config, options, outputDir, fontVariant);
|
|
47
43
|
cacheValid = true;
|
|
48
44
|
return cachedAssets;
|
|
49
45
|
}
|
|
@@ -108,10 +104,28 @@ function robosophyMaterialSymbols(options = {}) {
|
|
|
108
104
|
}
|
|
109
105
|
};
|
|
110
106
|
}
|
|
111
|
-
async function ensureGeneratedAssets(config, options, outputDir) {
|
|
107
|
+
async function ensureGeneratedAssets(config, options, outputDir, fontVariant) {
|
|
112
108
|
const usages = await collectMaterialSymbolUsages(config, options);
|
|
113
109
|
const devMode = config.command === "serve";
|
|
114
|
-
const fonts = await generateFontAssets(usages, devMode, config.base, outputDir);
|
|
110
|
+
const fonts = await generateFontAssets(usages, devMode, config.base, outputDir, fontVariant);
|
|
111
|
+
if (config.command === "serve" || config.command === "build") {
|
|
112
|
+
const summary = formatDetectedMaterialSymbols(usages);
|
|
113
|
+
const totalIcons = [...usages.values()].reduce((sum, s) => sum + s.size, 0);
|
|
114
|
+
if (totalIcons > 0) {
|
|
115
|
+
config.logger.info(
|
|
116
|
+
`[robosophy-material-symbols] ${totalIcons} icons detected (variant: ${fontVariant})
|
|
117
|
+
${summary}`
|
|
118
|
+
);
|
|
119
|
+
for (const font of fonts) {
|
|
120
|
+
const kb = (font.source.length / 1024).toFixed(1);
|
|
121
|
+
config.logger.info(` ${font.family} subset: ${kb} KB (${font.fileName})`);
|
|
122
|
+
}
|
|
123
|
+
} else {
|
|
124
|
+
config.logger.warn(
|
|
125
|
+
"[robosophy-material-symbols] No Material Symbols icons detected in source. Add them via the include option."
|
|
126
|
+
);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
115
129
|
const css = buildMaterialSymbolsCss(
|
|
116
130
|
usages,
|
|
117
131
|
fonts,
|
|
@@ -169,33 +183,6 @@ function buildMaterialSymbolsCss(usages, fonts, devMode = false, fontDisplay = d
|
|
|
169
183
|
);
|
|
170
184
|
}
|
|
171
185
|
lines.push(
|
|
172
|
-
".rs-icon {",
|
|
173
|
-
" --rs-icon-color: currentColor;",
|
|
174
|
-
" --rs-icon-fill: 0;",
|
|
175
|
-
" --rs-icon-grade: 0;",
|
|
176
|
-
" --rs-icon-optical-size: 24;",
|
|
177
|
-
" --rs-icon-size: 24px;",
|
|
178
|
-
" --rs-icon-weight: 400;",
|
|
179
|
-
" align-items: center;",
|
|
180
|
-
" color: var(--rs-icon-color);",
|
|
181
|
-
" display: inline-flex;",
|
|
182
|
-
" flex: 0 0 auto;",
|
|
183
|
-
` font-family: "${familyFontNames.outlined}";`,
|
|
184
|
-
" font-size: var(--rs-icon-size);",
|
|
185
|
-
" font-style: normal;",
|
|
186
|
-
' font-feature-settings: "liga";',
|
|
187
|
-
' -webkit-font-feature-settings: "liga";',
|
|
188
|
-
' font-variation-settings: "FILL" var(--rs-icon-fill), "wght" var(--rs-icon-weight), "GRAD" var(--rs-icon-grade), "opsz" var(--rs-icon-optical-size);',
|
|
189
|
-
" font-weight: 400;",
|
|
190
|
-
" justify-content: center;",
|
|
191
|
-
" direction: ltr;",
|
|
192
|
-
" letter-spacing: normal;",
|
|
193
|
-
" line-height: 1;",
|
|
194
|
-
" text-transform: none;",
|
|
195
|
-
" user-select: none;",
|
|
196
|
-
" white-space: nowrap;",
|
|
197
|
-
" word-wrap: normal;",
|
|
198
|
-
"}",
|
|
199
186
|
`.rs-icon--rounded { font-family: "${familyFontNames.rounded}"; }`,
|
|
200
187
|
`.rs-icon--sharp { font-family: "${familyFontNames.sharp}"; }`,
|
|
201
188
|
".rs-icon--prime::before { content: var(--rs-icon-content); }"
|
|
@@ -244,7 +231,7 @@ function injectMaterialSymbolsHtmlLinks(html, assets, options = {}) {
|
|
|
244
231
|
return links.length === 0 ? html : html.replace("</head>", `${links.map((link) => ` ${link}`).join("\n")}
|
|
245
232
|
</head>`);
|
|
246
233
|
}
|
|
247
|
-
async function generateFontAssets(usages, devMode, base, outputDir) {
|
|
234
|
+
async function generateFontAssets(usages, devMode, base, outputDir, fontVariant) {
|
|
248
235
|
const subsetFont = (await import("subset-font")).default;
|
|
249
236
|
const fonts = [];
|
|
250
237
|
for (const family of families) {
|
|
@@ -252,7 +239,7 @@ async function generateFontAssets(usages, devMode, base, outputDir) {
|
|
|
252
239
|
if (names.length === 0) {
|
|
253
240
|
continue;
|
|
254
241
|
}
|
|
255
|
-
const sourcePath = resolveFontPath(family);
|
|
242
|
+
const sourcePath = resolveFontPath(family, fontVariant);
|
|
256
243
|
const source = await readFile(sourcePath);
|
|
257
244
|
const subset = await subsetFont(source, names.join(" "), {
|
|
258
245
|
targetFormat: "woff2"
|
|
@@ -268,9 +255,9 @@ async function generateFontAssets(usages, devMode, base, outputDir) {
|
|
|
268
255
|
}
|
|
269
256
|
return fonts;
|
|
270
257
|
}
|
|
271
|
-
function resolveFontPath(family) {
|
|
258
|
+
function resolveFontPath(family, variant) {
|
|
272
259
|
return require$1.resolve(
|
|
273
|
-
`${familyPackages[family]}/files/material-symbols-${family}-latin-${
|
|
260
|
+
`${familyPackages[family]}/files/material-symbols-${family}-latin-${variant}-normal.woff2`
|
|
274
261
|
);
|
|
275
262
|
}
|
|
276
263
|
function fontHref(fileName, devMode, base, outputDir) {
|
package/dist/vite.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vite.js","sources":["../src/vite.ts"],"sourcesContent":["import { createHash } from \"node:crypto\";\nimport { readdir, readFile } from \"node:fs/promises\";\nimport { extname, join, sep } from \"node:path\";\nimport { createRequire } from \"node:module\";\nimport { fileURLToPath } from \"node:url\";\nimport type { HtmlTagDescriptor, IndexHtmlTransformResult, Plugin, ResolvedConfig } from \"vite\";\n\nimport type { RsIconFamily } from \"./components/RsIcon\";\n\ntype IconInput = string | { family?: RsIconFamily; name: string };\nexport type RsIconFontDisplay = \"block\" | \"swap\" | \"fallback\" | \"optional\";\n\nexport type RobosophyMaterialSymbolsOptions = {\n outputDir?: string;\n fontDisplay?: RsIconFontDisplay;\n include?: IconInput[];\n preload?: boolean;\n roots?: string[];\n scan?: boolean;\n};\n\ntype IconUsageMap = Map<RsIconFamily, Set<string>>;\ntype MaterialSymbolsLinkAssets = {\n cssHref: string;\n fonts: Pick<GeneratedFontAsset, \"href\">[];\n};\n\nconst families = [\"outlined\", \"rounded\", \"sharp\"] as const satisfies readonly RsIconFamily[];\nconst defaultFamily: RsIconFamily = \"outlined\";\nconst iconNamePattern = /^[a-z0-9_]+$/;\nconst sourceExtensions = new Set([\".js\", \".jsx\", \".mjs\", \".ts\", \".tsx\", \".vue\"]);\nconst skippedDirs = new Set([\".git\", \"dist\", \"node_modules\", \"storybook-static\"]);\nconst internalIconNames = [\n \"arrow_drop_down\",\n \"arrow_drop_up\",\n \"arrow_left\",\n \"chevron_right\",\n \"close\",\n \"login\",\n \"nest_eco_leaf\",\n];\n\nconst familyFontNames: Record<RsIconFamily, string> = {\n outlined: \"Material Symbols Outlined Variable\",\n rounded: \"Material Symbols Rounded Variable\",\n sharp: \"Material Symbols Sharp Variable\",\n};\n\nconst familyPackages: Record<RsIconFamily, string> = {\n outlined: \"@fontsource-variable/material-symbols-outlined\",\n rounded: \"@fontsource-variable/material-symbols-rounded\",\n sharp: \"@fontsource-variable/material-symbols-sharp\",\n};\n\nconst familyFontVariants: Record<RsIconFamily, string> = {\n outlined: \"wght\",\n rounded: \"wght\",\n sharp: \"wght\",\n};\n\nconst defaultFontDisplay: RsIconFontDisplay = \"swap\";\nconst defaultPreload = false;\nconst require = createRequire(import.meta.url);\n\nexport function robosophyMaterialSymbols(\n options: RobosophyMaterialSymbolsOptions = {},\n): Plugin {\n const raw = (options.outputDir ?? \"\").trim().replace(/^\\/+/, \"\");\n const outputDir = raw\n .split(\"/\")\n .filter((part) => part && part !== \"..\")\n .join(\"/\") || \"assets\";\n let config: ResolvedConfig;\n let cachedAssets: GeneratedMaterialSymbolsAssets | null = null;\n let cacheValid = false;\n\n async function getAssets() {\n if (cacheValid && cachedAssets) return cachedAssets;\n cachedAssets = await ensureGeneratedAssets(config, options, outputDir);\n cacheValid = true;\n return cachedAssets;\n }\n\n return {\n name: \"robosophy-material-symbols\",\n async configResolved(resolvedConfig) {\n config = resolvedConfig;\n },\n async transformIndexHtml(): Promise<IndexHtmlTransformResult> {\n const assets = await getAssets();\n\n return buildMaterialSymbolsHtmlTags(assets, options);\n },\n configureServer(server) {\n server.watcher.on(\"all\", (_event, file) => {\n if (sourceExtensions.has(extname(file))) {\n cacheValid = false;\n }\n });\n server.middlewares.use(async (request, response, next) => {\n if (!request.url?.startsWith(\"/@robosophy-material-symbols/\")) {\n next();\n return;\n }\n\n try {\n const assets = await getAssets();\n const fileName = decodeURIComponent(\n request.url.replace(\"/@robosophy-material-symbols/\", \"\").split(\"?\")[0] ?? \"\",\n );\n\n if (fileName === \"rs-material-symbols.css\") {\n response.setHeader(\"Content-Type\", \"text/css; charset=utf-8\");\n response.end(assets.css);\n return;\n }\n\n const font = assets.fonts.find((asset) => asset.fileName === fileName);\n\n if (font) {\n response.setHeader(\"Content-Type\", \"font/woff2\");\n response.end(font.source);\n return;\n }\n\n next();\n } catch (error) {\n next(error);\n }\n });\n },\n async generateBundle(_outputOptions, bundle) {\n const assets = await getAssets();\n\n for (const font of assets.fonts) {\n this.emitFile({\n fileName: `${outputDir}/${font.fileName}`,\n name: font.fileName,\n source: font.source,\n type: \"asset\",\n });\n }\n\n this.emitFile({\n fileName: `${outputDir}/rs-material-symbols.css`,\n name: \"rs-material-symbols.css\",\n source: assets.css,\n type: \"asset\",\n });\n },\n };\n}\n\ntype GeneratedFontAsset = {\n family: RsIconFamily;\n fileName: string;\n href: string;\n source: Buffer;\n};\n\ntype GeneratedMaterialSymbolsAssets = {\n css: string;\n cssHref: string;\n fonts: GeneratedFontAsset[];\n};\n\nasync function ensureGeneratedAssets(\n config: ResolvedConfig,\n options: RobosophyMaterialSymbolsOptions,\n outputDir: string,\n) {\n const usages = await collectMaterialSymbolUsages(config, options);\n const devMode = config.command === \"serve\";\n const fonts = await generateFontAssets(usages, devMode, config.base, outputDir);\n const css = buildMaterialSymbolsCss(\n usages,\n fonts,\n devMode,\n options.fontDisplay ?? defaultFontDisplay,\n );\n\n return {\n css,\n cssHref: devMode\n ? \"/@robosophy-material-symbols/rs-material-symbols.css\"\n : withBase(config.base, `${outputDir}/rs-material-symbols.css`),\n fonts,\n };\n}\n\nexport async function collectMaterialSymbolUsages(\n config: Pick<ResolvedConfig, \"root\">,\n options: RobosophyMaterialSymbolsOptions = {},\n) {\n const usages = createUsageMap();\n\n // Register icons used by compiled library components.\n // Prefer the auto-generated manifest; fall back to hardcoded list for older library builds.\n const manifest = await loadIconManifest();\n\n if (manifest) {\n for (const family of families) {\n for (const name of manifest[family] ?? []) {\n addUsage(usages, { family, name });\n }\n }\n } else {\n for (const name of internalIconNames) {\n for (const family of families) {\n addUsage(usages, { family, name });\n }\n }\n }\n\n for (const icon of options.include ?? []) {\n addUsage(usages, typeof icon === \"string\" ? { family: defaultFamily, name: icon } : icon);\n }\n\n if (options.scan !== false) {\n const roots = options.roots ?? [join(config.root, \"src\")];\n\n for (const root of roots) {\n for (const filePath of await listSourceFiles(root)) {\n const source = await readFile(filePath, \"utf8\");\n collectFromSource(source, usages);\n }\n }\n }\n\n return usages;\n}\n\nexport function buildMaterialSymbolsCss(\n usages: IconUsageMap,\n fonts: Pick<GeneratedFontAsset, \"family\" | \"fileName\">[],\n devMode = false,\n fontDisplay: RsIconFontDisplay = defaultFontDisplay,\n) {\n const lines: string[] = [];\n\n for (const font of fonts) {\n const fontUrl = devMode\n ? `/@robosophy-material-symbols/${font.fileName}`\n : `./${font.fileName}`;\n\n lines.push(\n \"@font-face {\",\n ` font-family: \"${familyFontNames[font.family]}\";`,\n ` font-display: ${fontDisplay};`,\n \" font-style: normal;\",\n \" font-weight: 100 700;\",\n ` src: url(\"${fontUrl}\") format(\"woff2-variations\");`,\n \"}\",\n );\n }\n\n lines.push(\n \".rs-icon {\",\n \" --rs-icon-color: currentColor;\",\n \" --rs-icon-fill: 0;\",\n \" --rs-icon-grade: 0;\",\n \" --rs-icon-optical-size: 24;\",\n \" --rs-icon-size: 24px;\",\n \" --rs-icon-weight: 400;\",\n \" align-items: center;\",\n \" color: var(--rs-icon-color);\",\n \" display: inline-flex;\",\n \" flex: 0 0 auto;\",\n ` font-family: \"${familyFontNames.outlined}\";`,\n \" font-size: var(--rs-icon-size);\",\n \" font-style: normal;\",\n ' font-feature-settings: \"liga\";',\n ' -webkit-font-feature-settings: \"liga\";',\n ' font-variation-settings: \"FILL\" var(--rs-icon-fill), \"wght\" var(--rs-icon-weight), \"GRAD\" var(--rs-icon-grade), \"opsz\" var(--rs-icon-optical-size);',\n \" font-weight: 400;\",\n \" justify-content: center;\",\n \" direction: ltr;\",\n \" letter-spacing: normal;\",\n \" line-height: 1;\",\n \" text-transform: none;\",\n \" user-select: none;\",\n \" white-space: nowrap;\",\n \" word-wrap: normal;\",\n \"}\",\n `.rs-icon--rounded { font-family: \"${familyFontNames.rounded}\"; }`,\n `.rs-icon--sharp { font-family: \"${familyFontNames.sharp}\"; }`,\n \".rs-icon--prime::before { content: var(--rs-icon-content); }\",\n );\n\n const names = new Set<string>();\n\n for (const family of families) {\n for (const name of usages.get(family) ?? []) {\n names.add(name);\n }\n }\n\n for (const name of [...names].sort()) {\n lines.push(`.rs-icon-${name} { --rs-icon-content: \"${name}\"; }`);\n }\n\n return `${lines.join(\"\\n\")}\\n`;\n}\n\nexport function buildMaterialSymbolsHtmlTags(\n assets: MaterialSymbolsLinkAssets,\n options: Pick<RobosophyMaterialSymbolsOptions, \"preload\"> = {},\n): HtmlTagDescriptor[] {\n const tags: HtmlTagDescriptor[] = [];\n\n if (options.preload ?? defaultPreload) {\n for (const font of assets.fonts) {\n tags.push({\n attrs: {\n as: \"font\",\n crossorigin: \"\",\n href: font.href,\n rel: \"preload\",\n type: \"font/woff2\",\n },\n tag: \"link\",\n injectTo: \"head\",\n });\n }\n }\n\n tags.push({\n attrs: {\n href: assets.cssHref,\n rel: \"stylesheet\",\n },\n tag: \"link\",\n injectTo: \"head\",\n });\n\n return tags;\n}\n\nexport function injectMaterialSymbolsHtmlLinks(\n html: string,\n assets: MaterialSymbolsLinkAssets,\n options: Pick<RobosophyMaterialSymbolsOptions, \"preload\"> = {},\n) {\n const links = buildMaterialSymbolsHtmlTags(assets, options)\n .map(formatHtmlLinkTag)\n .filter((link) => !html.includes(`href=\"${getLinkHref(link)}\"`));\n\n return links.length === 0\n ? html\n : html.replace(\"</head>\", `${links.map((link) => ` ${link}`).join(\"\\n\")}\\n</head>`);\n}\n\nasync function generateFontAssets(\n usages: IconUsageMap,\n devMode: boolean,\n base: string,\n outputDir: string,\n): Promise<GeneratedFontAsset[]> {\n const subsetFont = (await import(\"subset-font\")).default;\n const fonts: GeneratedFontAsset[] = [];\n\n for (const family of families) {\n const names = [...(usages.get(family) ?? [])].sort();\n\n if (names.length === 0) {\n continue;\n }\n\n const sourcePath = resolveFontPath(family);\n const source = await readFile(sourcePath);\n const subset = await subsetFont(source, names.join(\" \"), {\n targetFormat: \"woff2\",\n });\n const hash = createHash(\"sha256\").update(subset).digest(\"hex\").slice(0, 8);\n const fileName = `rs-material-symbols-${family}-${hash}.woff2`;\n\n fonts.push({\n family,\n fileName,\n href: fontHref(fileName, devMode, base, outputDir),\n source: subset,\n });\n }\n\n return fonts;\n}\n\nfunction resolveFontPath(family: RsIconFamily) {\n return require.resolve(\n `${familyPackages[family]}/files/material-symbols-${family}-latin-${familyFontVariants[family]}-normal.woff2`,\n );\n}\n\nfunction fontHref(fileName: string, devMode: boolean, base: string, outputDir: string) {\n return devMode\n ? `/@robosophy-material-symbols/${fileName}`\n : withBase(base, `${outputDir}/${fileName}`);\n}\n\nfunction formatHtmlLinkTag(tag: HtmlTagDescriptor) {\n const attrs = Object.entries(tag.attrs ?? {})\n .map(([name, value]) => (value === \"\" ? name : `${name}=\"${value}\"`))\n .join(\" \");\n\n return `<${tag.tag}${attrs ? ` ${attrs}` : \"\"}>`;\n}\n\nfunction getLinkHref(link: string) {\n return link.match(/\\bhref=\"([^\"]+)\"/)?.[1] ?? \"\";\n}\n\nfunction collectFromSource(source: string, usages: IconUsageMap) {\n const rsIconTagPattern = /<RsIcon\\b([^>]*)>/g;\n let tagMatch: RegExpExecArray | null;\n\n while ((tagMatch = rsIconTagPattern.exec(source))) {\n const attrs = parseStaticAttributes(tagMatch[1] ?? \"\");\n const rawName = attrs.name ?? attrs[\":name\"];\n const hasFamily = \"family\" in attrs || \":family\" in attrs;\n const rawFamily = attrs.family ?? attrs[\":family\"] ?? \"\";\n\n if (rawName) {\n const familyList = resolveFamilies(rawFamily, hasFamily);\n const names = resolveNames(rawName);\n\n for (const family of familyList) {\n for (const name of names) {\n addUsage(usages, { family, name });\n }\n }\n }\n }\n\n const primeHelperPattern =\n /\\brsPrimeIcon\\(\\s*[\"']([a-z0-9_]+)[\"'](?:\\s*,\\s*\\{([^)]*)\\})?/g;\n let helperMatch: RegExpExecArray | null;\n\n while ((helperMatch = primeHelperPattern.exec(source))) {\n const family = toFamily(helperMatch[2]?.match(/\\bfamily\\s*:\\s*[\"'](\\w+)[\"']/)?.[1]);\n addUsage(usages, {\n family: family ?? defaultFamily,\n name: helperMatch[1] ?? \"\",\n });\n }\n\n const objectIconPattern = /\\bicon\\s*:\\s*[\"']([a-z0-9_]+)[\"']/g;\n let objectMatch: RegExpExecArray | null;\n\n while ((objectMatch = objectIconPattern.exec(source))) {\n addUsage(usages, {\n family: defaultFamily,\n name: objectMatch[1] ?? \"\",\n });\n }\n}\n\nfunction parseStaticAttributes(source: string) {\n const attrs: Record<string, string> = {};\n const attrPattern = /([:@\\w-]+)\\s*=\\s*(?:\"([^\"]*)\"|'([^']*)')/g;\n let match: RegExpExecArray | null;\n\n while ((match = attrPattern.exec(source))) {\n attrs[match[1] ?? \"\"] = match[2] ?? match[3] ?? \"\";\n }\n\n return attrs;\n}\n\nfunction unwrapStaticValue(value: string) {\n return value.replace(/^['\"](.+)['\"]$/, \"$1\");\n}\n\nfunction addUsage(usages: IconUsageMap, icon: { family?: RsIconFamily; name: string }) {\n const family = icon.family ?? defaultFamily;\n const name = icon.name.trim();\n\n if (!families.includes(family) || !iconNamePattern.test(name)) {\n return;\n }\n\n usages.get(family)?.add(name);\n}\n\nasync function loadIconManifest(): Promise<Record<RsIconFamily, string[]> | null> {\n try {\n const dir = join(fileURLToPath(import.meta.url), \"..\");\n const manifestPath = join(dir, \"icon-manifest.json\");\n const source = await readFile(manifestPath, \"utf8\");\n return JSON.parse(source) as Record<RsIconFamily, string[]>;\n } catch {\n return null;\n }\n}\n\nfunction toFamily(value?: string): RsIconFamily | undefined {\n const normalized = value ? unwrapStaticValue(value) : \"\";\n return families.includes(normalized as RsIconFamily)\n ? (normalized as RsIconFamily)\n : undefined;\n}\n\nfunction resolveNames(rawName: string): string[] {\n const stringLiterals = /[\"']([a-z0-9_]+)[\"']/g;\n let strMatch: RegExpExecArray | null;\n const names: string[] = [];\n\n while ((strMatch = stringLiterals.exec(rawName))) {\n const candidate = strMatch[1] ?? \"\";\n if (iconNamePattern.test(candidate)) {\n names.push(candidate);\n }\n }\n\n if (names.length === 0) {\n const name = unwrapStaticValue(rawName);\n if (iconNamePattern.test(name)) {\n names.push(name);\n }\n }\n\n return names;\n}\n\nfunction resolveFamilies(rawFamily: string, hasFamily = true): RsIconFamily[] {\n const family = toFamily(rawFamily);\n if (family) return [family];\n\n const stringLiterals = /[\"'](\\w+)[\"']/g;\n let strMatch: RegExpExecArray | null;\n const found = new Set<RsIconFamily>();\n\n while ((strMatch = stringLiterals.exec(rawFamily))) {\n const candidate = strMatch[1] ?? \"\";\n const f = toFamily(candidate);\n if (f) {\n found.add(f);\n }\n }\n\n if (found.size > 0) return [...found];\n\n if (!hasFamily) return [defaultFamily];\n\n return [...families];\n}\n\nfunction createUsageMap(): IconUsageMap {\n return new Map(families.map((family) => [family, new Set<string>()]));\n}\n\nasync function listSourceFiles(root: string): Promise<string[]> {\n try {\n const entries = await readdir(root, { withFileTypes: true });\n const files = await Promise.all(\n entries.map(async (entry) => {\n const path = join(root, entry.name);\n\n if (entry.isDirectory()) {\n return skippedDirs.has(entry.name) ? [] : listSourceFiles(path);\n }\n\n return sourceExtensions.has(extname(entry.name)) ? [path] : [];\n }),\n );\n\n return files.flat();\n } catch {\n return [];\n }\n}\n\nfunction withBase(base: string, path: string) {\n const cleanBase = base.endsWith(\"/\") ? base : `${base}/`;\n return `${cleanBase}${path}`.replaceAll(`${sep}`, \"/\");\n}\n\nexport function formatDetectedMaterialSymbols(usages: IconUsageMap) {\n return families\n .map((family) => `${family}: ${[...(usages.get(family) ?? [])].sort().join(\", \")}`)\n .join(\"\\n\");\n}\n"],"names":["require"],"mappings":";;;;;AA2BA,MAAM,WAAW,CAAC,YAAY,WAAW,OAAO;AAChD,MAAM,gBAA8B;AACpC,MAAM,kBAAkB;AACxB,MAAM,mBAAmB,oBAAI,IAAI,CAAC,OAAO,QAAQ,QAAQ,OAAO,QAAQ,MAAM,CAAC;AAC/E,MAAM,kCAAkB,IAAI,CAAC,QAAQ,QAAQ,gBAAgB,kBAAkB,CAAC;AAChF,MAAM,oBAAoB;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,MAAM,kBAAgD;AAAA,EACpD,UAAU;AAAA,EACV,SAAS;AAAA,EACT,OAAO;AACT;AAEA,MAAM,iBAA+C;AAAA,EACnD,UAAU;AAAA,EACV,SAAS;AAAA,EACT,OAAO;AACT;AAEA,MAAM,qBAAmD;AAAA,EACvD,UAAU;AAAA,EACV,SAAS;AAAA,EACT,OAAO;AACT;AAEA,MAAM,qBAAwC;AAC9C,MAAM,iBAAiB;AACvB,MAAMA,YAAU,cAAc,YAAY,GAAG;AAEtC,SAAS,yBACd,UAA2C,IACnC;AACR,QAAM,OAAO,QAAQ,aAAa,IAAI,OAAO,QAAQ,QAAQ,EAAE;AAC/D,QAAM,YAAY,IACf,MAAM,GAAG,EACT,OAAO,CAAC,SAAS,QAAQ,SAAS,IAAI,EACtC,KAAK,GAAG,KAAK;AAChB,MAAI;AACJ,MAAI,eAAsD;AAC1D,MAAI,aAAa;AAEjB,iBAAe,YAAY;AACzB,QAAI,cAAc,aAAc,QAAO;AACvC,mBAAe,MAAM,sBAAsB,QAAQ,SAAS,SAAS;AACrE,iBAAa;AACb,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,MAAM,eAAe,gBAAgB;AACnC,eAAS;AAAA,IACX;AAAA,IACA,MAAM,qBAAwD;AAC5D,YAAM,SAAS,MAAM,UAAA;AAErB,aAAO,6BAA6B,QAAQ,OAAO;AAAA,IACrD;AAAA,IACA,gBAAgB,QAAQ;AACtB,aAAO,QAAQ,GAAG,OAAO,CAAC,QAAQ,SAAS;AACzC,YAAI,iBAAiB,IAAI,QAAQ,IAAI,CAAC,GAAG;AACvC,uBAAa;AAAA,QACf;AAAA,MACF,CAAC;AACD,aAAO,YAAY,IAAI,OAAO,SAAS,UAAU,SAAS;AACxD,YAAI,CAAC,QAAQ,KAAK,WAAW,+BAA+B,GAAG;AAC7D,eAAA;AACA;AAAA,QACF;AAEA,YAAI;AACF,gBAAM,SAAS,MAAM,UAAA;AACrB,gBAAM,WAAW;AAAA,YACf,QAAQ,IAAI,QAAQ,iCAAiC,EAAE,EAAE,MAAM,GAAG,EAAE,CAAC,KAAK;AAAA,UAAA;AAG5E,cAAI,aAAa,2BAA2B;AAC1C,qBAAS,UAAU,gBAAgB,yBAAyB;AAC5D,qBAAS,IAAI,OAAO,GAAG;AACvB;AAAA,UACF;AAEA,gBAAM,OAAO,OAAO,MAAM,KAAK,CAAC,UAAU,MAAM,aAAa,QAAQ;AAErE,cAAI,MAAM;AACR,qBAAS,UAAU,gBAAgB,YAAY;AAC/C,qBAAS,IAAI,KAAK,MAAM;AACxB;AAAA,UACF;AAEA,eAAA;AAAA,QACF,SAAS,OAAO;AACd,eAAK,KAAK;AAAA,QACZ;AAAA,MACF,CAAC;AAAA,IACH;AAAA,IACA,MAAM,eAAe,gBAAgB,QAAQ;AAC3C,YAAM,SAAS,MAAM,UAAA;AAErB,iBAAW,QAAQ,OAAO,OAAO;AAC/B,aAAK,SAAS;AAAA,UACZ,UAAU,GAAG,SAAS,IAAI,KAAK,QAAQ;AAAA,UACvC,MAAM,KAAK;AAAA,UACX,QAAQ,KAAK;AAAA,UACb,MAAM;AAAA,QAAA,CACP;AAAA,MACH;AAEA,WAAK,SAAS;AAAA,QACZ,UAAU,GAAG,SAAS;AAAA,QACtB,MAAM;AAAA,QACN,QAAQ,OAAO;AAAA,QACf,MAAM;AAAA,MAAA,CACP;AAAA,IACH;AAAA,EAAA;AAEJ;AAeA,eAAe,sBACb,QACA,SACA,WACA;AACA,QAAM,SAAS,MAAM,4BAA4B,QAAQ,OAAO;AAChE,QAAM,UAAU,OAAO,YAAY;AACnC,QAAM,QAAQ,MAAM,mBAAmB,QAAQ,SAAS,OAAO,MAAM,SAAS;AAC9E,QAAM,MAAM;AAAA,IACV;AAAA,IACA;AAAA,IACA;AAAA,IACA,QAAQ,eAAe;AAAA,EAAA;AAGzB,SAAO;AAAA,IACL;AAAA,IACA,SAAS,UACL,yDACA,SAAS,OAAO,MAAM,GAAG,SAAS,0BAA0B;AAAA,IAChE;AAAA,EAAA;AAEJ;AAEA,eAAsB,4BACpB,QACA,UAA2C,IAC3C;AACA,QAAM,SAAS,eAAA;AAIf,QAAM,WAAW,MAAM,iBAAA;AAEvB,MAAI,UAAU;AACZ,eAAW,UAAU,UAAU;AAC7B,iBAAW,QAAQ,SAAS,MAAM,KAAK,CAAA,GAAI;AACzC,iBAAS,QAAQ,EAAE,QAAQ,KAAA,CAAM;AAAA,MACnC;AAAA,IACF;AAAA,EACF,OAAO;AACL,eAAW,QAAQ,mBAAmB;AACpC,iBAAW,UAAU,UAAU;AAC7B,iBAAS,QAAQ,EAAE,QAAQ,KAAA,CAAM;AAAA,MACnC;AAAA,IACF;AAAA,EACF;AAEA,aAAW,QAAQ,QAAQ,WAAW,CAAA,GAAI;AACxC,aAAS,QAAQ,OAAO,SAAS,WAAW,EAAE,QAAQ,eAAe,MAAM,KAAA,IAAS,IAAI;AAAA,EAC1F;AAEA,MAAI,QAAQ,SAAS,OAAO;AAC1B,UAAM,QAAQ,QAAQ,SAAS,CAAC,KAAK,OAAO,MAAM,KAAK,CAAC;AAExD,eAAW,QAAQ,OAAO;AACxB,iBAAW,YAAY,MAAM,gBAAgB,IAAI,GAAG;AAClD,cAAM,SAAS,MAAM,SAAS,UAAU,MAAM;AAC9C,0BAAkB,QAAQ,MAAM;AAAA,MAClC;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEO,SAAS,wBACd,QACA,OACA,UAAU,OACV,cAAiC,oBACjC;AACA,QAAM,QAAkB,CAAA;AAExB,aAAW,QAAQ,OAAO;AACxB,UAAM,UAAU,UACZ,gCAAgC,KAAK,QAAQ,KAC7C,KAAK,KAAK,QAAQ;AAEtB,UAAM;AAAA,MACJ;AAAA,MACA,mBAAmB,gBAAgB,KAAK,MAAM,CAAC;AAAA,MAC/C,mBAAmB,WAAW;AAAA,MAC9B;AAAA,MACA;AAAA,MACA,eAAe,OAAO;AAAA,MACtB;AAAA,IAAA;AAAA,EAEJ;AAEA,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,mBAAmB,gBAAgB,QAAQ;AAAA,IAC3C;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,qCAAqC,gBAAgB,OAAO;AAAA,IAC5D,mCAAmC,gBAAgB,KAAK;AAAA,IACxD;AAAA,EAAA;AAGF,QAAM,4BAAY,IAAA;AAElB,aAAW,UAAU,UAAU;AAC7B,eAAW,QAAQ,OAAO,IAAI,MAAM,KAAK,CAAA,GAAI;AAC3C,YAAM,IAAI,IAAI;AAAA,IAChB;AAAA,EACF;AAEA,aAAW,QAAQ,CAAC,GAAG,KAAK,EAAE,QAAQ;AACpC,UAAM,KAAK,YAAY,IAAI,0BAA0B,IAAI,MAAM;AAAA,EACjE;AAEA,SAAO,GAAG,MAAM,KAAK,IAAI,CAAC;AAAA;AAC5B;AAEO,SAAS,6BACd,QACA,UAA4D,IACvC;AACrB,QAAM,OAA4B,CAAA;AAElC,MAAI,QAAQ,WAAW,gBAAgB;AACrC,eAAW,QAAQ,OAAO,OAAO;AAC/B,WAAK,KAAK;AAAA,QACR,OAAO;AAAA,UACL,IAAI;AAAA,UACJ,aAAa;AAAA,UACb,MAAM,KAAK;AAAA,UACX,KAAK;AAAA,UACL,MAAM;AAAA,QAAA;AAAA,QAER,KAAK;AAAA,QACL,UAAU;AAAA,MAAA,CACX;AAAA,IACH;AAAA,EACF;AAEA,OAAK,KAAK;AAAA,IACR,OAAO;AAAA,MACL,MAAM,OAAO;AAAA,MACb,KAAK;AAAA,IAAA;AAAA,IAEP,KAAK;AAAA,IACL,UAAU;AAAA,EAAA,CACX;AAED,SAAO;AACT;AAEO,SAAS,+BACd,MACA,QACA,UAA4D,CAAA,GAC5D;AACA,QAAM,QAAQ,6BAA6B,QAAQ,OAAO,EACvD,IAAI,iBAAiB,EACrB,OAAO,CAAC,SAAS,CAAC,KAAK,SAAS,SAAS,YAAY,IAAI,CAAC,GAAG,CAAC;AAEjE,SAAO,MAAM,WAAW,IACpB,OACA,KAAK,QAAQ,WAAW,GAAG,MAAM,IAAI,CAAC,SAAS,KAAK,IAAI,EAAE,EAAE,KAAK,IAAI,CAAC;AAAA,QAAW;AACvF;AAEA,eAAe,mBACb,QACA,SACA,MACA,WAC+B;AAC/B,QAAM,cAAc,MAAM,OAAO,aAAa,GAAG;AACjD,QAAM,QAA8B,CAAA;AAEpC,aAAW,UAAU,UAAU;AAC7B,UAAM,QAAQ,CAAC,GAAI,OAAO,IAAI,MAAM,KAAK,CAAA,CAAG,EAAE,KAAA;AAE9C,QAAI,MAAM,WAAW,GAAG;AACtB;AAAA,IACF;AAEA,UAAM,aAAa,gBAAgB,MAAM;AACzC,UAAM,SAAS,MAAM,SAAS,UAAU;AACxC,UAAM,SAAS,MAAM,WAAW,QAAQ,MAAM,KAAK,GAAG,GAAG;AAAA,MACvD,cAAc;AAAA,IAAA,CACf;AACD,UAAM,OAAO,WAAW,QAAQ,EAAE,OAAO,MAAM,EAAE,OAAO,KAAK,EAAE,MAAM,GAAG,CAAC;AACzE,UAAM,WAAW,uBAAuB,MAAM,IAAI,IAAI;AAEtD,UAAM,KAAK;AAAA,MACT;AAAA,MACA;AAAA,MACA,MAAM,SAAS,UAAU,SAAS,MAAM,SAAS;AAAA,MACjD,QAAQ;AAAA,IAAA,CACT;AAAA,EACH;AAEA,SAAO;AACT;AAEA,SAAS,gBAAgB,QAAsB;AAC7C,SAAOA,UAAQ;AAAA,IACb,GAAG,eAAe,MAAM,CAAC,2BAA2B,MAAM,UAAU,mBAAmB,MAAM,CAAC;AAAA,EAAA;AAElG;AAEA,SAAS,SAAS,UAAkB,SAAkB,MAAc,WAAmB;AACrF,SAAO,UACH,gCAAgC,QAAQ,KACxC,SAAS,MAAM,GAAG,SAAS,IAAI,QAAQ,EAAE;AAC/C;AAEA,SAAS,kBAAkB,KAAwB;AACjD,QAAM,QAAQ,OAAO,QAAQ,IAAI,SAAS,CAAA,CAAE,EACzC,IAAI,CAAC,CAAC,MAAM,KAAK,MAAO,UAAU,KAAK,OAAO,GAAG,IAAI,KAAK,KAAK,GAAI,EACnE,KAAK,GAAG;AAEX,SAAO,IAAI,IAAI,GAAG,GAAG,QAAQ,IAAI,KAAK,KAAK,EAAE;AAC/C;AAEA,SAAS,YAAY,MAAc;AACjC,SAAO,KAAK,MAAM,kBAAkB,IAAI,CAAC,KAAK;AAChD;AAEA,SAAS,kBAAkB,QAAgB,QAAsB;AAC/D,QAAM,mBAAmB;AACzB,MAAI;AAEJ,SAAQ,WAAW,iBAAiB,KAAK,MAAM,GAAI;AACjD,UAAM,QAAQ,sBAAsB,SAAS,CAAC,KAAK,EAAE;AACrD,UAAM,UAAU,MAAM,QAAQ,MAAM,OAAO;AAC3C,UAAM,YAAY,YAAY,SAAS,aAAa;AACpD,UAAM,YAAY,MAAM,UAAU,MAAM,SAAS,KAAK;AAEtD,QAAI,SAAS;AACX,YAAM,aAAa,gBAAgB,WAAW,SAAS;AACvD,YAAM,QAAQ,aAAa,OAAO;AAElC,iBAAW,UAAU,YAAY;AAC/B,mBAAW,QAAQ,OAAO;AACxB,mBAAS,QAAQ,EAAE,QAAQ,KAAA,CAAM;AAAA,QACnC;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,QAAM,qBACJ;AACF,MAAI;AAEJ,SAAQ,cAAc,mBAAmB,KAAK,MAAM,GAAI;AACtD,UAAM,SAAS,SAAS,YAAY,CAAC,GAAG,MAAM,8BAA8B,IAAI,CAAC,CAAC;AAClF,aAAS,QAAQ;AAAA,MACf,QAAQ,UAAU;AAAA,MAClB,MAAM,YAAY,CAAC,KAAK;AAAA,IAAA,CACzB;AAAA,EACH;AAEA,QAAM,oBAAoB;AAC1B,MAAI;AAEJ,SAAQ,cAAc,kBAAkB,KAAK,MAAM,GAAI;AACrD,aAAS,QAAQ;AAAA,MACf,QAAQ;AAAA,MACR,MAAM,YAAY,CAAC,KAAK;AAAA,IAAA,CACzB;AAAA,EACH;AACF;AAEA,SAAS,sBAAsB,QAAgB;AAC7C,QAAM,QAAgC,CAAA;AACtC,QAAM,cAAc;AACpB,MAAI;AAEJ,SAAQ,QAAQ,YAAY,KAAK,MAAM,GAAI;AACzC,UAAM,MAAM,CAAC,KAAK,EAAE,IAAI,MAAM,CAAC,KAAK,MAAM,CAAC,KAAK;AAAA,EAClD;AAEA,SAAO;AACT;AAEA,SAAS,kBAAkB,OAAe;AACxC,SAAO,MAAM,QAAQ,kBAAkB,IAAI;AAC7C;AAEA,SAAS,SAAS,QAAsB,MAA+C;AACrF,QAAM,SAAS,KAAK,UAAU;AAC9B,QAAM,OAAO,KAAK,KAAK,KAAA;AAEvB,MAAI,CAAC,SAAS,SAAS,MAAM,KAAK,CAAC,gBAAgB,KAAK,IAAI,GAAG;AAC7D;AAAA,EACF;AAEA,SAAO,IAAI,MAAM,GAAG,IAAI,IAAI;AAC9B;AAEA,eAAe,mBAAmE;AAChF,MAAI;AACF,UAAM,MAAM,KAAK,cAAc,YAAY,GAAG,GAAG,IAAI;AACrD,UAAM,eAAe,KAAK,KAAK,oBAAoB;AACnD,UAAM,SAAS,MAAM,SAAS,cAAc,MAAM;AAClD,WAAO,KAAK,MAAM,MAAM;AAAA,EAC1B,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,SAAS,OAA0C;AAC1D,QAAM,aAAa,QAAQ,kBAAkB,KAAK,IAAI;AACtD,SAAO,SAAS,SAAS,UAA0B,IAC9C,aACD;AACN;AAEA,SAAS,aAAa,SAA2B;AAC/C,QAAM,iBAAiB;AACvB,MAAI;AACJ,QAAM,QAAkB,CAAA;AAExB,SAAQ,WAAW,eAAe,KAAK,OAAO,GAAI;AAChD,UAAM,YAAY,SAAS,CAAC,KAAK;AACjC,QAAI,gBAAgB,KAAK,SAAS,GAAG;AACnC,YAAM,KAAK,SAAS;AAAA,IACtB;AAAA,EACF;AAEA,MAAI,MAAM,WAAW,GAAG;AACtB,UAAM,OAAO,kBAAkB,OAAO;AACtC,QAAI,gBAAgB,KAAK,IAAI,GAAG;AAC9B,YAAM,KAAK,IAAI;AAAA,IACjB;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,gBAAgB,WAAmB,YAAY,MAAsB;AAC5E,QAAM,SAAS,SAAS,SAAS;AACjC,MAAI,OAAQ,QAAO,CAAC,MAAM;AAE1B,QAAM,iBAAiB;AACvB,MAAI;AACJ,QAAM,4BAAY,IAAA;AAElB,SAAQ,WAAW,eAAe,KAAK,SAAS,GAAI;AAClD,UAAM,YAAY,SAAS,CAAC,KAAK;AACjC,UAAM,IAAI,SAAS,SAAS;AAC5B,QAAI,GAAG;AACL,YAAM,IAAI,CAAC;AAAA,IACb;AAAA,EACF;AAEA,MAAI,MAAM,OAAO,EAAG,QAAO,CAAC,GAAG,KAAK;AAEpC,MAAI,CAAC,UAAW,QAAO,CAAC,aAAa;AAErC,SAAO,CAAC,GAAG,QAAQ;AACrB;AAEA,SAAS,iBAA+B;AACtC,SAAO,IAAI,IAAI,SAAS,IAAI,CAAC,WAAW,CAAC,QAAQ,oBAAI,IAAA,CAAa,CAAC,CAAC;AACtE;AAEA,eAAe,gBAAgB,MAAiC;AAC9D,MAAI;AACF,UAAM,UAAU,MAAM,QAAQ,MAAM,EAAE,eAAe,MAAM;AAC3D,UAAM,QAAQ,MAAM,QAAQ;AAAA,MAC1B,QAAQ,IAAI,OAAO,UAAU;AAC3B,cAAM,OAAO,KAAK,MAAM,MAAM,IAAI;AAElC,YAAI,MAAM,eAAe;AACvB,iBAAO,YAAY,IAAI,MAAM,IAAI,IAAI,CAAA,IAAK,gBAAgB,IAAI;AAAA,QAChE;AAEA,eAAO,iBAAiB,IAAI,QAAQ,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAA;AAAA,MAC9D,CAAC;AAAA,IAAA;AAGH,WAAO,MAAM,KAAA;AAAA,EACf,QAAQ;AACN,WAAO,CAAA;AAAA,EACT;AACF;AAEA,SAAS,SAAS,MAAc,MAAc;AAC5C,QAAM,YAAY,KAAK,SAAS,GAAG,IAAI,OAAO,GAAG,IAAI;AACrD,SAAO,GAAG,SAAS,GAAG,IAAI,GAAG,WAAW,GAAG,GAAG,IAAI,GAAG;AACvD;AAEO,SAAS,8BAA8B,QAAsB;AAClE,SAAO,SACJ,IAAI,CAAC,WAAW,GAAG,MAAM,KAAK,CAAC,GAAI,OAAO,IAAI,MAAM,KAAK,CAAA,CAAG,EAAE,KAAA,EAAO,KAAK,IAAI,CAAC,EAAE,EACjF,KAAK,IAAI;AACd;"}
|
|
1
|
+
{"version":3,"file":"vite.js","sources":["../src/vite.ts"],"sourcesContent":["import { createHash } from \"node:crypto\";\nimport { readdir, readFile } from \"node:fs/promises\";\nimport { extname, join, sep } from \"node:path\";\nimport { createRequire } from \"node:module\";\nimport { fileURLToPath } from \"node:url\";\nimport type { HtmlTagDescriptor, IndexHtmlTransformResult, Plugin, ResolvedConfig } from \"vite\";\n\nimport type { RsIconFamily } from \"./components/RsIcon\";\n\ntype IconInput = string | { family?: RsIconFamily; name: string };\nexport type RsIconFontDisplay = \"block\" | \"swap\" | \"fallback\" | \"optional\";\n\nexport type RobosophyMaterialSymbolsOptions = {\n outputDir?: string;\n fontDisplay?: RsIconFontDisplay;\n fontVariant?: string;\n include?: IconInput[];\n preload?: boolean;\n roots?: string[];\n scan?: boolean;\n};\n\ntype IconUsageMap = Map<RsIconFamily, Set<string>>;\ntype MaterialSymbolsLinkAssets = {\n cssHref: string;\n fonts: Pick<GeneratedFontAsset, \"href\">[];\n};\n\nconst families = [\"outlined\", \"rounded\", \"sharp\"] as const satisfies readonly RsIconFamily[];\nconst defaultFamily: RsIconFamily = \"outlined\";\nconst iconNamePattern = /^[a-z0-9_]+$/;\nconst sourceExtensions = new Set([\".js\", \".jsx\", \".mjs\", \".ts\", \".tsx\", \".vue\"]);\nconst skippedDirs = new Set([\".git\", \"dist\", \"node_modules\", \"storybook-static\"]);\nconst internalIconNames = [\n \"arrow_drop_down\",\n \"arrow_drop_up\",\n \"arrow_left\",\n \"chevron_right\",\n \"close\",\n \"login\",\n \"nest_eco_leaf\",\n];\n\nconst familyFontNames: Record<RsIconFamily, string> = {\n outlined: \"Material Symbols Outlined Variable\",\n rounded: \"Material Symbols Rounded Variable\",\n sharp: \"Material Symbols Sharp Variable\",\n};\n\nconst familyPackages: Record<RsIconFamily, string> = {\n outlined: \"@fontsource-variable/material-symbols-outlined\",\n rounded: \"@fontsource-variable/material-symbols-rounded\",\n sharp: \"@fontsource-variable/material-symbols-sharp\",\n};\n\nconst defaultFontDisplay: RsIconFontDisplay = \"swap\";\nconst defaultPreload = false;\nconst require = createRequire(import.meta.url);\n\nexport function robosophyMaterialSymbols(\n options: RobosophyMaterialSymbolsOptions = {},\n): Plugin {\n const raw = (options.outputDir ?? \"\").trim().replace(/^\\/+/, \"\");\n const outputDir = raw\n .split(\"/\")\n .filter((part) => part && part !== \"..\")\n .join(\"/\") || \"assets\";\n const fontVariant = options.fontVariant ?? \"full\";\n let config: ResolvedConfig;\n let cachedAssets: GeneratedMaterialSymbolsAssets | null = null;\n let cacheValid = false;\n\n async function getAssets() {\n if (cacheValid && cachedAssets) return cachedAssets;\n cachedAssets = await ensureGeneratedAssets(config, options, outputDir, fontVariant);\n cacheValid = true;\n return cachedAssets;\n }\n\n return {\n name: \"robosophy-material-symbols\",\n async configResolved(resolvedConfig) {\n config = resolvedConfig;\n },\n async transformIndexHtml(): Promise<IndexHtmlTransformResult> {\n const assets = await getAssets();\n\n return buildMaterialSymbolsHtmlTags(assets, options);\n },\n configureServer(server) {\n server.watcher.on(\"all\", (_event, file) => {\n if (sourceExtensions.has(extname(file))) {\n cacheValid = false;\n }\n });\n server.middlewares.use(async (request, response, next) => {\n if (!request.url?.startsWith(\"/@robosophy-material-symbols/\")) {\n next();\n return;\n }\n\n try {\n const assets = await getAssets();\n const fileName = decodeURIComponent(\n request.url.replace(\"/@robosophy-material-symbols/\", \"\").split(\"?\")[0] ?? \"\",\n );\n\n if (fileName === \"rs-material-symbols.css\") {\n response.setHeader(\"Content-Type\", \"text/css; charset=utf-8\");\n response.end(assets.css);\n return;\n }\n\n const font = assets.fonts.find((asset) => asset.fileName === fileName);\n\n if (font) {\n response.setHeader(\"Content-Type\", \"font/woff2\");\n response.end(font.source);\n return;\n }\n\n next();\n } catch (error) {\n next(error);\n }\n });\n },\n async generateBundle(_outputOptions, bundle) {\n const assets = await getAssets();\n\n for (const font of assets.fonts) {\n this.emitFile({\n fileName: `${outputDir}/${font.fileName}`,\n name: font.fileName,\n source: font.source,\n type: \"asset\",\n });\n }\n\n this.emitFile({\n fileName: `${outputDir}/rs-material-symbols.css`,\n name: \"rs-material-symbols.css\",\n source: assets.css,\n type: \"asset\",\n });\n },\n };\n}\n\ntype GeneratedFontAsset = {\n family: RsIconFamily;\n fileName: string;\n href: string;\n source: Buffer;\n};\n\ntype GeneratedMaterialSymbolsAssets = {\n css: string;\n cssHref: string;\n fonts: GeneratedFontAsset[];\n};\n\nasync function ensureGeneratedAssets(\n config: ResolvedConfig,\n options: RobosophyMaterialSymbolsOptions,\n outputDir: string,\n fontVariant: string,\n) {\n const usages = await collectMaterialSymbolUsages(config, options);\n const devMode = config.command === \"serve\";\n const fonts = await generateFontAssets(usages, devMode, config.base, outputDir, fontVariant);\n\n if (config.command === \"serve\" || config.command === \"build\") {\n const summary = formatDetectedMaterialSymbols(usages);\n const totalIcons = [...usages.values()].reduce((sum, s) => sum + s.size, 0);\n if (totalIcons > 0) {\n config.logger.info(\n `[robosophy-material-symbols] ${totalIcons} icons detected (variant: ${fontVariant})\\n${summary}`,\n );\n for (const font of fonts) {\n const kb = (font.source.length / 1024).toFixed(1);\n config.logger.info(` ${font.family} subset: ${kb} KB (${font.fileName})`);\n }\n } else {\n config.logger.warn(\n \"[robosophy-material-symbols] No Material Symbols icons detected in source. Add them via the include option.\",\n );\n }\n }\n const css = buildMaterialSymbolsCss(\n usages,\n fonts,\n devMode,\n options.fontDisplay ?? defaultFontDisplay,\n );\n\n return {\n css,\n cssHref: devMode\n ? \"/@robosophy-material-symbols/rs-material-symbols.css\"\n : withBase(config.base, `${outputDir}/rs-material-symbols.css`),\n fonts,\n };\n}\n\nexport async function collectMaterialSymbolUsages(\n config: Pick<ResolvedConfig, \"root\">,\n options: RobosophyMaterialSymbolsOptions = {},\n) {\n const usages = createUsageMap();\n\n // Register icons used by compiled library components.\n // Prefer the auto-generated manifest; fall back to hardcoded list for older library builds.\n const manifest = await loadIconManifest();\n\n if (manifest) {\n for (const family of families) {\n for (const name of manifest[family] ?? []) {\n addUsage(usages, { family, name });\n }\n }\n } else {\n for (const name of internalIconNames) {\n for (const family of families) {\n addUsage(usages, { family, name });\n }\n }\n }\n\n for (const icon of options.include ?? []) {\n addUsage(usages, typeof icon === \"string\" ? { family: defaultFamily, name: icon } : icon);\n }\n\n if (options.scan !== false) {\n const roots = options.roots ?? [join(config.root, \"src\")];\n\n for (const root of roots) {\n for (const filePath of await listSourceFiles(root)) {\n const source = await readFile(filePath, \"utf8\");\n collectFromSource(source, usages);\n }\n }\n }\n\n return usages;\n}\n\nexport function buildMaterialSymbolsCss(\n usages: IconUsageMap,\n fonts: Pick<GeneratedFontAsset, \"family\" | \"fileName\">[],\n devMode = false,\n fontDisplay: RsIconFontDisplay = defaultFontDisplay,\n) {\n const lines: string[] = [];\n\n for (const font of fonts) {\n const fontUrl = devMode\n ? `/@robosophy-material-symbols/${font.fileName}`\n : `./${font.fileName}`;\n\n lines.push(\n \"@font-face {\",\n ` font-family: \"${familyFontNames[font.family]}\";`,\n ` font-display: ${fontDisplay};`,\n \" font-style: normal;\",\n \" font-weight: 100 700;\",\n ` src: url(\"${fontUrl}\") format(\"woff2-variations\");`,\n \"}\",\n );\n }\n\n lines.push(\n `.rs-icon--rounded { font-family: \"${familyFontNames.rounded}\"; }`,\n `.rs-icon--sharp { font-family: \"${familyFontNames.sharp}\"; }`,\n \".rs-icon--prime::before { content: var(--rs-icon-content); }\",\n );\n\n const names = new Set<string>();\n\n for (const family of families) {\n for (const name of usages.get(family) ?? []) {\n names.add(name);\n }\n }\n\n for (const name of [...names].sort()) {\n lines.push(`.rs-icon-${name} { --rs-icon-content: \"${name}\"; }`);\n }\n\n return `${lines.join(\"\\n\")}\\n`;\n}\n\nexport function buildMaterialSymbolsHtmlTags(\n assets: MaterialSymbolsLinkAssets,\n options: Pick<RobosophyMaterialSymbolsOptions, \"preload\"> = {},\n): HtmlTagDescriptor[] {\n const tags: HtmlTagDescriptor[] = [];\n\n if (options.preload ?? defaultPreload) {\n for (const font of assets.fonts) {\n tags.push({\n attrs: {\n as: \"font\",\n crossorigin: \"\",\n href: font.href,\n rel: \"preload\",\n type: \"font/woff2\",\n },\n tag: \"link\",\n injectTo: \"head\",\n });\n }\n }\n\n tags.push({\n attrs: {\n href: assets.cssHref,\n rel: \"stylesheet\",\n },\n tag: \"link\",\n injectTo: \"head\",\n });\n\n return tags;\n}\n\nexport function injectMaterialSymbolsHtmlLinks(\n html: string,\n assets: MaterialSymbolsLinkAssets,\n options: Pick<RobosophyMaterialSymbolsOptions, \"preload\"> = {},\n) {\n const links = buildMaterialSymbolsHtmlTags(assets, options)\n .map(formatHtmlLinkTag)\n .filter((link) => !html.includes(`href=\"${getLinkHref(link)}\"`));\n\n return links.length === 0\n ? html\n : html.replace(\"</head>\", `${links.map((link) => ` ${link}`).join(\"\\n\")}\\n</head>`);\n}\n\nasync function generateFontAssets(\n usages: IconUsageMap,\n devMode: boolean,\n base: string,\n outputDir: string,\n fontVariant: string,\n): Promise<GeneratedFontAsset[]> {\n const subsetFont = (await import(\"subset-font\")).default;\n const fonts: GeneratedFontAsset[] = [];\n\n for (const family of families) {\n const names = [...(usages.get(family) ?? [])].sort();\n\n if (names.length === 0) {\n continue;\n }\n\n const sourcePath = resolveFontPath(family, fontVariant);\n const source = await readFile(sourcePath);\n const subset = await subsetFont(source, names.join(\" \"), {\n targetFormat: \"woff2\",\n });\n const hash = createHash(\"sha256\").update(subset).digest(\"hex\").slice(0, 8);\n const fileName = `rs-material-symbols-${family}-${hash}.woff2`;\n\n fonts.push({\n family,\n fileName,\n href: fontHref(fileName, devMode, base, outputDir),\n source: subset,\n });\n }\n\n return fonts;\n}\n\nfunction resolveFontPath(family: RsIconFamily, variant: string) {\n return require.resolve(\n `${familyPackages[family]}/files/material-symbols-${family}-latin-${variant}-normal.woff2`,\n );\n}\n\nfunction fontHref(fileName: string, devMode: boolean, base: string, outputDir: string) {\n return devMode\n ? `/@robosophy-material-symbols/${fileName}`\n : withBase(base, `${outputDir}/${fileName}`);\n}\n\nfunction formatHtmlLinkTag(tag: HtmlTagDescriptor) {\n const attrs = Object.entries(tag.attrs ?? {})\n .map(([name, value]) => (value === \"\" ? name : `${name}=\"${value}\"`))\n .join(\" \");\n\n return `<${tag.tag}${attrs ? ` ${attrs}` : \"\"}>`;\n}\n\nfunction getLinkHref(link: string) {\n return link.match(/\\bhref=\"([^\"]+)\"/)?.[1] ?? \"\";\n}\n\nfunction collectFromSource(source: string, usages: IconUsageMap) {\n const rsIconTagPattern = /<RsIcon\\b([^>]*)>/g;\n let tagMatch: RegExpExecArray | null;\n\n while ((tagMatch = rsIconTagPattern.exec(source))) {\n const attrs = parseStaticAttributes(tagMatch[1] ?? \"\");\n const rawName = attrs.name ?? attrs[\":name\"];\n const hasFamily = \"family\" in attrs || \":family\" in attrs;\n const rawFamily = attrs.family ?? attrs[\":family\"] ?? \"\";\n\n if (rawName) {\n const familyList = resolveFamilies(rawFamily, hasFamily);\n const names = resolveNames(rawName);\n\n for (const family of familyList) {\n for (const name of names) {\n addUsage(usages, { family, name });\n }\n }\n }\n }\n\n const primeHelperPattern =\n /\\brsPrimeIcon\\(\\s*[\"']([a-z0-9_]+)[\"'](?:\\s*,\\s*\\{([^)]*)\\})?/g;\n let helperMatch: RegExpExecArray | null;\n\n while ((helperMatch = primeHelperPattern.exec(source))) {\n const family = toFamily(helperMatch[2]?.match(/\\bfamily\\s*:\\s*[\"'](\\w+)[\"']/)?.[1]);\n addUsage(usages, {\n family: family ?? defaultFamily,\n name: helperMatch[1] ?? \"\",\n });\n }\n\n const objectIconPattern = /\\bicon\\s*:\\s*[\"']([a-z0-9_]+)[\"']/g;\n let objectMatch: RegExpExecArray | null;\n\n while ((objectMatch = objectIconPattern.exec(source))) {\n addUsage(usages, {\n family: defaultFamily,\n name: objectMatch[1] ?? \"\",\n });\n }\n}\n\nfunction parseStaticAttributes(source: string) {\n const attrs: Record<string, string> = {};\n const attrPattern = /([:@\\w-]+)\\s*=\\s*(?:\"([^\"]*)\"|'([^']*)')/g;\n let match: RegExpExecArray | null;\n\n while ((match = attrPattern.exec(source))) {\n attrs[match[1] ?? \"\"] = match[2] ?? match[3] ?? \"\";\n }\n\n return attrs;\n}\n\nfunction unwrapStaticValue(value: string) {\n return value.replace(/^['\"](.+)['\"]$/, \"$1\");\n}\n\nfunction addUsage(usages: IconUsageMap, icon: { family?: RsIconFamily; name: string }) {\n const family = icon.family ?? defaultFamily;\n const name = icon.name.trim();\n\n if (!families.includes(family) || !iconNamePattern.test(name)) {\n return;\n }\n\n usages.get(family)?.add(name);\n}\n\nasync function loadIconManifest(): Promise<Record<RsIconFamily, string[]> | null> {\n try {\n const dir = join(fileURLToPath(import.meta.url), \"..\");\n const manifestPath = join(dir, \"icon-manifest.json\");\n const source = await readFile(manifestPath, \"utf8\");\n return JSON.parse(source) as Record<RsIconFamily, string[]>;\n } catch {\n return null;\n }\n}\n\nfunction toFamily(value?: string): RsIconFamily | undefined {\n const normalized = value ? unwrapStaticValue(value) : \"\";\n return families.includes(normalized as RsIconFamily)\n ? (normalized as RsIconFamily)\n : undefined;\n}\n\nfunction resolveNames(rawName: string): string[] {\n const stringLiterals = /[\"']([a-z0-9_]+)[\"']/g;\n let strMatch: RegExpExecArray | null;\n const names: string[] = [];\n\n while ((strMatch = stringLiterals.exec(rawName))) {\n const candidate = strMatch[1] ?? \"\";\n if (iconNamePattern.test(candidate)) {\n names.push(candidate);\n }\n }\n\n if (names.length === 0) {\n const name = unwrapStaticValue(rawName);\n if (iconNamePattern.test(name)) {\n names.push(name);\n }\n }\n\n return names;\n}\n\nfunction resolveFamilies(rawFamily: string, hasFamily = true): RsIconFamily[] {\n const family = toFamily(rawFamily);\n if (family) return [family];\n\n const stringLiterals = /[\"'](\\w+)[\"']/g;\n let strMatch: RegExpExecArray | null;\n const found = new Set<RsIconFamily>();\n\n while ((strMatch = stringLiterals.exec(rawFamily))) {\n const candidate = strMatch[1] ?? \"\";\n const f = toFamily(candidate);\n if (f) {\n found.add(f);\n }\n }\n\n if (found.size > 0) return [...found];\n\n if (!hasFamily) return [defaultFamily];\n\n return [...families];\n}\n\nfunction createUsageMap(): IconUsageMap {\n return new Map(families.map((family) => [family, new Set<string>()]));\n}\n\nasync function listSourceFiles(root: string): Promise<string[]> {\n try {\n const entries = await readdir(root, { withFileTypes: true });\n const files = await Promise.all(\n entries.map(async (entry) => {\n const path = join(root, entry.name);\n\n if (entry.isDirectory()) {\n return skippedDirs.has(entry.name) ? [] : listSourceFiles(path);\n }\n\n return sourceExtensions.has(extname(entry.name)) ? [path] : [];\n }),\n );\n\n return files.flat();\n } catch {\n return [];\n }\n}\n\nfunction withBase(base: string, path: string) {\n const cleanBase = base.endsWith(\"/\") ? base : `${base}/`;\n return `${cleanBase}${path}`.replaceAll(`${sep}`, \"/\");\n}\n\nexport function formatDetectedMaterialSymbols(usages: IconUsageMap) {\n return families\n .map((family) => `${family}: ${[...(usages.get(family) ?? [])].sort().join(\", \")}`)\n .join(\"\\n\");\n}\n"],"names":["require"],"mappings":"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"}
|