@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.
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
@@ -0,0 +1,230 @@
1
+ // libs/ui/src/renderer/react/index.ts
2
+ import React, { useState, useEffect } from "react";
3
+ import Box from "@mui/material/Box";
4
+ import Alert from "@mui/material/Alert";
5
+
6
+ // libs/ui/src/renderer/common/lazy-import.ts
7
+ function runtimeImport(specifier) {
8
+ const dynamicImport = new Function("s", "return import(s)");
9
+ return dynamicImport(specifier);
10
+ }
11
+
12
+ // libs/ui/src/runtime/babel-runtime.ts
13
+ var BABEL_STANDALONE_CDN = "https://esm.sh/@babel/standalone@7";
14
+ var BABEL_STANDALONE_FALLBACK_CDN = "https://cdnjs.cloudflare.com/ajax/libs/babel-standalone/7.26.10/babel.min.js";
15
+ var babelState = { status: "idle" };
16
+ async function loadBabel() {
17
+ if (babelState.status === "loaded") {
18
+ return babelState.babel;
19
+ }
20
+ if (babelState.status === "loading") {
21
+ return babelState.promise;
22
+ }
23
+ if (babelState.status === "error") {
24
+ throw babelState.error;
25
+ }
26
+ const promise = doLoadBabel();
27
+ babelState = { status: "loading", promise };
28
+ try {
29
+ const babel = await promise;
30
+ babelState = { status: "loaded", babel };
31
+ return babel;
32
+ } catch (error) {
33
+ const err = error instanceof Error ? error : new Error(String(error));
34
+ babelState = { status: "error", error: err };
35
+ throw err;
36
+ }
37
+ }
38
+ async function doLoadBabel() {
39
+ const globalBabel = globalThis["Babel"];
40
+ if (globalBabel && typeof globalBabel.transform === "function") {
41
+ return globalBabel;
42
+ }
43
+ try {
44
+ const module = await import(
45
+ /* @vite-ignore */
46
+ /* webpackIgnore: true */
47
+ BABEL_STANDALONE_CDN
48
+ );
49
+ if (module && typeof module.transform === "function") {
50
+ return module;
51
+ }
52
+ if (module.default && typeof module.default.transform === "function") {
53
+ return module.default;
54
+ }
55
+ } catch {
56
+ }
57
+ return new Promise((resolve, reject) => {
58
+ if (typeof document === "undefined") {
59
+ reject(new Error("Babel Standalone requires a browser environment"));
60
+ return;
61
+ }
62
+ const script = document.createElement("script");
63
+ script.src = BABEL_STANDALONE_FALLBACK_CDN;
64
+ script.crossOrigin = "anonymous";
65
+ script.onload = () => {
66
+ const babel = globalThis["Babel"];
67
+ if (babel && typeof babel.transform === "function") {
68
+ resolve(babel);
69
+ } else {
70
+ reject(new Error("Babel Standalone loaded but transform function not found"));
71
+ }
72
+ };
73
+ script.onerror = () => {
74
+ reject(new Error(`Failed to load Babel Standalone from ${BABEL_STANDALONE_FALLBACK_CDN}`));
75
+ };
76
+ document.head.appendChild(script);
77
+ });
78
+ }
79
+ async function transpileJsx(source, filename = "component.jsx") {
80
+ const babel = await loadBabel();
81
+ const result = babel.transform(source, {
82
+ presets: ["react"],
83
+ filename
84
+ });
85
+ return result.code;
86
+ }
87
+
88
+ // libs/ui/src/renderer/react/index.ts
89
+ function isReactJsx(content) {
90
+ if (/^#{1,6}\s+\S/m.test(content)) return false;
91
+ return /(?:function|const|class)\s+\w+/.test(content) && /(?:return|=>)[\s(]*</.test(content);
92
+ }
93
+ function parseImports(source) {
94
+ const results = [];
95
+ const defaultRe = /^import\s+(\w+)\s+from\s+['"]([^'"]+)['"][\s;]*$/gm;
96
+ let m;
97
+ while ((m = defaultRe.exec(source)) !== null) {
98
+ results.push({ line: m[0], localName: m[1], specifier: m[2], named: false });
99
+ }
100
+ const namedRe = /^import\s+\{([^}]+)\}\s+from\s+['"]([^'"]+)['"][\s;]*$/gm;
101
+ while ((m = namedRe.exec(source)) !== null) {
102
+ const names = m[1].split(",").map((n) => n.trim()).filter(Boolean);
103
+ for (const name of names) {
104
+ results.push({ line: m[0], localName: name, specifier: m[2], named: true });
105
+ }
106
+ }
107
+ return results;
108
+ }
109
+ function stripImports(source) {
110
+ return source.replace(/^import\s+\w+\s+from\s+['"][^'"]+['"][\s;]*$/gm, "").replace(/^import\s+\{[^}]+\}\s+from\s+['"][^'"]+['"][\s;]*$/gm, "");
111
+ }
112
+ function rewriteExportDefault(source) {
113
+ let result = source.replace(/^export\s+default\s+(function|class)\b/gm, "var __default__ = $1");
114
+ result = result.replace(/^export\s+default\s+(\([^)]*\)\s*=>)/gm, "var __default__ = $1");
115
+ result = result.replace(/^export\s+default\s+(\w+)\s*;?\s*$/gm, "var __default__ = $1;");
116
+ return result;
117
+ }
118
+ function isReactSpecifier(specifier) {
119
+ return specifier === "react" || /^https?:\/\/esm\.sh\/react(?:@[\d.]+)?$/.test(specifier);
120
+ }
121
+ async function resolveModules(imports) {
122
+ const modules = {};
123
+ const specifierMap = /* @__PURE__ */ new Map();
124
+ for (const imp of imports) {
125
+ const existing = specifierMap.get(imp.specifier) ?? [];
126
+ existing.push(imp);
127
+ specifierMap.set(imp.specifier, existing);
128
+ }
129
+ for (const [specifier, specImports] of specifierMap) {
130
+ let mod;
131
+ if (isReactSpecifier(specifier)) {
132
+ mod = React;
133
+ } else {
134
+ mod = await runtimeImport(specifier);
135
+ }
136
+ for (const imp of specImports) {
137
+ if (imp.named) {
138
+ modules[imp.localName] = mod[imp.localName] ?? mod["default"]?.[imp.localName];
139
+ } else {
140
+ modules[imp.localName] = mod["default"] ?? mod;
141
+ }
142
+ }
143
+ }
144
+ return modules;
145
+ }
146
+ function ReactJsxView({ source, className }) {
147
+ const [Component, setComponent] = useState(null);
148
+ const [error, setError] = useState(null);
149
+ const [loading, setLoading] = useState(true);
150
+ useEffect(() => {
151
+ let cancelled = false;
152
+ async function transpileAndRender() {
153
+ try {
154
+ const imports = parseImports(source);
155
+ const modules = await resolveModules(imports);
156
+ let code = stripImports(source);
157
+ code = rewriteExportDefault(code);
158
+ code = await transpileJsx(code, "component.jsx");
159
+ code += "\nreturn __default__;";
160
+ const argNames = Object.keys(modules);
161
+ const argValues = argNames.map((n) => modules[n]);
162
+ const factory = new Function(...argNames, code);
163
+ const Comp = factory(...argValues);
164
+ if (!cancelled) {
165
+ setComponent(() => Comp);
166
+ setError(null);
167
+ setLoading(false);
168
+ }
169
+ } catch (err) {
170
+ if (!cancelled) {
171
+ setError(err instanceof Error ? err.message : String(err));
172
+ setComponent(null);
173
+ setLoading(false);
174
+ }
175
+ }
176
+ }
177
+ setLoading(true);
178
+ setError(null);
179
+ setComponent(null);
180
+ transpileAndRender();
181
+ return () => {
182
+ cancelled = true;
183
+ };
184
+ }, [source]);
185
+ if (loading) {
186
+ return React.createElement(Box, { className, sx: { p: 2, color: "text.secondary" } }, "Transpiling JSX...");
187
+ }
188
+ if (error) {
189
+ return React.createElement(
190
+ Box,
191
+ { className },
192
+ React.createElement(Alert, { severity: "error", sx: { mb: 1 } }, `JSX render error: ${error}`),
193
+ React.createElement(
194
+ "pre",
195
+ { style: { fontFamily: "monospace", whiteSpace: "pre-wrap", fontSize: "0.85em" } },
196
+ source
197
+ )
198
+ );
199
+ }
200
+ if (!Component) {
201
+ return React.createElement(
202
+ Box,
203
+ { className },
204
+ React.createElement(Alert, { severity: "warning" }, "No component exported. Use `export default MyComponent`.")
205
+ );
206
+ }
207
+ return React.createElement(Box, { className }, React.createElement(Component, {}));
208
+ }
209
+ var ReactJsxRenderer = class {
210
+ type = "jsx";
211
+ priority = 10;
212
+ canHandle(content) {
213
+ return isReactJsx(content);
214
+ }
215
+ render(content, options) {
216
+ return React.createElement(ReactJsxView, {
217
+ source: content,
218
+ className: options?.className ?? "fmcp-jsx-content"
219
+ });
220
+ }
221
+ };
222
+ var reactJsxRenderer = new ReactJsxRenderer();
223
+ export {
224
+ ReactJsxRenderer,
225
+ isReactJsx,
226
+ parseImports,
227
+ reactJsxRenderer,
228
+ rewriteExportDefault,
229
+ stripImports
230
+ };
@@ -0,0 +1,194 @@
1
+ // libs/ui/src/runtime/content-detector.ts
2
+ var JSX_PATTERNS = [
3
+ // JSX-specific syntax: self-closing tags with capitalized names
4
+ /<[A-Z][a-zA-Z0-9]*[\s/>]/,
5
+ // JSX expressions: {someVar} or {() => ...}
6
+ /\{[a-zA-Z_$][\w$.]*\}/,
7
+ // React hooks: useState, useEffect, etc.
8
+ /\buse[A-Z]\w+\s*\(/,
9
+ // Arrow function components or function declarations: const Foo = / function Foo(
10
+ /(?:const|let|var|function)\s+[A-Z]\w*\s*[=(]/,
11
+ // Import from react
12
+ /import\s[^\n]{1,200}from\s+['"]react['"]/,
13
+ // JSX pragma or import
14
+ /\/\*\*?\s*@jsx\b/,
15
+ // export default function/const (component pattern)
16
+ /export\s+default\s+function\s+[A-Z]/
17
+ ];
18
+ var MDX_PATTERNS = [
19
+ // MDX frontmatter
20
+ /^---\s*\n/,
21
+ // Markdown headings
22
+ /^#{1,6}\s+\S/m,
23
+ // MDX import statements followed by markdown
24
+ /^import\s[^\n]*\n+#/m,
25
+ // MDX export default (layout pattern)
26
+ /^export\s+default\s+/m,
27
+ // Markdown bullet lists
28
+ /^\s*[-*+]\s+\S/m,
29
+ // Markdown links
30
+ /\[[^\]]+\]\([^)]+\)/,
31
+ // Markdown code blocks
32
+ /^```\w*/m,
33
+ // Markdown emphasis
34
+ /(?:\*\*|__)(?:(?!\*\*|__).)+(?:\*\*|__)/
35
+ ];
36
+ var CHART_TYPE_RE = /"type"\s*:\s*"(?:bar|line|area|pie|scatter|radar|composed)"/;
37
+ var MERMAID_PATTERN = /^\s*(?:graph|sequenceDiagram|classDiagram|stateDiagram|flowchart|erDiagram|gantt|pie|journey|gitGraph)\b/;
38
+ function looksLikeChart(s) {
39
+ return s.charCodeAt(0) === 123 && CHART_TYPE_RE.test(s) && s.includes('"data"');
40
+ }
41
+ function looksLikeFlow(s) {
42
+ return s.charCodeAt(0) === 123 && s.includes('"nodes"') && s.includes('"edges"');
43
+ }
44
+ var MATH_PATTERNS = [
45
+ /\$\$(?:[^$]|\$(?!\$))+\$\$/s,
46
+ /\$[^$\n]+?\$/,
47
+ /\\\[(?:[^\\]|\\.)*\\\]/s,
48
+ /\\\((?:[^\\]|\\.)*\\\)/s,
49
+ /\\begin\{(?:equation|align|gather|matrix|pmatrix|bmatrix|cases)\}/
50
+ ];
51
+ var GEOJSON_TYPE_RE = /"type"\s*:\s*"(?:FeatureCollection|Feature|Point|LineString|Polygon|MultiPoint|MultiLineString|MultiPolygon|GeometryCollection)"/;
52
+ function looksLikeMap(s) {
53
+ return s.charCodeAt(0) === 123 && GEOJSON_TYPE_RE.test(s);
54
+ }
55
+ var IMAGE_PATTERNS = [
56
+ /^data:image\/(?:png|jpeg|jpg|gif|webp|svg\+xml)[;,]/,
57
+ /^https?:\/\/[^?#\s]+\.(?:png|jpe?g|gif|webp|svg|avif|ico)(?:\?[^#\s]*)?$/i
58
+ ];
59
+ var VIDEO_PATTERNS = [
60
+ /^https?:\/\/[^?#\s]+\.(?:mp4|webm|ogg|mov)(?:\?[^#\s]*)?$/i,
61
+ /^https?:\/\/(?:www\.)?(?:youtube\.com|youtu\.be|vimeo\.com)\//i,
62
+ /^data:video\//
63
+ ];
64
+ var AUDIO_PATTERNS = [
65
+ /^https?:\/\/[^?#\s]+\.(?:mp3|wav|ogg|aac|flac|m4a)(?:\?[^#\s]*)?$/i,
66
+ /^https?:\/\/(?:www\.)?soundcloud\.com\//i,
67
+ /^data:audio\//
68
+ ];
69
+ function detectContentType(content) {
70
+ if (!content || typeof content !== "string") {
71
+ return "html";
72
+ }
73
+ const trimmed = content.trim();
74
+ if (looksLikeChart(trimmed)) return "chart";
75
+ if (looksLikeFlow(trimmed)) return "flow";
76
+ if (looksLikeMap(trimmed)) return "map";
77
+ if (MERMAID_PATTERN.test(trimmed)) return "mermaid";
78
+ if (MATH_PATTERNS.some((p) => p.test(trimmed))) return "math";
79
+ if (IMAGE_PATTERNS.some((p) => p.test(trimmed))) return "image";
80
+ if (VIDEO_PATTERNS.some((p) => p.test(trimmed))) return "video";
81
+ if (AUDIO_PATTERNS.some((p) => p.test(trimmed))) return "audio";
82
+ const jsxScore = countMatches(trimmed, JSX_PATTERNS);
83
+ const mdxScore = countMatches(trimmed, MDX_PATTERNS);
84
+ if (jsxScore > 0 && jsxScore >= mdxScore) {
85
+ return "jsx";
86
+ }
87
+ if (mdxScore >= 2) {
88
+ return "mdx";
89
+ }
90
+ if (mdxScore === 1 && /^import\s+/m.test(trimmed)) {
91
+ return "mdx";
92
+ }
93
+ return "html";
94
+ }
95
+ function countMatches(content, patterns) {
96
+ let count = 0;
97
+ for (const pattern of patterns) {
98
+ if (pattern.test(content)) {
99
+ count++;
100
+ }
101
+ }
102
+ return count;
103
+ }
104
+
105
+ // libs/ui/src/runtime/babel-runtime.ts
106
+ var BABEL_STANDALONE_CDN = "https://esm.sh/@babel/standalone@7";
107
+ var BABEL_STANDALONE_FALLBACK_CDN = "https://cdnjs.cloudflare.com/ajax/libs/babel-standalone/7.26.10/babel.min.js";
108
+ var babelState = { status: "idle" };
109
+ async function loadBabel() {
110
+ if (babelState.status === "loaded") {
111
+ return babelState.babel;
112
+ }
113
+ if (babelState.status === "loading") {
114
+ return babelState.promise;
115
+ }
116
+ if (babelState.status === "error") {
117
+ throw babelState.error;
118
+ }
119
+ const promise = doLoadBabel();
120
+ babelState = { status: "loading", promise };
121
+ try {
122
+ const babel = await promise;
123
+ babelState = { status: "loaded", babel };
124
+ return babel;
125
+ } catch (error) {
126
+ const err = error instanceof Error ? error : new Error(String(error));
127
+ babelState = { status: "error", error: err };
128
+ throw err;
129
+ }
130
+ }
131
+ async function doLoadBabel() {
132
+ const globalBabel = globalThis["Babel"];
133
+ if (globalBabel && typeof globalBabel.transform === "function") {
134
+ return globalBabel;
135
+ }
136
+ try {
137
+ const module = await import(
138
+ /* @vite-ignore */
139
+ /* webpackIgnore: true */
140
+ BABEL_STANDALONE_CDN
141
+ );
142
+ if (module && typeof module.transform === "function") {
143
+ return module;
144
+ }
145
+ if (module.default && typeof module.default.transform === "function") {
146
+ return module.default;
147
+ }
148
+ } catch {
149
+ }
150
+ return new Promise((resolve, reject) => {
151
+ if (typeof document === "undefined") {
152
+ reject(new Error("Babel Standalone requires a browser environment"));
153
+ return;
154
+ }
155
+ const script = document.createElement("script");
156
+ script.src = BABEL_STANDALONE_FALLBACK_CDN;
157
+ script.crossOrigin = "anonymous";
158
+ script.onload = () => {
159
+ const babel = globalThis["Babel"];
160
+ if (babel && typeof babel.transform === "function") {
161
+ resolve(babel);
162
+ } else {
163
+ reject(new Error("Babel Standalone loaded but transform function not found"));
164
+ }
165
+ };
166
+ script.onerror = () => {
167
+ reject(new Error(`Failed to load Babel Standalone from ${BABEL_STANDALONE_FALLBACK_CDN}`));
168
+ };
169
+ document.head.appendChild(script);
170
+ });
171
+ }
172
+ async function transpileJsx(source, filename = "component.jsx") {
173
+ const babel = await loadBabel();
174
+ const result = babel.transform(source, {
175
+ presets: ["react"],
176
+ filename
177
+ });
178
+ return result.code;
179
+ }
180
+ function isBabelLoaded() {
181
+ return babelState.status === "loaded";
182
+ }
183
+ function resetBabelState() {
184
+ babelState = { status: "idle" };
185
+ }
186
+ export {
187
+ BABEL_STANDALONE_CDN,
188
+ BABEL_STANDALONE_FALLBACK_CDN,
189
+ detectContentType,
190
+ isBabelLoaded,
191
+ loadBabel,
192
+ resetBabelState,
193
+ transpileJsx
194
+ };
@@ -0,0 +1,93 @@
1
+ // libs/ui/src/theme/create-theme.ts
2
+ import { createTheme } from "@mui/material/styles";
3
+ var SYSTEM_FONT_STACK = [
4
+ "-apple-system",
5
+ "BlinkMacSystemFont",
6
+ '"Segoe UI"',
7
+ "Roboto",
8
+ '"Helvetica Neue"',
9
+ "Arial",
10
+ "sans-serif"
11
+ ].join(",");
12
+ var MONO_FONT_STACK = [
13
+ '"SF Mono"',
14
+ '"Fira Code"',
15
+ '"Fira Mono"',
16
+ "Menlo",
17
+ "Consolas",
18
+ '"DejaVu Sans Mono"',
19
+ "monospace"
20
+ ].join(",");
21
+ function createFrontMcpTheme(config) {
22
+ const mode = config?.mode ?? "light";
23
+ const palette = config?.palette;
24
+ const typography = config?.typography;
25
+ const shape = config?.shape;
26
+ return createTheme({
27
+ palette: {
28
+ mode,
29
+ primary: { main: palette?.primary ?? "#0969da" },
30
+ secondary: { main: palette?.secondary ?? "#8250df" },
31
+ success: { main: palette?.success ?? "#1a7f37" },
32
+ warning: { main: palette?.warning ?? "#bf8700" },
33
+ error: { main: palette?.error ?? "#cf222e" },
34
+ info: { main: palette?.info ?? "#0550ae" },
35
+ ...palette?.background ? { background: { default: palette.background, paper: palette.surface ?? palette.background } } : {},
36
+ ...palette?.text ? { text: { primary: palette.text } } : {}
37
+ },
38
+ typography: {
39
+ fontFamily: typography?.fontFamily ?? SYSTEM_FONT_STACK,
40
+ fontSize: typography?.fontSize ?? 14
41
+ },
42
+ shape: {
43
+ borderRadius: shape?.borderRadius ?? 8
44
+ },
45
+ components: {
46
+ MuiButtonBase: {
47
+ defaultProps: {
48
+ disableRipple: false
49
+ }
50
+ },
51
+ MuiButton: {
52
+ styleOverrides: {
53
+ root: {
54
+ textTransform: "none",
55
+ fontWeight: 500
56
+ }
57
+ }
58
+ }
59
+ }
60
+ });
61
+ }
62
+ var defaultTheme = createFrontMcpTheme();
63
+ var darkTheme = createFrontMcpTheme({ mode: "dark" });
64
+
65
+ // libs/ui/src/theme/FrontMcpThemeProvider.tsx
66
+ import { ThemeProvider } from "@mui/material/styles";
67
+ import CssBaseline from "@mui/material/CssBaseline";
68
+ import { jsx, jsxs } from "react/jsx-runtime";
69
+ function FrontMcpThemeProvider({
70
+ theme: themeConfig,
71
+ children
72
+ }) {
73
+ const muiTheme = themeConfig ? createFrontMcpTheme(themeConfig) : defaultTheme;
74
+ return /* @__PURE__ */ jsxs(ThemeProvider, { theme: muiTheme, children: [
75
+ /* @__PURE__ */ jsx(CssBaseline, {}),
76
+ children
77
+ ] });
78
+ }
79
+
80
+ // libs/ui/src/theme/use-theme.ts
81
+ import { useTheme as useMuiTheme } from "@mui/material/styles";
82
+ function useFrontMcpTheme() {
83
+ return useMuiTheme();
84
+ }
85
+ export {
86
+ FrontMcpThemeProvider,
87
+ MONO_FONT_STACK,
88
+ SYSTEM_FONT_STACK,
89
+ createFrontMcpTheme,
90
+ darkTheme,
91
+ defaultTheme,
92
+ useFrontMcpTheme
93
+ };
package/index.d.ts CHANGED
@@ -1,37 +1,29 @@
1
1
  /**
2
2
  * @frontmcp/ui
3
3
  *
4
- * UI component library for FrontMCP applications.
5
- * Provides HTML components, React components, and rendering utilities.
4
+ * MUI-based React component library for FrontMCP applications.
5
+ * Provides themed components, content renderers, and MCP bridge hooks.
6
6
  *
7
- * For build tools, bundling, platform adapters, and theming, use @frontmcp/uipack.
8
- *
9
- * @example HTML components
7
+ * @example Theme
10
8
  * ```typescript
11
- * import { button, card, alert, badge } from '@frontmcp/ui/components';
12
- * import { baseLayout } from '@frontmcp/ui/layouts';
9
+ * import { FrontMcpThemeProvider, createFrontMcpTheme } from '@frontmcp/ui/theme';
13
10
  * ```
14
11
  *
15
- * @example Theme (from uipack)
12
+ * @example Components
16
13
  * ```typescript
17
- * import { DEFAULT_THEME, createTheme } from '@frontmcp/uipack/theme';
14
+ * import { Button, Card, Alert } from '@frontmcp/ui/components';
18
15
  * ```
19
16
  *
20
- * @example React components
17
+ * @example React hooks
21
18
  * ```typescript
22
- * import { Button, Card, Alert, Badge } from '@frontmcp/ui/react';
23
- * import { useMcpBridge, useCallTool } from '@frontmcp/ui/react/hooks';
19
+ * import { useMcpBridge, useCallTool } from '@frontmcp/ui/react';
24
20
  * ```
25
21
  *
26
- * @example Universal renderer
22
+ * @example Renderer
27
23
  * ```typescript
28
- * import { UniversalApp, FrontMCPProvider } from '@frontmcp/ui/universal';
24
+ * import { renderContent, detectContentType } from '@frontmcp/ui/renderer';
29
25
  * ```
30
26
  */
31
- export * from './components';
32
- export * from './layouts';
33
27
  export { type PlatformAdapter, type AdapterCapabilities, type BridgeConfig, FrontMcpBridge, createBridge, AdapterRegistry, defaultRegistry, registerAdapter, generateBridgeIIFE, generatePlatformBundle, UNIVERSAL_BRIDGE_SCRIPT, BRIDGE_SCRIPT_TAGS, } from './bridge';
34
- export { registerAllComponents, registerFmcpButton, registerFmcpCard, registerFmcpAlert, registerFmcpBadge, registerFmcpInput, registerFmcpSelect, FmcpButton, FmcpCard, FmcpAlert, FmcpBadge, FmcpInput, FmcpSelect, FmcpElement, } from './web-components';
35
28
  export * from './react';
36
- export { ReactRenderer, reactRenderer, ReactRendererAdapter, createReactAdapter, loadReactAdapter } from './renderers';
37
29
  //# sourceMappingURL=index.d.ts.map
package/index.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAKH,cAAc,cAAc,CAAC;AAK7B,cAAc,WAAW,CAAC;AAK1B,OAAO,EAEL,KAAK,eAAe,EACpB,KAAK,mBAAmB,EACxB,KAAK,YAAY,EAEjB,cAAc,EACd,YAAY,EAEZ,eAAe,EACf,eAAe,EACf,eAAe,EAEf,kBAAkB,EAClB,sBAAsB,EACtB,uBAAuB,EACvB,kBAAkB,GACnB,MAAM,UAAU,CAAC;AAKlB,OAAO,EAEL,qBAAqB,EACrB,kBAAkB,EAClB,gBAAgB,EAChB,iBAAiB,EACjB,iBAAiB,EACjB,iBAAiB,EACjB,kBAAkB,EAElB,UAAU,EACV,QAAQ,EACR,SAAS,EACT,SAAS,EACT,SAAS,EACT,UAAU,EAEV,WAAW,GACZ,MAAM,kBAAkB,CAAC;AAK1B,cAAc,SAAS,CAAC;AAKxB,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAKH,OAAO,EAEL,KAAK,eAAe,EACpB,KAAK,mBAAmB,EACxB,KAAK,YAAY,EAEjB,cAAc,EACd,YAAY,EAEZ,eAAe,EACf,eAAe,EACf,eAAe,EAEf,kBAAkB,EAClB,sBAAsB,EACtB,uBAAuB,EACvB,kBAAkB,GACnB,MAAM,UAAU,CAAC;AAKlB,cAAc,SAAS,CAAC"}