@robosophy/ui-vue 1.0.15 → 1.0.17

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.
@@ -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
- "nest_eco_leaf"
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
@@ -81,6 +81,10 @@
81
81
  .rs-icon--interactive {
82
82
  cursor: pointer;
83
83
  }
84
+
85
+ .rs-icon--prime::before {
86
+ content: var(--rs-icon-content);
87
+ }
84
88
  .rs-icon {
85
89
  --rs-icon-color: currentColor;
86
90
  --rs-icon-fill: 0;
@@ -152,6 +156,9 @@
152
156
  .rs-icon--interactive {
153
157
  cursor: pointer;
154
158
  }
159
+ .rs-icon--prime::before {
160
+ content: var(--rs-icon-content);
161
+ }
155
162
  .rs-account-selector-host {
156
163
  --rs-account-selector-width: 270px;
157
164
  --rs-account-selector-background: var(--rs-color-surface-primary, #ffffff);
@@ -436,7 +443,8 @@
436
443
  gap: 32px;
437
444
  height: 100%;
438
445
  overflow: hidden;
439
- transition: width 180ms ease-in-out;
446
+ transition: width 220ms cubic-bezier(0.4, 0, 0.2, 1);
447
+ will-change: width;
440
448
  width: var(--rs-sidebar-width-collapsed);
441
449
  }
442
450
  .rs-sidebar--pc {
@@ -483,13 +491,14 @@
483
491
  display: flex;
484
492
  color: var(--rs-sidebar-active);
485
493
  flex: 1;
486
- gap: 0;
494
+ gap: 6px;
487
495
  min-width: 0;
488
- transition: gap 180ms ease-in-out;
496
+ padding-left: 24px;
497
+ transition: padding-left 220ms cubic-bezier(0.4, 0, 0.2, 1);
489
498
  }
490
499
  .rs-sidebar--expanded .rs-sidebar__brand,
491
500
  .rs-sidebar--mobile-open .rs-sidebar__brand {
492
- gap: 6px;
501
+ padding-left: 0;
493
502
  }
494
503
  .rs-sidebar__module-trigger {
495
504
  align-items: center;
@@ -500,19 +509,14 @@
500
509
  display: inline-flex;
501
510
  justify-content: flex-start;
502
511
  font: inherit;
503
- gap: 0;
512
+ gap: 6px;
504
513
  min-width: 0;
505
514
  appearance: none;
506
515
  -webkit-appearance: none;
507
516
  padding: 0;
508
517
  text-align: left;
509
- transition: gap 180ms ease-in-out;
510
518
  width: 100%;
511
519
  }
512
- .rs-sidebar--expanded .rs-sidebar__module-trigger,
513
- .rs-sidebar--mobile-open .rs-sidebar__module-trigger {
514
- gap: 6px;
515
- }
516
520
  .rs-sidebar__module-trigger:hover:not(:disabled),
517
521
  .rs-sidebar__module-trigger:active:not(:disabled) {
518
522
  background: transparent;
@@ -527,19 +531,9 @@
527
531
  margin-left: auto;
528
532
  }
529
533
  .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
534
  margin-left: 0;
536
535
  }
537
536
  .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
537
  margin-left: 0;
544
538
  }
545
539
  .rs-sidebar__title,
@@ -550,8 +544,8 @@
550
544
  opacity: 0;
551
545
  overflow: hidden;
552
546
  transition:
553
- max-width 180ms ease-in-out,
554
- opacity 180ms ease-in-out;
547
+ max-width 220ms cubic-bezier(0.4, 0, 0.2, 1),
548
+ opacity 220ms cubic-bezier(0.4, 0, 0.2, 1);
555
549
  white-space: nowrap;
556
550
  }
557
551
  .rs-sidebar--expanded .rs-sidebar__title,
@@ -676,8 +670,9 @@
676
670
  -webkit-appearance: none;
677
671
  min-height: 27px;
678
672
  padding: 7px 0;
673
+ padding-left: 24px;
679
674
  text-align: left;
680
- transition: gap 180ms ease-in-out;
675
+ transition: padding-left 220ms cubic-bezier(0.4, 0, 0.2, 1);
681
676
  width: 100%;
682
677
  }
683
678
  .rs-sidebar--expanded .rs-sidebar__item,
@@ -717,15 +712,10 @@
717
712
  .rs-sidebar__item-icon {
718
713
  flex: 0 0 auto;
719
714
  color: var(--rs-sidebar-active);
720
- margin-left: 24px;
721
- transition: margin-left 180ms ease-in-out;
715
+ margin-left: 0;
722
716
  width: 24px;
723
717
  height: 24px;
724
718
  }
725
- .rs-sidebar--expanded .rs-sidebar__item-icon,
726
- .rs-sidebar--mobile-open .rs-sidebar__item-icon {
727
- margin-left: 16px;
728
- }
729
719
  .rs-sidebar__brand .rs-icon {
730
720
  width: 24px;
731
721
  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[];
@@ -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;AAuCF,wBAAgB,wBAAwB,CACtC,OAAO,GAAE,+BAAoC,GAC5C,MAAM,CAqFR;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;AAgCF,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,UAkEpD;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;AAkOD,wBAAgB,6BAA6B,CAAC,MAAM,EAAE,YAAY,UAIjE"}
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;AAkCF,wBAAgB,wBAAwB,CACtC,OAAO,GAAE,+BAAoC,GAC5C,MAAM,CA6HR;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;AA0DF,wBAAsB,2BAA2B,CAC/C,MAAM,EAAE,IAAI,CAAC,cAAc,EAAE,MAAM,CAAC,EACpC,OAAO,GAAE,+BAAoC,GAC5C,OAAO,CAAC,YAAY,CAAC,CAmCvB;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,GAClD,MAAM,CAgCR;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,GAC7D,MAAM,CAQR;AA0RD,wBAAgB,6BAA6B,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAI1E"}
package/dist/vite.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import { createHash } from "node:crypto";
2
- import { readFile, readdir } from "node:fs/promises";
2
+ import { readFile, mkdir, readdir, writeFile } from "node:fs/promises";
3
3
  import { join, extname, sep } from "node:path";
4
4
  import { createRequire } from "node:module";
5
5
  import { fileURLToPath } from "node:url";
@@ -27,30 +27,58 @@ 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);
33
+ const CACHE_BASE = join("node_modules", ".cache", "robosophy-icons");
38
34
  function robosophyMaterialSymbols(options = {}) {
39
35
  const raw = (options.outputDir ?? "").trim().replace(/^\/+/, "");
40
36
  const outputDir = raw.split("/").filter((part) => part && part !== "..").join("/") || "assets";
37
+ const fontVariant = options.fontVariant ?? "full";
41
38
  let config;
39
+ let cacheDir;
42
40
  let cachedAssets = null;
43
- let cacheValid = false;
41
+ let cachedUsagesKey = "";
42
+ let needsRegeneration = true;
43
+ function usageMapKey(usages) {
44
+ const parts = [];
45
+ for (const family of families) {
46
+ const names = [...usages.get(family) ?? []].sort();
47
+ if (names.length > 0) {
48
+ parts.push(`${family}:${names.join(",")}`);
49
+ }
50
+ }
51
+ return parts.join("|") || "(empty)";
52
+ }
44
53
  async function getAssets() {
45
- if (cacheValid && cachedAssets) return cachedAssets;
46
- cachedAssets = await ensureGeneratedAssets(config, options, outputDir);
47
- cacheValid = true;
54
+ if (!needsRegeneration && cachedAssets) return cachedAssets;
55
+ const usages = await collectMaterialSymbolUsages(config, options);
56
+ const newKey = usageMapKey(usages);
57
+ if (newKey === cachedUsagesKey && cachedAssets) {
58
+ needsRegeneration = false;
59
+ return cachedAssets;
60
+ }
61
+ if (config.command !== "build" && cachedUsagesKey !== "") {
62
+ config.logger.info(
63
+ "[robosophy-material-symbols] icon usage changed, regenerating font subsets"
64
+ );
65
+ }
66
+ cachedUsagesKey = newKey;
67
+ cachedAssets = await ensureGeneratedAssets(config, options, outputDir, fontVariant, cacheDir);
68
+ needsRegeneration = false;
48
69
  return cachedAssets;
49
70
  }
50
71
  return {
51
72
  name: "robosophy-material-symbols",
52
73
  async configResolved(resolvedConfig) {
53
74
  config = resolvedConfig;
75
+ cacheDir = join(config.root, CACHE_BASE);
76
+ await mkdir(cacheDir, { recursive: true });
77
+ },
78
+ async buildStart() {
79
+ if (config.command === "serve" || config.command === "build") {
80
+ await getAssets();
81
+ }
54
82
  },
55
83
  async transformIndexHtml() {
56
84
  const assets = await getAssets();
@@ -59,7 +87,7 @@ function robosophyMaterialSymbols(options = {}) {
59
87
  configureServer(server) {
60
88
  server.watcher.on("all", (_event, file) => {
61
89
  if (sourceExtensions.has(extname(file))) {
62
- cacheValid = false;
90
+ needsRegeneration = true;
63
91
  }
64
92
  });
65
93
  server.middlewares.use(async (request, response, next) => {
@@ -74,12 +102,15 @@ function robosophyMaterialSymbols(options = {}) {
74
102
  );
75
103
  if (fileName === "rs-material-symbols.css") {
76
104
  response.setHeader("Content-Type", "text/css; charset=utf-8");
105
+ response.setHeader("Cache-Control", "no-cache");
106
+ response.setHeader("ETag", `"${createHash("sha256").update(assets.css).digest("hex").slice(0, 12)}"`);
77
107
  response.end(assets.css);
78
108
  return;
79
109
  }
80
110
  const font = assets.fonts.find((asset) => asset.fileName === fileName);
81
111
  if (font) {
82
112
  response.setHeader("Content-Type", "font/woff2");
113
+ response.setHeader("Cache-Control", "public, max-age=31536000, immutable");
83
114
  response.end(font.source);
84
115
  return;
85
116
  }
@@ -100,27 +131,48 @@ function robosophyMaterialSymbols(options = {}) {
100
131
  });
101
132
  }
102
133
  this.emitFile({
103
- fileName: `${outputDir}/rs-material-symbols.css`,
104
- name: "rs-material-symbols.css",
134
+ fileName: `${outputDir}/${assets.cssFileName}`,
135
+ name: assets.cssFileName,
105
136
  source: assets.css,
106
137
  type: "asset"
107
138
  });
108
139
  }
109
140
  };
110
141
  }
111
- async function ensureGeneratedAssets(config, options, outputDir) {
112
- const usages = await collectMaterialSymbolUsages(config, options);
142
+ async function ensureGeneratedAssets(config, options, outputDir, fontVariant, cacheDir) {
113
143
  const devMode = config.command === "serve";
114
- const fonts = await generateFontAssets(usages, devMode, config.base, outputDir);
144
+ const usages = await collectMaterialSymbolUsages(config, options);
145
+ const fonts = await generateFontAssets(usages, devMode, config.base, outputDir, fontVariant, cacheDir);
146
+ if (config.command === "serve" || config.command === "build") {
147
+ const summary = formatDetectedMaterialSymbols(usages);
148
+ const totalIcons = [...usages.values()].reduce((sum, s) => sum + s.size, 0);
149
+ if (totalIcons > 0) {
150
+ config.logger.info(
151
+ `[robosophy-material-symbols] ${totalIcons} icons detected (variant: ${fontVariant})
152
+ ${summary}`
153
+ );
154
+ for (const font of fonts) {
155
+ const kb = (font.source.length / 1024).toFixed(1);
156
+ config.logger.info(` ${font.family} subset: ${kb} KB (${font.fileName})`);
157
+ }
158
+ } else {
159
+ config.logger.warn(
160
+ "[robosophy-material-symbols] No Material Symbols icons detected in source. Add them via the include option."
161
+ );
162
+ }
163
+ }
115
164
  const css = buildMaterialSymbolsCss(
116
165
  usages,
117
166
  fonts,
118
167
  devMode,
119
168
  options.fontDisplay ?? defaultFontDisplay
120
169
  );
170
+ const cssHash = createHash("sha256").update(css).digest("hex").slice(0, 8);
171
+ const cssFileName = `rs-material-symbols-${cssHash}.css`;
121
172
  return {
122
173
  css,
123
- cssHref: devMode ? "/@robosophy-material-symbols/rs-material-symbols.css" : withBase(config.base, `${outputDir}/rs-material-symbols.css`),
174
+ cssHref: devMode ? "/@robosophy-material-symbols/rs-material-symbols.css" : withBase(config.base, `${outputDir}/${cssFileName}`),
175
+ cssFileName,
124
176
  fonts
125
177
  };
126
178
  }
@@ -168,38 +220,6 @@ function buildMaterialSymbolsCss(usages, fonts, devMode = false, fontDisplay = d
168
220
  "}"
169
221
  );
170
222
  }
171
- 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
- `.rs-icon--rounded { font-family: "${familyFontNames.rounded}"; }`,
200
- `.rs-icon--sharp { font-family: "${familyFontNames.sharp}"; }`,
201
- ".rs-icon--prime::before { content: var(--rs-icon-content); }"
202
- );
203
223
  const names = /* @__PURE__ */ new Set();
204
224
  for (const family of families) {
205
225
  for (const name of usages.get(family) ?? []) {
@@ -244,7 +264,22 @@ function injectMaterialSymbolsHtmlLinks(html, assets, options = {}) {
244
264
  return links.length === 0 ? html : html.replace("</head>", `${links.map((link) => ` ${link}`).join("\n")}
245
265
  </head>`);
246
266
  }
247
- async function generateFontAssets(usages, devMode, base, outputDir) {
267
+ async function loadFontSubsetFromCache(cacheDir, family, cacheKey) {
268
+ const cachePath = join(cacheDir, `${family}-${cacheKey}.woff2`);
269
+ try {
270
+ return await readFile(cachePath);
271
+ } catch {
272
+ return null;
273
+ }
274
+ }
275
+ async function saveFontSubsetToCache(cacheDir, family, cacheKey, subset) {
276
+ const cachePath = join(cacheDir, `${family}-${cacheKey}.woff2`);
277
+ try {
278
+ await writeFile(cachePath, subset);
279
+ } catch {
280
+ }
281
+ }
282
+ async function generateFontAssets(usages, devMode, base, outputDir, fontVariant, cacheDir) {
248
283
  const subsetFont = (await import("subset-font")).default;
249
284
  const fonts = [];
250
285
  for (const family of families) {
@@ -252,13 +287,31 @@ async function generateFontAssets(usages, devMode, base, outputDir) {
252
287
  if (names.length === 0) {
253
288
  continue;
254
289
  }
255
- const sourcePath = resolveFontPath(family);
290
+ const cacheKey = createHash("sha256").update(`${family}|${fontVariant}|${names.join(",")}`).digest("hex").slice(0, 12);
291
+ if (cacheDir) {
292
+ const cached = await loadFontSubsetFromCache(cacheDir, family, cacheKey);
293
+ if (cached) {
294
+ const contentHash2 = createHash("sha256").update(cached).digest("hex").slice(0, 8);
295
+ const fileName2 = `rs-material-symbols-${family}-${contentHash2}.woff2`;
296
+ fonts.push({
297
+ family,
298
+ fileName: fileName2,
299
+ href: fontHref(fileName2, devMode, base, outputDir),
300
+ source: cached
301
+ });
302
+ continue;
303
+ }
304
+ }
305
+ const sourcePath = resolveFontPath(family, fontVariant);
256
306
  const source = await readFile(sourcePath);
257
307
  const subset = await subsetFont(source, names.join(" "), {
258
308
  targetFormat: "woff2"
259
309
  });
260
- const hash = createHash("sha256").update(subset).digest("hex").slice(0, 8);
261
- const fileName = `rs-material-symbols-${family}-${hash}.woff2`;
310
+ const contentHash = createHash("sha256").update(subset).digest("hex").slice(0, 8);
311
+ const fileName = `rs-material-symbols-${family}-${contentHash}.woff2`;
312
+ if (cacheDir) {
313
+ await saveFontSubsetToCache(cacheDir, family, cacheKey, subset);
314
+ }
262
315
  fonts.push({
263
316
  family,
264
317
  fileName,
@@ -268,9 +321,9 @@ async function generateFontAssets(usages, devMode, base, outputDir) {
268
321
  }
269
322
  return fonts;
270
323
  }
271
- function resolveFontPath(family) {
324
+ function resolveFontPath(family, variant) {
272
325
  return require$1.resolve(
273
- `${familyPackages[family]}/files/material-symbols-${family}-latin-${familyFontVariants[family]}-normal.woff2`
326
+ `${familyPackages[family]}/files/material-symbols-${family}-latin-${variant}-normal.woff2`
274
327
  );
275
328
  }
276
329
  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 { mkdir, readFile, readdir, writeFile } 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);\nconst CACHE_BASE = join(\"node_modules\", \".cache\", \"robosophy-icons\");\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 cacheDir: string;\n let cachedAssets: GeneratedMaterialSymbolsAssets | null = null;\n let cachedUsagesKey = \"\";\n let needsRegeneration = true;\n\n function usageMapKey(usages: IconUsageMap): string {\n const parts: string[] = [];\n for (const family of families) {\n const names = [...(usages.get(family) ?? [])].sort();\n if (names.length > 0) {\n parts.push(`${family}:${names.join(\",\")}`);\n }\n }\n return parts.join(\"|\") || \"(empty)\";\n }\n\n async function getAssets(): Promise<GeneratedMaterialSymbolsAssets> {\n if (!needsRegeneration && cachedAssets) return cachedAssets;\n\n const usages = await collectMaterialSymbolUsages(config, options);\n const newKey = usageMapKey(usages);\n\n if (newKey === cachedUsagesKey && cachedAssets) {\n needsRegeneration = false;\n return cachedAssets;\n }\n\n if (config.command !== \"build\" && cachedUsagesKey !== \"\") {\n config.logger.info(\n \"[robosophy-material-symbols] icon usage changed, regenerating font subsets\",\n );\n }\n\n cachedUsagesKey = newKey;\n cachedAssets = await ensureGeneratedAssets(config, options, outputDir, fontVariant, cacheDir);\n needsRegeneration = false;\n return cachedAssets;\n }\n\n return {\n name: \"robosophy-material-symbols\",\n async configResolved(resolvedConfig) {\n config = resolvedConfig;\n cacheDir = join(config.root, CACHE_BASE);\n await mkdir(cacheDir, { recursive: true });\n },\n async buildStart() {\n if (config.command === \"serve\" || config.command === \"build\") {\n await getAssets();\n }\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 needsRegeneration = true;\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.setHeader(\"Cache-Control\", \"no-cache\");\n response.setHeader(\"ETag\", `\"${createHash(\"sha256\").update(assets.css).digest(\"hex\").slice(0, 12)}\"`);\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.setHeader(\"Cache-Control\", \"public, max-age=31536000, immutable\");\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}/${assets.cssFileName}`,\n name: assets.cssFileName,\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 cssFileName: string;\n fonts: GeneratedFontAsset[];\n};\n\nasync function ensureGeneratedAssets(\n config: ResolvedConfig,\n options: RobosophyMaterialSymbolsOptions,\n outputDir: string,\n fontVariant: string,\n cacheDir?: string,\n): Promise<GeneratedMaterialSymbolsAssets> {\n const devMode = config.command === \"serve\";\n const usages = await collectMaterialSymbolUsages(config, options);\n const fonts = await generateFontAssets(usages, devMode, config.base, outputDir, fontVariant, cacheDir);\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\n const css = buildMaterialSymbolsCss(\n usages,\n fonts,\n devMode,\n options.fontDisplay ?? defaultFontDisplay,\n );\n\n const cssHash = createHash(\"sha256\").update(css).digest(\"hex\").slice(0, 8);\n const cssFileName = `rs-material-symbols-${cssHash}.css`;\n\n return {\n css,\n cssHref: devMode\n ? \"/@robosophy-material-symbols/rs-material-symbols.css\"\n : withBase(config.base, `${outputDir}/${cssFileName}`),\n cssFileName,\n fonts,\n };\n}\n\nexport async function collectMaterialSymbolUsages(\n config: Pick<ResolvedConfig, \"root\">,\n options: RobosophyMaterialSymbolsOptions = {},\n): Promise<IconUsageMap> {\n const usages = createUsageMap();\n\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): string {\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 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): string {\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 loadFontSubsetFromCache(\n cacheDir: string,\n family: RsIconFamily,\n cacheKey: string,\n): Promise<Buffer | null> {\n const cachePath = join(cacheDir, `${family}-${cacheKey}.woff2`);\n try {\n return await readFile(cachePath);\n } catch {\n return null;\n }\n}\n\nasync function saveFontSubsetToCache(\n cacheDir: string,\n family: RsIconFamily,\n cacheKey: string,\n subset: Buffer,\n): Promise<void> {\n const cachePath = join(cacheDir, `${family}-${cacheKey}.woff2`);\n try {\n await writeFile(cachePath, subset);\n } catch {\n // Ignore cache write errors\n }\n}\n\nasync function generateFontAssets(\n usages: IconUsageMap,\n devMode: boolean,\n base: string,\n outputDir: string,\n fontVariant: string,\n cacheDir?: 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 cacheKey = createHash(\"sha256\")\n .update(`${family}|${fontVariant}|${names.join(\",\")}`)\n .digest(\"hex\")\n .slice(0, 12);\n\n // Try disk cache first\n if (cacheDir) {\n const cached = await loadFontSubsetFromCache(cacheDir, family, cacheKey);\n if (cached) {\n const contentHash = createHash(\"sha256\").update(cached).digest(\"hex\").slice(0, 8);\n const fileName = `rs-material-symbols-${family}-${contentHash}.woff2`;\n\n fonts.push({\n family,\n fileName,\n href: fontHref(fileName, devMode, base, outputDir),\n source: cached,\n });\n continue;\n }\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 contentHash = createHash(\"sha256\").update(subset).digest(\"hex\").slice(0, 8);\n const fileName = `rs-material-symbols-${family}-${contentHash}.woff2`;\n\n // Save to disk cache (keyed by input names, not content hash)\n if (cacheDir) {\n await saveFontSubsetToCache(cacheDir, family, cacheKey, subset);\n }\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): 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): string {\n return devMode\n ? `/@robosophy-material-symbols/${fileName}`\n : withBase(base, `${outputDir}/${fileName}`);\n}\n\nfunction formatHtmlLinkTag(tag: HtmlTagDescriptor): string {\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): string {\n return link.match(/\\bhref=\"([^\"]+)\"/)?.[1] ?? \"\";\n}\n\nfunction collectFromSource(source: string, usages: IconUsageMap): void {\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): Record<string, 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): string {\n return value.replace(/^['\"](.+)['\"]$/, \"$1\");\n}\n\nfunction addUsage(usages: IconUsageMap, icon: { family?: RsIconFamily; name: string }): void {\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): string {\n const cleanBase = base.endsWith(\"/\") ? base : `${base}/`;\n return `${cleanBase}${path}`.replaceAll(`${sep}`, \"/\");\n}\n\nexport function formatDetectedMaterialSymbols(usages: IconUsageMap): string {\n return families\n .map((family) => `${family}: ${[...(usages.get(family) ?? [])].sort().join(\", \")}`)\n .join(\"\\n\");\n}\n"],"names":["require","contentHash","fileName"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@robosophy/ui-vue",
3
- "version": "1.0.15",
3
+ "version": "1.0.17",
4
4
  "private": false,
5
5
  "license": "UNLICENSED",
6
6
  "homepage": "https://robosophy.gitlab.io/robosophy-basf/robosophy-library/",