@frontmcp/uipack 0.6.1 → 0.6.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 (315) hide show
  1. package/CLAUDE.md +88 -105
  2. package/README.md +1 -0
  3. package/adapters/index.d.ts +1 -1
  4. package/adapters/index.d.ts.map +1 -1
  5. package/adapters/index.js +35 -2
  6. package/adapters/platform-meta.d.ts +29 -0
  7. package/adapters/platform-meta.d.ts.map +1 -1
  8. package/base-template/default-base-template.d.ts +0 -1
  9. package/base-template/default-base-template.d.ts.map +1 -1
  10. package/base-template/index.js +32 -37
  11. package/build/builders/base-builder.d.ts +122 -0
  12. package/build/builders/base-builder.d.ts.map +1 -0
  13. package/build/builders/esbuild-config.d.ts +94 -0
  14. package/build/builders/esbuild-config.d.ts.map +1 -0
  15. package/build/builders/hybrid-builder.d.ts +93 -0
  16. package/build/builders/hybrid-builder.d.ts.map +1 -0
  17. package/build/builders/index.d.ts +17 -0
  18. package/build/builders/index.d.ts.map +1 -0
  19. package/build/builders/inline-builder.d.ts +83 -0
  20. package/build/builders/inline-builder.d.ts.map +1 -0
  21. package/build/builders/static-builder.d.ts +78 -0
  22. package/build/builders/static-builder.d.ts.map +1 -0
  23. package/build/builders/types.d.ts +341 -0
  24. package/build/builders/types.d.ts.map +1 -0
  25. package/build/cdn-resources.d.ts +3 -2
  26. package/build/cdn-resources.d.ts.map +1 -1
  27. package/build/hybrid-data.d.ts +127 -0
  28. package/build/hybrid-data.d.ts.map +1 -0
  29. package/build/index.d.ts +4 -0
  30. package/build/index.d.ts.map +1 -1
  31. package/build/index.js +1885 -171
  32. package/build/ui-components-browser.d.ts +64 -0
  33. package/build/ui-components-browser.d.ts.map +1 -0
  34. package/build/widget-manifest.d.ts.map +1 -1
  35. package/bundler/file-cache/component-builder.d.ts.map +1 -1
  36. package/bundler/file-cache/storage/redis.d.ts.map +1 -1
  37. package/bundler/index.js +6 -4
  38. package/dependency/cdn-registry.d.ts +1 -1
  39. package/dependency/cdn-registry.d.ts.map +1 -1
  40. package/dependency/import-map.d.ts.map +1 -1
  41. package/dependency/index.js +93 -121
  42. package/dependency/resolver.d.ts.map +1 -1
  43. package/esm/adapters/{index.js → index.mjs} +34 -2
  44. package/esm/base-template/{index.js → index.mjs} +32 -37
  45. package/esm/build/{index.js → index.mjs} +1855 -170
  46. package/esm/bundler/{index.js → index.mjs} +6 -4
  47. package/esm/dependency/{index.js → index.mjs} +93 -121
  48. package/esm/handlebars/{index.js → index.mjs} +0 -1
  49. package/esm/{index.js → index.mjs} +2516 -830
  50. package/esm/package.json +7 -6
  51. package/esm/registry/{index.js → index.mjs} +196 -264
  52. package/esm/renderers/{index.js → index.mjs} +106 -200
  53. package/esm/runtime/{index.js → index.mjs} +44 -35
  54. package/esm/styles/{index.js → index.mjs} +6 -6
  55. package/esm/theme/{index.js → index.mjs} +90 -42
  56. package/esm/tool-template/{index.js → index.mjs} +35 -28
  57. package/esm/typings/{index.js → index.mjs} +157 -1
  58. package/esm/utils/{index.js → index.mjs} +24 -0
  59. package/esm/validation/{index.js → index.mjs} +0 -1
  60. package/handlebars/expression-extractor.d.ts.map +1 -1
  61. package/handlebars/index.d.ts.map +1 -1
  62. package/handlebars/index.js +0 -1
  63. package/index.d.ts +2 -1
  64. package/index.d.ts.map +1 -1
  65. package/index.js +2545 -835
  66. package/package.json +7 -6
  67. package/preview/claude-preview.d.ts +67 -0
  68. package/preview/claude-preview.d.ts.map +1 -0
  69. package/preview/generic-preview.d.ts +67 -0
  70. package/preview/generic-preview.d.ts.map +1 -0
  71. package/preview/index.d.ts +36 -0
  72. package/preview/index.d.ts.map +1 -0
  73. package/preview/openai-preview.d.ts +70 -0
  74. package/preview/openai-preview.d.ts.map +1 -0
  75. package/preview/types.d.ts +185 -0
  76. package/preview/types.d.ts.map +1 -0
  77. package/registry/index.js +196 -264
  78. package/registry/render-template.d.ts.map +1 -1
  79. package/renderers/index.d.ts +2 -2
  80. package/renderers/index.d.ts.map +1 -1
  81. package/renderers/index.js +110 -204
  82. package/renderers/mdx-client.renderer.d.ts +124 -0
  83. package/renderers/mdx-client.renderer.d.ts.map +1 -0
  84. package/renderers/registry.d.ts +2 -2
  85. package/renderers/registry.d.ts.map +1 -1
  86. package/renderers/types.d.ts +3 -2
  87. package/renderers/types.d.ts.map +1 -1
  88. package/renderers/utils/transpiler.d.ts +8 -27
  89. package/renderers/utils/transpiler.d.ts.map +1 -1
  90. package/runtime/index.js +44 -35
  91. package/runtime/mcp-bridge.d.ts.map +1 -1
  92. package/runtime/renderer-runtime.d.ts.map +1 -1
  93. package/runtime/wrapper.d.ts.map +1 -1
  94. package/styles/index.js +6 -6
  95. package/styles/variants.d.ts +1 -1
  96. package/styles/variants.d.ts.map +1 -1
  97. package/theme/cdn.d.ts.map +1 -1
  98. package/theme/css-to-theme.d.ts +91 -0
  99. package/theme/css-to-theme.d.ts.map +1 -0
  100. package/theme/index.d.ts +2 -1
  101. package/theme/index.d.ts.map +1 -1
  102. package/theme/index.js +92 -43
  103. package/theme/platforms.d.ts +1 -6
  104. package/theme/platforms.d.ts.map +1 -1
  105. package/theme/theme.d.ts.map +1 -1
  106. package/tool-template/builder.d.ts.map +1 -1
  107. package/tool-template/index.js +35 -28
  108. package/typings/index.d.ts +4 -4
  109. package/typings/index.d.ts.map +1 -1
  110. package/typings/index.js +162 -1
  111. package/typings/schemas.d.ts +30 -0
  112. package/typings/schemas.d.ts.map +1 -1
  113. package/typings/type-fetcher.d.ts +74 -1
  114. package/typings/type-fetcher.d.ts.map +1 -1
  115. package/typings/types.d.ts +72 -1
  116. package/typings/types.d.ts.map +1 -1
  117. package/utils/escape-html.d.ts +44 -0
  118. package/utils/escape-html.d.ts.map +1 -1
  119. package/utils/index.d.ts +1 -1
  120. package/utils/index.d.ts.map +1 -1
  121. package/utils/index.js +26 -0
  122. package/validation/index.js +0 -1
  123. package/validation/template-validator.d.ts.map +1 -1
  124. package/esm/adapters/index.d.ts +0 -13
  125. package/esm/adapters/index.d.ts.map +0 -1
  126. package/esm/adapters/platform-meta.d.ts +0 -166
  127. package/esm/adapters/platform-meta.d.ts.map +0 -1
  128. package/esm/adapters/response-builder.d.ts +0 -108
  129. package/esm/adapters/response-builder.d.ts.map +0 -1
  130. package/esm/adapters/serving-mode.d.ts +0 -107
  131. package/esm/adapters/serving-mode.d.ts.map +0 -1
  132. package/esm/base-template/bridge.d.ts +0 -90
  133. package/esm/base-template/bridge.d.ts.map +0 -1
  134. package/esm/base-template/default-base-template.d.ts +0 -92
  135. package/esm/base-template/default-base-template.d.ts.map +0 -1
  136. package/esm/base-template/index.d.ts +0 -15
  137. package/esm/base-template/index.d.ts.map +0 -1
  138. package/esm/base-template/polyfills.d.ts +0 -31
  139. package/esm/base-template/polyfills.d.ts.map +0 -1
  140. package/esm/base-template/theme-styles.d.ts +0 -74
  141. package/esm/base-template/theme-styles.d.ts.map +0 -1
  142. package/esm/bridge-runtime/iife-generator.d.ts +0 -62
  143. package/esm/bridge-runtime/iife-generator.d.ts.map +0 -1
  144. package/esm/bridge-runtime/index.d.ts +0 -10
  145. package/esm/bridge-runtime/index.d.ts.map +0 -1
  146. package/esm/build/cdn-resources.d.ts +0 -243
  147. package/esm/build/cdn-resources.d.ts.map +0 -1
  148. package/esm/build/index.d.ts +0 -295
  149. package/esm/build/index.d.ts.map +0 -1
  150. package/esm/build/widget-manifest.d.ts +0 -362
  151. package/esm/build/widget-manifest.d.ts.map +0 -1
  152. package/esm/bundler/cache.d.ts +0 -173
  153. package/esm/bundler/cache.d.ts.map +0 -1
  154. package/esm/bundler/file-cache/component-builder.d.ts +0 -167
  155. package/esm/bundler/file-cache/component-builder.d.ts.map +0 -1
  156. package/esm/bundler/file-cache/hash-calculator.d.ts +0 -155
  157. package/esm/bundler/file-cache/hash-calculator.d.ts.map +0 -1
  158. package/esm/bundler/file-cache/index.d.ts +0 -12
  159. package/esm/bundler/file-cache/index.d.ts.map +0 -1
  160. package/esm/bundler/file-cache/storage/filesystem.d.ts +0 -149
  161. package/esm/bundler/file-cache/storage/filesystem.d.ts.map +0 -1
  162. package/esm/bundler/file-cache/storage/index.d.ts +0 -11
  163. package/esm/bundler/file-cache/storage/index.d.ts.map +0 -1
  164. package/esm/bundler/file-cache/storage/interface.d.ts +0 -152
  165. package/esm/bundler/file-cache/storage/interface.d.ts.map +0 -1
  166. package/esm/bundler/file-cache/storage/redis.d.ts +0 -139
  167. package/esm/bundler/file-cache/storage/redis.d.ts.map +0 -1
  168. package/esm/bundler/index.d.ts +0 -35
  169. package/esm/bundler/index.d.ts.map +0 -1
  170. package/esm/bundler/sandbox/enclave-adapter.d.ts +0 -121
  171. package/esm/bundler/sandbox/enclave-adapter.d.ts.map +0 -1
  172. package/esm/bundler/sandbox/executor.d.ts +0 -14
  173. package/esm/bundler/sandbox/executor.d.ts.map +0 -1
  174. package/esm/bundler/sandbox/policy.d.ts +0 -62
  175. package/esm/bundler/sandbox/policy.d.ts.map +0 -1
  176. package/esm/bundler/types.d.ts +0 -702
  177. package/esm/bundler/types.d.ts.map +0 -1
  178. package/esm/dependency/cdn-registry.d.ts +0 -98
  179. package/esm/dependency/cdn-registry.d.ts.map +0 -1
  180. package/esm/dependency/import-map.d.ts +0 -186
  181. package/esm/dependency/import-map.d.ts.map +0 -1
  182. package/esm/dependency/import-parser.d.ts +0 -82
  183. package/esm/dependency/import-parser.d.ts.map +0 -1
  184. package/esm/dependency/index.d.ts +0 -17
  185. package/esm/dependency/index.d.ts.map +0 -1
  186. package/esm/dependency/resolver.d.ts +0 -164
  187. package/esm/dependency/resolver.d.ts.map +0 -1
  188. package/esm/dependency/schemas.d.ts +0 -486
  189. package/esm/dependency/schemas.d.ts.map +0 -1
  190. package/esm/dependency/template-loader.d.ts +0 -204
  191. package/esm/dependency/template-loader.d.ts.map +0 -1
  192. package/esm/dependency/template-processor.d.ts +0 -118
  193. package/esm/dependency/template-processor.d.ts.map +0 -1
  194. package/esm/dependency/types.d.ts +0 -739
  195. package/esm/dependency/types.d.ts.map +0 -1
  196. package/esm/handlebars/expression-extractor.d.ts +0 -147
  197. package/esm/handlebars/expression-extractor.d.ts.map +0 -1
  198. package/esm/handlebars/helpers.d.ts +0 -339
  199. package/esm/handlebars/helpers.d.ts.map +0 -1
  200. package/esm/handlebars/index.d.ts +0 -195
  201. package/esm/handlebars/index.d.ts.map +0 -1
  202. package/esm/index.d.ts +0 -50
  203. package/esm/index.d.ts.map +0 -1
  204. package/esm/registry/index.d.ts +0 -46
  205. package/esm/registry/index.d.ts.map +0 -1
  206. package/esm/registry/render-template.d.ts +0 -91
  207. package/esm/registry/render-template.d.ts.map +0 -1
  208. package/esm/registry/tool-ui.registry.d.ts +0 -294
  209. package/esm/registry/tool-ui.registry.d.ts.map +0 -1
  210. package/esm/registry/uri-utils.d.ts +0 -56
  211. package/esm/registry/uri-utils.d.ts.map +0 -1
  212. package/esm/renderers/cache.d.ts +0 -145
  213. package/esm/renderers/cache.d.ts.map +0 -1
  214. package/esm/renderers/html.renderer.d.ts +0 -123
  215. package/esm/renderers/html.renderer.d.ts.map +0 -1
  216. package/esm/renderers/index.d.ts +0 -36
  217. package/esm/renderers/index.d.ts.map +0 -1
  218. package/esm/renderers/mdx.renderer.d.ts +0 -120
  219. package/esm/renderers/mdx.renderer.d.ts.map +0 -1
  220. package/esm/renderers/registry.d.ts +0 -133
  221. package/esm/renderers/registry.d.ts.map +0 -1
  222. package/esm/renderers/types.d.ts +0 -342
  223. package/esm/renderers/types.d.ts.map +0 -1
  224. package/esm/renderers/utils/detect.d.ts +0 -107
  225. package/esm/renderers/utils/detect.d.ts.map +0 -1
  226. package/esm/renderers/utils/hash.d.ts +0 -40
  227. package/esm/renderers/utils/hash.d.ts.map +0 -1
  228. package/esm/renderers/utils/index.d.ts +0 -9
  229. package/esm/renderers/utils/index.d.ts.map +0 -1
  230. package/esm/renderers/utils/transpiler.d.ts +0 -89
  231. package/esm/renderers/utils/transpiler.d.ts.map +0 -1
  232. package/esm/runtime/adapters/html.adapter.d.ts +0 -59
  233. package/esm/runtime/adapters/html.adapter.d.ts.map +0 -1
  234. package/esm/runtime/adapters/index.d.ts +0 -26
  235. package/esm/runtime/adapters/index.d.ts.map +0 -1
  236. package/esm/runtime/adapters/mdx.adapter.d.ts +0 -73
  237. package/esm/runtime/adapters/mdx.adapter.d.ts.map +0 -1
  238. package/esm/runtime/adapters/types.d.ts +0 -95
  239. package/esm/runtime/adapters/types.d.ts.map +0 -1
  240. package/esm/runtime/csp.d.ts +0 -48
  241. package/esm/runtime/csp.d.ts.map +0 -1
  242. package/esm/runtime/index.d.ts +0 -17
  243. package/esm/runtime/index.d.ts.map +0 -1
  244. package/esm/runtime/mcp-bridge.d.ts +0 -101
  245. package/esm/runtime/mcp-bridge.d.ts.map +0 -1
  246. package/esm/runtime/renderer-runtime.d.ts +0 -133
  247. package/esm/runtime/renderer-runtime.d.ts.map +0 -1
  248. package/esm/runtime/sanitizer.d.ts +0 -172
  249. package/esm/runtime/sanitizer.d.ts.map +0 -1
  250. package/esm/runtime/types.d.ts +0 -415
  251. package/esm/runtime/types.d.ts.map +0 -1
  252. package/esm/runtime/wrapper.d.ts +0 -421
  253. package/esm/runtime/wrapper.d.ts.map +0 -1
  254. package/esm/styles/index.d.ts +0 -8
  255. package/esm/styles/index.d.ts.map +0 -1
  256. package/esm/styles/variants.d.ts +0 -51
  257. package/esm/styles/variants.d.ts.map +0 -1
  258. package/esm/theme/cdn.d.ts +0 -195
  259. package/esm/theme/cdn.d.ts.map +0 -1
  260. package/esm/theme/index.d.ts +0 -18
  261. package/esm/theme/index.d.ts.map +0 -1
  262. package/esm/theme/platforms.d.ts +0 -107
  263. package/esm/theme/platforms.d.ts.map +0 -1
  264. package/esm/theme/presets/github-openai.d.ts +0 -50
  265. package/esm/theme/presets/github-openai.d.ts.map +0 -1
  266. package/esm/theme/presets/index.d.ts +0 -11
  267. package/esm/theme/presets/index.d.ts.map +0 -1
  268. package/esm/theme/theme.d.ts +0 -396
  269. package/esm/theme/theme.d.ts.map +0 -1
  270. package/esm/tool-template/builder.d.ts +0 -213
  271. package/esm/tool-template/builder.d.ts.map +0 -1
  272. package/esm/tool-template/index.d.ts +0 -16
  273. package/esm/tool-template/index.d.ts.map +0 -1
  274. package/esm/types/index.d.ts +0 -14
  275. package/esm/types/index.d.ts.map +0 -1
  276. package/esm/types/ui-config.d.ts +0 -641
  277. package/esm/types/ui-config.d.ts.map +0 -1
  278. package/esm/types/ui-runtime.d.ts +0 -1008
  279. package/esm/types/ui-runtime.d.ts.map +0 -1
  280. package/esm/typings/cache/cache-adapter.d.ts +0 -125
  281. package/esm/typings/cache/cache-adapter.d.ts.map +0 -1
  282. package/esm/typings/cache/index.d.ts +0 -10
  283. package/esm/typings/cache/index.d.ts.map +0 -1
  284. package/esm/typings/cache/memory-cache.d.ts +0 -92
  285. package/esm/typings/cache/memory-cache.d.ts.map +0 -1
  286. package/esm/typings/dts-parser.d.ts +0 -90
  287. package/esm/typings/dts-parser.d.ts.map +0 -1
  288. package/esm/typings/index.d.ts +0 -48
  289. package/esm/typings/index.d.ts.map +0 -1
  290. package/esm/typings/schemas.d.ts +0 -232
  291. package/esm/typings/schemas.d.ts.map +0 -1
  292. package/esm/typings/type-fetcher.d.ts +0 -89
  293. package/esm/typings/type-fetcher.d.ts.map +0 -1
  294. package/esm/typings/types.d.ts +0 -320
  295. package/esm/typings/types.d.ts.map +0 -1
  296. package/esm/utils/escape-html.d.ts +0 -58
  297. package/esm/utils/escape-html.d.ts.map +0 -1
  298. package/esm/utils/index.d.ts +0 -10
  299. package/esm/utils/index.d.ts.map +0 -1
  300. package/esm/utils/safe-stringify.d.ts +0 -30
  301. package/esm/utils/safe-stringify.d.ts.map +0 -1
  302. package/esm/validation/error-box.d.ts +0 -56
  303. package/esm/validation/error-box.d.ts.map +0 -1
  304. package/esm/validation/index.d.ts +0 -13
  305. package/esm/validation/index.d.ts.map +0 -1
  306. package/esm/validation/schema-paths.d.ts +0 -118
  307. package/esm/validation/schema-paths.d.ts.map +0 -1
  308. package/esm/validation/template-validator.d.ts +0 -143
  309. package/esm/validation/template-validator.d.ts.map +0 -1
  310. package/esm/validation/wrapper.d.ts +0 -97
  311. package/esm/validation/wrapper.d.ts.map +0 -1
  312. package/renderers/mdx.renderer.d.ts +0 -120
  313. package/renderers/mdx.renderer.d.ts.map +0 -1
  314. /package/esm/bridge-runtime/{index.js → index.mjs} +0 -0
  315. /package/esm/types/{index.js → index.mjs} +0 -0
package/CLAUDE.md CHANGED
@@ -2,17 +2,17 @@
2
2
 
3
3
  ## Overview
4
4
 
5
- `@frontmcp/uipack` provides **bundling, build tools, HTML components, and platform adapters** for MCP UI development - all without requiring React.
5
+ `@frontmcp/uipack` provides **bundling, build tools, platform adapters, and theming** for MCP UI development - all without requiring React.
6
6
 
7
7
  This is the React-free core package. For React components and hooks, use `@frontmcp/ui`.
8
8
 
9
9
  **Key Principles:**
10
10
 
11
11
  - Zero React dependency
12
- - Pure HTML string generation
13
- - Zod schema validation for all component inputs
14
12
  - Platform-aware theming and CDN configuration
15
- - HTMX support for dynamic interactions
13
+ - Build tools for Tool UI generation
14
+ - esbuild/SWC bundling utilities
15
+ - Zod schema validation
16
16
 
17
17
  ## Architecture
18
18
 
@@ -20,17 +20,15 @@ This is the React-free core package. For React components and hooks, use `@front
20
20
  libs/uipack/src/
21
21
  ├── adapters/ # Platform adapters (OpenAI, Claude, etc.)
22
22
  ├── base-template/ # Default HTML wrappers with polyfills
23
- ├── bridge/ # Multi-platform MCP bridge
23
+ ├── bridge-runtime/ # MCP bridge runtime generation
24
24
  ├── build/ # Build-time API (buildToolUI, etc.)
25
- ├── bundler/ # esbuild/SWC bundling
26
- ├── components/ # HTML string components (button, card, etc.)
25
+ ├── bundler/ # esbuild/SWC bundling, caching, sandbox
27
26
  ├── dependency/ # CDN resolution and import maps
28
27
  ├── handlebars/ # Handlebars template engine
29
- ├── layouts/ # Page layout templates
30
- ├── pages/ # Pre-built pages (consent, error)
28
+ ├── preview/ # Preview server utilities
31
29
  ├── registry/ # Tool UI registry
32
- ├── renderers/ # HTML/MDX renderers
33
- ├── runtime/ # Runtime utilities (template helpers)
30
+ ├── renderers/ # HTML/MDX client renderers
31
+ ├── runtime/ # Runtime utilities (wrapper, sanitizer, CSP)
34
32
  ├── styles/ # Style variant definitions
35
33
  ├── theme/ # Theme system and CDN config
36
34
  ├── tool-template/ # Tool template utilities
@@ -38,103 +36,52 @@ libs/uipack/src/
38
36
  ├── typings/ # .d.ts type fetching
39
37
  ├── utils/ # Utilities (escapeHtml, safeStringify)
40
38
  ├── validation/ # Zod validation utilities
41
- ├── web-components/ # Custom HTML elements
42
- ├── widgets/ # OpenAI widget utilities
43
39
  └── index.ts # Main barrel exports
44
40
  ```
45
41
 
46
42
  ## Package Split
47
43
 
48
- | Package | Purpose | React Required |
49
- | ------------------ | --------------------------------------------------------- | -------------- |
50
- | `@frontmcp/uipack` | Bundling, build tools, HTML components, platform adapters | No |
51
- | `@frontmcp/ui` | React components, hooks, SSR rendering | Yes |
44
+ | Package | Purpose | React Required |
45
+ | ------------------ | ------------------------------------------------------- | -------------- |
46
+ | `@frontmcp/uipack` | Bundling, build tools, platform adapters, theme | No |
47
+ | `@frontmcp/ui` | React components, hooks, SSR rendering, HTML components | Yes |
52
48
 
53
49
  ## Entry Points
54
50
 
55
- | Path | Purpose |
56
- | --------------------------------- | ------------------------------------- |
57
- | `@frontmcp/uipack` | Main exports |
58
- | `@frontmcp/uipack/adapters` | Platform adapters and meta builders |
59
- | `@frontmcp/uipack/base-template` | Default HTML templates with polyfills |
60
- | `@frontmcp/uipack/bridge` | MCP bridge for multiple platforms |
61
- | `@frontmcp/uipack/build` | Build-time API |
62
- | `@frontmcp/uipack/bundler` | esbuild/SWC bundling |
63
- | `@frontmcp/uipack/components` | HTML string components |
64
- | `@frontmcp/uipack/dependency` | CDN resolution |
65
- | `@frontmcp/uipack/handlebars` | Handlebars integration |
66
- | `@frontmcp/uipack/layouts` | Page layouts |
67
- | `@frontmcp/uipack/pages` | Pre-built pages |
68
- | `@frontmcp/uipack/registry` | Tool UI registry |
69
- | `@frontmcp/uipack/renderers` | HTML/MDX renderers |
70
- | `@frontmcp/uipack/runtime` | Runtime utilities |
71
- | `@frontmcp/uipack/styles` | Style variants |
72
- | `@frontmcp/uipack/theme` | Theme system |
73
- | `@frontmcp/uipack/types` | Type definitions |
74
- | `@frontmcp/uipack/utils` | Utilities |
75
- | `@frontmcp/uipack/validation` | Zod validation |
76
- | `@frontmcp/uipack/web-components` | Custom elements |
77
- | `@frontmcp/uipack/widgets` | OpenAI widgets |
78
-
79
- ## Component Development
80
-
81
- ### 1. Create Schema First
82
-
83
- Every component must have a Zod schema with `.strict()` mode:
51
+ | Path | Purpose |
52
+ | -------------------------------- | ------------------------------------- |
53
+ | `@frontmcp/uipack` | Main exports |
54
+ | `@frontmcp/uipack/adapters` | Platform adapters and meta builders |
55
+ | `@frontmcp/uipack/base-template` | Default HTML templates with polyfills |
56
+ | `@frontmcp/uipack/build` | Build-time API (buildToolUI) |
57
+ | `@frontmcp/uipack/bundler` | esbuild/SWC bundling, cache, sandbox |
58
+ | `@frontmcp/uipack/dependency` | CDN resolution and import maps |
59
+ | `@frontmcp/uipack/handlebars` | Handlebars integration |
60
+ | `@frontmcp/uipack/preview` | Preview server utilities |
61
+ | `@frontmcp/uipack/registry` | Tool UI registry |
62
+ | `@frontmcp/uipack/renderers` | HTML/MDX client renderers |
63
+ | `@frontmcp/uipack/runtime` | Runtime utilities (wrapper, CSP) |
64
+ | `@frontmcp/uipack/styles` | Style variants |
65
+ | `@frontmcp/uipack/theme` | Theme system and platform config |
66
+ | `@frontmcp/uipack/types` | Type definitions |
67
+ | `@frontmcp/uipack/typings` | TypeScript definition fetching |
68
+ | `@frontmcp/uipack/utils` | Utilities |
69
+ | `@frontmcp/uipack/validation` | Zod validation |
84
70
 
85
- ```typescript
86
- // component.schema.ts
87
- import { z } from 'zod';
88
-
89
- export const ComponentOptionsSchema = z
90
- .object({
91
- variant: z.enum(['primary', 'secondary']).optional(),
92
- size: z.enum(['sm', 'md', 'lg']).optional(),
93
- disabled: z.boolean().optional(),
94
- className: z.string().optional(),
95
- htmx: z
96
- .object({
97
- get: z.string().optional(),
98
- post: z.string().optional(),
99
- target: z.string().optional(),
100
- swap: z.string().optional(),
101
- })
102
- .strict()
103
- .optional(),
104
- })
105
- .strict(); // IMPORTANT: Reject unknown properties
106
-
107
- export type ComponentOptions = z.infer<typeof ComponentOptionsSchema>;
108
- ```
109
-
110
- ### 2. Validate Inputs in Component
71
+ ## Build API
111
72
 
112
73
  ```typescript
113
- // component.ts
114
- import { validateOptions } from '../validation';
115
- import { ComponentOptionsSchema, type ComponentOptions } from './component.schema';
116
-
117
- export function component(content: string, options: ComponentOptions = {}): string {
118
- const validation = validateOptions<ComponentOptions>(options, {
119
- schema: ComponentOptionsSchema,
120
- componentName: 'component',
121
- });
122
-
123
- if (!validation.success) {
124
- return validation.error; // Returns styled error box HTML
125
- }
126
-
127
- const { variant = 'primary', size = 'md' } = validation.data;
128
- return `<div class="...">${escapeHtml(content)}</div>`;
129
- }
130
- ```
131
-
132
- ### 3. Always Escape User Content
74
+ import { buildToolUI, getOutputModeForClient } from '@frontmcp/uipack/build';
133
75
 
134
- ```typescript
135
- import { escapeHtml } from '../utils';
76
+ // Build tool UI HTML
77
+ const html = await buildToolUI({
78
+ template: '<div>{{output.data}}</div>',
79
+ context: { input: {}, output: { data: 'Hello' } },
80
+ platform: 'openai',
81
+ });
136
82
 
137
- const html = `<div title="${escapeHtml(title)}">${escapeHtml(content)}</div>`;
83
+ // Get output mode for client
84
+ const mode = getOutputModeForClient('openai');
138
85
  ```
139
86
 
140
87
  ## Theme System
@@ -190,20 +137,56 @@ const scripts = buildCdnScriptsFromTheme(DEFAULT_THEME, { inline: false });
190
137
  const inlineScripts = buildCdnScriptsFromTheme(DEFAULT_THEME, { inline: true });
191
138
  ```
192
139
 
193
- ## Build API
140
+ ## Renderers
141
+
142
+ ### HTML Renderer
194
143
 
195
144
  ```typescript
196
- import { buildToolUI, getOutputModeForClient } from '@frontmcp/uipack/build';
145
+ import { htmlRenderer, HtmlRenderer } from '@frontmcp/uipack/renderers';
197
146
 
198
- // Build tool UI HTML
199
- const html = await buildToolUI({
200
- template: '<div>{{output.data}}</div>',
201
- context: { input: {}, output: { data: 'Hello' } },
202
- platform: 'openai',
147
+ // Render HTML template
148
+ const html = await htmlRenderer.render(template, context);
149
+ ```
150
+
151
+ ### MDX Client Renderer (CDN-based)
152
+
153
+ ```typescript
154
+ import { mdxClientRenderer, MdxClientRenderer } from '@frontmcp/uipack/renderers';
155
+
156
+ // Render MDX using CDN-based React (no bundled React)
157
+ const html = await mdxClientRenderer.render(mdxContent, context);
158
+ ```
159
+
160
+ > **Note:** For server-side MDX rendering with bundled React, use `@frontmcp/ui/renderers`.
161
+
162
+ ## Bundler Utilities
163
+
164
+ ```typescript
165
+ import { BundlerCache, hashContent, createCacheKey, validateSource, executeCode } from '@frontmcp/uipack/bundler';
166
+
167
+ // Create cache for bundled results
168
+ const cache = new BundlerCache({ maxSize: 100, ttl: 60000 });
169
+
170
+ // Hash content for cache keys
171
+ const hash = hashContent(sourceCode);
172
+
173
+ // Validate source code security
174
+ const violations = validateSource(code, policy);
175
+ ```
176
+
177
+ ## Validation
178
+
179
+ ```typescript
180
+ import { validateOptions, createErrorBox } from '@frontmcp/uipack/validation';
181
+
182
+ const result = validateOptions(options, {
183
+ schema: MySchema,
184
+ componentName: 'MyComponent',
203
185
  });
204
186
 
205
- // Get output mode for client
206
- const mode = getOutputModeForClient('openai');
187
+ if (!result.success) {
188
+ return result.error; // HTML error box
189
+ }
207
190
  ```
208
191
 
209
192
  ## Testing Requirements
@@ -241,6 +224,6 @@ Note: No React dependency!
241
224
 
242
225
  ## Related Packages
243
226
 
244
- - **@frontmcp/ui** - React components, hooks, SSR rendering
227
+ - **@frontmcp/ui** - React components, hooks, SSR rendering, HTML components
245
228
  - **@frontmcp/sdk** - Core FrontMCP SDK
246
229
  - **@frontmcp/testing** - E2E testing utilities
package/README.md CHANGED
@@ -23,6 +23,7 @@ yarn add @frontmcp/uipack
23
23
 
24
24
  - **Theme system** – Configure Tailwind-style palettes, fonts, and CDN assets, then inline or externalize scripts per platform.
25
25
  - **Build API** – Compile tool templates with esbuild/SWC, emit static widgets, and ship cached manifests for serverless environments.
26
+ - **Build modes** – Choose static, dynamic, or hybrid rendering plus multi-platform bundler helpers so the same widget rehydrates on OpenAI, Claude, and Gemini.
26
27
  - **Runtime helpers** – Wrap HTML/React/MDX templates with CSP, sanitize user content, and expose MCP Bridge metadata.
27
28
  - **Platform adapters** – Generate OpenAI/Claude/Gemini discovery metadata, resolve serving modes, and understand host capabilities.
28
29
  - **Validation** – Extract schema paths, validate Handlebars templates, and render error boxes before code hits production.
@@ -7,7 +7,7 @@
7
7
  *
8
8
  * @packageDocumentation
9
9
  */
10
- export { type AIPlatformType, type UIMetadata, type BuildUIMetaOptions, type BuildToolDiscoveryMetaOptions, buildUIMeta, buildToolDiscoveryMeta, buildOpenAICSP, } from './platform-meta';
10
+ export { type AIPlatformType, type UIMetadata, type BuildUIMetaOptions, type BuildToolDiscoveryMetaOptions, buildUIMeta, buildToolDiscoveryMeta, buildOpenAICSP, buildFrontMCPCSP, } from './platform-meta';
11
11
  export { type ResolvedServingMode, type ResolveServingModeOptions, resolveServingMode, isPlatformModeSupported, getDefaultServingMode, platformUsesStructuredContent, platformSupportsWidgets, } from './serving-mode';
12
12
  export { type TextContentBlock, type BuildToolResponseOptions, type ToolResponseContent, buildToolResponseContent, } from './response-builder';
13
13
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAEL,KAAK,cAAc,EAEnB,KAAK,UAAU,EACf,KAAK,kBAAkB,EACvB,KAAK,6BAA6B,EAElC,WAAW,EACX,sBAAsB,EACtB,cAAc,GACf,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAEL,KAAK,mBAAmB,EACxB,KAAK,yBAAyB,EAE9B,kBAAkB,EAClB,uBAAuB,EACvB,qBAAqB,EACrB,6BAA6B,EAC7B,uBAAuB,GACxB,MAAM,gBAAgB,CAAC;AAExB,OAAO,EAEL,KAAK,gBAAgB,EACrB,KAAK,wBAAwB,EAC7B,KAAK,mBAAmB,EAExB,wBAAwB,GACzB,MAAM,oBAAoB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAEL,KAAK,cAAc,EAEnB,KAAK,UAAU,EACf,KAAK,kBAAkB,EACvB,KAAK,6BAA6B,EAElC,WAAW,EACX,sBAAsB,EACtB,cAAc,EACd,gBAAgB,GACjB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAEL,KAAK,mBAAmB,EACxB,KAAK,yBAAyB,EAE9B,kBAAkB,EAClB,uBAAuB,EACvB,qBAAqB,EACrB,6BAA6B,EAC7B,uBAAuB,GACxB,MAAM,gBAAgB,CAAC;AAExB,OAAO,EAEL,KAAK,gBAAgB,EACrB,KAAK,wBAAwB,EAC7B,KAAK,mBAAmB,EAExB,wBAAwB,GACzB,MAAM,oBAAoB,CAAC"}
package/adapters/index.js CHANGED
@@ -20,6 +20,7 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
20
20
  // libs/uipack/src/adapters/index.ts
21
21
  var adapters_exports = {};
22
22
  __export(adapters_exports, {
23
+ buildFrontMCPCSP: () => buildFrontMCPCSP,
23
24
  buildOpenAICSP: () => buildOpenAICSP,
24
25
  buildToolDiscoveryMeta: () => buildToolDiscoveryMeta,
25
26
  buildToolResponseContent: () => buildToolResponseContent,
@@ -107,6 +108,15 @@ function buildClaudeMeta(meta, uiConfig) {
107
108
  if (uiConfig.widgetDescription) {
108
109
  meta["claude/widgetDescription"] = uiConfig.widgetDescription;
109
110
  }
111
+ if (uiConfig.displayMode) {
112
+ meta["claude/displayMode"] = uiConfig.displayMode;
113
+ }
114
+ if (uiConfig.widgetAccessible) {
115
+ meta["claude/widgetAccessible"] = true;
116
+ }
117
+ if (uiConfig.prefersBorder !== void 0) {
118
+ meta["claude/prefersBorder"] = uiConfig.prefersBorder;
119
+ }
110
120
  return meta;
111
121
  }
112
122
  function buildGeminiMeta(meta, uiConfig) {
@@ -121,12 +131,34 @@ function buildIDEMeta(meta, uiConfig) {
121
131
  }
122
132
  return meta;
123
133
  }
134
+ function buildFrontMCPCSP(csp) {
135
+ const result = {};
136
+ if (csp.connectDomains?.length) {
137
+ result.connectDomains = csp.connectDomains;
138
+ }
139
+ if (csp.resourceDomains?.length) {
140
+ result.resourceDomains = csp.resourceDomains;
141
+ }
142
+ return result;
143
+ }
124
144
  function buildGenericMeta(meta, uiConfig) {
125
145
  if (uiConfig.widgetAccessible) {
126
- meta["openai/widgetAccessible"] = true;
146
+ meta["frontmcp/widgetAccessible"] = true;
127
147
  }
128
148
  if (uiConfig.csp) {
129
- meta["openai/widgetCSP"] = buildOpenAICSP(uiConfig.csp);
149
+ meta["frontmcp/widgetCSP"] = buildFrontMCPCSP(uiConfig.csp);
150
+ }
151
+ if (uiConfig.displayMode) {
152
+ meta["frontmcp/displayMode"] = uiConfig.displayMode;
153
+ }
154
+ if (uiConfig.widgetDescription) {
155
+ meta["frontmcp/widgetDescription"] = uiConfig.widgetDescription;
156
+ }
157
+ if (uiConfig.prefersBorder !== void 0) {
158
+ meta["frontmcp/prefersBorder"] = uiConfig.prefersBorder;
159
+ }
160
+ if (uiConfig.sandboxDomain) {
161
+ meta["frontmcp/domain"] = uiConfig.sandboxDomain;
130
162
  }
131
163
  return meta;
132
164
  }
@@ -450,6 +482,7 @@ ${htmlContent}
450
482
  }
451
483
  // Annotate the CommonJS export names for ESM import in node:
452
484
  0 && (module.exports = {
485
+ buildFrontMCPCSP,
453
486
  buildOpenAICSP,
454
487
  buildToolDiscoveryMeta,
455
488
  buildToolResponseContent,
@@ -58,6 +58,27 @@ export interface UIMetadata {
58
58
  'openai/toolInvocation/invoked'?: string;
59
59
  /** Claude: Widget description */
60
60
  'claude/widgetDescription'?: string;
61
+ /** Claude: Display mode preference */
62
+ 'claude/displayMode'?: string;
63
+ /** Claude: Whether widget can invoke tools (informational) */
64
+ 'claude/widgetAccessible'?: boolean;
65
+ /** Claude: Whether to show border around UI */
66
+ 'claude/prefersBorder'?: boolean;
67
+ /** FrontMCP: Whether widget can invoke tools */
68
+ 'frontmcp/widgetAccessible'?: boolean;
69
+ /** FrontMCP: CSP configuration */
70
+ 'frontmcp/widgetCSP'?: {
71
+ connectDomains?: string[];
72
+ resourceDomains?: string[];
73
+ };
74
+ /** FrontMCP: Display mode preference */
75
+ 'frontmcp/displayMode'?: string;
76
+ /** FrontMCP: Widget description */
77
+ 'frontmcp/widgetDescription'?: string;
78
+ /** FrontMCP: Whether to show border around UI */
79
+ 'frontmcp/prefersBorder'?: boolean;
80
+ /** FrontMCP: Dedicated sandbox domain */
81
+ 'frontmcp/domain'?: string;
61
82
  /** Gemini: Widget description */
62
83
  'gemini/widgetDescription'?: string;
63
84
  /** IDE: Resource URI for widget template */
@@ -127,6 +148,14 @@ export declare function buildOpenAICSP(csp: UIContentSecurityPolicy): {
127
148
  connect_domains?: string[];
128
149
  resource_domains?: string[];
129
150
  };
151
+ /**
152
+ * Build FrontMCP CSP format (camelCase like MCP Apps spec).
153
+ * Used for generic-mcp platform metadata.
154
+ */
155
+ export declare function buildFrontMCPCSP(csp: UIContentSecurityPolicy): {
156
+ connectDomains?: string[];
157
+ resourceDomains?: string[];
158
+ };
130
159
  /**
131
160
  * Build metadata for tool discovery (tools/list response).
132
161
  * This includes fields that should be present at discovery time,
@@ -1 +1 @@
1
- {"version":3,"file":"platform-meta.d.ts","sourceRoot":"","sources":["../../src/adapters/platform-meta.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"platform-meta.d.ts","sourceRoot":"","sources":["../../src/adapters/platform-meta.ts"],"names":[],"mappings":"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"}
@@ -11,7 +11,6 @@
11
11
  * - OpenAI Apps SDK (window.openai.toolOutput)
12
12
  * - Claude Artifacts
13
13
  * - Custom hosts using MCP protocol
14
- * - ngrok/iframe scenarios
15
14
  */
16
15
  import { type ThemeConfig } from '../theme';
17
16
  import { type McpSession } from './polyfills';
@@ -1 +1 @@
1
- {"version":3,"file":"default-base-template.d.ts","sourceRoot":"","sources":["../../src/base-template/default-base-template.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAiB,KAAK,WAAW,EAAE,MAAM,UAAU,CAAC;AAE3D,OAAO,EAA4B,KAAK,UAAU,EAAE,MAAM,aAAa,CAAC;AAGxE;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,mCAAmC;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,0BAA0B;IAC1B,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,sDAAsD;IACtD,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,oCAAoC;IACpC,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,yCAAyC;IACzC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,oCAAoC;IACpC,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,yDAAyD;IACzD,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,0BAA0B;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,sCAAsC;IACtC,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAcD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,mBAAmB,GAAG,MAAM,CAyW9E;AAED;;;;;;;;GAQG;AACH,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,UAAU,GAAG,MAAM,CAQ3F"}
1
+ {"version":3,"file":"default-base-template.d.ts","sourceRoot":"","sources":["../../src/base-template/default-base-template.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAiB,KAAK,WAAW,EAAE,MAAM,UAAU,CAAC;AAE3D,OAAO,EAA4B,KAAK,UAAU,EAAE,MAAM,aAAa,CAAC;AAGxE;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,mCAAmC;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,0BAA0B;IAC1B,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,sDAAsD;IACtD,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,oCAAoC;IACpC,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,yCAAyC;IACzC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,oCAAoC;IACpC,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,yDAAyD;IACzD,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,0BAA0B;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,sCAAsC;IACtC,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAcD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,mBAAmB,GAAG,MAAM,CAyW9E;AAED;;;;;;;;GAQG;AACH,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,UAAU,GAAG,MAAM,CAQ3F"}
@@ -78,9 +78,6 @@ var scriptCache = /* @__PURE__ */ new Map();
78
78
  function getCachedScript(url) {
79
79
  return scriptCache.get(url);
80
80
  }
81
- function isScriptCached(url) {
82
- return scriptCache.has(url);
83
- }
84
81
  function buildScriptTag(url, integrity, options = {}) {
85
82
  const attrs = [`src="${url}"`];
86
83
  if (integrity) {
@@ -111,8 +108,9 @@ function buildCdnScriptsFromTheme(theme, options = {}) {
111
108
  const iconsConfig = theme.cdn?.icons?.script ?? CDN.icons;
112
109
  if (inline) {
113
110
  if (tailwind) {
114
- if (isScriptCached(tailwindUrl)) {
115
- scripts.push(buildInlineScriptTag(getCachedScript(tailwindUrl)));
111
+ const cached = getCachedScript(tailwindUrl);
112
+ if (cached) {
113
+ scripts.push(buildInlineScriptTag(cached));
116
114
  } else {
117
115
  console.warn(
118
116
  "[frontmcp/ui] Inline mode requested but Tailwind script not cached. Call fetchAndCacheScriptsFromTheme() first."
@@ -120,8 +118,9 @@ function buildCdnScriptsFromTheme(theme, options = {}) {
120
118
  }
121
119
  }
122
120
  if (htmx) {
123
- if (isScriptCached(htmxConfig.url)) {
124
- scripts.push(buildInlineScriptTag(getCachedScript(htmxConfig.url)));
121
+ const cached = getCachedScript(htmxConfig.url);
122
+ if (cached) {
123
+ scripts.push(buildInlineScriptTag(cached));
125
124
  } else {
126
125
  console.warn(
127
126
  "[frontmcp/ui] Inline mode requested but HTMX script not cached. Call fetchAndCacheScriptsFromTheme() first."
@@ -129,8 +128,9 @@ function buildCdnScriptsFromTheme(theme, options = {}) {
129
128
  }
130
129
  }
131
130
  if (alpine) {
132
- if (isScriptCached(alpineConfig.url)) {
133
- scripts.push(buildInlineScriptTag(getCachedScript(alpineConfig.url)));
131
+ const cached = getCachedScript(alpineConfig.url);
132
+ if (cached) {
133
+ scripts.push(buildInlineScriptTag(cached));
134
134
  } else {
135
135
  console.warn(
136
136
  "[frontmcp/ui] Inline mode requested but Alpine.js script not cached. Call fetchAndCacheScriptsFromTheme() first."
@@ -138,8 +138,9 @@ function buildCdnScriptsFromTheme(theme, options = {}) {
138
138
  }
139
139
  }
140
140
  if (icons) {
141
- if (isScriptCached(iconsConfig.url)) {
142
- scripts.push(buildInlineScriptTag(getCachedScript(iconsConfig.url)));
141
+ const cached = getCachedScript(iconsConfig.url);
142
+ if (cached) {
143
+ scripts.push(buildInlineScriptTag(cached));
143
144
  } else {
144
145
  console.warn(
145
146
  "[frontmcp/ui] Inline mode requested but icons script not cached. Call fetchAndCacheScriptsFromTheme() first."
@@ -163,26 +164,6 @@ function buildCdnScriptsFromTheme(theme, options = {}) {
163
164
  return scripts.join("\n ");
164
165
  }
165
166
 
166
- // libs/uipack/src/theme/platforms.ts
167
- var CLAUDE_PLATFORM = {
168
- id: "claude",
169
- name: "Claude (Artifacts)",
170
- supportsWidgets: true,
171
- supportsTailwind: true,
172
- supportsHtmx: false,
173
- // Network blocked, HTMX won't work for API calls
174
- networkMode: "blocked",
175
- scriptStrategy: "inline",
176
- maxInlineSize: 100 * 1024,
177
- // 100KB limit for artifacts
178
- cspRestrictions: ["script-src 'unsafe-inline'", "connect-src 'none'"],
179
- options: {
180
- mode: "artifacts",
181
- framework: "react"
182
- // Claude artifacts prefer React
183
- }
184
- };
185
-
186
167
  // libs/uipack/src/theme/presets/github-openai.ts
187
168
  var GITHUB_OPENAI_THEME = {
188
169
  name: "github-openai",
@@ -343,17 +324,31 @@ function emitColorScale(lines, name, scale) {
343
324
  if (value) lines.push(`--color-${name}-${shade}: ${value};`);
344
325
  }
345
326
  }
327
+ var OPACITY_VARIANTS = [10, 20, 30, 50, 70, 90];
328
+ function emitColorWithOpacityVariants(lines, name, value) {
329
+ lines.push(`--color-${name}: ${value};`);
330
+ for (const opacity of OPACITY_VARIANTS) {
331
+ lines.push(`--color-${name}-${opacity}: color-mix(in oklch, ${value} ${opacity}%, transparent);`);
332
+ }
333
+ }
334
+ function emitBrandColorWithVariants(lines, name, value) {
335
+ lines.push(`--color-${name}: ${value};`);
336
+ lines.push(`--color-${name}-hover: color-mix(in oklch, ${value} 85%, black);`);
337
+ for (const opacity of OPACITY_VARIANTS) {
338
+ lines.push(`--color-${name}-${opacity}: color-mix(in oklch, ${value} ${opacity}%, transparent);`);
339
+ }
340
+ }
346
341
  function buildThemeCss(theme) {
347
342
  const lines = [];
348
343
  const semantic = theme.colors.semantic;
349
344
  if (typeof semantic.primary === "string") {
350
- lines.push(`--color-primary: ${semantic.primary};`);
345
+ emitBrandColorWithVariants(lines, "primary", semantic.primary);
351
346
  } else if (semantic.primary) {
352
347
  emitColorScale(lines, "primary", semantic.primary);
353
348
  }
354
349
  if (semantic.secondary) {
355
350
  if (typeof semantic.secondary === "string") {
356
- lines.push(`--color-secondary: ${semantic.secondary};`);
351
+ emitBrandColorWithVariants(lines, "secondary", semantic.secondary);
357
352
  } else {
358
353
  emitColorScale(lines, "secondary", semantic.secondary);
359
354
  }
@@ -372,10 +367,10 @@ function buildThemeCss(theme) {
372
367
  emitColorScale(lines, "neutral", semantic.neutral);
373
368
  }
374
369
  }
375
- if (semantic.success) lines.push(`--color-success: ${semantic.success};`);
376
- if (semantic.warning) lines.push(`--color-warning: ${semantic.warning};`);
377
- if (semantic.danger) lines.push(`--color-danger: ${semantic.danger};`);
378
- if (semantic.info) lines.push(`--color-info: ${semantic.info};`);
370
+ if (semantic.success) emitColorWithOpacityVariants(lines, "success", semantic.success);
371
+ if (semantic.warning) emitColorWithOpacityVariants(lines, "warning", semantic.warning);
372
+ if (semantic.danger) emitColorWithOpacityVariants(lines, "danger", semantic.danger);
373
+ if (semantic.info) emitColorWithOpacityVariants(lines, "info", semantic.info);
379
374
  const surface = theme.colors.surface;
380
375
  if (surface?.background) lines.push(`--color-background: ${surface.background};`);
381
376
  if (surface?.surface) lines.push(`--color-surface: ${surface.surface};`);