@frontmcp/ui 0.12.2 → 1.0.0-beta.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 (310) hide show
  1. package/README.md +279 -72
  2. package/bridge/adapters/claude.adapter.d.ts.map +1 -1
  3. package/bridge/adapters/gemini.adapter.d.ts.map +1 -1
  4. package/bridge/index.js +2 -36
  5. package/components/Alert/Alert.d.ts +11 -0
  6. package/components/Alert/Alert.d.ts.map +1 -0
  7. package/components/Alert/index.d.ts +4 -0
  8. package/components/Alert/index.d.ts.map +1 -0
  9. package/components/Alert/index.js +61 -0
  10. package/components/Avatar/Avatar.d.ts +10 -0
  11. package/components/Avatar/Avatar.d.ts.map +1 -0
  12. package/components/Avatar/index.d.ts +4 -0
  13. package/components/Avatar/index.d.ts.map +1 -0
  14. package/components/Avatar/index.js +43 -0
  15. package/components/Badge/Badge.d.ts +13 -0
  16. package/components/Badge/Badge.d.ts.map +1 -0
  17. package/components/Badge/index.d.ts +4 -0
  18. package/components/Badge/index.d.ts.map +1 -0
  19. package/{render → components/Badge}/index.js +54 -42
  20. package/components/Button/Button.d.ts +16 -0
  21. package/components/Button/Button.d.ts.map +1 -0
  22. package/components/Button/index.d.ts +4 -0
  23. package/components/Button/index.d.ts.map +1 -0
  24. package/components/Button/index.js +91 -0
  25. package/components/Card/Card.d.ts +25 -0
  26. package/components/Card/Card.d.ts.map +1 -0
  27. package/components/Card/index.d.ts +4 -0
  28. package/components/Card/index.d.ts.map +1 -0
  29. package/components/Card/index.js +110 -0
  30. package/components/List/List.d.ts +15 -0
  31. package/components/List/List.d.ts.map +1 -0
  32. package/components/List/index.d.ts +4 -0
  33. package/components/List/index.d.ts.map +1 -0
  34. package/components/List/index.js +58 -0
  35. package/components/Loader/Loader.d.ts +28 -0
  36. package/components/Loader/Loader.d.ts.map +1 -0
  37. package/components/Loader/LoaderContext.d.ts +20 -0
  38. package/components/Loader/LoaderContext.d.ts.map +1 -0
  39. package/components/Loader/index.d.ts +6 -0
  40. package/components/Loader/index.d.ts.map +1 -0
  41. package/components/Loader/index.js +174 -0
  42. package/components/Modal/Modal.d.ts +22 -0
  43. package/components/Modal/Modal.d.ts.map +1 -0
  44. package/components/Modal/index.d.ts +4 -0
  45. package/components/Modal/index.d.ts.map +1 -0
  46. package/components/Modal/index.js +80 -0
  47. package/components/Select/Select.d.ts +21 -0
  48. package/components/Select/Select.d.ts.map +1 -0
  49. package/components/Select/index.d.ts +4 -0
  50. package/components/Select/index.d.ts.map +1 -0
  51. package/components/Select/index.js +78 -0
  52. package/components/Table/Table.d.ts +15 -0
  53. package/components/Table/Table.d.ts.map +1 -0
  54. package/components/Table/index.d.ts +4 -0
  55. package/components/Table/index.d.ts.map +1 -0
  56. package/components/Table/index.js +70 -0
  57. package/components/TextField/TextField.d.ts +19 -0
  58. package/components/TextField/TextField.d.ts.map +1 -0
  59. package/components/TextField/index.d.ts +4 -0
  60. package/components/TextField/index.d.ts.map +1 -0
  61. package/components/TextField/index.js +77 -0
  62. package/components/index.d.ts +22 -28
  63. package/components/index.d.ts.map +1 -1
  64. package/components/index.js +523 -2521
  65. package/esm/bridge/index.mjs +2 -6
  66. package/esm/components/Alert/index.mjs +28 -0
  67. package/esm/components/Avatar/index.mjs +10 -0
  68. package/esm/components/Badge/index.mjs +56 -0
  69. package/esm/components/Button/index.mjs +58 -0
  70. package/esm/components/Card/index.mjs +77 -0
  71. package/esm/components/List/index.mjs +25 -0
  72. package/esm/components/Loader/index.mjs +141 -0
  73. package/esm/components/Modal/index.mjs +47 -0
  74. package/esm/components/Select/index.mjs +45 -0
  75. package/esm/components/Table/index.mjs +37 -0
  76. package/esm/components/TextField/index.mjs +44 -0
  77. package/esm/components/index.mjs +513 -2415
  78. package/esm/index.mjs +62 -4652
  79. package/esm/package.json +372 -16
  80. package/esm/react/index.mjs +2 -285
  81. package/esm/renderer/charts/index.mjs +336 -0
  82. package/esm/renderer/common/index.mjs +135 -0
  83. package/esm/renderer/csv/index.mjs +193 -0
  84. package/esm/renderer/flow/index.mjs +259 -0
  85. package/esm/renderer/html/index.mjs +99 -0
  86. package/esm/renderer/image/index.mjs +125 -0
  87. package/esm/renderer/index.mjs +2173 -0
  88. package/esm/renderer/maps/index.mjs +217 -0
  89. package/esm/renderer/math/index.mjs +229 -0
  90. package/esm/renderer/mdx/index.mjs +261 -0
  91. package/esm/renderer/media/index.mjs +235 -0
  92. package/esm/renderer/mermaid/index.mjs +220 -0
  93. package/esm/renderer/pdf/index.mjs +229 -0
  94. package/esm/renderer/react/index.mjs +230 -0
  95. package/esm/runtime/index.mjs +194 -0
  96. package/esm/theme/index.mjs +93 -0
  97. package/index.d.ts +10 -18
  98. package/index.d.ts.map +1 -1
  99. package/index.js +63 -4806
  100. package/package.json +372 -16
  101. package/react/index.d.ts +8 -54
  102. package/react/index.d.ts.map +1 -1
  103. package/react/index.js +2 -295
  104. package/renderer/auto-detect.d.ts +39 -0
  105. package/renderer/auto-detect.d.ts.map +1 -0
  106. package/renderer/charts/index.d.ts +22 -0
  107. package/renderer/charts/index.d.ts.map +1 -0
  108. package/renderer/charts/index.js +367 -0
  109. package/renderer/common/index.d.ts +5 -0
  110. package/renderer/common/index.d.ts.map +1 -0
  111. package/renderer/common/index.js +158 -0
  112. package/renderer/common/inject-stylesheet.d.ts +9 -0
  113. package/renderer/common/inject-stylesheet.d.ts.map +1 -0
  114. package/renderer/common/lazy-import.d.ts +85 -0
  115. package/renderer/common/lazy-import.d.ts.map +1 -0
  116. package/renderer/common/use-lazy-module.d.ts +13 -0
  117. package/renderer/common/use-lazy-module.d.ts.map +1 -0
  118. package/renderer/common/use-renderer-theme.d.ts +35 -0
  119. package/renderer/common/use-renderer-theme.d.ts.map +1 -0
  120. package/renderer/csv/index.d.ts +12 -0
  121. package/renderer/csv/index.d.ts.map +1 -0
  122. package/renderer/csv/index.js +224 -0
  123. package/renderer/flow/index.d.ts +40 -0
  124. package/renderer/flow/index.d.ts.map +1 -0
  125. package/renderer/flow/index.js +290 -0
  126. package/renderer/html/index.d.ts +12 -0
  127. package/renderer/html/index.d.ts.map +1 -0
  128. package/renderer/html/index.js +130 -0
  129. package/renderer/image/index.d.ts +11 -0
  130. package/renderer/image/index.d.ts.map +1 -0
  131. package/renderer/image/index.js +156 -0
  132. package/renderer/index.d.ts +32 -0
  133. package/renderer/index.d.ts.map +1 -0
  134. package/renderer/index.js +2206 -0
  135. package/renderer/maps/index.d.ts +27 -0
  136. package/renderer/maps/index.d.ts.map +1 -0
  137. package/renderer/maps/index.js +248 -0
  138. package/renderer/math/index.d.ts +11 -0
  139. package/renderer/math/index.d.ts.map +1 -0
  140. package/renderer/math/index.js +260 -0
  141. package/renderer/mdx/index.d.ts +10 -0
  142. package/renderer/mdx/index.d.ts.map +1 -0
  143. package/renderer/mdx/index.js +292 -0
  144. package/renderer/media/index.d.ts +20 -0
  145. package/renderer/media/index.d.ts.map +1 -0
  146. package/renderer/media/index.js +266 -0
  147. package/renderer/mermaid/index.d.ts +11 -0
  148. package/renderer/mermaid/index.d.ts.map +1 -0
  149. package/renderer/mermaid/index.js +251 -0
  150. package/renderer/pdf/index.d.ts +10 -0
  151. package/renderer/pdf/index.d.ts.map +1 -0
  152. package/renderer/pdf/index.js +260 -0
  153. package/renderer/react/index.d.ts +45 -0
  154. package/renderer/react/index.d.ts.map +1 -0
  155. package/renderer/react/index.js +261 -0
  156. package/renderer/types.d.ts +24 -0
  157. package/renderer/types.d.ts.map +1 -0
  158. package/runtime/babel-runtime.d.ts +70 -0
  159. package/runtime/babel-runtime.d.ts.map +1 -0
  160. package/runtime/content-detector.d.ts +43 -0
  161. package/runtime/content-detector.d.ts.map +1 -0
  162. package/runtime/index.d.ts +10 -0
  163. package/runtime/index.d.ts.map +1 -0
  164. package/runtime/index.js +217 -0
  165. package/theme/FrontMcpThemeProvider.d.ts +4 -0
  166. package/theme/FrontMcpThemeProvider.d.ts.map +1 -0
  167. package/theme/create-theme.d.ts +9 -0
  168. package/theme/create-theme.d.ts.map +1 -0
  169. package/theme/index.d.ts +5 -0
  170. package/theme/index.d.ts.map +1 -0
  171. package/theme/index.js +126 -0
  172. package/theme/types.d.ts +28 -0
  173. package/theme/types.d.ts.map +1 -0
  174. package/theme/use-theme.d.ts +3 -0
  175. package/theme/use-theme.d.ts.map +1 -0
  176. package/bundler/browser-components.d.ts +0 -42
  177. package/bundler/browser-components.d.ts.map +0 -1
  178. package/bundler/bundler.d.ts +0 -282
  179. package/bundler/bundler.d.ts.map +0 -1
  180. package/bundler/index.d.ts +0 -43
  181. package/bundler/index.d.ts.map +0 -1
  182. package/bundler/index.js +0 -3168
  183. package/bundler/types.d.ts +0 -883
  184. package/bundler/types.d.ts.map +0 -1
  185. package/components/alert.d.ts +0 -83
  186. package/components/alert.d.ts.map +0 -1
  187. package/components/alert.schema.d.ts +0 -98
  188. package/components/alert.schema.d.ts.map +0 -1
  189. package/components/avatar.d.ts +0 -77
  190. package/components/avatar.d.ts.map +0 -1
  191. package/components/avatar.schema.d.ts +0 -170
  192. package/components/avatar.schema.d.ts.map +0 -1
  193. package/components/badge.d.ts +0 -78
  194. package/components/badge.d.ts.map +0 -1
  195. package/components/badge.schema.d.ts +0 -91
  196. package/components/badge.schema.d.ts.map +0 -1
  197. package/components/button.d.ts +0 -100
  198. package/components/button.d.ts.map +0 -1
  199. package/components/button.schema.d.ts +0 -120
  200. package/components/button.schema.d.ts.map +0 -1
  201. package/components/card.d.ts +0 -76
  202. package/components/card.d.ts.map +0 -1
  203. package/components/card.schema.d.ts +0 -93
  204. package/components/card.schema.d.ts.map +0 -1
  205. package/components/form.d.ts +0 -227
  206. package/components/form.d.ts.map +0 -1
  207. package/components/form.schema.d.ts +0 -365
  208. package/components/form.schema.d.ts.map +0 -1
  209. package/components/list.d.ts +0 -121
  210. package/components/list.d.ts.map +0 -1
  211. package/components/list.schema.d.ts +0 -129
  212. package/components/list.schema.d.ts.map +0 -1
  213. package/components/modal.d.ts +0 -100
  214. package/components/modal.d.ts.map +0 -1
  215. package/components/modal.schema.d.ts +0 -151
  216. package/components/modal.schema.d.ts.map +0 -1
  217. package/components/table.d.ts +0 -91
  218. package/components/table.d.ts.map +0 -1
  219. package/components/table.schema.d.ts +0 -123
  220. package/components/table.schema.d.ts.map +0 -1
  221. package/esm/bundler/index.mjs +0 -3136
  222. package/esm/layouts/index.mjs +0 -409
  223. package/esm/render/index.mjs +0 -45
  224. package/esm/renderers/index.mjs +0 -621
  225. package/esm/universal/index.mjs +0 -1946
  226. package/esm/web-components/index.mjs +0 -2023
  227. package/layouts/base.d.ts +0 -86
  228. package/layouts/base.d.ts.map +0 -1
  229. package/layouts/index.d.ts +0 -8
  230. package/layouts/index.d.ts.map +0 -1
  231. package/layouts/index.js +0 -437
  232. package/layouts/presets.d.ts +0 -134
  233. package/layouts/presets.d.ts.map +0 -1
  234. package/react/Alert.d.ts +0 -101
  235. package/react/Alert.d.ts.map +0 -1
  236. package/react/Badge.d.ts +0 -100
  237. package/react/Badge.d.ts.map +0 -1
  238. package/react/Button.d.ts +0 -108
  239. package/react/Button.d.ts.map +0 -1
  240. package/react/Card.d.ts +0 -103
  241. package/react/Card.d.ts.map +0 -1
  242. package/react/types.d.ts +0 -105
  243. package/react/types.d.ts.map +0 -1
  244. package/render/index.d.ts +0 -8
  245. package/render/index.d.ts.map +0 -1
  246. package/render/prerender.d.ts +0 -57
  247. package/render/prerender.d.ts.map +0 -1
  248. package/renderers/index.d.ts +0 -26
  249. package/renderers/index.d.ts.map +0 -1
  250. package/renderers/index.js +0 -666
  251. package/renderers/mdx.renderer.d.ts +0 -99
  252. package/renderers/mdx.renderer.d.ts.map +0 -1
  253. package/renderers/react.adapter.d.ts +0 -70
  254. package/renderers/react.adapter.d.ts.map +0 -1
  255. package/renderers/react.renderer.d.ts +0 -105
  256. package/renderers/react.renderer.d.ts.map +0 -1
  257. package/renderers/transpiler.d.ts +0 -49
  258. package/renderers/transpiler.d.ts.map +0 -1
  259. package/universal/UniversalApp.d.ts +0 -108
  260. package/universal/UniversalApp.d.ts.map +0 -1
  261. package/universal/cached-runtime.d.ts +0 -139
  262. package/universal/cached-runtime.d.ts.map +0 -1
  263. package/universal/context.d.ts +0 -122
  264. package/universal/context.d.ts.map +0 -1
  265. package/universal/index.d.ts +0 -57
  266. package/universal/index.d.ts.map +0 -1
  267. package/universal/index.js +0 -2032
  268. package/universal/renderers/html.renderer.d.ts +0 -36
  269. package/universal/renderers/html.renderer.d.ts.map +0 -1
  270. package/universal/renderers/index.d.ts +0 -112
  271. package/universal/renderers/index.d.ts.map +0 -1
  272. package/universal/renderers/markdown.renderer.d.ts +0 -33
  273. package/universal/renderers/markdown.renderer.d.ts.map +0 -1
  274. package/universal/renderers/mdx.renderer.d.ts +0 -38
  275. package/universal/renderers/mdx.renderer.d.ts.map +0 -1
  276. package/universal/renderers/react.renderer.d.ts +0 -46
  277. package/universal/renderers/react.renderer.d.ts.map +0 -1
  278. package/universal/runtime-builder.d.ts +0 -33
  279. package/universal/runtime-builder.d.ts.map +0 -1
  280. package/universal/store.d.ts +0 -135
  281. package/universal/store.d.ts.map +0 -1
  282. package/universal/types.d.ts +0 -199
  283. package/universal/types.d.ts.map +0 -1
  284. package/web-components/core/attribute-parser.d.ts +0 -82
  285. package/web-components/core/attribute-parser.d.ts.map +0 -1
  286. package/web-components/core/base-element.d.ts +0 -197
  287. package/web-components/core/base-element.d.ts.map +0 -1
  288. package/web-components/core/index.d.ts +0 -9
  289. package/web-components/core/index.d.ts.map +0 -1
  290. package/web-components/elements/fmcp-alert.d.ts +0 -46
  291. package/web-components/elements/fmcp-alert.d.ts.map +0 -1
  292. package/web-components/elements/fmcp-badge.d.ts +0 -47
  293. package/web-components/elements/fmcp-badge.d.ts.map +0 -1
  294. package/web-components/elements/fmcp-button.d.ts +0 -117
  295. package/web-components/elements/fmcp-button.d.ts.map +0 -1
  296. package/web-components/elements/fmcp-card.d.ts +0 -53
  297. package/web-components/elements/fmcp-card.d.ts.map +0 -1
  298. package/web-components/elements/fmcp-input.d.ts +0 -96
  299. package/web-components/elements/fmcp-input.d.ts.map +0 -1
  300. package/web-components/elements/fmcp-select.d.ts +0 -100
  301. package/web-components/elements/fmcp-select.d.ts.map +0 -1
  302. package/web-components/elements/index.d.ts +0 -13
  303. package/web-components/elements/index.d.ts.map +0 -1
  304. package/web-components/index.d.ts +0 -49
  305. package/web-components/index.d.ts.map +0 -1
  306. package/web-components/index.js +0 -2058
  307. package/web-components/register.d.ts +0 -57
  308. package/web-components/register.d.ts.map +0 -1
  309. package/web-components/types.d.ts +0 -122
  310. package/web-components/types.d.ts.map +0 -1
@@ -1,666 +0,0 @@
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/renderers/index.ts
31
- var renderers_exports = {};
32
- __export(renderers_exports, {
33
- MdxRenderer: () => MdxRenderer,
34
- ReactRenderer: () => ReactRenderer,
35
- ReactRendererAdapter: () => ReactRendererAdapter,
36
- createReactAdapter: () => createReactAdapter,
37
- executeTranspiledCode: () => executeTranspiledCode,
38
- loadReactAdapter: () => loadReactAdapter,
39
- mdxRenderer: () => mdxRenderer,
40
- reactRenderer: () => reactRenderer,
41
- transpileAndExecute: () => transpileAndExecute
42
- });
43
- module.exports = __toCommonJS(renderers_exports);
44
-
45
- // libs/ui/src/renderers/react.renderer.ts
46
- var import_renderers = require("@frontmcp/uipack/renderers");
47
- var VALID_JS_IDENTIFIER = /^[a-zA-Z_$][a-zA-Z0-9_$]*$/;
48
- function isValidComponentName(name) {
49
- return VALID_JS_IDENTIFIER.test(name);
50
- }
51
- function sanitizeComponentName(name) {
52
- if (isValidComponentName(name)) {
53
- return name;
54
- }
55
- const sanitized = name.replace(/[^a-zA-Z0-9_$]/g, "_").replace(/^[0-9]/, "_$&");
56
- return sanitized || "Component";
57
- }
58
- var REACT_CDN = {
59
- react: "https://esm.sh/react@19",
60
- reactDom: "https://esm.sh/react-dom@19/client"
61
- };
62
- var INLINE_REACT_PLACEHOLDER = `
63
- // React runtime not available inline yet.
64
- // For blocked-network platforms, use pre-rendered HTML templates.
65
- console.warn('[FrontMCP] React hydration not available on this platform.');
66
- `;
67
- var ReactRenderer = class {
68
- type = "react";
69
- priority = 20;
70
- // Higher priority than HTML
71
- /**
72
- * Check if this renderer can handle the given template.
73
- *
74
- * Accepts:
75
- * - React component functions (imported, already transpiled)
76
- * - Strings containing JSX syntax
77
- */
78
- canHandle(template) {
79
- if (typeof template === "function" && (0, import_renderers.isReactComponent)(template)) {
80
- return true;
81
- }
82
- if (typeof template === "string" && (0, import_renderers.containsJsx)(template)) {
83
- return true;
84
- }
85
- return false;
86
- }
87
- /**
88
- * Transpile the template if needed.
89
- *
90
- * For imported React components, no transpilation is needed.
91
- * For JSX strings, SWC transpilation is performed.
92
- */
93
- async transpile(template, options) {
94
- if (typeof template === "function") {
95
- const hash = (0, import_renderers.hashString)(template.toString());
96
- return {
97
- code: "",
98
- // No transpiled code for already-compiled components
99
- hash,
100
- cached: true
101
- };
102
- }
103
- if (typeof template === "string") {
104
- return (0, import_renderers.transpileJsx)(template, {
105
- development: options?.sourceMaps ?? false
106
- });
107
- }
108
- throw new Error("Invalid template type for ReactRenderer");
109
- }
110
- /**
111
- * Render the template to HTML for client-side rendering.
112
- *
113
- * Unlike SSR, this method generates HTML that will be rendered
114
- * client-side by React in the browser. No server-side React required.
115
- *
116
- * The generated HTML includes:
117
- * - A container div for the React root
118
- * - The component code (transpiled if needed)
119
- * - Props embedded as a data attribute
120
- * - A render script that initializes the component
121
- */
122
- async render(template, context, _options) {
123
- const props = {
124
- input: context.input,
125
- output: context.output,
126
- structuredContent: context.structuredContent,
127
- helpers: context.helpers
128
- };
129
- const escapedProps = JSON.stringify(props).replace(/&/g, "&amp;").replace(/'/g, "&#39;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
130
- const rootId = `frontmcp-react-${(0, import_renderers.hashString)(Date.now().toString()).slice(0, 8)}`;
131
- let componentCode;
132
- let componentName;
133
- if (typeof template === "function") {
134
- const rawName = template.name || "Component";
135
- componentName = sanitizeComponentName(rawName);
136
- componentCode = `
137
- // Component should be registered via window.__frontmcp_components['${componentName}']
138
- (function() {
139
- if (!window.__frontmcp_components || !window.__frontmcp_components['${componentName}']) {
140
- console.error('[FrontMCP] Component "${componentName}" not registered. Use buildHydrationScript() to register components.');
141
- }
142
- })();
143
- `;
144
- } else if (typeof template === "string") {
145
- const transpiled = await this.transpile(template);
146
- const match = transpiled.code.match(/function\s+(\w+)/);
147
- const rawName = match?.[1] || "Widget";
148
- componentName = sanitizeComponentName(rawName);
149
- componentCode = transpiled.code;
150
- } else {
151
- throw new Error("Invalid template type for ReactRenderer");
152
- }
153
- const html = `
154
- <div id="${rootId}" data-frontmcp-react data-component="${componentName}" data-props='${escapedProps}'>
155
- <div class="flex items-center justify-center p-4 text-gray-500">
156
- <svg class="animate-spin h-5 w-5 mr-2" viewBox="0 0 24 24">
157
- <circle class="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" stroke-width="4" fill="none"></circle>
158
- <path class="opacity-75" fill="currentColor" d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"></path>
159
- </svg>
160
- Loading...
161
- </div>
162
- </div>
163
- <script type="module">
164
- (function() {
165
- ${componentCode}
166
-
167
- // Wait for React to be available
168
- function waitForReact(callback, maxAttempts) {
169
- var attempts = 0;
170
- var check = function() {
171
- if (typeof React !== 'undefined' && typeof ReactDOM !== 'undefined') {
172
- callback();
173
- } else if (attempts < maxAttempts) {
174
- attempts++;
175
- setTimeout(check, 50);
176
- } else {
177
- console.error('[FrontMCP] React not loaded after ' + maxAttempts + ' attempts');
178
- }
179
- };
180
- check();
181
- }
182
-
183
- waitForReact(function() {
184
- try {
185
- var root = document.getElementById('${rootId}');
186
- if (!root) return;
187
-
188
- var propsJson = root.getAttribute('data-props');
189
- var props = propsJson ? JSON.parse(propsJson.replace(/&amp;/g, '&').replace(/&#39;/g, "'").replace(/&lt;/g, '<').replace(/&gt;/g, '>')) : {};
190
-
191
- // Get the component
192
- var Component = ${componentName};
193
-
194
- // Check if it's registered globally
195
- if (typeof Component === 'undefined' && window.__frontmcp_components) {
196
- Component = window.__frontmcp_components['${componentName}'];
197
- }
198
-
199
- if (typeof Component === 'function') {
200
- var element = React.createElement(Component, props);
201
- var reactRoot = ReactDOM.createRoot(root);
202
- reactRoot.render(element);
203
- } else {
204
- console.error('[FrontMCP] Component "${componentName}" not found');
205
- }
206
- } catch (err) {
207
- console.error('[FrontMCP] React render error:', err);
208
- }
209
- }, 100);
210
- })();
211
- </script>
212
- `;
213
- return html.trim();
214
- }
215
- /**
216
- * Get runtime scripts for client-side functionality.
217
- */
218
- getRuntimeScripts(platform) {
219
- if (platform.networkMode === "blocked") {
220
- return {
221
- headScripts: "",
222
- inlineScripts: INLINE_REACT_PLACEHOLDER,
223
- isInline: true
224
- };
225
- }
226
- return {
227
- headScripts: `
228
- <script crossorigin src="${REACT_CDN.react}"></script>
229
- <script crossorigin src="${REACT_CDN.reactDom}"></script>
230
- `,
231
- isInline: false
232
- };
233
- }
234
- };
235
- var reactRenderer = new ReactRenderer();
236
-
237
- // libs/ui/src/renderers/react.adapter.ts
238
- var mountedRoots = /* @__PURE__ */ new WeakMap();
239
- var ReactRendererAdapter = class {
240
- type = "react";
241
- // Lazy-loaded React runtime
242
- react = null;
243
- reactDOM = null;
244
- loadPromise = null;
245
- /**
246
- * Check if this adapter can handle the given content.
247
- */
248
- canHandle(content) {
249
- if (typeof content === "function") {
250
- return true;
251
- }
252
- if (typeof content === "string") {
253
- if (content.includes("React.createElement") || content.includes("jsx(") || content.includes("jsxs(")) {
254
- return true;
255
- }
256
- const funcIndex = content.indexOf("function");
257
- if (funcIndex !== -1) {
258
- const afterFunc = content.slice(funcIndex, Math.min(funcIndex + 2e3, content.length));
259
- if (afterFunc.includes("return") && afterFunc.includes("<")) {
260
- return true;
261
- }
262
- }
263
- return false;
264
- }
265
- return false;
266
- }
267
- /**
268
- * Render React component to a string.
269
- * This is a client-side fallback - SSR should be done at build time.
270
- */
271
- async render(content, context, _options) {
272
- return `<div data-frontmcp-react data-tool="${context.toolName}">${content}</div>`;
273
- }
274
- /**
275
- * Render React component directly to the DOM.
276
- */
277
- async renderToDOM(content, target, context, options) {
278
- try {
279
- await this.ensureReactLoaded();
280
- if (!this.react || !this.reactDOM) {
281
- throw new Error("React runtime not available");
282
- }
283
- const componentName = target.getAttribute("data-component");
284
- const component = this.getComponent(componentName, content);
285
- if (!component) {
286
- target.innerHTML = content;
287
- return { success: true };
288
- }
289
- const element = this.react.createElement(component, {
290
- input: context.input,
291
- output: context.output,
292
- structuredContent: context.structuredContent,
293
- toolName: context.toolName
294
- });
295
- if (options?.hydrate && this.reactDOM.hydrateRoot) {
296
- const root = this.reactDOM.hydrateRoot(target, element);
297
- mountedRoots.set(target, root);
298
- } else if (this.reactDOM.createRoot) {
299
- const root = this.reactDOM.createRoot(target);
300
- root.render(element);
301
- mountedRoots.set(target, root);
302
- } else if (this.reactDOM.render) {
303
- this.reactDOM.render(element, target);
304
- mountedRoots.set(target, {
305
- unmount: () => this.reactDOM?.unmountComponentAtNode?.(target)
306
- });
307
- } else {
308
- throw new Error("No suitable React render method available");
309
- }
310
- target.dispatchEvent(
311
- new CustomEvent("frontmcp:rendered", {
312
- bubbles: true,
313
- detail: { type: "react", toolName: context.toolName }
314
- })
315
- );
316
- return { success: true };
317
- } catch (error) {
318
- const message = error instanceof Error ? error.message : String(error);
319
- console.error("[FrontMCP] React render failed:", message);
320
- return { success: false, error: message };
321
- }
322
- }
323
- /**
324
- * Hydrate existing SSR content with React.
325
- */
326
- async hydrate(target, context, options) {
327
- return this.renderToDOM("", target, context, { ...options, hydrate: true });
328
- }
329
- /**
330
- * Update rendered React component with new data.
331
- */
332
- async update(target, context) {
333
- try {
334
- await this.ensureReactLoaded();
335
- if (!this.react) {
336
- throw new Error("React runtime not available");
337
- }
338
- const existingRoot = mountedRoots.get(target);
339
- const componentName = target.getAttribute("data-component");
340
- const component = this.getComponent(componentName, "");
341
- if (!component) {
342
- return { success: false, error: "No component found for update" };
343
- }
344
- const element = this.react.createElement(component, {
345
- input: context.input,
346
- output: context.output,
347
- structuredContent: context.structuredContent,
348
- toolName: context.toolName
349
- });
350
- if (existingRoot && "render" in existingRoot) {
351
- existingRoot.render(element);
352
- return { success: true };
353
- }
354
- return this.renderToDOM("", target, context);
355
- } catch (error) {
356
- const message = error instanceof Error ? error.message : String(error);
357
- console.error("[FrontMCP] React update failed:", message);
358
- return { success: false, error: message };
359
- }
360
- }
361
- /**
362
- * Clean up React root.
363
- */
364
- destroy(target) {
365
- const root = mountedRoots.get(target);
366
- if (root) {
367
- root.unmount();
368
- mountedRoots.delete(target);
369
- }
370
- }
371
- /**
372
- * Ensure React is loaded.
373
- */
374
- async ensureReactLoaded() {
375
- if (this.react && this.reactDOM) {
376
- return;
377
- }
378
- if (this.loadPromise) {
379
- return this.loadPromise;
380
- }
381
- this.loadPromise = this.loadReact();
382
- return this.loadPromise;
383
- }
384
- /**
385
- * Load React runtime.
386
- */
387
- async loadReact() {
388
- const win = typeof window !== "undefined" ? window : globalThis;
389
- if (win.React) {
390
- this.react = win.React;
391
- }
392
- if (win.ReactDOM) {
393
- this.reactDOM = win.ReactDOM;
394
- }
395
- if (this.react && this.reactDOM) {
396
- return;
397
- }
398
- try {
399
- if (!this.react) {
400
- const reactModule = await import(
401
- /* webpackIgnore: true */
402
- "react"
403
- );
404
- this.react = reactModule.default || reactModule;
405
- }
406
- if (!this.reactDOM) {
407
- const reactDOMModule = await import(
408
- /* webpackIgnore: true */
409
- "react-dom/client"
410
- );
411
- this.reactDOM = reactDOMModule.default || reactDOMModule;
412
- }
413
- } catch {
414
- if (!this.react || !this.reactDOM) {
415
- console.warn("[FrontMCP] React runtime not available. Ensure React is loaded via CDN or bundled.");
416
- }
417
- }
418
- }
419
- /**
420
- * Get a React component by name or from content.
421
- */
422
- getComponent(componentName, content) {
423
- const win = typeof window !== "undefined" ? window : globalThis;
424
- if (componentName && win.__frontmcp_components) {
425
- const registered = win.__frontmcp_components?.[componentName];
426
- if (registered) {
427
- return registered;
428
- }
429
- }
430
- if (content && typeof content === "function") {
431
- return content;
432
- }
433
- return null;
434
- }
435
- };
436
- function createReactAdapter() {
437
- return new ReactRendererAdapter();
438
- }
439
- async function loadReactAdapter() {
440
- return createReactAdapter();
441
- }
442
-
443
- // libs/ui/src/renderers/mdx.renderer.ts
444
- var import_renderers2 = require("@frontmcp/uipack/renderers");
445
- function buildReactCdnUrls(version = "19") {
446
- return {
447
- react: `https://esm.sh/react@${version}`,
448
- reactDom: `https://esm.sh/react-dom@${version}/client`
449
- };
450
- }
451
- var REACT_CDN2 = buildReactCdnUrls("19");
452
- var INLINE_MDX_PLACEHOLDER = `
453
- // MDX runtime not available inline yet.
454
- // For blocked-network platforms, use pre-rendered HTML templates.
455
- console.warn('[FrontMCP] MDX hydration not available on this platform.');
456
- `;
457
- var MdxRenderer = class {
458
- type = "mdx";
459
- priority = 10;
460
- // Between HTML (0) and React (20)
461
- /**
462
- * Lazy-loaded modules.
463
- */
464
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
465
- React = null;
466
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
467
- ReactDOMServer = null;
468
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
469
- jsxRuntime = null;
470
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
471
- mdxEvaluate = null;
472
- /**
473
- * Check if this renderer can handle the given template.
474
- *
475
- * Accepts strings containing MDX syntax (Markdown + JSX).
476
- */
477
- canHandle(template) {
478
- if (typeof template !== "string") {
479
- return false;
480
- }
481
- return (0, import_renderers2.containsMdxSyntax)(template);
482
- }
483
- /**
484
- * Prepare MDX template for rendering.
485
- * Caches the template hash for deduplication. Actual MDX compilation
486
- * happens during render() via @mdx-js/mdx evaluate().
487
- */
488
- async transpile(template, _options) {
489
- const hash = (0, import_renderers2.hashString)(template);
490
- const cached = import_renderers2.transpileCache.getByKey(hash);
491
- if (cached) {
492
- return { ...cached, cached: true };
493
- }
494
- const transpileResult = {
495
- code: template,
496
- hash,
497
- cached: false
498
- };
499
- import_renderers2.transpileCache.setByKey(hash, transpileResult);
500
- return transpileResult;
501
- }
502
- /**
503
- * Render MDX template to HTML string.
504
- *
505
- * Uses @mdx-js/mdx's evaluate() for clean compilation + execution,
506
- * then renders the resulting React component to HTML via SSR.
507
- */
508
- async render(template, context, options) {
509
- await this.loadReact();
510
- await this.loadMdx();
511
- if (!this.mdxEvaluate) {
512
- throw new Error("MDX compilation requires @mdx-js/mdx. Install it: npm install @mdx-js/mdx");
513
- }
514
- const templateHash = (0, import_renderers2.hashString)(template);
515
- const cacheKey = `mdx-component:${templateHash}`;
516
- let Content = import_renderers2.componentCache.get(cacheKey);
517
- if (!Content) {
518
- const result = await this.mdxEvaluate(template, {
519
- ...this.jsxRuntime,
520
- Fragment: this.React.Fragment,
521
- development: false
522
- });
523
- Content = result.default;
524
- import_renderers2.componentCache.set(cacheKey, Content);
525
- }
526
- const mdxComponents = {
527
- ...options?.mdxComponents,
528
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
529
- wrapper: ({ children }) => {
530
- return this.React.createElement("div", { className: "mdx-content" }, children);
531
- }
532
- };
533
- const props = {
534
- input: context.input,
535
- output: context.output,
536
- structuredContent: context.structuredContent,
537
- helpers: context.helpers
538
- };
539
- const reservedProps = /* @__PURE__ */ new Set(["input", "output", "structuredContent", "helpers", "components"]);
540
- const outputProps = typeof context.output === "object" && context.output !== null ? Object.fromEntries(Object.entries(context.output).filter(([key]) => !reservedProps.has(key))) : {};
541
- const spreadProps = {
542
- ...outputProps,
543
- ...props
544
- };
545
- const element = this.React.createElement(Content, {
546
- components: mdxComponents,
547
- ...spreadProps
548
- });
549
- const html = this.ReactDOMServer.renderToString(element);
550
- if (options?.hydrate) {
551
- const escapedProps = JSON.stringify(props).replace(/&/g, "&amp;").replace(/'/g, "&#39;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
552
- return `<div data-mdx-hydrate="true" data-props='${escapedProps}'>${html}</div>`;
553
- }
554
- return html;
555
- }
556
- /**
557
- * Get runtime scripts for client-side functionality.
558
- */
559
- getRuntimeScripts(platform) {
560
- if (platform.networkMode === "blocked") {
561
- return {
562
- headScripts: "",
563
- inlineScripts: INLINE_MDX_PLACEHOLDER,
564
- isInline: true
565
- };
566
- }
567
- return {
568
- headScripts: `
569
- <script crossorigin src="${REACT_CDN2.react}"></script>
570
- <script crossorigin src="${REACT_CDN2.reactDom}"></script>
571
- `,
572
- isInline: false
573
- };
574
- }
575
- /**
576
- * Load React and ReactDOMServer modules.
577
- */
578
- async loadReact() {
579
- if (this.React && this.ReactDOMServer && this.jsxRuntime) {
580
- return;
581
- }
582
- try {
583
- const [react, reactDomServer, jsxRuntime] = await Promise.all([
584
- import("react"),
585
- import("react-dom/server"),
586
- import("react/jsx-runtime")
587
- ]);
588
- this.React = react;
589
- this.ReactDOMServer = reactDomServer;
590
- this.jsxRuntime = jsxRuntime;
591
- } catch {
592
- throw new Error("React is required for MdxRenderer. Install react and react-dom: npm install react react-dom");
593
- }
594
- }
595
- /**
596
- * Load @mdx-js/mdx evaluate function.
597
- */
598
- async loadMdx() {
599
- if (this.mdxEvaluate) {
600
- return;
601
- }
602
- try {
603
- const mdx = await import("@mdx-js/mdx");
604
- this.mdxEvaluate = mdx.evaluate;
605
- } catch {
606
- console.warn(
607
- "[@frontmcp/ui] @mdx-js/mdx not available. MDX rendering disabled. Install @mdx-js/mdx to enable: npm install @mdx-js/mdx"
608
- );
609
- }
610
- }
611
- };
612
- var mdxRenderer = new MdxRenderer();
613
-
614
- // libs/ui/src/renderers/transpiler.ts
615
- var import_renderers3 = require("@frontmcp/uipack/renderers");
616
- async function executeTranspiledCode(code, context = {}) {
617
- let React;
618
- let jsxRuntime;
619
- try {
620
- React = await import("react");
621
- jsxRuntime = await import("react/jsx-runtime");
622
- } catch {
623
- throw new Error("React is required for JSX templates. Install react: npm install react react-dom");
624
- }
625
- const exports2 = {};
626
- const module2 = { exports: exports2 };
627
- const require2 = (id) => {
628
- switch (id) {
629
- case "react":
630
- return React;
631
- case "react/jsx-runtime":
632
- return jsxRuntime;
633
- case "react/jsx-dev-runtime":
634
- return jsxRuntime;
635
- default:
636
- if (context[id]) {
637
- return context[id];
638
- }
639
- throw new Error(`Module '${id}' not available in JSX template context`);
640
- }
641
- };
642
- try {
643
- const fn = new Function("exports", "require", "module", "__filename", "__dirname", "React", "context", code);
644
- fn(exports2, require2, module2, "template.js", "/", React, context);
645
- const exportKeys = Object.keys(module2.exports);
646
- return module2.exports["default"] || (exportKeys.length > 0 ? module2.exports[exportKeys[0]] : null) || module2.exports;
647
- } catch (error) {
648
- throw new Error(`Failed to execute transpiled JSX: ${error instanceof Error ? error.message : String(error)}`);
649
- }
650
- }
651
- async function transpileAndExecute(source, context = {}) {
652
- const result = await (0, import_renderers3.transpileJsx)(source);
653
- return executeTranspiledCode(result.code, context);
654
- }
655
- // Annotate the CommonJS export names for ESM import in node:
656
- 0 && (module.exports = {
657
- MdxRenderer,
658
- ReactRenderer,
659
- ReactRendererAdapter,
660
- createReactAdapter,
661
- executeTranspiledCode,
662
- loadReactAdapter,
663
- mdxRenderer,
664
- reactRenderer,
665
- transpileAndExecute
666
- });