@frontmcp/ui 0.12.2 → 1.0.0-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +279 -72
- package/bridge/adapters/claude.adapter.d.ts.map +1 -1
- package/bridge/adapters/gemini.adapter.d.ts.map +1 -1
- package/bridge/index.js +2 -36
- package/components/Alert/Alert.d.ts +11 -0
- package/components/Alert/Alert.d.ts.map +1 -0
- package/components/Alert/index.d.ts +4 -0
- package/components/Alert/index.d.ts.map +1 -0
- package/components/Alert/index.js +61 -0
- package/components/Avatar/Avatar.d.ts +10 -0
- package/components/Avatar/Avatar.d.ts.map +1 -0
- package/components/Avatar/index.d.ts +4 -0
- package/components/Avatar/index.d.ts.map +1 -0
- package/components/Avatar/index.js +43 -0
- package/components/Badge/Badge.d.ts +13 -0
- package/components/Badge/Badge.d.ts.map +1 -0
- package/components/Badge/index.d.ts +4 -0
- package/components/Badge/index.d.ts.map +1 -0
- package/{render → components/Badge}/index.js +54 -42
- package/components/Button/Button.d.ts +16 -0
- package/components/Button/Button.d.ts.map +1 -0
- package/components/Button/index.d.ts +4 -0
- package/components/Button/index.d.ts.map +1 -0
- package/components/Button/index.js +91 -0
- package/components/Card/Card.d.ts +25 -0
- package/components/Card/Card.d.ts.map +1 -0
- package/components/Card/index.d.ts +4 -0
- package/components/Card/index.d.ts.map +1 -0
- package/components/Card/index.js +110 -0
- package/components/List/List.d.ts +15 -0
- package/components/List/List.d.ts.map +1 -0
- package/components/List/index.d.ts +4 -0
- package/components/List/index.d.ts.map +1 -0
- package/components/List/index.js +58 -0
- package/components/Loader/Loader.d.ts +28 -0
- package/components/Loader/Loader.d.ts.map +1 -0
- package/components/Loader/LoaderContext.d.ts +20 -0
- package/components/Loader/LoaderContext.d.ts.map +1 -0
- package/components/Loader/index.d.ts +6 -0
- package/components/Loader/index.d.ts.map +1 -0
- package/components/Loader/index.js +174 -0
- package/components/Modal/Modal.d.ts +22 -0
- package/components/Modal/Modal.d.ts.map +1 -0
- package/components/Modal/index.d.ts +4 -0
- package/components/Modal/index.d.ts.map +1 -0
- package/components/Modal/index.js +80 -0
- package/components/Select/Select.d.ts +21 -0
- package/components/Select/Select.d.ts.map +1 -0
- package/components/Select/index.d.ts +4 -0
- package/components/Select/index.d.ts.map +1 -0
- package/components/Select/index.js +78 -0
- package/components/Table/Table.d.ts +15 -0
- package/components/Table/Table.d.ts.map +1 -0
- package/components/Table/index.d.ts +4 -0
- package/components/Table/index.d.ts.map +1 -0
- package/components/Table/index.js +70 -0
- package/components/TextField/TextField.d.ts +19 -0
- package/components/TextField/TextField.d.ts.map +1 -0
- package/components/TextField/index.d.ts +4 -0
- package/components/TextField/index.d.ts.map +1 -0
- package/components/TextField/index.js +77 -0
- package/components/index.d.ts +22 -28
- package/components/index.d.ts.map +1 -1
- package/components/index.js +523 -2521
- package/esm/bridge/index.mjs +2 -6
- package/esm/components/Alert/index.mjs +28 -0
- package/esm/components/Avatar/index.mjs +10 -0
- package/esm/components/Badge/index.mjs +56 -0
- package/esm/components/Button/index.mjs +58 -0
- package/esm/components/Card/index.mjs +77 -0
- package/esm/components/List/index.mjs +25 -0
- package/esm/components/Loader/index.mjs +141 -0
- package/esm/components/Modal/index.mjs +47 -0
- package/esm/components/Select/index.mjs +45 -0
- package/esm/components/Table/index.mjs +37 -0
- package/esm/components/TextField/index.mjs +44 -0
- package/esm/components/index.mjs +513 -2415
- package/esm/index.mjs +62 -4652
- package/esm/package.json +372 -16
- package/esm/react/index.mjs +2 -285
- package/esm/renderer/charts/index.mjs +336 -0
- package/esm/renderer/common/index.mjs +135 -0
- package/esm/renderer/csv/index.mjs +193 -0
- package/esm/renderer/flow/index.mjs +259 -0
- package/esm/renderer/html/index.mjs +99 -0
- package/esm/renderer/image/index.mjs +125 -0
- package/esm/renderer/index.mjs +2173 -0
- package/esm/renderer/maps/index.mjs +217 -0
- package/esm/renderer/math/index.mjs +229 -0
- package/esm/renderer/mdx/index.mjs +261 -0
- package/esm/renderer/media/index.mjs +235 -0
- package/esm/renderer/mermaid/index.mjs +220 -0
- package/esm/renderer/pdf/index.mjs +229 -0
- package/esm/renderer/react/index.mjs +230 -0
- package/esm/runtime/index.mjs +194 -0
- package/esm/theme/index.mjs +93 -0
- package/index.d.ts +10 -18
- package/index.d.ts.map +1 -1
- package/index.js +63 -4806
- package/package.json +372 -16
- package/react/index.d.ts +8 -54
- package/react/index.d.ts.map +1 -1
- package/react/index.js +2 -295
- package/renderer/auto-detect.d.ts +39 -0
- package/renderer/auto-detect.d.ts.map +1 -0
- package/renderer/charts/index.d.ts +22 -0
- package/renderer/charts/index.d.ts.map +1 -0
- package/renderer/charts/index.js +367 -0
- package/renderer/common/index.d.ts +5 -0
- package/renderer/common/index.d.ts.map +1 -0
- package/renderer/common/index.js +158 -0
- package/renderer/common/inject-stylesheet.d.ts +9 -0
- package/renderer/common/inject-stylesheet.d.ts.map +1 -0
- package/renderer/common/lazy-import.d.ts +85 -0
- package/renderer/common/lazy-import.d.ts.map +1 -0
- package/renderer/common/use-lazy-module.d.ts +13 -0
- package/renderer/common/use-lazy-module.d.ts.map +1 -0
- package/renderer/common/use-renderer-theme.d.ts +35 -0
- package/renderer/common/use-renderer-theme.d.ts.map +1 -0
- package/renderer/csv/index.d.ts +12 -0
- package/renderer/csv/index.d.ts.map +1 -0
- package/renderer/csv/index.js +224 -0
- package/renderer/flow/index.d.ts +40 -0
- package/renderer/flow/index.d.ts.map +1 -0
- package/renderer/flow/index.js +290 -0
- package/renderer/html/index.d.ts +12 -0
- package/renderer/html/index.d.ts.map +1 -0
- package/renderer/html/index.js +130 -0
- package/renderer/image/index.d.ts +11 -0
- package/renderer/image/index.d.ts.map +1 -0
- package/renderer/image/index.js +156 -0
- package/renderer/index.d.ts +32 -0
- package/renderer/index.d.ts.map +1 -0
- package/renderer/index.js +2206 -0
- package/renderer/maps/index.d.ts +27 -0
- package/renderer/maps/index.d.ts.map +1 -0
- package/renderer/maps/index.js +248 -0
- package/renderer/math/index.d.ts +11 -0
- package/renderer/math/index.d.ts.map +1 -0
- package/renderer/math/index.js +260 -0
- package/renderer/mdx/index.d.ts +10 -0
- package/renderer/mdx/index.d.ts.map +1 -0
- package/renderer/mdx/index.js +292 -0
- package/renderer/media/index.d.ts +20 -0
- package/renderer/media/index.d.ts.map +1 -0
- package/renderer/media/index.js +266 -0
- package/renderer/mermaid/index.d.ts +11 -0
- package/renderer/mermaid/index.d.ts.map +1 -0
- package/renderer/mermaid/index.js +251 -0
- package/renderer/pdf/index.d.ts +10 -0
- package/renderer/pdf/index.d.ts.map +1 -0
- package/renderer/pdf/index.js +260 -0
- package/renderer/react/index.d.ts +45 -0
- package/renderer/react/index.d.ts.map +1 -0
- package/renderer/react/index.js +261 -0
- package/renderer/types.d.ts +24 -0
- package/renderer/types.d.ts.map +1 -0
- package/runtime/babel-runtime.d.ts +70 -0
- package/runtime/babel-runtime.d.ts.map +1 -0
- package/runtime/content-detector.d.ts +43 -0
- package/runtime/content-detector.d.ts.map +1 -0
- package/runtime/index.d.ts +10 -0
- package/runtime/index.d.ts.map +1 -0
- package/runtime/index.js +217 -0
- package/theme/FrontMcpThemeProvider.d.ts +4 -0
- package/theme/FrontMcpThemeProvider.d.ts.map +1 -0
- package/theme/create-theme.d.ts +9 -0
- package/theme/create-theme.d.ts.map +1 -0
- package/theme/index.d.ts +5 -0
- package/theme/index.d.ts.map +1 -0
- package/theme/index.js +126 -0
- package/theme/types.d.ts +28 -0
- package/theme/types.d.ts.map +1 -0
- package/theme/use-theme.d.ts +3 -0
- package/theme/use-theme.d.ts.map +1 -0
- package/bundler/browser-components.d.ts +0 -42
- package/bundler/browser-components.d.ts.map +0 -1
- package/bundler/bundler.d.ts +0 -282
- package/bundler/bundler.d.ts.map +0 -1
- package/bundler/index.d.ts +0 -43
- package/bundler/index.d.ts.map +0 -1
- package/bundler/index.js +0 -3168
- package/bundler/types.d.ts +0 -883
- package/bundler/types.d.ts.map +0 -1
- package/components/alert.d.ts +0 -83
- package/components/alert.d.ts.map +0 -1
- package/components/alert.schema.d.ts +0 -98
- package/components/alert.schema.d.ts.map +0 -1
- package/components/avatar.d.ts +0 -77
- package/components/avatar.d.ts.map +0 -1
- package/components/avatar.schema.d.ts +0 -170
- package/components/avatar.schema.d.ts.map +0 -1
- package/components/badge.d.ts +0 -78
- package/components/badge.d.ts.map +0 -1
- package/components/badge.schema.d.ts +0 -91
- package/components/badge.schema.d.ts.map +0 -1
- package/components/button.d.ts +0 -100
- package/components/button.d.ts.map +0 -1
- package/components/button.schema.d.ts +0 -120
- package/components/button.schema.d.ts.map +0 -1
- package/components/card.d.ts +0 -76
- package/components/card.d.ts.map +0 -1
- package/components/card.schema.d.ts +0 -93
- package/components/card.schema.d.ts.map +0 -1
- package/components/form.d.ts +0 -227
- package/components/form.d.ts.map +0 -1
- package/components/form.schema.d.ts +0 -365
- package/components/form.schema.d.ts.map +0 -1
- package/components/list.d.ts +0 -121
- package/components/list.d.ts.map +0 -1
- package/components/list.schema.d.ts +0 -129
- package/components/list.schema.d.ts.map +0 -1
- package/components/modal.d.ts +0 -100
- package/components/modal.d.ts.map +0 -1
- package/components/modal.schema.d.ts +0 -151
- package/components/modal.schema.d.ts.map +0 -1
- package/components/table.d.ts +0 -91
- package/components/table.d.ts.map +0 -1
- package/components/table.schema.d.ts +0 -123
- package/components/table.schema.d.ts.map +0 -1
- package/esm/bundler/index.mjs +0 -3136
- package/esm/layouts/index.mjs +0 -409
- package/esm/render/index.mjs +0 -45
- package/esm/renderers/index.mjs +0 -621
- package/esm/universal/index.mjs +0 -1946
- package/esm/web-components/index.mjs +0 -2023
- package/layouts/base.d.ts +0 -86
- package/layouts/base.d.ts.map +0 -1
- package/layouts/index.d.ts +0 -8
- package/layouts/index.d.ts.map +0 -1
- package/layouts/index.js +0 -437
- package/layouts/presets.d.ts +0 -134
- package/layouts/presets.d.ts.map +0 -1
- package/react/Alert.d.ts +0 -101
- package/react/Alert.d.ts.map +0 -1
- package/react/Badge.d.ts +0 -100
- package/react/Badge.d.ts.map +0 -1
- package/react/Button.d.ts +0 -108
- package/react/Button.d.ts.map +0 -1
- package/react/Card.d.ts +0 -103
- package/react/Card.d.ts.map +0 -1
- package/react/types.d.ts +0 -105
- package/react/types.d.ts.map +0 -1
- package/render/index.d.ts +0 -8
- package/render/index.d.ts.map +0 -1
- package/render/prerender.d.ts +0 -57
- package/render/prerender.d.ts.map +0 -1
- package/renderers/index.d.ts +0 -26
- package/renderers/index.d.ts.map +0 -1
- package/renderers/index.js +0 -666
- package/renderers/mdx.renderer.d.ts +0 -99
- package/renderers/mdx.renderer.d.ts.map +0 -1
- package/renderers/react.adapter.d.ts +0 -70
- package/renderers/react.adapter.d.ts.map +0 -1
- package/renderers/react.renderer.d.ts +0 -105
- package/renderers/react.renderer.d.ts.map +0 -1
- package/renderers/transpiler.d.ts +0 -49
- package/renderers/transpiler.d.ts.map +0 -1
- package/universal/UniversalApp.d.ts +0 -108
- package/universal/UniversalApp.d.ts.map +0 -1
- package/universal/cached-runtime.d.ts +0 -139
- package/universal/cached-runtime.d.ts.map +0 -1
- package/universal/context.d.ts +0 -122
- package/universal/context.d.ts.map +0 -1
- package/universal/index.d.ts +0 -57
- package/universal/index.d.ts.map +0 -1
- package/universal/index.js +0 -2032
- package/universal/renderers/html.renderer.d.ts +0 -36
- package/universal/renderers/html.renderer.d.ts.map +0 -1
- package/universal/renderers/index.d.ts +0 -112
- package/universal/renderers/index.d.ts.map +0 -1
- package/universal/renderers/markdown.renderer.d.ts +0 -33
- package/universal/renderers/markdown.renderer.d.ts.map +0 -1
- package/universal/renderers/mdx.renderer.d.ts +0 -38
- package/universal/renderers/mdx.renderer.d.ts.map +0 -1
- package/universal/renderers/react.renderer.d.ts +0 -46
- package/universal/renderers/react.renderer.d.ts.map +0 -1
- package/universal/runtime-builder.d.ts +0 -33
- package/universal/runtime-builder.d.ts.map +0 -1
- package/universal/store.d.ts +0 -135
- package/universal/store.d.ts.map +0 -1
- package/universal/types.d.ts +0 -199
- package/universal/types.d.ts.map +0 -1
- package/web-components/core/attribute-parser.d.ts +0 -82
- package/web-components/core/attribute-parser.d.ts.map +0 -1
- package/web-components/core/base-element.d.ts +0 -197
- package/web-components/core/base-element.d.ts.map +0 -1
- package/web-components/core/index.d.ts +0 -9
- package/web-components/core/index.d.ts.map +0 -1
- package/web-components/elements/fmcp-alert.d.ts +0 -46
- package/web-components/elements/fmcp-alert.d.ts.map +0 -1
- package/web-components/elements/fmcp-badge.d.ts +0 -47
- package/web-components/elements/fmcp-badge.d.ts.map +0 -1
- package/web-components/elements/fmcp-button.d.ts +0 -117
- package/web-components/elements/fmcp-button.d.ts.map +0 -1
- package/web-components/elements/fmcp-card.d.ts +0 -53
- package/web-components/elements/fmcp-card.d.ts.map +0 -1
- package/web-components/elements/fmcp-input.d.ts +0 -96
- package/web-components/elements/fmcp-input.d.ts.map +0 -1
- package/web-components/elements/fmcp-select.d.ts +0 -100
- package/web-components/elements/fmcp-select.d.ts.map +0 -1
- package/web-components/elements/index.d.ts +0 -13
- package/web-components/elements/index.d.ts.map +0 -1
- package/web-components/index.d.ts +0 -49
- package/web-components/index.d.ts.map +0 -1
- package/web-components/index.js +0 -2058
- package/web-components/register.d.ts +0 -57
- package/web-components/register.d.ts.map +0 -1
- package/web-components/types.d.ts +0 -122
- package/web-components/types.d.ts.map +0 -1
|
@@ -0,0 +1,261 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __create = Object.create;
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
7
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
+
var __export = (target, all) => {
|
|
9
|
+
for (var name in all)
|
|
10
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
11
|
+
};
|
|
12
|
+
var __copyProps = (to, from, except, desc) => {
|
|
13
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
14
|
+
for (let key of __getOwnPropNames(from))
|
|
15
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
16
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
17
|
+
}
|
|
18
|
+
return to;
|
|
19
|
+
};
|
|
20
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
21
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
22
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
23
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
24
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
25
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
26
|
+
mod
|
|
27
|
+
));
|
|
28
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
29
|
+
|
|
30
|
+
// libs/ui/src/renderer/react/index.ts
|
|
31
|
+
var react_exports = {};
|
|
32
|
+
__export(react_exports, {
|
|
33
|
+
ReactJsxRenderer: () => ReactJsxRenderer,
|
|
34
|
+
isReactJsx: () => isReactJsx,
|
|
35
|
+
parseImports: () => parseImports,
|
|
36
|
+
reactJsxRenderer: () => reactJsxRenderer,
|
|
37
|
+
rewriteExportDefault: () => rewriteExportDefault,
|
|
38
|
+
stripImports: () => stripImports
|
|
39
|
+
});
|
|
40
|
+
module.exports = __toCommonJS(react_exports);
|
|
41
|
+
var import_react = __toESM(require("react"));
|
|
42
|
+
var import_Box = __toESM(require("@mui/material/Box"));
|
|
43
|
+
var import_Alert = __toESM(require("@mui/material/Alert"));
|
|
44
|
+
|
|
45
|
+
// libs/ui/src/renderer/common/lazy-import.ts
|
|
46
|
+
function runtimeImport(specifier) {
|
|
47
|
+
const dynamicImport = new Function("s", "return import(s)");
|
|
48
|
+
return dynamicImport(specifier);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
// libs/ui/src/runtime/babel-runtime.ts
|
|
52
|
+
var BABEL_STANDALONE_CDN = "https://esm.sh/@babel/standalone@7";
|
|
53
|
+
var BABEL_STANDALONE_FALLBACK_CDN = "https://cdnjs.cloudflare.com/ajax/libs/babel-standalone/7.26.10/babel.min.js";
|
|
54
|
+
var babelState = { status: "idle" };
|
|
55
|
+
async function loadBabel() {
|
|
56
|
+
if (babelState.status === "loaded") {
|
|
57
|
+
return babelState.babel;
|
|
58
|
+
}
|
|
59
|
+
if (babelState.status === "loading") {
|
|
60
|
+
return babelState.promise;
|
|
61
|
+
}
|
|
62
|
+
if (babelState.status === "error") {
|
|
63
|
+
throw babelState.error;
|
|
64
|
+
}
|
|
65
|
+
const promise = doLoadBabel();
|
|
66
|
+
babelState = { status: "loading", promise };
|
|
67
|
+
try {
|
|
68
|
+
const babel = await promise;
|
|
69
|
+
babelState = { status: "loaded", babel };
|
|
70
|
+
return babel;
|
|
71
|
+
} catch (error) {
|
|
72
|
+
const err = error instanceof Error ? error : new Error(String(error));
|
|
73
|
+
babelState = { status: "error", error: err };
|
|
74
|
+
throw err;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
async function doLoadBabel() {
|
|
78
|
+
const globalBabel = globalThis["Babel"];
|
|
79
|
+
if (globalBabel && typeof globalBabel.transform === "function") {
|
|
80
|
+
return globalBabel;
|
|
81
|
+
}
|
|
82
|
+
try {
|
|
83
|
+
const module2 = await import(
|
|
84
|
+
/* @vite-ignore */
|
|
85
|
+
/* webpackIgnore: true */
|
|
86
|
+
BABEL_STANDALONE_CDN
|
|
87
|
+
);
|
|
88
|
+
if (module2 && typeof module2.transform === "function") {
|
|
89
|
+
return module2;
|
|
90
|
+
}
|
|
91
|
+
if (module2.default && typeof module2.default.transform === "function") {
|
|
92
|
+
return module2.default;
|
|
93
|
+
}
|
|
94
|
+
} catch {
|
|
95
|
+
}
|
|
96
|
+
return new Promise((resolve, reject) => {
|
|
97
|
+
if (typeof document === "undefined") {
|
|
98
|
+
reject(new Error("Babel Standalone requires a browser environment"));
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
const script = document.createElement("script");
|
|
102
|
+
script.src = BABEL_STANDALONE_FALLBACK_CDN;
|
|
103
|
+
script.crossOrigin = "anonymous";
|
|
104
|
+
script.onload = () => {
|
|
105
|
+
const babel = globalThis["Babel"];
|
|
106
|
+
if (babel && typeof babel.transform === "function") {
|
|
107
|
+
resolve(babel);
|
|
108
|
+
} else {
|
|
109
|
+
reject(new Error("Babel Standalone loaded but transform function not found"));
|
|
110
|
+
}
|
|
111
|
+
};
|
|
112
|
+
script.onerror = () => {
|
|
113
|
+
reject(new Error(`Failed to load Babel Standalone from ${BABEL_STANDALONE_FALLBACK_CDN}`));
|
|
114
|
+
};
|
|
115
|
+
document.head.appendChild(script);
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
async function transpileJsx(source, filename = "component.jsx") {
|
|
119
|
+
const babel = await loadBabel();
|
|
120
|
+
const result = babel.transform(source, {
|
|
121
|
+
presets: ["react"],
|
|
122
|
+
filename
|
|
123
|
+
});
|
|
124
|
+
return result.code;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
// libs/ui/src/renderer/react/index.ts
|
|
128
|
+
function isReactJsx(content) {
|
|
129
|
+
if (/^#{1,6}\s+\S/m.test(content)) return false;
|
|
130
|
+
return /(?:function|const|class)\s+\w+/.test(content) && /(?:return|=>)[\s(]*</.test(content);
|
|
131
|
+
}
|
|
132
|
+
function parseImports(source) {
|
|
133
|
+
const results = [];
|
|
134
|
+
const defaultRe = /^import\s+(\w+)\s+from\s+['"]([^'"]+)['"][\s;]*$/gm;
|
|
135
|
+
let m;
|
|
136
|
+
while ((m = defaultRe.exec(source)) !== null) {
|
|
137
|
+
results.push({ line: m[0], localName: m[1], specifier: m[2], named: false });
|
|
138
|
+
}
|
|
139
|
+
const namedRe = /^import\s+\{([^}]+)\}\s+from\s+['"]([^'"]+)['"][\s;]*$/gm;
|
|
140
|
+
while ((m = namedRe.exec(source)) !== null) {
|
|
141
|
+
const names = m[1].split(",").map((n) => n.trim()).filter(Boolean);
|
|
142
|
+
for (const name of names) {
|
|
143
|
+
results.push({ line: m[0], localName: name, specifier: m[2], named: true });
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
return results;
|
|
147
|
+
}
|
|
148
|
+
function stripImports(source) {
|
|
149
|
+
return source.replace(/^import\s+\w+\s+from\s+['"][^'"]+['"][\s;]*$/gm, "").replace(/^import\s+\{[^}]+\}\s+from\s+['"][^'"]+['"][\s;]*$/gm, "");
|
|
150
|
+
}
|
|
151
|
+
function rewriteExportDefault(source) {
|
|
152
|
+
let result = source.replace(/^export\s+default\s+(function|class)\b/gm, "var __default__ = $1");
|
|
153
|
+
result = result.replace(/^export\s+default\s+(\([^)]*\)\s*=>)/gm, "var __default__ = $1");
|
|
154
|
+
result = result.replace(/^export\s+default\s+(\w+)\s*;?\s*$/gm, "var __default__ = $1;");
|
|
155
|
+
return result;
|
|
156
|
+
}
|
|
157
|
+
function isReactSpecifier(specifier) {
|
|
158
|
+
return specifier === "react" || /^https?:\/\/esm\.sh\/react(?:@[\d.]+)?$/.test(specifier);
|
|
159
|
+
}
|
|
160
|
+
async function resolveModules(imports) {
|
|
161
|
+
const modules = {};
|
|
162
|
+
const specifierMap = /* @__PURE__ */ new Map();
|
|
163
|
+
for (const imp of imports) {
|
|
164
|
+
const existing = specifierMap.get(imp.specifier) ?? [];
|
|
165
|
+
existing.push(imp);
|
|
166
|
+
specifierMap.set(imp.specifier, existing);
|
|
167
|
+
}
|
|
168
|
+
for (const [specifier, specImports] of specifierMap) {
|
|
169
|
+
let mod;
|
|
170
|
+
if (isReactSpecifier(specifier)) {
|
|
171
|
+
mod = import_react.default;
|
|
172
|
+
} else {
|
|
173
|
+
mod = await runtimeImport(specifier);
|
|
174
|
+
}
|
|
175
|
+
for (const imp of specImports) {
|
|
176
|
+
if (imp.named) {
|
|
177
|
+
modules[imp.localName] = mod[imp.localName] ?? mod["default"]?.[imp.localName];
|
|
178
|
+
} else {
|
|
179
|
+
modules[imp.localName] = mod["default"] ?? mod;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
return modules;
|
|
184
|
+
}
|
|
185
|
+
function ReactJsxView({ source, className }) {
|
|
186
|
+
const [Component, setComponent] = (0, import_react.useState)(null);
|
|
187
|
+
const [error, setError] = (0, import_react.useState)(null);
|
|
188
|
+
const [loading, setLoading] = (0, import_react.useState)(true);
|
|
189
|
+
(0, import_react.useEffect)(() => {
|
|
190
|
+
let cancelled = false;
|
|
191
|
+
async function transpileAndRender() {
|
|
192
|
+
try {
|
|
193
|
+
const imports = parseImports(source);
|
|
194
|
+
const modules = await resolveModules(imports);
|
|
195
|
+
let code = stripImports(source);
|
|
196
|
+
code = rewriteExportDefault(code);
|
|
197
|
+
code = await transpileJsx(code, "component.jsx");
|
|
198
|
+
code += "\nreturn __default__;";
|
|
199
|
+
const argNames = Object.keys(modules);
|
|
200
|
+
const argValues = argNames.map((n) => modules[n]);
|
|
201
|
+
const factory = new Function(...argNames, code);
|
|
202
|
+
const Comp = factory(...argValues);
|
|
203
|
+
if (!cancelled) {
|
|
204
|
+
setComponent(() => Comp);
|
|
205
|
+
setError(null);
|
|
206
|
+
setLoading(false);
|
|
207
|
+
}
|
|
208
|
+
} catch (err) {
|
|
209
|
+
if (!cancelled) {
|
|
210
|
+
setError(err instanceof Error ? err.message : String(err));
|
|
211
|
+
setComponent(null);
|
|
212
|
+
setLoading(false);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
setLoading(true);
|
|
217
|
+
setError(null);
|
|
218
|
+
setComponent(null);
|
|
219
|
+
transpileAndRender();
|
|
220
|
+
return () => {
|
|
221
|
+
cancelled = true;
|
|
222
|
+
};
|
|
223
|
+
}, [source]);
|
|
224
|
+
if (loading) {
|
|
225
|
+
return import_react.default.createElement(import_Box.default, { className, sx: { p: 2, color: "text.secondary" } }, "Transpiling JSX...");
|
|
226
|
+
}
|
|
227
|
+
if (error) {
|
|
228
|
+
return import_react.default.createElement(
|
|
229
|
+
import_Box.default,
|
|
230
|
+
{ className },
|
|
231
|
+
import_react.default.createElement(import_Alert.default, { severity: "error", sx: { mb: 1 } }, `JSX render error: ${error}`),
|
|
232
|
+
import_react.default.createElement(
|
|
233
|
+
"pre",
|
|
234
|
+
{ style: { fontFamily: "monospace", whiteSpace: "pre-wrap", fontSize: "0.85em" } },
|
|
235
|
+
source
|
|
236
|
+
)
|
|
237
|
+
);
|
|
238
|
+
}
|
|
239
|
+
if (!Component) {
|
|
240
|
+
return import_react.default.createElement(
|
|
241
|
+
import_Box.default,
|
|
242
|
+
{ className },
|
|
243
|
+
import_react.default.createElement(import_Alert.default, { severity: "warning" }, "No component exported. Use `export default MyComponent`.")
|
|
244
|
+
);
|
|
245
|
+
}
|
|
246
|
+
return import_react.default.createElement(import_Box.default, { className }, import_react.default.createElement(Component, {}));
|
|
247
|
+
}
|
|
248
|
+
var ReactJsxRenderer = class {
|
|
249
|
+
type = "jsx";
|
|
250
|
+
priority = 10;
|
|
251
|
+
canHandle(content) {
|
|
252
|
+
return isReactJsx(content);
|
|
253
|
+
}
|
|
254
|
+
render(content, options) {
|
|
255
|
+
return import_react.default.createElement(ReactJsxView, {
|
|
256
|
+
source: content,
|
|
257
|
+
className: options?.className ?? "fmcp-jsx-content"
|
|
258
|
+
});
|
|
259
|
+
}
|
|
260
|
+
};
|
|
261
|
+
var reactJsxRenderer = new ReactJsxRenderer();
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { ReactElement } from 'react';
|
|
2
|
+
import type { Theme } from '@mui/material/styles';
|
|
3
|
+
/**
|
|
4
|
+
* All content types supported by the renderer system.
|
|
5
|
+
*/
|
|
6
|
+
export type ContentType = 'jsx' | 'mdx' | 'markdown' | 'html' | 'pdf' | 'csv' | 'chart' | 'mermaid' | 'flow' | 'math' | 'map' | 'image' | 'video' | 'audio';
|
|
7
|
+
export interface RenderOptions {
|
|
8
|
+
input?: Record<string, unknown>;
|
|
9
|
+
output?: unknown;
|
|
10
|
+
toolName?: string;
|
|
11
|
+
className?: string;
|
|
12
|
+
/** Per-renderer configuration options. */
|
|
13
|
+
rendererOptions?: Record<string, unknown>;
|
|
14
|
+
/** MUI theme instance for renderers that need it. */
|
|
15
|
+
theme?: Theme;
|
|
16
|
+
}
|
|
17
|
+
export interface ContentRenderer {
|
|
18
|
+
readonly type: string;
|
|
19
|
+
/** Higher priority renderers are checked first (default: 0). */
|
|
20
|
+
readonly priority?: number;
|
|
21
|
+
canHandle(content: string): boolean;
|
|
22
|
+
render(content: string, options?: RenderOptions): ReactElement;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/renderer/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAC1C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAElD;;GAEG;AACH,MAAM,MAAM,WAAW,GACnB,KAAK,GACL,KAAK,GACL,UAAU,GACV,MAAM,GACN,KAAK,GACL,KAAK,GACL,OAAO,GACP,SAAS,GACT,MAAM,GACN,MAAM,GACN,KAAK,GACL,OAAO,GACP,OAAO,GACP,OAAO,CAAC;AAEZ,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,0CAA0C;IAC1C,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC1C,qDAAqD;IACrD,KAAK,CAAC,EAAE,KAAK,CAAC;CACf;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,gEAAgE;IAChE,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC;IACpC,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,YAAY,CAAC;CAChE"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Babel Standalone Runtime
|
|
3
|
+
*
|
|
4
|
+
* Loads Babel Standalone from CDN for in-browser JSX transpilation.
|
|
5
|
+
* Lazy-loaded on first JSX content to avoid unnecessary network requests.
|
|
6
|
+
*
|
|
7
|
+
* @packageDocumentation
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* CDN URL for Babel Standalone.
|
|
11
|
+
* Uses esm.sh for ES module compatibility.
|
|
12
|
+
*/
|
|
13
|
+
export declare const BABEL_STANDALONE_CDN = "https://esm.sh/@babel/standalone@7";
|
|
14
|
+
/**
|
|
15
|
+
* Fallback CDN for environments that block esm.sh.
|
|
16
|
+
*/
|
|
17
|
+
export declare const BABEL_STANDALONE_FALLBACK_CDN = "https://cdnjs.cloudflare.com/ajax/libs/babel-standalone/7.26.10/babel.min.js";
|
|
18
|
+
/**
|
|
19
|
+
* Babel Standalone API shape (subset we use).
|
|
20
|
+
*/
|
|
21
|
+
interface BabelStandalone {
|
|
22
|
+
transform(code: string, options: {
|
|
23
|
+
presets?: string[];
|
|
24
|
+
plugins?: string[];
|
|
25
|
+
filename?: string;
|
|
26
|
+
}): {
|
|
27
|
+
code: string;
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Load Babel Standalone from CDN.
|
|
32
|
+
*
|
|
33
|
+
* Lazy-loads on first call and caches the result.
|
|
34
|
+
* Subsequent calls return the cached instance.
|
|
35
|
+
*
|
|
36
|
+
* @returns Promise resolving to Babel Standalone instance
|
|
37
|
+
* @throws Error if Babel cannot be loaded from any CDN
|
|
38
|
+
*/
|
|
39
|
+
export declare function loadBabel(): Promise<BabelStandalone>;
|
|
40
|
+
/**
|
|
41
|
+
* Transpile JSX source code using Babel Standalone.
|
|
42
|
+
*
|
|
43
|
+
* Loads Babel lazily on first call.
|
|
44
|
+
*
|
|
45
|
+
* @param source - JSX/TSX source code
|
|
46
|
+
* @param filename - Optional filename for error messages
|
|
47
|
+
* @returns Transpiled JavaScript code
|
|
48
|
+
*
|
|
49
|
+
* @example
|
|
50
|
+
* ```typescript
|
|
51
|
+
* const code = await transpileJsx(`
|
|
52
|
+
* function App() {
|
|
53
|
+
* return <div>Hello</div>;
|
|
54
|
+
* }
|
|
55
|
+
* `);
|
|
56
|
+
* ```
|
|
57
|
+
*/
|
|
58
|
+
export declare function transpileJsx(source: string, filename?: string): Promise<string>;
|
|
59
|
+
/**
|
|
60
|
+
* Check if Babel is currently loaded and ready.
|
|
61
|
+
*
|
|
62
|
+
* @returns true if Babel is loaded and available
|
|
63
|
+
*/
|
|
64
|
+
export declare function isBabelLoaded(): boolean;
|
|
65
|
+
/**
|
|
66
|
+
* Reset Babel loading state (for testing).
|
|
67
|
+
*/
|
|
68
|
+
export declare function resetBabelState(): void;
|
|
69
|
+
export {};
|
|
70
|
+
//# sourceMappingURL=babel-runtime.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"babel-runtime.d.ts","sourceRoot":"","sources":["../../src/runtime/babel-runtime.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAMH;;;GAGG;AACH,eAAO,MAAM,oBAAoB,uCAAuC,CAAC;AAEzE;;GAEG;AACH,eAAO,MAAM,6BAA6B,iFACsC,CAAC;AAMjF;;GAEG;AACH,UAAU,eAAe;IACvB,SAAS,CACP,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE;QACP,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;QACnB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;QACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,GACA;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;CACrB;AAqBD;;;;;;;;GAQG;AACH,wBAAsB,SAAS,IAAI,OAAO,CAAC,eAAe,CAAC,CAyB1D;AAyDD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,SAAkB,GAAG,OAAO,CAAC,MAAM,CAAC,CAS9F;AAED;;;;GAIG;AACH,wBAAgB,aAAa,IAAI,OAAO,CAEvC;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,IAAI,CAEtC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Content Type Detection
|
|
3
|
+
*
|
|
4
|
+
* Detects whether content is JSX, MDX/Markdown, or plain HTML
|
|
5
|
+
* based on heuristics. Used by the browser runtime to select
|
|
6
|
+
* the appropriate rendering pipeline.
|
|
7
|
+
*
|
|
8
|
+
* @packageDocumentation
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* Content types supported by the browser runtime.
|
|
12
|
+
*/
|
|
13
|
+
export type RuntimeContentType = 'jsx' | 'mdx' | 'html' | 'chart' | 'mermaid' | 'flow' | 'math' | 'map' | 'image' | 'video' | 'audio';
|
|
14
|
+
/**
|
|
15
|
+
* Detect the content type of a source string.
|
|
16
|
+
*
|
|
17
|
+
* Priority:
|
|
18
|
+
* 1. Chart JSON
|
|
19
|
+
* 2. Flow JSON
|
|
20
|
+
* 3. Map/GeoJSON
|
|
21
|
+
* 4. Mermaid diagram syntax
|
|
22
|
+
* 5. Math/LaTeX
|
|
23
|
+
* 6. Image URL/data URI
|
|
24
|
+
* 7. Video URL
|
|
25
|
+
* 8. Audio URL
|
|
26
|
+
* 9. JSX
|
|
27
|
+
* 10. MDX/Markdown
|
|
28
|
+
* 11. HTML (fallback)
|
|
29
|
+
*
|
|
30
|
+
* @param content - Source content to analyze
|
|
31
|
+
* @returns Detected content type
|
|
32
|
+
*
|
|
33
|
+
* @example
|
|
34
|
+
* ```typescript
|
|
35
|
+
* detectContentType('<Card title="Hello" />'); // 'jsx'
|
|
36
|
+
* detectContentType('# Hello World\n\nSome text'); // 'mdx'
|
|
37
|
+
* detectContentType('<div class="foo">bar</div>'); // 'html'
|
|
38
|
+
* detectContentType('graph TD; A-->B'); // 'mermaid'
|
|
39
|
+
* detectContentType('$$E = mc^2$$'); // 'math'
|
|
40
|
+
* ```
|
|
41
|
+
*/
|
|
42
|
+
export declare function detectContentType(content: string): RuntimeContentType;
|
|
43
|
+
//# sourceMappingURL=content-detector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"content-detector.d.ts","sourceRoot":"","sources":["../../src/runtime/content-detector.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAMH;;GAEG;AACH,MAAM,MAAM,kBAAkB,GAC1B,KAAK,GACL,KAAK,GACL,MAAM,GACN,OAAO,GACP,SAAS,GACT,MAAM,GACN,MAAM,GACN,KAAK,GACL,OAAO,GACP,OAAO,GACP,OAAO,CAAC;AAsHZ;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,kBAAkB,CA0CrE"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @frontmcp/ui Runtime Module
|
|
3
|
+
*
|
|
4
|
+
* Client-side utilities for content detection and JSX transpilation.
|
|
5
|
+
*
|
|
6
|
+
* @packageDocumentation
|
|
7
|
+
*/
|
|
8
|
+
export { detectContentType, type RuntimeContentType } from './content-detector';
|
|
9
|
+
export { transpileJsx, loadBabel, isBabelLoaded, resetBabelState, BABEL_STANDALONE_CDN, BABEL_STANDALONE_FALLBACK_CDN, } from './babel-runtime';
|
|
10
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/runtime/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH,OAAO,EAAE,iBAAiB,EAAE,KAAK,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAMhF,OAAO,EACL,YAAY,EACZ,SAAS,EACT,aAAa,EACb,eAAe,EACf,oBAAoB,EACpB,6BAA6B,GAC9B,MAAM,iBAAiB,CAAC"}
|
package/runtime/index.js
ADDED
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// libs/ui/src/runtime/index.ts
|
|
21
|
+
var runtime_exports = {};
|
|
22
|
+
__export(runtime_exports, {
|
|
23
|
+
BABEL_STANDALONE_CDN: () => BABEL_STANDALONE_CDN,
|
|
24
|
+
BABEL_STANDALONE_FALLBACK_CDN: () => BABEL_STANDALONE_FALLBACK_CDN,
|
|
25
|
+
detectContentType: () => detectContentType,
|
|
26
|
+
isBabelLoaded: () => isBabelLoaded,
|
|
27
|
+
loadBabel: () => loadBabel,
|
|
28
|
+
resetBabelState: () => resetBabelState,
|
|
29
|
+
transpileJsx: () => transpileJsx
|
|
30
|
+
});
|
|
31
|
+
module.exports = __toCommonJS(runtime_exports);
|
|
32
|
+
|
|
33
|
+
// libs/ui/src/runtime/content-detector.ts
|
|
34
|
+
var JSX_PATTERNS = [
|
|
35
|
+
// JSX-specific syntax: self-closing tags with capitalized names
|
|
36
|
+
/<[A-Z][a-zA-Z0-9]*[\s/>]/,
|
|
37
|
+
// JSX expressions: {someVar} or {() => ...}
|
|
38
|
+
/\{[a-zA-Z_$][\w$.]*\}/,
|
|
39
|
+
// React hooks: useState, useEffect, etc.
|
|
40
|
+
/\buse[A-Z]\w+\s*\(/,
|
|
41
|
+
// Arrow function components or function declarations: const Foo = / function Foo(
|
|
42
|
+
/(?:const|let|var|function)\s+[A-Z]\w*\s*[=(]/,
|
|
43
|
+
// Import from react
|
|
44
|
+
/import\s[^\n]{1,200}from\s+['"]react['"]/,
|
|
45
|
+
// JSX pragma or import
|
|
46
|
+
/\/\*\*?\s*@jsx\b/,
|
|
47
|
+
// export default function/const (component pattern)
|
|
48
|
+
/export\s+default\s+function\s+[A-Z]/
|
|
49
|
+
];
|
|
50
|
+
var MDX_PATTERNS = [
|
|
51
|
+
// MDX frontmatter
|
|
52
|
+
/^---\s*\n/,
|
|
53
|
+
// Markdown headings
|
|
54
|
+
/^#{1,6}\s+\S/m,
|
|
55
|
+
// MDX import statements followed by markdown
|
|
56
|
+
/^import\s[^\n]*\n+#/m,
|
|
57
|
+
// MDX export default (layout pattern)
|
|
58
|
+
/^export\s+default\s+/m,
|
|
59
|
+
// Markdown bullet lists
|
|
60
|
+
/^\s*[-*+]\s+\S/m,
|
|
61
|
+
// Markdown links
|
|
62
|
+
/\[[^\]]+\]\([^)]+\)/,
|
|
63
|
+
// Markdown code blocks
|
|
64
|
+
/^```\w*/m,
|
|
65
|
+
// Markdown emphasis
|
|
66
|
+
/(?:\*\*|__)(?:(?!\*\*|__).)+(?:\*\*|__)/
|
|
67
|
+
];
|
|
68
|
+
var CHART_TYPE_RE = /"type"\s*:\s*"(?:bar|line|area|pie|scatter|radar|composed)"/;
|
|
69
|
+
var MERMAID_PATTERN = /^\s*(?:graph|sequenceDiagram|classDiagram|stateDiagram|flowchart|erDiagram|gantt|pie|journey|gitGraph)\b/;
|
|
70
|
+
function looksLikeChart(s) {
|
|
71
|
+
return s.charCodeAt(0) === 123 && CHART_TYPE_RE.test(s) && s.includes('"data"');
|
|
72
|
+
}
|
|
73
|
+
function looksLikeFlow(s) {
|
|
74
|
+
return s.charCodeAt(0) === 123 && s.includes('"nodes"') && s.includes('"edges"');
|
|
75
|
+
}
|
|
76
|
+
var MATH_PATTERNS = [
|
|
77
|
+
/\$\$(?:[^$]|\$(?!\$))+\$\$/s,
|
|
78
|
+
/\$[^$\n]+?\$/,
|
|
79
|
+
/\\\[(?:[^\\]|\\.)*\\\]/s,
|
|
80
|
+
/\\\((?:[^\\]|\\.)*\\\)/s,
|
|
81
|
+
/\\begin\{(?:equation|align|gather|matrix|pmatrix|bmatrix|cases)\}/
|
|
82
|
+
];
|
|
83
|
+
var GEOJSON_TYPE_RE = /"type"\s*:\s*"(?:FeatureCollection|Feature|Point|LineString|Polygon|MultiPoint|MultiLineString|MultiPolygon|GeometryCollection)"/;
|
|
84
|
+
function looksLikeMap(s) {
|
|
85
|
+
return s.charCodeAt(0) === 123 && GEOJSON_TYPE_RE.test(s);
|
|
86
|
+
}
|
|
87
|
+
var IMAGE_PATTERNS = [
|
|
88
|
+
/^data:image\/(?:png|jpeg|jpg|gif|webp|svg\+xml)[;,]/,
|
|
89
|
+
/^https?:\/\/[^?#\s]+\.(?:png|jpe?g|gif|webp|svg|avif|ico)(?:\?[^#\s]*)?$/i
|
|
90
|
+
];
|
|
91
|
+
var VIDEO_PATTERNS = [
|
|
92
|
+
/^https?:\/\/[^?#\s]+\.(?:mp4|webm|ogg|mov)(?:\?[^#\s]*)?$/i,
|
|
93
|
+
/^https?:\/\/(?:www\.)?(?:youtube\.com|youtu\.be|vimeo\.com)\//i,
|
|
94
|
+
/^data:video\//
|
|
95
|
+
];
|
|
96
|
+
var AUDIO_PATTERNS = [
|
|
97
|
+
/^https?:\/\/[^?#\s]+\.(?:mp3|wav|ogg|aac|flac|m4a)(?:\?[^#\s]*)?$/i,
|
|
98
|
+
/^https?:\/\/(?:www\.)?soundcloud\.com\//i,
|
|
99
|
+
/^data:audio\//
|
|
100
|
+
];
|
|
101
|
+
function detectContentType(content) {
|
|
102
|
+
if (!content || typeof content !== "string") {
|
|
103
|
+
return "html";
|
|
104
|
+
}
|
|
105
|
+
const trimmed = content.trim();
|
|
106
|
+
if (looksLikeChart(trimmed)) return "chart";
|
|
107
|
+
if (looksLikeFlow(trimmed)) return "flow";
|
|
108
|
+
if (looksLikeMap(trimmed)) return "map";
|
|
109
|
+
if (MERMAID_PATTERN.test(trimmed)) return "mermaid";
|
|
110
|
+
if (MATH_PATTERNS.some((p) => p.test(trimmed))) return "math";
|
|
111
|
+
if (IMAGE_PATTERNS.some((p) => p.test(trimmed))) return "image";
|
|
112
|
+
if (VIDEO_PATTERNS.some((p) => p.test(trimmed))) return "video";
|
|
113
|
+
if (AUDIO_PATTERNS.some((p) => p.test(trimmed))) return "audio";
|
|
114
|
+
const jsxScore = countMatches(trimmed, JSX_PATTERNS);
|
|
115
|
+
const mdxScore = countMatches(trimmed, MDX_PATTERNS);
|
|
116
|
+
if (jsxScore > 0 && jsxScore >= mdxScore) {
|
|
117
|
+
return "jsx";
|
|
118
|
+
}
|
|
119
|
+
if (mdxScore >= 2) {
|
|
120
|
+
return "mdx";
|
|
121
|
+
}
|
|
122
|
+
if (mdxScore === 1 && /^import\s+/m.test(trimmed)) {
|
|
123
|
+
return "mdx";
|
|
124
|
+
}
|
|
125
|
+
return "html";
|
|
126
|
+
}
|
|
127
|
+
function countMatches(content, patterns) {
|
|
128
|
+
let count = 0;
|
|
129
|
+
for (const pattern of patterns) {
|
|
130
|
+
if (pattern.test(content)) {
|
|
131
|
+
count++;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
return count;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
// libs/ui/src/runtime/babel-runtime.ts
|
|
138
|
+
var BABEL_STANDALONE_CDN = "https://esm.sh/@babel/standalone@7";
|
|
139
|
+
var BABEL_STANDALONE_FALLBACK_CDN = "https://cdnjs.cloudflare.com/ajax/libs/babel-standalone/7.26.10/babel.min.js";
|
|
140
|
+
var babelState = { status: "idle" };
|
|
141
|
+
async function loadBabel() {
|
|
142
|
+
if (babelState.status === "loaded") {
|
|
143
|
+
return babelState.babel;
|
|
144
|
+
}
|
|
145
|
+
if (babelState.status === "loading") {
|
|
146
|
+
return babelState.promise;
|
|
147
|
+
}
|
|
148
|
+
if (babelState.status === "error") {
|
|
149
|
+
throw babelState.error;
|
|
150
|
+
}
|
|
151
|
+
const promise = doLoadBabel();
|
|
152
|
+
babelState = { status: "loading", promise };
|
|
153
|
+
try {
|
|
154
|
+
const babel = await promise;
|
|
155
|
+
babelState = { status: "loaded", babel };
|
|
156
|
+
return babel;
|
|
157
|
+
} catch (error) {
|
|
158
|
+
const err = error instanceof Error ? error : new Error(String(error));
|
|
159
|
+
babelState = { status: "error", error: err };
|
|
160
|
+
throw err;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
async function doLoadBabel() {
|
|
164
|
+
const globalBabel = globalThis["Babel"];
|
|
165
|
+
if (globalBabel && typeof globalBabel.transform === "function") {
|
|
166
|
+
return globalBabel;
|
|
167
|
+
}
|
|
168
|
+
try {
|
|
169
|
+
const module2 = await import(
|
|
170
|
+
/* @vite-ignore */
|
|
171
|
+
/* webpackIgnore: true */
|
|
172
|
+
BABEL_STANDALONE_CDN
|
|
173
|
+
);
|
|
174
|
+
if (module2 && typeof module2.transform === "function") {
|
|
175
|
+
return module2;
|
|
176
|
+
}
|
|
177
|
+
if (module2.default && typeof module2.default.transform === "function") {
|
|
178
|
+
return module2.default;
|
|
179
|
+
}
|
|
180
|
+
} catch {
|
|
181
|
+
}
|
|
182
|
+
return new Promise((resolve, reject) => {
|
|
183
|
+
if (typeof document === "undefined") {
|
|
184
|
+
reject(new Error("Babel Standalone requires a browser environment"));
|
|
185
|
+
return;
|
|
186
|
+
}
|
|
187
|
+
const script = document.createElement("script");
|
|
188
|
+
script.src = BABEL_STANDALONE_FALLBACK_CDN;
|
|
189
|
+
script.crossOrigin = "anonymous";
|
|
190
|
+
script.onload = () => {
|
|
191
|
+
const babel = globalThis["Babel"];
|
|
192
|
+
if (babel && typeof babel.transform === "function") {
|
|
193
|
+
resolve(babel);
|
|
194
|
+
} else {
|
|
195
|
+
reject(new Error("Babel Standalone loaded but transform function not found"));
|
|
196
|
+
}
|
|
197
|
+
};
|
|
198
|
+
script.onerror = () => {
|
|
199
|
+
reject(new Error(`Failed to load Babel Standalone from ${BABEL_STANDALONE_FALLBACK_CDN}`));
|
|
200
|
+
};
|
|
201
|
+
document.head.appendChild(script);
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
async function transpileJsx(source, filename = "component.jsx") {
|
|
205
|
+
const babel = await loadBabel();
|
|
206
|
+
const result = babel.transform(source, {
|
|
207
|
+
presets: ["react"],
|
|
208
|
+
filename
|
|
209
|
+
});
|
|
210
|
+
return result.code;
|
|
211
|
+
}
|
|
212
|
+
function isBabelLoaded() {
|
|
213
|
+
return babelState.status === "loaded";
|
|
214
|
+
}
|
|
215
|
+
function resetBabelState() {
|
|
216
|
+
babelState = { status: "idle" };
|
|
217
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FrontMcpThemeProvider.d.ts","sourceRoot":"","sources":["../../src/theme/FrontMcpThemeProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,SAAS,CAAC;AAG1D,wBAAgB,qBAAqB,CAAC,EACpC,KAAK,EAAE,WAAW,EAClB,QAAQ,GACT,EAAE,0BAA0B,GAAG,KAAK,CAAC,YAAY,CASjD"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { type Theme } from '@mui/material/styles';
|
|
2
|
+
import type { FrontMcpThemeConfig } from './types';
|
|
3
|
+
declare const SYSTEM_FONT_STACK: string;
|
|
4
|
+
declare const MONO_FONT_STACK: string;
|
|
5
|
+
export declare function createFrontMcpTheme(config?: FrontMcpThemeConfig): Theme;
|
|
6
|
+
export declare const defaultTheme: Theme;
|
|
7
|
+
export declare const darkTheme: Theme;
|
|
8
|
+
export { SYSTEM_FONT_STACK, MONO_FONT_STACK };
|
|
9
|
+
//# sourceMappingURL=create-theme.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-theme.d.ts","sourceRoot":"","sources":["../../src/theme/create-theme.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,KAAK,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAC/D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;AAEnD,QAAA,MAAM,iBAAiB,QAQZ,CAAC;AAEZ,QAAA,MAAM,eAAe,QAQV,CAAC;AAEZ,wBAAgB,mBAAmB,CAAC,MAAM,CAAC,EAAE,mBAAmB,GAAG,KAAK,CA2CvE;AAED,eAAO,MAAM,YAAY,EAAE,KAA6B,CAAC;AAEzD,eAAO,MAAM,SAAS,EAAE,KAA6C,CAAC;AAEtE,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,CAAC"}
|
package/theme/index.d.ts
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export type { FrontMcpThemeConfig, FrontMcpThemeProviderProps } from './types';
|
|
2
|
+
export { createFrontMcpTheme, defaultTheme, darkTheme, SYSTEM_FONT_STACK, MONO_FONT_STACK } from './create-theme';
|
|
3
|
+
export { FrontMcpThemeProvider } from './FrontMcpThemeProvider';
|
|
4
|
+
export { useFrontMcpTheme } from './use-theme';
|
|
5
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/theme/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,mBAAmB,EAAE,0BAA0B,EAAE,MAAM,SAAS,CAAC;AAC/E,OAAO,EAAE,mBAAmB,EAAE,YAAY,EAAE,SAAS,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAClH,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC"}
|