bitboss-ui 3.0.0-beta.21 → 3.0.0-beta.22

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (183) hide show
  1. package/README.md +55 -3
  2. package/bin/bitboss-ui-mcp.mjs +419 -9
  3. package/bin/bitboss-ui.mjs +293 -22
  4. package/dist/ai/BbAccordion.md +21 -23
  5. package/dist/ai/BbAlert.md +6 -12
  6. package/dist/ai/BbAvatar.md +60 -24
  7. package/dist/ai/BbBadge.md +12 -20
  8. package/dist/ai/BbBaseButton.md +14 -16
  9. package/dist/ai/BbBaseCheckboxIcon.md +6 -10
  10. package/dist/ai/BbBaseRadioIcon.md +6 -10
  11. package/dist/ai/BbBaseSwitchIcon.md +5 -9
  12. package/dist/ai/BbBreadcrumbs.md +23 -34
  13. package/dist/ai/BbButton.md +35 -47
  14. package/dist/ai/BbCheckbox.md +21 -37
  15. package/dist/ai/BbCheckboxGroup.md +13 -13
  16. package/dist/ai/BbCollapsible.md +14 -26
  17. package/dist/ai/BbColorInput.md +13 -23
  18. package/dist/ai/BbColorPalette.md +23 -35
  19. package/dist/ai/BbConfirm.md +17 -32
  20. package/dist/ai/BbDatePickerInput.md +15 -21
  21. package/dist/ai/BbDialog.md +159 -62
  22. package/dist/ai/BbDropdown.md +21 -25
  23. package/dist/ai/BbDropdownButton.md +13 -30
  24. package/dist/ai/BbDropzone.md +9 -11
  25. package/dist/ai/BbIcon.md +44 -33
  26. package/dist/ai/BbIndicator.md +2 -2
  27. package/dist/ai/BbNumberInput.md +18 -20
  28. package/dist/ai/BbOffCanvas.md +42 -42
  29. package/dist/ai/BbPagination.md +21 -23
  30. package/dist/ai/BbPopover.md +15 -17
  31. package/dist/ai/BbProgress.md +40 -51
  32. package/dist/ai/BbRadio.md +9 -9
  33. package/dist/ai/BbRadioGroup.md +7 -11
  34. package/dist/ai/BbRating.md +8 -12
  35. package/dist/ai/BbSelect.md +32 -36
  36. package/dist/ai/BbSelectPopover.md +19 -31
  37. package/dist/ai/BbSlider.md +15 -19
  38. package/dist/ai/BbSmoothHeight.md +16 -31
  39. package/dist/ai/BbSpinner.md +118 -74
  40. package/dist/ai/BbSwitch.md +25 -18
  41. package/dist/ai/BbSwitchGroup.md +9 -14
  42. package/dist/ai/BbTable.md +102 -55
  43. package/dist/ai/BbTabs.md +59 -82
  44. package/dist/ai/BbTag.md +12 -23
  45. package/dist/ai/BbTextInput.md +20 -26
  46. package/dist/ai/BbTextarea.md +28 -34
  47. package/dist/ai/BbToast.md +14 -34
  48. package/dist/ai/BbTooltip.md +22 -20
  49. package/dist/ai/BbTree.md +46 -72
  50. package/dist/ai/changelog.json +169 -62
  51. package/dist/ai/components.json +1467 -9
  52. package/dist/ai/composables/useConfirm.md +5 -2
  53. package/dist/ai/composables/useToast.md +4 -2
  54. package/dist/ai/guides/agent-contract.md +7 -4
  55. package/dist/ai/guides/ai-router.md +37 -22
  56. package/dist/ai/guides/component-picker.md +23 -18
  57. package/dist/ai/guides/design-language.md +141 -13
  58. package/dist/ai/guides/design-tokens.md +29 -4
  59. package/dist/ai/guides/icons-policy.md +46 -21
  60. package/dist/ai/guides/installation-and-plugin-setup.md +253 -17
  61. package/dist/ai/guides/migration/components/bb-rating.md +26 -1
  62. package/dist/ai/guides/migration/components/bb-tooltip.md +18 -0
  63. package/dist/ai/guides/migration/v2-to-v3.md +50 -23
  64. package/dist/ai/index.md +1 -1
  65. package/dist/ai/recipes/inertia/approvals-inbox.md +3 -3
  66. package/dist/ai/recipes/inertia/inline-edit-workspace.md +2 -2
  67. package/dist/ai/recipes/inertia/onboarding.md +2 -2
  68. package/dist/ai/recipes/inertia/ownership-atlas.md +6 -6
  69. package/dist/ai/recipes/inertia/record-form.md +5 -5
  70. package/dist/ai/recipes/inertia/records-workspace.md +4 -4
  71. package/dist/ai/recipes/inertia/upload-center.md +6 -6
  72. package/dist/ai/recipes/inertia/wizard-form.md +5 -5
  73. package/dist/ai/recipes/nuxt/approvals-inbox.md +3 -3
  74. package/dist/ai/recipes/nuxt/inline-edit-workspace.md +2 -2
  75. package/dist/ai/recipes/nuxt/onboarding.md +2 -2
  76. package/dist/ai/recipes/nuxt/record-form.md +5 -5
  77. package/dist/ai/recipes/nuxt/records-workspace.md +4 -4
  78. package/dist/ai/recipes/nuxt/upload-center.md +6 -6
  79. package/dist/ai/recipes/nuxt/wizard-form.md +5 -5
  80. package/dist/ai/recipes/vue/approvals-inbox.md +3 -3
  81. package/dist/ai/recipes/vue/inline-edit-workspace.md +2 -2
  82. package/dist/ai/recipes/vue/onboarding.md +2 -2
  83. package/dist/ai/recipes/vue/record-form.md +10 -10
  84. package/dist/ai/recipes/vue/records-workspace.md +4 -4
  85. package/dist/ai/recipes/vue/upload-center.md +6 -6
  86. package/dist/ai/recipes/vue/wizard-form.md +5 -5
  87. package/dist/ai/source/BbBadge.md +1 -1
  88. package/dist/ai/source/BbBaseCheckbox.md +1 -1
  89. package/dist/ai/source/BbBaseDatePicker.md +5 -5
  90. package/dist/ai/source/BbBaseDatePickerInput.md +2 -2
  91. package/dist/ai/source/BbBaseRadio.md +1 -1
  92. package/dist/ai/source/BbBaseRating.md +5 -5
  93. package/dist/ai/source/BbBaseSelect.md +1 -1
  94. package/dist/ai/source/BbBaseSlider.md +5 -5
  95. package/dist/ai/source/BbBaseSwitch.md +1 -1
  96. package/dist/ai/source/BbBaseTimePickerInput.md +1 -1
  97. package/dist/ai/source/BbBreadcrumbs.md +20 -1
  98. package/dist/ai/source/BbButton.md +2 -2
  99. package/dist/ai/source/BbDialog.md +39 -8
  100. package/dist/ai/source/BbDropdown.md +1 -1
  101. package/dist/ai/source/BbDropzone.md +5 -5
  102. package/dist/ai/source/BbIcon.md +23 -10
  103. package/dist/ai/source/BbOffCanvas.md +50 -28
  104. package/dist/ai/source/BbPagination.md +2 -2
  105. package/dist/ai/source/BbPopover.md +12 -1
  106. package/dist/ai/source/BbSelectPopover.md +45 -7
  107. package/dist/ai/source/BbSpinner.md +2 -2
  108. package/dist/ai/source/BbTable.md +11 -11
  109. package/dist/ai/source/BbTooltip.md +57 -10
  110. package/dist/ai/source/ChipsBox.md +1 -1
  111. package/dist/ai/source/CommaBox.md +1 -1
  112. package/dist/ai/source/GuidesComponent.md +14 -7
  113. package/dist/ai/source/OptionsContainer.md +1 -1
  114. package/dist/components/BbBadge/BadgeBodyContent.vue_vue_type_script_setup_true_lang.js +1 -1
  115. package/dist/components/BbBadge/BbBadge.vue_vue_type_script_setup_true_lang.js +1 -1
  116. package/dist/components/BbBaseCheckbox/BbBaseCheckbox.vue_vue_type_script_setup_true_lang.js +1 -1
  117. package/dist/components/BbBaseDatePicker/BbBaseDatePicker.vue_vue_type_script_setup_true_lang.js +4 -4
  118. package/dist/components/BbBaseDatePicker/BbBaseDatePickerInputDaySelector.vue_vue_type_script_setup_true_lang.js +1 -1
  119. package/dist/components/BbBaseDatePickerInput/BbBaseDatePickerInput.vue_vue_type_script_setup_true_lang.js +1 -1
  120. package/dist/components/BbBaseInputContainer/BbBaseInputContainer.vue.d.ts +1 -1
  121. package/dist/components/BbBaseRadio/BbBaseRadio.vue_vue_type_script_setup_true_lang.js +1 -1
  122. package/dist/components/BbBaseRating/BbBaseRating.vue_vue_type_script_setup_true_lang.js +3 -3
  123. package/dist/components/BbBaseSelect/BbBaseSelect.vue_vue_type_script_setup_true_lang.js +1 -1
  124. package/dist/components/BbBaseSlider/BbBaseSlider.vue_vue_type_script_setup_true_lang.js +3 -3
  125. package/dist/components/BbBaseSwitch/BbBaseSwitch.vue_vue_type_script_setup_true_lang.js +1 -1
  126. package/dist/components/BbBaseTimePickerInput/BbBaseTimePickerInput.vue_vue_type_script_setup_true_lang.js +1 -1
  127. package/dist/components/BbBreadcrumbs/BbBreadcrumbs.vue_vue_type_script_setup_true_lang.js +71 -71
  128. package/dist/components/BbButton/BbButton.vue_vue_type_script_setup_true_lang.js +2 -2
  129. package/dist/components/BbDialog/BbDialog.vue_vue_type_script_setup_true_lang.js +102 -97
  130. package/dist/components/BbDropdown/AdaptiveDropdown.vue_vue_type_script_setup_true_lang.js +1 -1
  131. package/dist/components/BbDropdown/BbDropdown.vue_vue_type_script_setup_true_lang.js +58 -58
  132. package/dist/components/BbDropzone/BbDropzone.vue_vue_type_script_setup_true_lang.js +2 -2
  133. package/dist/components/BbIcon/BbIcon.vue_vue_type_script_setup_true_lang.js +33 -35
  134. package/dist/components/BbIcon/iconCache.d.ts +30 -0
  135. package/dist/components/BbIcon/iconCache.js +21 -3
  136. package/dist/components/BbOffCanvas/BbOffCanvas.vue_vue_type_script_setup_true_lang.js +57 -56
  137. package/dist/components/BbPagination/BbPagination.vue_vue_type_script_setup_true_lang.js +2 -2
  138. package/dist/components/BbPopover/BbPopover.vue_vue_type_script_setup_true_lang.js +138 -138
  139. package/dist/components/BbSelectPopover/BbSelectPopover.vue_vue_type_script_setup_true_lang.js +43 -43
  140. package/dist/components/BbSpinner/BbSpinner.vue_vue_type_script_setup_true_lang.js +1 -1
  141. package/dist/components/BbSpinner/types.d.ts +1 -1
  142. package/dist/components/BbTable/BbTable.vue_vue_type_script_setup_true_lang.js +8 -8
  143. package/dist/components/BbTable/BbTableDataRow.js +2 -2
  144. package/dist/components/BbToast/BbToastRegion.vue_vue_type_script_setup_true_lang.js +62 -62
  145. package/dist/components/BbTooltip/BbTooltip.vue_vue_type_script_setup_true_lang.js +81 -78
  146. package/dist/components/BbTooltip/types.d.ts +8 -1
  147. package/dist/components/ChipsBox/ChipsBox.vue_vue_type_script_setup_true_lang.js +1 -1
  148. package/dist/components/CommaBox/CommaBox.vue_vue_type_script_setup_true_lang.js +1 -1
  149. package/dist/components/OptionsContainer/OptionsContainer.vue_vue_type_script_setup_true_lang.js +1 -1
  150. package/dist/composables/useConfirm.d.ts +22 -0
  151. package/dist/composables/useConfirm.js +43 -40
  152. package/dist/composables/useSafeAreaInternal.js +1 -1
  153. package/dist/composables/useToast.d.ts +16 -0
  154. package/dist/composables/useToast.js +20 -16
  155. package/dist/composables/useViewportWidth.d.ts +20 -6
  156. package/dist/composables/useViewportWidth.js +8 -7
  157. package/dist/icon-scan.d.ts +276 -0
  158. package/dist/icon-scan.js +485 -0
  159. package/dist/icons-whitelist.d.ts +5 -4
  160. package/dist/llms-full.txt +1979 -1527
  161. package/dist/llms-medium.txt +461 -74
  162. package/dist/llms.txt +1 -1
  163. package/dist/nuxt.js +10 -7
  164. package/dist/plugin.js +1 -0
  165. package/dist/runtime/nuxt-plugin.js +2 -1
  166. package/dist/styles.css +1 -1
  167. package/dist/types/Config.d.ts +18 -0
  168. package/dist/utils/cssLayers.d.ts +91 -0
  169. package/dist/utils/cssLayers.js +43 -0
  170. package/dist/utils/injectLibraryStyles.d.ts +3 -1
  171. package/dist/utils/injectLibraryStyles.js +24 -23
  172. package/dist/vite-plugin.d.ts +74 -11
  173. package/dist/vite.js +292 -253
  174. package/llms.txt +1 -1
  175. package/package.json +7 -5
  176. package/scripts/lib/ensure-manifest.mjs +28 -5
  177. package/scripts/lib/eslint-plugin.d.ts +35 -0
  178. package/scripts/lib/eslint-plugin.mjs +299 -3
  179. package/scripts/lib/hand-roll-hints.mjs +50 -6
  180. package/scripts/lib/html-attributes.mjs +42 -0
  181. package/scripts/lib/mcp-config.mjs +38 -34
  182. package/scripts/lib/public-type-exports.mjs +246 -0
  183. package/scripts/lib/validate-bb-markup.mjs +205 -12
package/dist/vite.js CHANGED
@@ -1,167 +1,148 @@
1
- import { BUILTIN_LOCALE_KEYS as e } from "./i18n/index.js";
2
- import { existsSync as t, mkdirSync as n, readFileSync as r, readdirSync as i, writeFileSync as a } from "node:fs";
3
- import { readFile as o, stat as s } from "node:fs/promises";
4
- import { basename as c, dirname as l, join as u, relative as d, resolve as f } from "node:path";
5
- import { fileURLToPath as p } from "node:url";
6
- import { createRequire as m } from "node:module";
7
- import { convertParsedSVG as h, getIconData as g, iconToHTML as _, iconToSVG as v, parseSVGContent as y, stringToIcon as b } from "@iconify/utils";
1
+ import { BB_LAYERS as e, TAILWIND_V4_LAYERS as t, validateCssLayers as n } from "./utils/cssLayers.js";
2
+ import { DEFAULT_MAX_FILE_SIZE as r, IconScanner as i, extractIconCandidates as a, globToRegExp as o, hasGlobMagic as s, iconLiteralRegExp as c, iconScanCacheFile as l } from "./icon-scan.js";
3
+ import { BUILTIN_LOCALE_KEYS as u } from "./i18n/index.js";
4
+ import { existsSync as d, mkdirSync as f, readFileSync as p, readdirSync as m, writeFileSync as h } from "node:fs";
5
+ import { basename as g, dirname as _, join as v, relative as ee, resolve as y } from "node:path";
6
+ import { fileURLToPath as b } from "node:url";
7
+ import { createRequire as x } from "node:module";
8
+ import { convertParsedSVG as S, getIconData as C, iconToHTML as te, iconToSVG as w, parseSVGContent as T, stringToIcon as ne } from "@iconify/utils";
8
9
  //#region src/vite-plugin.ts
9
- function x(e, i) {
10
- t(e) && r(e, "utf-8") === i || (n(l(e), { recursive: !0 }), a(e, i, "utf-8"));
10
+ function E(e, t) {
11
+ d(e) && p(e, "utf-8") === t || (f(_(e), { recursive: !0 }), h(e, t, "utf-8"));
11
12
  }
12
- function ee(e) {
13
- let t = v(e, {
13
+ function re(e) {
14
+ let t = w(e, {
14
15
  width: "unset",
15
16
  height: "unset"
16
17
  });
17
- return _(t.body, t.attributes);
18
+ return te(t.body, t.attributes);
18
19
  }
19
- function S(e, t) {
20
+ function D(e, t) {
20
21
  try {
21
- let n = m(u(e, "package.json"));
22
- return JSON.parse(r(n.resolve(`${t}/icons.json`), "utf-8"));
22
+ let n = x(v(e, "package.json"));
23
+ return JSON.parse(p(n.resolve(`${t}/icons.json`), "utf-8"));
23
24
  } catch {
24
25
  return null;
25
26
  }
26
27
  }
27
- function te(e, t) {
28
+ function ie(e, t) {
28
29
  return e !== "heroicons" || !/-(?:20|16)-/.test(t);
29
30
  }
30
- function ne(e) {
31
- let n = f(e);
31
+ function O(e) {
32
+ let t = y(e);
32
33
  for (;;) {
33
- let e = u(n, "node_modules", "@iconify-json");
34
- if (t(e)) return e;
35
- let r = l(n);
36
- if (r === n) return null;
37
- n = r;
34
+ let e = v(t, "node_modules", "@iconify-json");
35
+ if (d(e)) return e;
36
+ let n = _(t);
37
+ if (n === t) return null;
38
+ t = n;
38
39
  }
39
40
  }
40
- function re(e) {
41
+ function ae(e) {
41
42
  try {
42
- let t = ne(e);
43
+ let t = O(e);
43
44
  if (!t) return [];
44
- let n = l(l(t));
45
- return i(t, { encoding: "utf-8" }).flatMap((t) => {
46
- let r = S(n, `@iconify-json/${t}`) ?? S(e, `@iconify-json/${t}`);
45
+ let n = _(_(t));
46
+ return m(t, { encoding: "utf-8" }).flatMap((t) => {
47
+ let r = D(n, `@iconify-json/${t}`) ?? D(e, `@iconify-json/${t}`);
47
48
  return r ? [r] : [];
48
49
  });
49
50
  } catch {
50
51
  return [];
51
52
  }
52
53
  }
53
- function ie(e) {
54
+ function oe(e) {
54
55
  try {
55
- let t = m(u(e, "package.json")), n = JSON.parse(r(t.resolve("@iconify/collections/collections.json"), "utf-8"));
56
+ let t = x(v(e, "package.json")), n = JSON.parse(p(t.resolve("@iconify/collections/collections.json"), "utf-8"));
56
57
  return new Set(Object.keys(n));
57
58
  } catch {
58
59
  return /* @__PURE__ */ new Set();
59
60
  }
60
61
  }
61
- var C = 3, ae = /\.(vue|tsx?|jsx?)$/, oe = /\.(test|spec|stories|story)\./, se = /* @__PURE__ */ new Set([
62
- "node_modules",
63
- "dist",
64
- "public",
65
- "coverage",
66
- "vendor",
67
- "storage"
68
- ]);
69
- function w(e) {
70
- let t = [], n = (e, r) => {
71
- let a;
72
- try {
73
- a = i(e, { withFileTypes: !0 });
74
- } catch {
75
- return;
62
+ var se = "(key, loaded, known, all, ip) => {\n const c = key.indexOf(':'); const p = key.slice(0, c); const n = key.slice(c + 1);\n if (p === 'local' || !/^[a-z][a-z0-9-]*$/.test(p) || !/^[a-z0-9][a-z0-9-]*$/.test(n)) return null;\n const installed = loaded.size ? `installed sets: ${[...loaded].join(', ')}` : 'no @iconify-json/* set is installed';\n const fix = `If the name is composed at runtime or comes from a database, add it to the plugin's \\`iconWhitelist\\``;\n if (loaded.has(p)) {\n const set = all(p);\n if (set && set.includes(n)) return `[bitboss-ui] icon \"${key}\" exists in the ${p} icon set but is not bundled: no scanned source file contains the literal \"${key}\" and it is not in \\`iconWhitelist\\`. Write it as a literal, or — if the name is composed at runtime or comes from a database — add it to the plugin's \\`iconWhitelist\\`.`;\n const names = set ?? known(p);\n const sq = n.replace(/-/g, '');\n const sug = names.find((x) => x.replace(/-/g, '') === sq) ?? (n.length >= 3 ? names.find((x) => x.includes(n) || (x.length >= 3 && n.includes(x))) : undefined);\n const hint = sug ? ` — did you mean \"${p}:${sug}\"?` : '';\n if (set) return `[bitboss-ui] icon \"${key}\" does not exist in the ${p} icon set${hint}`;\n return `[bitboss-ui] icon \"${key}\" is not bundled: it is not among the ${p} names found as literals in scanned source, nor in \\`iconWhitelist\\`${hint}. ${fix}; if it is a typo, fix the name.`;\n }\n const pkg = `@iconify-json/${p}`; const cmd = `run: npm install -D ${pkg}`;\n if (ip.has(p)) return `[bitboss-ui] \"${key}\" requires \"${pkg}\" — ${cmd} (${installed})`;\n if (ip.size) return `[bitboss-ui] \"${key}\" — \"${p}\" is neither an installed icon set nor a known Iconify prefix (${installed})`;\n return `[bitboss-ui] \"${key}\" — no installed icon set has the prefix \"${p}\" (${installed}). If \"${p}\" is an Iconify set, ${cmd}`;\n}", k = Function(`return ${se};`)();
63
+ function A(e, t) {
64
+ return [...Object.keys(e.icons), ...Object.keys(e.aliases ?? {})].filter((n) => (!t || t(n)) && C(e, n) !== null);
65
+ }
66
+ function j(e, t, n, r) {
67
+ let i = /* @__PURE__ */ new Set(), a = [], c = new Set(t.keys()), l = /* @__PURE__ */ new Map(), u = (e) => {
68
+ let r = l.get(e);
69
+ if (!r) {
70
+ let i = t.get(e);
71
+ r = i ? A(i, n.get(e)) : [], l.set(e, r);
72
+ }
73
+ return r;
74
+ };
75
+ for (let l of e) {
76
+ let e = l.trim(), d = e.indexOf(":"), f = d === -1 ? "" : e.slice(0, d), p = e.slice(d + 1);
77
+ if (d === -1 || !f || !p) {
78
+ a.push(`[bitboss-ui] iconWhitelist entry "${l}" is not a \`prefix:name\` icon name`);
79
+ continue;
76
80
  }
77
- for (let i of a) {
78
- let a = r ? `${r}/${i.name}` : i.name;
79
- if (!i.name.startsWith(".")) {
80
- if (i.isDirectory()) {
81
- if (se.has(i.name)) continue;
82
- n(u(e, i.name), a);
83
- continue;
84
- }
85
- ae.test(i.name) && (i.name.endsWith(".d.ts") || oe.test(i.name) || t.push(a));
81
+ if (f === "local") {
82
+ a.push(`[bitboss-ui] iconWhitelist entry "${l}" every \`local:\` icon in iconDir is always bundled; the whitelist is for provider icons only`);
83
+ continue;
84
+ }
85
+ if (!c.has(f)) {
86
+ a.push(k(e, c, u, (e) => c.has(e) ? u(e) : null, new Set(r)) ?? `[bitboss-ui] iconWhitelist entry "${l}" does not resolve`);
87
+ continue;
88
+ }
89
+ if (s(p)) {
90
+ let t = o(p), n = u(f).filter((e) => t.test(e));
91
+ if (n.length === 0) {
92
+ a.push(`[bitboss-ui] iconWhitelist glob "${e}" matches no icon in the ${f} icon set`);
93
+ continue;
86
94
  }
95
+ for (let e of n) i.add(`${f}:${e}`);
96
+ continue;
87
97
  }
98
+ let m = t.get(f), h = n.get(f);
99
+ if (C(m, p) && (!h || h(p))) {
100
+ i.add(e);
101
+ continue;
102
+ }
103
+ a.push(k(e, c, u, u, new Set(r)) ?? `[bitboss-ui] iconWhitelist entry "${l}" does not resolve`);
104
+ }
105
+ return {
106
+ icons: [...i],
107
+ errors: a
88
108
  };
89
- return n(e, ""), t;
90
109
  }
91
- async function ce(e, t, i, c) {
92
- let d = Array.from(i.keys());
93
- if (d.length === 0) return /* @__PURE__ */ new Set();
94
- let f = d.map((e) => `${e}:[a-z0-9][a-z0-9-]*`).join("|"), p = RegExp(`['"\`](${f})['"\`]`, "g"), m;
110
+ function ce(e) {
95
111
  try {
96
- m = w(e);
112
+ return JSON.parse(p(v(e, "..", "package.json"), "utf-8")).version ?? "0";
97
113
  } catch {
98
- return /* @__PURE__ */ new Set();
114
+ return "0";
99
115
  }
100
- let h = u(e, "node_modules/.cache/bitboss-ui/icon-scan.json"), _ = {
101
- version: C,
102
- configKey: t,
103
- entries: {}
104
- };
105
- try {
106
- let e = JSON.parse(r(h, "utf-8"));
107
- e.version === C && e.configKey === t && (_ = e);
108
- } catch {}
109
- let v = await Promise.all(m.map(async (t) => {
110
- try {
111
- let { mtimeMs: n } = await s(u(e, t)), r = _.entries[t];
112
- if (r?.mtime === n) return r.icons;
113
- let a = await o(u(e, t), "utf-8"), l = [];
114
- for (let e of a.matchAll(p)) {
115
- let t = e[1], n = b(t);
116
- if (!n) continue;
117
- let { prefix: r, name: a } = n, o = c.get(r), s = i.get(r);
118
- s && g(s, a) && (!o || o(a)) && l.push(t);
119
- }
120
- return _.entries[t] = {
121
- mtime: n,
122
- icons: l
123
- }, l;
124
- } catch {
125
- return [];
126
- }
127
- })), y = new Set(m);
128
- for (let e of Object.keys(_.entries)) y.has(e) || delete _.entries[e];
129
- try {
130
- n(l(h), { recursive: !0 }), a(h, JSON.stringify(_), "utf-8");
131
- } catch {}
132
- let x = /* @__PURE__ */ new Set();
133
- for (let e of v) for (let t of e) x.add(t);
134
- return x;
135
116
  }
136
- var T = l(p(import.meta.url)), E = T.includes("node_modules"), le = u(T, "button-variants.d.ts"), ue = u(T, "alert-variants.d.ts"), de = u(T, "badge-variants.d.ts"), fe = u(T, "confirm-variants.d.ts"), pe = u(T, "dropdown-item-variants.d.ts"), me = u(T, "tooltip-variants.d.ts"), he = u(T, "toast-variants.d.ts"), ge = u(T, "indicator-variants.d.ts"), _e = u(T, "locale-registry.d.ts"), ve = E ? "bitboss-ui" : "./types/ButtonVariant", ye = E ? "bitboss-ui" : "./types/AlertVariant", be = E ? "bitboss-ui" : "./types/BadgeVariant", xe = E ? "bitboss-ui" : "./types/ConfirmVariant", Se = E ? "bitboss-ui" : "./types/DropdownItemVariant", Ce = E ? "bitboss-ui" : "./types/TooltipVariant", we = E ? "bitboss-ui" : "./types/ToastVariant", Te = E ? "bitboss-ui" : "./types/IndicatorVariant", Ee = E ? "bitboss-ui" : "./i18n", De = u(T, "i18n", "locales"), D = {
117
+ var M = _(b(import.meta.url)), N = M.includes("node_modules"), le = v(M, "button-variants.d.ts"), ue = v(M, "alert-variants.d.ts"), de = v(M, "badge-variants.d.ts"), fe = v(M, "confirm-variants.d.ts"), pe = v(M, "dropdown-item-variants.d.ts"), me = v(M, "tooltip-variants.d.ts"), he = v(M, "toast-variants.d.ts"), ge = v(M, "indicator-variants.d.ts"), _e = v(M, "locale-registry.d.ts"), ve = N ? "bitboss-ui" : "./types/ButtonVariant", ye = N ? "bitboss-ui" : "./types/AlertVariant", be = N ? "bitboss-ui" : "./types/BadgeVariant", xe = N ? "bitboss-ui" : "./types/ConfirmVariant", Se = N ? "bitboss-ui" : "./types/DropdownItemVariant", Ce = N ? "bitboss-ui" : "./types/TooltipVariant", we = N ? "bitboss-ui" : "./types/ToastVariant", Te = N ? "bitboss-ui" : "./types/IndicatorVariant", Ee = N ? "bitboss-ui" : "./i18n", De = v(M, "i18n", "locales"), P = {
137
118
  pt: "pt-br",
138
119
  en: null
139
120
  };
140
- function O(t) {
141
- let n = e, r = t.customLocaleKeys ?? [], i = t.locale && n.includes(t.locale) ? t.locale : t.locale && r.includes(t.locale) ? "en" : "it", a = [], o = /* @__PURE__ */ new Set([i, "en"]);
142
- for (let e of t.enabledLocales ?? []) n.includes(e) ? o.add(e) : r.includes(e) || a.push(`[bitboss-ui] \`enabledLocales\` entry '${e}' is not a built-in locale — ignored.`);
121
+ function F(e) {
122
+ let t = u, n = e.customLocaleKeys ?? [], r = e.locale && t.includes(e.locale) ? e.locale : e.locale && n.includes(e.locale) ? "en" : "it", i = [], a = /* @__PURE__ */ new Set([r, "en"]);
123
+ for (let r of e.enabledLocales ?? []) t.includes(r) ? a.add(r) : n.includes(r) || i.push(`[bitboss-ui] \`enabledLocales\` entry '${r}' is not a built-in locale — ignored.`);
143
124
  return {
144
- enabled: [...o].sort(),
145
- defaultLocale: i,
146
- warnings: a
125
+ enabled: [...a].sort(),
126
+ defaultLocale: r,
127
+ warnings: i
147
128
  };
148
129
  }
149
- function k(e) {
130
+ function I(e) {
150
131
  let t = [];
151
132
  for (let n of e) {
152
- let e = r(u(De, `${n}.json`), "utf-8");
133
+ let e = p(v(De, `${n}.json`), "utf-8");
153
134
  t.push(`\t${JSON.stringify(n)}: ${e.trim()},`);
154
135
  }
155
136
  return `export const locales = {\n${t.join("\n")}\n};\n`;
156
137
  }
157
- function A(e, t) {
138
+ function L(e, t) {
158
139
  let n = e.map((e) => `\t\t${JSON.stringify(e)}: true;`).join("\n");
159
140
  return Ve + `\nimport ${JSON.stringify(t)};\n\ndeclare module ${JSON.stringify(t)} {\n\tinterface LocaleRegistry {\n` + (n ? `${n}\n` : "") + " }\n}\n";
160
141
  }
161
- function j(e) {
162
- let t = m(import.meta.url), n = [], r = [];
142
+ function R(e) {
143
+ let t = x(import.meta.url), n = [], r = [];
163
144
  for (let i of e) {
164
- let e = i in D ? D[i] : i;
145
+ let e = i in P ? P[i] : i;
165
146
  if (e !== null) try {
166
147
  t.resolve(`dayjs/locale/${e}.js`), n.push({
167
148
  key: i,
@@ -176,27 +157,27 @@ function j(e) {
176
157
  missing: r
177
158
  };
178
159
  }
179
- function M(e) {
160
+ function z(e) {
180
161
  return `${e.map(({ pack: e }, t) => `import l${t} from ${JSON.stringify(`dayjs/locale/${e}`)};`).join("\n")}\nexport const dayjsLocales = {\n${e.map(({ key: e }, t) => `\t${JSON.stringify(e)}: l${t},`).join("\n")}\n};\n`;
181
162
  }
182
- var N = "@inertiajs/vue3", Oe = [
163
+ var B = "@inertiajs/vue3", Oe = [
183
164
  "dependencies",
184
165
  "devDependencies",
185
166
  "peerDependencies",
186
167
  "optionalDependencies"
187
168
  ];
188
169
  function ke(e) {
189
- let n = f(e);
170
+ let t = y(e);
190
171
  for (;;) {
191
- let e = u(n, "package.json");
192
- if (t(e)) try {
193
- return JSON.parse(r(e, "utf-8"));
172
+ let e = v(t, "package.json");
173
+ if (d(e)) try {
174
+ return JSON.parse(p(e, "utf-8"));
194
175
  } catch {
195
176
  return null;
196
177
  }
197
- let i = l(n);
198
- if (i === n) return null;
199
- n = i;
178
+ let n = _(t);
179
+ if (n === t) return null;
180
+ t = n;
200
181
  }
201
182
  }
202
183
  function Ae(e, t) {
@@ -205,20 +186,20 @@ function Ae(e, t) {
205
186
  return typeof r == "object" && !!r && t in r;
206
187
  });
207
188
  }
208
- function je(e, n) {
209
- let r = n.split("/"), i = f(e);
189
+ function je(e, t) {
190
+ let n = t.split("/"), r = y(e);
210
191
  for (;;) {
211
- if (t(u(i, "node_modules", ...r))) return !0;
212
- let e = l(i);
213
- if (e === i) return !1;
214
- i = e;
192
+ if (d(v(r, "node_modules", ...n))) return !0;
193
+ let e = _(r);
194
+ if (e === r) return !1;
195
+ r = e;
215
196
  }
216
197
  }
217
- function P(e) {
198
+ function V(e) {
218
199
  let t = ke(e);
219
- return !t || !Ae(t, N) ? !1 : je(e, N);
200
+ return !t || !Ae(t, B) ? !1 : je(e, B);
220
201
  }
221
- function F(e) {
202
+ function H(e) {
222
203
  return e ? "export { Link as InertiaLink } from '@inertiajs/vue3';\n" : "export const InertiaLink = null;\n";
223
204
  }
224
205
  var Me = [
@@ -256,7 +237,7 @@ function Be(e, t) {
256
237
  return [.../* @__PURE__ */ new Set([...e, ...n])];
257
238
  }
258
239
  var Ve = "// Auto-generated by bitboss-ui — do not edit manually.\n//\n// SCOPE: this file mirrors the plugin config of the project that LAST ran\n// the bitboss-ui plugin in this folder — it is regenerated by every build,\n// dev server, or test process that loads the plugin. It is authoritative\n// for THAT project only. Another project's registry is whatever its own\n// plugin config declares (e.g. bitbossUi({ badgeVariants: [...] })) — do\n// not read names out of a different checkout's copy of this file.\n";
259
- function I(e, t, n) {
240
+ function U(e, t, n) {
260
241
  let r = e.map((e) => `\t\t${JSON.stringify(e)}: never;`).join("\n");
261
242
  return `// Auto-generated by bitboss-ui — do not edit manually.
262
243
  //
@@ -269,7 +250,7 @@ function I(e, t, n) {
269
250
 
270
251
  import ${JSON.stringify(t)};\n\ndeclare module ${JSON.stringify(t)} {\n\tinterface ${n} {\n` + (r ? `${r}\n` : "") + " }\n}\n";
271
252
  }
272
- var L = [
253
+ var W = [
273
254
  "@floating-ui/vue",
274
255
  "@tanstack/vue-virtual",
275
256
  "@vueuse/core",
@@ -284,32 +265,32 @@ var L = [
284
265
  "maska/vue",
285
266
  "mime",
286
267
  "object-code"
287
- ], R = ["bitboss-ui"], He = N, Ue = "virtual:bitboss-ui/icons", z = "\0virtual:bitboss-ui/icons", We = "virtual:bitboss-ui/config", B = "\0virtual:bitboss-ui/config", Ge = "virtual:bitboss-ui/dayjs-locales", V = "\0virtual:bitboss-ui/dayjs-locales", Ke = "virtual:bitboss-ui/locales", H = "\0virtual:bitboss-ui/locales", qe = "virtual:bitboss-ui/styles", U = "\0virtual:bitboss-ui/styles", Je = "virtual:bitboss-ui/link", W = "\0virtual:bitboss-ui/link";
288
- function Ye() {
289
- let e = u(T, "styles.css");
290
- return t(e) ? r(e, "utf-8") : ["main.css", "variables.css"].map((e) => {
291
- let n = u(T, "assets/css", e);
292
- return t(n) ? r(n, "utf-8") : "";
268
+ ], G = ["bitboss-ui"], He = B, Ue = "virtual:bitboss-ui/icons", K = "\0virtual:bitboss-ui/icons", We = "virtual:bitboss-ui/config", q = "\0virtual:bitboss-ui/config", Ge = "virtual:bitboss-ui/dayjs-locales", J = "\0virtual:bitboss-ui/dayjs-locales", Ke = "virtual:bitboss-ui/locales", Y = "\0virtual:bitboss-ui/locales", qe = "virtual:bitboss-ui/styles", X = "\0virtual:bitboss-ui/styles", Je = "virtual:bitboss-ui/link", Ye = "\0virtual:bitboss-ui/link";
269
+ function Xe() {
270
+ let e = v(M, "styles.css");
271
+ return d(e) ? p(e, "utf-8") : ["main.css", "variables.css"].map((e) => {
272
+ let t = v(M, "assets/css", e);
273
+ return d(t) ? p(t, "utf-8") : "";
293
274
  }).join("\n");
294
275
  }
295
- var Xe = "local";
296
- function Ze(e) {
276
+ var Ze = "local";
277
+ function Qe(e) {
297
278
  let t = {};
298
279
  try {
299
- let n = i(e, {
280
+ let n = m(e, {
300
281
  recursive: !0,
301
282
  encoding: "utf-8"
302
283
  }).filter((e) => e.endsWith(".svg"));
303
- for (let i of n) {
304
- let n = c(i, ".svg");
284
+ for (let r of n) {
285
+ let n = g(r, ".svg");
305
286
  try {
306
- let a = y(r(u(e, i), "utf-8")), o = a && h(a);
307
- o && (t[n] = o);
287
+ let i = T(p(v(e, r), "utf-8")), a = i && S(i);
288
+ a && (t[n] = a);
308
289
  } catch {}
309
290
  }
310
291
  } catch {}
311
292
  return {
312
- prefix: Xe,
293
+ prefix: Ze,
313
294
  info: {
314
295
  name: "Local",
315
296
  author: { name: "Icons automatically inferred from the icons installed locally" },
@@ -318,12 +299,12 @@ function Ze(e) {
318
299
  icons: t
319
300
  };
320
301
  }
321
- var G = "./node_modules/.bitboss-ui/local-icons.json", K = "iconify.customCollectionJsonPaths";
322
- function q(e, t) {
323
- let r = u(t, "node_modules", ".bitboss-ui");
324
- n(r, { recursive: !0 }), a(u(r, "local-icons.json"), JSON.stringify(Ze(e)), "utf-8");
302
+ var Z = "./node_modules/.bitboss-ui/local-icons.json", Q = "iconify.customCollectionJsonPaths";
303
+ function $e(e, t) {
304
+ let n = v(t, "node_modules", ".bitboss-ui");
305
+ f(n, { recursive: !0 }), h(v(n, "local-icons.json"), JSON.stringify(Qe(e)), "utf-8");
325
306
  }
326
- function J(e) {
307
+ function et(e) {
327
308
  let t = "", n = !1, r = !1, i = !1;
328
309
  for (let a = 0; a < e.length; a++) {
329
310
  let o = e[a], s = e[a + 1];
@@ -355,8 +336,8 @@ function J(e) {
355
336
  }
356
337
  return t;
357
338
  }
358
- var Y = (e) => e === " " || e === " " || e === "\n" || e === "\r";
359
- function X(e, t) {
339
+ var $ = (e) => e === " " || e === " " || e === "\n" || e === "\r";
340
+ function tt(e, t) {
360
341
  let n = !1, r = !1;
361
342
  for (let i = t; i < e.length; i++) {
362
343
  let t = e[i], a = e[i + 1];
@@ -376,11 +357,11 @@ function X(e, t) {
376
357
  r = !0, i++;
377
358
  continue;
378
359
  }
379
- if (!Y(t)) return i;
360
+ if (!$(t)) return i;
380
361
  }
381
362
  return -1;
382
363
  }
383
- function Qe(e, t) {
364
+ function nt(e, t) {
384
365
  let n = !1, r = !1, i = !1, a = -1, o = 0, s = null;
385
366
  for (let c = 0; c < e.length; c++) {
386
367
  let l = e[c], u = e[c + 1];
@@ -412,19 +393,19 @@ function Qe(e, t) {
412
393
  i = !0, a = c;
413
394
  continue;
414
395
  }
415
- if (!Y(l)) {
396
+ if (!$(l)) {
416
397
  if (l === ":" && s !== null) {
417
398
  let n = s === t;
418
399
  if (s = null, !n) continue;
419
- let r = X(e, c + 1);
420
- return r === -1 || e[r] !== "[" ? null : $e(e, r);
400
+ let r = tt(e, c + 1);
401
+ return r === -1 || e[r] !== "[" ? null : rt(e, r);
421
402
  }
422
403
  s = null, l === "{" || l === "[" ? o++ : (l === "}" || l === "]") && o--;
423
404
  }
424
405
  }
425
406
  return null;
426
407
  }
427
- function $e(e, t) {
408
+ function rt(e, t) {
428
409
  let n = !1, r = !1, i = !1, a = 0, o = -1;
429
410
  for (let s = t; s < e.length; s++) {
430
411
  let c = e[s], l = e[s + 1];
@@ -456,7 +437,7 @@ function $e(e, t) {
456
437
  i = !0, o = s + 1;
457
438
  continue;
458
439
  }
459
- if (!Y(c)) {
440
+ if (!$(c)) {
460
441
  if (c === "[" || c === "{") {
461
442
  a++, s > t && (o = s + 1);
462
443
  continue;
@@ -475,57 +456,57 @@ function $e(e, t) {
475
456
  }
476
457
  return null;
477
458
  }
478
- function Z(e, t) {
479
- let i = u(e, ".vscode"), o = u(i, "settings.json"), s = "";
459
+ function it(e, t) {
460
+ let n = v(e, ".vscode"), r = v(n, "settings.json"), i = "";
480
461
  try {
481
- s = r(o, "utf-8");
462
+ i = p(r, "utf-8");
482
463
  } catch {}
483
- if (s.includes(G)) return;
484
- let c = `add "${K}": ["${G}"] manually to enable Iconify previews for local icons`, l = `[bitboss-ui] .vscode/settings.json: added "${G}" to "${K}" (Iconify previews for local icons). Set \`vscodeSettings: false\` in the plugin options to disable this write.`;
485
- if (!s.trim()) {
486
- n(i, { recursive: !0 }), a(o, JSON.stringify({ [K]: [G] }, null, " "), "utf-8"), t.info(l);
464
+ if (i.includes(Z)) return;
465
+ let a = `add "${Q}": ["${Z}"] manually to enable Iconify previews for local icons`, o = `[bitboss-ui] .vscode/settings.json: added "${Z}" to "${Q}" (Iconify previews for local icons). Set \`vscodeSettings: false\` in the plugin options to disable this write.`;
466
+ if (!i.trim()) {
467
+ f(n, { recursive: !0 }), h(r, JSON.stringify({ [Q]: [Z] }, null, " "), "utf-8"), t.info(o);
487
468
  return;
488
469
  }
489
- let d;
470
+ let s;
490
471
  try {
491
- d = JSON.parse(J(s));
472
+ s = JSON.parse(et(i));
492
473
  } catch {
493
- t.warn(`[bitboss-ui] Could not parse .vscode/settings.json — ${c}.`);
474
+ t.warn(`[bitboss-ui] Could not parse .vscode/settings.json — ${a}.`);
494
475
  return;
495
476
  }
496
- let f = JSON.stringify(G), p;
497
- if (K in d) {
498
- if (!Array.isArray(d[K])) {
499
- t.warn(`[bitboss-ui] .vscode/settings.json has a non-array "${K}" — ${c}.`);
477
+ let c = JSON.stringify(Z), l;
478
+ if (Q in s) {
479
+ if (!Array.isArray(s[Q])) {
480
+ t.warn(`[bitboss-ui] .vscode/settings.json has a non-array "${Q}" — ${a}.`);
500
481
  return;
501
482
  }
502
- let e = Qe(s, K);
483
+ let e = nt(i, Q);
503
484
  if (!e) {
504
- t.warn(`[bitboss-ui] Could not locate "${K}" in .vscode/settings.json — ${c}.`);
485
+ t.warn(`[bitboss-ui] Could not locate "${Q}" in .vscode/settings.json — ${a}.`);
505
486
  return;
506
487
  }
507
- if (e.lastSignificantEnd === -1) p = s.slice(0, e.close) + f + s.slice(e.close);
508
- else if (s.slice(e.open + 1, e.close).includes("\n")) {
509
- let t = s.lastIndexOf("\n", e.lastSignificantEnd - 1) + 1, n = /^[\t ]*/.exec(s.slice(t))?.[0] ?? " ";
510
- p = s.slice(0, e.lastSignificantEnd) + `,\n${n}${f}` + s.slice(e.lastSignificantEnd);
511
- } else p = s.slice(0, e.lastSignificantEnd) + `, ${f}` + s.slice(e.lastSignificantEnd);
488
+ if (e.lastSignificantEnd === -1) l = i.slice(0, e.close) + c + i.slice(e.close);
489
+ else if (i.slice(e.open + 1, e.close).includes("\n")) {
490
+ let t = i.lastIndexOf("\n", e.lastSignificantEnd - 1) + 1, n = /^[\t ]*/.exec(i.slice(t))?.[0] ?? " ";
491
+ l = i.slice(0, e.lastSignificantEnd) + `,\n${n}${c}` + i.slice(e.lastSignificantEnd);
492
+ } else l = i.slice(0, e.lastSignificantEnd) + `, ${c}` + i.slice(e.lastSignificantEnd);
512
493
  } else {
513
- let e = X(s, 0);
514
- if (e === -1 || s[e] !== "{") {
515
- t.warn(`[bitboss-ui] .vscode/settings.json is not a JSON object — ${c}.`);
494
+ let e = tt(i, 0);
495
+ if (e === -1 || i[e] !== "{") {
496
+ t.warn(`[bitboss-ui] .vscode/settings.json is not a JSON object — ${a}.`);
516
497
  return;
517
498
  }
518
- let n = Object.keys(d).length > 0;
519
- p = s.slice(0, e + 1) + `\n\t${JSON.stringify(K)}: [${f}]${n ? "," : "\n"}` + s.slice(e + 1);
499
+ let n = Object.keys(s).length > 0;
500
+ l = i.slice(0, e + 1) + `\n\t${JSON.stringify(Q)}: [${c}]${n ? "," : "\n"}` + i.slice(e + 1);
520
501
  }
521
- a(o, p, "utf-8"), t.info(l);
502
+ h(r, l, "utf-8"), t.info(o);
522
503
  }
523
- var Q = "virtual:bb-icon/", $ = "\0virtual:bb-icon/";
524
- async function et(e, t) {
504
+ var at = "virtual:bb-icon/", ot = "\0virtual:bb-icon/";
505
+ async function st(e, t) {
525
506
  try {
526
507
  let { ensureMcpConfigs: n, missingMcpPeers: r } = await import(
527
508
  /* @vite-ignore */
528
- new URL("data:text/javascript;base64,LyoqCiAqIFNoYXJlZCB3cml0ZXJzIHRoYXQgcmVnaXN0ZXIgdGhlIGJpdGJvc3MtdWkgTUNQIHNlcnZlciBpbiBlYWNoIGFnZW50CiAqIGhhcm5lc3MncyBjb25maWcgZmlsZS4gVXNlZCBieSBgYml0Ym9zcy11aSBhaS1pbml0IC0tbWNwYCAoYmluKSBhbmQsIG9wdC1pbiwKICogYnkgdGhlIGRldiBzZXJ2ZXIgKHZpdGUvbnV4dCBwbHVnaW4gYG1jcDogdHJ1ZWApLgogKgogKiBFdmVyeSB3cml0ZXIgaXMgbWVyZ2Utc2FmZSAobmV2ZXIgZGlzdHVyYnMgb3RoZXIgc2VydmVycyksIGlkZW1wb3RlbnQKICogKHJldHVybnMgYHVuY2hhbmdlZGAgd2hlbiB0aGUgZW50cnkgYWxyZWFkeSBtYXRjaGVzKSwgYW5kIHJlcG9ydHMgd2hhdCBpdAogKiBkaWQgc28gY2FsbGVycyBjYW4gbG9nIGl0LiBIYXJuZXNzIGNvbmZpZyBzaGFwZXMgZGlmZmVyOgogKiAgIC0gQ2xhdWRlIENvZGUgLyBDdXJzb3IgLyBXaW5kc3VyZiDihpIgYHsgbWNwU2VydmVyczogeyBuYW1lOiB7IGNvbW1hbmQsIGFyZ3MgfSB9IH1gCiAqICAgLSBWUyBDb2RlIC8gQ29waWxvdCAgICAgICAgICAgICAgIOKGkiBgeyBzZXJ2ZXJzOiB7IG5hbWU6IHsgdHlwZTogJ3N0ZGlvJywg4oCmIH0gfSB9YAogKiAoVlMgQ29kZSBrZXlzIHRoZSBjb250YWluZXIgYHNlcnZlcnNgIGFuZCByZXF1aXJlcyBhbiBleHBsaWNpdCBgdHlwZWAuKQogKi8KCmltcG9ydCB7IGV4aXN0c1N5bmMsIG1rZGlyU3luYywgcmVhZEZpbGVTeW5jLCB3cml0ZUZpbGVTeW5jIH0gZnJvbSAnbm9kZTpmcyc7CmltcG9ydCB7IGhvbWVkaXIgfSBmcm9tICdub2RlOm9zJzsKaW1wb3J0IHsgZGlybmFtZSwgam9pbiwgcmVzb2x2ZSB9IGZyb20gJ25vZGU6cGF0aCc7CmltcG9ydCB7IGZpbGVVUkxUb1BhdGggfSBmcm9tICdub2RlOnVybCc7CgpleHBvcnQgY29uc3QgTUNQX1NFUlZFUl9OQU1FID0gJ2JpdGJvc3MtdWknOwpjb25zdCBDT01NQU5EID0gJ25weCc7CgovKioKICogVGhlIE1DUCBzZXJ2ZXIncyBvd24gcnVudGltZSBuZWVkcywgZGVjbGFyZWQgYXMgT1BUSU9OQUwgcGVlcnMgcmF0aGVyIHRoYW4KICogZGVwZW5kZW5jaWVzOiB0b2dldGhlciB0aGV5IGFyZSB+MTIgTUIg4oCUIG1vcmUgdGhhbiBldmVyeSBydW50aW1lIGRlcGVuZGVuY3kKICogb2YgdGhlIGNvbXBvbmVudCBsaWJyYXJ5IGNvbWJpbmVkIOKAlCBhbmQgbm90aGluZyBidXQgYGJpdGJvc3MtdWkgbWNwYCBsb2FkcwogKiB0aGVtLgogKi8KZXhwb3J0IGNvbnN0IE1DUF9QRUVSUyA9IFsnQG1vZGVsY29udGV4dHByb3RvY29sL3NkaycsICd6b2QnXTsKCi8qKgogKiBEaXJlY3RvcnkgcHJvYmUsIHdhbGtpbmcgdXAgZnJvbSBgZGlyYC4gRGVsaWJlcmF0ZWx5IE5PVCBgcmVxdWlyZS5yZXNvbHZlYDoKICogYW4gRVNNLW9ubHkgcGFja2FnZSB3aG9zZSBgZXhwb3J0c2AgbWFwIGRlY2xhcmVzIG5vIGByZXF1aXJlYCBjb25kaXRpb24KICogdGhyb3dzIEVSUl9QQUNLQUdFX1BBVEhfTk9UX0VYUE9SVEVEIG9uIGEgcGVyZmVjdGx5IGdvb2QgaW5zdGFsbCDigJQgdGhlIHNhbWUKICogdHJhcCBkb2N1bWVudGVkIG9uIGBoYXNJbmVydGlhYCBpbiB0aGUgVml0ZSBwbHVnaW4uIEEgZGlyZWN0b3J5IGNoZWNrIGlzCiAqIGV4cG9ydHMtbWFwLWFnbm9zdGljLgogKi8KZnVuY3Rpb24gaXNJbnN0YWxsZWRGcm9tKGRpciwgbmFtZSkgewoJY29uc3Qgc2VnbWVudHMgPSBuYW1lLnNwbGl0KCcvJyk7CglsZXQgY3VycmVudCA9IHJlc29sdmUoZGlyKTsKCWZvciAoOzspIHsKCQlpZiAoZXhpc3RzU3luYyhqb2luKGN1cnJlbnQsICdub2RlX21vZHVsZXMnLCAuLi5zZWdtZW50cykpKSByZXR1cm4gdHJ1ZTsKCQljb25zdCBwYXJlbnQgPSBkaXJuYW1lKGN1cnJlbnQpOwoJCWlmIChwYXJlbnQgPT09IGN1cnJlbnQpIHJldHVybiBmYWxzZTsKCQljdXJyZW50ID0gcGFyZW50OwoJfQp9CgovKioKICogV2hpY2ggTUNQIHBlZXJzIHRoZSBwcm9qZWN0IGlzIG1pc3NpbmcsIHNvIGEgY2FsbGVyIHJlZ2lzdGVyaW5nIHRoZSBzZXJ2ZXIKICogY2FuIHNheSBzbyBOT1cgcmF0aGVyIHRoYW4gbGV0IHRoZSBoYXJuZXNzIGRpc2NvdmVyIGl0IG9uIGZpcnN0IGxhdW5jaCDigJQgdGhlCiAqIGNvbmZpZyBpcyB3cml0dGVuIGJ5IGBhaS1pbml0IC0tbWNwYCAvIHRoZSBkZXYgc2VydmVyLCBidXQgdGhlIGZhaWx1cmUgd291bGQKICogc3VyZmFjZSBtdWNoIGxhdGVyLCBpbnNpZGUgYW4gYWdlbnQsIGFzIGEgc2VydmVyIHRoYXQgd291bGQgbm90IHN0YXJ0LgogKgogKiBSZXR1cm5zIGBbXWAgd2hlbiBldmVyeXRoaW5nIG5lZWRlZCBpcyBwcmVzZW50LgogKi8KZXhwb3J0IGZ1bmN0aW9uIG1pc3NpbmdNY3BQZWVycyhyb290KSB7CglyZXR1cm4gTUNQX1BFRVJTLmZpbHRlcigobmFtZSkgPT4gIWlzSW5zdGFsbGVkRnJvbShyb290LCBuYW1lKSk7Cn0KCi8qKgogKiBUaGUgbnB4IHNwZWMgTVVTVCBiZSBwaW5uZWQgdG8gdGhpcyBwYWNrYWdlJ3Mgb3duIHZlcnNpb24gKDIwMjYtMDgtMDYKICogcmV2aWV3KTogTUNQIGhvc3RzIHNwYXduIHRoZSBlbnRyeSB3aXRoIG5vbi1UVFkgc3RkaW8sIHdoZXJlIGBucHhgIGluc3RhbGxzCiAqIHdpdGhvdXQgcHJvbXB0aW5nIOKAlCBhbiB1bnBpbm5lZCBgbnB4IGJpdGJvc3MtdWkgbWNwYCBpbiBhIHByb2plY3Qgd2hvc2UKICogZGVwZW5kZW5jeSBpcyBhYnNlbnQgb3Igbm90IHlldCBpbnN0YWxsZWQgc2lsZW50bHkgZG93bmxvYWRzIGFuZCBleGVjdXRlcwogKiB3aGF0ZXZlciBgYml0Ym9zcy11aUBsYXRlc3RgIHJlc29sdmVzIHRvIG9uIHRoZSBwdWJsaWMgcmVnaXN0cnkgKGFuZCBldmVuCiAqIHdpdGggYSBsb2NhbCBpbnN0YWxsLCBhbnN3ZXJzIGZyb20gYSBkaWZmZXJlbnQgdmVyc2lvbidzIGtub3dsZWRnZSBiYXNlCiAqIHRoYW4gdGhlIG9uZSB0aGUgcHJvamVjdCB1c2VzKS4gVGhpcyBmaWxlIHNoaXBzIGFzIGBzY3JpcHRzL2xpYi8qYCBpbiB0aGUKICogcHVibGlzaGVkIHBhY2thZ2UsIHNvIGl0cyBvd24gYHBhY2thZ2UuanNvbmAg4oCUIHR3byBsZXZlbHMgdXAg4oCUIElTIHRoZQogKiBpbnN0YWxsZWQgdmVyc2lvbi4KICovCmZ1bmN0aW9uIHJlc29sdmVOcHhTcGVjKCkgewoJdHJ5IHsKCQljb25zdCBwa2cgPSBKU09OLnBhcnNlKAoJCQlyZWFkRmlsZVN5bmMoCgkJCQlqb2luKAoJCQkJCWRpcm5hbWUoZmlsZVVSTFRvUGF0aChpbXBvcnQubWV0YS51cmwpKSwKCQkJCQknLi4nLAoJCQkJCScuLicsCgkJCQkJJ3BhY2thZ2UuanNvbicKCQkJCSksCgkJCQkndXRmLTgnCgkJCSkKCQkpOwoJCWlmIChwa2cubmFtZSA9PT0gTUNQX1NFUlZFUl9OQU1FICYmIHR5cGVvZiBwa2cudmVyc2lvbiA9PT0gJ3N0cmluZycpIHsKCQkJcmV0dXJuIGAke01DUF9TRVJWRVJfTkFNRX1AJHtwa2cudmVyc2lvbn1gOwoJCX0KCX0gY2F0Y2ggewoJCS8qIGZhbGwgdGhyb3VnaCB0byB0aGUgdW5waW5uZWQgc3BlYyAqLwoJfQoJcmV0dXJuIE1DUF9TRVJWRVJfTkFNRTsKfQoKY29uc3QgQVJHUyA9IFtyZXNvbHZlTnB4U3BlYygpLCAnbWNwJ107Cgpjb25zdCBzdGRpb0VudHJ5ID0gKCkgPT4gKHsgY29tbWFuZDogQ09NTUFORCwgYXJnczogWy4uLkFSR1NdIH0pOwpjb25zdCB2c2NvZGVFbnRyeSA9ICgpID0+ICh7Cgl0eXBlOiAnc3RkaW8nLAoJY29tbWFuZDogQ09NTUFORCwKCWFyZ3M6IFsuLi5BUkdTXSwKfSk7CgpmdW5jdGlvbiB3cml0ZUpzb24ocGF0aCwgZGF0YSkgewoJbWtkaXJTeW5jKGRpcm5hbWUocGF0aCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pOwoJd3JpdGVGaWxlU3luYyhwYXRoLCBgJHtKU09OLnN0cmluZ2lmeShkYXRhLCBudWxsLCAnXHQnKX1cbmAsICd1dGYtOCcpOwp9CgovKioKICogTWVyZ2UgdGhlIHNlcnZlciBlbnRyeSBpbnRvIGBwYXRoYCdzIGA8Y29udGFpbmVyS2V5PmAgbWFwLiBSZXR1cm5zCiAqIGB7IHBhdGgsIGxhYmVsLCBhY3Rpb24gfWAgd2l0aCBhY3Rpb24g4oiIIGNyZWF0ZWR8dXBkYXRlZHx1bmNoYW5nZWR8c2tpcHBlZC4KICovCmZ1bmN0aW9uIGVuc3VyZUVudHJ5KHBhdGgsIGNvbnRhaW5lcktleSwgZW50cnksIGxhYmVsKSB7CglsZXQgY29uZmlnID0ge307Cgljb25zdCBleGlzdGVkID0gZXhpc3RzU3luYyhwYXRoKTsKCWlmIChleGlzdGVkKSB7CgkJdHJ5IHsKCQkJY29uZmlnID0gSlNPTi5wYXJzZShyZWFkRmlsZVN5bmMocGF0aCwgJ3V0Zi04JykpOwoJCX0gY2F0Y2ggKGVycm9yKSB7CgkJCWNvbnN0IG1lc3NhZ2UgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcik7CgkJCXJldHVybiB7CgkJCQlwYXRoLAoJCQkJbGFiZWwsCgkJCQlhY3Rpb246ICdza2lwcGVkJywKCQkJCXJlYXNvbjogYGludmFsaWQgSlNPTiAoJHttZXNzYWdlfSlgLAoJCQl9OwoJCX0KCX0KCWlmICghY29uZmlnW2NvbnRhaW5lcktleV0gfHwgdHlwZW9mIGNvbmZpZ1tjb250YWluZXJLZXldICE9PSAnb2JqZWN0JykgewoJCWNvbmZpZ1tjb250YWluZXJLZXldID0ge307Cgl9CgoJY29uc3QgcHJldmlvdXMgPSBjb25maWdbY29udGFpbmVyS2V5XVtNQ1BfU0VSVkVSX05BTUVdOwoJaWYgKHByZXZpb3VzICYmIEpTT04uc3RyaW5naWZ5KHByZXZpb3VzKSA9PT0gSlNPTi5zdHJpbmdpZnkoZW50cnkpKSB7CgkJcmV0dXJuIHsgcGF0aCwgbGFiZWwsIGFjdGlvbjogJ3VuY2hhbmdlZCcgfTsKCX0KCgljb25maWdbY29udGFpbmVyS2V5XVtNQ1BfU0VSVkVSX05BTUVdID0gZW50cnk7Cgl0cnkgewoJCXdyaXRlSnNvbihwYXRoLCBjb25maWcpOwoJfSBjYXRjaCAoZXJyb3IpIHsKCQljb25zdCBtZXNzYWdlID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpOwoJCXJldHVybiB7IHBhdGgsIGxhYmVsLCBhY3Rpb246ICdza2lwcGVkJywgcmVhc29uOiBtZXNzYWdlIH07Cgl9CglyZXR1cm4geyBwYXRoLCBsYWJlbCwgYWN0aW9uOiBleGlzdGVkID8gJ3VwZGF0ZWQnIDogJ2NyZWF0ZWQnIH07Cn0KCi8qKiBDbGF1ZGUgQ29kZSDigJQgcHJvamVjdC1yb290IGAubWNwLmpzb25gLiAqLwpleHBvcnQgY29uc3Qgd3JpdGVDbGF1ZGVDb2RlQ29uZmlnID0gKHJvb3QpID0+CgllbnN1cmVFbnRyeSgKCQlqb2luKHJvb3QsICcubWNwLmpzb24nKSwKCQknbWNwU2VydmVycycsCgkJc3RkaW9FbnRyeSgpLAoJCSdDbGF1ZGUgQ29kZScKCSk7CgovKiogQ3Vyc29yIOKAlCBwcm9qZWN0IGAuY3Vyc29yL21jcC5qc29uYC4gKi8KZXhwb3J0IGNvbnN0IHdyaXRlQ3Vyc29yQ29uZmlnID0gKHJvb3QpID0+CgllbnN1cmVFbnRyeSgKCQlqb2luKHJvb3QsICcuY3Vyc29yJywgJ21jcC5qc29uJyksCgkJJ21jcFNlcnZlcnMnLAoJCXN0ZGlvRW50cnkoKSwKCQknQ3Vyc29yJwoJKTsKCi8qKiBWUyBDb2RlIC8gR2l0SHViIENvcGlsb3Qg4oCUIHByb2plY3QgYC52c2NvZGUvbWNwLmpzb25gIChgc2VydmVyc2AgKyBgdHlwZWApLiAqLwpleHBvcnQgY29uc3Qgd3JpdGVWc2NvZGVDb25maWcgPSAocm9vdCkgPT4KCWVuc3VyZUVudHJ5KAoJCWpvaW4ocm9vdCwgJy52c2NvZGUnLCAnbWNwLmpzb24nKSwKCQknc2VydmVycycsCgkJdnNjb2RlRW50cnkoKSwKCQknVlMgQ29kZSAvIENvcGlsb3QnCgkpOwoKLyoqCiAqIFdpbmRzdXJmIOKAlCBDYXNjYWRlIG9ubHkgcmVhZHMgYSBHTE9CQUwgY29uZmlnOyB0aGVyZSBpcyBubyBwcm9qZWN0IHNjb3BlLCBzbwogKiB0aGlzIHdyaXRlcyB0byB0aGUgdXNlcidzIGhvbWUgZGlyZWN0b3J5IGFuZCBhZmZlY3RzIGFsbCB0aGVpciBwcm9qZWN0cy4KICovCmV4cG9ydCBjb25zdCB3cml0ZVdpbmRzdXJmQ29uZmlnID0gKCkgPT4KCWVuc3VyZUVudHJ5KAoJCWpvaW4oaG9tZWRpcigpLCAnLmNvZGVpdW0nLCAnd2luZHN1cmYnLCAnbWNwX2NvbmZpZy5qc29uJyksCgkJJ21jcFNlcnZlcnMnLAoJCXN0ZGlvRW50cnkoKSwKCQknV2luZHN1cmYgKGdsb2JhbCknCgkpOwoKLyoqCiAqIFJlZ2lzdGVyIHRoZSBzZXJ2ZXIgYWNyb3NzIGhhcm5lc3Nlcy4gUHJvamVjdC1zY29wZWQgaGFybmVzc2VzIGFsd2F5cyBydW47CiAqIFdpbmRzdXJmIChnbG9iYWwsIGhvbWUtZGlyKSBpcyBvcHQtaW4gdmlhIGBpbmNsdWRlV2luZHN1cmZgIGJlY2F1c2Ugd3JpdGluZwogKiBpdCBhZmZlY3RzIGV2ZXJ5IHByb2plY3Qgb24gdGhlIG1hY2hpbmUg4oCUIGFwcHJvcHJpYXRlIGZvciB0aGUgZXhwbGljaXQKICogYGFpLWluaXQgLS1tY3BgIGNvbW1hbmQsIGJ1dCBub3QgZm9yIGEgc2lsZW50IGRldi1zZXJ2ZXIgYm9vdC4KICovCmV4cG9ydCBmdW5jdGlvbiBlbnN1cmVNY3BDb25maWdzKHJvb3QsIHsgaW5jbHVkZVdpbmRzdXJmID0gZmFsc2UgfSA9IHt9KSB7Cgljb25zdCByZXN1bHRzID0gWwoJCXdyaXRlQ2xhdWRlQ29kZUNvbmZpZyhyb290KSwKCQl3cml0ZUN1cnNvckNvbmZpZyhyb290KSwKCQl3cml0ZVZzY29kZUNvbmZpZyhyb290KSwKCV07CglpZiAoaW5jbHVkZVdpbmRzdXJmKSByZXN1bHRzLnB1c2god3JpdGVXaW5kc3VyZkNvbmZpZygpKTsKCXJldHVybiByZXN1bHRzOwp9Cg==", "" + import.meta.url).href
509
+ new URL("data:text/javascript;base64,LyoqCiAqIFNoYXJlZCB3cml0ZXJzIHRoYXQgcmVnaXN0ZXIgdGhlIGJpdGJvc3MtdWkgTUNQIHNlcnZlciBpbiBlYWNoIGFnZW50CiAqIGhhcm5lc3MncyBjb25maWcgZmlsZS4gVXNlZCBieSBgYml0Ym9zcy11aSBhaS1pbml0IC0tbWNwYCAoYmluKSBhbmQsIG9wdC1pbiwKICogYnkgdGhlIGRldiBzZXJ2ZXIgKHZpdGUvbnV4dCBwbHVnaW4gYG1jcDogdHJ1ZWApLgogKgogKiBFdmVyeSB3cml0ZXIgaXMgbWVyZ2Utc2FmZSAobmV2ZXIgZGlzdHVyYnMgb3RoZXIgc2VydmVycyksIGlkZW1wb3RlbnQKICogKHJldHVybnMgYHVuY2hhbmdlZGAgd2hlbiB0aGUgZW50cnkgYWxyZWFkeSBtYXRjaGVzKSwgYW5kIHJlcG9ydHMgd2hhdCBpdAogKiBkaWQgc28gY2FsbGVycyBjYW4gbG9nIGl0LiBIYXJuZXNzIGNvbmZpZyBzaGFwZXMgZGlmZmVyOgogKiAgIC0gQ2xhdWRlIENvZGUgLyBDdXJzb3IgLyBXaW5kc3VyZiDihpIgYHsgbWNwU2VydmVyczogeyBuYW1lOiB7IGNvbW1hbmQsIGFyZ3MgfSB9IH1gCiAqICAgLSBWUyBDb2RlIC8gQ29waWxvdCAgICAgICAgICAgICAgIOKGkiBgeyBzZXJ2ZXJzOiB7IG5hbWU6IHsgdHlwZTogJ3N0ZGlvJywg4oCmIH0gfSB9YAogKiAoVlMgQ29kZSBrZXlzIHRoZSBjb250YWluZXIgYHNlcnZlcnNgIGFuZCByZXF1aXJlcyBhbiBleHBsaWNpdCBgdHlwZWAuKQogKi8KCmltcG9ydCB7IGV4aXN0c1N5bmMsIG1rZGlyU3luYywgcmVhZEZpbGVTeW5jLCB3cml0ZUZpbGVTeW5jIH0gZnJvbSAnbm9kZTpmcyc7CmltcG9ydCB7IGhvbWVkaXIgfSBmcm9tICdub2RlOm9zJzsKaW1wb3J0IHsgZGlybmFtZSwgam9pbiwgcmVzb2x2ZSB9IGZyb20gJ25vZGU6cGF0aCc7CgpleHBvcnQgY29uc3QgTUNQX1NFUlZFUl9OQU1FID0gJ2JpdGJvc3MtdWknOwpjb25zdCBDT01NQU5EID0gJ25vZGUnOwoKLyoqCiAqIFBhdGggdG8gdGhlIGluc3RhbGxlZCBDTEksIHJlbGF0aXZlIHRvIHRoZSBwcm9qZWN0IHJvb3QuCiAqCiAqIFJlbGF0aXZlIG9uIHB1cnBvc2U6IGhhcm5lc3NlcyBzcGF3biBhIHN0ZGlvIHNlcnZlciB3aXRoIHRoZSBwcm9qZWN0IHJvb3QgYXMKICogaXRzIHdvcmtpbmcgZGlyZWN0b3J5LCBhbmQgYSByZWxhdGl2ZSBwYXRoIGlzIHdoYXQgbGV0cyBhIGNvbW1pdHRlZAogKiBgLm1jcC5qc29uYCB3b3JrIG9uIGEgdGVhbW1hdGUncyBtYWNoaW5lLiBBbiBhYnNvbHV0ZSBwYXRoIHdvdWxkIHBpbiB0aGUKICogY29uZmlnIHRvIHdob2V2ZXIgcmFuIGBhaS1pbml0YC4KICoKICogRm9yd2FyZCBzbGFzaGVzIGV2ZW4gb24gV2luZG93cyDigJQgTm9kZSBhY2NlcHRzIHRoZW0sIGFuZCBKU09OIGNvbmZpZ3MgYXJlCiAqIHNoYXJlZCBhY3Jvc3MgcGxhdGZvcm1zLgogKi8KZXhwb3J0IGNvbnN0IE1DUF9CSU5fUEFUSCA9ICdub2RlX21vZHVsZXMvYml0Ym9zcy11aS9iaW4vYml0Ym9zcy11aS5tanMnOwoKLyoqCiAqIFRoZSBNQ1Agc2VydmVyJ3Mgb3duIHJ1bnRpbWUgbmVlZHMsIGRlY2xhcmVkIGFzIE9QVElPTkFMIHBlZXJzIHJhdGhlciB0aGFuCiAqIGRlcGVuZGVuY2llczogdG9nZXRoZXIgdGhleSBhcmUgfjEyIE1CIOKAlCBtb3JlIHRoYW4gZXZlcnkgcnVudGltZSBkZXBlbmRlbmN5CiAqIG9mIHRoZSBjb21wb25lbnQgbGlicmFyeSBjb21iaW5lZCDigJQgYW5kIG5vdGhpbmcgYnV0IGBiaXRib3NzLXVpIG1jcGAgbG9hZHMKICogdGhlbS4KICovCmV4cG9ydCBjb25zdCBNQ1BfUEVFUlMgPSBbJ0Btb2RlbGNvbnRleHRwcm90b2NvbC9zZGsnLCAnem9kJ107CgovKioKICogRGlyZWN0b3J5IHByb2JlLCB3YWxraW5nIHVwIGZyb20gYGRpcmAuIERlbGliZXJhdGVseSBOT1QgYHJlcXVpcmUucmVzb2x2ZWA6CiAqIGFuIEVTTS1vbmx5IHBhY2thZ2Ugd2hvc2UgYGV4cG9ydHNgIG1hcCBkZWNsYXJlcyBubyBgcmVxdWlyZWAgY29uZGl0aW9uCiAqIHRocm93cyBFUlJfUEFDS0FHRV9QQVRIX05PVF9FWFBPUlRFRCBvbiBhIHBlcmZlY3RseSBnb29kIGluc3RhbGwg4oCUIHRoZSBzYW1lCiAqIHRyYXAgZG9jdW1lbnRlZCBvbiBgaGFzSW5lcnRpYWAgaW4gdGhlIFZpdGUgcGx1Z2luLiBBIGRpcmVjdG9yeSBjaGVjayBpcwogKiBleHBvcnRzLW1hcC1hZ25vc3RpYy4KICovCmZ1bmN0aW9uIGlzSW5zdGFsbGVkRnJvbShkaXIsIG5hbWUpIHsKCWNvbnN0IHNlZ21lbnRzID0gbmFtZS5zcGxpdCgnLycpOwoJbGV0IGN1cnJlbnQgPSByZXNvbHZlKGRpcik7Cglmb3IgKDs7KSB7CgkJaWYgKGV4aXN0c1N5bmMoam9pbihjdXJyZW50LCAnbm9kZV9tb2R1bGVzJywgLi4uc2VnbWVudHMpKSkgcmV0dXJuIHRydWU7CgkJY29uc3QgcGFyZW50ID0gZGlybmFtZShjdXJyZW50KTsKCQlpZiAocGFyZW50ID09PSBjdXJyZW50KSByZXR1cm4gZmFsc2U7CgkJY3VycmVudCA9IHBhcmVudDsKCX0KfQoKLyoqCiAqIFdoaWNoIE1DUCBwZWVycyB0aGUgcHJvamVjdCBpcyBtaXNzaW5nLCBzbyBhIGNhbGxlciByZWdpc3RlcmluZyB0aGUgc2VydmVyCiAqIGNhbiBzYXkgc28gTk9XIHJhdGhlciB0aGFuIGxldCB0aGUgaGFybmVzcyBkaXNjb3ZlciBpdCBvbiBmaXJzdCBsYXVuY2gg4oCUIHRoZQogKiBjb25maWcgaXMgd3JpdHRlbiBieSBgYWktaW5pdCAtLW1jcGAgLyB0aGUgZGV2IHNlcnZlciwgYnV0IHRoZSBmYWlsdXJlIHdvdWxkCiAqIHN1cmZhY2UgbXVjaCBsYXRlciwgaW5zaWRlIGFuIGFnZW50LCBhcyBhIHNlcnZlciB0aGF0IHdvdWxkIG5vdCBzdGFydC4KICoKICogUmV0dXJucyBgW11gIHdoZW4gZXZlcnl0aGluZyBuZWVkZWQgaXMgcHJlc2VudC4KICovCmV4cG9ydCBmdW5jdGlvbiBtaXNzaW5nTWNwUGVlcnMocm9vdCkgewoJcmV0dXJuIE1DUF9QRUVSUy5maWx0ZXIoKG5hbWUpID0+ICFpc0luc3RhbGxlZEZyb20ocm9vdCwgbmFtZSkpOwp9CgovKioKICogSW52b2tlIHRoZSBJTlNUQUxMRUQgYmluYXJ5IGRpcmVjdGx5LCBuZXZlciBgbnB4YCAoMjAyNi0wOS0wOSwgc3VwZXJzZWRpbmcKICogdGhlIDIwMjYtMDgtMDYgcGlubmVkLW5weCBydWxpbmcg4oCUIHNlZSBiZWxvdykuCiAqCiAqIFRoZSAyMDI2LTA4LTA2IHJldmlldyBwaW5uZWQgdGhlIHNwZWMgdG8gdGhpcyBwYWNrYWdlJ3Mgb3duIHZlcnNpb24gYmVjYXVzZQogKiBNQ1AgaG9zdHMgc3Bhd24gdGhlIGVudHJ5IHdpdGggbm9uLVRUWSBzdGRpbywgd2hlcmUgYG5weGAgaW5zdGFsbHMgd2l0aG91dAogKiBwcm9tcHRpbmc6IGFuIHVucGlubmVkIGBucHggYml0Ym9zcy11aSBtY3BgIHdvdWxkIHNpbGVudGx5IGRvd25sb2FkIGFuZAogKiBleGVjdXRlIHdoYXRldmVyIGBiaXRib3NzLXVpQGxhdGVzdGAgcmVzb2x2ZWQgdG8sIGFuZCBhbnN3ZXIgZnJvbSBhCiAqIGRpZmZlcmVudCB2ZXJzaW9uJ3Mga25vd2xlZGdlIGJhc2UgdGhhbiB0aGUgcHJvamVjdCB1c2VzLgogKgogKiBUaGUgcGluIGZpeGVkIHRoYXQgYW5kIGJyb2tlIHRoZSBzZXJ2ZXIgb3V0cmlnaHQuIGBucHggYml0Ym9zcy11aUB4LnkueiBtY3BgCiAqIHJ1bnMgdGhlIHBhY2thZ2UgT1VUIE9GIFRIRSBOUFggQ0FDSEUsIGFuZCB0aGUgTUNQIGVudHJ5IHJlc29sdmVzIGl0cwogKiBvcHRpb25hbCBwZWVycyAoYEBtb2RlbGNvbnRleHRwcm90b2NvbC9zZGtgLCBgem9kYCkgcmVsYXRpdmUgdG8gdGhlIHBhY2thZ2UKICogaXQgaXMgcnVubmluZyBmcm9tLiBUaGUgY2FjaGUgZGlyZWN0b3J5IG5ldmVyIGhhcyB0aGVtLCBzbyB0aGUgc2VydmVyIGNhbm5vdAogKiBzdGFydCBubyBtYXR0ZXIgd2hhdCB0aGUgcHJvamVjdCBoYXMgaW5zdGFsbGVkIOKAlCByZXBvcnRlZCBmcm9tIGEgY29uc3VtZXIKICogcHJvamVjdCB3aXRoIGJvdGggcGVlcnMgcHJlc2VudC4KICoKICogQSBwYXRoIHRvIHRoZSBsb2NhbCBiaW5hcnkgc2F0aXNmaWVzIHRoZSBvcmlnaW5hbCBydWxpbmcgTU9SRSBjb21wbGV0ZWx5CiAqIHRoYW4gdGhlIHBpbiBkaWQ6IGl0IGNhbm5vdCByZWFjaCB0aGUgcmVnaXN0cnkgYXQgYWxsLCBzbyB0aGVyZSBpcyBub3RoaW5nCiAqIHRvIGRvd25sb2FkIGFuZCBubyBgbGF0ZXN0YCB0byBkcmlmdCB0by4gSXQgYWxzbyByZXRpcmVzIHRoZSBwaW4ncyBvd24KICogbWFpbnRlbmFuY2UgcHJvYmxlbSwgd2hlcmUgYSBjb25maWcgd3JpdHRlbiBhdCBvbmUgdmVyc2lvbiBrZXB0IG5hbWluZyB0aGF0CiAqIHZlcnNpb24gYWZ0ZXIgYW4gdXBncmFkZSwgbGV0dGluZyBhbiBhZ2VudCBxdWVyeSBhIG1hbmlmZXN0IHRoYXQgZGlzYWdyZWVkCiAqIHdpdGggdGhlIGNvZGUgaXQgd2FzIHdyaXRpbmcgYWdhaW5zdC4gVGhlIGJpbmFyeSBvbiBkaXNrIElTIHRoZSBpbnN0YWxsZWQKICogdmVyc2lvbiwgYnkgY29uc3RydWN0aW9uLgogKi8KY29uc3QgQVJHUyA9IFtNQ1BfQklOX1BBVEgsICdtY3AnXTsKCmNvbnN0IHN0ZGlvRW50cnkgPSAoKSA9PiAoeyBjb21tYW5kOiBDT01NQU5ELCBhcmdzOiBbLi4uQVJHU10gfSk7CmNvbnN0IHZzY29kZUVudHJ5ID0gKCkgPT4gKHsKCXR5cGU6ICdzdGRpbycsCgljb21tYW5kOiBDT01NQU5ELAoJYXJnczogWy4uLkFSR1NdLAp9KTsKCmZ1bmN0aW9uIHdyaXRlSnNvbihwYXRoLCBkYXRhKSB7Cglta2RpclN5bmMoZGlybmFtZShwYXRoKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7Cgl3cml0ZUZpbGVTeW5jKHBhdGgsIGAke0pTT04uc3RyaW5naWZ5KGRhdGEsIG51bGwsICdcdCcpfVxuYCwgJ3V0Zi04Jyk7Cn0KCi8qKgogKiBNZXJnZSB0aGUgc2VydmVyIGVudHJ5IGludG8gYHBhdGhgJ3MgYDxjb250YWluZXJLZXk+YCBtYXAuIFJldHVybnMKICogYHsgcGF0aCwgbGFiZWwsIGFjdGlvbiB9YCB3aXRoIGFjdGlvbiDiiIggY3JlYXRlZHx1cGRhdGVkfHVuY2hhbmdlZHxza2lwcGVkLgogKi8KZnVuY3Rpb24gZW5zdXJlRW50cnkocGF0aCwgY29udGFpbmVyS2V5LCBlbnRyeSwgbGFiZWwpIHsKCWxldCBjb25maWcgPSB7fTsKCWNvbnN0IGV4aXN0ZWQgPSBleGlzdHNTeW5jKHBhdGgpOwoJaWYgKGV4aXN0ZWQpIHsKCQl0cnkgewoJCQljb25maWcgPSBKU09OLnBhcnNlKHJlYWRGaWxlU3luYyhwYXRoLCAndXRmLTgnKSk7CgkJfSBjYXRjaCAoZXJyb3IpIHsKCQkJY29uc3QgbWVzc2FnZSA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKTsKCQkJcmV0dXJuIHsKCQkJCXBhdGgsCgkJCQlsYWJlbCwKCQkJCWFjdGlvbjogJ3NraXBwZWQnLAoJCQkJcmVhc29uOiBgaW52YWxpZCBKU09OICgke21lc3NhZ2V9KWAsCgkJCX07CgkJfQoJfQoJaWYgKCFjb25maWdbY29udGFpbmVyS2V5XSB8fCB0eXBlb2YgY29uZmlnW2NvbnRhaW5lcktleV0gIT09ICdvYmplY3QnKSB7CgkJY29uZmlnW2NvbnRhaW5lcktleV0gPSB7fTsKCX0KCgljb25zdCBwcmV2aW91cyA9IGNvbmZpZ1tjb250YWluZXJLZXldW01DUF9TRVJWRVJfTkFNRV07CglpZiAocHJldmlvdXMgJiYgSlNPTi5zdHJpbmdpZnkocHJldmlvdXMpID09PSBKU09OLnN0cmluZ2lmeShlbnRyeSkpIHsKCQlyZXR1cm4geyBwYXRoLCBsYWJlbCwgYWN0aW9uOiAndW5jaGFuZ2VkJyB9OwoJfQoKCWNvbmZpZ1tjb250YWluZXJLZXldW01DUF9TRVJWRVJfTkFNRV0gPSBlbnRyeTsKCXRyeSB7CgkJd3JpdGVKc29uKHBhdGgsIGNvbmZpZyk7Cgl9IGNhdGNoIChlcnJvcikgewoJCWNvbnN0IG1lc3NhZ2UgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcik7CgkJcmV0dXJuIHsgcGF0aCwgbGFiZWwsIGFjdGlvbjogJ3NraXBwZWQnLCByZWFzb246IG1lc3NhZ2UgfTsKCX0KCXJldHVybiB7IHBhdGgsIGxhYmVsLCBhY3Rpb246IGV4aXN0ZWQgPyAndXBkYXRlZCcgOiAnY3JlYXRlZCcgfTsKfQoKLyoqIENsYXVkZSBDb2RlIOKAlCBwcm9qZWN0LXJvb3QgYC5tY3AuanNvbmAuICovCmV4cG9ydCBjb25zdCB3cml0ZUNsYXVkZUNvZGVDb25maWcgPSAocm9vdCkgPT4KCWVuc3VyZUVudHJ5KAoJCWpvaW4ocm9vdCwgJy5tY3AuanNvbicpLAoJCSdtY3BTZXJ2ZXJzJywKCQlzdGRpb0VudHJ5KCksCgkJJ0NsYXVkZSBDb2RlJwoJKTsKCi8qKiBDdXJzb3Ig4oCUIHByb2plY3QgYC5jdXJzb3IvbWNwLmpzb25gLiAqLwpleHBvcnQgY29uc3Qgd3JpdGVDdXJzb3JDb25maWcgPSAocm9vdCkgPT4KCWVuc3VyZUVudHJ5KAoJCWpvaW4ocm9vdCwgJy5jdXJzb3InLCAnbWNwLmpzb24nKSwKCQknbWNwU2VydmVycycsCgkJc3RkaW9FbnRyeSgpLAoJCSdDdXJzb3InCgkpOwoKLyoqIFZTIENvZGUgLyBHaXRIdWIgQ29waWxvdCDigJQgcHJvamVjdCBgLnZzY29kZS9tY3AuanNvbmAgKGBzZXJ2ZXJzYCArIGB0eXBlYCkuICovCmV4cG9ydCBjb25zdCB3cml0ZVZzY29kZUNvbmZpZyA9IChyb290KSA9PgoJZW5zdXJlRW50cnkoCgkJam9pbihyb290LCAnLnZzY29kZScsICdtY3AuanNvbicpLAoJCSdzZXJ2ZXJzJywKCQl2c2NvZGVFbnRyeSgpLAoJCSdWUyBDb2RlIC8gQ29waWxvdCcKCSk7CgovKioKICogV2luZHN1cmYg4oCUIENhc2NhZGUgb25seSByZWFkcyBhIEdMT0JBTCBjb25maWc7IHRoZXJlIGlzIG5vIHByb2plY3Qgc2NvcGUsIHNvCiAqIHRoaXMgd3JpdGVzIHRvIHRoZSB1c2VyJ3MgaG9tZSBkaXJlY3RvcnkgYW5kIGFmZmVjdHMgYWxsIHRoZWlyIHByb2plY3RzLgogKi8KZXhwb3J0IGNvbnN0IHdyaXRlV2luZHN1cmZDb25maWcgPSAoKSA9PgoJZW5zdXJlRW50cnkoCgkJam9pbihob21lZGlyKCksICcuY29kZWl1bScsICd3aW5kc3VyZicsICdtY3BfY29uZmlnLmpzb24nKSwKCQknbWNwU2VydmVycycsCgkJc3RkaW9FbnRyeSgpLAoJCSdXaW5kc3VyZiAoZ2xvYmFsKScKCSk7CgovKioKICogUmVnaXN0ZXIgdGhlIHNlcnZlciBhY3Jvc3MgaGFybmVzc2VzLiBQcm9qZWN0LXNjb3BlZCBoYXJuZXNzZXMgYWx3YXlzIHJ1bjsKICogV2luZHN1cmYgKGdsb2JhbCwgaG9tZS1kaXIpIGlzIG9wdC1pbiB2aWEgYGluY2x1ZGVXaW5kc3VyZmAgYmVjYXVzZSB3cml0aW5nCiAqIGl0IGFmZmVjdHMgZXZlcnkgcHJvamVjdCBvbiB0aGUgbWFjaGluZSDigJQgYXBwcm9wcmlhdGUgZm9yIHRoZSBleHBsaWNpdAogKiBgYWktaW5pdCAtLW1jcGAgY29tbWFuZCwgYnV0IG5vdCBmb3IgYSBzaWxlbnQgZGV2LXNlcnZlciBib290LgogKi8KZXhwb3J0IGZ1bmN0aW9uIGVuc3VyZU1jcENvbmZpZ3Mocm9vdCwgeyBpbmNsdWRlV2luZHN1cmYgPSBmYWxzZSB9ID0ge30pIHsKCWNvbnN0IHJlc3VsdHMgPSBbCgkJd3JpdGVDbGF1ZGVDb2RlQ29uZmlnKHJvb3QpLAoJCXdyaXRlQ3Vyc29yQ29uZmlnKHJvb3QpLAoJCXdyaXRlVnNjb2RlQ29uZmlnKHJvb3QpLAoJXTsKCWlmIChpbmNsdWRlV2luZHN1cmYpIHJlc3VsdHMucHVzaCh3cml0ZVdpbmRzdXJmQ29uZmlnKCkpOwoJcmV0dXJuIHJlc3VsdHM7Cn0K", "" + import.meta.url).href
529
510
  ), i = n(e, { includeWindsurf: !1 }), a = i.filter((e) => e.action === "created" || e.action === "updated");
530
511
  for (let e of a) t.info(`[bitboss-ui] MCP: ${e.action} config for ${e.label}`);
531
512
  for (let e of i.filter((e) => e.action === "skipped")) t.warn(`[bitboss-ui] MCP: skipped ${e.label}${e.reason ? ` (${e.reason})` : ""}`);
@@ -537,29 +518,60 @@ async function et(e, t) {
537
518
  t.warn(`[bitboss-ui] MCP: could not register dev server (${n})`);
538
519
  }
539
520
  }
540
- function tt(t) {
541
- let n = {
521
+ function ct(e) {
522
+ let t = {
542
523
  iconDir: "./assets/icons",
543
- ...t
544
- }, r, i = !1, a = [], o = [], s = [], { enabled: c, defaultLocale: l, warnings: u } = O({
545
- locale: n.locale,
546
- enabledLocales: n.enabledLocales,
547
- customLocaleKeys: a
548
- }), p = j([...c, ...a]), m = /* @__PURE__ */ new Map(), h = /* @__PURE__ */ new Map(), _ = /* @__PURE__ */ new Set(), v = () => {
549
- m.clear(), h.clear(), _ = ie(r);
550
- for (let e of re(r)) m.set(e.prefix, e), h.set(e.prefix, (t) => te(e.prefix, t));
524
+ ...e
551
525
  };
526
+ if ("cssLayers" in t && t.cssLayers === void 0) throw Error("[bitboss-ui] cssLayers is present but undefined. If you passed an imported constant such as TAILWIND_V4_LAYERS, the installed bitboss-ui does not export it (older dist?) — upgrade, or pass the array literal. Remove the key entirely for an unlayered sheet.");
527
+ let r = n(t.cssLayers, { resetCss: t.resetCss ?? !1 });
528
+ if (r) throw Error(r);
529
+ let a, o = !1, s, c = {
530
+ info: (e) => console.warn(e),
531
+ warn: (e) => console.warn(e)
532
+ }, d = [], f = [], p = [], { enabled: m, defaultLocale: h, warnings: _ } = F({
533
+ locale: t.locale,
534
+ enabledLocales: t.enabledLocales,
535
+ customLocaleKeys: d
536
+ }), v = R([...m, ...d]), b = /* @__PURE__ */ new Map(), x = /* @__PURE__ */ new Map(), S = /* @__PURE__ */ new Set(), te = () => {
537
+ b.clear(), x.clear(), S = oe(a);
538
+ for (let e of ae(a)) b.set(e.prefix, e), x.set(e.prefix, (t) => ie(e.prefix, t));
539
+ T = null, D = null;
540
+ }, w = (e, t) => {
541
+ let n = b.get(e);
542
+ if (!n) return !1;
543
+ let r = x.get(e);
544
+ return C(n, t) !== null && (!r || r(t));
545
+ }, T = null, D = null, O = null, k = () => D || (D = (async () => {
546
+ let e = t.iconsScanner ?? {}, n = JSON.stringify({
547
+ version: ce(M),
548
+ sets: Array.from(b.entries()).map(([e, t]) => [e, t.lastModified ?? 0]).sort(([e], [t]) => e < t ? -1 : +(e > t)),
549
+ include: e.include ?? [],
550
+ exclude: e.exclude ?? [],
551
+ maxFileSize: e.maxFileSize ?? null
552
+ }), r = new i({
553
+ root: a,
554
+ outDir: s ?? y(a, "dist"),
555
+ scanner: e,
556
+ prefixes: Array.from(b.keys()),
557
+ resolves: w,
558
+ cacheFile: l(a),
559
+ cacheKey: n
560
+ }), o = await r.scan();
561
+ if (o.cold && c.info(`[bitboss-ui] icon scan: ${o.files} files in ${o.elapsed}ms${o.workers ? ` on ${o.workers} threads` : ""} (${r.icons.size} provider icons referenced)`), T = r, O) for (let e of r.includeDirs) O.add(e);
562
+ return r;
563
+ })(), D);
552
564
  return {
553
565
  name: "bitboss-ui:icon-registry",
554
566
  config(e) {
555
- let t = e.optimizeDeps?.include ?? [], n = e.optimizeDeps?.exclude ?? [], r = P(e.root ?? process.cwd()) ? [...L, He] : L, i = p.found.map(({ pack: e }) => `dayjs/locale/${e}`), a = (e.build?.assetsDir ?? "assets").replace(/\/+$/, ""), o = e.build?.rollupOptions?.output, s = (Array.isArray(o) ? o[0] : o)?.chunkFileNames;
567
+ let t = e.optimizeDeps?.include ?? [], n = e.optimizeDeps?.exclude ?? [], r = V(e.root ?? process.cwd()) ? [...W, He] : W, i = v.found.map(({ pack: e }) => `dayjs/locale/${e}`), a = (e.build?.assetsDir ?? "assets").replace(/\/+$/, ""), o = e.build?.rollupOptions?.output, s = (Array.isArray(o) ? o[0] : o)?.chunkFileNames;
556
568
  return {
557
569
  optimizeDeps: {
558
570
  include: [...r, ...i].filter((e) => !t.includes(e)),
559
- exclude: R.filter((e) => !n.includes(e))
571
+ exclude: G.filter((e) => !n.includes(e))
560
572
  },
561
573
  build: { rollupOptions: { output: { chunkFileNames(e) {
562
- if (e.facadeModuleId?.startsWith($)) {
574
+ if (e.facadeModuleId?.startsWith(ot)) {
563
575
  let t = e.facadeModuleId.slice(17);
564
576
  return `${a}/icons/${t.replace("/", "_")}-[hash].js`;
565
577
  }
@@ -568,20 +580,20 @@ function tt(t) {
568
580
  };
569
581
  },
570
582
  configResolved(e) {
571
- r = e.root, i = e.command === "build";
583
+ a = e.root, o = e.command === "build", s = y(a, e.build?.outDir ?? "dist"), e.logger && (c = e.logger);
572
584
  },
573
585
  resolveId(e) {
574
- if (e === Ue) return z;
575
- if (e === We) return B;
576
- if (e === Ge) return V;
577
- if (e === Ke) return H;
578
- if (e === qe) return U;
579
- if (e === Je) return W;
580
- if (e.startsWith(Q)) return "\0" + e;
586
+ if (e === Ue) return K;
587
+ if (e === We) return q;
588
+ if (e === Ge) return J;
589
+ if (e === Ke) return Y;
590
+ if (e === qe) return X;
591
+ if (e === Je) return Ye;
592
+ if (e.startsWith(at)) return "\0" + e;
581
593
  },
582
594
  async load(e) {
583
- if (e === B) {
584
- let { iconDir: e, enabledLocales: t, ...r } = n, i = {
595
+ if (e === q) {
596
+ let { iconDir: e, enabledLocales: n, ...r } = t, i = {
585
597
  inertiaLinkName: "Link",
586
598
  nuxtLinkName: "NuxtLink",
587
599
  linkActiveClass: "router-link-active",
@@ -593,11 +605,12 @@ function tt(t) {
593
605
  locale: "it",
594
606
  injectStyles: !0,
595
607
  resetCss: !1,
608
+ cssLayers: void 0,
596
609
  injectDirectives: !0,
597
610
  requiredAsterisk: !1,
598
611
  toastPosition: "bottom-right",
599
612
  ...r,
600
- defaultLocale: l,
613
+ defaultLocale: h,
601
614
  iconDefaultSizes: {
602
615
  xs: 12,
603
616
  sm: 16,
@@ -628,100 +641,100 @@ function tt(t) {
628
641
  };
629
642
  return `import { reactive } from 'vue';\nexport const config = reactive(${JSON.stringify(i)});\n`;
630
643
  }
631
- if (e === H) return k(c);
632
- if (e === V) return M(p.found);
633
- if (e === U) return `export default ${JSON.stringify(Ye())};`;
634
- if (e === W) return F(P(r));
635
- if (e.startsWith($)) {
636
- let t = e.slice(17), n = t.indexOf("/"), r = t.slice(0, n), i = t.slice(n + 1), a = m.get(r);
644
+ if (e === Y) return I(m);
645
+ if (e === J) return z(v.found);
646
+ if (e === X) return `export default ${JSON.stringify(Xe())};`;
647
+ if (e === Ye) return H(V(a));
648
+ if (e.startsWith(ot)) {
649
+ let t = e.slice(17), n = t.indexOf("/"), r = t.slice(0, n), i = t.slice(n + 1), a = b.get(r);
637
650
  a || this.error(`[bitboss-ui] cannot load "${r}:${i}" — @iconify-json/${r} is not installed.\n Run: npm install -D @iconify-json/${r}`);
638
- let o = g(a, i);
639
- return o || this.error(`[bitboss-ui] icon "${i}" does not exist in the ${r} icon set`), `export default ${JSON.stringify(ee(o))};`;
651
+ let o = C(a, i);
652
+ return o || this.error(`[bitboss-ui] icon "${i}" does not exist in the ${r} icon set`), `export default ${JSON.stringify(re(o))};`;
640
653
  }
641
- if (e !== z) return;
642
- let t = f(r, n.iconDir), a = "/" + d(r, t).replace(/\\/g, "/") + "/**/*.svg", o = JSON.stringify(Array.from(m.entries()).map(([e, t]) => [e, t.lastModified ?? 0]).sort(([e], [t]) => e < t ? -1 : +(e > t))), s = i ? await ce(r, o, m, h) : Array.from(m.entries()).flatMap(([e, t]) => {
643
- let n = h.get(e) ?? (() => !0);
644
- return [...Object.keys(t.icons), ...Object.keys(t.aliases ?? {})].filter((e) => n(e) && g(t, e) !== null).map((t) => `${e}:${t}`);
645
- }), u = Array.from(s).flatMap((e) => {
646
- let t = b(e);
647
- return t ? [`\t${JSON.stringify(e)}: () => import(${JSON.stringify(Q + t.prefix + "/" + t.name)}).then(m => m.default),`] : [];
648
- }).join("\n");
649
- return `const _local = import.meta.glob(${JSON.stringify(a)}, { query: '?raw', import: 'default' });\nconst _localIcons = Object.fromEntries(Object.entries(_local).map(([k, l]) => { const f = k.split(/[/\\\\]+/).pop(); return [\`local:\${f.replace(/\\.svg$/i, '')}\`, l]; }));\nconst _icons = {\n` + (u ? u + "\n" : "") + `\t..._localIcons,\n};\nconst _ip = new Set(${JSON.stringify(Array.from(_))});\nconst _loaded = new Set(${JSON.stringify(Array.from(m.keys()))});\nconst _installed = _loaded.size ? \`installed sets: \${[..._loaded].join(', ')}\` : 'no @iconify-json/* set is installed';\nconst _fail = (msg) => () => { const _e = new Error(); import.meta.hot?.send('bitboss-ui:icon-missing', { msg, stack: _e.stack }); return Promise.reject(new Error(msg)); };\nexport const icons = import.meta.env.DEV\n\t? new Proxy(_icons, {\n\t\tget(t, k) {\n\t\t\tif (k in t || typeof k !== 'string' || !k.includes(':')) return t[k];\n\t\t\tconst _c = k.indexOf(':'); const _p = k.slice(0, _c); const _n = k.slice(_c + 1);\n\t\t\tif (_p === 'local' || !/^[a-z][a-z0-9-]*$/.test(_p) || !/^[a-z][a-z0-9-]*$/.test(_n)) return undefined;\n\t\t\tif (_loaded.has(_p)) { const _names = Object.keys(t).filter(x => x.startsWith(_p + ':')).map(x => x.slice(_c + 1)); const _sq = _n.replace(/-/g, ''); const _sug = _names.find(x => x.replace(/-/g, '') === _sq) ?? (_n.length >= 3 ? _names.find(x => x.includes(_n) || (x.length >= 3 && _n.includes(x))) : undefined); return _fail(\`[bitboss-ui] icon "\${k}" does not exist in the \${_p} icon set\` + (_sug ? \` — did you mean "\${_p}:\${_sug}"?\` : '')); }\n\t\t\tconst _pkg = \`@iconify-json/\${_p}\`; const _cmd = \`run: npm install -D \${_pkg}\`;\n\t\t\tif (_ip.has(_p)) return _fail(\`[bitboss-ui] "\${k}" requires "\${_pkg}" — \${_cmd} (\${_installed})\`);\n\t\t\tif (_ip.size) return _fail(\`[bitboss-ui] "\${k}" — "\${_p}" is neither an installed icon set nor a known Iconify prefix (\${_installed})\`);\n\t\t\treturn _fail(\`[bitboss-ui] "\${k}" — no installed icon set has the prefix "\${_p}" (\${_installed}). If "\${_p}" is an Iconify set, \${_cmd}\`);\n\t\t},\n\t})\n\t: _icons;\n`;
654
+ if (e !== K) return;
655
+ let n = y(a, t.iconDir), r = "/" + ee(a, n).replace(/\\/g, "/") + "/**/*.svg", i = await k(), s = j(t.iconWhitelist ?? [], b, x, S);
656
+ s.errors.length > 0 && this.error(s.errors.length === 1 ? s.errors[0] : `[bitboss-ui] iconWhitelist has ${s.errors.length} entries that do not resolve:\n - ${s.errors.map((e) => e.replace(/^\[bitboss-ui\] /, "")).join("\n - ")}`);
657
+ let c = /* @__PURE__ */ new Set([...i.icons, ...s.icons]), l = Array.from(c).sort().flatMap((e) => {
658
+ let t = ne(e);
659
+ return t ? [`\t${JSON.stringify(e)}: () => import(${JSON.stringify(at + t.prefix + "/" + t.name)}).then(m => m.default),`] : [];
660
+ }).join("\n"), u = o ? null : Object.fromEntries(Array.from(b.entries()).map(([e, t]) => [e, A(t, x.get(e))]));
661
+ return `const _local = import.meta.glob(${JSON.stringify(r)}, { query: '?raw', import: 'default' });\nconst _localIcons = Object.fromEntries(Object.entries(_local).map(([k, l]) => { const f = k.split(/[/\\\\]+/).pop(); return [\`local:\${f.replace(/\\.svg$/i, '')}\`, l]; }));\nconst _icons = {\n` + (l ? l + "\n" : "") + `\t..._localIcons,\n};\nconst _ip = new Set(${JSON.stringify(Array.from(S))});\nconst _loaded = new Set(${JSON.stringify(Array.from(b.keys()))});\nconst _all = ${u ? JSON.stringify(u) : "null"};\nconst _diag = ${se};\nconst _fail = (msg) => () => { const _e = new Error(); import.meta.hot?.send('bitboss-ui:icon-missing', { msg, stack: _e.stack }); return Promise.reject(new Error(msg)); };\nexport const icons = new Proxy(_icons, {\n\tget(t, k) {\n\t\tif (k in t || typeof k !== 'string' || !k.includes(':')) return t[k];\n\t\tconst _msg = _diag(k, _loaded, (p) => Object.keys(t).filter((x) => x.startsWith(p + ':')).map((x) => x.slice(p.length + 1)), (p) => (_all && _all[p]) || null, _ip);\n\t\treturn _msg ? _fail(_msg) : undefined;\n\t},\n});\n`;
650
662
  },
651
663
  buildStart() {
652
- v(), q(f(r, n.iconDir), r), !i && n.vscodeSettings !== !1 && Z(r, {
664
+ te(), $e(y(a, t.iconDir), a), !o && t.vscodeSettings !== !1 && it(a, {
653
665
  info: (e) => this.info(e),
654
666
  warn: (e) => this.warn(e)
655
667
  });
656
- for (let e of o) this.warn(e);
657
- for (let e of u) this.warn(e);
658
- for (let e of s) this.warn(e);
659
- for (let e of p.missing) this.warn(`[bitboss-ui] locale '${e}' has no dayjs counterpart (dayjs/locale/${e}) — its calendars fall back to English. Dayjs locale names: https://github.com/iamkun/dayjs/tree/dev/src/locale`);
660
- n.locale && !e.includes(n.locale) && !a.includes(n.locale) && this.warn(`[bitboss-ui] \`locale: '${n.locale}'\` is not a built-in locale — the library ships ${e.length} dictionaries. Strings fall back to the default locale.`), x(_e, A([...c, ...a], Ee));
661
- let t = [
668
+ for (let e of f) this.warn(e);
669
+ for (let e of _) this.warn(e);
670
+ for (let e of p) this.warn(e);
671
+ for (let e of v.missing) this.warn(`[bitboss-ui] locale '${e}' has no dayjs counterpart (dayjs/locale/${e}) — its calendars fall back to English. Dayjs locale names: https://github.com/iamkun/dayjs/tree/dev/src/locale`);
672
+ t.locale && !u.includes(t.locale) && !d.includes(t.locale) && this.warn(`[bitboss-ui] \`locale: '${t.locale}'\` is not a built-in locale — the library ships ${u.length} dictionaries. Strings fall back to the default locale.`), E(_e, L([...m, ...d], Ee));
673
+ let e = [
662
674
  {
663
675
  defaults: Me,
664
- custom: n.buttonVariants,
676
+ custom: t.buttonVariants,
665
677
  outputPath: le,
666
678
  module: ve,
667
679
  registryName: "ButtonVariantRegistry"
668
680
  },
669
681
  {
670
682
  defaults: Ne,
671
- custom: n.alertVariants,
683
+ custom: t.alertVariants,
672
684
  outputPath: ue,
673
685
  module: ye,
674
686
  registryName: "AlertVariantRegistry"
675
687
  },
676
688
  {
677
689
  defaults: Pe,
678
- custom: n.badgeVariants,
690
+ custom: t.badgeVariants,
679
691
  outputPath: de,
680
692
  module: be,
681
693
  registryName: "BadgeVariantRegistry"
682
694
  },
683
695
  {
684
696
  defaults: Fe,
685
- custom: n.confirmVariants,
697
+ custom: t.confirmVariants,
686
698
  outputPath: fe,
687
699
  module: xe,
688
700
  registryName: "ConfirmVariantRegistry"
689
701
  },
690
702
  {
691
703
  defaults: Ie,
692
- custom: n.dropdownItemVariants,
704
+ custom: t.dropdownItemVariants,
693
705
  outputPath: pe,
694
706
  module: Se,
695
707
  registryName: "DropdownItemVariantRegistry"
696
708
  },
697
709
  {
698
710
  defaults: Le,
699
- custom: n.tooltipVariants,
711
+ custom: t.tooltipVariants,
700
712
  outputPath: me,
701
713
  module: Ce,
702
714
  registryName: "TooltipVariantRegistry"
703
715
  },
704
716
  {
705
717
  defaults: Re,
706
- custom: n.toastVariants,
718
+ custom: t.toastVariants,
707
719
  outputPath: he,
708
720
  module: we,
709
721
  registryName: "ToastVariantRegistry"
710
722
  },
711
723
  {
712
724
  defaults: ze,
713
- custom: n.indicatorVariants,
725
+ custom: t.indicatorVariants,
714
726
  outputPath: ge,
715
727
  module: Te,
716
728
  registryName: "IndicatorVariantRegistry"
717
729
  }
718
730
  ];
719
- for (let e of t) x(e.outputPath, I(Be(e.defaults, e.custom), e.module, e.registryName));
731
+ for (let t of e) E(t.outputPath, U(Be(t.defaults, t.custom), t.module, t.registryName));
720
732
  },
721
733
  configureServer(e) {
722
- n.mcp && et(e.config.root, e.config.logger);
723
- let t = f(e.config.root, n.iconDir), r = (e) => e.startsWith(t) && e.endsWith(".svg");
734
+ t.mcp && st(e.config.root, e.config.logger);
735
+ let n = y(e.config.root, t.iconDir), r = (e) => e.startsWith(n) && e.endsWith(".svg");
724
736
  e.ws.on("bitboss-ui:icon-missing", (t) => {
737
+ if (process.env.VITEST || e.config.mode === "test") return;
725
738
  let n = t.stack ? t.stack.replace(/^Error/, `Error: ${t.msg}`) : `Error: ${t.msg}`;
726
739
  e.ws.send({
727
740
  type: "error",
@@ -731,15 +744,41 @@ function tt(t) {
731
744
  plugin: "bitboss-ui"
732
745
  }
733
746
  });
734
- }), e.watcher.on("add", (n) => {
735
- r(n) && q(t, e.config.root);
736
- }), e.watcher.on("unlink", (n) => {
737
- r(n) && q(t, e.config.root);
738
- }), e.watcher.on("change", (n) => {
739
- r(n) && q(t, e.config.root);
747
+ });
748
+ let i = async () => {
749
+ let t = e.moduleGraph.getModuleById(K);
750
+ t && await e.reloadModule(t);
751
+ }, a, o = () => {
752
+ clearTimeout(a), a = setTimeout(() => void T?.persist(), 500);
753
+ }, s = Promise.resolve(), l = (e, t) => {
754
+ s = s.then(async () => {
755
+ if (!T) return;
756
+ let n;
757
+ if (g(t) === ".gitignore") {
758
+ let e = T.icons;
759
+ T.resetGitignores(), await T.scan();
760
+ let t = T.icons;
761
+ n = e.size !== t.size || [...e].some((e) => !t.has(e));
762
+ } else n = e === "unlink" ? T.removeFile(t) : await T.updateFile(t);
763
+ o(), n && await i();
764
+ }).catch((e) => {
765
+ c.warn(`[bitboss-ui] icon scan: could not update ${t} (${e instanceof Error ? e.message : String(e)})`);
766
+ });
767
+ };
768
+ if (O = e.watcher, T) for (let e of T.includeDirs) O.add(e);
769
+ for (let t of [
770
+ "add",
771
+ "change",
772
+ "unlink"
773
+ ]) e.watcher.on(t, (i) => {
774
+ if (r(i)) {
775
+ $e(n, e.config.root);
776
+ return;
777
+ }
778
+ l(t, i);
740
779
  });
741
780
  }
742
781
  };
743
782
  }
744
783
  //#endregion
745
- export { e as BUILTIN_LOCALE_KEYS, R as REQUIRED_OPTIMIZE_DEPS_EXCLUDE, L as REQUIRED_OPTIMIZE_DEPS_INCLUDE, tt as bitbossUi, w as collectSourceFiles, M as generateDayjsLocalesModule, F as generateLinkModule, A as generateLocaleRegistryDts, k as generateLocalesModule, I as generateVariantsDts, P as hasInertia, j as resolveDayjsLocales, O as resolveEnabledLocales, J as stripJsonComments, Z as updateVscodeSettings };
784
+ export { e as BB_LAYERS, u as BUILTIN_LOCALE_KEYS, r as DEFAULT_MAX_FILE_SIZE, i as IconScanner, G as REQUIRED_OPTIMIZE_DEPS_EXCLUDE, W as REQUIRED_OPTIMIZE_DEPS_INCLUDE, t as TAILWIND_V4_LAYERS, ct as bitbossUi, k as diagnoseMissingIcon, j as expandIconWhitelist, a as extractIconCandidates, z as generateDayjsLocalesModule, H as generateLinkModule, L as generateLocaleRegistryDts, I as generateLocalesModule, U as generateVariantsDts, V as hasInertia, c as iconLiteralRegExp, l as iconScanCacheFile, R as resolveDayjsLocales, F as resolveEnabledLocales, et as stripJsonComments, it as updateVscodeSettings };