@frontmcp/ui 0.6.0 → 0.6.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 (445) hide show
  1. package/README.md +140 -362
  2. package/bridge/runtime/index.d.ts +2 -1
  3. package/bridge/runtime/index.d.ts.map +1 -1
  4. package/bundler/file-cache/component-builder.d.ts +1 -1
  5. package/bundler/file-cache/component-builder.d.ts.map +1 -1
  6. package/bundler/file-cache/hash-calculator.d.ts +1 -1
  7. package/bundler/file-cache/hash-calculator.d.ts.map +1 -1
  8. package/bundler/file-cache/storage/filesystem.d.ts +1 -1
  9. package/bundler/file-cache/storage/filesystem.d.ts.map +1 -1
  10. package/bundler/file-cache/storage/interface.d.ts +1 -1
  11. package/bundler/file-cache/storage/interface.d.ts.map +1 -1
  12. package/bundler/file-cache/storage/redis.d.ts +1 -1
  13. package/bundler/file-cache/storage/redis.d.ts.map +1 -1
  14. package/bundler/index.js +10 -1057
  15. package/components/alert.schema.d.ts +6 -6
  16. package/components/avatar.schema.d.ts +9 -9
  17. package/components/badge.schema.d.ts +9 -9
  18. package/components/button.schema.d.ts +9 -9
  19. package/components/card.schema.d.ts +7 -7
  20. package/components/form.schema.d.ts +24 -24
  21. package/components/index.js +128 -198
  22. package/components/modal.schema.d.ts +8 -8
  23. package/components/table.schema.d.ts +6 -6
  24. package/esm/bridge/runtime/index.d.ts +2 -1
  25. package/esm/bridge/runtime/index.d.ts.map +1 -1
  26. package/esm/bundler/file-cache/component-builder.d.ts +1 -1
  27. package/esm/bundler/file-cache/component-builder.d.ts.map +1 -1
  28. package/esm/bundler/file-cache/hash-calculator.d.ts +1 -1
  29. package/esm/bundler/file-cache/hash-calculator.d.ts.map +1 -1
  30. package/esm/bundler/file-cache/storage/filesystem.d.ts +1 -1
  31. package/esm/bundler/file-cache/storage/filesystem.d.ts.map +1 -1
  32. package/esm/bundler/file-cache/storage/interface.d.ts +1 -1
  33. package/esm/bundler/file-cache/storage/interface.d.ts.map +1 -1
  34. package/esm/bundler/file-cache/storage/redis.d.ts +1 -1
  35. package/esm/bundler/file-cache/storage/redis.d.ts.map +1 -1
  36. package/esm/bundler/index.js +3 -1050
  37. package/esm/components/alert.schema.d.ts +6 -6
  38. package/esm/components/avatar.schema.d.ts +9 -9
  39. package/esm/components/badge.schema.d.ts +9 -9
  40. package/esm/components/button.schema.d.ts +9 -9
  41. package/esm/components/card.schema.d.ts +7 -7
  42. package/esm/components/form.schema.d.ts +24 -24
  43. package/esm/components/index.js +136 -196
  44. package/esm/components/modal.schema.d.ts +8 -8
  45. package/esm/components/table.schema.d.ts +6 -6
  46. package/esm/index.d.ts +23 -39
  47. package/esm/index.d.ts.map +1 -1
  48. package/esm/index.js +4256 -16441
  49. package/esm/layouts/base.d.ts +2 -2
  50. package/esm/layouts/base.d.ts.map +1 -1
  51. package/esm/layouts/index.js +33 -516
  52. package/esm/package.json +8 -26
  53. package/esm/pages/index.js +100 -627
  54. package/esm/react/Alert.d.ts +1 -2
  55. package/esm/react/Alert.d.ts.map +1 -1
  56. package/esm/react/Badge.d.ts +1 -2
  57. package/esm/react/Badge.d.ts.map +1 -1
  58. package/esm/react/Button.d.ts +1 -2
  59. package/esm/react/Button.d.ts.map +1 -1
  60. package/esm/react/Card.d.ts +1 -2
  61. package/esm/react/Card.d.ts.map +1 -1
  62. package/esm/react/hooks/context.d.ts +1 -1
  63. package/esm/react/hooks/context.d.ts.map +1 -1
  64. package/esm/react/index.d.ts +5 -6
  65. package/esm/react/index.d.ts.map +1 -1
  66. package/esm/react/index.js +2074 -322
  67. package/esm/react/types.d.ts +1 -2
  68. package/esm/react/types.d.ts.map +1 -1
  69. package/esm/renderers/index.d.ts +10 -25
  70. package/esm/renderers/index.d.ts.map +1 -1
  71. package/esm/renderers/index.js +171 -1617
  72. package/esm/{runtime/adapters → renderers}/react.adapter.d.ts +2 -2
  73. package/esm/renderers/react.adapter.d.ts.map +1 -0
  74. package/esm/renderers/react.renderer.d.ts +3 -3
  75. package/esm/renderers/react.renderer.d.ts.map +1 -1
  76. package/esm/universal/index.js +1755 -0
  77. package/esm/web-components/index.js +232 -287
  78. package/esm/widgets/index.js +89 -147
  79. package/index.d.ts +23 -39
  80. package/index.d.ts.map +1 -1
  81. package/index.js +6123 -18539
  82. package/layouts/base.d.ts +2 -2
  83. package/layouts/base.d.ts.map +1 -1
  84. package/layouts/index.js +43 -536
  85. package/package.json +8 -26
  86. package/pages/index.js +111 -648
  87. package/react/Alert.d.ts +1 -2
  88. package/react/Alert.d.ts.map +1 -1
  89. package/react/Badge.d.ts +1 -2
  90. package/react/Badge.d.ts.map +1 -1
  91. package/react/Button.d.ts +1 -2
  92. package/react/Button.d.ts.map +1 -1
  93. package/react/Card.d.ts +1 -2
  94. package/react/Card.d.ts.map +1 -1
  95. package/react/hooks/context.d.ts +1 -1
  96. package/react/hooks/context.d.ts.map +1 -1
  97. package/react/index.d.ts +5 -6
  98. package/react/index.d.ts.map +1 -1
  99. package/react/index.js +2065 -335
  100. package/react/types.d.ts +1 -2
  101. package/react/types.d.ts.map +1 -1
  102. package/renderers/index.d.ts +10 -25
  103. package/renderers/index.d.ts.map +1 -1
  104. package/renderers/index.js +175 -1641
  105. package/{runtime/adapters → renderers}/react.adapter.d.ts +2 -2
  106. package/renderers/react.adapter.d.ts.map +1 -0
  107. package/renderers/react.renderer.d.ts +3 -3
  108. package/renderers/react.renderer.d.ts.map +1 -1
  109. package/universal/index.js +1841 -0
  110. package/web-components/index.js +224 -289
  111. package/widgets/index.js +80 -148
  112. package/adapters/index.d.ts +0 -13
  113. package/adapters/index.d.ts.map +0 -1
  114. package/adapters/index.js +0 -462
  115. package/adapters/platform-meta.d.ts +0 -166
  116. package/adapters/platform-meta.d.ts.map +0 -1
  117. package/adapters/response-builder.d.ts +0 -108
  118. package/adapters/response-builder.d.ts.map +0 -1
  119. package/adapters/serving-mode.d.ts +0 -107
  120. package/adapters/serving-mode.d.ts.map +0 -1
  121. package/base-template/bridge.d.ts +0 -90
  122. package/base-template/bridge.d.ts.map +0 -1
  123. package/base-template/default-base-template.d.ts +0 -92
  124. package/base-template/default-base-template.d.ts.map +0 -1
  125. package/base-template/index.d.ts +0 -15
  126. package/base-template/index.d.ts.map +0 -1
  127. package/base-template/index.js +0 -1398
  128. package/base-template/polyfills.d.ts +0 -31
  129. package/base-template/polyfills.d.ts.map +0 -1
  130. package/base-template/theme-styles.d.ts +0 -74
  131. package/base-template/theme-styles.d.ts.map +0 -1
  132. package/build/cdn-resources.d.ts +0 -243
  133. package/build/cdn-resources.d.ts.map +0 -1
  134. package/build/index.d.ts +0 -295
  135. package/build/index.d.ts.map +0 -1
  136. package/build/index.js +0 -7096
  137. package/build/widget-manifest.d.ts +0 -362
  138. package/build/widget-manifest.d.ts.map +0 -1
  139. package/dependency/cdn-registry.d.ts +0 -98
  140. package/dependency/cdn-registry.d.ts.map +0 -1
  141. package/dependency/import-map.d.ts +0 -186
  142. package/dependency/import-map.d.ts.map +0 -1
  143. package/dependency/import-parser.d.ts +0 -82
  144. package/dependency/import-parser.d.ts.map +0 -1
  145. package/dependency/index.d.ts +0 -17
  146. package/dependency/index.d.ts.map +0 -1
  147. package/dependency/resolver.d.ts +0 -164
  148. package/dependency/resolver.d.ts.map +0 -1
  149. package/dependency/schemas.d.ts +0 -486
  150. package/dependency/schemas.d.ts.map +0 -1
  151. package/dependency/template-loader.d.ts +0 -204
  152. package/dependency/template-loader.d.ts.map +0 -1
  153. package/dependency/template-processor.d.ts +0 -118
  154. package/dependency/template-processor.d.ts.map +0 -1
  155. package/dependency/types.d.ts +0 -739
  156. package/dependency/types.d.ts.map +0 -1
  157. package/esm/adapters/index.d.ts +0 -13
  158. package/esm/adapters/index.d.ts.map +0 -1
  159. package/esm/adapters/index.js +0 -427
  160. package/esm/adapters/platform-meta.d.ts +0 -166
  161. package/esm/adapters/platform-meta.d.ts.map +0 -1
  162. package/esm/adapters/response-builder.d.ts +0 -108
  163. package/esm/adapters/response-builder.d.ts.map +0 -1
  164. package/esm/adapters/serving-mode.d.ts +0 -107
  165. package/esm/adapters/serving-mode.d.ts.map +0 -1
  166. package/esm/base-template/bridge.d.ts +0 -90
  167. package/esm/base-template/bridge.d.ts.map +0 -1
  168. package/esm/base-template/default-base-template.d.ts +0 -92
  169. package/esm/base-template/default-base-template.d.ts.map +0 -1
  170. package/esm/base-template/index.d.ts +0 -15
  171. package/esm/base-template/index.d.ts.map +0 -1
  172. package/esm/base-template/index.js +0 -1364
  173. package/esm/base-template/polyfills.d.ts +0 -31
  174. package/esm/base-template/polyfills.d.ts.map +0 -1
  175. package/esm/base-template/theme-styles.d.ts +0 -74
  176. package/esm/base-template/theme-styles.d.ts.map +0 -1
  177. package/esm/build/cdn-resources.d.ts +0 -243
  178. package/esm/build/cdn-resources.d.ts.map +0 -1
  179. package/esm/build/index.d.ts +0 -295
  180. package/esm/build/index.d.ts.map +0 -1
  181. package/esm/build/index.js +0 -7021
  182. package/esm/build/widget-manifest.d.ts +0 -362
  183. package/esm/build/widget-manifest.d.ts.map +0 -1
  184. package/esm/dependency/cdn-registry.d.ts +0 -98
  185. package/esm/dependency/cdn-registry.d.ts.map +0 -1
  186. package/esm/dependency/import-map.d.ts +0 -186
  187. package/esm/dependency/import-map.d.ts.map +0 -1
  188. package/esm/dependency/import-parser.d.ts +0 -82
  189. package/esm/dependency/import-parser.d.ts.map +0 -1
  190. package/esm/dependency/index.d.ts +0 -17
  191. package/esm/dependency/index.d.ts.map +0 -1
  192. package/esm/dependency/resolver.d.ts +0 -164
  193. package/esm/dependency/resolver.d.ts.map +0 -1
  194. package/esm/dependency/schemas.d.ts +0 -486
  195. package/esm/dependency/schemas.d.ts.map +0 -1
  196. package/esm/dependency/template-loader.d.ts +0 -204
  197. package/esm/dependency/template-loader.d.ts.map +0 -1
  198. package/esm/dependency/template-processor.d.ts +0 -118
  199. package/esm/dependency/template-processor.d.ts.map +0 -1
  200. package/esm/dependency/types.d.ts +0 -739
  201. package/esm/dependency/types.d.ts.map +0 -1
  202. package/esm/handlebars/expression-extractor.d.ts +0 -147
  203. package/esm/handlebars/expression-extractor.d.ts.map +0 -1
  204. package/esm/handlebars/helpers.d.ts +0 -339
  205. package/esm/handlebars/helpers.d.ts.map +0 -1
  206. package/esm/handlebars/index.d.ts +0 -195
  207. package/esm/handlebars/index.d.ts.map +0 -1
  208. package/esm/handlebars/index.js +0 -587
  209. package/esm/registry/index.d.ts +0 -46
  210. package/esm/registry/index.d.ts.map +0 -1
  211. package/esm/registry/index.js +0 -6422
  212. package/esm/registry/render-template.d.ts +0 -91
  213. package/esm/registry/render-template.d.ts.map +0 -1
  214. package/esm/registry/tool-ui.registry.d.ts +0 -294
  215. package/esm/registry/tool-ui.registry.d.ts.map +0 -1
  216. package/esm/registry/uri-utils.d.ts +0 -56
  217. package/esm/registry/uri-utils.d.ts.map +0 -1
  218. package/esm/renderers/cache.d.ts +0 -145
  219. package/esm/renderers/cache.d.ts.map +0 -1
  220. package/esm/renderers/html.renderer.d.ts +0 -123
  221. package/esm/renderers/html.renderer.d.ts.map +0 -1
  222. package/esm/renderers/mdx.renderer.d.ts +0 -120
  223. package/esm/renderers/mdx.renderer.d.ts.map +0 -1
  224. package/esm/renderers/registry.d.ts +0 -134
  225. package/esm/renderers/registry.d.ts.map +0 -1
  226. package/esm/renderers/types.d.ts +0 -342
  227. package/esm/renderers/types.d.ts.map +0 -1
  228. package/esm/renderers/utils/detect.d.ts +0 -107
  229. package/esm/renderers/utils/detect.d.ts.map +0 -1
  230. package/esm/renderers/utils/hash.d.ts +0 -40
  231. package/esm/renderers/utils/hash.d.ts.map +0 -1
  232. package/esm/renderers/utils/index.d.ts +0 -9
  233. package/esm/renderers/utils/index.d.ts.map +0 -1
  234. package/esm/renderers/utils/transpiler.d.ts +0 -89
  235. package/esm/renderers/utils/transpiler.d.ts.map +0 -1
  236. package/esm/runtime/adapters/html.adapter.d.ts +0 -59
  237. package/esm/runtime/adapters/html.adapter.d.ts.map +0 -1
  238. package/esm/runtime/adapters/index.d.ts +0 -26
  239. package/esm/runtime/adapters/index.d.ts.map +0 -1
  240. package/esm/runtime/adapters/mdx.adapter.d.ts +0 -73
  241. package/esm/runtime/adapters/mdx.adapter.d.ts.map +0 -1
  242. package/esm/runtime/adapters/react.adapter.d.ts.map +0 -1
  243. package/esm/runtime/adapters/types.d.ts +0 -95
  244. package/esm/runtime/adapters/types.d.ts.map +0 -1
  245. package/esm/runtime/csp.d.ts +0 -48
  246. package/esm/runtime/csp.d.ts.map +0 -1
  247. package/esm/runtime/index.d.ts +0 -17
  248. package/esm/runtime/index.d.ts.map +0 -1
  249. package/esm/runtime/index.js +0 -5186
  250. package/esm/runtime/mcp-bridge.d.ts +0 -101
  251. package/esm/runtime/mcp-bridge.d.ts.map +0 -1
  252. package/esm/runtime/renderer-runtime.d.ts +0 -133
  253. package/esm/runtime/renderer-runtime.d.ts.map +0 -1
  254. package/esm/runtime/sanitizer.d.ts +0 -172
  255. package/esm/runtime/sanitizer.d.ts.map +0 -1
  256. package/esm/runtime/types.d.ts +0 -415
  257. package/esm/runtime/types.d.ts.map +0 -1
  258. package/esm/runtime/wrapper.d.ts +0 -421
  259. package/esm/runtime/wrapper.d.ts.map +0 -1
  260. package/esm/styles/index.d.ts +0 -8
  261. package/esm/styles/index.d.ts.map +0 -1
  262. package/esm/styles/index.js +0 -171
  263. package/esm/styles/variants.d.ts +0 -51
  264. package/esm/styles/variants.d.ts.map +0 -1
  265. package/esm/theme/cdn.d.ts +0 -195
  266. package/esm/theme/cdn.d.ts.map +0 -1
  267. package/esm/theme/index.d.ts +0 -18
  268. package/esm/theme/index.d.ts.map +0 -1
  269. package/esm/theme/index.js +0 -700
  270. package/esm/theme/platforms.d.ts +0 -107
  271. package/esm/theme/platforms.d.ts.map +0 -1
  272. package/esm/theme/presets/github-openai.d.ts +0 -50
  273. package/esm/theme/presets/github-openai.d.ts.map +0 -1
  274. package/esm/theme/presets/index.d.ts +0 -11
  275. package/esm/theme/presets/index.d.ts.map +0 -1
  276. package/esm/theme/theme.d.ts +0 -396
  277. package/esm/theme/theme.d.ts.map +0 -1
  278. package/esm/tool-template/builder.d.ts +0 -213
  279. package/esm/tool-template/builder.d.ts.map +0 -1
  280. package/esm/tool-template/index.d.ts +0 -16
  281. package/esm/tool-template/index.d.ts.map +0 -1
  282. package/esm/tool-template/index.js +0 -3515
  283. package/esm/types/index.d.ts +0 -14
  284. package/esm/types/index.d.ts.map +0 -1
  285. package/esm/types/index.js +0 -75
  286. package/esm/types/ui-config.d.ts +0 -639
  287. package/esm/types/ui-config.d.ts.map +0 -1
  288. package/esm/types/ui-runtime.d.ts +0 -1007
  289. package/esm/types/ui-runtime.d.ts.map +0 -1
  290. package/esm/typings/cache/cache-adapter.d.ts +0 -125
  291. package/esm/typings/cache/cache-adapter.d.ts.map +0 -1
  292. package/esm/typings/cache/index.d.ts +0 -10
  293. package/esm/typings/cache/index.d.ts.map +0 -1
  294. package/esm/typings/cache/memory-cache.d.ts +0 -92
  295. package/esm/typings/cache/memory-cache.d.ts.map +0 -1
  296. package/esm/typings/dts-parser.d.ts +0 -90
  297. package/esm/typings/dts-parser.d.ts.map +0 -1
  298. package/esm/typings/index.d.ts +0 -48
  299. package/esm/typings/index.d.ts.map +0 -1
  300. package/esm/typings/schemas.d.ts +0 -232
  301. package/esm/typings/schemas.d.ts.map +0 -1
  302. package/esm/typings/type-fetcher.d.ts +0 -89
  303. package/esm/typings/type-fetcher.d.ts.map +0 -1
  304. package/esm/typings/types.d.ts +0 -320
  305. package/esm/typings/types.d.ts.map +0 -1
  306. package/esm/utils/escape-html.d.ts +0 -58
  307. package/esm/utils/escape-html.d.ts.map +0 -1
  308. package/esm/utils/index.d.ts +0 -10
  309. package/esm/utils/index.d.ts.map +0 -1
  310. package/esm/utils/index.js +0 -40
  311. package/esm/utils/safe-stringify.d.ts +0 -30
  312. package/esm/utils/safe-stringify.d.ts.map +0 -1
  313. package/esm/validation/error-box.d.ts +0 -56
  314. package/esm/validation/error-box.d.ts.map +0 -1
  315. package/esm/validation/index.d.ts +0 -13
  316. package/esm/validation/index.d.ts.map +0 -1
  317. package/esm/validation/index.js +0 -562
  318. package/esm/validation/schema-paths.d.ts +0 -118
  319. package/esm/validation/schema-paths.d.ts.map +0 -1
  320. package/esm/validation/template-validator.d.ts +0 -143
  321. package/esm/validation/template-validator.d.ts.map +0 -1
  322. package/esm/validation/wrapper.d.ts +0 -97
  323. package/esm/validation/wrapper.d.ts.map +0 -1
  324. package/handlebars/expression-extractor.d.ts +0 -147
  325. package/handlebars/expression-extractor.d.ts.map +0 -1
  326. package/handlebars/helpers.d.ts +0 -339
  327. package/handlebars/helpers.d.ts.map +0 -1
  328. package/handlebars/index.d.ts +0 -195
  329. package/handlebars/index.d.ts.map +0 -1
  330. package/handlebars/index.js +0 -666
  331. package/registry/index.d.ts +0 -46
  332. package/registry/index.d.ts.map +0 -1
  333. package/registry/index.js +0 -6465
  334. package/registry/render-template.d.ts +0 -91
  335. package/registry/render-template.d.ts.map +0 -1
  336. package/registry/tool-ui.registry.d.ts +0 -294
  337. package/registry/tool-ui.registry.d.ts.map +0 -1
  338. package/registry/uri-utils.d.ts +0 -56
  339. package/registry/uri-utils.d.ts.map +0 -1
  340. package/renderers/cache.d.ts +0 -145
  341. package/renderers/cache.d.ts.map +0 -1
  342. package/renderers/html.renderer.d.ts +0 -123
  343. package/renderers/html.renderer.d.ts.map +0 -1
  344. package/renderers/mdx.renderer.d.ts +0 -120
  345. package/renderers/mdx.renderer.d.ts.map +0 -1
  346. package/renderers/registry.d.ts +0 -134
  347. package/renderers/registry.d.ts.map +0 -1
  348. package/renderers/types.d.ts +0 -342
  349. package/renderers/types.d.ts.map +0 -1
  350. package/renderers/utils/detect.d.ts +0 -107
  351. package/renderers/utils/detect.d.ts.map +0 -1
  352. package/renderers/utils/hash.d.ts +0 -40
  353. package/renderers/utils/hash.d.ts.map +0 -1
  354. package/renderers/utils/index.d.ts +0 -9
  355. package/renderers/utils/index.d.ts.map +0 -1
  356. package/renderers/utils/transpiler.d.ts +0 -89
  357. package/renderers/utils/transpiler.d.ts.map +0 -1
  358. package/runtime/adapters/html.adapter.d.ts +0 -59
  359. package/runtime/adapters/html.adapter.d.ts.map +0 -1
  360. package/runtime/adapters/index.d.ts +0 -26
  361. package/runtime/adapters/index.d.ts.map +0 -1
  362. package/runtime/adapters/mdx.adapter.d.ts +0 -73
  363. package/runtime/adapters/mdx.adapter.d.ts.map +0 -1
  364. package/runtime/adapters/react.adapter.d.ts.map +0 -1
  365. package/runtime/adapters/types.d.ts +0 -95
  366. package/runtime/adapters/types.d.ts.map +0 -1
  367. package/runtime/csp.d.ts +0 -48
  368. package/runtime/csp.d.ts.map +0 -1
  369. package/runtime/index.d.ts +0 -17
  370. package/runtime/index.d.ts.map +0 -1
  371. package/runtime/index.js +0 -5264
  372. package/runtime/mcp-bridge.d.ts +0 -101
  373. package/runtime/mcp-bridge.d.ts.map +0 -1
  374. package/runtime/renderer-runtime.d.ts +0 -133
  375. package/runtime/renderer-runtime.d.ts.map +0 -1
  376. package/runtime/sanitizer.d.ts +0 -172
  377. package/runtime/sanitizer.d.ts.map +0 -1
  378. package/runtime/types.d.ts +0 -415
  379. package/runtime/types.d.ts.map +0 -1
  380. package/runtime/wrapper.d.ts +0 -421
  381. package/runtime/wrapper.d.ts.map +0 -1
  382. package/styles/index.d.ts +0 -8
  383. package/styles/index.d.ts.map +0 -1
  384. package/styles/index.js +0 -222
  385. package/styles/variants.d.ts +0 -51
  386. package/styles/variants.d.ts.map +0 -1
  387. package/theme/cdn.d.ts +0 -195
  388. package/theme/cdn.d.ts.map +0 -1
  389. package/theme/index.d.ts +0 -18
  390. package/theme/index.d.ts.map +0 -1
  391. package/theme/index.js +0 -757
  392. package/theme/platforms.d.ts +0 -107
  393. package/theme/platforms.d.ts.map +0 -1
  394. package/theme/presets/github-openai.d.ts +0 -50
  395. package/theme/presets/github-openai.d.ts.map +0 -1
  396. package/theme/presets/index.d.ts +0 -11
  397. package/theme/presets/index.d.ts.map +0 -1
  398. package/theme/theme.d.ts +0 -396
  399. package/theme/theme.d.ts.map +0 -1
  400. package/tool-template/builder.d.ts +0 -213
  401. package/tool-template/builder.d.ts.map +0 -1
  402. package/tool-template/index.d.ts +0 -16
  403. package/tool-template/index.d.ts.map +0 -1
  404. package/tool-template/index.js +0 -3559
  405. package/types/index.d.ts +0 -14
  406. package/types/index.d.ts.map +0 -1
  407. package/types/index.js +0 -108
  408. package/types/ui-config.d.ts +0 -639
  409. package/types/ui-config.d.ts.map +0 -1
  410. package/types/ui-runtime.d.ts +0 -1007
  411. package/types/ui-runtime.d.ts.map +0 -1
  412. package/typings/cache/cache-adapter.d.ts +0 -125
  413. package/typings/cache/cache-adapter.d.ts.map +0 -1
  414. package/typings/cache/index.d.ts +0 -10
  415. package/typings/cache/index.d.ts.map +0 -1
  416. package/typings/cache/memory-cache.d.ts +0 -92
  417. package/typings/cache/memory-cache.d.ts.map +0 -1
  418. package/typings/dts-parser.d.ts +0 -90
  419. package/typings/dts-parser.d.ts.map +0 -1
  420. package/typings/index.d.ts +0 -48
  421. package/typings/index.d.ts.map +0 -1
  422. package/typings/schemas.d.ts +0 -232
  423. package/typings/schemas.d.ts.map +0 -1
  424. package/typings/type-fetcher.d.ts +0 -89
  425. package/typings/type-fetcher.d.ts.map +0 -1
  426. package/typings/types.d.ts +0 -320
  427. package/typings/types.d.ts.map +0 -1
  428. package/utils/escape-html.d.ts +0 -58
  429. package/utils/escape-html.d.ts.map +0 -1
  430. package/utils/index.d.ts +0 -10
  431. package/utils/index.d.ts.map +0 -1
  432. package/utils/index.js +0 -70
  433. package/utils/safe-stringify.d.ts +0 -30
  434. package/utils/safe-stringify.d.ts.map +0 -1
  435. package/validation/error-box.d.ts +0 -56
  436. package/validation/error-box.d.ts.map +0 -1
  437. package/validation/index.d.ts +0 -13
  438. package/validation/index.d.ts.map +0 -1
  439. package/validation/index.js +0 -603
  440. package/validation/schema-paths.d.ts +0 -118
  441. package/validation/schema-paths.d.ts.map +0 -1
  442. package/validation/template-validator.d.ts +0 -143
  443. package/validation/template-validator.d.ts.map +0 -1
  444. package/validation/wrapper.d.ts +0 -97
  445. package/validation/wrapper.d.ts.map +0 -1
@@ -677,83 +677,23 @@ var ActionListOptionsSchema = z9.object({
677
677
  className: z9.string().optional()
678
678
  }).strict();
679
679
 
680
- // libs/ui/src/theme/platforms.ts
681
- var CLAUDE_PLATFORM = {
682
- id: "claude",
683
- name: "Claude (Artifacts)",
684
- supportsWidgets: true,
685
- supportsTailwind: true,
686
- supportsHtmx: false,
687
- // Network blocked, HTMX won't work for API calls
688
- networkMode: "blocked",
689
- scriptStrategy: "inline",
690
- maxInlineSize: 100 * 1024,
691
- // 100KB limit for artifacts
692
- cspRestrictions: ["script-src 'unsafe-inline'", "connect-src 'none'"],
693
- options: {
694
- mode: "artifacts",
695
- framework: "react"
696
- // Claude artifacts prefer React
697
- }
698
- };
699
-
700
- // libs/ui/src/utils/escape-html.ts
701
- function escapeHtml(str) {
702
- if (str === null || str === void 0) {
703
- return "";
704
- }
705
- const s = String(str);
706
- return s.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;").replace(/'/g, "&#39;").replace(/\u2028/g, "\\u2028").replace(/\u2029/g, "\\u2029");
707
- }
708
-
709
- // libs/ui/src/validation/error-box.ts
710
- var errorIcon = `<svg class="w-5 h-5 flex-shrink-0" fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true">
711
- <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z"/>
712
- </svg>`;
713
- function validationErrorBox(options) {
714
- const { componentName, invalidParam } = options;
715
- return `<div
716
- class="validation-error flex items-start gap-3 p-4 bg-red-50 border border-red-200 text-red-800 rounded-lg"
717
- role="alert"
718
- data-testid="validation-error"
719
- data-component="${escapeHtml(componentName)}"
720
- data-param="${escapeHtml(invalidParam)}"
721
- >
722
- ${errorIcon}
723
- <div class="min-w-0">
724
- <p class="font-semibold text-sm">${escapeHtml(componentName)}: Invalid Configuration</p>
725
- <p class="text-sm opacity-90 mt-0.5">The "${escapeHtml(invalidParam)}" parameter is invalid.</p>
726
- </div>
727
- </div>`;
728
- }
729
-
730
- // libs/ui/src/validation/wrapper.ts
731
- function getFirstInvalidPath(error) {
732
- const firstError = error.issues[0];
733
- if (!firstError || firstError.path.length === 0) {
734
- return "options";
735
- }
736
- return firstError.path.map(String).join(".");
737
- }
738
- function validateOptions(options, config) {
739
- const result = config.schema.safeParse(options);
740
- if (result.success) {
741
- return { success: true, data: result.data };
742
- }
743
- const invalidParam = getFirstInvalidPath(result.error);
744
- return {
745
- success: false,
746
- error: validationErrorBox({
747
- componentName: config.componentName,
748
- invalidParam
749
- })
750
- };
751
- }
752
-
753
- // libs/ui/src/validation/schema-paths.ts
754
- import { z as z10 } from "zod";
680
+ // libs/ui/src/layouts/base.ts
681
+ import {
682
+ OPENAI_PLATFORM,
683
+ canUseCdn,
684
+ needsInlineScripts,
685
+ DEFAULT_THEME,
686
+ buildThemeCss,
687
+ mergeThemes,
688
+ buildFontPreconnect,
689
+ buildFontStylesheets,
690
+ buildCdnScripts
691
+ } from "@frontmcp/uipack/theme";
692
+ import { escapeHtml } from "@frontmcp/uipack/utils";
693
+ import { escapeHtml as escapeHtml2 } from "@frontmcp/uipack/utils";
755
694
 
756
695
  // libs/ui/src/components/button.ts
696
+ import { validateOptions } from "@frontmcp/uipack/validation";
757
697
  function getVariantClasses(variant) {
758
698
  const variants = {
759
699
  primary: "bg-primary hover:bg-primary/90 text-white shadow-sm",
@@ -843,7 +783,7 @@ function button(text, options = {}) {
843
783
  }
844
784
  const variantClasses = getVariantClasses(variant);
845
785
  const sizeClasses = getSizeClasses(size, iconOnly);
846
- const safeClassName = className ? escapeHtml(className) : "";
786
+ const safeClassName = className ? escapeHtml2(className) : "";
847
787
  const baseClasses = [
848
788
  "inline-flex items-center justify-center",
849
789
  "font-medium",
@@ -858,24 +798,24 @@ function button(text, options = {}) {
858
798
  ].filter(Boolean).join(" ");
859
799
  const dataAttrs = data ? Object.entries(data).map(([key, val]) => {
860
800
  const safeKey = sanitizeDataKey(key);
861
- return safeKey ? `data-${safeKey}="${escapeHtml(val)}"` : "";
801
+ return safeKey ? `data-${safeKey}="${escapeHtml2(val)}"` : "";
862
802
  }).filter(Boolean).join(" ") : "";
863
- const idAttr = id ? `id="${escapeHtml(id)}"` : "";
864
- const nameAttr = name ? `name="${escapeHtml(name)}"` : "";
865
- const valueAttr = value ? `value="${escapeHtml(value)}"` : "";
803
+ const idAttr = id ? `id="${escapeHtml2(id)}"` : "";
804
+ const nameAttr = name ? `name="${escapeHtml2(name)}"` : "";
805
+ const valueAttr = value ? `value="${escapeHtml2(value)}"` : "";
866
806
  const disabledAttr = disabled || loading ? "disabled" : "";
867
- const targetAttr = target ? `target="${escapeHtml(target)}"` : "";
807
+ const targetAttr = target ? `target="${escapeHtml2(target)}"` : "";
868
808
  const relAttr = target === "_blank" ? 'rel="noopener noreferrer"' : "";
869
809
  const trimmedText = text.trim();
870
810
  const effectiveAriaLabel = ariaLabel ?? (iconOnly && trimmedText ? trimmedText : void 0);
871
- const ariaLabelAttr = effectiveAriaLabel ? `aria-label="${escapeHtml(effectiveAriaLabel)}"` : "";
811
+ const ariaLabelAttr = effectiveAriaLabel ? `aria-label="${escapeHtml2(effectiveAriaLabel)}"` : "";
872
812
  const iconBeforeHtml = iconBefore && !loading ? `<span class="${iconOnly ? "" : "mr-2"}">${iconBefore}</span>` : "";
873
813
  const iconAfterHtml = iconAfter && !loading ? `<span class="${iconOnly ? "" : "ml-2"}">${iconAfter}</span>` : "";
874
814
  const loadingHtml = loading ? loadingSpinner : "";
875
- const textHtml = iconOnly ? "" : escapeHtml(text);
815
+ const textHtml = iconOnly ? "" : escapeHtml2(text);
876
816
  const contentHtml = `${loadingHtml}${iconBeforeHtml}${textHtml}${iconAfterHtml}`;
877
817
  if (href && !disabled && !loading && isValidHrefProtocol(href)) {
878
- return `<a href="${escapeHtml(
818
+ return `<a href="${escapeHtml2(
879
819
  href
880
820
  )}" class="${baseClasses}" ${idAttr} ${dataAttrs} ${ariaLabelAttr} ${targetAttr} ${relAttr}>
881
821
  ${contentHtml}
@@ -899,7 +839,7 @@ function buttonGroup(buttons, options = {}) {
899
839
  }
900
840
  const validatedOptions = validation.data;
901
841
  const { attached = false, direction = "horizontal", gap = "md", className = "" } = validatedOptions;
902
- const safeClassName = className ? escapeHtml(className) : "";
842
+ const safeClassName = className ? escapeHtml2(className) : "";
903
843
  if (attached) {
904
844
  const classes = direction === "horizontal" ? "inline-flex rounded-lg shadow-sm [&>*:first-child]:rounded-r-none [&>*:last-child]:rounded-l-none [&>*:not(:first-child):not(:last-child)]:rounded-none [&>*:not(:first-child)]:-ml-px" : "inline-flex flex-col rounded-lg shadow-sm [&>*:first-child]:rounded-b-none [&>*:last-child]:rounded-t-none [&>*:not(:first-child):not(:last-child)]:rounded-none [&>*:not(:first-child)]:-mt-px";
905
845
  return `<div class="${classes} ${safeClassName}">${buttons.join("")}</div>`;
@@ -936,7 +876,7 @@ function getSizeClasses2(size) {
936
876
  }
937
877
  function buildDataAttrs(data) {
938
878
  if (!data) return "";
939
- return Object.entries(data).map(([key, value]) => `data-${key}="${escapeHtml(value)}"`).join(" ");
879
+ return Object.entries(data).map(([key, value]) => `data-${key}="${escapeHtml2(value)}"`).join(" ");
940
880
  }
941
881
  function card(content, options = {}) {
942
882
  const {
@@ -957,18 +897,18 @@ function card(content, options = {}) {
957
897
  const clickableClasses = clickable ? "cursor-pointer hover:shadow-md transition-shadow" : "";
958
898
  const allClasses = [variantClasses, sizeClasses, clickableClasses, className].filter(Boolean).join(" ");
959
899
  const dataAttrs = buildDataAttrs(data);
960
- const idAttr = id ? `id="${escapeHtml(id)}"` : "";
900
+ const idAttr = id ? `id="${escapeHtml2(id)}"` : "";
961
901
  const hasHeader = title || subtitle || headerActions;
962
902
  const headerHtml = hasHeader ? `<div class="flex items-start justify-between mb-4">
963
903
  <div>
964
- ${title ? `<h3 class="text-lg font-semibold text-text-primary">${escapeHtml(title)}</h3>` : ""}
965
- ${subtitle ? `<p class="text-sm text-text-secondary mt-1">${escapeHtml(subtitle)}</p>` : ""}
904
+ ${title ? `<h3 class="text-lg font-semibold text-text-primary">${escapeHtml2(title)}</h3>` : ""}
905
+ ${subtitle ? `<p class="text-sm text-text-secondary mt-1">${escapeHtml2(subtitle)}</p>` : ""}
966
906
  </div>
967
907
  ${headerActions ? `<div class="flex items-center gap-2">${headerActions}</div>` : ""}
968
908
  </div>` : "";
969
909
  const footerHtml = footer ? `<div class="mt-4 pt-4 border-t border-divider">${footer}</div>` : "";
970
910
  if (href) {
971
- return `<a href="${escapeHtml(href)}" class="${allClasses}" ${idAttr} ${dataAttrs}>
911
+ return `<a href="${escapeHtml2(href)}" class="${allClasses}" ${idAttr} ${dataAttrs}>
972
912
  ${headerHtml}
973
913
  ${content}
974
914
  ${footerHtml}
@@ -1009,7 +949,7 @@ function getInputStateClasses(state) {
1009
949
  }
1010
950
  function buildDataAttrs2(data) {
1011
951
  if (!data) return "";
1012
- return Object.entries(data).map(([key, value]) => `data-${key}="${escapeHtml(value)}"`).join(" ");
952
+ return Object.entries(data).map(([key, value]) => `data-${key}="${escapeHtml2(value)}"`).join(" ");
1013
953
  }
1014
954
  function input(options) {
1015
955
  const {
@@ -1052,26 +992,26 @@ function input(options) {
1052
992
  const dataAttrs = buildDataAttrs2(data);
1053
993
  const inputAttrs = [
1054
994
  `type="${type}"`,
1055
- `name="${escapeHtml(name)}"`,
1056
- `id="${escapeHtml(id)}"`,
1057
- value ? `value="${escapeHtml(value)}"` : "",
1058
- placeholder ? `placeholder="${escapeHtml(placeholder)}"` : "",
995
+ `name="${escapeHtml2(name)}"`,
996
+ `id="${escapeHtml2(id)}"`,
997
+ value ? `value="${escapeHtml2(value)}"` : "",
998
+ placeholder ? `placeholder="${escapeHtml2(placeholder)}"` : "",
1059
999
  required ? "required" : "",
1060
1000
  disabled ? "disabled" : "",
1061
1001
  readonly ? "readonly" : "",
1062
- autocomplete ? `autocomplete="${escapeHtml(autocomplete)}"` : "",
1063
- pattern ? `pattern="${escapeHtml(pattern)}"` : "",
1064
- min !== void 0 ? `min="${escapeHtml(String(min))}"` : "",
1065
- max !== void 0 ? `max="${escapeHtml(String(max))}"` : "",
1066
- step !== void 0 ? `step="${escapeHtml(String(step))}"` : "",
1002
+ autocomplete ? `autocomplete="${escapeHtml2(autocomplete)}"` : "",
1003
+ pattern ? `pattern="${escapeHtml2(pattern)}"` : "",
1004
+ min !== void 0 ? `min="${escapeHtml2(String(min))}"` : "",
1005
+ max !== void 0 ? `max="${escapeHtml2(String(max))}"` : "",
1006
+ step !== void 0 ? `step="${escapeHtml2(String(step))}"` : "",
1067
1007
  `class="${baseClasses}"`,
1068
1008
  dataAttrs
1069
1009
  ].filter(Boolean).join(" ");
1070
- const labelHtml = label ? `<label for="${escapeHtml(id)}" class="block text-sm font-medium text-text-primary mb-1.5">
1071
- ${escapeHtml(label)}${required ? '<span class="text-danger ml-1">*</span>' : ""}
1010
+ const labelHtml = label ? `<label for="${escapeHtml2(id)}" class="block text-sm font-medium text-text-primary mb-1.5">
1011
+ ${escapeHtml2(label)}${required ? '<span class="text-danger ml-1">*</span>' : ""}
1072
1012
  </label>` : "";
1073
- const helperHtml = helper && !error ? `<p class="mt-1.5 text-sm text-text-secondary">${escapeHtml(helper)}</p>` : "";
1074
- const errorHtml = error ? `<p class="mt-1.5 text-sm text-danger">${escapeHtml(error)}</p>` : "";
1013
+ const helperHtml = helper && !error ? `<p class="mt-1.5 text-sm text-text-secondary">${escapeHtml2(helper)}</p>` : "";
1014
+ const errorHtml = error ? `<p class="mt-1.5 text-sm text-danger">${escapeHtml2(error)}</p>` : "";
1075
1015
  const iconBeforeHtml = iconBefore ? `<span class="absolute left-3 top-1/2 -translate-y-1/2 text-text-secondary">${iconBefore}</span>` : "";
1076
1016
  const iconAfterHtml = iconAfter ? `<span class="absolute right-3 top-1/2 -translate-y-1/2 text-text-secondary">${iconAfter}</span>` : "";
1077
1017
  const inputHtml = hasIcon ? `<div class="relative">
@@ -1118,18 +1058,18 @@ function select(options) {
1118
1058
  const optionsHtml = selectOptions.map((opt) => {
1119
1059
  const selected = opt.selected || opt.value === value ? "selected" : "";
1120
1060
  const optDisabled = opt.disabled ? "disabled" : "";
1121
- return `<option value="${escapeHtml(opt.value)}" ${selected} ${optDisabled}>${escapeHtml(opt.label)}</option>`;
1061
+ return `<option value="${escapeHtml2(opt.value)}" ${selected} ${optDisabled}>${escapeHtml2(opt.label)}</option>`;
1122
1062
  }).join("\n");
1123
- const labelHtml = label ? `<label for="${escapeHtml(id)}" class="block text-sm font-medium text-text-primary mb-1.5">
1124
- ${escapeHtml(label)}${required ? '<span class="text-danger ml-1">*</span>' : ""}
1063
+ const labelHtml = label ? `<label for="${escapeHtml2(id)}" class="block text-sm font-medium text-text-primary mb-1.5">
1064
+ ${escapeHtml2(label)}${required ? '<span class="text-danger ml-1">*</span>' : ""}
1125
1065
  </label>` : "";
1126
- const helperHtml = helper && !error ? `<p class="mt-1.5 text-sm text-text-secondary">${escapeHtml(helper)}</p>` : "";
1127
- const errorHtml = error ? `<p class="mt-1.5 text-sm text-danger">${escapeHtml(error)}</p>` : "";
1066
+ const helperHtml = helper && !error ? `<p class="mt-1.5 text-sm text-text-secondary">${escapeHtml2(helper)}</p>` : "";
1067
+ const errorHtml = error ? `<p class="mt-1.5 text-sm text-danger">${escapeHtml2(error)}</p>` : "";
1128
1068
  return `<div class="form-field">
1129
1069
  ${labelHtml}
1130
1070
  <select
1131
- name="${escapeHtml(name)}"
1132
- id="${escapeHtml(id)}"
1071
+ name="${escapeHtml2(name)}"
1072
+ id="${escapeHtml2(id)}"
1133
1073
  class="${baseClasses}"
1134
1074
  ${required ? "required" : ""}
1135
1075
  ${disabled ? "disabled" : ""}
@@ -1180,24 +1120,24 @@ function textarea(options) {
1180
1120
  className
1181
1121
  ].filter(Boolean).join(" ");
1182
1122
  const dataAttrs = buildDataAttrs2(data);
1183
- const labelHtml = label ? `<label for="${escapeHtml(id)}" class="block text-sm font-medium text-text-primary mb-1.5">
1184
- ${escapeHtml(label)}${required ? '<span class="text-danger ml-1">*</span>' : ""}
1123
+ const labelHtml = label ? `<label for="${escapeHtml2(id)}" class="block text-sm font-medium text-text-primary mb-1.5">
1124
+ ${escapeHtml2(label)}${required ? '<span class="text-danger ml-1">*</span>' : ""}
1185
1125
  </label>` : "";
1186
- const helperHtml = helper && !error ? `<p class="mt-1.5 text-sm text-text-secondary">${escapeHtml(helper)}</p>` : "";
1187
- const errorHtml = error ? `<p class="mt-1.5 text-sm text-danger">${escapeHtml(error)}</p>` : "";
1126
+ const helperHtml = helper && !error ? `<p class="mt-1.5 text-sm text-text-secondary">${escapeHtml2(helper)}</p>` : "";
1127
+ const errorHtml = error ? `<p class="mt-1.5 text-sm text-danger">${escapeHtml2(error)}</p>` : "";
1188
1128
  return `<div class="form-field">
1189
1129
  ${labelHtml}
1190
1130
  <textarea
1191
- name="${escapeHtml(name)}"
1192
- id="${escapeHtml(id)}"
1131
+ name="${escapeHtml2(name)}"
1132
+ id="${escapeHtml2(id)}"
1193
1133
  rows="${rows}"
1194
1134
  class="${baseClasses}"
1195
- ${placeholder ? `placeholder="${escapeHtml(placeholder)}"` : ""}
1135
+ ${placeholder ? `placeholder="${escapeHtml2(placeholder)}"` : ""}
1196
1136
  ${required ? "required" : ""}
1197
1137
  ${disabled ? "disabled" : ""}
1198
1138
  ${readonly ? "readonly" : ""}
1199
1139
  ${dataAttrs}
1200
- >${escapeHtml(value)}</textarea>
1140
+ >${escapeHtml2(value)}</textarea>
1201
1141
  ${helperHtml}
1202
1142
  ${errorHtml}
1203
1143
  </div>`;
@@ -1219,21 +1159,21 @@ function checkbox(options) {
1219
1159
  "focus:ring-2 focus:ring-primary/20 focus:ring-offset-0",
1220
1160
  disabled ? "opacity-50 cursor-not-allowed" : "cursor-pointer"
1221
1161
  ].join(" ");
1222
- const helperHtml = helper && !error ? `<p class="text-sm text-text-secondary">${escapeHtml(helper)}</p>` : "";
1223
- const errorHtml = error ? `<p class="text-sm text-danger">${escapeHtml(error)}</p>` : "";
1162
+ const helperHtml = helper && !error ? `<p class="text-sm text-text-secondary">${escapeHtml2(helper)}</p>` : "";
1163
+ const errorHtml = error ? `<p class="text-sm text-danger">${escapeHtml2(error)}</p>` : "";
1224
1164
  return `<div class="form-field ${className}">
1225
1165
  <label class="flex items-start gap-3 ${disabled ? "cursor-not-allowed" : "cursor-pointer"}">
1226
1166
  <input
1227
1167
  type="checkbox"
1228
- name="${escapeHtml(name)}"
1229
- id="${escapeHtml(id)}"
1230
- value="${escapeHtml(value)}"
1168
+ name="${escapeHtml2(name)}"
1169
+ id="${escapeHtml2(id)}"
1170
+ value="${escapeHtml2(value)}"
1231
1171
  class="${checkboxClasses}"
1232
1172
  ${checked ? "checked" : ""}
1233
1173
  ${disabled ? "disabled" : ""}
1234
1174
  >
1235
1175
  <div>
1236
- <span class="text-sm font-medium text-text-primary">${escapeHtml(label)}</span>
1176
+ <span class="text-sm font-medium text-text-primary">${escapeHtml2(label)}</span>
1237
1177
  ${helperHtml}
1238
1178
  ${errorHtml}
1239
1179
  </div>
@@ -1252,19 +1192,19 @@ function radioGroup(options) {
1252
1192
  return `<label class="flex items-center gap-2 ${cursorClass}">
1253
1193
  <input
1254
1194
  type="radio"
1255
- name="${escapeHtml(name)}"
1256
- id="${escapeHtml(radioId)}"
1257
- value="${escapeHtml(opt.value)}"
1195
+ name="${escapeHtml2(name)}"
1196
+ id="${escapeHtml2(radioId)}"
1197
+ value="${escapeHtml2(opt.value)}"
1258
1198
  class="${radioClasses}"
1259
1199
  ${checked}
1260
1200
  ${disabled}
1261
1201
  >
1262
- <span class="text-sm text-text-primary">${escapeHtml(opt.label)}</span>
1202
+ <span class="text-sm text-text-primary">${escapeHtml2(opt.label)}</span>
1263
1203
  </label>`;
1264
1204
  }).join("\n");
1265
- const labelHtml = label ? `<label class="block text-sm font-medium text-text-primary mb-2">${escapeHtml(label)}</label>` : "";
1266
- const helperHtml = helper && !error ? `<p class="mt-1.5 text-sm text-text-secondary">${escapeHtml(helper)}</p>` : "";
1267
- const errorHtml = error ? `<p class="mt-1.5 text-sm text-danger">${escapeHtml(error)}</p>` : "";
1205
+ const labelHtml = label ? `<label class="block text-sm font-medium text-text-primary mb-2">${escapeHtml2(label)}</label>` : "";
1206
+ const helperHtml = helper && !error ? `<p class="mt-1.5 text-sm text-text-secondary">${escapeHtml2(helper)}</p>` : "";
1207
+ const errorHtml = error ? `<p class="mt-1.5 text-sm text-danger">${escapeHtml2(error)}</p>` : "";
1268
1208
  return `<div class="form-field ${className}" role="radiogroup">
1269
1209
  ${labelHtml}
1270
1210
  <div class="${directionClasses}">
@@ -1277,10 +1217,10 @@ function radioGroup(options) {
1277
1217
  function form(content, options = {}) {
1278
1218
  const { action, method = "post", id, className = "", preventDefault = false, autocomplete, enctype } = options;
1279
1219
  const attrs = [
1280
- action ? `action="${escapeHtml(action)}"` : "",
1220
+ action ? `action="${escapeHtml2(action)}"` : "",
1281
1221
  `method="${method}"`,
1282
- id ? `id="${escapeHtml(id)}"` : "",
1283
- className ? `class="${escapeHtml(className)}"` : "",
1222
+ id ? `id="${escapeHtml2(id)}"` : "",
1223
+ className ? `class="${escapeHtml2(className)}"` : "",
1284
1224
  autocomplete ? `autocomplete="${autocomplete}"` : "",
1285
1225
  enctype ? `enctype="${enctype}"` : "",
1286
1226
  preventDefault ? 'onsubmit="return false;"' : ""
@@ -1297,8 +1237,8 @@ function formRow(fields, options = {}) {
1297
1237
  function formSection(content, options = {}) {
1298
1238
  const { title, description, className = "" } = options;
1299
1239
  const headerHtml = title ? `<div class="mb-4">
1300
- <h3 class="text-lg font-semibold text-text-primary">${escapeHtml(title)}</h3>
1301
- ${description ? `<p class="text-sm text-text-secondary mt-1">${escapeHtml(description)}</p>` : ""}
1240
+ <h3 class="text-lg font-semibold text-text-primary">${escapeHtml2(title)}</h3>
1241
+ ${description ? `<p class="text-sm text-text-secondary mt-1">${escapeHtml2(description)}</p>` : ""}
1302
1242
  </div>` : "";
1303
1243
  return `<div class="form-section ${className}">
1304
1244
  ${headerHtml}
@@ -1320,7 +1260,7 @@ function formActions(buttons, options = {}) {
1320
1260
  </div>`;
1321
1261
  }
1322
1262
  function hiddenInput(name, value) {
1323
- return `<input type="hidden" name="${escapeHtml(name)}" value="${escapeHtml(value)}">`;
1263
+ return `<input type="hidden" name="${escapeHtml2(name)}" value="${escapeHtml2(value)}">`;
1324
1264
  }
1325
1265
  function csrfInput(token) {
1326
1266
  return hiddenInput("_csrf", token);
@@ -1378,7 +1318,7 @@ function badge(text, options = {}) {
1378
1318
  outline: "border border-current"
1379
1319
  };
1380
1320
  const dotClasses = ["inline-block rounded-full", getSizeClasses3(size, true), dotVariants[variant], className].filter(Boolean).join(" ");
1381
- return `<span class="${dotClasses}" aria-label="${escapeHtml(text)}" title="${escapeHtml(text)}"></span>`;
1321
+ return `<span class="${dotClasses}" aria-label="${escapeHtml2(text)}" title="${escapeHtml2(text)}"></span>`;
1382
1322
  }
1383
1323
  const variantClasses = getVariantClasses3(variant);
1384
1324
  const sizeClasses = getSizeClasses3(size, false);
@@ -1401,7 +1341,7 @@ function badge(text, options = {}) {
1401
1341
  </svg>
1402
1342
  </button>` : "";
1403
1343
  return `<span class="${baseClasses}">
1404
- ${iconHtml}${escapeHtml(text)}${removeHtml}
1344
+ ${iconHtml}${escapeHtml2(text)}${removeHtml}
1405
1345
  </span>`;
1406
1346
  }
1407
1347
  function badgeGroup(badges, options = {}) {
@@ -1472,7 +1412,7 @@ function alert(message, options = {}) {
1472
1412
  const iconHtml = showIcon ? `<div class="flex-shrink-0 ${variantClasses.icon}">
1473
1413
  ${icon || alertIcons[variant]}
1474
1414
  </div>` : "";
1475
- const titleHtml = title ? `<h3 class="font-semibold">${escapeHtml(title)}</h3>` : "";
1415
+ const titleHtml = title ? `<h3 class="font-semibold">${escapeHtml2(title)}</h3>` : "";
1476
1416
  const dismissHtml = dismissible ? `<button
1477
1417
  type="button"
1478
1418
  class="flex-shrink-0 ml-auto -mr-1 -mt-1 p-1 rounded hover:bg-black/5 transition-colors"
@@ -1484,13 +1424,13 @@ function alert(message, options = {}) {
1484
1424
  </svg>
1485
1425
  </button>` : "";
1486
1426
  const actionsHtml = actions ? `<div class="mt-3">${actions}</div>` : "";
1487
- const idAttr = id ? `id="${escapeHtml(id)}"` : "";
1427
+ const idAttr = id ? `id="${escapeHtml2(id)}"` : "";
1488
1428
  return `<div class="alert ${baseClasses}" role="alert" ${idAttr}>
1489
1429
  <div class="flex gap-3">
1490
1430
  ${iconHtml}
1491
1431
  <div class="flex-1">
1492
1432
  ${titleHtml}
1493
- <div class="${title ? "mt-1" : ""}">${escapeHtml(message)}</div>
1433
+ <div class="${title ? "mt-1" : ""}">${escapeHtml2(message)}</div>
1494
1434
  ${actionsHtml}
1495
1435
  </div>
1496
1436
  ${dismissHtml}
@@ -1512,7 +1452,7 @@ function toast(message, options = {}) {
1512
1452
  "top-center": "top-4 left-1/2 -translate-x-1/2",
1513
1453
  "bottom-center": "bottom-4 left-1/2 -translate-x-1/2"
1514
1454
  };
1515
- const titleHtml = title ? `<h4 class="font-semibold">${escapeHtml(title)}</h4>` : "";
1455
+ const titleHtml = title ? `<h4 class="font-semibold">${escapeHtml2(title)}</h4>` : "";
1516
1456
  const autoDismissScript = duration > 0 ? `<script>
1517
1457
  setTimeout(() => {
1518
1458
  const toast = document.getElementById('${id}');
@@ -1523,7 +1463,7 @@ function toast(message, options = {}) {
1523
1463
  }, ${duration});
1524
1464
  </script>` : "";
1525
1465
  return `<div
1526
- id="${escapeHtml(id)}"
1466
+ id="${escapeHtml2(id)}"
1527
1467
  class="fixed ${positionClasses[position]} z-50 min-w-[300px] max-w-md rounded-lg border shadow-lg ${variantClasses.container} transition-all duration-300 transform"
1528
1468
  role="alert"
1529
1469
  >
@@ -1533,7 +1473,7 @@ function toast(message, options = {}) {
1533
1473
  </div>
1534
1474
  <div class="flex-1">
1535
1475
  ${titleHtml}
1536
- <p class="${title ? "mt-1 text-sm opacity-90" : ""}">${escapeHtml(message)}</p>
1476
+ <p class="${title ? "mt-1 text-sm opacity-90" : ""}">${escapeHtml2(message)}</p>
1537
1477
  </div>
1538
1478
  <button
1539
1479
  type="button"
@@ -1558,7 +1498,7 @@ function toastContainer(position = "top-right", id = "toast-container") {
1558
1498
  "top-center": "top-4 left-1/2 -translate-x-1/2",
1559
1499
  "bottom-center": "bottom-4 left-1/2 -translate-x-1/2"
1560
1500
  };
1561
- return `<div id="${escapeHtml(id)}" class="fixed ${positionClasses[position]} z-50 flex flex-col gap-2"></div>`;
1501
+ return `<div id="${escapeHtml2(id)}" class="fixed ${positionClasses[position]} z-50 flex flex-col gap-2"></div>`;
1562
1502
  }
1563
1503
 
1564
1504
  // libs/ui/src/components/avatar.ts
@@ -1631,7 +1571,7 @@ function avatar(options) {
1631
1571
  shapeClasses,
1632
1572
  className
1633
1573
  ].filter(Boolean).join(" ");
1634
- const contentHtml = src ? `<img src="${escapeHtml(src)}" alt="${escapeHtml(alt)}" class="w-full h-full object-cover">` : `<span class="font-medium text-white ${sizeClasses.text}">${escapeHtml(displayInitials)}</span>`;
1574
+ const contentHtml = src ? `<img src="${escapeHtml2(src)}" alt="${escapeHtml2(alt)}" class="w-full h-full object-cover">` : `<span class="font-medium text-white ${sizeClasses.text}">${escapeHtml2(displayInitials)}</span>`;
1635
1575
  const bgClasses = src ? "bg-gray-200" : displayBgColor;
1636
1576
  const statusHtml = status !== "none" ? `<span class="absolute bottom-0 right-0 block ${sizeClasses.status} ${shapeClasses} ${statusColor} border-white"></span>` : "";
1637
1577
  const innerHtml = `
@@ -1641,7 +1581,7 @@ function avatar(options) {
1641
1581
  </div>
1642
1582
  `;
1643
1583
  if (href) {
1644
- return `<a href="${escapeHtml(href)}" class="inline-block">${innerHtml}</a>`;
1584
+ return `<a href="${escapeHtml2(href)}" class="inline-block">${innerHtml}</a>`;
1645
1585
  }
1646
1586
  return innerHtml;
1647
1587
  }
@@ -1676,8 +1616,8 @@ function avatarWithText(options) {
1676
1616
  const avatarHtml = avatar({ ...avatarOptions, alt: avatarOptions.alt || name });
1677
1617
  const textHtml = `
1678
1618
  <div class="${align === "right" ? "text-right" : ""}">
1679
- <div class="font-medium text-text-primary">${escapeHtml(name)}</div>
1680
- ${subtitle ? `<div class="text-sm text-text-secondary">${escapeHtml(subtitle)}</div>` : ""}
1619
+ <div class="font-medium text-text-primary">${escapeHtml2(name)}</div>
1620
+ ${subtitle ? `<div class="text-sm text-text-secondary">${escapeHtml2(subtitle)}</div>` : ""}
1681
1621
  </div>
1682
1622
  `;
1683
1623
  const flexDirection = align === "right" ? "flex-row-reverse" : "flex-row";
@@ -1722,12 +1662,12 @@ function modal(content, options) {
1722
1662
  const sizeClasses = getSizeClasses5(size);
1723
1663
  const visibilityClasses = open ? "" : "hidden";
1724
1664
  const headerHtml = title || showClose ? `<div class="flex items-center justify-between p-4 border-b border-divider">
1725
- ${title ? `<h3 class="text-lg font-semibold text-text-primary">${escapeHtml(title)}</h3>` : "<div></div>"}
1665
+ ${title ? `<h3 class="text-lg font-semibold text-text-primary">${escapeHtml2(title)}</h3>` : "<div></div>"}
1726
1666
  ${showClose ? `
1727
1667
  <button
1728
1668
  type="button"
1729
1669
  class="p-1 rounded-lg text-text-secondary hover:text-text-primary hover:bg-gray-100 transition-colors"
1730
- onclick="document.getElementById('${escapeHtml(id)}').classList.add('hidden')"
1670
+ onclick="document.getElementById('${escapeHtml2(id)}').classList.add('hidden')"
1731
1671
  aria-label="Close"
1732
1672
  >
1733
1673
  <svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
@@ -1743,18 +1683,18 @@ function modal(content, options) {
1743
1683
  const escapeHandler = closeOnEscape ? `<script>
1744
1684
  document.addEventListener('keydown', function(e) {
1745
1685
  if (e.key === 'Escape') {
1746
- document.getElementById('${escapeHtml(id)}')?.classList.add('hidden');
1686
+ document.getElementById('${escapeHtml2(id)}')?.classList.add('hidden');
1747
1687
  }
1748
1688
  });
1749
1689
  </script>` : "";
1750
1690
  return `
1751
1691
  <div
1752
- id="${escapeHtml(id)}"
1692
+ id="${escapeHtml2(id)}"
1753
1693
  class="fixed inset-0 z-50 overflow-y-auto ${visibilityClasses}"
1754
1694
  ${backdropClickHandler}
1755
1695
  role="dialog"
1756
1696
  aria-modal="true"
1757
- aria-labelledby="${escapeHtml(id)}-title"
1697
+ aria-labelledby="${escapeHtml2(id)}-title"
1758
1698
  >
1759
1699
  <!-- Backdrop -->
1760
1700
  <div class="fixed inset-0 bg-black/50 transition-opacity"></div>
@@ -1777,7 +1717,7 @@ function modalTrigger(triggerContent, modalId, options = {}) {
1777
1717
  const { className = "", tag = "button" } = options;
1778
1718
  const attrs = `
1779
1719
  class="${className}"
1780
- onclick="document.getElementById('${escapeHtml(modalId)}').classList.remove('hidden')"
1720
+ onclick="document.getElementById('${escapeHtml2(modalId)}').classList.remove('hidden')"
1781
1721
  `;
1782
1722
  if (tag === "button") {
1783
1723
  return `<button type="button" ${attrs}>${triggerContent}</button>`;
@@ -1822,29 +1762,29 @@ function confirmModal(options) {
1822
1762
  <div class="mx-auto w-12 h-12 rounded-full ${iconColors[variant]} flex items-center justify-center mb-4">
1823
1763
  ${displayIcon}
1824
1764
  </div>
1825
- <h3 class="text-lg font-semibold text-text-primary mb-2">${escapeHtml(title)}</h3>
1826
- <p class="text-text-secondary">${escapeHtml(message)}</p>
1765
+ <h3 class="text-lg font-semibold text-text-primary mb-2">${escapeHtml2(title)}</h3>
1766
+ <p class="text-text-secondary">${escapeHtml2(message)}</p>
1827
1767
  </div>
1828
1768
  `;
1829
1769
  const confirmButton = confirmHref && isSafeUrl(confirmHref) ? `<a
1830
- href="${escapeHtml(confirmHref)}"
1770
+ href="${escapeHtml2(confirmHref)}"
1831
1771
  class="px-4 py-2 rounded-lg ${variantClasses[variant]} transition-colors"
1832
1772
  >
1833
- ${escapeHtml(confirmText)}
1773
+ ${escapeHtml2(confirmText)}
1834
1774
  </a>` : `<button
1835
1775
  type="button"
1836
1776
  class="px-4 py-2 rounded-lg ${variantClasses[variant]} transition-colors"
1837
- onclick="document.getElementById('${escapeHtml(id)}').classList.add('hidden')"
1777
+ onclick="document.getElementById('${escapeHtml2(id)}').classList.add('hidden')"
1838
1778
  >
1839
- ${escapeHtml(confirmText)}
1779
+ ${escapeHtml2(confirmText)}
1840
1780
  </button>`;
1841
1781
  const footer = `
1842
1782
  <button
1843
1783
  type="button"
1844
1784
  class="px-4 py-2 rounded-lg border border-border text-text-primary hover:bg-gray-50 transition-colors"
1845
- onclick="document.getElementById('${escapeHtml(id)}').classList.add('hidden')"
1785
+ onclick="document.getElementById('${escapeHtml2(id)}').classList.add('hidden')"
1846
1786
  >
1847
- ${escapeHtml(cancelText)}
1787
+ ${escapeHtml2(cancelText)}
1848
1788
  </button>
1849
1789
  ${confirmButton}
1850
1790
  `;
@@ -1887,12 +1827,12 @@ function drawer(content, options) {
1887
1827
  };
1888
1828
  const visibilityClasses = open ? "" : "hidden";
1889
1829
  const headerHtml = title || showClose ? `<div class="flex items-center justify-between p-4 border-b border-divider">
1890
- ${title ? `<h3 class="text-lg font-semibold text-text-primary">${escapeHtml(title)}</h3>` : "<div></div>"}
1830
+ ${title ? `<h3 class="text-lg font-semibold text-text-primary">${escapeHtml2(title)}</h3>` : "<div></div>"}
1891
1831
  ${showClose ? `
1892
1832
  <button
1893
1833
  type="button"
1894
1834
  class="p-1 rounded-lg text-text-secondary hover:text-text-primary hover:bg-gray-100 transition-colors"
1895
- onclick="document.getElementById('${escapeHtml(id)}').classList.add('hidden')"
1835
+ onclick="document.getElementById('${escapeHtml2(id)}').classList.add('hidden')"
1896
1836
  aria-label="Close"
1897
1837
  >
1898
1838
  <svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
@@ -1905,7 +1845,7 @@ function drawer(content, options) {
1905
1845
  const backdropClickHandler = closeOnBackdrop ? `onclick="if (event.target === this) this.classList.add('hidden')"` : "";
1906
1846
  return `
1907
1847
  <div
1908
- id="${escapeHtml(id)}"
1848
+ id="${escapeHtml2(id)}"
1909
1849
  class="fixed inset-0 z-50 ${visibilityClasses}"
1910
1850
  ${backdropClickHandler}
1911
1851
  role="dialog"
@@ -1968,9 +1908,9 @@ function buildTableHeader(columns, options) {
1968
1908
  class="${paddingClass} ${alignClass} font-semibold text-text-primary ${sortableClasses} ${col.headerClass || ""}"
1969
1909
  ${widthStyle}
1970
1910
  >
1971
- ${col.sortable ? `<span class="inline-flex items-center">${escapeHtml(col.header)}${buildSortIndicator(
1911
+ ${col.sortable ? `<span class="inline-flex items-center">${escapeHtml2(col.header)}${buildSortIndicator(
1972
1912
  col.sortDirection || null
1973
- )}</span>` : escapeHtml(col.header)}
1913
+ )}</span>` : escapeHtml2(col.header)}
1974
1914
  </th>`;
1975
1915
  }).join("\n");
1976
1916
  return `<thead class="bg-gray-50 border-b border-border">
@@ -2007,20 +1947,20 @@ function buildTableBody(data, columns, options) {
2007
1947
  bordered ? "border-b border-border" : "",
2008
1948
  onRowClick ? "cursor-pointer" : ""
2009
1949
  ].filter(Boolean).join(" ");
2010
- const clickHandler = onRowClick ? `onclick="window.location.href='${escapeHtml(onRowClick.replace("{key}", rowId))}'"` : "";
1950
+ const clickHandler = onRowClick ? `onclick="window.location.href='${escapeHtml2(onRowClick.replace("{key}", rowId))}'"` : "";
2011
1951
  const selectCell = selectable ? `<td class="${paddingClass}" onclick="event.stopPropagation()">
2012
1952
  <input
2013
1953
  type="checkbox"
2014
1954
  class="w-4 h-4 rounded border-border text-primary focus:ring-primary/20"
2015
1955
  name="selected[]"
2016
- value="${escapeHtml(rowId)}"
1956
+ value="${escapeHtml2(rowId)}"
2017
1957
  aria-label="Select row"
2018
1958
  >
2019
1959
  </td>` : "";
2020
1960
  const cells = columns.map((col) => {
2021
1961
  const value = row[col.key];
2022
1962
  const alignClass = getAlignClasses(col.align);
2023
- const cellContent = col.render ? col.render(value, row, rowIndex) : escapeHtml(String(value ?? ""));
1963
+ const cellContent = col.render ? col.render(value, row, rowIndex) : escapeHtml2(String(value ?? ""));
2024
1964
  return `<td class="${paddingClass} ${alignClass} ${col.cellClass || ""}">${cellContent}</td>`;
2025
1965
  }).join("\n");
2026
1966
  return `<tr class="${rowClasses}" ${clickHandler}>
@@ -2042,7 +1982,7 @@ function table(data, options) {
2042
1982
  const { id, bordered, stickyHeader, className = "", loading = false } = options;
2043
1983
  const tableClasses = ["w-full", bordered ? "border border-border" : "", "text-sm"].filter(Boolean).join(" ");
2044
1984
  const wrapperClasses = ["relative overflow-x-auto", stickyHeader ? "max-h-96 overflow-y-auto" : "", className].filter(Boolean).join(" ");
2045
- const idAttr = id ? `id="${escapeHtml(id)}"` : "";
1985
+ const idAttr = id ? `id="${escapeHtml2(id)}"` : "";
2046
1986
  const header = buildTableHeader(options.columns, options);
2047
1987
  const body = buildTableBody(data, options.columns, options);
2048
1988
  const loadingOverlay = loading ? buildLoadingOverlay() : "";
@@ -2072,7 +2012,7 @@ function pagination(options) {
2072
2012
  return `<span class="${baseClasses} ${stateClasses}">${label}</span>`;
2073
2013
  }
2074
2014
  const pageUrl = baseUrl ? `${baseUrl}${baseUrl.includes("?") ? "&" : "?"}page=${pageNum}` : `?page=${pageNum}`;
2075
- return `<a href="${escapeHtml(pageUrl)}" class="${baseClasses} ${stateClasses}">${label}</a>`;
2015
+ return `<a href="${escapeHtml2(pageUrl)}" class="${baseClasses} ${stateClasses}">${label}</a>`;
2076
2016
  };
2077
2017
  const pageNumbers = [];
2078
2018
  const maxVisible = 5;
@@ -2170,19 +2110,19 @@ function getPermissionIcon(scope, customIcon) {
2170
2110
  }
2171
2111
  function permissionList(permissions, options = {}) {
2172
2112
  const { id, checkable = false, inputName = "scopes", title, className = "" } = options;
2173
- const titleHtml = title ? `<h4 class="font-medium text-text-primary mb-3">${escapeHtml(title)}</h4>` : "";
2113
+ const titleHtml = title ? `<h4 class="font-medium text-text-primary mb-3">${escapeHtml2(title)}</h4>` : "";
2174
2114
  const itemsHtml = permissions.map((perm, index) => {
2175
2115
  const icon = getPermissionIcon(perm.scope, perm.icon);
2176
2116
  const sensitiveClasses = perm.sensitive ? "border-warning/30 bg-warning/5" : "border-border";
2177
2117
  const sensitiveLabel = perm.sensitive ? '<span class="text-xs text-warning font-medium ml-2">Sensitive</span>' : "";
2178
2118
  const checkboxHtml = checkable ? `<input
2179
2119
  type="checkbox"
2180
- name="${escapeHtml(inputName)}[]"
2181
- value="${escapeHtml(perm.scope)}"
2120
+ name="${escapeHtml2(inputName)}[]"
2121
+ value="${escapeHtml2(perm.scope)}"
2182
2122
  class="w-4 h-4 rounded border-border text-primary focus:ring-primary/20"
2183
2123
  ${perm.checked || perm.required ? "checked" : ""}
2184
2124
  ${perm.required ? "disabled" : ""}
2185
- id="${id ? escapeHtml(id) : "perm"}-${index}"
2125
+ id="${id ? escapeHtml2(id) : "perm"}-${index}"
2186
2126
  >` : `<div class="w-5 h-5 rounded-full bg-success/10 text-success flex items-center justify-center">
2187
2127
  <svg class="w-3 h-3" fill="none" stroke="currentColor" viewBox="0 0 24 24">
2188
2128
  <path stroke-linecap="round" stroke-linejoin="round" stroke-width="3" d="M5 13l4 4L19 7"/>
@@ -2194,18 +2134,18 @@ function permissionList(permissions, options = {}) {
2194
2134
  </div>
2195
2135
  <div class="flex-1 min-w-0">
2196
2136
  <div class="flex items-center">
2197
- <span class="font-medium text-text-primary">${escapeHtml(perm.name)}</span>
2137
+ <span class="font-medium text-text-primary">${escapeHtml2(perm.name)}</span>
2198
2138
  ${perm.required ? '<span class="text-xs text-text-secondary ml-2">(Required)</span>' : ""}
2199
2139
  ${sensitiveLabel}
2200
2140
  </div>
2201
- ${perm.description ? `<p class="text-sm text-text-secondary mt-0.5">${escapeHtml(perm.description)}</p>` : ""}
2141
+ ${perm.description ? `<p class="text-sm text-text-secondary mt-0.5">${escapeHtml2(perm.description)}</p>` : ""}
2202
2142
  </div>
2203
2143
  <div class="flex-shrink-0">
2204
2144
  ${checkboxHtml}
2205
2145
  </div>
2206
2146
  </div>`;
2207
2147
  }).join("\n");
2208
- const idAttr = id ? `id="${escapeHtml(id)}"` : "";
2148
+ const idAttr = id ? `id="${escapeHtml2(id)}"` : "";
2209
2149
  return `<div class="permission-list ${className}" ${idAttr}>
2210
2150
  ${titleHtml}
2211
2151
  <div class="space-y-2">
@@ -2235,8 +2175,8 @@ function featureList(features, options = {}) {
2235
2175
  return `<li class="flex items-start gap-3">
2236
2176
  <div class="flex-shrink-0 mt-0.5">${iconHtml}</div>
2237
2177
  <div class="flex-1">
2238
- <span class="${textClasses}">${escapeHtml(feature.name)}</span>
2239
- ${feature.description ? `<p class="text-sm text-text-secondary">${escapeHtml(feature.description)}</p>` : ""}
2178
+ <span class="${textClasses}">${escapeHtml2(feature.name)}</span>
2179
+ ${feature.description ? `<p class="text-sm text-text-secondary">${escapeHtml2(feature.description)}</p>` : ""}
2240
2180
  </div>
2241
2181
  </li>`;
2242
2182
  }).join("\n");
@@ -2258,7 +2198,7 @@ function descriptionList(items, options = {}) {
2258
2198
  const hasCopyable = items.some((item) => item.copyable);
2259
2199
  if (layout === "horizontal") {
2260
2200
  const itemsHtml2 = items.map((item) => {
2261
- const copyBtn = item.copyable ? `<button type="button" onclick="copyToClipboard('${escapeHtml(
2201
+ const copyBtn = item.copyable ? `<button type="button" onclick="copyToClipboard('${escapeHtml2(
2262
2202
  item.description
2263
2203
  )}', this)" class="ml-2 p-1 rounded hover:bg-gray-100 transition-colors">
2264
2204
  <svg class="w-4 h-4 text-text-secondary" fill="none" stroke="currentColor" viewBox="0 0 24 24">
@@ -2266,9 +2206,9 @@ function descriptionList(items, options = {}) {
2266
2206
  </svg>
2267
2207
  </button>` : "";
2268
2208
  return `<div class="py-3 sm:grid sm:grid-cols-3 sm:gap-4 ${dividers ? "border-b border-divider" : ""}">
2269
- <dt class="text-sm font-medium text-text-secondary">${escapeHtml(item.term)}</dt>
2209
+ <dt class="text-sm font-medium text-text-secondary">${escapeHtml2(item.term)}</dt>
2270
2210
  <dd class="mt-1 sm:mt-0 sm:col-span-2 text-sm text-text-primary flex items-center">
2271
- ${escapeHtml(item.description)}
2211
+ ${escapeHtml2(item.description)}
2272
2212
  ${copyBtn}
2273
2213
  </dd>
2274
2214
  </div>`;
@@ -2277,7 +2217,7 @@ function descriptionList(items, options = {}) {
2277
2217
  }
2278
2218
  if (layout === "grid") {
2279
2219
  const itemsHtml2 = items.map((item) => {
2280
- const copyBtn = item.copyable ? `<button type="button" onclick="copyToClipboard('${escapeHtml(
2220
+ const copyBtn = item.copyable ? `<button type="button" onclick="copyToClipboard('${escapeHtml2(
2281
2221
  item.description
2282
2222
  )}', this)" class="absolute top-2 right-2 p-1 rounded hover:bg-gray-100 transition-colors">
2283
2223
  <svg class="w-4 h-4 text-text-secondary" fill="none" stroke="currentColor" viewBox="0 0 24 24">
@@ -2285,15 +2225,15 @@ function descriptionList(items, options = {}) {
2285
2225
  </svg>
2286
2226
  </button>` : "";
2287
2227
  return `<div class="relative p-4 bg-gray-50 rounded-lg">
2288
- <dt class="text-sm font-medium text-text-secondary">${escapeHtml(item.term)}</dt>
2289
- <dd class="mt-1 text-sm text-text-primary font-medium">${escapeHtml(item.description)}</dd>
2228
+ <dt class="text-sm font-medium text-text-secondary">${escapeHtml2(item.term)}</dt>
2229
+ <dd class="mt-1 text-sm text-text-primary font-medium">${escapeHtml2(item.description)}</dd>
2290
2230
  ${copyBtn}
2291
2231
  </div>`;
2292
2232
  }).join("\n");
2293
2233
  return `<dl class="grid grid-cols-2 gap-4 ${className}">${itemsHtml2}</dl>${hasCopyable ? copyScript : ""}`;
2294
2234
  }
2295
2235
  const itemsHtml = items.map((item) => {
2296
- const copyBtn = item.copyable ? `<button type="button" onclick="copyToClipboard('${escapeHtml(
2236
+ const copyBtn = item.copyable ? `<button type="button" onclick="copyToClipboard('${escapeHtml2(
2297
2237
  item.description
2298
2238
  )}', this)" class="ml-2 p-1 rounded hover:bg-gray-100 transition-colors">
2299
2239
  <svg class="w-4 h-4 text-text-secondary" fill="none" stroke="currentColor" viewBox="0 0 24 24">
@@ -2301,9 +2241,9 @@ function descriptionList(items, options = {}) {
2301
2241
  </svg>
2302
2242
  </button>` : "";
2303
2243
  return `<div class="${dividers ? "py-3 border-b border-divider last:border-0" : "py-2"}">
2304
- <dt class="text-sm text-text-secondary">${escapeHtml(item.term)}</dt>
2244
+ <dt class="text-sm text-text-secondary">${escapeHtml2(item.term)}</dt>
2305
2245
  <dd class="mt-1 text-sm text-text-primary font-medium flex items-center">
2306
- ${escapeHtml(item.description)}
2246
+ ${escapeHtml2(item.description)}
2307
2247
  ${copyBtn}
2308
2248
  </dd>
2309
2249
  </div>`;
@@ -2320,10 +2260,10 @@ function actionList(items, className = "") {
2320
2260
  const contentHtml = `
2321
2261
  ${iconHtml}
2322
2262
  <div class="flex-1 min-w-0">
2323
- <div class="font-medium ${item.destructive ? "text-danger" : "text-text-primary"}">${escapeHtml(
2263
+ <div class="font-medium ${item.destructive ? "text-danger" : "text-text-primary"}">${escapeHtml2(
2324
2264
  item.label
2325
2265
  )}</div>
2326
- ${item.description ? `<p class="text-sm text-text-secondary">${escapeHtml(item.description)}</p>` : ""}
2266
+ ${item.description ? `<p class="text-sm text-text-secondary">${escapeHtml2(item.description)}</p>` : ""}
2327
2267
  </div>
2328
2268
  <svg class="w-5 h-5 text-text-secondary" fill="none" stroke="currentColor" viewBox="0 0 24 24">
2329
2269
  <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 5l7 7-7 7"/>
@@ -2333,7 +2273,7 @@ function actionList(items, className = "") {
2333
2273
  return `<div class="${baseClasses}">${contentHtml}</div>`;
2334
2274
  }
2335
2275
  if (item.href) {
2336
- return `<a href="${escapeHtml(item.href)}" class="${baseClasses}">${contentHtml}</a>`;
2276
+ return `<a href="${escapeHtml2(item.href)}" class="${baseClasses}">${contentHtml}</a>`;
2337
2277
  }
2338
2278
  return `<div class="${baseClasses}">${contentHtml}</div>`;
2339
2279
  }).join("\n");