@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 @@
1
+ {"version":3,"file":"avatar.schema.js","sourceRoot":"","sources":["../../../src/components/avatar.schema.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;GAkBG;;;AAEH,6BAAwB;AAExB,+CAA+C;AAC/C,kCAAkC;AAClC,+CAA+C;AAE/C;;GAEG;AACU,QAAA,gBAAgB,GAAG,OAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;AAO9E;;GAEG;AACU,QAAA,iBAAiB,GAAG,OAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC;AAOzE;;GAEG;AACU,QAAA,kBAAkB,GAAG,OAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;AAOxF,+CAA+C;AAC/C,wBAAwB;AACxB,+CAA+C;AAE/C;;GAEG;AACU,QAAA,mBAAmB,GAAG,OAAC;KACjC,MAAM,CAAC;IACN,uBAAuB;IACvB,GAAG,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC1B,iCAAiC;IACjC,GAAG,EAAE,OAAC,CAAC,MAAM,EAAE;IACf,kBAAkB;IAClB,IAAI,EAAE,wBAAgB,CAAC,QAAQ,EAAE;IACjC,mBAAmB;IACnB,KAAK,EAAE,yBAAiB,CAAC,QAAQ,EAAE;IACnC,uBAAuB;IACvB,MAAM,EAAE,0BAAkB,CAAC,QAAQ,EAAE;IACrC,6BAA6B;IAC7B,SAAS,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAChC,wBAAwB;IACxB,IAAI,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC3B,kDAAkD;IAClD,QAAQ,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC/B,gDAAgD;IAChD,OAAO,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CAC/B,CAAC;KACD,MAAM,EAAE,CAAC;AAOZ,+CAA+C;AAC/C,sBAAsB;AACtB,+CAA+C;AAE/C;;GAEG;AACU,QAAA,mBAAmB,GAAG,OAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;AAExE;;GAEG;AACU,QAAA,wBAAwB,GAAG,OAAC;KACtC,MAAM,CAAC;IACN,8BAA8B;IAC9B,GAAG,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IACjC,kBAAkB;IAClB,IAAI,EAAE,wBAAgB,CAAC,QAAQ,EAAE;IACjC,qBAAqB;IACrB,OAAO,EAAE,2BAAmB,CAAC,QAAQ,EAAE;IACvC,6BAA6B;IAC7B,SAAS,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CACjC,CAAC;KACD,MAAM,EAAE,CAAC;AAOZ,+CAA+C;AAC/C,0BAA0B;AAC1B,+CAA+C;AAE/C;;GAEG;AACU,QAAA,2BAA2B,GAAG,2BAAmB,CAAC,MAAM,CAAC;IACpE,0BAA0B;IAC1B,IAAI,EAAE,OAAC,CAAC,MAAM,EAAE;IAChB,yCAAyC;IACzC,QAAQ,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC/B,qBAAqB;IACrB,KAAK,EAAE,OAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,QAAQ,EAAE;CAC5C,CAAC,CAAC,MAAM,EAAE,CAAC","sourcesContent":["/**\n * @file avatar.schema.ts\n * @description Zod schemas for Avatar component options validation.\n *\n * Provides strict validation schemas for avatar options including sizes,\n * shapes, status indicators, and avatar groups with text.\n *\n * @example\n * ```typescript\n * import { AvatarOptionsSchema } from '@frontmcp/ui';\n *\n * const result = AvatarOptionsSchema.safeParse({\n * alt: 'John Doe',\n * size: 'lg',\n * });\n * ```\n *\n * @module @frontmcp/ui/components/avatar.schema\n */\n\nimport { z } from 'zod';\n\n// ============================================\n// Size, Shape, and Status Schemas\n// ============================================\n\n/**\n * Avatar size enum schema\n */\nexport const AvatarSizeSchema = z.enum(['xs', 'sm', 'md', 'lg', 'xl', '2xl']);\n\n/**\n * Avatar size type\n */\nexport type AvatarSize = z.infer<typeof AvatarSizeSchema>;\n\n/**\n * Avatar shape enum schema\n */\nexport const AvatarShapeSchema = z.enum(['circle', 'square', 'rounded']);\n\n/**\n * Avatar shape type\n */\nexport type AvatarShape = z.infer<typeof AvatarShapeSchema>;\n\n/**\n * Avatar status enum schema\n */\nexport const AvatarStatusSchema = z.enum(['online', 'offline', 'busy', 'away', 'none']);\n\n/**\n * Avatar status type\n */\nexport type AvatarStatus = z.infer<typeof AvatarStatusSchema>;\n\n// ============================================\n// Avatar Options Schema\n// ============================================\n\n/**\n * Complete avatar options schema\n */\nexport const AvatarOptionsSchema = z\n .object({\n /** Image source URL */\n src: z.string().optional(),\n /** Alt text / name (required) */\n alt: z.string(),\n /** Avatar size */\n size: AvatarSizeSchema.optional(),\n /** Avatar shape */\n shape: AvatarShapeSchema.optional(),\n /** Status indicator */\n status: AvatarStatusSchema.optional(),\n /** Additional CSS classes */\n className: z.string().optional(),\n /** Click handler URL */\n href: z.string().optional(),\n /** Custom initials (overrides auto-generation) */\n initials: z.string().optional(),\n /** Background color for initials (CSS color) */\n bgColor: z.string().optional(),\n })\n .strict();\n\n/**\n * Avatar options type (derived from schema)\n */\nexport type AvatarOptions = z.infer<typeof AvatarOptionsSchema>;\n\n// ============================================\n// Avatar Group Schema\n// ============================================\n\n/**\n * Avatar group spacing schema\n */\nexport const AvatarSpacingSchema = z.enum(['tight', 'normal', 'loose']);\n\n/**\n * Avatar group options schema\n */\nexport const AvatarGroupOptionsSchema = z\n .object({\n /** Maximum visible avatars */\n max: z.number().min(1).optional(),\n /** Avatar size */\n size: AvatarSizeSchema.optional(),\n /** Overlap amount */\n spacing: AvatarSpacingSchema.optional(),\n /** Additional CSS classes */\n className: z.string().optional(),\n })\n .strict();\n\n/**\n * Avatar group options type\n */\nexport type AvatarGroupOptions = z.infer<typeof AvatarGroupOptionsSchema>;\n\n// ============================================\n// Avatar with Text Schema\n// ============================================\n\n/**\n * Avatar with text options schema\n */\nexport const AvatarWithTextOptionsSchema = AvatarOptionsSchema.extend({\n /** Primary text (name) */\n name: z.string(),\n /** Secondary text (email, role, etc.) */\n subtitle: z.string().optional(),\n /** Text alignment */\n align: z.enum(['left', 'right']).optional(),\n}).strict();\n\n/**\n * Avatar with text options type\n */\nexport type AvatarWithTextOptions = z.infer<typeof AvatarWithTextOptionsSchema>;\n"]}
@@ -0,0 +1,70 @@
1
+ /**
2
+ * Badge Component
3
+ *
4
+ * Small status indicators and labels.
5
+ */
6
+ /**
7
+ * Badge variant styles
8
+ */
9
+ export type BadgeVariant = 'default' | 'primary' | 'secondary' | 'success' | 'warning' | 'danger' | 'info' | 'outline';
10
+ /**
11
+ * Badge size options
12
+ */
13
+ export type BadgeSize = 'sm' | 'md' | 'lg';
14
+ /**
15
+ * Badge component options
16
+ */
17
+ export interface BadgeOptions {
18
+ /** Badge variant */
19
+ variant?: BadgeVariant;
20
+ /** Badge size */
21
+ size?: BadgeSize;
22
+ /** Rounded pill style */
23
+ pill?: boolean;
24
+ /** Icon before text */
25
+ icon?: string;
26
+ /** Dot indicator (no text) */
27
+ dot?: boolean;
28
+ /** Additional CSS classes */
29
+ className?: string;
30
+ /** Removable badge */
31
+ removable?: boolean;
32
+ /** Remove button HTMX */
33
+ onRemove?: {
34
+ delete?: string;
35
+ target?: string;
36
+ swap?: string;
37
+ confirm?: string;
38
+ };
39
+ }
40
+ /**
41
+ * Build a badge component
42
+ */
43
+ export declare function badge(text: string, options?: BadgeOptions): string;
44
+ /**
45
+ * Build a badge group
46
+ */
47
+ export declare function badgeGroup(badges: string[], options?: {
48
+ gap?: 'sm' | 'md' | 'lg';
49
+ className?: string;
50
+ }): string;
51
+ /** Active status badge */
52
+ export declare const activeBadge: (text?: string) => string;
53
+ /** Inactive status badge */
54
+ export declare const inactiveBadge: (text?: string) => string;
55
+ /** Pending status badge */
56
+ export declare const pendingBadge: (text?: string) => string;
57
+ /** Error status badge */
58
+ export declare const errorBadge: (text?: string) => string;
59
+ /** New badge */
60
+ export declare const newBadge: (text?: string) => string;
61
+ /** Beta badge */
62
+ export declare const betaBadge: (text?: string) => string;
63
+ /** Online status dot */
64
+ export declare const onlineDot: (label?: string) => string;
65
+ /** Offline status dot */
66
+ export declare const offlineDot: (label?: string) => string;
67
+ /** Busy status dot */
68
+ export declare const busyDot: (label?: string) => string;
69
+ /** Away status dot */
70
+ export declare const awayDot: (label?: string) => string;
@@ -0,0 +1,149 @@
1
+ "use strict";
2
+ /**
3
+ * Badge Component
4
+ *
5
+ * Small status indicators and labels.
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.awayDot = exports.busyDot = exports.offlineDot = exports.onlineDot = exports.betaBadge = exports.newBadge = exports.errorBadge = exports.pendingBadge = exports.inactiveBadge = exports.activeBadge = void 0;
9
+ exports.badge = badge;
10
+ exports.badgeGroup = badgeGroup;
11
+ const base_1 = require("../layouts/base");
12
+ // ============================================
13
+ // Badge Builder
14
+ // ============================================
15
+ /**
16
+ * Get variant CSS classes
17
+ */
18
+ function getVariantClasses(variant) {
19
+ const variants = {
20
+ default: 'bg-gray-100 text-gray-800',
21
+ primary: 'bg-primary/10 text-primary',
22
+ secondary: 'bg-secondary/10 text-secondary',
23
+ success: 'bg-success/10 text-success',
24
+ warning: 'bg-warning/10 text-warning',
25
+ danger: 'bg-danger/10 text-danger',
26
+ info: 'bg-blue-100 text-blue-800',
27
+ outline: 'border border-border text-text-primary bg-transparent',
28
+ };
29
+ return variants[variant];
30
+ }
31
+ /**
32
+ * Get size CSS classes
33
+ */
34
+ function getSizeClasses(size, dot) {
35
+ if (dot) {
36
+ const dotSizes = {
37
+ sm: 'w-2 h-2',
38
+ md: 'w-2.5 h-2.5',
39
+ lg: 'w-3 h-3',
40
+ };
41
+ return dotSizes[size];
42
+ }
43
+ const sizes = {
44
+ sm: 'px-2 py-0.5 text-xs',
45
+ md: 'px-2.5 py-1 text-xs',
46
+ lg: 'px-3 py-1.5 text-sm',
47
+ };
48
+ return sizes[size];
49
+ }
50
+ /**
51
+ * Build a badge component
52
+ */
53
+ function badge(text, options = {}) {
54
+ const { variant = 'default', size = 'md', pill = false, icon, dot = false, className = '', removable = false, onRemove, } = options;
55
+ // Dot badge (status indicator)
56
+ if (dot) {
57
+ const dotVariants = {
58
+ default: 'bg-gray-400',
59
+ primary: 'bg-primary',
60
+ secondary: 'bg-secondary',
61
+ success: 'bg-success',
62
+ warning: 'bg-warning',
63
+ danger: 'bg-danger',
64
+ info: 'bg-blue-500',
65
+ outline: 'border border-current',
66
+ };
67
+ const dotClasses = ['inline-block rounded-full', getSizeClasses(size, true), dotVariants[variant], className]
68
+ .filter(Boolean)
69
+ .join(' ');
70
+ return `<span class="${dotClasses}" aria-label="${(0, base_1.escapeHtml)(text)}" title="${(0, base_1.escapeHtml)(text)}"></span>`;
71
+ }
72
+ const variantClasses = getVariantClasses(variant);
73
+ const sizeClasses = getSizeClasses(size, false);
74
+ const baseClasses = [
75
+ 'inline-flex items-center font-medium',
76
+ pill ? 'rounded-full' : 'rounded-md',
77
+ variantClasses,
78
+ sizeClasses,
79
+ className,
80
+ ]
81
+ .filter(Boolean)
82
+ .join(' ');
83
+ const iconHtml = icon ? `<span class="mr-1">${icon}</span>` : '';
84
+ const removeHtml = removable
85
+ ? `<button
86
+ type="button"
87
+ class="ml-1.5 -mr-1 hover:opacity-70 transition-opacity"
88
+ ${onRemove?.delete ? `hx-delete="${(0, base_1.escapeHtml)(onRemove.delete)}"` : ''}
89
+ ${onRemove?.target ? `hx-target="${(0, base_1.escapeHtml)(onRemove.target)}"` : ''}
90
+ ${onRemove?.swap ? `hx-swap="${(0, base_1.escapeHtml)(onRemove.swap)}"` : ''}
91
+ ${onRemove?.confirm ? `hx-confirm="${(0, base_1.escapeHtml)(onRemove.confirm)}"` : ''}
92
+ aria-label="Remove"
93
+ >
94
+ <svg class="w-3 h-3" fill="none" stroke="currentColor" viewBox="0 0 24 24">
95
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12"/>
96
+ </svg>
97
+ </button>`
98
+ : '';
99
+ return `<span class="${baseClasses}">
100
+ ${iconHtml}${(0, base_1.escapeHtml)(text)}${removeHtml}
101
+ </span>`;
102
+ }
103
+ /**
104
+ * Build a badge group
105
+ */
106
+ function badgeGroup(badges, options = {}) {
107
+ const { gap = 'sm', className = '' } = options;
108
+ const gapClasses = { sm: 'gap-1', md: 'gap-2', lg: 'gap-3' };
109
+ return `<div class="inline-flex flex-wrap ${gapClasses[gap]} ${className}">
110
+ ${badges.join('\n')}
111
+ </div>`;
112
+ }
113
+ // ============================================
114
+ // Status Badge Presets
115
+ // ============================================
116
+ /** Active status badge */
117
+ const activeBadge = (text = 'Active') => badge(text, { variant: 'success', dot: false });
118
+ exports.activeBadge = activeBadge;
119
+ /** Inactive status badge */
120
+ const inactiveBadge = (text = 'Inactive') => badge(text, { variant: 'default', dot: false });
121
+ exports.inactiveBadge = inactiveBadge;
122
+ /** Pending status badge */
123
+ const pendingBadge = (text = 'Pending') => badge(text, { variant: 'warning', dot: false });
124
+ exports.pendingBadge = pendingBadge;
125
+ /** Error status badge */
126
+ const errorBadge = (text = 'Error') => badge(text, { variant: 'danger', dot: false });
127
+ exports.errorBadge = errorBadge;
128
+ /** New badge */
129
+ const newBadge = (text = 'New') => badge(text, { variant: 'primary', size: 'sm', pill: true });
130
+ exports.newBadge = newBadge;
131
+ /** Beta badge */
132
+ const betaBadge = (text = 'Beta') => badge(text, { variant: 'secondary', size: 'sm', pill: true });
133
+ exports.betaBadge = betaBadge;
134
+ // ============================================
135
+ // Status Dot Presets
136
+ // ============================================
137
+ /** Online status dot */
138
+ const onlineDot = (label = 'Online') => badge(label, { variant: 'success', dot: true });
139
+ exports.onlineDot = onlineDot;
140
+ /** Offline status dot */
141
+ const offlineDot = (label = 'Offline') => badge(label, { variant: 'default', dot: true });
142
+ exports.offlineDot = offlineDot;
143
+ /** Busy status dot */
144
+ const busyDot = (label = 'Busy') => badge(label, { variant: 'danger', dot: true });
145
+ exports.busyDot = busyDot;
146
+ /** Away status dot */
147
+ const awayDot = (label = 'Away') => badge(label, { variant: 'warning', dot: true });
148
+ exports.awayDot = awayDot;
149
+ //# sourceMappingURL=badge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"badge.js","sourceRoot":"","sources":["../../../src/components/badge.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Badge Component\n *\n * Small status indicators and labels.\n */\n\nimport { escapeHtml } from '../layouts/base';\n\n// ============================================\n// Badge Types\n// ============================================\n\n/**\n * Badge variant styles\n */\nexport type BadgeVariant = 'default' | 'primary' | 'secondary' | 'success' | 'warning' | 'danger' | 'info' | 'outline';\n\n/**\n * Badge size options\n */\nexport type BadgeSize = 'sm' | 'md' | 'lg';\n\n/**\n * Badge component options\n */\nexport interface BadgeOptions {\n /** Badge variant */\n variant?: BadgeVariant;\n /** Badge size */\n size?: BadgeSize;\n /** Rounded pill style */\n pill?: boolean;\n /** Icon before text */\n icon?: string;\n /** Dot indicator (no text) */\n dot?: boolean;\n /** Additional CSS classes */\n className?: string;\n /** Removable badge */\n removable?: boolean;\n /** Remove button HTMX */\n onRemove?: {\n delete?: string;\n target?: string;\n swap?: string;\n confirm?: string;\n };\n}\n\n// ============================================\n// Badge Builder\n// ============================================\n\n/**\n * Get variant CSS classes\n */\nfunction getVariantClasses(variant: BadgeVariant): string {\n const variants: Record<BadgeVariant, string> = {\n default: 'bg-gray-100 text-gray-800',\n primary: 'bg-primary/10 text-primary',\n secondary: 'bg-secondary/10 text-secondary',\n success: 'bg-success/10 text-success',\n warning: 'bg-warning/10 text-warning',\n danger: 'bg-danger/10 text-danger',\n info: 'bg-blue-100 text-blue-800',\n outline: 'border border-border text-text-primary bg-transparent',\n };\n return variants[variant];\n}\n\n/**\n * Get size CSS classes\n */\nfunction getSizeClasses(size: BadgeSize, dot: boolean): string {\n if (dot) {\n const dotSizes: Record<BadgeSize, string> = {\n sm: 'w-2 h-2',\n md: 'w-2.5 h-2.5',\n lg: 'w-3 h-3',\n };\n return dotSizes[size];\n }\n\n const sizes: Record<BadgeSize, string> = {\n sm: 'px-2 py-0.5 text-xs',\n md: 'px-2.5 py-1 text-xs',\n lg: 'px-3 py-1.5 text-sm',\n };\n return sizes[size];\n}\n\n/**\n * Build a badge component\n */\nexport function badge(text: string, options: BadgeOptions = {}): string {\n const {\n variant = 'default',\n size = 'md',\n pill = false,\n icon,\n dot = false,\n className = '',\n removable = false,\n onRemove,\n } = options;\n\n // Dot badge (status indicator)\n if (dot) {\n const dotVariants: Record<BadgeVariant, string> = {\n default: 'bg-gray-400',\n primary: 'bg-primary',\n secondary: 'bg-secondary',\n success: 'bg-success',\n warning: 'bg-warning',\n danger: 'bg-danger',\n info: 'bg-blue-500',\n outline: 'border border-current',\n };\n\n const dotClasses = ['inline-block rounded-full', getSizeClasses(size, true), dotVariants[variant], className]\n .filter(Boolean)\n .join(' ');\n\n return `<span class=\"${dotClasses}\" aria-label=\"${escapeHtml(text)}\" title=\"${escapeHtml(text)}\"></span>`;\n }\n\n const variantClasses = getVariantClasses(variant);\n const sizeClasses = getSizeClasses(size, false);\n\n const baseClasses = [\n 'inline-flex items-center font-medium',\n pill ? 'rounded-full' : 'rounded-md',\n variantClasses,\n sizeClasses,\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n const iconHtml = icon ? `<span class=\"mr-1\">${icon}</span>` : '';\n\n const removeHtml = removable\n ? `<button\n type=\"button\"\n class=\"ml-1.5 -mr-1 hover:opacity-70 transition-opacity\"\n ${onRemove?.delete ? `hx-delete=\"${escapeHtml(onRemove.delete)}\"` : ''}\n ${onRemove?.target ? `hx-target=\"${escapeHtml(onRemove.target)}\"` : ''}\n ${onRemove?.swap ? `hx-swap=\"${escapeHtml(onRemove.swap)}\"` : ''}\n ${onRemove?.confirm ? `hx-confirm=\"${escapeHtml(onRemove.confirm)}\"` : ''}\n aria-label=\"Remove\"\n >\n <svg class=\"w-3 h-3\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M6 18L18 6M6 6l12 12\"/>\n </svg>\n </button>`\n : '';\n\n return `<span class=\"${baseClasses}\">\n ${iconHtml}${escapeHtml(text)}${removeHtml}\n </span>`;\n}\n\n/**\n * Build a badge group\n */\nexport function badgeGroup(badges: string[], options: { gap?: 'sm' | 'md' | 'lg'; className?: string } = {}): string {\n const { gap = 'sm', className = '' } = options;\n const gapClasses = { sm: 'gap-1', md: 'gap-2', lg: 'gap-3' };\n\n return `<div class=\"inline-flex flex-wrap ${gapClasses[gap]} ${className}\">\n ${badges.join('\\n')}\n </div>`;\n}\n\n// ============================================\n// Status Badge Presets\n// ============================================\n\n/** Active status badge */\nexport const activeBadge = (text = 'Active') => badge(text, { variant: 'success', dot: false });\n\n/** Inactive status badge */\nexport const inactiveBadge = (text = 'Inactive') => badge(text, { variant: 'default', dot: false });\n\n/** Pending status badge */\nexport const pendingBadge = (text = 'Pending') => badge(text, { variant: 'warning', dot: false });\n\n/** Error status badge */\nexport const errorBadge = (text = 'Error') => badge(text, { variant: 'danger', dot: false });\n\n/** New badge */\nexport const newBadge = (text = 'New') => badge(text, { variant: 'primary', size: 'sm', pill: true });\n\n/** Beta badge */\nexport const betaBadge = (text = 'Beta') => badge(text, { variant: 'secondary', size: 'sm', pill: true });\n\n// ============================================\n// Status Dot Presets\n// ============================================\n\n/** Online status dot */\nexport const onlineDot = (label = 'Online') => badge(label, { variant: 'success', dot: true });\n\n/** Offline status dot */\nexport const offlineDot = (label = 'Offline') => badge(label, { variant: 'default', dot: true });\n\n/** Busy status dot */\nexport const busyDot = (label = 'Busy') => badge(label, { variant: 'danger', dot: true });\n\n/** Away status dot */\nexport const awayDot = (label = 'Away') => badge(label, { variant: 'warning', dot: true });\n"]}
@@ -0,0 +1,109 @@
1
+ /**
2
+ * @file badge.schema.ts
3
+ * @description Zod schemas for Badge component options validation.
4
+ *
5
+ * Provides strict validation schemas for badge options including variants,
6
+ * sizes, dot indicators, and removable badges with HTMX support.
7
+ *
8
+ * @example
9
+ * ```typescript
10
+ * import { BadgeOptionsSchema } from '@frontmcp/ui';
11
+ *
12
+ * const result = BadgeOptionsSchema.safeParse({ variant: 'success' });
13
+ * ```
14
+ *
15
+ * @module @frontmcp/ui/components/badge.schema
16
+ */
17
+ import { z } from 'zod';
18
+ /**
19
+ * Badge variant enum schema
20
+ */
21
+ export declare const BadgeVariantSchema: z.ZodEnum<{
22
+ primary: "primary";
23
+ secondary: "secondary";
24
+ default: "default";
25
+ success: "success";
26
+ warning: "warning";
27
+ danger: "danger";
28
+ info: "info";
29
+ outline: "outline";
30
+ }>;
31
+ /**
32
+ * Badge variant type
33
+ */
34
+ export type BadgeVariant = z.infer<typeof BadgeVariantSchema>;
35
+ /**
36
+ * Badge size enum schema
37
+ */
38
+ export declare const BadgeSizeSchema: z.ZodEnum<{
39
+ sm: "sm";
40
+ lg: "lg";
41
+ md: "md";
42
+ }>;
43
+ /**
44
+ * Badge size type
45
+ */
46
+ export type BadgeSize = z.infer<typeof BadgeSizeSchema>;
47
+ /**
48
+ * Remove button HTMX options schema
49
+ */
50
+ export declare const BadgeOnRemoveSchema: z.ZodOptional<z.ZodObject<{
51
+ delete: z.ZodOptional<z.ZodString>;
52
+ target: z.ZodOptional<z.ZodString>;
53
+ swap: z.ZodOptional<z.ZodString>;
54
+ confirm: z.ZodOptional<z.ZodString>;
55
+ }, z.core.$strict>>;
56
+ /**
57
+ * Badge onRemove type
58
+ */
59
+ export type BadgeOnRemove = z.infer<typeof BadgeOnRemoveSchema>;
60
+ /**
61
+ * Complete badge options schema
62
+ */
63
+ export declare const BadgeOptionsSchema: z.ZodObject<{
64
+ variant: z.ZodOptional<z.ZodEnum<{
65
+ primary: "primary";
66
+ secondary: "secondary";
67
+ default: "default";
68
+ success: "success";
69
+ warning: "warning";
70
+ danger: "danger";
71
+ info: "info";
72
+ outline: "outline";
73
+ }>>;
74
+ size: z.ZodOptional<z.ZodEnum<{
75
+ sm: "sm";
76
+ lg: "lg";
77
+ md: "md";
78
+ }>>;
79
+ pill: z.ZodOptional<z.ZodBoolean>;
80
+ icon: z.ZodOptional<z.ZodString>;
81
+ dot: z.ZodOptional<z.ZodBoolean>;
82
+ className: z.ZodOptional<z.ZodString>;
83
+ removable: z.ZodOptional<z.ZodBoolean>;
84
+ onRemove: z.ZodOptional<z.ZodObject<{
85
+ delete: z.ZodOptional<z.ZodString>;
86
+ target: z.ZodOptional<z.ZodString>;
87
+ swap: z.ZodOptional<z.ZodString>;
88
+ confirm: z.ZodOptional<z.ZodString>;
89
+ }, z.core.$strict>>;
90
+ }, z.core.$strict>;
91
+ /**
92
+ * Badge options type (derived from schema)
93
+ */
94
+ export type BadgeOptions = z.infer<typeof BadgeOptionsSchema>;
95
+ /**
96
+ * Badge group options schema
97
+ */
98
+ export declare const BadgeGroupOptionsSchema: z.ZodObject<{
99
+ gap: z.ZodOptional<z.ZodEnum<{
100
+ sm: "sm";
101
+ lg: "lg";
102
+ md: "md";
103
+ }>>;
104
+ className: z.ZodOptional<z.ZodString>;
105
+ }, z.core.$strict>;
106
+ /**
107
+ * Badge group options type
108
+ */
109
+ export type BadgeGroupOptions = z.infer<typeof BadgeGroupOptionsSchema>;
@@ -0,0 +1,96 @@
1
+ "use strict";
2
+ /**
3
+ * @file badge.schema.ts
4
+ * @description Zod schemas for Badge component options validation.
5
+ *
6
+ * Provides strict validation schemas for badge options including variants,
7
+ * sizes, dot indicators, and removable badges with HTMX support.
8
+ *
9
+ * @example
10
+ * ```typescript
11
+ * import { BadgeOptionsSchema } from '@frontmcp/ui';
12
+ *
13
+ * const result = BadgeOptionsSchema.safeParse({ variant: 'success' });
14
+ * ```
15
+ *
16
+ * @module @frontmcp/ui/components/badge.schema
17
+ */
18
+ Object.defineProperty(exports, "__esModule", { value: true });
19
+ exports.BadgeGroupOptionsSchema = exports.BadgeOptionsSchema = exports.BadgeOnRemoveSchema = exports.BadgeSizeSchema = exports.BadgeVariantSchema = void 0;
20
+ const zod_1 = require("zod");
21
+ // ============================================
22
+ // Variant and Size Schemas
23
+ // ============================================
24
+ /**
25
+ * Badge variant enum schema
26
+ */
27
+ exports.BadgeVariantSchema = zod_1.z.enum([
28
+ 'default',
29
+ 'primary',
30
+ 'secondary',
31
+ 'success',
32
+ 'warning',
33
+ 'danger',
34
+ 'info',
35
+ 'outline',
36
+ ]);
37
+ /**
38
+ * Badge size enum schema
39
+ */
40
+ exports.BadgeSizeSchema = zod_1.z.enum(['sm', 'md', 'lg']);
41
+ // ============================================
42
+ // OnRemove Schema
43
+ // ============================================
44
+ /**
45
+ * Remove button HTMX options schema
46
+ */
47
+ exports.BadgeOnRemoveSchema = zod_1.z
48
+ .object({
49
+ delete: zod_1.z.string().optional(),
50
+ target: zod_1.z.string().optional(),
51
+ swap: zod_1.z.string().optional(),
52
+ confirm: zod_1.z.string().optional(),
53
+ })
54
+ .strict()
55
+ .optional();
56
+ // ============================================
57
+ // Badge Options Schema
58
+ // ============================================
59
+ /**
60
+ * Complete badge options schema
61
+ */
62
+ exports.BadgeOptionsSchema = zod_1.z
63
+ .object({
64
+ /** Badge variant */
65
+ variant: exports.BadgeVariantSchema.optional(),
66
+ /** Badge size */
67
+ size: exports.BadgeSizeSchema.optional(),
68
+ /** Rounded pill style */
69
+ pill: zod_1.z.boolean().optional(),
70
+ /** Icon before text (HTML string) */
71
+ icon: zod_1.z.string().optional(),
72
+ /** Dot indicator (no text) */
73
+ dot: zod_1.z.boolean().optional(),
74
+ /** Additional CSS classes */
75
+ className: zod_1.z.string().optional(),
76
+ /** Removable badge */
77
+ removable: zod_1.z.boolean().optional(),
78
+ /** Remove button HTMX options */
79
+ onRemove: exports.BadgeOnRemoveSchema,
80
+ })
81
+ .strict();
82
+ // ============================================
83
+ // Badge Group Schema
84
+ // ============================================
85
+ /**
86
+ * Badge group options schema
87
+ */
88
+ exports.BadgeGroupOptionsSchema = zod_1.z
89
+ .object({
90
+ /** Gap between badges */
91
+ gap: zod_1.z.enum(['sm', 'md', 'lg']).optional(),
92
+ /** Additional CSS classes */
93
+ className: zod_1.z.string().optional(),
94
+ })
95
+ .strict();
96
+ //# sourceMappingURL=badge.schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"badge.schema.js","sourceRoot":"","sources":["../../../src/components/badge.schema.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;GAeG;;;AAEH,6BAAwB;AAExB,+CAA+C;AAC/C,2BAA2B;AAC3B,+CAA+C;AAE/C;;GAEG;AACU,QAAA,kBAAkB,GAAG,OAAC,CAAC,IAAI,CAAC;IACvC,SAAS;IACT,SAAS;IACT,WAAW;IACX,SAAS;IACT,SAAS;IACT,QAAQ;IACR,MAAM;IACN,SAAS;CACV,CAAC,CAAC;AAOH;;GAEG;AACU,QAAA,eAAe,GAAG,OAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;AAO1D,+CAA+C;AAC/C,kBAAkB;AAClB,+CAA+C;AAE/C;;GAEG;AACU,QAAA,mBAAmB,GAAG,OAAC;KACjC,MAAM,CAAC;IACN,MAAM,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC7B,MAAM,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC7B,IAAI,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC3B,OAAO,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CAC/B,CAAC;KACD,MAAM,EAAE;KACR,QAAQ,EAAE,CAAC;AAOd,+CAA+C;AAC/C,uBAAuB;AACvB,+CAA+C;AAE/C;;GAEG;AACU,QAAA,kBAAkB,GAAG,OAAC;KAChC,MAAM,CAAC;IACN,oBAAoB;IACpB,OAAO,EAAE,0BAAkB,CAAC,QAAQ,EAAE;IACtC,iBAAiB;IACjB,IAAI,EAAE,uBAAe,CAAC,QAAQ,EAAE;IAChC,yBAAyB;IACzB,IAAI,EAAE,OAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IAC5B,qCAAqC;IACrC,IAAI,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC3B,8BAA8B;IAC9B,GAAG,EAAE,OAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IAC3B,6BAA6B;IAC7B,SAAS,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAChC,sBAAsB;IACtB,SAAS,EAAE,OAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IACjC,iCAAiC;IACjC,QAAQ,EAAE,2BAAmB;CAC9B,CAAC;KACD,MAAM,EAAE,CAAC;AAOZ,+CAA+C;AAC/C,qBAAqB;AACrB,+CAA+C;AAE/C;;GAEG;AACU,QAAA,uBAAuB,GAAG,OAAC;KACrC,MAAM,CAAC;IACN,yBAAyB;IACzB,GAAG,EAAE,OAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,QAAQ,EAAE;IAC1C,6BAA6B;IAC7B,SAAS,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CACjC,CAAC;KACD,MAAM,EAAE,CAAC","sourcesContent":["/**\n * @file badge.schema.ts\n * @description Zod schemas for Badge component options validation.\n *\n * Provides strict validation schemas for badge options including variants,\n * sizes, dot indicators, and removable badges with HTMX support.\n *\n * @example\n * ```typescript\n * import { BadgeOptionsSchema } from '@frontmcp/ui';\n *\n * const result = BadgeOptionsSchema.safeParse({ variant: 'success' });\n * ```\n *\n * @module @frontmcp/ui/components/badge.schema\n */\n\nimport { z } from 'zod';\n\n// ============================================\n// Variant and Size Schemas\n// ============================================\n\n/**\n * Badge variant enum schema\n */\nexport const BadgeVariantSchema = z.enum([\n 'default',\n 'primary',\n 'secondary',\n 'success',\n 'warning',\n 'danger',\n 'info',\n 'outline',\n]);\n\n/**\n * Badge variant type\n */\nexport type BadgeVariant = z.infer<typeof BadgeVariantSchema>;\n\n/**\n * Badge size enum schema\n */\nexport const BadgeSizeSchema = z.enum(['sm', 'md', 'lg']);\n\n/**\n * Badge size type\n */\nexport type BadgeSize = z.infer<typeof BadgeSizeSchema>;\n\n// ============================================\n// OnRemove Schema\n// ============================================\n\n/**\n * Remove button HTMX options schema\n */\nexport const BadgeOnRemoveSchema = z\n .object({\n delete: z.string().optional(),\n target: z.string().optional(),\n swap: z.string().optional(),\n confirm: z.string().optional(),\n })\n .strict()\n .optional();\n\n/**\n * Badge onRemove type\n */\nexport type BadgeOnRemove = z.infer<typeof BadgeOnRemoveSchema>;\n\n// ============================================\n// Badge Options Schema\n// ============================================\n\n/**\n * Complete badge options schema\n */\nexport const BadgeOptionsSchema = z\n .object({\n /** Badge variant */\n variant: BadgeVariantSchema.optional(),\n /** Badge size */\n size: BadgeSizeSchema.optional(),\n /** Rounded pill style */\n pill: z.boolean().optional(),\n /** Icon before text (HTML string) */\n icon: z.string().optional(),\n /** Dot indicator (no text) */\n dot: z.boolean().optional(),\n /** Additional CSS classes */\n className: z.string().optional(),\n /** Removable badge */\n removable: z.boolean().optional(),\n /** Remove button HTMX options */\n onRemove: BadgeOnRemoveSchema,\n })\n .strict();\n\n/**\n * Badge options type (derived from schema)\n */\nexport type BadgeOptions = z.infer<typeof BadgeOptionsSchema>;\n\n// ============================================\n// Badge Group Schema\n// ============================================\n\n/**\n * Badge group options schema\n */\nexport const BadgeGroupOptionsSchema = z\n .object({\n /** Gap between badges */\n gap: z.enum(['sm', 'md', 'lg']).optional(),\n /** Additional CSS classes */\n className: z.string().optional(),\n })\n .strict();\n\n/**\n * Badge group options type\n */\nexport type BadgeGroupOptions = z.infer<typeof BadgeGroupOptionsSchema>;\n"]}
@@ -0,0 +1,111 @@
1
+ /**
2
+ * @file button.ts
3
+ * @description Button Component for FrontMCP UI.
4
+ *
5
+ * Versatile button component with multiple variants, sizes, and states.
6
+ * Includes HTMX support for dynamic interactions without JavaScript.
7
+ *
8
+ * @example Basic button
9
+ * ```typescript
10
+ * import { button } from '@frontmcp/ui';
11
+ *
12
+ * // Primary button (default)
13
+ * const html = button('Click Me');
14
+ * // <button type="button" class="...bg-primary...">Click Me</button>
15
+ * ```
16
+ *
17
+ * @example Button variants
18
+ * ```typescript
19
+ * import { button, primaryButton, dangerButton, outlineButton } from '@frontmcp/ui';
20
+ *
21
+ * // Using variant option
22
+ * const secondary = button('Save', { variant: 'secondary' });
23
+ * const danger = button('Delete', { variant: 'danger' });
24
+ *
25
+ * // Using shorthand functions
26
+ * const primary = primaryButton('Submit');
27
+ * const outline = outlineButton('Cancel');
28
+ * ```
29
+ *
30
+ * @example Button with loading state
31
+ * ```typescript
32
+ * const loadingBtn = button('Saving...', {
33
+ * loading: true,
34
+ * disabled: true,
35
+ * });
36
+ * ```
37
+ *
38
+ * @example Button with HTMX
39
+ * ```typescript
40
+ * const htmxBtn = button('Load More', {
41
+ * htmx: {
42
+ * get: '/api/items?page=2',
43
+ * target: '#items-list',
44
+ * swap: 'beforeend',
45
+ * },
46
+ * });
47
+ * ```
48
+ *
49
+ * @example Button group
50
+ * ```typescript
51
+ * import { button, buttonGroup } from '@frontmcp/ui';
52
+ *
53
+ * const group = buttonGroup([
54
+ * button('Edit', { variant: 'outline' }),
55
+ * button('Delete', { variant: 'danger' }),
56
+ * ], { attached: true });
57
+ * ```
58
+ *
59
+ * @module @frontmcp/ui/components/button
60
+ */
61
+ import { type ButtonOptions, type ButtonVariant, type ButtonSize, type ButtonGroupOptions } from './button.schema';
62
+ export type { ButtonOptions, ButtonVariant, ButtonSize, ButtonGroupOptions };
63
+ /**
64
+ * Build a button component
65
+ *
66
+ * @param text - Button label text (used as aria-label for icon-only buttons)
67
+ * @param options - Button configuration options
68
+ * @returns HTML string for the button, or validation error box on invalid input
69
+ *
70
+ * @remarks
71
+ * **Security considerations:**
72
+ * - The `iconBefore` and `iconAfter` options accept raw HTML strings for SVG icons.
73
+ * These are NOT escaped and should only contain trusted content (e.g., icon library output).
74
+ * Never pass user-provided content to these options.
75
+ * - The `href` option uses an allowlist for safe protocols. Only the following are allowed:
76
+ * - `http://`, `https://` - absolute URLs
77
+ * - `/` - absolute paths (e.g., "/login", "/api/users")
78
+ * - `#` - anchor links (e.g., "#section")
79
+ * - `mailto:` - email links
80
+ * - `tel:` - phone links
81
+ * Note: Bare relative URLs like "login" or "./foo" are NOT allowed and will fall back to
82
+ * button behavior. Use absolute paths ("/login") instead.
83
+ * - The `data` option keys are sanitized to prevent malformed attributes.
84
+ *
85
+ * **Accessibility:**
86
+ * - When `iconOnly: true`, the `text` parameter is automatically used as `aria-label`
87
+ * unless an explicit `ariaLabel` option is provided.
88
+ * - Empty button text with `iconOnly: false` will log a warning for accessibility.
89
+ * - Icon-only buttons without text or ariaLabel will log a warning.
90
+ */
91
+ export declare function button(text: string, options?: ButtonOptions): string;
92
+ /**
93
+ * Build a button group
94
+ *
95
+ * @param buttons - Array of button HTML strings
96
+ * @param options - Button group configuration options
97
+ * @returns HTML string for the button group, or validation error box on invalid input
98
+ */
99
+ export declare function buttonGroup(buttons: string[], options?: ButtonGroupOptions): string;
100
+ /** Primary button shorthand */
101
+ export declare const primaryButton: (text: string, opts?: Omit<ButtonOptions, "variant">) => string;
102
+ /** Secondary button shorthand */
103
+ export declare const secondaryButton: (text: string, opts?: Omit<ButtonOptions, "variant">) => string;
104
+ /** Outline button shorthand */
105
+ export declare const outlineButton: (text: string, opts?: Omit<ButtonOptions, "variant">) => string;
106
+ /** Ghost button shorthand */
107
+ export declare const ghostButton: (text: string, opts?: Omit<ButtonOptions, "variant">) => string;
108
+ /** Danger button shorthand */
109
+ export declare const dangerButton: (text: string, opts?: Omit<ButtonOptions, "variant">) => string;
110
+ /** Link button shorthand */
111
+ export declare const linkButton: (text: string, opts?: Omit<ButtonOptions, "variant">) => string;