@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,217 @@
|
|
|
1
|
+
// libs/ui/src/renderer/maps/index.ts
|
|
2
|
+
import React, { useEffect as useEffect2 } from "react";
|
|
3
|
+
import Box from "@mui/material/Box";
|
|
4
|
+
import Alert from "@mui/material/Alert";
|
|
5
|
+
import Paper from "@mui/material/Paper";
|
|
6
|
+
import Typography from "@mui/material/Typography";
|
|
7
|
+
import { styled } from "@mui/material/styles";
|
|
8
|
+
|
|
9
|
+
// libs/ui/src/renderer/common/lazy-import.ts
|
|
10
|
+
var ESM_SH_BASE = "https://esm.sh/";
|
|
11
|
+
function esmShUrl(pkg, options) {
|
|
12
|
+
let url = `${ESM_SH_BASE}${pkg}`;
|
|
13
|
+
if (options?.external?.length) {
|
|
14
|
+
url += `?external=${options.external.join(",")}`;
|
|
15
|
+
}
|
|
16
|
+
return url;
|
|
17
|
+
}
|
|
18
|
+
function runtimeImport(specifier) {
|
|
19
|
+
const dynamicImport = new Function("s", "return import(s)");
|
|
20
|
+
return dynamicImport(specifier);
|
|
21
|
+
}
|
|
22
|
+
async function runtimeImportWithFallback(bareSpecifier, fallbackUrl) {
|
|
23
|
+
try {
|
|
24
|
+
return await runtimeImport(bareSpecifier);
|
|
25
|
+
} catch {
|
|
26
|
+
return runtimeImport(fallbackUrl);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
function createLazyImport(moduleId, importer) {
|
|
30
|
+
let state = { status: "idle" };
|
|
31
|
+
const doImport = importer ?? (async () => {
|
|
32
|
+
const mod = await runtimeImport(moduleId);
|
|
33
|
+
return mod["default"] ?? mod;
|
|
34
|
+
});
|
|
35
|
+
return {
|
|
36
|
+
load() {
|
|
37
|
+
if (state.status === "loaded") return Promise.resolve(state.module);
|
|
38
|
+
if (state.status === "loading") return state.promise;
|
|
39
|
+
if (state.status === "error") {
|
|
40
|
+
state = { status: "idle" };
|
|
41
|
+
}
|
|
42
|
+
const promise = doImport().then(
|
|
43
|
+
(mod) => {
|
|
44
|
+
state = { status: "loaded", module: mod };
|
|
45
|
+
return mod;
|
|
46
|
+
},
|
|
47
|
+
(err) => {
|
|
48
|
+
const error = err instanceof Error ? err : new Error(`Failed to load module "${moduleId}": ${String(err)}`);
|
|
49
|
+
state = { status: "error", error };
|
|
50
|
+
throw error;
|
|
51
|
+
}
|
|
52
|
+
);
|
|
53
|
+
state = { status: "loading", promise };
|
|
54
|
+
return promise;
|
|
55
|
+
},
|
|
56
|
+
get() {
|
|
57
|
+
return state.status === "loaded" ? state.module : void 0;
|
|
58
|
+
},
|
|
59
|
+
getState() {
|
|
60
|
+
return state;
|
|
61
|
+
},
|
|
62
|
+
reset() {
|
|
63
|
+
state = { status: "idle" };
|
|
64
|
+
}
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// libs/ui/src/renderer/common/inject-stylesheet.ts
|
|
69
|
+
function injectStylesheet(href, id) {
|
|
70
|
+
if (typeof document === "undefined") return;
|
|
71
|
+
if (document.getElementById(id)) return;
|
|
72
|
+
const link = document.createElement("link");
|
|
73
|
+
link.id = id;
|
|
74
|
+
link.rel = "stylesheet";
|
|
75
|
+
link.href = href;
|
|
76
|
+
link.crossOrigin = "anonymous";
|
|
77
|
+
document.head.appendChild(link);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
// libs/ui/src/renderer/common/use-lazy-module.ts
|
|
81
|
+
import { useState, useEffect } from "react";
|
|
82
|
+
function useLazyModule(lazy) {
|
|
83
|
+
const [, forceUpdate] = useState(0);
|
|
84
|
+
useEffect(() => {
|
|
85
|
+
if (lazy.getState().status === "loaded") {
|
|
86
|
+
forceUpdate((n) => n + 1);
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
lazy.load().then(
|
|
90
|
+
() => forceUpdate((n) => n + 1),
|
|
91
|
+
() => forceUpdate((n) => n + 1)
|
|
92
|
+
);
|
|
93
|
+
}, [lazy]);
|
|
94
|
+
return lazy.get();
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
// libs/ui/src/renderer/maps/index.ts
|
|
98
|
+
var LEAFLET_CSS_URL = "https://esm.sh/leaflet@1.9.4/dist/leaflet.css";
|
|
99
|
+
var LEAFLET_CSS_ID = "fmcp-leaflet-css";
|
|
100
|
+
var DEFAULT_TILE_URL = "https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png";
|
|
101
|
+
var DEFAULT_ATTRIBUTION = '© <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors';
|
|
102
|
+
var GEOJSON_TYPE_RE = /"type"\s*:\s*"(?:FeatureCollection|Feature|Point|LineString|Polygon|MultiPoint|MultiLineString|MultiPolygon|GeometryCollection)"/;
|
|
103
|
+
function isMap(content) {
|
|
104
|
+
const trimmed = content.trim();
|
|
105
|
+
if (trimmed.charCodeAt(0) === 123 && GEOJSON_TYPE_RE.test(trimmed)) return true;
|
|
106
|
+
try {
|
|
107
|
+
const parsed = JSON.parse(trimmed);
|
|
108
|
+
return !!(parsed.center && Array.isArray(parsed.center) || parsed.markers && Array.isArray(parsed.markers) || parsed.geojson && typeof parsed.geojson === "object");
|
|
109
|
+
} catch {
|
|
110
|
+
return false;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
var lazyReactLeaflet = createLazyImport("react-leaflet", async () => {
|
|
114
|
+
const mod = await runtimeImportWithFallback(
|
|
115
|
+
"react-leaflet",
|
|
116
|
+
esmShUrl("react-leaflet@5", { external: ["react", "react-dom"] })
|
|
117
|
+
);
|
|
118
|
+
return mod;
|
|
119
|
+
});
|
|
120
|
+
var MapRoot = styled(Box, {
|
|
121
|
+
name: "FrontMcpMap",
|
|
122
|
+
slot: "Root"
|
|
123
|
+
})(({ theme }) => ({
|
|
124
|
+
width: "100%",
|
|
125
|
+
borderRadius: theme.shape.borderRadius,
|
|
126
|
+
overflow: "hidden",
|
|
127
|
+
border: `1px solid ${theme.palette.divider}`
|
|
128
|
+
}));
|
|
129
|
+
function parseMapConfig(content) {
|
|
130
|
+
const parsed = JSON.parse(content);
|
|
131
|
+
if (parsed.type && [
|
|
132
|
+
"FeatureCollection",
|
|
133
|
+
"Feature",
|
|
134
|
+
"Point",
|
|
135
|
+
"LineString",
|
|
136
|
+
"Polygon",
|
|
137
|
+
"MultiPoint",
|
|
138
|
+
"MultiLineString",
|
|
139
|
+
"MultiPolygon",
|
|
140
|
+
"GeometryCollection"
|
|
141
|
+
].includes(parsed.type)) {
|
|
142
|
+
return {
|
|
143
|
+
center: [0, 0],
|
|
144
|
+
zoom: 2,
|
|
145
|
+
geojson: parsed
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
return parsed;
|
|
149
|
+
}
|
|
150
|
+
function MapView({ config, className }) {
|
|
151
|
+
useEffect2(() => {
|
|
152
|
+
injectStylesheet(LEAFLET_CSS_URL, LEAFLET_CSS_ID);
|
|
153
|
+
}, []);
|
|
154
|
+
const leaflet = useLazyModule(lazyReactLeaflet);
|
|
155
|
+
const height = config.height ?? 400;
|
|
156
|
+
const center = config.center ?? [51.505, -0.09];
|
|
157
|
+
const zoom = config.zoom ?? 13;
|
|
158
|
+
if (!leaflet) {
|
|
159
|
+
return React.createElement(Alert, { severity: "info" }, "Loading map library...");
|
|
160
|
+
}
|
|
161
|
+
const { MapContainer, TileLayer, Marker, Popup, GeoJSON } = leaflet;
|
|
162
|
+
const tileUrl = config.tileLayer?.url ?? DEFAULT_TILE_URL;
|
|
163
|
+
const attribution = config.tileLayer?.attribution ?? DEFAULT_ATTRIBUTION;
|
|
164
|
+
return React.createElement(
|
|
165
|
+
MapRoot,
|
|
166
|
+
{ className },
|
|
167
|
+
config.title && React.createElement(
|
|
168
|
+
Typography,
|
|
169
|
+
{ variant: "subtitle1", fontWeight: 600, sx: { p: 1.5, borderBottom: 1, borderColor: "divider" } },
|
|
170
|
+
config.title
|
|
171
|
+
),
|
|
172
|
+
React.createElement(
|
|
173
|
+
MapContainer,
|
|
174
|
+
{
|
|
175
|
+
center,
|
|
176
|
+
zoom,
|
|
177
|
+
style: { height, width: "100%" },
|
|
178
|
+
scrollWheelZoom: true
|
|
179
|
+
},
|
|
180
|
+
React.createElement(TileLayer, { url: tileUrl, attribution }),
|
|
181
|
+
config.markers?.map(
|
|
182
|
+
(marker, i) => React.createElement(
|
|
183
|
+
Marker,
|
|
184
|
+
{ key: i, position: marker.position },
|
|
185
|
+
marker.popup && React.createElement(Popup, null, React.createElement(Paper, { elevation: 0, sx: { p: 1 } }, marker.popup))
|
|
186
|
+
)
|
|
187
|
+
),
|
|
188
|
+
config.geojson && React.createElement(GeoJSON, { data: config.geojson })
|
|
189
|
+
)
|
|
190
|
+
);
|
|
191
|
+
}
|
|
192
|
+
lazyReactLeaflet.load().catch(() => {
|
|
193
|
+
});
|
|
194
|
+
var MapsRenderer = class {
|
|
195
|
+
type = "map";
|
|
196
|
+
priority = 60;
|
|
197
|
+
canHandle(content) {
|
|
198
|
+
return isMap(content);
|
|
199
|
+
}
|
|
200
|
+
render(content, options) {
|
|
201
|
+
try {
|
|
202
|
+
const config = parseMapConfig(content);
|
|
203
|
+
return React.createElement(MapView, {
|
|
204
|
+
config,
|
|
205
|
+
className: options?.className ?? "fmcp-map-content"
|
|
206
|
+
});
|
|
207
|
+
} catch {
|
|
208
|
+
return React.createElement(Alert, { severity: "error" }, "Invalid map/GeoJSON data");
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
};
|
|
212
|
+
var mapsRenderer = new MapsRenderer();
|
|
213
|
+
export {
|
|
214
|
+
MapsRenderer,
|
|
215
|
+
isMap,
|
|
216
|
+
mapsRenderer
|
|
217
|
+
};
|
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
// libs/ui/src/renderer/math/index.ts
|
|
2
|
+
import React, { useEffect as useEffect2, useMemo } from "react";
|
|
3
|
+
import Box from "@mui/material/Box";
|
|
4
|
+
import Alert from "@mui/material/Alert";
|
|
5
|
+
import { styled } from "@mui/material/styles";
|
|
6
|
+
|
|
7
|
+
// libs/ui/src/renderer/common/lazy-import.ts
|
|
8
|
+
var ESM_SH_BASE = "https://esm.sh/";
|
|
9
|
+
function esmShUrl(pkg, options) {
|
|
10
|
+
let url = `${ESM_SH_BASE}${pkg}`;
|
|
11
|
+
if (options?.external?.length) {
|
|
12
|
+
url += `?external=${options.external.join(",")}`;
|
|
13
|
+
}
|
|
14
|
+
return url;
|
|
15
|
+
}
|
|
16
|
+
function runtimeImport(specifier) {
|
|
17
|
+
const dynamicImport = new Function("s", "return import(s)");
|
|
18
|
+
return dynamicImport(specifier);
|
|
19
|
+
}
|
|
20
|
+
async function runtimeImportWithFallback(bareSpecifier, fallbackUrl) {
|
|
21
|
+
try {
|
|
22
|
+
return await runtimeImport(bareSpecifier);
|
|
23
|
+
} catch {
|
|
24
|
+
return runtimeImport(fallbackUrl);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
function createLazyImport(moduleId, importer) {
|
|
28
|
+
let state = { status: "idle" };
|
|
29
|
+
const doImport = importer ?? (async () => {
|
|
30
|
+
const mod = await runtimeImport(moduleId);
|
|
31
|
+
return mod["default"] ?? mod;
|
|
32
|
+
});
|
|
33
|
+
return {
|
|
34
|
+
load() {
|
|
35
|
+
if (state.status === "loaded") return Promise.resolve(state.module);
|
|
36
|
+
if (state.status === "loading") return state.promise;
|
|
37
|
+
if (state.status === "error") {
|
|
38
|
+
state = { status: "idle" };
|
|
39
|
+
}
|
|
40
|
+
const promise = doImport().then(
|
|
41
|
+
(mod) => {
|
|
42
|
+
state = { status: "loaded", module: mod };
|
|
43
|
+
return mod;
|
|
44
|
+
},
|
|
45
|
+
(err) => {
|
|
46
|
+
const error = err instanceof Error ? err : new Error(`Failed to load module "${moduleId}": ${String(err)}`);
|
|
47
|
+
state = { status: "error", error };
|
|
48
|
+
throw error;
|
|
49
|
+
}
|
|
50
|
+
);
|
|
51
|
+
state = { status: "loading", promise };
|
|
52
|
+
return promise;
|
|
53
|
+
},
|
|
54
|
+
get() {
|
|
55
|
+
return state.status === "loaded" ? state.module : void 0;
|
|
56
|
+
},
|
|
57
|
+
getState() {
|
|
58
|
+
return state;
|
|
59
|
+
},
|
|
60
|
+
reset() {
|
|
61
|
+
state = { status: "idle" };
|
|
62
|
+
}
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
// libs/ui/src/renderer/common/inject-stylesheet.ts
|
|
67
|
+
function injectStylesheet(href, id) {
|
|
68
|
+
if (typeof document === "undefined") return;
|
|
69
|
+
if (document.getElementById(id)) return;
|
|
70
|
+
const link = document.createElement("link");
|
|
71
|
+
link.id = id;
|
|
72
|
+
link.rel = "stylesheet";
|
|
73
|
+
link.href = href;
|
|
74
|
+
link.crossOrigin = "anonymous";
|
|
75
|
+
document.head.appendChild(link);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
// libs/ui/src/renderer/common/use-lazy-module.ts
|
|
79
|
+
import { useState, useEffect } from "react";
|
|
80
|
+
function useLazyModule(lazy) {
|
|
81
|
+
const [, forceUpdate] = useState(0);
|
|
82
|
+
useEffect(() => {
|
|
83
|
+
if (lazy.getState().status === "loaded") {
|
|
84
|
+
forceUpdate((n) => n + 1);
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
lazy.load().then(
|
|
88
|
+
() => forceUpdate((n) => n + 1),
|
|
89
|
+
() => forceUpdate((n) => n + 1)
|
|
90
|
+
);
|
|
91
|
+
}, [lazy]);
|
|
92
|
+
return lazy.get();
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
// libs/ui/src/renderer/math/index.ts
|
|
96
|
+
var KATEX_CSS_URL = "https://esm.sh/katex@0.16.11/dist/katex.min.css";
|
|
97
|
+
var KATEX_CSS_ID = "fmcp-katex-css";
|
|
98
|
+
var MATH_DISPLAY = /\$\$(?:[^$]|\$(?!\$))+\$\$/s;
|
|
99
|
+
var MATH_INLINE = /\$[^$\n]+?\$/;
|
|
100
|
+
var MATH_BRACKET_DISPLAY = /\\\[(?:[^\\]|\\.)*\\\]/s;
|
|
101
|
+
var MATH_PAREN_INLINE = /\\\((?:[^\\]|\\.)*\\\)/s;
|
|
102
|
+
var MATH_BEGIN = /\\begin\{(?:equation|align|gather|matrix|pmatrix|bmatrix|cases)\}/;
|
|
103
|
+
function isMath(content) {
|
|
104
|
+
const trimmed = content.trim();
|
|
105
|
+
return MATH_DISPLAY.test(trimmed) || MATH_INLINE.test(trimmed) || MATH_BRACKET_DISPLAY.test(trimmed) || MATH_PAREN_INLINE.test(trimmed) || MATH_BEGIN.test(trimmed);
|
|
106
|
+
}
|
|
107
|
+
var lazyKatex = createLazyImport("katex", async () => {
|
|
108
|
+
const mod = await runtimeImportWithFallback("katex", esmShUrl("katex@0.16"));
|
|
109
|
+
return mod;
|
|
110
|
+
});
|
|
111
|
+
var MathRoot = styled(Box, {
|
|
112
|
+
name: "FrontMcpMath",
|
|
113
|
+
slot: "Root"
|
|
114
|
+
})(({ theme }) => ({
|
|
115
|
+
color: theme.palette.text.primary,
|
|
116
|
+
"& .katex-display": {
|
|
117
|
+
margin: theme.spacing(2, 0),
|
|
118
|
+
textAlign: "center"
|
|
119
|
+
}
|
|
120
|
+
}));
|
|
121
|
+
var MathDisplay = styled(Box, {
|
|
122
|
+
name: "FrontMcpMath",
|
|
123
|
+
slot: "Display"
|
|
124
|
+
})(({ theme }) => ({
|
|
125
|
+
display: "block",
|
|
126
|
+
textAlign: "center",
|
|
127
|
+
margin: theme.spacing(2, 0),
|
|
128
|
+
fontSize: "1.2em",
|
|
129
|
+
overflow: "auto"
|
|
130
|
+
}));
|
|
131
|
+
var MathInline = styled("span", {
|
|
132
|
+
name: "FrontMcpMath",
|
|
133
|
+
slot: "Inline"
|
|
134
|
+
})({
|
|
135
|
+
display: "inline"
|
|
136
|
+
});
|
|
137
|
+
function parseMathContent(source) {
|
|
138
|
+
const segments = [];
|
|
139
|
+
const mathRegex = /(\$\$(?:[^$]|\$(?!\$))+\$\$|\$[^$\n]+?\$|\\\[(?:[^\\]|\\.)*\\\]|\\\((?:[^\\]|\\.)*\\\)|\\begin\{(?:[^\\]|\\.)*\\end\{[^}]+\})/gs;
|
|
140
|
+
let lastIndex = 0;
|
|
141
|
+
let match;
|
|
142
|
+
while ((match = mathRegex.exec(source)) !== null) {
|
|
143
|
+
if (match.index > lastIndex) {
|
|
144
|
+
segments.push({ type: "text", content: source.slice(lastIndex, match.index) });
|
|
145
|
+
}
|
|
146
|
+
const raw = match[0];
|
|
147
|
+
if (raw.startsWith("$$")) {
|
|
148
|
+
segments.push({ type: "display", content: raw.slice(2, -2).trim() });
|
|
149
|
+
} else if (raw.startsWith("\\[")) {
|
|
150
|
+
segments.push({ type: "display", content: raw.slice(2, -2).trim() });
|
|
151
|
+
} else if (raw.startsWith("\\begin")) {
|
|
152
|
+
segments.push({ type: "display", content: raw });
|
|
153
|
+
} else if (raw.startsWith("\\(")) {
|
|
154
|
+
segments.push({ type: "inline", content: raw.slice(2, -2).trim() });
|
|
155
|
+
} else if (raw.startsWith("$")) {
|
|
156
|
+
segments.push({ type: "inline", content: raw.slice(1, -1).trim() });
|
|
157
|
+
}
|
|
158
|
+
lastIndex = match.index + raw.length;
|
|
159
|
+
}
|
|
160
|
+
if (lastIndex < source.length) {
|
|
161
|
+
segments.push({ type: "text", content: source.slice(lastIndex) });
|
|
162
|
+
}
|
|
163
|
+
return segments;
|
|
164
|
+
}
|
|
165
|
+
function MathView({ content, className }) {
|
|
166
|
+
useEffect2(() => {
|
|
167
|
+
injectStylesheet(KATEX_CSS_URL, KATEX_CSS_ID);
|
|
168
|
+
}, []);
|
|
169
|
+
const katexMod = useLazyModule(lazyKatex);
|
|
170
|
+
const segments = useMemo(() => parseMathContent(content), [content]);
|
|
171
|
+
const renderToString = katexMod?.default?.renderToString ?? katexMod?.renderToString;
|
|
172
|
+
if (!renderToString) {
|
|
173
|
+
return React.createElement(
|
|
174
|
+
MathRoot,
|
|
175
|
+
{ className },
|
|
176
|
+
React.createElement("pre", { style: { fontFamily: "monospace", whiteSpace: "pre-wrap" } }, content)
|
|
177
|
+
);
|
|
178
|
+
}
|
|
179
|
+
const elements = segments.map((seg, i) => {
|
|
180
|
+
if (seg.type === "text") {
|
|
181
|
+
return React.createElement("span", { key: i }, seg.content);
|
|
182
|
+
}
|
|
183
|
+
try {
|
|
184
|
+
const html = renderToString(seg.content, {
|
|
185
|
+
displayMode: seg.type === "display",
|
|
186
|
+
throwOnError: false
|
|
187
|
+
});
|
|
188
|
+
if (seg.type === "display") {
|
|
189
|
+
return React.createElement(MathDisplay, {
|
|
190
|
+
key: i,
|
|
191
|
+
dangerouslySetInnerHTML: { __html: html }
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
return React.createElement(MathInline, {
|
|
195
|
+
key: i,
|
|
196
|
+
dangerouslySetInnerHTML: { __html: html }
|
|
197
|
+
});
|
|
198
|
+
} catch (err) {
|
|
199
|
+
return React.createElement(
|
|
200
|
+
Alert,
|
|
201
|
+
{ key: i, severity: "error", sx: { my: 1 } },
|
|
202
|
+
`LaTeX error: ${err instanceof Error ? err.message : String(err)}
|
|
203
|
+
Source: ${seg.content}`
|
|
204
|
+
);
|
|
205
|
+
}
|
|
206
|
+
});
|
|
207
|
+
return React.createElement(MathRoot, { className }, ...elements);
|
|
208
|
+
}
|
|
209
|
+
lazyKatex.load().catch(() => {
|
|
210
|
+
});
|
|
211
|
+
var MathRenderer = class {
|
|
212
|
+
type = "math";
|
|
213
|
+
priority = 40;
|
|
214
|
+
canHandle(content) {
|
|
215
|
+
return isMath(content);
|
|
216
|
+
}
|
|
217
|
+
render(content, options) {
|
|
218
|
+
return React.createElement(MathView, {
|
|
219
|
+
content,
|
|
220
|
+
className: options?.className ?? "fmcp-math-content"
|
|
221
|
+
});
|
|
222
|
+
}
|
|
223
|
+
};
|
|
224
|
+
var mathRenderer = new MathRenderer();
|
|
225
|
+
export {
|
|
226
|
+
MathRenderer,
|
|
227
|
+
isMath,
|
|
228
|
+
mathRenderer
|
|
229
|
+
};
|
|
@@ -0,0 +1,261 @@
|
|
|
1
|
+
// libs/ui/src/renderer/mdx/index.ts
|
|
2
|
+
import React, { useMemo } from "react";
|
|
3
|
+
import Box from "@mui/material/Box";
|
|
4
|
+
import Typography from "@mui/material/Typography";
|
|
5
|
+
import Link from "@mui/material/Link";
|
|
6
|
+
import MuiTable from "@mui/material/Table";
|
|
7
|
+
import TableBody from "@mui/material/TableBody";
|
|
8
|
+
import TableCell from "@mui/material/TableCell";
|
|
9
|
+
import TableHead from "@mui/material/TableHead";
|
|
10
|
+
import TableRow from "@mui/material/TableRow";
|
|
11
|
+
import { styled } from "@mui/material/styles";
|
|
12
|
+
|
|
13
|
+
// libs/ui/src/renderer/common/lazy-import.ts
|
|
14
|
+
var ESM_SH_BASE = "https://esm.sh/";
|
|
15
|
+
function esmShUrl(pkg, options) {
|
|
16
|
+
let url = `${ESM_SH_BASE}${pkg}`;
|
|
17
|
+
if (options?.external?.length) {
|
|
18
|
+
url += `?external=${options.external.join(",")}`;
|
|
19
|
+
}
|
|
20
|
+
return url;
|
|
21
|
+
}
|
|
22
|
+
function runtimeImport(specifier) {
|
|
23
|
+
const dynamicImport = new Function("s", "return import(s)");
|
|
24
|
+
return dynamicImport(specifier);
|
|
25
|
+
}
|
|
26
|
+
async function runtimeImportWithFallback(bareSpecifier, fallbackUrl) {
|
|
27
|
+
try {
|
|
28
|
+
return await runtimeImport(bareSpecifier);
|
|
29
|
+
} catch {
|
|
30
|
+
return runtimeImport(fallbackUrl);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
function createLazyImport(moduleId, importer) {
|
|
34
|
+
let state = { status: "idle" };
|
|
35
|
+
const doImport = importer ?? (async () => {
|
|
36
|
+
const mod = await runtimeImport(moduleId);
|
|
37
|
+
return mod["default"] ?? mod;
|
|
38
|
+
});
|
|
39
|
+
return {
|
|
40
|
+
load() {
|
|
41
|
+
if (state.status === "loaded") return Promise.resolve(state.module);
|
|
42
|
+
if (state.status === "loading") return state.promise;
|
|
43
|
+
if (state.status === "error") {
|
|
44
|
+
state = { status: "idle" };
|
|
45
|
+
}
|
|
46
|
+
const promise = doImport().then(
|
|
47
|
+
(mod) => {
|
|
48
|
+
state = { status: "loaded", module: mod };
|
|
49
|
+
return mod;
|
|
50
|
+
},
|
|
51
|
+
(err) => {
|
|
52
|
+
const error = err instanceof Error ? err : new Error(`Failed to load module "${moduleId}": ${String(err)}`);
|
|
53
|
+
state = { status: "error", error };
|
|
54
|
+
throw error;
|
|
55
|
+
}
|
|
56
|
+
);
|
|
57
|
+
state = { status: "loading", promise };
|
|
58
|
+
return promise;
|
|
59
|
+
},
|
|
60
|
+
get() {
|
|
61
|
+
return state.status === "loaded" ? state.module : void 0;
|
|
62
|
+
},
|
|
63
|
+
getState() {
|
|
64
|
+
return state;
|
|
65
|
+
},
|
|
66
|
+
reset() {
|
|
67
|
+
state = { status: "idle" };
|
|
68
|
+
}
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
// libs/ui/src/renderer/common/use-lazy-module.ts
|
|
73
|
+
import { useState, useEffect } from "react";
|
|
74
|
+
function useLazyModule(lazy) {
|
|
75
|
+
const [, forceUpdate] = useState(0);
|
|
76
|
+
useEffect(() => {
|
|
77
|
+
if (lazy.getState().status === "loaded") {
|
|
78
|
+
forceUpdate((n) => n + 1);
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
lazy.load().then(
|
|
82
|
+
() => forceUpdate((n) => n + 1),
|
|
83
|
+
() => forceUpdate((n) => n + 1)
|
|
84
|
+
);
|
|
85
|
+
}, [lazy]);
|
|
86
|
+
return lazy.get();
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
// libs/ui/src/renderer/mdx/index.ts
|
|
90
|
+
var lazyReactMarkdown = createLazyImport(
|
|
91
|
+
"react-markdown",
|
|
92
|
+
async () => {
|
|
93
|
+
const mod = await runtimeImportWithFallback(
|
|
94
|
+
"react-markdown",
|
|
95
|
+
esmShUrl("react-markdown@9", { external: ["react", "react-dom"] })
|
|
96
|
+
);
|
|
97
|
+
return mod;
|
|
98
|
+
}
|
|
99
|
+
);
|
|
100
|
+
var lazyRemarkGfm = createLazyImport("remark-gfm", async () => {
|
|
101
|
+
const mod = await runtimeImportWithFallback("remark-gfm", esmShUrl("remark-gfm@4"));
|
|
102
|
+
return mod;
|
|
103
|
+
});
|
|
104
|
+
var lazyRehypeHighlight = createLazyImport("rehype-highlight", async () => {
|
|
105
|
+
const mod = await runtimeImportWithFallback("rehype-highlight", esmShUrl("rehype-highlight@7"));
|
|
106
|
+
return mod;
|
|
107
|
+
});
|
|
108
|
+
var lazyRehypeRaw = createLazyImport("rehype-raw", async () => {
|
|
109
|
+
const mod = await runtimeImportWithFallback("rehype-raw", esmShUrl("rehype-raw@7"));
|
|
110
|
+
return mod;
|
|
111
|
+
});
|
|
112
|
+
var MarkdownRoot = styled(Box, {
|
|
113
|
+
name: "FrontMcpMarkdown",
|
|
114
|
+
slot: "Root"
|
|
115
|
+
})(() => ({
|
|
116
|
+
lineHeight: 1.7,
|
|
117
|
+
"& > *:first-of-type": { marginTop: 0 },
|
|
118
|
+
"& > *:last-child": { marginBottom: 0 },
|
|
119
|
+
"& img": { maxWidth: "100%", height: "auto" }
|
|
120
|
+
}));
|
|
121
|
+
var CodeBlock = styled("pre", {
|
|
122
|
+
name: "FrontMcpMarkdown",
|
|
123
|
+
slot: "Code"
|
|
124
|
+
})(({ theme }) => {
|
|
125
|
+
const monoFont = String(
|
|
126
|
+
theme.typography["monoFontFamily"] ?? '"SF Mono", "Fira Code", "Roboto Mono", monospace'
|
|
127
|
+
);
|
|
128
|
+
return {
|
|
129
|
+
backgroundColor: theme.palette.mode === "dark" ? theme.palette.grey[900] : theme.palette.grey[100],
|
|
130
|
+
padding: theme.spacing(2),
|
|
131
|
+
borderRadius: Number(theme.shape.borderRadius),
|
|
132
|
+
overflow: "auto",
|
|
133
|
+
fontFamily: monoFont,
|
|
134
|
+
fontSize: "0.875rem",
|
|
135
|
+
"& code": {
|
|
136
|
+
backgroundColor: "transparent",
|
|
137
|
+
padding: 0,
|
|
138
|
+
fontSize: "inherit",
|
|
139
|
+
fontFamily: "inherit"
|
|
140
|
+
}
|
|
141
|
+
};
|
|
142
|
+
});
|
|
143
|
+
var InlineCode = styled("code")(({ theme }) => {
|
|
144
|
+
const monoFont = String(
|
|
145
|
+
theme.typography["monoFontFamily"] ?? '"SF Mono", "Fira Code", "Roboto Mono", monospace'
|
|
146
|
+
);
|
|
147
|
+
return {
|
|
148
|
+
backgroundColor: theme.palette.mode === "dark" ? theme.palette.grey[800] : theme.palette.grey[200],
|
|
149
|
+
padding: "2px 6px",
|
|
150
|
+
borderRadius: Number(theme.shape.borderRadius) / 2,
|
|
151
|
+
fontFamily: monoFont,
|
|
152
|
+
fontSize: "0.85em"
|
|
153
|
+
};
|
|
154
|
+
});
|
|
155
|
+
var Blockquote = styled("blockquote", {
|
|
156
|
+
name: "FrontMcpMarkdown",
|
|
157
|
+
slot: "Blockquote"
|
|
158
|
+
})(({ theme }) => ({
|
|
159
|
+
borderLeft: `4px solid ${theme.palette.primary.main}`,
|
|
160
|
+
margin: theme.spacing(2, 0),
|
|
161
|
+
padding: theme.spacing(1, 2),
|
|
162
|
+
color: theme.palette.text.secondary,
|
|
163
|
+
"& > p": { margin: 0 }
|
|
164
|
+
}));
|
|
165
|
+
function createMuiComponents() {
|
|
166
|
+
return {
|
|
167
|
+
h1: (props) => React.createElement(Typography, { ...props, variant: "h4", gutterBottom: true }),
|
|
168
|
+
h2: (props) => React.createElement(Typography, { ...props, variant: "h5", gutterBottom: true }),
|
|
169
|
+
h3: (props) => React.createElement(Typography, { ...props, variant: "h6", gutterBottom: true }),
|
|
170
|
+
h4: (props) => React.createElement(Typography, { ...props, variant: "subtitle1", gutterBottom: true, fontWeight: 600 }),
|
|
171
|
+
h5: (props) => React.createElement(Typography, { ...props, variant: "subtitle2", gutterBottom: true }),
|
|
172
|
+
h6: (props) => React.createElement(Typography, { ...props, variant: "subtitle2", gutterBottom: true }),
|
|
173
|
+
p: (props) => React.createElement(Typography, { ...props, variant: "body1", paragraph: true }),
|
|
174
|
+
a: (props) => React.createElement(Link, { ...props, target: "_blank", rel: "noopener noreferrer" }),
|
|
175
|
+
blockquote: (props) => React.createElement(Blockquote, props),
|
|
176
|
+
pre: (props) => React.createElement(CodeBlock, props),
|
|
177
|
+
code: ({ inline, className, children, ...rest }) => {
|
|
178
|
+
if (inline) return React.createElement(InlineCode, rest, children);
|
|
179
|
+
return React.createElement("code", { className, ...rest }, children);
|
|
180
|
+
},
|
|
181
|
+
table: (props) => React.createElement(MuiTable, { ...props, size: "small" }),
|
|
182
|
+
thead: (props) => React.createElement(TableHead, props),
|
|
183
|
+
tbody: (props) => React.createElement(TableBody, props),
|
|
184
|
+
tr: (props) => React.createElement(TableRow, { ...props, hover: true }),
|
|
185
|
+
th: (props) => React.createElement(TableCell, { ...props, sx: { fontWeight: 600 } }),
|
|
186
|
+
td: (props) => React.createElement(TableCell, props)
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
function MarkdownView({ content, className }) {
|
|
190
|
+
const components = useMemo(() => createMuiComponents(), []);
|
|
191
|
+
const ReactMarkdownMod = useLazyModule(lazyReactMarkdown);
|
|
192
|
+
const remarkGfmMod = lazyRemarkGfm.get();
|
|
193
|
+
const rehypeHighlightMod = lazyRehypeHighlight.get();
|
|
194
|
+
const rehypeRawMod = lazyRehypeRaw.get();
|
|
195
|
+
if (ReactMarkdownMod) {
|
|
196
|
+
const ReactMarkdown = ReactMarkdownMod.default;
|
|
197
|
+
const remarkPlugins = [];
|
|
198
|
+
const rehypePlugins = [];
|
|
199
|
+
if (remarkGfmMod) remarkPlugins.push(remarkGfmMod.default);
|
|
200
|
+
if (rehypeHighlightMod) rehypePlugins.push(rehypeHighlightMod.default);
|
|
201
|
+
if (rehypeRawMod) rehypePlugins.push(rehypeRawMod.default);
|
|
202
|
+
return React.createElement(
|
|
203
|
+
MarkdownRoot,
|
|
204
|
+
{ className },
|
|
205
|
+
React.createElement(ReactMarkdown, {
|
|
206
|
+
children: content,
|
|
207
|
+
remarkPlugins,
|
|
208
|
+
rehypePlugins,
|
|
209
|
+
components
|
|
210
|
+
})
|
|
211
|
+
);
|
|
212
|
+
}
|
|
213
|
+
return React.createElement(MarkdownRoot, { className }, ...renderFallback(content));
|
|
214
|
+
}
|
|
215
|
+
function renderFallback(content) {
|
|
216
|
+
const lines = content.split("\n");
|
|
217
|
+
const elements = [];
|
|
218
|
+
for (let i = 0; i < lines.length; i++) {
|
|
219
|
+
const line = lines[i];
|
|
220
|
+
if (line.startsWith("# ")) {
|
|
221
|
+
elements.push(React.createElement(Typography, { key: i, variant: "h4", gutterBottom: true }, line.slice(2)));
|
|
222
|
+
} else if (line.startsWith("## ")) {
|
|
223
|
+
elements.push(React.createElement(Typography, { key: i, variant: "h5", gutterBottom: true }, line.slice(3)));
|
|
224
|
+
} else if (line.startsWith("### ")) {
|
|
225
|
+
elements.push(React.createElement(Typography, { key: i, variant: "h6", gutterBottom: true }, line.slice(4)));
|
|
226
|
+
} else if (line.startsWith("- ") || line.startsWith("* ")) {
|
|
227
|
+
elements.push(React.createElement("li", { key: i }, line.slice(2)));
|
|
228
|
+
} else if (line.startsWith("**") && line.endsWith("**")) {
|
|
229
|
+
elements.push(React.createElement(Typography, { key: i, variant: "body1", fontWeight: 700 }, line.slice(2, -2)));
|
|
230
|
+
} else if (line.trim()) {
|
|
231
|
+
elements.push(React.createElement(Typography, { key: i, variant: "body1", paragraph: true }, line));
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
return elements;
|
|
235
|
+
}
|
|
236
|
+
lazyReactMarkdown.load().catch(() => {
|
|
237
|
+
});
|
|
238
|
+
lazyRemarkGfm.load().catch(() => {
|
|
239
|
+
});
|
|
240
|
+
lazyRehypeHighlight.load().catch(() => {
|
|
241
|
+
});
|
|
242
|
+
lazyRehypeRaw.load().catch(() => {
|
|
243
|
+
});
|
|
244
|
+
var MdxRenderer = class {
|
|
245
|
+
type = "mdx";
|
|
246
|
+
priority = 5;
|
|
247
|
+
canHandle(content) {
|
|
248
|
+
return /^---\s*\n/.test(content) || /import\s+/.test(content) || /<[A-Z]/.test(content) || /^#{1,6}\s+\S/m.test(content) || /^\s*[-*+]\s+\S/m.test(content);
|
|
249
|
+
}
|
|
250
|
+
render(content, options) {
|
|
251
|
+
return React.createElement(MarkdownView, {
|
|
252
|
+
content,
|
|
253
|
+
className: options?.className ?? "fmcp-mdx-content"
|
|
254
|
+
});
|
|
255
|
+
}
|
|
256
|
+
};
|
|
257
|
+
var mdxRenderer = new MdxRenderer();
|
|
258
|
+
export {
|
|
259
|
+
MdxRenderer,
|
|
260
|
+
mdxRenderer
|
|
261
|
+
};
|