@frontmcp/uipack 0.6.3 → 0.7.2

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 (56) hide show
  1. package/CLAUDE.md +0 -14
  2. package/adapters/index.js +50 -47
  3. package/adapters/platform-meta.d.ts.map +1 -1
  4. package/adapters/response-builder.d.ts +16 -3
  5. package/adapters/response-builder.d.ts.map +1 -1
  6. package/bridge-runtime/iife-generator.d.ts.map +1 -1
  7. package/bridge-runtime/index.js +4 -0
  8. package/build/index.d.ts +1 -1
  9. package/build/index.d.ts.map +1 -1
  10. package/build/index.js +61 -69
  11. package/bundler/index.js +35 -34
  12. package/dependency/import-map.d.ts.map +1 -1
  13. package/dependency/index.js +22 -29
  14. package/esm/adapters/index.mjs +52 -42
  15. package/esm/bridge-runtime/index.mjs +4 -0
  16. package/esm/build/index.mjs +30 -32
  17. package/esm/bundler/index.mjs +19 -11
  18. package/esm/dependency/index.mjs +18 -18
  19. package/esm/handlebars/index.mjs +9 -8
  20. package/esm/index.mjs +107 -126
  21. package/esm/package.json +3 -2
  22. package/esm/registry/index.mjs +53 -49
  23. package/esm/renderers/index.mjs +15 -21
  24. package/esm/runtime/index.mjs +16 -15
  25. package/esm/theme/index.mjs +8 -0
  26. package/esm/tool-template/index.mjs +23 -15
  27. package/esm/typings/index.mjs +4 -0
  28. package/esm/utils/index.mjs +9 -56
  29. package/esm/validation/index.mjs +9 -8
  30. package/handlebars/index.js +4 -10
  31. package/index.js +186 -211
  32. package/package.json +3 -2
  33. package/preview/generic-preview.d.ts +4 -5
  34. package/preview/generic-preview.d.ts.map +1 -1
  35. package/preview/types.d.ts +15 -1
  36. package/preview/types.d.ts.map +1 -1
  37. package/registry/index.js +61 -63
  38. package/registry/render-template.d.ts.map +1 -1
  39. package/renderers/index.js +16 -28
  40. package/renderers/utils/detect.d.ts.map +1 -1
  41. package/runtime/index.js +20 -25
  42. package/runtime/sanitizer.d.ts.map +1 -1
  43. package/theme/css-to-theme.d.ts +0 -27
  44. package/theme/css-to-theme.d.ts.map +1 -1
  45. package/theme/index.js +8 -0
  46. package/tool-template/index.js +30 -28
  47. package/typings/dts-parser.d.ts.map +1 -1
  48. package/typings/index.js +4 -0
  49. package/utils/index.d.ts +2 -3
  50. package/utils/index.d.ts.map +1 -1
  51. package/utils/index.js +7 -63
  52. package/validation/index.js +6 -12
  53. package/utils/escape-html.d.ts +0 -102
  54. package/utils/escape-html.d.ts.map +0 -1
  55. package/utils/safe-stringify.d.ts +0 -30
  56. package/utils/safe-stringify.d.ts.map +0 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@frontmcp/uipack",
3
- "version": "0.6.3",
3
+ "version": "0.7.2",
4
4
  "description": "FrontMCP UIpack - Bundling, build tools, and platform adapters for MCP UI development (React-free core)",
5
5
  "author": "AgentFront <info@agentfront.dev>",
6
6
  "homepage": "https://docs.agentfront.dev",
@@ -55,8 +55,9 @@
55
55
  "./esm": null
56
56
  },
57
57
  "dependencies": {
58
+ "@frontmcp/utils": "0.7.2",
58
59
  "@swc/core": "^1.5.0",
59
- "enclave-vm": "^1.0.3",
60
+ "enclave-vm": "^2.7.0",
60
61
  "esbuild": "^0.27.1",
61
62
  "handlebars": "^4.7.8",
62
63
  "zod": "^4.0.0"
@@ -2,9 +2,8 @@
2
2
  * Generic Preview Handler
3
3
  *
4
4
  * Generates metadata for generic MCP clients.
5
- * Uses frontmcp/* namespace with ui/* fallback for compatibility.
6
- *
7
- * Behaves like OpenAI but with different metadata namespaces.
5
+ * Uses ui/* namespace for maximum compatibility with MCP clients
6
+ * (Claude, Cursor, etc.).
8
7
  *
9
8
  * @packageDocumentation
10
9
  */
@@ -12,8 +11,8 @@ import type { PreviewHandler, DiscoveryPreviewOptions, ExecutionPreviewOptions,
12
11
  /**
13
12
  * Preview handler for generic MCP clients.
14
13
  *
15
- * Uses the same patterns as OpenAI but with frontmcp/* namespace
16
- * and ui/* fallback for maximum compatibility.
14
+ * Uses the ui/* namespace for maximum compatibility with
15
+ * MCP clients (Claude, Cursor, etc.).
17
16
  *
18
17
  * @example
19
18
  * ```typescript
@@ -1 +1 @@
1
- {"version":3,"file":"generic-preview.d.ts","sourceRoot":"","sources":["../../src/preview/generic-preview.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EACV,cAAc,EACd,uBAAuB,EACvB,uBAAuB,EACvB,aAAa,EACb,aAAa,EAGd,MAAM,SAAS,CAAC;AAsBjB;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,qBAAa,cAAe,YAAW,cAAc;IACnD,QAAQ,CAAC,QAAQ,EAAG,SAAS,CAAU;IAEvC;;OAEG;IACH,YAAY,CAAC,OAAO,EAAE,uBAAuB,GAAG,aAAa;IAkB7D;;OAEG;IACH,YAAY,CAAC,OAAO,EAAE,uBAAuB,GAAG,aAAa;IAsB7D,OAAO,CAAC,kBAAkB;IAqB1B,OAAO,CAAC,kBAAkB;IAiB1B,OAAO,CAAC,kBAAkB;IAgB1B,OAAO,CAAC,kBAAkB;IA4B1B,OAAO,CAAC,kBAAkB;IA+B1B,OAAO,CAAC,kBAAkB;IAwB1B;;;;;OAKG;IACH,OAAO,CAAC,iBAAiB;IAuCzB;;;;;OAKG;IACH,OAAO,CAAC,uBAAuB;CA6BhC"}
1
+ {"version":3,"file":"generic-preview.d.ts","sourceRoot":"","sources":["../../src/preview/generic-preview.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EACV,cAAc,EACd,uBAAuB,EACvB,uBAAuB,EACvB,aAAa,EACb,aAAa,EAGd,MAAM,SAAS,CAAC;AAsBjB;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,qBAAa,cAAe,YAAW,cAAc;IACnD,QAAQ,CAAC,QAAQ,EAAG,SAAS,CAAU;IAEvC;;OAEG;IACH,YAAY,CAAC,OAAO,EAAE,uBAAuB,GAAG,aAAa;IAkB7D;;OAEG;IACH,YAAY,CAAC,OAAO,EAAE,uBAAuB,GAAG,aAAa;IAsB7D,OAAO,CAAC,kBAAkB;IAoB1B,OAAO,CAAC,kBAAkB;IAkB1B,OAAO,CAAC,kBAAkB;IAgB1B,OAAO,CAAC,kBAAkB;IA2B1B,OAAO,CAAC,kBAAkB;IA8B1B,OAAO,CAAC,kBAAkB;IAuB1B;;;;;OAKG;IACH,OAAO,CAAC,iBAAiB;IAuCzB;;;;;OAKG;IACH,OAAO,CAAC,uBAAuB;CA6BhC"}
@@ -165,7 +165,15 @@ export interface ClaudeMetaFields {
165
165
  'claude/prefersBorder'?: boolean;
166
166
  }
167
167
  /**
168
- * FrontMCP/Generic metadata fields.
168
+ * Generic MCP metadata fields.
169
+ * Uses ui/* namespace for maximum compatibility with MCP clients.
170
+ *
171
+ * Note: This type includes both legacy frontmcp/* and new ui/* keys
172
+ * for type compatibility during the migration period. New code should
173
+ * only emit ui/* keys. The frontmcp/* keys will be removed in a future
174
+ * major version.
175
+ *
176
+ * @deprecated frontmcp/* keys are deprecated - use ui/* keys instead
169
177
  */
170
178
  export interface FrontMCPMetaFields {
171
179
  'frontmcp/html'?: string;
@@ -177,6 +185,12 @@ export interface FrontMCPMetaFields {
177
185
  };
178
186
  'ui/html'?: string;
179
187
  'ui/mimeType'?: string;
188
+ 'ui/resourceUri'?: string;
189
+ 'ui/component'?: string;
190
+ 'ui/widgetCSP'?: {
191
+ connectDomains?: string[];
192
+ resourceDomains?: string[];
193
+ };
180
194
  }
181
195
  /**
182
196
  * Combined metadata fields for all platforms.
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/preview/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/preview/types.ts"],"names":[],"mappings":"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"}
package/registry/index.js CHANGED
@@ -570,31 +570,12 @@ var init_theme2 = __esm({
570
570
  }
571
571
  });
572
572
 
573
- // libs/uipack/src/utils/escape-html.ts
574
- function escapeHtml(str) {
575
- if (str === null || str === void 0) {
576
- return "";
577
- }
578
- const s = String(str);
579
- return s.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;").replace(/'/g, "&#39;").replace(/\u2028/g, "\\u2028").replace(/\u2029/g, "\\u2029");
580
- }
581
- function escapeJsString(str) {
582
- return str.replace(/\\/g, "\\\\").replace(/'/g, "\\'").replace(/"/g, '\\"').replace(/\n/g, "\\n").replace(/\r/g, "\\r").replace(/\t/g, "\\t").replace(/\u2028/g, "\\u2028").replace(/\u2029/g, "\\u2029");
583
- }
584
- function escapeScriptClose(jsonString) {
585
- return jsonString.replace(/<\//g, "<\\/");
586
- }
587
- var init_escape_html = __esm({
588
- "libs/uipack/src/utils/escape-html.ts"() {
589
- "use strict";
590
- }
591
- });
592
-
593
573
  // libs/uipack/src/utils/index.ts
574
+ var import_utils;
594
575
  var init_utils = __esm({
595
576
  "libs/uipack/src/utils/index.ts"() {
596
577
  "use strict";
597
- init_escape_html();
578
+ import_utils = require("@frontmcp/utils");
598
579
  }
599
580
  });
600
581
 
@@ -848,6 +829,9 @@ function isTemplateBuilderFunction(fn) {
848
829
  return true;
849
830
  }
850
831
  function containsJsx(source) {
832
+ if (source.length > MAX_TEMPLATE_LENGTH) {
833
+ return false;
834
+ }
851
835
  if (/<[A-Z][a-zA-Z0-9]*(\s|>|\/)/.test(source)) {
852
836
  return true;
853
837
  }
@@ -872,6 +856,9 @@ function containsJsx(source) {
872
856
  return false;
873
857
  }
874
858
  function containsMdxSyntax(source) {
859
+ if (source.length > MAX_TEMPLATE_LENGTH) {
860
+ return false;
861
+ }
875
862
  if (/<[A-Z][a-zA-Z0-9]*/.test(source)) {
876
863
  return true;
877
864
  }
@@ -945,9 +932,11 @@ function detectTemplateType(template) {
945
932
  reason: "Unknown template type, defaulting to HTML"
946
933
  };
947
934
  }
935
+ var MAX_TEMPLATE_LENGTH;
948
936
  var init_detect = __esm({
949
937
  "libs/uipack/src/renderers/utils/detect.ts"() {
950
938
  "use strict";
939
+ MAX_TEMPLATE_LENGTH = 5e4;
951
940
  }
952
941
  });
953
942
 
@@ -1137,7 +1126,7 @@ var init_helpers = __esm({
1137
1126
  idCounter = 0;
1138
1127
  builtinHelpers = {
1139
1128
  // Escaping
1140
- escapeHtml,
1129
+ escapeHtml: import_utils.escapeHtml,
1141
1130
  // Formatting
1142
1131
  formatDate,
1143
1132
  formatCurrency,
@@ -1308,7 +1297,7 @@ __export(handlebars_exports, {
1308
1297
  createHandlebarsRenderer: () => createHandlebarsRenderer,
1309
1298
  defaultValue: () => defaultValue,
1310
1299
  eq: () => eq,
1311
- escapeHtml: () => escapeHtml,
1300
+ escapeHtml: () => import_utils.escapeHtml,
1312
1301
  extractAll: () => extractAll,
1313
1302
  extractExpressions: () => extractExpressions,
1314
1303
  extractInputPaths: () => extractInputPaths,
@@ -1954,12 +1943,12 @@ var init_mdx_client_renderer = __esm({
1954
1943
  ...outputProps,
1955
1944
  ...props
1956
1945
  };
1957
- const escapedMdx = escapeScriptClose(JSON.stringify(template));
1958
- const escapedProps = escapeScriptClose(JSON.stringify(spreadProps));
1959
- const safeContainerId = escapeJsString(containerId);
1960
- const loadingHtml = showLoading ? `<div class="mdx-loading">${escapeHtml(loadingMessage)}</div>` : "";
1946
+ const escapedMdx = (0, import_utils.escapeScriptClose)(JSON.stringify(template));
1947
+ const escapedProps = (0, import_utils.escapeScriptClose)(JSON.stringify(spreadProps));
1948
+ const safeContainerId = (0, import_utils.escapeJsString)(containerId);
1949
+ const loadingHtml = showLoading ? `<div class="mdx-loading">${(0, import_utils.escapeHtml)(loadingMessage)}</div>` : "";
1961
1950
  return `
1962
- <div id="${escapeHtml(containerId)}">${loadingHtml}</div>
1951
+ <div id="${(0, import_utils.escapeHtml)(containerId)}">${loadingHtml}</div>
1963
1952
  <script type="module">
1964
1953
  (async function() {
1965
1954
  try {
@@ -2167,11 +2156,12 @@ var init_renderers = __esm({
2167
2156
  function sha256(content) {
2168
2157
  return (0, import_crypto.createHash)("sha256").update(content, "utf8").digest("hex");
2169
2158
  }
2170
- var import_crypto;
2159
+ var import_crypto, import_utils6;
2171
2160
  var init_hash_calculator = __esm({
2172
2161
  "libs/uipack/src/bundler/file-cache/hash-calculator.ts"() {
2173
2162
  "use strict";
2174
2163
  import_crypto = require("crypto");
2164
+ import_utils6 = require("@frontmcp/utils");
2175
2165
  }
2176
2166
  });
2177
2167
 
@@ -3022,7 +3012,11 @@ FrontMcpBridge.prototype._setupDataToolCallHandler = function() {
3022
3012
  };
3023
3013
  `.trim();
3024
3014
  }
3015
+ var MAX_MINIFY_CODE_LENGTH = 5e5;
3025
3016
  function minifyJS(code) {
3017
+ if (code.length > MAX_MINIFY_CODE_LENGTH) {
3018
+ return code;
3019
+ }
3026
3020
  return code.replace(/\/\*[\s\S]*?\*\//g, "").replace(/\/\/.*$/gm, "").replace(/\s+/g, " ").replace(/\s*([{};,:()[\]])\s*/g, "$1").replace(/;\}/g, "}").trim();
3027
3021
  }
3028
3022
  function generatePlatformBundle(platform, options = {}) {
@@ -3129,7 +3123,7 @@ function createTemplateHelpers() {
3129
3123
  /**
3130
3124
  * Escape HTML special characters to prevent XSS
3131
3125
  */
3132
- escapeHtml,
3126
+ escapeHtml: import_utils.escapeHtml,
3133
3127
  /**
3134
3128
  * Format a date for display
3135
3129
  */
@@ -3246,7 +3240,7 @@ function wrapToolUIUniversal(options) {
3246
3240
  resourceMode
3247
3241
  });
3248
3242
  const bridgeScript = includeBridge ? BRIDGE_SCRIPT_TAGS.universal : "";
3249
- const pageTitle = title || `${escapeHtml(toolName)} - Tool Result`;
3243
+ const pageTitle = title || `${(0, import_utils.escapeHtml)(toolName)} - Tool Result`;
3250
3244
  return `<!DOCTYPE html>
3251
3245
  <html lang="en">
3252
3246
  <head>
@@ -3471,7 +3465,7 @@ function wrapLeanWidgetShell(options) {
3471
3465
  <head>
3472
3466
  <meta charset="UTF-8">
3473
3467
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
3474
- <title>${escapeHtml(title || toolName)}</title>
3468
+ <title>${(0, import_utils.escapeHtml)(title || toolName)}</title>
3475
3469
  ${fontPreconnect}
3476
3470
  ${fontStylesheets}
3477
3471
  ${tailwindScript}
@@ -3872,7 +3866,7 @@ function wrapHybridWidgetShell(options) {
3872
3866
  <head>
3873
3867
  <meta charset="UTF-8">
3874
3868
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
3875
- <title>${escapeHtml(title || toolName)}</title>
3869
+ <title>${(0, import_utils.escapeHtml)(title || toolName)}</title>
3876
3870
  ${fontPreconnect}
3877
3871
  ${fontStylesheets}
3878
3872
  ${tailwindScript}
@@ -4414,7 +4408,7 @@ function wrapStaticWidgetUniversal(options) {
4414
4408
  }, 100);
4415
4409
  }
4416
4410
  </script>` : "";
4417
- const pageTitle = title || `${escapeHtml(toolName)} - Tool Widget`;
4411
+ const pageTitle = title || `${(0, import_utils.escapeHtml)(toolName)} - Tool Widget`;
4418
4412
  const loaderHtml = isReactBased && componentCode && !hasEmbeddedData ? `
4419
4413
  <!-- Loading State -->
4420
4414
  <div id="frontmcp-loader" style="display: flex; align-items: center; justify-content: center; padding: 2rem; gap: 0.5rem;">
@@ -4464,7 +4458,11 @@ function wrapStaticWidgetUniversal(options) {
4464
4458
  }
4465
4459
 
4466
4460
  // libs/uipack/src/registry/render-template.ts
4461
+ var MAX_MDX_SOURCE_LENGTH = 1e5;
4467
4462
  function containsMdxSyntax2(source) {
4463
+ if (source.length > MAX_MDX_SOURCE_LENGTH) {
4464
+ return false;
4465
+ }
4468
4466
  if (/<[A-Z][a-zA-Z0-9]*/.test(source)) {
4469
4467
  return true;
4470
4468
  }
@@ -4632,16 +4630,13 @@ function buildUIMeta(options) {
4632
4630
  case "generic-mcp":
4633
4631
  case "gemini":
4634
4632
  default:
4635
- meta["frontmcp/html"] = html;
4636
- meta["frontmcp/mimeType"] = "text/html+mcp";
4637
- if (rendererType) meta["frontmcp/type"] = rendererType;
4638
- if (contentHash) meta["frontmcp/contentHash"] = contentHash;
4639
- if (manifestUri) meta["frontmcp/manifestUri"] = manifestUri;
4640
- if (token) meta["frontmcp/widgetToken"] = token;
4641
- if (directUrl) meta["frontmcp/directUrl"] = directUrl;
4642
4633
  meta["ui/html"] = html;
4643
4634
  meta["ui/mimeType"] = "text/html+mcp";
4644
4635
  if (rendererType) meta["ui/type"] = rendererType;
4636
+ if (contentHash) meta["ui/contentHash"] = contentHash;
4637
+ if (manifestUri) meta["ui/manifestUri"] = manifestUri;
4638
+ if (token) meta["ui/widgetToken"] = token;
4639
+ if (directUrl) meta["ui/directUrl"] = directUrl;
4645
4640
  if (platformType === "claude") {
4646
4641
  return buildClaudeMeta(meta, uiConfig);
4647
4642
  } else if (platformType === "gemini") {
@@ -4690,34 +4685,37 @@ function buildIDEMeta(meta, uiConfig) {
4690
4685
  }
4691
4686
  return meta;
4692
4687
  }
4693
- function buildFrontMCPCSP(csp) {
4694
- const result = {};
4695
- if (csp.connectDomains?.length) {
4696
- result.connectDomains = csp.connectDomains;
4697
- }
4698
- if (csp.resourceDomains?.length) {
4699
- result.resourceDomains = csp.resourceDomains;
4700
- }
4701
- return result;
4702
- }
4703
4688
  function buildGenericMeta(meta, uiConfig) {
4704
- if (uiConfig.widgetAccessible) {
4705
- meta["frontmcp/widgetAccessible"] = true;
4706
- }
4707
4689
  if (uiConfig.csp) {
4708
- meta["frontmcp/widgetCSP"] = buildFrontMCPCSP(uiConfig.csp);
4690
+ const csp = {};
4691
+ if (uiConfig.csp.connectDomains?.length) {
4692
+ csp.connectDomains = uiConfig.csp.connectDomains;
4693
+ }
4694
+ if (uiConfig.csp.resourceDomains?.length) {
4695
+ csp.resourceDomains = uiConfig.csp.resourceDomains;
4696
+ }
4697
+ if (Object.keys(csp).length > 0) {
4698
+ meta["ui/csp"] = csp;
4699
+ }
4709
4700
  }
4710
4701
  if (uiConfig.displayMode) {
4711
- meta["frontmcp/displayMode"] = uiConfig.displayMode;
4712
- }
4713
- if (uiConfig.widgetDescription) {
4714
- meta["frontmcp/widgetDescription"] = uiConfig.widgetDescription;
4702
+ const displayModeMap = {
4703
+ inline: "inline",
4704
+ fullscreen: "fullscreen",
4705
+ pip: "pip",
4706
+ widget: "inline",
4707
+ panel: "fullscreen"
4708
+ };
4709
+ const mappedMode = displayModeMap[uiConfig.displayMode];
4710
+ if (mappedMode) {
4711
+ meta["ui/displayMode"] = mappedMode;
4712
+ }
4715
4713
  }
4716
4714
  if (uiConfig.prefersBorder !== void 0) {
4717
- meta["frontmcp/prefersBorder"] = uiConfig.prefersBorder;
4715
+ meta["ui/prefersBorder"] = uiConfig.prefersBorder;
4718
4716
  }
4719
4717
  if (uiConfig.sandboxDomain) {
4720
- meta["frontmcp/domain"] = uiConfig.sandboxDomain;
4718
+ meta["ui/domain"] = uiConfig.sandboxDomain;
4721
4719
  }
4722
4720
  return meta;
4723
4721
  }
@@ -4991,7 +4989,7 @@ function getSchemaPathStrings(schema, prefix = "output") {
4991
4989
  }
4992
4990
 
4993
4991
  // libs/uipack/src/validation/template-validator.ts
4994
- init_expression_extractor();
4992
+ init_handlebars();
4995
4993
  function validateTemplate(template, outputSchema, options = {}) {
4996
4994
  const { inputSchema, warnOnOptional = true, suggestSimilar = true, maxSuggestionDistance = 3 } = options;
4997
4995
  const errors = [];
@@ -5341,7 +5339,7 @@ function safeInputToRecord(input) {
5341
5339
  return {};
5342
5340
  }
5343
5341
  var defaultHelpers = {
5344
- escapeHtml,
5342
+ escapeHtml: import_utils.escapeHtml,
5345
5343
  formatDate: (date, format) => {
5346
5344
  const d = date instanceof Date ? date : new Date(date);
5347
5345
  if (format === "iso") return d.toISOString();
@@ -1 +1 @@
1
- {"version":3,"file":"render-template.d.ts","sourceRoot":"","sources":["../../src/registry/render-template.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAmB,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAOrF;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAsCzD;AAkCD;;;;;;;;;;GAUG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,OAAO,GAAG,OAAO,CAyB3D;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,+CAA+C;IAE/C,QAAQ,EAAE,iBAAiB,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,MAAM,GAAG,CAAC,CAAC,KAAK,EAAE,GAAG,KAAK,GAAG,CAAC,CAAC;IAC/E,2BAA2B;IAC3B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,4CAA4C;IAC5C,MAAM,EAAE,OAAO,CAAC;IAChB,4CAA4C;IAC5C,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,oDAAoD;IAEpD,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CACrC;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,qBAAqB,GAAG,MAAM,CAuBzE;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE;IAAE,EAAE,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,QAAQ,IAAI;IAAE,EAAE,EAAE,gBAAgB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;CAAE,CAG9G;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAsB,uBAAuB,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAmGpG"}
1
+ {"version":3,"file":"render-template.d.ts","sourceRoot":"","sources":["../../src/registry/render-template.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAmB,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAYrF;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CA2CzD;AAkCD;;;;;;;;;;GAUG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,OAAO,GAAG,OAAO,CAyB3D;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,+CAA+C;IAE/C,QAAQ,EAAE,iBAAiB,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,MAAM,GAAG,CAAC,CAAC,KAAK,EAAE,GAAG,KAAK,GAAG,CAAC,CAAC;IAC/E,2BAA2B;IAC3B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,4CAA4C;IAC5C,MAAM,EAAE,OAAO,CAAC;IAChB,4CAA4C;IAC5C,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,oDAAoD;IAEpD,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CACrC;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,qBAAqB,GAAG,MAAM,CAuBzE;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE;IAAE,EAAE,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,QAAQ,IAAI;IAAE,EAAE,EAAE,gBAAgB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;CAAE,CAG9G;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAsB,uBAAuB,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAmGpG"}
@@ -30,31 +30,12 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
30
30
  ));
31
31
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
32
32
 
33
- // libs/uipack/src/utils/escape-html.ts
34
- function escapeHtml(str) {
35
- if (str === null || str === void 0) {
36
- return "";
37
- }
38
- const s = String(str);
39
- return s.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;").replace(/'/g, "&#39;").replace(/\u2028/g, "\\u2028").replace(/\u2029/g, "\\u2029");
40
- }
41
- function escapeJsString(str) {
42
- return str.replace(/\\/g, "\\\\").replace(/'/g, "\\'").replace(/"/g, '\\"').replace(/\n/g, "\\n").replace(/\r/g, "\\r").replace(/\t/g, "\\t").replace(/\u2028/g, "\\u2028").replace(/\u2029/g, "\\u2029");
43
- }
44
- function escapeScriptClose(jsonString) {
45
- return jsonString.replace(/<\//g, "<\\/");
46
- }
47
- var init_escape_html = __esm({
48
- "libs/uipack/src/utils/escape-html.ts"() {
49
- "use strict";
50
- }
51
- });
52
-
53
33
  // libs/uipack/src/utils/index.ts
34
+ var import_utils;
54
35
  var init_utils = __esm({
55
36
  "libs/uipack/src/utils/index.ts"() {
56
37
  "use strict";
57
- init_escape_html();
38
+ import_utils = require("@frontmcp/utils");
58
39
  }
59
40
  });
60
41
 
@@ -244,7 +225,7 @@ var init_helpers = __esm({
244
225
  idCounter = 0;
245
226
  builtinHelpers = {
246
227
  // Escaping
247
- escapeHtml,
228
+ escapeHtml: import_utils.escapeHtml,
248
229
  // Formatting
249
230
  formatDate,
250
231
  formatCurrency,
@@ -415,7 +396,7 @@ __export(handlebars_exports, {
415
396
  createHandlebarsRenderer: () => createHandlebarsRenderer,
416
397
  defaultValue: () => defaultValue,
417
398
  eq: () => eq,
418
- escapeHtml: () => escapeHtml,
399
+ escapeHtml: () => import_utils.escapeHtml,
419
400
  extractAll: () => extractAll,
420
401
  extractExpressions: () => extractExpressions,
421
402
  extractInputPaths: () => extractInputPaths,
@@ -932,6 +913,7 @@ var CLAUDE_PLATFORM = {
932
913
  };
933
914
 
934
915
  // libs/uipack/src/renderers/utils/detect.ts
916
+ var MAX_TEMPLATE_LENGTH = 5e4;
935
917
  function isReactComponent(value) {
936
918
  if (typeof value !== "function") {
937
919
  return false;
@@ -960,6 +942,9 @@ function isTemplateBuilderFunction(fn) {
960
942
  return true;
961
943
  }
962
944
  function containsJsx(source) {
945
+ if (source.length > MAX_TEMPLATE_LENGTH) {
946
+ return false;
947
+ }
963
948
  if (/<[A-Z][a-zA-Z0-9]*(\s|>|\/)/.test(source)) {
964
949
  return true;
965
950
  }
@@ -984,6 +969,9 @@ function containsJsx(source) {
984
969
  return false;
985
970
  }
986
971
  function containsMdxSyntax(source) {
972
+ if (source.length > MAX_TEMPLATE_LENGTH) {
973
+ return false;
974
+ }
987
975
  if (/<[A-Z][a-zA-Z0-9]*/.test(source)) {
988
976
  return true;
989
977
  }
@@ -1437,12 +1425,12 @@ var MdxClientRenderer = class {
1437
1425
  ...outputProps,
1438
1426
  ...props
1439
1427
  };
1440
- const escapedMdx = escapeScriptClose(JSON.stringify(template));
1441
- const escapedProps = escapeScriptClose(JSON.stringify(spreadProps));
1442
- const safeContainerId = escapeJsString(containerId);
1443
- const loadingHtml = showLoading ? `<div class="mdx-loading">${escapeHtml(loadingMessage)}</div>` : "";
1428
+ const escapedMdx = (0, import_utils.escapeScriptClose)(JSON.stringify(template));
1429
+ const escapedProps = (0, import_utils.escapeScriptClose)(JSON.stringify(spreadProps));
1430
+ const safeContainerId = (0, import_utils.escapeJsString)(containerId);
1431
+ const loadingHtml = showLoading ? `<div class="mdx-loading">${(0, import_utils.escapeHtml)(loadingMessage)}</div>` : "";
1444
1432
  return `
1445
- <div id="${escapeHtml(containerId)}">${loadingHtml}</div>
1433
+ <div id="${(0, import_utils.escapeHtml)(containerId)}">${loadingHtml}</div>
1446
1434
  <script type="module">
1447
1435
  (async function() {
1448
1436
  try {
@@ -1 +1 @@
1
- {"version":3,"file":"detect.d.ts","sourceRoot":"","sources":["../../../src/renderers/utils/detect.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAuCxD;AAED;;;;;;;GAOG;AACH,wBAAgB,yBAAyB,CAAC,EAAE,EAAE,QAAQ,GAAG,OAAO,CAa/D;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAqCnD;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAkCzD;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAEnD;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,OAAO,GAAG;IACrD,IAAI,EAAE,OAAO,GAAG,KAAK,GAAG,YAAY,GAAG,eAAe,GAAG,aAAa,CAAC;IACvE,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;CAChB,CA8DA"}
1
+ {"version":3,"file":"detect.d.ts","sourceRoot":"","sources":["../../../src/renderers/utils/detect.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAQH;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAuCxD;AAED;;;;;;;GAOG;AACH,wBAAgB,yBAAyB,CAAC,EAAE,EAAE,QAAQ,GAAG,OAAO,CAa/D;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CA0CnD;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAuCzD;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAEnD;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,OAAO,GAAG;IACrD,IAAI,EAAE,OAAO,GAAG,KAAK,GAAG,YAAY,GAAG,eAAe,GAAG,aAAa,CAAC;IACvE,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;CAChB,CA8DA"}
package/runtime/index.js CHANGED
@@ -30,25 +30,12 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
30
30
  ));
31
31
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
32
32
 
33
- // libs/uipack/src/utils/escape-html.ts
34
- function escapeHtml(str) {
35
- if (str === null || str === void 0) {
36
- return "";
37
- }
38
- const s = String(str);
39
- return s.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;").replace(/'/g, "&#39;").replace(/\u2028/g, "\\u2028").replace(/\u2029/g, "\\u2029");
40
- }
41
- var init_escape_html = __esm({
42
- "libs/uipack/src/utils/escape-html.ts"() {
43
- "use strict";
44
- }
45
- });
46
-
47
33
  // libs/uipack/src/utils/index.ts
34
+ var import_utils;
48
35
  var init_utils = __esm({
49
36
  "libs/uipack/src/utils/index.ts"() {
50
37
  "use strict";
51
- init_escape_html();
38
+ import_utils = require("@frontmcp/utils");
52
39
  }
53
40
  });
54
41
 
@@ -238,7 +225,7 @@ var init_helpers = __esm({
238
225
  idCounter = 0;
239
226
  builtinHelpers = {
240
227
  // Escaping
241
- escapeHtml,
228
+ escapeHtml: import_utils.escapeHtml,
242
229
  // Formatting
243
230
  formatDate,
244
231
  formatCurrency,
@@ -409,7 +396,7 @@ __export(handlebars_exports, {
409
396
  createHandlebarsRenderer: () => createHandlebarsRenderer,
410
397
  defaultValue: () => defaultValue,
411
398
  eq: () => eq,
412
- escapeHtml: () => escapeHtml,
399
+ escapeHtml: () => import_utils.escapeHtml,
413
400
  extractAll: () => extractAll,
414
401
  extractExpressions: () => extractExpressions,
415
402
  extractInputPaths: () => extractInputPaths,
@@ -1831,7 +1818,11 @@ FrontMcpBridge.prototype._setupDataToolCallHandler = function() {
1831
1818
  };
1832
1819
  `.trim();
1833
1820
  }
1821
+ var MAX_MINIFY_CODE_LENGTH = 5e5;
1834
1822
  function minifyJS(code) {
1823
+ if (code.length > MAX_MINIFY_CODE_LENGTH) {
1824
+ return code;
1825
+ }
1835
1826
  return code.replace(/\/\*[\s\S]*?\*\//g, "").replace(/\/\/.*$/gm, "").replace(/\s+/g, " ").replace(/\s*([{};,:()[\]])\s*/g, "$1").replace(/;\}/g, "}").trim();
1836
1827
  }
1837
1828
  function generatePlatformBundle(platform, options = {}) {
@@ -2985,7 +2976,11 @@ function detectPIIType(value) {
2985
2976
  if (isIPv4(value)) return "IP";
2986
2977
  return null;
2987
2978
  }
2979
+ var MAX_PII_TEXT_LENGTH = 1e5;
2988
2980
  function redactPIIFromText(text) {
2981
+ if (text.length > MAX_PII_TEXT_LENGTH) {
2982
+ return text;
2983
+ }
2989
2984
  let result = text;
2990
2985
  result = result.replace(PII_PATTERNS.creditCardInText, REDACTION_TOKENS.CARD);
2991
2986
  result = result.replace(PII_PATTERNS.ssnInText, REDACTION_TOKENS.ID);
@@ -3104,7 +3099,7 @@ function createTemplateHelpers() {
3104
3099
  /**
3105
3100
  * Escape HTML special characters to prevent XSS
3106
3101
  */
3107
- escapeHtml,
3102
+ escapeHtml: import_utils.escapeHtml,
3108
3103
  /**
3109
3104
  * Format a date for display
3110
3105
  */
@@ -3208,7 +3203,7 @@ function wrapToolUI(options) {
3208
3203
  widgetAccessible,
3209
3204
  hostContext
3210
3205
  });
3211
- const pageTitle = title || `${escapeHtml(toolName)} - Tool Result`;
3206
+ const pageTitle = title || `${(0, import_utils.escapeHtml)(toolName)} - Tool Result`;
3212
3207
  return `<!DOCTYPE html>
3213
3208
  <html lang="en">
3214
3209
  <head>
@@ -3361,7 +3356,7 @@ function wrapToolUIUniversal(options) {
3361
3356
  resourceMode
3362
3357
  });
3363
3358
  const bridgeScript = includeBridge ? BRIDGE_SCRIPT_TAGS.universal : "";
3364
- const pageTitle = title || `${escapeHtml(toolName)} - Tool Result`;
3359
+ const pageTitle = title || `${(0, import_utils.escapeHtml)(toolName)} - Tool Result`;
3365
3360
  return `<!DOCTYPE html>
3366
3361
  <html lang="en">
3367
3362
  <head>
@@ -3475,7 +3470,7 @@ function wrapToolUIMinimal(options) {
3475
3470
  window.__mcpWidgetAccessible = ${helpers.jsonEmbed(widgetAccessible)};
3476
3471
  window.__mcpHostContext = ${helpers.jsonEmbed(contextData)};
3477
3472
  </script>`;
3478
- const pageTitle = title || `${escapeHtml(toolName)} - Tool Result`;
3473
+ const pageTitle = title || `${(0, import_utils.escapeHtml)(toolName)} - Tool Result`;
3479
3474
  return `<!DOCTYPE html>
3480
3475
  <html lang="en">
3481
3476
  <head>
@@ -3625,7 +3620,7 @@ function wrapLeanWidgetShell(options) {
3625
3620
  <head>
3626
3621
  <meta charset="UTF-8">
3627
3622
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
3628
- <title>${escapeHtml(title || toolName)}</title>
3623
+ <title>${(0, import_utils.escapeHtml)(title || toolName)}</title>
3629
3624
  ${fontPreconnect}
3630
3625
  ${fontStylesheets}
3631
3626
  ${tailwindScript}
@@ -4026,7 +4021,7 @@ function wrapHybridWidgetShell(options) {
4026
4021
  <head>
4027
4022
  <meta charset="UTF-8">
4028
4023
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
4029
- <title>${escapeHtml(title || toolName)}</title>
4024
+ <title>${(0, import_utils.escapeHtml)(title || toolName)}</title>
4030
4025
  ${fontPreconnect}
4031
4026
  ${fontStylesheets}
4032
4027
  ${tailwindScript}
@@ -4568,7 +4563,7 @@ function wrapStaticWidgetUniversal(options) {
4568
4563
  }, 100);
4569
4564
  }
4570
4565
  </script>` : "";
4571
- const pageTitle = title || `${escapeHtml(toolName)} - Tool Widget`;
4566
+ const pageTitle = title || `${(0, import_utils.escapeHtml)(toolName)} - Tool Widget`;
4572
4567
  const loaderHtml = isReactBased && componentCode && !hasEmbeddedData ? `
4573
4568
  <!-- Loading State -->
4574
4569
  <div id="frontmcp-loader" style="display: flex; align-items: center; justify-content: center; padding: 2rem; gap: 0.5rem;">
@@ -4667,7 +4662,7 @@ function wrapToolUIForClaude(options) {
4667
4662
  window.__mcpToolInput = ${helpers.jsonEmbed(input)};
4668
4663
  window.__mcpToolOutput = ${helpers.jsonEmbed(output)};
4669
4664
  </script>`;
4670
- const pageTitle = title || `${escapeHtml(toolName)} - Tool Result`;
4665
+ const pageTitle = title || `${(0, import_utils.escapeHtml)(toolName)} - Tool Result`;
4671
4666
  return `<!DOCTYPE html>
4672
4667
  <html lang="en">
4673
4668
  <head>
@@ -1 +1 @@
1
- {"version":3,"file":"sanitizer.d.ts","sourceRoot":"","sources":["../../src/runtime/sanitizer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AAEH;;GAEG;AACH,eAAO,MAAM,gBAAgB;;;;;;;CAOnB,CAAC;AAEX;;GAEG;AACH,eAAO,MAAM,YAAY;;;;;;;;;;;CA8BxB,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,WAAW,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC;AAEnF;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B;;;;;OAKG;IACH,IAAI,EAAE,IAAI,GAAG,MAAM,EAAE,GAAG,WAAW,CAAC;IAEpC;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;;OAGG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAE9C;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAE9C;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAInD;AAED;;GAEG;AACH,wBAAgB,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAE5C;AAED;;GAEG;AACH,wBAAgB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAE7C;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,OAAO,gBAAgB,GAAG,IAAI,CAOjF;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAWtD;AA0FD;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,aAAa,CAC3B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,IAAI,GAAE,IAAI,GAAG,MAAM,EAAE,GAAG,WAAkB,GACzC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAczB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,eAAe,CAC7B,IAAI,GAAE,IAAI,GAAG,MAAM,EAAE,GAAG,WAAkB,GACzC,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAE7D;AAED;;;;;;;;GAQG;AACH,wBAAgB,SAAS,CACvB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,OAAO,CAAC,EAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,GAC9B;IACD,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB,CA0CA"}
1
+ {"version":3,"file":"sanitizer.d.ts","sourceRoot":"","sources":["../../src/runtime/sanitizer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AAEH;;GAEG;AACH,eAAO,MAAM,gBAAgB;;;;;;;CAOnB,CAAC;AAEX;;GAEG;AACH,eAAO,MAAM,YAAY;;;;;;;;;;;CA8BxB,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,WAAW,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC;AAEnF;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B;;;;;OAKG;IACH,IAAI,EAAE,IAAI,GAAG,MAAM,EAAE,GAAG,WAAW,CAAC;IAEpC;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;;OAGG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAE9C;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAE9C;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAInD;AAED;;GAEG;AACH,wBAAgB,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAE5C;AAED;;GAEG;AACH,wBAAgB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAE7C;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,OAAO,gBAAgB,GAAG,IAAI,CAOjF;AAQD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAgBtD;AA0FD;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,aAAa,CAC3B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,IAAI,GAAE,IAAI,GAAG,MAAM,EAAE,GAAG,WAAkB,GACzC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAczB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,eAAe,CAC7B,IAAI,GAAE,IAAI,GAAG,MAAM,EAAE,GAAG,WAAkB,GACzC,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAE7D;AAED;;;;;;;;GAQG;AACH,wBAAgB,SAAS,CACvB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,OAAO,CAAC,EAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,GAC9B;IACD,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB,CA0CA"}
@@ -44,33 +44,6 @@ export interface CssToThemeResult {
44
44
  */
45
45
  colorVars: Map<string, string>;
46
46
  }
47
- /**
48
- * Extract --color-* variables from user CSS and convert to Tailwind @theme block.
49
- *
50
- * This function:
51
- * 1. Finds all --color-* variable declarations in the CSS
52
- * 2. Creates a @theme block with these variables (for Tailwind v4 to process)
53
- * 3. Returns the remaining CSS without color variables
54
- *
55
- * The @theme block should be placed inside <style type="text/tailwindcss">,
56
- * which tells Tailwind v4 to:
57
- * - Create native utility classes (bg-primary, text-primary, etc.)
58
- * - Support opacity modifiers (bg-primary/10, text-success/50)
59
- *
60
- * @param userCss - CSS string containing :root with --color-* variables
61
- * @returns Object with themeBlock, remainingCss, and colorVars map
62
- *
63
- * @example
64
- * ```typescript
65
- * const result = cssToTailwindTheme(`:root {
66
- * --color-primary: #0556b2;
67
- * --font-size: 16px;
68
- * }`);
69
- *
70
- * // result.themeBlock: "@theme {\n --color-primary: #0556b2;\n}"
71
- * // result.remainingCss: ":root {\n --font-size: 16px;\n}"
72
- * ```
73
- */
74
47
  export declare function cssToTailwindTheme(userCss: string): CssToThemeResult;
75
48
  /**
76
49
  * Build a complete Tailwind style block from user CSS.