@frontmcp/ui 0.5.0

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 (393) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +438 -0
  3. package/package.json +147 -0
  4. package/src/adapters/index.d.ts +10 -0
  5. package/src/adapters/index.js +18 -0
  6. package/src/adapters/index.js.map +1 -0
  7. package/src/adapters/platform-meta.d.ts +165 -0
  8. package/src/adapters/platform-meta.js +310 -0
  9. package/src/adapters/platform-meta.js.map +1 -0
  10. package/src/base-template/bridge.d.ts +89 -0
  11. package/src/base-template/bridge.js +452 -0
  12. package/src/base-template/bridge.js.map +1 -0
  13. package/src/base-template/default-base-template.d.ts +91 -0
  14. package/src/base-template/default-base-template.js +435 -0
  15. package/src/base-template/default-base-template.js.map +1 -0
  16. package/src/base-template/index.d.ts +14 -0
  17. package/src/base-template/index.js +30 -0
  18. package/src/base-template/index.js.map +1 -0
  19. package/src/base-template/polyfills.d.ts +30 -0
  20. package/src/base-template/polyfills.js +190 -0
  21. package/src/base-template/polyfills.js.map +1 -0
  22. package/src/base-template/theme-styles.d.ts +73 -0
  23. package/src/base-template/theme-styles.js +95 -0
  24. package/src/base-template/theme-styles.js.map +1 -0
  25. package/src/bridge/adapters/base-adapter.d.ts +103 -0
  26. package/src/bridge/adapters/base-adapter.js +314 -0
  27. package/src/bridge/adapters/base-adapter.js.map +1 -0
  28. package/src/bridge/adapters/claude.adapter.d.ts +66 -0
  29. package/src/bridge/adapters/claude.adapter.js +145 -0
  30. package/src/bridge/adapters/claude.adapter.js.map +1 -0
  31. package/src/bridge/adapters/ext-apps.adapter.d.ts +142 -0
  32. package/src/bridge/adapters/ext-apps.adapter.js +416 -0
  33. package/src/bridge/adapters/ext-apps.adapter.js.map +1 -0
  34. package/src/bridge/adapters/gemini.adapter.d.ts +63 -0
  35. package/src/bridge/adapters/gemini.adapter.js +160 -0
  36. package/src/bridge/adapters/gemini.adapter.js.map +1 -0
  37. package/src/bridge/adapters/generic.adapter.d.ts +55 -0
  38. package/src/bridge/adapters/generic.adapter.js +108 -0
  39. package/src/bridge/adapters/generic.adapter.js.map +1 -0
  40. package/src/bridge/adapters/index.d.ts +25 -0
  41. package/src/bridge/adapters/index.js +65 -0
  42. package/src/bridge/adapters/index.js.map +1 -0
  43. package/src/bridge/adapters/openai.adapter.d.ts +64 -0
  44. package/src/bridge/adapters/openai.adapter.js +194 -0
  45. package/src/bridge/adapters/openai.adapter.js.map +1 -0
  46. package/src/bridge/core/adapter-registry.d.ts +121 -0
  47. package/src/bridge/core/adapter-registry.js +271 -0
  48. package/src/bridge/core/adapter-registry.js.map +1 -0
  49. package/src/bridge/core/bridge-factory.d.ts +198 -0
  50. package/src/bridge/core/bridge-factory.js +428 -0
  51. package/src/bridge/core/bridge-factory.js.map +1 -0
  52. package/src/bridge/core/index.d.ts +9 -0
  53. package/src/bridge/core/index.js +22 -0
  54. package/src/bridge/core/index.js.map +1 -0
  55. package/src/bridge/index.d.ts +61 -0
  56. package/src/bridge/index.js +94 -0
  57. package/src/bridge/index.js.map +1 -0
  58. package/src/bridge/runtime/iife-generator.d.ts +61 -0
  59. package/src/bridge/runtime/iife-generator.js +940 -0
  60. package/src/bridge/runtime/iife-generator.js.map +1 -0
  61. package/src/bridge/runtime/index.d.ts +8 -0
  62. package/src/bridge/runtime/index.js +16 -0
  63. package/src/bridge/runtime/index.js.map +1 -0
  64. package/src/bridge/types.d.ts +385 -0
  65. package/src/bridge/types.js +11 -0
  66. package/src/bridge/types.js.map +1 -0
  67. package/src/build/cdn-resources.d.ts +140 -0
  68. package/src/build/cdn-resources.js +314 -0
  69. package/src/build/cdn-resources.js.map +1 -0
  70. package/src/build/index.d.ts +294 -0
  71. package/src/build/index.js +325 -0
  72. package/src/build/index.js.map +1 -0
  73. package/src/build/widget-manifest.d.ts +212 -0
  74. package/src/build/widget-manifest.js +652 -0
  75. package/src/build/widget-manifest.js.map +1 -0
  76. package/src/bundler/bundler.d.ts +110 -0
  77. package/src/bundler/bundler.js +432 -0
  78. package/src/bundler/bundler.js.map +1 -0
  79. package/src/bundler/cache.d.ts +172 -0
  80. package/src/bundler/cache.js +250 -0
  81. package/src/bundler/cache.js.map +1 -0
  82. package/src/bundler/index.d.ts +41 -0
  83. package/src/bundler/index.js +73 -0
  84. package/src/bundler/index.js.map +1 -0
  85. package/src/bundler/sandbox/enclave-adapter.d.ts +120 -0
  86. package/src/bundler/sandbox/enclave-adapter.js +339 -0
  87. package/src/bundler/sandbox/enclave-adapter.js.map +1 -0
  88. package/src/bundler/sandbox/executor.d.ts +13 -0
  89. package/src/bundler/sandbox/executor.js +22 -0
  90. package/src/bundler/sandbox/executor.js.map +1 -0
  91. package/src/bundler/sandbox/policy.d.ts +61 -0
  92. package/src/bundler/sandbox/policy.js +238 -0
  93. package/src/bundler/sandbox/policy.js.map +1 -0
  94. package/src/bundler/types.d.ts +347 -0
  95. package/src/bundler/types.js +132 -0
  96. package/src/bundler/types.js.map +1 -0
  97. package/src/components/alert.d.ts +71 -0
  98. package/src/components/alert.js +189 -0
  99. package/src/components/alert.js.map +1 -0
  100. package/src/components/alert.schema.d.ts +114 -0
  101. package/src/components/alert.schema.js +105 -0
  102. package/src/components/alert.schema.js.map +1 -0
  103. package/src/components/avatar.d.ts +76 -0
  104. package/src/components/avatar.js +176 -0
  105. package/src/components/avatar.js.map +1 -0
  106. package/src/components/avatar.schema.d.ts +169 -0
  107. package/src/components/avatar.schema.js +103 -0
  108. package/src/components/avatar.schema.js.map +1 -0
  109. package/src/components/badge.d.ts +70 -0
  110. package/src/components/badge.js +149 -0
  111. package/src/components/badge.js.map +1 -0
  112. package/src/components/badge.schema.d.ts +109 -0
  113. package/src/components/badge.schema.js +96 -0
  114. package/src/components/badge.schema.js.map +1 -0
  115. package/src/components/button.d.ts +111 -0
  116. package/src/components/button.js +336 -0
  117. package/src/components/button.js.map +1 -0
  118. package/src/components/button.schema.d.ts +148 -0
  119. package/src/components/button.schema.js +121 -0
  120. package/src/components/button.schema.js.map +1 -0
  121. package/src/components/card.d.ts +60 -0
  122. package/src/components/card.js +117 -0
  123. package/src/components/card.js.map +1 -0
  124. package/src/components/card.schema.d.ts +113 -0
  125. package/src/components/card.schema.js +98 -0
  126. package/src/components/card.schema.js.map +1 -0
  127. package/src/components/form.d.ts +239 -0
  128. package/src/components/form.js +420 -0
  129. package/src/components/form.js.map +1 -0
  130. package/src/components/form.schema.d.ts +441 -0
  131. package/src/components/form.schema.js +406 -0
  132. package/src/components/form.schema.js.map +1 -0
  133. package/src/components/index.d.ts +29 -0
  134. package/src/components/index.js +98 -0
  135. package/src/components/index.js.map +1 -0
  136. package/src/components/list.d.ts +127 -0
  137. package/src/components/list.js +279 -0
  138. package/src/components/list.js.map +1 -0
  139. package/src/components/list.schema.d.ts +134 -0
  140. package/src/components/list.schema.js +168 -0
  141. package/src/components/list.schema.js.map +1 -0
  142. package/src/components/modal.d.ts +111 -0
  143. package/src/components/modal.js +260 -0
  144. package/src/components/modal.js.map +1 -0
  145. package/src/components/modal.schema.d.ts +186 -0
  146. package/src/components/modal.schema.js +167 -0
  147. package/src/components/modal.schema.js.map +1 -0
  148. package/src/components/table.d.ts +105 -0
  149. package/src/components/table.js +283 -0
  150. package/src/components/table.js.map +1 -0
  151. package/src/components/table.schema.d.ts +159 -0
  152. package/src/components/table.schema.js +173 -0
  153. package/src/components/table.schema.js.map +1 -0
  154. package/src/handlebars/helpers.d.ts +348 -0
  155. package/src/handlebars/helpers.js +605 -0
  156. package/src/handlebars/helpers.js.map +1 -0
  157. package/src/handlebars/index.d.ts +193 -0
  158. package/src/handlebars/index.js +350 -0
  159. package/src/handlebars/index.js.map +1 -0
  160. package/src/index.d.ts +50 -0
  161. package/src/index.js +192 -0
  162. package/src/index.js.map +1 -0
  163. package/src/layouts/base.d.ts +88 -0
  164. package/src/layouts/base.js +227 -0
  165. package/src/layouts/base.js.map +1 -0
  166. package/src/layouts/index.d.ts +7 -0
  167. package/src/layouts/index.js +25 -0
  168. package/src/layouts/index.js.map +1 -0
  169. package/src/layouts/presets.d.ts +133 -0
  170. package/src/layouts/presets.js +277 -0
  171. package/src/layouts/presets.js.map +1 -0
  172. package/src/pages/consent.d.ts +116 -0
  173. package/src/pages/consent.js +218 -0
  174. package/src/pages/consent.js.map +1 -0
  175. package/src/pages/error.d.ts +100 -0
  176. package/src/pages/error.js +263 -0
  177. package/src/pages/error.js.map +1 -0
  178. package/src/pages/index.d.ts +8 -0
  179. package/src/pages/index.js +27 -0
  180. package/src/pages/index.js.map +1 -0
  181. package/src/react/Alert.d.ts +101 -0
  182. package/src/react/Alert.js +51 -0
  183. package/src/react/Alert.js.map +1 -0
  184. package/src/react/Badge.d.ts +100 -0
  185. package/src/react/Badge.js +55 -0
  186. package/src/react/Badge.js.map +1 -0
  187. package/src/react/Button.d.ts +108 -0
  188. package/src/react/Button.js +52 -0
  189. package/src/react/Button.js.map +1 -0
  190. package/src/react/Card.d.ts +103 -0
  191. package/src/react/Card.js +55 -0
  192. package/src/react/Card.js.map +1 -0
  193. package/src/react/hooks/context.d.ts +178 -0
  194. package/src/react/hooks/context.js +287 -0
  195. package/src/react/hooks/context.js.map +1 -0
  196. package/src/react/hooks/index.d.ts +41 -0
  197. package/src/react/hooks/index.js +61 -0
  198. package/src/react/hooks/index.js.map +1 -0
  199. package/src/react/hooks/tools.d.ts +283 -0
  200. package/src/react/hooks/tools.js +465 -0
  201. package/src/react/hooks/tools.js.map +1 -0
  202. package/src/react/index.d.ts +80 -0
  203. package/src/react/index.js +113 -0
  204. package/src/react/index.js.map +1 -0
  205. package/src/react/types.d.ts +105 -0
  206. package/src/react/types.js +12 -0
  207. package/src/react/types.js.map +1 -0
  208. package/src/react/utils.d.ts +42 -0
  209. package/src/react/utils.js +99 -0
  210. package/src/react/utils.js.map +1 -0
  211. package/src/registry/index.d.ts +45 -0
  212. package/src/registry/index.js +67 -0
  213. package/src/registry/index.js.map +1 -0
  214. package/src/registry/render-template.d.ts +86 -0
  215. package/src/registry/render-template.js +239 -0
  216. package/src/registry/render-template.js.map +1 -0
  217. package/src/registry/tool-ui.registry.d.ts +260 -0
  218. package/src/registry/tool-ui.registry.js +438 -0
  219. package/src/registry/tool-ui.registry.js.map +1 -0
  220. package/src/registry/uri-utils.d.ts +55 -0
  221. package/src/registry/uri-utils.js +97 -0
  222. package/src/registry/uri-utils.js.map +1 -0
  223. package/src/render/index.d.ts +7 -0
  224. package/src/render/index.js +14 -0
  225. package/src/render/index.js.map +1 -0
  226. package/src/render/prerender.d.ts +56 -0
  227. package/src/render/prerender.js +98 -0
  228. package/src/render/prerender.js.map +1 -0
  229. package/src/renderers/cache.d.ts +144 -0
  230. package/src/renderers/cache.js +240 -0
  231. package/src/renderers/cache.js.map +1 -0
  232. package/src/renderers/html.renderer.d.ts +122 -0
  233. package/src/renderers/html.renderer.js +204 -0
  234. package/src/renderers/html.renderer.js.map +1 -0
  235. package/src/renderers/index.d.ts +35 -0
  236. package/src/renderers/index.js +70 -0
  237. package/src/renderers/index.js.map +1 -0
  238. package/src/renderers/mdx.renderer.d.ts +119 -0
  239. package/src/renderers/mdx.renderer.js +305 -0
  240. package/src/renderers/mdx.renderer.js.map +1 -0
  241. package/src/renderers/react.renderer.d.ts +95 -0
  242. package/src/renderers/react.renderer.js +260 -0
  243. package/src/renderers/react.renderer.js.map +1 -0
  244. package/src/renderers/registry.d.ts +133 -0
  245. package/src/renderers/registry.js +232 -0
  246. package/src/renderers/registry.js.map +1 -0
  247. package/src/renderers/types.d.ts +341 -0
  248. package/src/renderers/types.js +9 -0
  249. package/src/renderers/types.js.map +1 -0
  250. package/src/renderers/utils/detect.d.ts +106 -0
  251. package/src/renderers/utils/detect.js +267 -0
  252. package/src/renderers/utils/detect.js.map +1 -0
  253. package/src/renderers/utils/hash.d.ts +39 -0
  254. package/src/renderers/utils/hash.js +75 -0
  255. package/src/renderers/utils/hash.js.map +1 -0
  256. package/src/renderers/utils/index.d.ts +8 -0
  257. package/src/renderers/utils/index.js +28 -0
  258. package/src/renderers/utils/index.js.map +1 -0
  259. package/src/renderers/utils/transpiler.d.ts +88 -0
  260. package/src/renderers/utils/transpiler.js +215 -0
  261. package/src/renderers/utils/transpiler.js.map +1 -0
  262. package/src/runtime/adapters/html.adapter.d.ts +58 -0
  263. package/src/runtime/adapters/html.adapter.js +131 -0
  264. package/src/runtime/adapters/html.adapter.js.map +1 -0
  265. package/src/runtime/adapters/index.d.ts +25 -0
  266. package/src/runtime/adapters/index.js +54 -0
  267. package/src/runtime/adapters/index.js.map +1 -0
  268. package/src/runtime/adapters/mdx.adapter.d.ts +72 -0
  269. package/src/runtime/adapters/mdx.adapter.js +241 -0
  270. package/src/runtime/adapters/mdx.adapter.js.map +1 -0
  271. package/src/runtime/adapters/react.adapter.d.ts +69 -0
  272. package/src/runtime/adapters/react.adapter.js +245 -0
  273. package/src/runtime/adapters/react.adapter.js.map +1 -0
  274. package/src/runtime/adapters/types.d.ts +94 -0
  275. package/src/runtime/adapters/types.js +11 -0
  276. package/src/runtime/adapters/types.js.map +1 -0
  277. package/src/runtime/csp.d.ts +37 -0
  278. package/src/runtime/csp.js +140 -0
  279. package/src/runtime/csp.js.map +1 -0
  280. package/src/runtime/index.d.ts +16 -0
  281. package/src/runtime/index.js +72 -0
  282. package/src/runtime/index.js.map +1 -0
  283. package/src/runtime/mcp-bridge.d.ts +100 -0
  284. package/src/runtime/mcp-bridge.js +581 -0
  285. package/src/runtime/mcp-bridge.js.map +1 -0
  286. package/src/runtime/renderer-runtime.d.ts +132 -0
  287. package/src/runtime/renderer-runtime.js +389 -0
  288. package/src/runtime/renderer-runtime.js.map +1 -0
  289. package/src/runtime/sanitizer.d.ts +171 -0
  290. package/src/runtime/sanitizer.js +318 -0
  291. package/src/runtime/sanitizer.js.map +1 -0
  292. package/src/runtime/types.d.ts +414 -0
  293. package/src/runtime/types.js +12 -0
  294. package/src/runtime/types.js.map +1 -0
  295. package/src/runtime/wrapper.d.ts +375 -0
  296. package/src/runtime/wrapper.js +1793 -0
  297. package/src/runtime/wrapper.js.map +1 -0
  298. package/src/styles/index.d.ts +7 -0
  299. package/src/styles/index.js +11 -0
  300. package/src/styles/index.js.map +1 -0
  301. package/src/styles/variants.d.ts +50 -0
  302. package/src/styles/variants.js +175 -0
  303. package/src/styles/variants.js.map +1 -0
  304. package/src/theme/cdn.d.ts +194 -0
  305. package/src/theme/cdn.js +375 -0
  306. package/src/theme/cdn.js.map +1 -0
  307. package/src/theme/index.d.ts +17 -0
  308. package/src/theme/index.js +57 -0
  309. package/src/theme/index.js.map +1 -0
  310. package/src/theme/platforms.d.ts +106 -0
  311. package/src/theme/platforms.js +161 -0
  312. package/src/theme/platforms.js.map +1 -0
  313. package/src/theme/presets/github-openai.d.ts +49 -0
  314. package/src/theme/presets/github-openai.js +189 -0
  315. package/src/theme/presets/github-openai.js.map +1 -0
  316. package/src/theme/presets/index.d.ts +10 -0
  317. package/src/theme/presets/index.js +17 -0
  318. package/src/theme/presets/index.js.map +1 -0
  319. package/src/theme/theme.d.ts +395 -0
  320. package/src/theme/theme.js +332 -0
  321. package/src/theme/theme.js.map +1 -0
  322. package/src/tool-template/builder.d.ts +212 -0
  323. package/src/tool-template/builder.js +397 -0
  324. package/src/tool-template/builder.js.map +1 -0
  325. package/src/tool-template/index.d.ts +15 -0
  326. package/src/tool-template/index.js +38 -0
  327. package/src/tool-template/index.js.map +1 -0
  328. package/src/types/index.d.ts +13 -0
  329. package/src/types/index.js +26 -0
  330. package/src/types/index.js.map +1 -0
  331. package/src/types/ui-config.d.ts +357 -0
  332. package/src/types/ui-config.js +12 -0
  333. package/src/types/ui-config.js.map +1 -0
  334. package/src/types/ui-runtime.d.ts +965 -0
  335. package/src/types/ui-runtime.js +117 -0
  336. package/src/types/ui-runtime.js.map +1 -0
  337. package/src/validation/error-box.d.ts +55 -0
  338. package/src/validation/error-box.js +75 -0
  339. package/src/validation/error-box.js.map +1 -0
  340. package/src/validation/index.d.ts +12 -0
  341. package/src/validation/index.js +21 -0
  342. package/src/validation/index.js.map +1 -0
  343. package/src/validation/wrapper.d.ts +96 -0
  344. package/src/validation/wrapper.js +117 -0
  345. package/src/validation/wrapper.js.map +1 -0
  346. package/src/web-components/core/attribute-parser.d.ts +85 -0
  347. package/src/web-components/core/attribute-parser.js +189 -0
  348. package/src/web-components/core/attribute-parser.js.map +1 -0
  349. package/src/web-components/core/base-element.d.ts +197 -0
  350. package/src/web-components/core/base-element.js +289 -0
  351. package/src/web-components/core/base-element.js.map +1 -0
  352. package/src/web-components/core/index.d.ts +8 -0
  353. package/src/web-components/core/index.js +18 -0
  354. package/src/web-components/core/index.js.map +1 -0
  355. package/src/web-components/elements/fmcp-alert.d.ts +45 -0
  356. package/src/web-components/elements/fmcp-alert.js +93 -0
  357. package/src/web-components/elements/fmcp-alert.js.map +1 -0
  358. package/src/web-components/elements/fmcp-badge.d.ts +46 -0
  359. package/src/web-components/elements/fmcp-badge.js +99 -0
  360. package/src/web-components/elements/fmcp-badge.js.map +1 -0
  361. package/src/web-components/elements/fmcp-button.d.ts +124 -0
  362. package/src/web-components/elements/fmcp-button.js +233 -0
  363. package/src/web-components/elements/fmcp-button.js.map +1 -0
  364. package/src/web-components/elements/fmcp-card.d.ts +52 -0
  365. package/src/web-components/elements/fmcp-card.js +115 -0
  366. package/src/web-components/elements/fmcp-card.js.map +1 -0
  367. package/src/web-components/elements/fmcp-input.d.ts +95 -0
  368. package/src/web-components/elements/fmcp-input.js +248 -0
  369. package/src/web-components/elements/fmcp-input.js.map +1 -0
  370. package/src/web-components/elements/fmcp-select.d.ts +99 -0
  371. package/src/web-components/elements/fmcp-select.js +243 -0
  372. package/src/web-components/elements/fmcp-select.js.map +1 -0
  373. package/src/web-components/elements/index.d.ts +12 -0
  374. package/src/web-components/elements/index.js +34 -0
  375. package/src/web-components/elements/index.js.map +1 -0
  376. package/src/web-components/index.d.ts +49 -0
  377. package/src/web-components/index.js +75 -0
  378. package/src/web-components/index.js.map +1 -0
  379. package/src/web-components/register.d.ts +56 -0
  380. package/src/web-components/register.js +80 -0
  381. package/src/web-components/register.js.map +1 -0
  382. package/src/web-components/types.d.ts +121 -0
  383. package/src/web-components/types.js +25 -0
  384. package/src/web-components/types.js.map +1 -0
  385. package/src/widgets/index.d.ts +7 -0
  386. package/src/widgets/index.js +24 -0
  387. package/src/widgets/index.js.map +1 -0
  388. package/src/widgets/progress.d.ts +132 -0
  389. package/src/widgets/progress.js +303 -0
  390. package/src/widgets/progress.js.map +1 -0
  391. package/src/widgets/resource.d.ts +162 -0
  392. package/src/widgets/resource.js +340 -0
  393. package/src/widgets/resource.js.map +1 -0
@@ -0,0 +1,133 @@
1
+ /**
2
+ * Layout Presets
3
+ *
4
+ * Pre-configured layouts for common page types:
5
+ * - Auth pages (login, register, etc.)
6
+ * - Consent pages (OAuth, permissions)
7
+ * - Error pages
8
+ * - Loading states
9
+ * - Success pages
10
+ * - Widget mode (embedded)
11
+ * - Resource display (OpenAI SDK)
12
+ */
13
+ import { type BaseLayoutOptions } from './base';
14
+ /**
15
+ * Auth layout options
16
+ */
17
+ export interface AuthLayoutOptions extends Omit<BaseLayoutOptions, 'pageType'> {
18
+ /** Show branding/logo */
19
+ showBranding?: boolean;
20
+ /** Custom logo HTML */
21
+ logo?: string;
22
+ /** Footer content */
23
+ footer?: string;
24
+ }
25
+ /**
26
+ * Build auth page layout (login, register, etc.)
27
+ */
28
+ export declare function authLayout(content: string, options: AuthLayoutOptions): string;
29
+ /**
30
+ * Consent layout options
31
+ */
32
+ export interface ConsentLayoutOptions extends Omit<BaseLayoutOptions, 'pageType'> {
33
+ /** App/client name requesting consent */
34
+ clientName?: string;
35
+ /** App icon URL */
36
+ clientIcon?: string;
37
+ /** User info display */
38
+ userInfo?: {
39
+ name?: string;
40
+ email?: string;
41
+ avatar?: string;
42
+ };
43
+ }
44
+ /**
45
+ * Build consent page layout (OAuth consent, permissions)
46
+ */
47
+ export declare function consentLayout(content: string, options: ConsentLayoutOptions): string;
48
+ /**
49
+ * Error layout options
50
+ */
51
+ export interface ErrorLayoutOptions extends Omit<BaseLayoutOptions, 'pageType'> {
52
+ /** Error code */
53
+ errorCode?: string;
54
+ /** Error title */
55
+ errorTitle?: string;
56
+ /** Error message */
57
+ errorMessage?: string;
58
+ /** Show retry button */
59
+ showRetry?: boolean;
60
+ /** Retry URL */
61
+ retryUrl?: string;
62
+ /** Show home button */
63
+ showHome?: boolean;
64
+ /** Home URL */
65
+ homeUrl?: string;
66
+ }
67
+ /**
68
+ * Build error page layout
69
+ */
70
+ export declare function errorLayout(content: string, options: ErrorLayoutOptions): string;
71
+ /**
72
+ * Loading layout options
73
+ */
74
+ export interface LoadingLayoutOptions extends Omit<BaseLayoutOptions, 'pageType'> {
75
+ /** Loading message */
76
+ message?: string;
77
+ /** Show spinner */
78
+ showSpinner?: boolean;
79
+ /** Show progress bar */
80
+ showProgress?: boolean;
81
+ /** Progress value (0-100) */
82
+ progress?: number;
83
+ }
84
+ /**
85
+ * Build loading page layout
86
+ */
87
+ export declare function loadingLayout(content: string, options: LoadingLayoutOptions): string;
88
+ /**
89
+ * Success layout options
90
+ */
91
+ export interface SuccessLayoutOptions extends Omit<BaseLayoutOptions, 'pageType'> {
92
+ /** Success title */
93
+ successTitle?: string;
94
+ /** Success message */
95
+ successMessage?: string;
96
+ /** Continue button text */
97
+ continueText?: string;
98
+ /** Continue URL */
99
+ continueUrl?: string;
100
+ /** Auto-close countdown (seconds) */
101
+ autoClose?: number;
102
+ }
103
+ /**
104
+ * Build success page layout
105
+ */
106
+ export declare function successLayout(content: string, options: SuccessLayoutOptions): string;
107
+ /**
108
+ * Widget layout options (for embedded widgets)
109
+ */
110
+ export interface WidgetLayoutOptions extends Omit<BaseLayoutOptions, 'pageType' | 'alignment'> {
111
+ /** Widget max width */
112
+ maxWidth?: string;
113
+ /** Show border */
114
+ showBorder?: boolean;
115
+ /** Transparent background */
116
+ transparent?: boolean;
117
+ }
118
+ /**
119
+ * Build widget layout (for embedding)
120
+ */
121
+ export declare function widgetLayout(content: string, options: WidgetLayoutOptions): string;
122
+ /**
123
+ * Pre-configured auth layout builder
124
+ */
125
+ export declare const authLayoutBuilder: (content: string, options?: Partial<BaseLayoutOptions>) => string;
126
+ /**
127
+ * Pre-configured consent layout builder
128
+ */
129
+ export declare const consentLayoutBuilder: (content: string, options?: Partial<BaseLayoutOptions>) => string;
130
+ /**
131
+ * Pre-configured error layout builder
132
+ */
133
+ export declare const errorLayoutBuilder: (content: string, options?: Partial<BaseLayoutOptions>) => string;
@@ -0,0 +1,277 @@
1
+ "use strict";
2
+ /**
3
+ * Layout Presets
4
+ *
5
+ * Pre-configured layouts for common page types:
6
+ * - Auth pages (login, register, etc.)
7
+ * - Consent pages (OAuth, permissions)
8
+ * - Error pages
9
+ * - Loading states
10
+ * - Success pages
11
+ * - Widget mode (embedded)
12
+ * - Resource display (OpenAI SDK)
13
+ */
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.errorLayoutBuilder = exports.consentLayoutBuilder = exports.authLayoutBuilder = void 0;
16
+ exports.authLayout = authLayout;
17
+ exports.consentLayout = consentLayout;
18
+ exports.errorLayout = errorLayout;
19
+ exports.loadingLayout = loadingLayout;
20
+ exports.successLayout = successLayout;
21
+ exports.widgetLayout = widgetLayout;
22
+ const base_1 = require("./base");
23
+ /**
24
+ * Build auth page layout (login, register, etc.)
25
+ */
26
+ function authLayout(content, options) {
27
+ const { showBranding = true, logo, footer, ...baseOptions } = options;
28
+ const brandingHtml = showBranding && logo
29
+ ? `<div class="text-center mb-8">${logo}</div>`
30
+ : showBranding
31
+ ? `<div class="text-center mb-8">
32
+ <div class="inline-flex items-center justify-center w-16 h-16 rounded-xl bg-gradient-to-br from-primary to-secondary mb-4">
33
+ <svg class="w-8 h-8 text-white" fill="none" stroke="currentColor" viewBox="0 0 24 24">
34
+ <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"/>
35
+ </svg>
36
+ </div>
37
+ </div>`
38
+ : '';
39
+ const footerHtml = footer ? `<div class="mt-8 text-center text-sm text-text-secondary">${footer}</div>` : '';
40
+ const wrappedContent = `
41
+ <div class="bg-white rounded-2xl shadow-xl p-8">
42
+ ${brandingHtml}
43
+ ${content}
44
+ </div>
45
+ ${footerHtml}
46
+ `;
47
+ return (0, base_1.baseLayout)(wrappedContent, {
48
+ ...baseOptions,
49
+ pageType: 'auth',
50
+ size: baseOptions.size ?? 'sm',
51
+ alignment: 'center',
52
+ background: 'gradient',
53
+ });
54
+ }
55
+ /**
56
+ * Build consent page layout (OAuth consent, permissions)
57
+ */
58
+ function consentLayout(content, options) {
59
+ const { clientName, clientIcon, userInfo, ...baseOptions } = options;
60
+ const headerHtml = clientName
61
+ ? `<div class="text-center mb-6">
62
+ ${clientIcon
63
+ ? `<img src="${(0, base_1.escapeHtml)(clientIcon)}" alt="${(0, base_1.escapeHtml)(clientName)}" class="w-16 h-16 rounded-xl mx-auto mb-4">`
64
+ : `<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">
65
+ ${(0, base_1.escapeHtml)(clientName.charAt(0).toUpperCase())}
66
+ </div>`}
67
+ <h1 class="text-2xl font-bold text-text-primary">${(0, base_1.escapeHtml)(clientName)}</h1>
68
+ </div>`
69
+ : '';
70
+ const userInfoHtml = userInfo
71
+ ? `<div class="flex items-center gap-3 p-3 bg-gray-50 rounded-lg mb-6">
72
+ ${userInfo.avatar
73
+ ? `<img src="${(0, base_1.escapeHtml)(userInfo.avatar)}" class="w-10 h-10 rounded-full">`
74
+ : `<div class="w-10 h-10 rounded-full bg-primary text-white flex items-center justify-center font-medium">
75
+ ${(0, base_1.escapeHtml)((userInfo.name || userInfo.email || 'U').charAt(0).toUpperCase())}
76
+ </div>`}
77
+ <div>
78
+ ${userInfo.name ? `<div class="font-medium text-text-primary">${(0, base_1.escapeHtml)(userInfo.name)}</div>` : ''}
79
+ ${userInfo.email ? `<div class="text-sm text-text-secondary">${(0, base_1.escapeHtml)(userInfo.email)}</div>` : ''}
80
+ </div>
81
+ </div>`
82
+ : '';
83
+ const wrappedContent = `
84
+ ${headerHtml}
85
+ ${userInfoHtml}
86
+ ${content}
87
+ `;
88
+ return (0, base_1.baseLayout)(wrappedContent, {
89
+ ...baseOptions,
90
+ pageType: 'consent',
91
+ size: baseOptions.size ?? 'lg',
92
+ alignment: 'top',
93
+ background: 'solid',
94
+ });
95
+ }
96
+ /**
97
+ * Build error page layout
98
+ */
99
+ function errorLayout(content, options) {
100
+ const { errorCode, errorTitle = 'Something went wrong', errorMessage, showRetry = true, retryUrl, showHome = true, homeUrl = '/', ...baseOptions } = options;
101
+ const errorHtml = `
102
+ <div class="text-center">
103
+ <!-- Error icon -->
104
+ <div class="inline-flex items-center justify-center w-20 h-20 rounded-full bg-danger/10 mb-6">
105
+ <svg class="w-10 h-10 text-danger" fill="none" stroke="currentColor" viewBox="0 0 24 24">
106
+ <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"/>
107
+ </svg>
108
+ </div>
109
+
110
+ ${errorCode ? `<p class="text-6xl font-bold text-danger mb-2">${(0, base_1.escapeHtml)(errorCode)}</p>` : ''}
111
+ <h1 class="text-2xl font-bold text-text-primary mb-4">${(0, base_1.escapeHtml)(errorTitle)}</h1>
112
+ ${errorMessage ? `<p class="text-text-secondary mb-8">${(0, base_1.escapeHtml)(errorMessage)}</p>` : ''}
113
+
114
+ ${content}
115
+
116
+ <div class="flex gap-4 justify-center mt-8">
117
+ ${showRetry
118
+ ? `<button onclick="${retryUrl ? `window.location.href='${(0, base_1.escapeHtml)(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>`
119
+ : ''}
120
+ ${showHome
121
+ ? `<a href="${(0, base_1.escapeHtml)(homeUrl)}" class="px-6 py-3 bg-gray-100 hover:bg-gray-200 text-text-primary font-medium rounded-lg transition-colors">Go Home</a>`
122
+ : ''}
123
+ </div>
124
+ </div>
125
+ `;
126
+ return (0, base_1.baseLayout)(errorHtml, {
127
+ ...baseOptions,
128
+ pageType: 'error',
129
+ size: 'sm',
130
+ alignment: 'center',
131
+ background: 'solid',
132
+ title: baseOptions.title ?? errorTitle,
133
+ });
134
+ }
135
+ /**
136
+ * Build loading page layout
137
+ */
138
+ function loadingLayout(content, options) {
139
+ const { message = 'Loading...', showSpinner = true, showProgress = false, progress = 0, ...baseOptions } = options;
140
+ const spinnerHtml = showSpinner
141
+ ? `<div class="inline-flex items-center justify-center w-16 h-16 mb-6">
142
+ <svg class="animate-spin w-12 h-12 text-primary" fill="none" viewBox="0 0 24 24">
143
+ <circle class="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" stroke-width="4"></circle>
144
+ <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>
145
+ </svg>
146
+ </div>`
147
+ : '';
148
+ const progressHtml = showProgress
149
+ ? `<div class="w-full bg-gray-200 rounded-full h-2 mb-4">
150
+ <div class="bg-primary h-2 rounded-full transition-all duration-300" style="width: ${progress}%"></div>
151
+ </div>`
152
+ : '';
153
+ const loadingHtml = `
154
+ <div class="text-center">
155
+ ${spinnerHtml}
156
+ <h2 class="text-xl font-medium text-text-primary mb-2">${(0, base_1.escapeHtml)(message)}</h2>
157
+ ${progressHtml}
158
+ ${content}
159
+ </div>
160
+ `;
161
+ return (0, base_1.baseLayout)(loadingHtml, {
162
+ ...baseOptions,
163
+ pageType: 'loading',
164
+ size: 'sm',
165
+ alignment: 'center',
166
+ background: 'solid',
167
+ title: baseOptions.title ?? 'Loading',
168
+ });
169
+ }
170
+ /**
171
+ * Build success page layout
172
+ */
173
+ function successLayout(content, options) {
174
+ const { successTitle = 'Success!', successMessage, continueText = 'Continue', continueUrl, autoClose, ...baseOptions } = options;
175
+ const autoCloseScript = autoClose
176
+ ? `<script>
177
+ let countdown = ${autoClose};
178
+ const countdownEl = document.getElementById('countdown');
179
+ const interval = setInterval(() => {
180
+ countdown--;
181
+ if (countdownEl) countdownEl.textContent = countdown;
182
+ if (countdown <= 0) {
183
+ clearInterval(interval);
184
+ ${continueUrl ? `window.location.href = '${(0, base_1.escapeHtml)(continueUrl)}';` : 'window.close();'}
185
+ }
186
+ }, 1000);
187
+ </script>`
188
+ : '';
189
+ const successHtml = `
190
+ <div class="text-center">
191
+ <!-- Success icon -->
192
+ <div class="inline-flex items-center justify-center w-20 h-20 rounded-full bg-success/10 mb-6">
193
+ <svg class="w-10 h-10 text-success" fill="none" stroke="currentColor" viewBox="0 0 24 24">
194
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 13l4 4L19 7"/>
195
+ </svg>
196
+ </div>
197
+
198
+ <h1 class="text-2xl font-bold text-text-primary mb-4">${(0, base_1.escapeHtml)(successTitle)}</h1>
199
+ ${successMessage ? `<p class="text-text-secondary mb-8">${(0, base_1.escapeHtml)(successMessage)}</p>` : ''}
200
+
201
+ ${content}
202
+
203
+ ${continueUrl
204
+ ? `<a href="${(0, base_1.escapeHtml)(continueUrl)}" class="inline-block mt-6 px-6 py-3 bg-primary hover:bg-primary/90 text-white font-medium rounded-lg transition-colors">${(0, base_1.escapeHtml)(continueText)}</a>`
205
+ : ''}
206
+
207
+ ${autoClose
208
+ ? `<p class="mt-4 text-sm text-text-secondary">Closing in <span id="countdown">${autoClose}</span> seconds...</p>`
209
+ : ''}
210
+ </div>
211
+ ${autoCloseScript}
212
+ `;
213
+ return (0, base_1.baseLayout)(successHtml, {
214
+ ...baseOptions,
215
+ pageType: 'success',
216
+ size: 'sm',
217
+ alignment: 'center',
218
+ background: 'solid',
219
+ title: baseOptions.title ?? successTitle,
220
+ });
221
+ }
222
+ /**
223
+ * Build widget layout (for embedding)
224
+ */
225
+ function widgetLayout(content, options) {
226
+ const { maxWidth = '100%', showBorder = false, transparent = true, ...baseOptions } = options;
227
+ const containerClasses = [
228
+ 'widget-container',
229
+ showBorder ? 'border border-border rounded-lg' : '',
230
+ transparent ? '' : 'bg-surface',
231
+ ]
232
+ .filter(Boolean)
233
+ .join(' ');
234
+ const wrappedContent = `
235
+ <div class="${containerClasses}" style="max-width: ${(0, base_1.escapeHtml)(maxWidth)}">
236
+ ${content}
237
+ </div>
238
+ `;
239
+ return (0, base_1.baseLayout)(wrappedContent, {
240
+ ...baseOptions,
241
+ pageType: 'widget',
242
+ size: 'full',
243
+ alignment: 'start',
244
+ background: 'none',
245
+ });
246
+ }
247
+ // ============================================
248
+ // Layout Builders
249
+ // ============================================
250
+ /**
251
+ * Pre-configured auth layout builder
252
+ */
253
+ exports.authLayoutBuilder = (0, base_1.createLayoutBuilder)({
254
+ pageType: 'auth',
255
+ size: 'sm',
256
+ alignment: 'center',
257
+ background: 'gradient',
258
+ });
259
+ /**
260
+ * Pre-configured consent layout builder
261
+ */
262
+ exports.consentLayoutBuilder = (0, base_1.createLayoutBuilder)({
263
+ pageType: 'consent',
264
+ size: 'lg',
265
+ alignment: 'top',
266
+ background: 'solid',
267
+ });
268
+ /**
269
+ * Pre-configured error layout builder
270
+ */
271
+ exports.errorLayoutBuilder = (0, base_1.createLayoutBuilder)({
272
+ pageType: 'error',
273
+ size: 'sm',
274
+ alignment: 'center',
275
+ background: 'solid',
276
+ });
277
+ //# sourceMappingURL=presets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"presets.js","sourceRoot":"","sources":["../../../src/layouts/presets.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Layout Presets\n *\n * Pre-configured layouts for common page types:\n * - Auth pages (login, register, etc.)\n * - Consent pages (OAuth, permissions)\n * - Error pages\n * - Loading states\n * - Success pages\n * - Widget mode (embedded)\n * - Resource display (OpenAI SDK)\n */\n\nimport { baseLayout, createLayoutBuilder, type BaseLayoutOptions, type PageType, escapeHtml } from './base';\n\n// ============================================\n// Auth Layout\n// ============================================\n\n/**\n * Auth layout options\n */\nexport interface AuthLayoutOptions extends Omit<BaseLayoutOptions, 'pageType'> {\n /** Show branding/logo */\n showBranding?: boolean;\n /** Custom logo HTML */\n logo?: string;\n /** Footer content */\n footer?: string;\n}\n\n/**\n * Build auth page layout (login, register, etc.)\n */\nexport function authLayout(content: string, options: AuthLayoutOptions): string {\n const { showBranding = true, logo, footer, ...baseOptions } = options;\n\n const brandingHtml =\n showBranding && logo\n ? `<div class=\"text-center mb-8\">${logo}</div>`\n : showBranding\n ? `<div class=\"text-center mb-8\">\n <div class=\"inline-flex items-center justify-center w-16 h-16 rounded-xl bg-gradient-to-br from-primary to-secondary mb-4\">\n <svg class=\"w-8 h-8 text-white\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <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\"/>\n </svg>\n </div>\n </div>`\n : '';\n\n const footerHtml = footer ? `<div class=\"mt-8 text-center text-sm text-text-secondary\">${footer}</div>` : '';\n\n const wrappedContent = `\n <div class=\"bg-white rounded-2xl shadow-xl p-8\">\n ${brandingHtml}\n ${content}\n </div>\n ${footerHtml}\n `;\n\n return baseLayout(wrappedContent, {\n ...baseOptions,\n pageType: 'auth',\n size: baseOptions.size ?? 'sm',\n alignment: 'center',\n background: 'gradient',\n });\n}\n\n// ============================================\n// Consent Layout\n// ============================================\n\n/**\n * Consent layout options\n */\nexport interface ConsentLayoutOptions extends Omit<BaseLayoutOptions, 'pageType'> {\n /** App/client name requesting consent */\n clientName?: string;\n /** App icon URL */\n clientIcon?: string;\n /** User info display */\n userInfo?: {\n name?: string;\n email?: string;\n avatar?: string;\n };\n}\n\n/**\n * Build consent page layout (OAuth consent, permissions)\n */\nexport function consentLayout(content: string, options: ConsentLayoutOptions): string {\n const { clientName, clientIcon, userInfo, ...baseOptions } = options;\n\n const headerHtml = clientName\n ? `<div class=\"text-center mb-6\">\n ${\n clientIcon\n ? `<img src=\"${escapeHtml(clientIcon)}\" alt=\"${escapeHtml(\n clientName,\n )}\" class=\"w-16 h-16 rounded-xl mx-auto mb-4\">`\n : `<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\">\n ${escapeHtml(clientName.charAt(0).toUpperCase())}\n </div>`\n }\n <h1 class=\"text-2xl font-bold text-text-primary\">${escapeHtml(clientName)}</h1>\n </div>`\n : '';\n\n const userInfoHtml = userInfo\n ? `<div class=\"flex items-center gap-3 p-3 bg-gray-50 rounded-lg mb-6\">\n ${\n userInfo.avatar\n ? `<img src=\"${escapeHtml(userInfo.avatar)}\" class=\"w-10 h-10 rounded-full\">`\n : `<div class=\"w-10 h-10 rounded-full bg-primary text-white flex items-center justify-center font-medium\">\n ${escapeHtml((userInfo.name || userInfo.email || 'U').charAt(0).toUpperCase())}\n </div>`\n }\n <div>\n ${userInfo.name ? `<div class=\"font-medium text-text-primary\">${escapeHtml(userInfo.name)}</div>` : ''}\n ${userInfo.email ? `<div class=\"text-sm text-text-secondary\">${escapeHtml(userInfo.email)}</div>` : ''}\n </div>\n </div>`\n : '';\n\n const wrappedContent = `\n ${headerHtml}\n ${userInfoHtml}\n ${content}\n `;\n\n return baseLayout(wrappedContent, {\n ...baseOptions,\n pageType: 'consent',\n size: baseOptions.size ?? 'lg',\n alignment: 'top',\n background: 'solid',\n });\n}\n\n// ============================================\n// Error Layout\n// ============================================\n\n/**\n * Error layout options\n */\nexport interface ErrorLayoutOptions extends Omit<BaseLayoutOptions, 'pageType'> {\n /** Error code */\n errorCode?: string;\n /** Error title */\n errorTitle?: string;\n /** Error message */\n errorMessage?: string;\n /** Show retry button */\n showRetry?: boolean;\n /** Retry URL */\n retryUrl?: string;\n /** Show home button */\n showHome?: boolean;\n /** Home URL */\n homeUrl?: string;\n}\n\n/**\n * Build error page layout\n */\nexport function errorLayout(content: string, options: ErrorLayoutOptions): string {\n const {\n errorCode,\n errorTitle = 'Something went wrong',\n errorMessage,\n showRetry = true,\n retryUrl,\n showHome = true,\n homeUrl = '/',\n ...baseOptions\n } = options;\n\n const errorHtml = `\n <div class=\"text-center\">\n <!-- Error icon -->\n <div class=\"inline-flex items-center justify-center w-20 h-20 rounded-full bg-danger/10 mb-6\">\n <svg class=\"w-10 h-10 text-danger\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <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\"/>\n </svg>\n </div>\n\n ${errorCode ? `<p class=\"text-6xl font-bold text-danger mb-2\">${escapeHtml(errorCode)}</p>` : ''}\n <h1 class=\"text-2xl font-bold text-text-primary mb-4\">${escapeHtml(errorTitle)}</h1>\n ${errorMessage ? `<p class=\"text-text-secondary mb-8\">${escapeHtml(errorMessage)}</p>` : ''}\n\n ${content}\n\n <div class=\"flex gap-4 justify-center mt-8\">\n ${\n showRetry\n ? `<button onclick=\"${\n retryUrl ? `window.location.href='${escapeHtml(retryUrl)}'` : 'window.location.reload()'\n }\" class=\"px-6 py-3 bg-primary hover:bg-primary/90 text-white font-medium rounded-lg transition-colors\">Try Again</button>`\n : ''\n }\n ${\n showHome\n ? `<a href=\"${escapeHtml(\n homeUrl,\n )}\" class=\"px-6 py-3 bg-gray-100 hover:bg-gray-200 text-text-primary font-medium rounded-lg transition-colors\">Go Home</a>`\n : ''\n }\n </div>\n </div>\n `;\n\n return baseLayout(errorHtml, {\n ...baseOptions,\n pageType: 'error',\n size: 'sm',\n alignment: 'center',\n background: 'solid',\n title: baseOptions.title ?? errorTitle,\n });\n}\n\n// ============================================\n// Loading Layout\n// ============================================\n\n/**\n * Loading layout options\n */\nexport interface LoadingLayoutOptions extends Omit<BaseLayoutOptions, 'pageType'> {\n /** Loading message */\n message?: string;\n /** Show spinner */\n showSpinner?: boolean;\n /** Show progress bar */\n showProgress?: boolean;\n /** Progress value (0-100) */\n progress?: number;\n}\n\n/**\n * Build loading page layout\n */\nexport function loadingLayout(content: string, options: LoadingLayoutOptions): string {\n const { message = 'Loading...', showSpinner = true, showProgress = false, progress = 0, ...baseOptions } = options;\n\n const spinnerHtml = showSpinner\n ? `<div class=\"inline-flex items-center justify-center w-16 h-16 mb-6\">\n <svg class=\"animate-spin w-12 h-12 text-primary\" fill=\"none\" viewBox=\"0 0 24 24\">\n <circle class=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" stroke-width=\"4\"></circle>\n <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>\n </svg>\n </div>`\n : '';\n\n const progressHtml = showProgress\n ? `<div class=\"w-full bg-gray-200 rounded-full h-2 mb-4\">\n <div class=\"bg-primary h-2 rounded-full transition-all duration-300\" style=\"width: ${progress}%\"></div>\n </div>`\n : '';\n\n const loadingHtml = `\n <div class=\"text-center\">\n ${spinnerHtml}\n <h2 class=\"text-xl font-medium text-text-primary mb-2\">${escapeHtml(message)}</h2>\n ${progressHtml}\n ${content}\n </div>\n `;\n\n return baseLayout(loadingHtml, {\n ...baseOptions,\n pageType: 'loading',\n size: 'sm',\n alignment: 'center',\n background: 'solid',\n title: baseOptions.title ?? 'Loading',\n });\n}\n\n// ============================================\n// Success Layout\n// ============================================\n\n/**\n * Success layout options\n */\nexport interface SuccessLayoutOptions extends Omit<BaseLayoutOptions, 'pageType'> {\n /** Success title */\n successTitle?: string;\n /** Success message */\n successMessage?: string;\n /** Continue button text */\n continueText?: string;\n /** Continue URL */\n continueUrl?: string;\n /** Auto-close countdown (seconds) */\n autoClose?: number;\n}\n\n/**\n * Build success page layout\n */\nexport function successLayout(content: string, options: SuccessLayoutOptions): string {\n const {\n successTitle = 'Success!',\n successMessage,\n continueText = 'Continue',\n continueUrl,\n autoClose,\n ...baseOptions\n } = options;\n\n const autoCloseScript = autoClose\n ? `<script>\n let countdown = ${autoClose};\n const countdownEl = document.getElementById('countdown');\n const interval = setInterval(() => {\n countdown--;\n if (countdownEl) countdownEl.textContent = countdown;\n if (countdown <= 0) {\n clearInterval(interval);\n ${continueUrl ? `window.location.href = '${escapeHtml(continueUrl)}';` : 'window.close();'}\n }\n }, 1000);\n </script>`\n : '';\n\n const successHtml = `\n <div class=\"text-center\">\n <!-- Success icon -->\n <div class=\"inline-flex items-center justify-center w-20 h-20 rounded-full bg-success/10 mb-6\">\n <svg class=\"w-10 h-10 text-success\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M5 13l4 4L19 7\"/>\n </svg>\n </div>\n\n <h1 class=\"text-2xl font-bold text-text-primary mb-4\">${escapeHtml(successTitle)}</h1>\n ${successMessage ? `<p class=\"text-text-secondary mb-8\">${escapeHtml(successMessage)}</p>` : ''}\n\n ${content}\n\n ${\n continueUrl\n ? `<a href=\"${escapeHtml(\n continueUrl,\n )}\" class=\"inline-block mt-6 px-6 py-3 bg-primary hover:bg-primary/90 text-white font-medium rounded-lg transition-colors\">${escapeHtml(\n continueText,\n )}</a>`\n : ''\n }\n\n ${\n autoClose\n ? `<p class=\"mt-4 text-sm text-text-secondary\">Closing in <span id=\"countdown\">${autoClose}</span> seconds...</p>`\n : ''\n }\n </div>\n ${autoCloseScript}\n `;\n\n return baseLayout(successHtml, {\n ...baseOptions,\n pageType: 'success',\n size: 'sm',\n alignment: 'center',\n background: 'solid',\n title: baseOptions.title ?? successTitle,\n });\n}\n\n// ============================================\n// Widget Layout\n// ============================================\n\n/**\n * Widget layout options (for embedded widgets)\n */\nexport interface WidgetLayoutOptions extends Omit<BaseLayoutOptions, 'pageType' | 'alignment'> {\n /** Widget max width */\n maxWidth?: string;\n /** Show border */\n showBorder?: boolean;\n /** Transparent background */\n transparent?: boolean;\n}\n\n/**\n * Build widget layout (for embedding)\n */\nexport function widgetLayout(content: string, options: WidgetLayoutOptions): string {\n const { maxWidth = '100%', showBorder = false, transparent = true, ...baseOptions } = options;\n\n const containerClasses = [\n 'widget-container',\n showBorder ? 'border border-border rounded-lg' : '',\n transparent ? '' : 'bg-surface',\n ]\n .filter(Boolean)\n .join(' ');\n\n const wrappedContent = `\n <div class=\"${containerClasses}\" style=\"max-width: ${escapeHtml(maxWidth)}\">\n ${content}\n </div>\n `;\n\n return baseLayout(wrappedContent, {\n ...baseOptions,\n pageType: 'widget',\n size: 'full',\n alignment: 'start',\n background: 'none',\n });\n}\n\n// ============================================\n// Layout Builders\n// ============================================\n\n/**\n * Pre-configured auth layout builder\n */\nexport const authLayoutBuilder = createLayoutBuilder({\n pageType: 'auth',\n size: 'sm',\n alignment: 'center',\n background: 'gradient',\n});\n\n/**\n * Pre-configured consent layout builder\n */\nexport const consentLayoutBuilder = createLayoutBuilder({\n pageType: 'consent',\n size: 'lg',\n alignment: 'top',\n background: 'solid',\n});\n\n/**\n * Pre-configured error layout builder\n */\nexport const errorLayoutBuilder = createLayoutBuilder({\n pageType: 'error',\n size: 'sm',\n alignment: 'center',\n background: 'solid',\n});\n"]}
@@ -0,0 +1,116 @@
1
+ /**
2
+ * OAuth Consent Page Template
3
+ *
4
+ * OAuth/OpenID Connect consent page for authorization flows.
5
+ */
6
+ import { type ConsentLayoutOptions } from '../layouts';
7
+ import { type PermissionItem } from '../components/list';
8
+ /**
9
+ * Client/Application information
10
+ */
11
+ export interface ClientInfo {
12
+ /** Client ID */
13
+ clientId: string;
14
+ /** Client name */
15
+ name: string;
16
+ /** Client icon/logo URL */
17
+ icon?: string;
18
+ /** Client website URL */
19
+ websiteUrl?: string;
20
+ /** Privacy policy URL */
21
+ privacyUrl?: string;
22
+ /** Terms of service URL */
23
+ termsUrl?: string;
24
+ /** Verified client badge */
25
+ verified?: boolean;
26
+ }
27
+ /**
28
+ * User information
29
+ */
30
+ export interface UserInfo {
31
+ /** User ID */
32
+ id?: string;
33
+ /** User name */
34
+ name?: string;
35
+ /** User email */
36
+ email?: string;
37
+ /** Avatar URL */
38
+ avatar?: string;
39
+ }
40
+ /**
41
+ * Consent page options
42
+ */
43
+ export interface ConsentPageOptions {
44
+ /** Client/App requesting authorization */
45
+ client: ClientInfo;
46
+ /** Current user info */
47
+ user?: UserInfo;
48
+ /** Requested permissions/scopes */
49
+ permissions: PermissionItem[];
50
+ /** Form action URL for approval */
51
+ approveUrl: string;
52
+ /** Form action URL for denial (optional, uses approveUrl if not provided) */
53
+ denyUrl?: string;
54
+ /** CSRF token */
55
+ csrfToken?: string;
56
+ /** OAuth state parameter */
57
+ state?: string;
58
+ /** Redirect URI */
59
+ redirectUri?: string;
60
+ /** Response type */
61
+ responseType?: string;
62
+ /** Nonce */
63
+ nonce?: string;
64
+ /** Code challenge */
65
+ codeChallenge?: string;
66
+ /** Code challenge method */
67
+ codeChallengeMethod?: string;
68
+ /** Error message */
69
+ error?: string;
70
+ /** Layout options */
71
+ layout?: Partial<ConsentLayoutOptions>;
72
+ /** Custom warning message */
73
+ warningMessage?: string;
74
+ /** Allow partial scope selection */
75
+ allowScopeSelection?: boolean;
76
+ /** Custom approve button text */
77
+ approveText?: string;
78
+ /** Custom deny button text */
79
+ denyText?: string;
80
+ }
81
+ /**
82
+ * Build an OAuth consent page
83
+ */
84
+ export declare function consentPage(options: ConsentPageOptions): string;
85
+ /**
86
+ * Consent success page options
87
+ */
88
+ export interface ConsentSuccessOptions {
89
+ /** Client info */
90
+ client: ClientInfo;
91
+ /** Redirect URL */
92
+ redirectUrl?: string;
93
+ /** Auto redirect delay (ms) */
94
+ autoRedirectDelay?: number;
95
+ /** Layout options */
96
+ layout?: Partial<ConsentLayoutOptions>;
97
+ }
98
+ /**
99
+ * Build a consent success page
100
+ */
101
+ export declare function consentSuccessPage(options: ConsentSuccessOptions): string;
102
+ /**
103
+ * Consent denied page options
104
+ */
105
+ export interface ConsentDeniedOptions {
106
+ /** Client info */
107
+ client: ClientInfo;
108
+ /** Redirect URL */
109
+ redirectUrl?: string;
110
+ /** Layout options */
111
+ layout?: Partial<ConsentLayoutOptions>;
112
+ }
113
+ /**
114
+ * Build a consent denied page
115
+ */
116
+ export declare function consentDeniedPage(options: ConsentDeniedOptions): string;