@frontmcp/ui 0.12.2 → 1.0.0-beta.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (310) hide show
  1. package/README.md +279 -72
  2. package/bridge/adapters/claude.adapter.d.ts.map +1 -1
  3. package/bridge/adapters/gemini.adapter.d.ts.map +1 -1
  4. package/bridge/index.js +2 -36
  5. package/components/Alert/Alert.d.ts +11 -0
  6. package/components/Alert/Alert.d.ts.map +1 -0
  7. package/components/Alert/index.d.ts +4 -0
  8. package/components/Alert/index.d.ts.map +1 -0
  9. package/components/Alert/index.js +61 -0
  10. package/components/Avatar/Avatar.d.ts +10 -0
  11. package/components/Avatar/Avatar.d.ts.map +1 -0
  12. package/components/Avatar/index.d.ts +4 -0
  13. package/components/Avatar/index.d.ts.map +1 -0
  14. package/components/Avatar/index.js +43 -0
  15. package/components/Badge/Badge.d.ts +13 -0
  16. package/components/Badge/Badge.d.ts.map +1 -0
  17. package/components/Badge/index.d.ts +4 -0
  18. package/components/Badge/index.d.ts.map +1 -0
  19. package/{render → components/Badge}/index.js +54 -42
  20. package/components/Button/Button.d.ts +16 -0
  21. package/components/Button/Button.d.ts.map +1 -0
  22. package/components/Button/index.d.ts +4 -0
  23. package/components/Button/index.d.ts.map +1 -0
  24. package/components/Button/index.js +91 -0
  25. package/components/Card/Card.d.ts +25 -0
  26. package/components/Card/Card.d.ts.map +1 -0
  27. package/components/Card/index.d.ts +4 -0
  28. package/components/Card/index.d.ts.map +1 -0
  29. package/components/Card/index.js +110 -0
  30. package/components/List/List.d.ts +15 -0
  31. package/components/List/List.d.ts.map +1 -0
  32. package/components/List/index.d.ts +4 -0
  33. package/components/List/index.d.ts.map +1 -0
  34. package/components/List/index.js +58 -0
  35. package/components/Loader/Loader.d.ts +28 -0
  36. package/components/Loader/Loader.d.ts.map +1 -0
  37. package/components/Loader/LoaderContext.d.ts +20 -0
  38. package/components/Loader/LoaderContext.d.ts.map +1 -0
  39. package/components/Loader/index.d.ts +6 -0
  40. package/components/Loader/index.d.ts.map +1 -0
  41. package/components/Loader/index.js +174 -0
  42. package/components/Modal/Modal.d.ts +22 -0
  43. package/components/Modal/Modal.d.ts.map +1 -0
  44. package/components/Modal/index.d.ts +4 -0
  45. package/components/Modal/index.d.ts.map +1 -0
  46. package/components/Modal/index.js +80 -0
  47. package/components/Select/Select.d.ts +21 -0
  48. package/components/Select/Select.d.ts.map +1 -0
  49. package/components/Select/index.d.ts +4 -0
  50. package/components/Select/index.d.ts.map +1 -0
  51. package/components/Select/index.js +78 -0
  52. package/components/Table/Table.d.ts +15 -0
  53. package/components/Table/Table.d.ts.map +1 -0
  54. package/components/Table/index.d.ts +4 -0
  55. package/components/Table/index.d.ts.map +1 -0
  56. package/components/Table/index.js +70 -0
  57. package/components/TextField/TextField.d.ts +19 -0
  58. package/components/TextField/TextField.d.ts.map +1 -0
  59. package/components/TextField/index.d.ts +4 -0
  60. package/components/TextField/index.d.ts.map +1 -0
  61. package/components/TextField/index.js +77 -0
  62. package/components/index.d.ts +22 -28
  63. package/components/index.d.ts.map +1 -1
  64. package/components/index.js +523 -2521
  65. package/esm/bridge/index.mjs +2 -6
  66. package/esm/components/Alert/index.mjs +28 -0
  67. package/esm/components/Avatar/index.mjs +10 -0
  68. package/esm/components/Badge/index.mjs +56 -0
  69. package/esm/components/Button/index.mjs +58 -0
  70. package/esm/components/Card/index.mjs +77 -0
  71. package/esm/components/List/index.mjs +25 -0
  72. package/esm/components/Loader/index.mjs +141 -0
  73. package/esm/components/Modal/index.mjs +47 -0
  74. package/esm/components/Select/index.mjs +45 -0
  75. package/esm/components/Table/index.mjs +37 -0
  76. package/esm/components/TextField/index.mjs +44 -0
  77. package/esm/components/index.mjs +513 -2415
  78. package/esm/index.mjs +62 -4652
  79. package/esm/package.json +372 -16
  80. package/esm/react/index.mjs +2 -285
  81. package/esm/renderer/charts/index.mjs +336 -0
  82. package/esm/renderer/common/index.mjs +135 -0
  83. package/esm/renderer/csv/index.mjs +193 -0
  84. package/esm/renderer/flow/index.mjs +259 -0
  85. package/esm/renderer/html/index.mjs +99 -0
  86. package/esm/renderer/image/index.mjs +125 -0
  87. package/esm/renderer/index.mjs +2173 -0
  88. package/esm/renderer/maps/index.mjs +217 -0
  89. package/esm/renderer/math/index.mjs +229 -0
  90. package/esm/renderer/mdx/index.mjs +261 -0
  91. package/esm/renderer/media/index.mjs +235 -0
  92. package/esm/renderer/mermaid/index.mjs +220 -0
  93. package/esm/renderer/pdf/index.mjs +229 -0
  94. package/esm/renderer/react/index.mjs +230 -0
  95. package/esm/runtime/index.mjs +194 -0
  96. package/esm/theme/index.mjs +93 -0
  97. package/index.d.ts +10 -18
  98. package/index.d.ts.map +1 -1
  99. package/index.js +63 -4806
  100. package/package.json +372 -16
  101. package/react/index.d.ts +8 -54
  102. package/react/index.d.ts.map +1 -1
  103. package/react/index.js +2 -295
  104. package/renderer/auto-detect.d.ts +39 -0
  105. package/renderer/auto-detect.d.ts.map +1 -0
  106. package/renderer/charts/index.d.ts +22 -0
  107. package/renderer/charts/index.d.ts.map +1 -0
  108. package/renderer/charts/index.js +367 -0
  109. package/renderer/common/index.d.ts +5 -0
  110. package/renderer/common/index.d.ts.map +1 -0
  111. package/renderer/common/index.js +158 -0
  112. package/renderer/common/inject-stylesheet.d.ts +9 -0
  113. package/renderer/common/inject-stylesheet.d.ts.map +1 -0
  114. package/renderer/common/lazy-import.d.ts +85 -0
  115. package/renderer/common/lazy-import.d.ts.map +1 -0
  116. package/renderer/common/use-lazy-module.d.ts +13 -0
  117. package/renderer/common/use-lazy-module.d.ts.map +1 -0
  118. package/renderer/common/use-renderer-theme.d.ts +35 -0
  119. package/renderer/common/use-renderer-theme.d.ts.map +1 -0
  120. package/renderer/csv/index.d.ts +12 -0
  121. package/renderer/csv/index.d.ts.map +1 -0
  122. package/renderer/csv/index.js +224 -0
  123. package/renderer/flow/index.d.ts +40 -0
  124. package/renderer/flow/index.d.ts.map +1 -0
  125. package/renderer/flow/index.js +290 -0
  126. package/renderer/html/index.d.ts +12 -0
  127. package/renderer/html/index.d.ts.map +1 -0
  128. package/renderer/html/index.js +130 -0
  129. package/renderer/image/index.d.ts +11 -0
  130. package/renderer/image/index.d.ts.map +1 -0
  131. package/renderer/image/index.js +156 -0
  132. package/renderer/index.d.ts +32 -0
  133. package/renderer/index.d.ts.map +1 -0
  134. package/renderer/index.js +2206 -0
  135. package/renderer/maps/index.d.ts +27 -0
  136. package/renderer/maps/index.d.ts.map +1 -0
  137. package/renderer/maps/index.js +248 -0
  138. package/renderer/math/index.d.ts +11 -0
  139. package/renderer/math/index.d.ts.map +1 -0
  140. package/renderer/math/index.js +260 -0
  141. package/renderer/mdx/index.d.ts +10 -0
  142. package/renderer/mdx/index.d.ts.map +1 -0
  143. package/renderer/mdx/index.js +292 -0
  144. package/renderer/media/index.d.ts +20 -0
  145. package/renderer/media/index.d.ts.map +1 -0
  146. package/renderer/media/index.js +266 -0
  147. package/renderer/mermaid/index.d.ts +11 -0
  148. package/renderer/mermaid/index.d.ts.map +1 -0
  149. package/renderer/mermaid/index.js +251 -0
  150. package/renderer/pdf/index.d.ts +10 -0
  151. package/renderer/pdf/index.d.ts.map +1 -0
  152. package/renderer/pdf/index.js +260 -0
  153. package/renderer/react/index.d.ts +45 -0
  154. package/renderer/react/index.d.ts.map +1 -0
  155. package/renderer/react/index.js +261 -0
  156. package/renderer/types.d.ts +24 -0
  157. package/renderer/types.d.ts.map +1 -0
  158. package/runtime/babel-runtime.d.ts +70 -0
  159. package/runtime/babel-runtime.d.ts.map +1 -0
  160. package/runtime/content-detector.d.ts +43 -0
  161. package/runtime/content-detector.d.ts.map +1 -0
  162. package/runtime/index.d.ts +10 -0
  163. package/runtime/index.d.ts.map +1 -0
  164. package/runtime/index.js +217 -0
  165. package/theme/FrontMcpThemeProvider.d.ts +4 -0
  166. package/theme/FrontMcpThemeProvider.d.ts.map +1 -0
  167. package/theme/create-theme.d.ts +9 -0
  168. package/theme/create-theme.d.ts.map +1 -0
  169. package/theme/index.d.ts +5 -0
  170. package/theme/index.d.ts.map +1 -0
  171. package/theme/index.js +126 -0
  172. package/theme/types.d.ts +28 -0
  173. package/theme/types.d.ts.map +1 -0
  174. package/theme/use-theme.d.ts +3 -0
  175. package/theme/use-theme.d.ts.map +1 -0
  176. package/bundler/browser-components.d.ts +0 -42
  177. package/bundler/browser-components.d.ts.map +0 -1
  178. package/bundler/bundler.d.ts +0 -282
  179. package/bundler/bundler.d.ts.map +0 -1
  180. package/bundler/index.d.ts +0 -43
  181. package/bundler/index.d.ts.map +0 -1
  182. package/bundler/index.js +0 -3168
  183. package/bundler/types.d.ts +0 -883
  184. package/bundler/types.d.ts.map +0 -1
  185. package/components/alert.d.ts +0 -83
  186. package/components/alert.d.ts.map +0 -1
  187. package/components/alert.schema.d.ts +0 -98
  188. package/components/alert.schema.d.ts.map +0 -1
  189. package/components/avatar.d.ts +0 -77
  190. package/components/avatar.d.ts.map +0 -1
  191. package/components/avatar.schema.d.ts +0 -170
  192. package/components/avatar.schema.d.ts.map +0 -1
  193. package/components/badge.d.ts +0 -78
  194. package/components/badge.d.ts.map +0 -1
  195. package/components/badge.schema.d.ts +0 -91
  196. package/components/badge.schema.d.ts.map +0 -1
  197. package/components/button.d.ts +0 -100
  198. package/components/button.d.ts.map +0 -1
  199. package/components/button.schema.d.ts +0 -120
  200. package/components/button.schema.d.ts.map +0 -1
  201. package/components/card.d.ts +0 -76
  202. package/components/card.d.ts.map +0 -1
  203. package/components/card.schema.d.ts +0 -93
  204. package/components/card.schema.d.ts.map +0 -1
  205. package/components/form.d.ts +0 -227
  206. package/components/form.d.ts.map +0 -1
  207. package/components/form.schema.d.ts +0 -365
  208. package/components/form.schema.d.ts.map +0 -1
  209. package/components/list.d.ts +0 -121
  210. package/components/list.d.ts.map +0 -1
  211. package/components/list.schema.d.ts +0 -129
  212. package/components/list.schema.d.ts.map +0 -1
  213. package/components/modal.d.ts +0 -100
  214. package/components/modal.d.ts.map +0 -1
  215. package/components/modal.schema.d.ts +0 -151
  216. package/components/modal.schema.d.ts.map +0 -1
  217. package/components/table.d.ts +0 -91
  218. package/components/table.d.ts.map +0 -1
  219. package/components/table.schema.d.ts +0 -123
  220. package/components/table.schema.d.ts.map +0 -1
  221. package/esm/bundler/index.mjs +0 -3136
  222. package/esm/layouts/index.mjs +0 -409
  223. package/esm/render/index.mjs +0 -45
  224. package/esm/renderers/index.mjs +0 -621
  225. package/esm/universal/index.mjs +0 -1946
  226. package/esm/web-components/index.mjs +0 -2023
  227. package/layouts/base.d.ts +0 -86
  228. package/layouts/base.d.ts.map +0 -1
  229. package/layouts/index.d.ts +0 -8
  230. package/layouts/index.d.ts.map +0 -1
  231. package/layouts/index.js +0 -437
  232. package/layouts/presets.d.ts +0 -134
  233. package/layouts/presets.d.ts.map +0 -1
  234. package/react/Alert.d.ts +0 -101
  235. package/react/Alert.d.ts.map +0 -1
  236. package/react/Badge.d.ts +0 -100
  237. package/react/Badge.d.ts.map +0 -1
  238. package/react/Button.d.ts +0 -108
  239. package/react/Button.d.ts.map +0 -1
  240. package/react/Card.d.ts +0 -103
  241. package/react/Card.d.ts.map +0 -1
  242. package/react/types.d.ts +0 -105
  243. package/react/types.d.ts.map +0 -1
  244. package/render/index.d.ts +0 -8
  245. package/render/index.d.ts.map +0 -1
  246. package/render/prerender.d.ts +0 -57
  247. package/render/prerender.d.ts.map +0 -1
  248. package/renderers/index.d.ts +0 -26
  249. package/renderers/index.d.ts.map +0 -1
  250. package/renderers/index.js +0 -666
  251. package/renderers/mdx.renderer.d.ts +0 -99
  252. package/renderers/mdx.renderer.d.ts.map +0 -1
  253. package/renderers/react.adapter.d.ts +0 -70
  254. package/renderers/react.adapter.d.ts.map +0 -1
  255. package/renderers/react.renderer.d.ts +0 -105
  256. package/renderers/react.renderer.d.ts.map +0 -1
  257. package/renderers/transpiler.d.ts +0 -49
  258. package/renderers/transpiler.d.ts.map +0 -1
  259. package/universal/UniversalApp.d.ts +0 -108
  260. package/universal/UniversalApp.d.ts.map +0 -1
  261. package/universal/cached-runtime.d.ts +0 -139
  262. package/universal/cached-runtime.d.ts.map +0 -1
  263. package/universal/context.d.ts +0 -122
  264. package/universal/context.d.ts.map +0 -1
  265. package/universal/index.d.ts +0 -57
  266. package/universal/index.d.ts.map +0 -1
  267. package/universal/index.js +0 -2032
  268. package/universal/renderers/html.renderer.d.ts +0 -36
  269. package/universal/renderers/html.renderer.d.ts.map +0 -1
  270. package/universal/renderers/index.d.ts +0 -112
  271. package/universal/renderers/index.d.ts.map +0 -1
  272. package/universal/renderers/markdown.renderer.d.ts +0 -33
  273. package/universal/renderers/markdown.renderer.d.ts.map +0 -1
  274. package/universal/renderers/mdx.renderer.d.ts +0 -38
  275. package/universal/renderers/mdx.renderer.d.ts.map +0 -1
  276. package/universal/renderers/react.renderer.d.ts +0 -46
  277. package/universal/renderers/react.renderer.d.ts.map +0 -1
  278. package/universal/runtime-builder.d.ts +0 -33
  279. package/universal/runtime-builder.d.ts.map +0 -1
  280. package/universal/store.d.ts +0 -135
  281. package/universal/store.d.ts.map +0 -1
  282. package/universal/types.d.ts +0 -199
  283. package/universal/types.d.ts.map +0 -1
  284. package/web-components/core/attribute-parser.d.ts +0 -82
  285. package/web-components/core/attribute-parser.d.ts.map +0 -1
  286. package/web-components/core/base-element.d.ts +0 -197
  287. package/web-components/core/base-element.d.ts.map +0 -1
  288. package/web-components/core/index.d.ts +0 -9
  289. package/web-components/core/index.d.ts.map +0 -1
  290. package/web-components/elements/fmcp-alert.d.ts +0 -46
  291. package/web-components/elements/fmcp-alert.d.ts.map +0 -1
  292. package/web-components/elements/fmcp-badge.d.ts +0 -47
  293. package/web-components/elements/fmcp-badge.d.ts.map +0 -1
  294. package/web-components/elements/fmcp-button.d.ts +0 -117
  295. package/web-components/elements/fmcp-button.d.ts.map +0 -1
  296. package/web-components/elements/fmcp-card.d.ts +0 -53
  297. package/web-components/elements/fmcp-card.d.ts.map +0 -1
  298. package/web-components/elements/fmcp-input.d.ts +0 -96
  299. package/web-components/elements/fmcp-input.d.ts.map +0 -1
  300. package/web-components/elements/fmcp-select.d.ts +0 -100
  301. package/web-components/elements/fmcp-select.d.ts.map +0 -1
  302. package/web-components/elements/index.d.ts +0 -13
  303. package/web-components/elements/index.d.ts.map +0 -1
  304. package/web-components/index.d.ts +0 -49
  305. package/web-components/index.d.ts.map +0 -1
  306. package/web-components/index.js +0 -2058
  307. package/web-components/register.d.ts +0 -57
  308. package/web-components/register.d.ts.map +0 -1
  309. package/web-components/types.d.ts +0 -122
  310. package/web-components/types.d.ts.map +0 -1
@@ -1,409 +0,0 @@
1
- // libs/ui/src/layouts/base.ts
2
- import {
3
- OPENAI_PLATFORM,
4
- canUseCdn,
5
- needsInlineScripts,
6
- DEFAULT_THEME,
7
- buildThemeCss,
8
- mergeThemes,
9
- buildFontPreconnect,
10
- buildFontStylesheets,
11
- buildCdnScripts
12
- } from "@frontmcp/uipack/theme";
13
- import { escapeHtml } from "@frontmcp/uipack/utils";
14
- import { escapeHtml as escapeHtml2 } from "@frontmcp/uipack/utils";
15
- function getSizeClass(size) {
16
- const sizeMap = {
17
- xs: "max-w-sm",
18
- sm: "max-w-md",
19
- md: "max-w-lg",
20
- lg: "max-w-xl",
21
- xl: "max-w-2xl",
22
- "2xl": "max-w-3xl",
23
- "3xl": "max-w-4xl",
24
- full: "max-w-full"
25
- };
26
- return sizeMap[size];
27
- }
28
- function getAlignmentClasses(alignment) {
29
- const alignMap = {
30
- center: "min-h-screen flex items-center justify-center",
31
- top: "min-h-screen flex flex-col items-center pt-12",
32
- start: "min-h-screen"
33
- };
34
- return alignMap[alignment];
35
- }
36
- function getBackgroundClasses(background) {
37
- switch (background) {
38
- case "gradient":
39
- return "bg-gradient-to-br from-primary to-secondary";
40
- case "pattern":
41
- return 'bg-surface bg-[url("data:image/svg+xml,...")]';
42
- // Pattern would be defined
43
- case "solid":
44
- return "bg-background";
45
- case "none":
46
- default:
47
- return "";
48
- }
49
- }
50
- function buildMetaTags(options) {
51
- const tags = [];
52
- if (options.description) {
53
- tags.push(`<meta name="description" content="${escapeHtml(options.description)}">`);
54
- }
55
- if (options.og) {
56
- if (options.og.title) {
57
- tags.push(`<meta property="og:title" content="${escapeHtml(options.og.title)}">`);
58
- }
59
- if (options.og.description) {
60
- tags.push(`<meta property="og:description" content="${escapeHtml(options.og.description)}">`);
61
- }
62
- if (options.og.image) {
63
- tags.push(`<meta property="og:image" content="${escapeHtml(options.og.image)}">`);
64
- }
65
- if (options.og.type) {
66
- tags.push(`<meta property="og:type" content="${escapeHtml(options.og.type)}">`);
67
- }
68
- }
69
- if (options.favicon) {
70
- tags.push(`<link rel="icon" href="${escapeHtml(options.favicon)}">`);
71
- }
72
- return tags.join("\n ");
73
- }
74
- function buildBodyAttrs(attrs) {
75
- if (!attrs) return "";
76
- return Object.entries(attrs).map(([key, value]) => `${key}="${escapeHtml(value)}"`).join(" ");
77
- }
78
- function baseLayout(content, options) {
79
- const {
80
- title,
81
- pageType: _pageType = "custom",
82
- size = "md",
83
- alignment = "center",
84
- background = "solid",
85
- platform = OPENAI_PLATFORM,
86
- theme: themeOverrides,
87
- includeHtmx,
88
- includeAlpine = false,
89
- includeIcons = false,
90
- headExtra = "",
91
- bodyAttrs,
92
- bodyClass = "",
93
- titleSuffix = "FrontMCP"
94
- } = options;
95
- const theme = themeOverrides ? mergeThemes(DEFAULT_THEME, themeOverrides) : DEFAULT_THEME;
96
- const shouldIncludeHtmx = includeHtmx ?? platform.supportsHtmx;
97
- const useCdn = canUseCdn(platform);
98
- const useInline = needsInlineScripts(platform);
99
- const fontPreconnect = useCdn ? buildFontPreconnect() : "";
100
- const fontStylesheets = useCdn ? buildFontStylesheets({ inter: true }) : "";
101
- const scripts = buildCdnScripts({
102
- tailwind: platform.supportsTailwind,
103
- htmx: shouldIncludeHtmx,
104
- alpine: includeAlpine,
105
- icons: includeIcons,
106
- inline: useInline
107
- });
108
- const themeCss = buildThemeCss(theme);
109
- const customCss = theme.customCss || "";
110
- const styleBlock = platform.supportsTailwind ? `<style type="text/tailwindcss">
111
- @theme {
112
- ${themeCss}
113
- }
114
- ${customCss}
115
- </style>` : "";
116
- const sizeClass = getSizeClass(size);
117
- const alignmentClasses = getAlignmentClasses(alignment);
118
- const backgroundClasses = getBackgroundClasses(background);
119
- const allBodyClasses = [backgroundClasses, "font-sans antialiased", bodyClass].filter(Boolean).join(" ");
120
- const metaTags = buildMetaTags(options);
121
- const bodyAttrStr = buildBodyAttrs(bodyAttrs);
122
- const wrappedContent = alignment === "center" ? `<div class="${alignmentClasses} p-4">
123
- <div class="w-full ${sizeClass}">
124
- ${content}
125
- </div>
126
- </div>` : `<div class="${alignmentClasses}">
127
- <div class="w-full ${sizeClass} mx-auto px-4 py-8">
128
- ${content}
129
- </div>
130
- </div>`;
131
- return `<!DOCTYPE html>
132
- <html lang="en">
133
- <head>
134
- <meta charset="UTF-8">
135
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
136
- <title>${escapeHtml(title)}${titleSuffix ? ` - ${escapeHtml(titleSuffix)}` : ""}</title>
137
- ${metaTags}
138
-
139
- <!-- Fonts -->
140
- ${fontPreconnect}
141
- ${fontStylesheets}
142
-
143
- <!-- Tailwind CSS -->
144
- ${scripts}
145
- ${styleBlock}
146
-
147
- ${headExtra}
148
- </head>
149
- <body class="${escapeHtml(allBodyClasses)}"${bodyAttrStr ? ` ${bodyAttrStr}` : ""}>
150
- ${wrappedContent}
151
- </body>
152
- </html>`;
153
- }
154
- function createLayoutBuilder(defaults) {
155
- return (content, options = {}) => {
156
- let mergedTheme = DEFAULT_THEME;
157
- if (defaults.theme) {
158
- mergedTheme = mergeThemes(mergedTheme, defaults.theme);
159
- }
160
- if (options.theme) {
161
- mergedTheme = mergeThemes(mergedTheme, options.theme);
162
- }
163
- const merged = {
164
- ...defaults,
165
- ...options,
166
- theme: mergedTheme
167
- };
168
- if (!merged.title) {
169
- throw new Error("createLayoutBuilder: title is required either in defaults or options");
170
- }
171
- return baseLayout(content, merged);
172
- };
173
- }
174
-
175
- // libs/ui/src/layouts/presets.ts
176
- function authLayout(content, options) {
177
- const { showBranding = true, logo, footer, ...baseOptions } = options;
178
- const brandingHtml = showBranding && logo ? `<div class="text-center mb-8">${logo}</div>` : showBranding ? `<div class="text-center mb-8">
179
- <div class="inline-flex items-center justify-center w-16 h-16 rounded-xl bg-gradient-to-br from-primary to-secondary mb-4">
180
- <svg class="w-8 h-8 text-white" fill="none" stroke="currentColor" viewBox="0 0 24 24">
181
- <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 15v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2zm10-10V7a4 4 0 00-8 0v4h8z"/>
182
- </svg>
183
- </div>
184
- </div>` : "";
185
- const footerHtml = footer ? `<div class="mt-8 text-center text-sm text-text-secondary">${footer}</div>` : "";
186
- const wrappedContent = `
187
- <div class="bg-white rounded-2xl shadow-xl p-8">
188
- ${brandingHtml}
189
- ${content}
190
- </div>
191
- ${footerHtml}
192
- `;
193
- return baseLayout(wrappedContent, {
194
- ...baseOptions,
195
- pageType: "auth",
196
- size: baseOptions.size ?? "sm",
197
- alignment: "center",
198
- background: "gradient"
199
- });
200
- }
201
- function consentLayout(content, options) {
202
- const { clientName, clientIcon, userInfo, ...baseOptions } = options;
203
- const headerHtml = clientName ? `<div class="text-center mb-6">
204
- ${clientIcon ? `<img src="${escapeHtml2(clientIcon)}" alt="${escapeHtml2(
205
- clientName
206
- )}" class="w-16 h-16 rounded-xl mx-auto mb-4">` : `<div class="inline-flex items-center justify-center w-16 h-16 rounded-xl bg-gradient-to-br from-primary to-secondary text-white font-bold text-2xl mx-auto mb-4">
207
- ${escapeHtml2(clientName.charAt(0).toUpperCase())}
208
- </div>`}
209
- <h1 class="text-2xl font-bold text-text-primary">${escapeHtml2(clientName)}</h1>
210
- </div>` : "";
211
- const userInfoHtml = userInfo ? `<div class="flex items-center gap-3 p-3 bg-gray-50 rounded-lg mb-6">
212
- ${userInfo.avatar ? `<img src="${escapeHtml2(userInfo.avatar)}" class="w-10 h-10 rounded-full">` : `<div class="w-10 h-10 rounded-full bg-primary text-white flex items-center justify-center font-medium">
213
- ${escapeHtml2((userInfo.name || userInfo.email || "U").charAt(0).toUpperCase())}
214
- </div>`}
215
- <div>
216
- ${userInfo.name ? `<div class="font-medium text-text-primary">${escapeHtml2(userInfo.name)}</div>` : ""}
217
- ${userInfo.email ? `<div class="text-sm text-text-secondary">${escapeHtml2(userInfo.email)}</div>` : ""}
218
- </div>
219
- </div>` : "";
220
- const wrappedContent = `
221
- ${headerHtml}
222
- ${userInfoHtml}
223
- ${content}
224
- `;
225
- return baseLayout(wrappedContent, {
226
- ...baseOptions,
227
- pageType: "consent",
228
- size: baseOptions.size ?? "lg",
229
- alignment: "top",
230
- background: "solid"
231
- });
232
- }
233
- function errorLayout(content, options) {
234
- const {
235
- errorCode,
236
- errorTitle = "Something went wrong",
237
- errorMessage,
238
- showRetry = true,
239
- retryUrl,
240
- showHome = true,
241
- homeUrl = "/",
242
- ...baseOptions
243
- } = options;
244
- const errorHtml = `
245
- <div class="text-center">
246
- <!-- Error icon -->
247
- <div class="inline-flex items-center justify-center w-20 h-20 rounded-full bg-danger/10 mb-6">
248
- <svg class="w-10 h-10 text-danger" fill="none" stroke="currentColor" viewBox="0 0 24 24">
249
- <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"/>
250
- </svg>
251
- </div>
252
-
253
- ${errorCode ? `<p class="text-6xl font-bold text-danger mb-2">${escapeHtml2(errorCode)}</p>` : ""}
254
- <h1 class="text-2xl font-bold text-text-primary mb-4">${escapeHtml2(errorTitle)}</h1>
255
- ${errorMessage ? `<p class="text-text-secondary mb-8">${escapeHtml2(errorMessage)}</p>` : ""}
256
-
257
- ${content}
258
-
259
- <div class="flex gap-4 justify-center mt-8">
260
- ${showRetry ? `<button onclick="${retryUrl ? `window.location.href='${escapeHtml2(retryUrl)}'` : "window.location.reload()"}" class="px-6 py-3 bg-primary hover:bg-primary/90 text-white font-medium rounded-lg transition-colors">Try Again</button>` : ""}
261
- ${showHome ? `<a href="${escapeHtml2(
262
- homeUrl
263
- )}" class="px-6 py-3 bg-gray-100 hover:bg-gray-200 text-text-primary font-medium rounded-lg transition-colors">Go Home</a>` : ""}
264
- </div>
265
- </div>
266
- `;
267
- return baseLayout(errorHtml, {
268
- ...baseOptions,
269
- pageType: "error",
270
- size: "sm",
271
- alignment: "center",
272
- background: "solid",
273
- title: baseOptions.title ?? errorTitle
274
- });
275
- }
276
- function loadingLayout(content, options) {
277
- const { message = "Loading...", showSpinner = true, showProgress = false, progress = 0, ...baseOptions } = options;
278
- const spinnerHtml = showSpinner ? `<div class="inline-flex items-center justify-center w-16 h-16 mb-6">
279
- <svg class="animate-spin w-12 h-12 text-primary" fill="none" viewBox="0 0 24 24">
280
- <circle class="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" stroke-width="4"></circle>
281
- <path class="opacity-75" fill="currentColor" d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"></path>
282
- </svg>
283
- </div>` : "";
284
- const progressHtml = showProgress ? `<div class="w-full bg-gray-200 rounded-full h-2 mb-4">
285
- <div class="bg-primary h-2 rounded-full transition-all duration-300" style="width: ${progress}%"></div>
286
- </div>` : "";
287
- const loadingHtml = `
288
- <div class="text-center">
289
- ${spinnerHtml}
290
- <h2 class="text-xl font-medium text-text-primary mb-2">${escapeHtml2(message)}</h2>
291
- ${progressHtml}
292
- ${content}
293
- </div>
294
- `;
295
- return baseLayout(loadingHtml, {
296
- ...baseOptions,
297
- pageType: "loading",
298
- size: "sm",
299
- alignment: "center",
300
- background: "solid",
301
- title: baseOptions.title ?? "Loading"
302
- });
303
- }
304
- function successLayout(content, options) {
305
- const {
306
- successTitle = "Success!",
307
- successMessage,
308
- continueText = "Continue",
309
- continueUrl,
310
- autoClose,
311
- ...baseOptions
312
- } = options;
313
- const autoCloseScript = autoClose ? `<script>
314
- let countdown = ${autoClose};
315
- const countdownEl = document.getElementById('countdown');
316
- const interval = setInterval(() => {
317
- countdown--;
318
- if (countdownEl) countdownEl.textContent = countdown;
319
- if (countdown <= 0) {
320
- clearInterval(interval);
321
- ${continueUrl ? `window.location.href = '${escapeHtml2(continueUrl)}';` : "window.close();"}
322
- }
323
- }, 1000);
324
- </script>` : "";
325
- const successHtml = `
326
- <div class="text-center">
327
- <!-- Success icon -->
328
- <div class="inline-flex items-center justify-center w-20 h-20 rounded-full bg-success/10 mb-6">
329
- <svg class="w-10 h-10 text-success" fill="none" stroke="currentColor" viewBox="0 0 24 24">
330
- <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 13l4 4L19 7"/>
331
- </svg>
332
- </div>
333
-
334
- <h1 class="text-2xl font-bold text-text-primary mb-4">${escapeHtml2(successTitle)}</h1>
335
- ${successMessage ? `<p class="text-text-secondary mb-8">${escapeHtml2(successMessage)}</p>` : ""}
336
-
337
- ${content}
338
-
339
- ${continueUrl ? `<a href="${escapeHtml2(
340
- continueUrl
341
- )}" class="inline-block mt-6 px-6 py-3 bg-primary hover:bg-primary/90 text-white font-medium rounded-lg transition-colors">${escapeHtml2(
342
- continueText
343
- )}</a>` : ""}
344
-
345
- ${autoClose ? `<p class="mt-4 text-sm text-text-secondary">Closing in <span id="countdown">${autoClose}</span> seconds...</p>` : ""}
346
- </div>
347
- ${autoCloseScript}
348
- `;
349
- return baseLayout(successHtml, {
350
- ...baseOptions,
351
- pageType: "success",
352
- size: "sm",
353
- alignment: "center",
354
- background: "solid",
355
- title: baseOptions.title ?? successTitle
356
- });
357
- }
358
- function widgetLayout(content, options) {
359
- const { maxWidth = "100%", showBorder = false, transparent = true, ...baseOptions } = options;
360
- const containerClasses = [
361
- "widget-container",
362
- showBorder ? "border border-border rounded-lg" : "",
363
- transparent ? "" : "bg-surface"
364
- ].filter(Boolean).join(" ");
365
- const wrappedContent = `
366
- <div class="${containerClasses}" style="max-width: ${escapeHtml2(maxWidth)}">
367
- ${content}
368
- </div>
369
- `;
370
- return baseLayout(wrappedContent, {
371
- ...baseOptions,
372
- pageType: "widget",
373
- size: "full",
374
- alignment: "start",
375
- background: "none"
376
- });
377
- }
378
- var authLayoutBuilder = createLayoutBuilder({
379
- pageType: "auth",
380
- size: "sm",
381
- alignment: "center",
382
- background: "gradient"
383
- });
384
- var consentLayoutBuilder = createLayoutBuilder({
385
- pageType: "consent",
386
- size: "lg",
387
- alignment: "top",
388
- background: "solid"
389
- });
390
- var errorLayoutBuilder = createLayoutBuilder({
391
- pageType: "error",
392
- size: "sm",
393
- alignment: "center",
394
- background: "solid"
395
- });
396
- export {
397
- authLayout,
398
- authLayoutBuilder,
399
- baseLayout,
400
- consentLayout,
401
- consentLayoutBuilder,
402
- createLayoutBuilder,
403
- errorLayout,
404
- errorLayoutBuilder,
405
- escapeHtml2 as escapeHtml,
406
- loadingLayout,
407
- successLayout,
408
- widgetLayout
409
- };
@@ -1,45 +0,0 @@
1
- var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
2
- get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
3
- }) : x)(function(x) {
4
- if (typeof require !== "undefined") return require.apply(this, arguments);
5
- throw Error('Dynamic require of "' + x + '" is not supported');
6
- });
7
-
8
- // libs/ui/src/render/prerender.ts
9
- async function renderToString(element) {
10
- const { prerender } = await import("react-dom/static");
11
- const { prelude } = await prerender(element);
12
- const reader = prelude.getReader();
13
- const chunks = [];
14
- while (true) {
15
- const { done, value } = await reader.read();
16
- if (done) break;
17
- if (value) chunks.push(value);
18
- }
19
- const totalLength = chunks.reduce((acc, chunk) => acc + chunk.length, 0);
20
- const combined = new Uint8Array(totalLength);
21
- let offset = 0;
22
- for (const chunk of chunks) {
23
- combined.set(chunk, offset);
24
- offset += chunk.length;
25
- }
26
- return new TextDecoder().decode(combined);
27
- }
28
- function renderToStringSync(element) {
29
- const ReactDOMServer = __require("react-dom/server");
30
- return ReactDOMServer.renderToStaticMarkup(element);
31
- }
32
- function isReactAvailable() {
33
- try {
34
- __require("react");
35
- __require("react-dom/server");
36
- return true;
37
- } catch {
38
- return false;
39
- }
40
- }
41
- export {
42
- isReactAvailable,
43
- renderToString,
44
- renderToStringSync
45
- };