@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,420 @@
1
+ "use strict";
2
+ /**
3
+ * Form Components
4
+ *
5
+ * Form elements including inputs, selects, textareas, and form layouts.
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.input = input;
9
+ exports.select = select;
10
+ exports.textarea = textarea;
11
+ exports.checkbox = checkbox;
12
+ exports.radioGroup = radioGroup;
13
+ exports.form = form;
14
+ exports.formRow = formRow;
15
+ exports.formSection = formSection;
16
+ exports.formActions = formActions;
17
+ exports.hiddenInput = hiddenInput;
18
+ exports.csrfInput = csrfInput;
19
+ const base_1 = require("../layouts/base");
20
+ // ============================================
21
+ // Form Builders
22
+ // ============================================
23
+ /**
24
+ * Get size classes for inputs
25
+ */
26
+ function getInputSizeClasses(size) {
27
+ const sizes = {
28
+ sm: 'px-3 py-1.5 text-sm',
29
+ md: 'px-4 py-2.5 text-sm',
30
+ lg: 'px-5 py-3 text-base',
31
+ };
32
+ return sizes[size];
33
+ }
34
+ /**
35
+ * Get state classes for inputs
36
+ */
37
+ function getInputStateClasses(state) {
38
+ const states = {
39
+ default: 'border-border focus:border-primary focus:ring-primary/20',
40
+ error: 'border-danger focus:border-danger focus:ring-danger/20',
41
+ success: 'border-success focus:border-success focus:ring-success/20',
42
+ warning: 'border-warning focus:border-warning focus:ring-warning/20',
43
+ };
44
+ return states[state];
45
+ }
46
+ /**
47
+ * Build HTMX attributes for form elements
48
+ */
49
+ function buildFormHtmxAttrs(htmx) {
50
+ if (!htmx)
51
+ return '';
52
+ const attrs = [];
53
+ if (htmx.post)
54
+ attrs.push(`hx-post="${(0, base_1.escapeHtml)(htmx.post)}"`);
55
+ if (htmx.get)
56
+ attrs.push(`hx-get="${(0, base_1.escapeHtml)(htmx.get)}"`);
57
+ if (htmx.target)
58
+ attrs.push(`hx-target="${(0, base_1.escapeHtml)(htmx.target)}"`);
59
+ if (htmx.swap)
60
+ attrs.push(`hx-swap="${(0, base_1.escapeHtml)(htmx.swap)}"`);
61
+ if (htmx.trigger)
62
+ attrs.push(`hx-trigger="${(0, base_1.escapeHtml)(htmx.trigger)}"`);
63
+ if (htmx.validate)
64
+ attrs.push('hx-validate="true"');
65
+ return attrs.join(' ');
66
+ }
67
+ /**
68
+ * Build data attributes
69
+ */
70
+ function buildDataAttrs(data) {
71
+ if (!data)
72
+ return '';
73
+ return Object.entries(data)
74
+ .map(([key, value]) => `data-${key}="${(0, base_1.escapeHtml)(value)}"`)
75
+ .join(' ');
76
+ }
77
+ /**
78
+ * Build a text input component
79
+ */
80
+ function input(options) {
81
+ const { type = 'text', name, id = name, value = '', placeholder = '', label, helper, error, size = 'md', state = error ? 'error' : 'default', required = false, disabled = false, readonly = false, autocomplete, pattern, min, max, step, className = '', htmx, data, iconBefore, iconAfter, } = options;
82
+ const sizeClasses = getInputSizeClasses(size);
83
+ const stateClasses = getInputStateClasses(state);
84
+ const hasIcon = iconBefore || iconAfter;
85
+ const baseClasses = [
86
+ 'w-full rounded-lg border bg-white',
87
+ 'transition-colors duration-200',
88
+ 'focus:outline-none focus:ring-2',
89
+ disabled ? 'opacity-50 cursor-not-allowed bg-gray-50' : '',
90
+ sizeClasses,
91
+ stateClasses,
92
+ hasIcon ? (iconBefore ? 'pl-10' : '') + (iconAfter ? ' pr-10' : '') : '',
93
+ className,
94
+ ]
95
+ .filter(Boolean)
96
+ .join(' ');
97
+ const htmxAttrs = buildFormHtmxAttrs(htmx);
98
+ const dataAttrs = buildDataAttrs(data);
99
+ const inputAttrs = [
100
+ `type="${type}"`,
101
+ `name="${(0, base_1.escapeHtml)(name)}"`,
102
+ `id="${(0, base_1.escapeHtml)(id)}"`,
103
+ value ? `value="${(0, base_1.escapeHtml)(value)}"` : '',
104
+ placeholder ? `placeholder="${(0, base_1.escapeHtml)(placeholder)}"` : '',
105
+ required ? 'required' : '',
106
+ disabled ? 'disabled' : '',
107
+ readonly ? 'readonly' : '',
108
+ autocomplete ? `autocomplete="${(0, base_1.escapeHtml)(autocomplete)}"` : '',
109
+ pattern ? `pattern="${(0, base_1.escapeHtml)(pattern)}"` : '',
110
+ min !== undefined ? `min="${(0, base_1.escapeHtml)(String(min))}"` : '',
111
+ max !== undefined ? `max="${(0, base_1.escapeHtml)(String(max))}"` : '',
112
+ step !== undefined ? `step="${(0, base_1.escapeHtml)(String(step))}"` : '',
113
+ `class="${baseClasses}"`,
114
+ htmxAttrs,
115
+ dataAttrs,
116
+ ]
117
+ .filter(Boolean)
118
+ .join(' ');
119
+ const labelHtml = label
120
+ ? `<label for="${(0, base_1.escapeHtml)(id)}" class="block text-sm font-medium text-text-primary mb-1.5">
121
+ ${(0, base_1.escapeHtml)(label)}${required ? '<span class="text-danger ml-1">*</span>' : ''}
122
+ </label>`
123
+ : '';
124
+ const helperHtml = helper && !error ? `<p class="mt-1.5 text-sm text-text-secondary">${(0, base_1.escapeHtml)(helper)}</p>` : '';
125
+ const errorHtml = error ? `<p class="mt-1.5 text-sm text-danger">${(0, base_1.escapeHtml)(error)}</p>` : '';
126
+ const iconBeforeHtml = iconBefore
127
+ ? `<span class="absolute left-3 top-1/2 -translate-y-1/2 text-text-secondary">${iconBefore}</span>`
128
+ : '';
129
+ const iconAfterHtml = iconAfter
130
+ ? `<span class="absolute right-3 top-1/2 -translate-y-1/2 text-text-secondary">${iconAfter}</span>`
131
+ : '';
132
+ const inputHtml = hasIcon
133
+ ? `<div class="relative">
134
+ ${iconBeforeHtml}
135
+ <input ${inputAttrs}>
136
+ ${iconAfterHtml}
137
+ </div>`
138
+ : `<input ${inputAttrs}>`;
139
+ return `<div class="form-field">
140
+ ${labelHtml}
141
+ ${inputHtml}
142
+ ${helperHtml}
143
+ ${errorHtml}
144
+ </div>`;
145
+ }
146
+ /**
147
+ * Build a select component
148
+ */
149
+ function select(options) {
150
+ const { name, id = name, options: selectOptions, value, label, helper, error, size = 'md', state = error ? 'error' : 'default', required = false, disabled = false, multiple = false, className = '', htmx, data, } = options;
151
+ const sizeClasses = getInputSizeClasses(size);
152
+ const stateClasses = getInputStateClasses(state);
153
+ const baseClasses = [
154
+ 'w-full rounded-lg border bg-white',
155
+ 'transition-colors duration-200',
156
+ 'focus:outline-none focus:ring-2',
157
+ disabled ? 'opacity-50 cursor-not-allowed bg-gray-50' : '',
158
+ sizeClasses,
159
+ stateClasses,
160
+ className,
161
+ ]
162
+ .filter(Boolean)
163
+ .join(' ');
164
+ const htmxAttrs = buildFormHtmxAttrs(htmx);
165
+ const dataAttrs = buildDataAttrs(data);
166
+ const optionsHtml = selectOptions
167
+ .map((opt) => {
168
+ const selected = opt.selected || opt.value === value ? 'selected' : '';
169
+ const optDisabled = opt.disabled ? 'disabled' : '';
170
+ return `<option value="${(0, base_1.escapeHtml)(opt.value)}" ${selected} ${optDisabled}>${(0, base_1.escapeHtml)(opt.label)}</option>`;
171
+ })
172
+ .join('\n');
173
+ const labelHtml = label
174
+ ? `<label for="${(0, base_1.escapeHtml)(id)}" class="block text-sm font-medium text-text-primary mb-1.5">
175
+ ${(0, base_1.escapeHtml)(label)}${required ? '<span class="text-danger ml-1">*</span>' : ''}
176
+ </label>`
177
+ : '';
178
+ const helperHtml = helper && !error ? `<p class="mt-1.5 text-sm text-text-secondary">${(0, base_1.escapeHtml)(helper)}</p>` : '';
179
+ const errorHtml = error ? `<p class="mt-1.5 text-sm text-danger">${(0, base_1.escapeHtml)(error)}</p>` : '';
180
+ return `<div class="form-field">
181
+ ${labelHtml}
182
+ <select
183
+ name="${(0, base_1.escapeHtml)(name)}"
184
+ id="${(0, base_1.escapeHtml)(id)}"
185
+ class="${baseClasses}"
186
+ ${required ? 'required' : ''}
187
+ ${disabled ? 'disabled' : ''}
188
+ ${multiple ? 'multiple' : ''}
189
+ ${htmxAttrs}
190
+ ${dataAttrs}
191
+ >
192
+ ${optionsHtml}
193
+ </select>
194
+ ${helperHtml}
195
+ ${errorHtml}
196
+ </div>`;
197
+ }
198
+ /**
199
+ * Build a textarea component
200
+ */
201
+ function textarea(options) {
202
+ const { name, id = name, value = '', placeholder = '', label, helper, error, size = 'md', state = error ? 'error' : 'default', required = false, disabled = false, readonly = false, rows = 4, resize = 'vertical', className = '', htmx, data, } = options;
203
+ const sizeClasses = getInputSizeClasses(size);
204
+ const stateClasses = getInputStateClasses(state);
205
+ const resizeClasses = {
206
+ none: 'resize-none',
207
+ vertical: 'resize-y',
208
+ horizontal: 'resize-x',
209
+ both: 'resize',
210
+ };
211
+ const baseClasses = [
212
+ 'w-full rounded-lg border bg-white',
213
+ 'transition-colors duration-200',
214
+ 'focus:outline-none focus:ring-2',
215
+ disabled ? 'opacity-50 cursor-not-allowed bg-gray-50' : '',
216
+ sizeClasses,
217
+ stateClasses,
218
+ resizeClasses[resize],
219
+ className,
220
+ ]
221
+ .filter(Boolean)
222
+ .join(' ');
223
+ const htmxAttrs = buildFormHtmxAttrs(htmx);
224
+ const dataAttrs = buildDataAttrs(data);
225
+ const labelHtml = label
226
+ ? `<label for="${(0, base_1.escapeHtml)(id)}" class="block text-sm font-medium text-text-primary mb-1.5">
227
+ ${(0, base_1.escapeHtml)(label)}${required ? '<span class="text-danger ml-1">*</span>' : ''}
228
+ </label>`
229
+ : '';
230
+ const helperHtml = helper && !error ? `<p class="mt-1.5 text-sm text-text-secondary">${(0, base_1.escapeHtml)(helper)}</p>` : '';
231
+ const errorHtml = error ? `<p class="mt-1.5 text-sm text-danger">${(0, base_1.escapeHtml)(error)}</p>` : '';
232
+ return `<div class="form-field">
233
+ ${labelHtml}
234
+ <textarea
235
+ name="${(0, base_1.escapeHtml)(name)}"
236
+ id="${(0, base_1.escapeHtml)(id)}"
237
+ rows="${rows}"
238
+ class="${baseClasses}"
239
+ ${placeholder ? `placeholder="${(0, base_1.escapeHtml)(placeholder)}"` : ''}
240
+ ${required ? 'required' : ''}
241
+ ${disabled ? 'disabled' : ''}
242
+ ${readonly ? 'readonly' : ''}
243
+ ${htmxAttrs}
244
+ ${dataAttrs}
245
+ >${(0, base_1.escapeHtml)(value)}</textarea>
246
+ ${helperHtml}
247
+ ${errorHtml}
248
+ </div>`;
249
+ }
250
+ /**
251
+ * Build a checkbox component
252
+ */
253
+ function checkbox(options) {
254
+ const { name, id = name, value = 'true', label, checked = false, disabled = false, helper, error, className = '', htmx, } = options;
255
+ const htmxAttrs = buildFormHtmxAttrs(htmx);
256
+ const checkboxClasses = [
257
+ 'h-4 w-4 rounded border-border text-primary',
258
+ 'focus:ring-2 focus:ring-primary/20 focus:ring-offset-0',
259
+ disabled ? 'opacity-50 cursor-not-allowed' : 'cursor-pointer',
260
+ ].join(' ');
261
+ const helperHtml = helper && !error ? `<p class="text-sm text-text-secondary">${(0, base_1.escapeHtml)(helper)}</p>` : '';
262
+ const errorHtml = error ? `<p class="text-sm text-danger">${(0, base_1.escapeHtml)(error)}</p>` : '';
263
+ return `<div class="form-field ${className}">
264
+ <label class="flex items-start gap-3 ${disabled ? 'cursor-not-allowed' : 'cursor-pointer'}">
265
+ <input
266
+ type="checkbox"
267
+ name="${(0, base_1.escapeHtml)(name)}"
268
+ id="${(0, base_1.escapeHtml)(id)}"
269
+ value="${(0, base_1.escapeHtml)(value)}"
270
+ class="${checkboxClasses}"
271
+ ${checked ? 'checked' : ''}
272
+ ${disabled ? 'disabled' : ''}
273
+ ${htmxAttrs}
274
+ >
275
+ <div>
276
+ <span class="text-sm font-medium text-text-primary">${(0, base_1.escapeHtml)(label)}</span>
277
+ ${helperHtml}
278
+ ${errorHtml}
279
+ </div>
280
+ </label>
281
+ </div>`;
282
+ }
283
+ /**
284
+ * Build a radio group component
285
+ */
286
+ function radioGroup(options) {
287
+ const { name, options: radioOptions, value, label, helper, error, direction = 'vertical', className = '' } = options;
288
+ const directionClasses = direction === 'horizontal' ? 'flex flex-row flex-wrap gap-4' : 'flex flex-col gap-2';
289
+ const radioClasses = 'h-4 w-4 border-border text-primary focus:ring-2 focus:ring-primary/20 focus:ring-offset-0';
290
+ const radiosHtml = radioOptions
291
+ .map((opt, index) => {
292
+ const radioId = `${name}-${index}`;
293
+ const checked = opt.value === value ? 'checked' : '';
294
+ const disabled = opt.disabled ? 'disabled' : '';
295
+ const cursorClass = opt.disabled ? 'cursor-not-allowed opacity-50' : 'cursor-pointer';
296
+ return `<label class="flex items-center gap-2 ${cursorClass}">
297
+ <input
298
+ type="radio"
299
+ name="${(0, base_1.escapeHtml)(name)}"
300
+ id="${(0, base_1.escapeHtml)(radioId)}"
301
+ value="${(0, base_1.escapeHtml)(opt.value)}"
302
+ class="${radioClasses}"
303
+ ${checked}
304
+ ${disabled}
305
+ >
306
+ <span class="text-sm text-text-primary">${(0, base_1.escapeHtml)(opt.label)}</span>
307
+ </label>`;
308
+ })
309
+ .join('\n');
310
+ const labelHtml = label
311
+ ? `<label class="block text-sm font-medium text-text-primary mb-2">${(0, base_1.escapeHtml)(label)}</label>`
312
+ : '';
313
+ const helperHtml = helper && !error ? `<p class="mt-1.5 text-sm text-text-secondary">${(0, base_1.escapeHtml)(helper)}</p>` : '';
314
+ const errorHtml = error ? `<p class="mt-1.5 text-sm text-danger">${(0, base_1.escapeHtml)(error)}</p>` : '';
315
+ return `<div class="form-field ${className}" role="radiogroup">
316
+ ${labelHtml}
317
+ <div class="${directionClasses}">
318
+ ${radiosHtml}
319
+ </div>
320
+ ${helperHtml}
321
+ ${errorHtml}
322
+ </div>`;
323
+ }
324
+ /**
325
+ * Build form wrapper
326
+ */
327
+ function form(content, options = {}) {
328
+ const { action, method = 'post', id, className = '', htmx, preventDefault = false, autocomplete, enctype } = options;
329
+ const htmxAttrs = [];
330
+ if (htmx) {
331
+ if (htmx.post)
332
+ htmxAttrs.push(`hx-post="${(0, base_1.escapeHtml)(htmx.post)}"`);
333
+ if (htmx.get)
334
+ htmxAttrs.push(`hx-get="${(0, base_1.escapeHtml)(htmx.get)}"`);
335
+ if (htmx.put)
336
+ htmxAttrs.push(`hx-put="${(0, base_1.escapeHtml)(htmx.put)}"`);
337
+ if (htmx.delete)
338
+ htmxAttrs.push(`hx-delete="${(0, base_1.escapeHtml)(htmx.delete)}"`);
339
+ if (htmx.target)
340
+ htmxAttrs.push(`hx-target="${(0, base_1.escapeHtml)(htmx.target)}"`);
341
+ if (htmx.swap)
342
+ htmxAttrs.push(`hx-swap="${(0, base_1.escapeHtml)(htmx.swap)}"`);
343
+ if (htmx.indicator)
344
+ htmxAttrs.push(`hx-indicator="${(0, base_1.escapeHtml)(htmx.indicator)}"`);
345
+ if (htmx.confirm)
346
+ htmxAttrs.push(`hx-confirm="${(0, base_1.escapeHtml)(htmx.confirm)}"`);
347
+ }
348
+ const attrs = [
349
+ action ? `action="${(0, base_1.escapeHtml)(action)}"` : '',
350
+ `method="${method}"`,
351
+ id ? `id="${(0, base_1.escapeHtml)(id)}"` : '',
352
+ className ? `class="${(0, base_1.escapeHtml)(className)}"` : '',
353
+ autocomplete ? `autocomplete="${autocomplete}"` : '',
354
+ enctype ? `enctype="${enctype}"` : '',
355
+ preventDefault ? 'onsubmit="return false;"' : '',
356
+ htmxAttrs.join(' '),
357
+ ]
358
+ .filter(Boolean)
359
+ .join(' ');
360
+ return `<form ${attrs}>${content}</form>`;
361
+ }
362
+ /**
363
+ * Build form row (for horizontal forms)
364
+ */
365
+ function formRow(fields, options = {}) {
366
+ const { gap = 'md', className = '' } = options;
367
+ const gapClasses = { sm: 'gap-2', md: 'gap-4', lg: 'gap-6' };
368
+ return `<div class="grid grid-cols-${fields.length} ${gapClasses[gap]} ${className}">
369
+ ${fields.join('\n')}
370
+ </div>`;
371
+ }
372
+ /**
373
+ * Build form section with title
374
+ */
375
+ function formSection(content, options = {}) {
376
+ const { title, description, className = '' } = options;
377
+ const headerHtml = title
378
+ ? `<div class="mb-4">
379
+ <h3 class="text-lg font-semibold text-text-primary">${(0, base_1.escapeHtml)(title)}</h3>
380
+ ${description ? `<p class="text-sm text-text-secondary mt-1">${(0, base_1.escapeHtml)(description)}</p>` : ''}
381
+ </div>`
382
+ : '';
383
+ return `<div class="form-section ${className}">
384
+ ${headerHtml}
385
+ <div class="space-y-4">
386
+ ${content}
387
+ </div>
388
+ </div>`;
389
+ }
390
+ /**
391
+ * Build form actions (submit/cancel buttons area)
392
+ */
393
+ function formActions(buttons, options = {}) {
394
+ const { align = 'right', className = '' } = options;
395
+ const alignClasses = {
396
+ left: 'justify-start',
397
+ center: 'justify-center',
398
+ right: 'justify-end',
399
+ between: 'justify-between',
400
+ };
401
+ return `<div class="flex items-center gap-3 pt-4 ${alignClasses[align]} ${className}">
402
+ ${buttons.join('\n')}
403
+ </div>`;
404
+ }
405
+ // ============================================
406
+ // Hidden Input
407
+ // ============================================
408
+ /**
409
+ * Build a hidden input
410
+ */
411
+ function hiddenInput(name, value) {
412
+ return `<input type="hidden" name="${(0, base_1.escapeHtml)(name)}" value="${(0, base_1.escapeHtml)(value)}">`;
413
+ }
414
+ /**
415
+ * Build CSRF token hidden input
416
+ */
417
+ function csrfInput(token) {
418
+ return hiddenInput('_csrf', token);
419
+ }
420
+ //# sourceMappingURL=form.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"form.js","sourceRoot":"","sources":["../../../src/components/form.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Form Components\n *\n * Form elements including inputs, selects, textareas, and form layouts.\n */\n\nimport { escapeHtml } from '../layouts/base';\n\n// ============================================\n// Input Types\n// ============================================\n\n/**\n * Input type options\n */\nexport type InputType =\n | 'text'\n | 'email'\n | 'password'\n | 'number'\n | 'tel'\n | 'url'\n | 'search'\n | 'date'\n | 'time'\n | 'datetime-local'\n | 'hidden';\n\n/**\n * Input size options\n */\nexport type InputSize = 'sm' | 'md' | 'lg';\n\n/**\n * Input state\n */\nexport type InputState = 'default' | 'error' | 'success' | 'warning';\n\n// ============================================\n// Form Field Options\n// ============================================\n\n/**\n * Base input options\n */\nexport interface InputOptions {\n /** Input type */\n type?: InputType;\n /** Input name */\n name: string;\n /** Input ID (defaults to name) */\n id?: string;\n /** Input value */\n value?: string;\n /** Placeholder text */\n placeholder?: string;\n /** Label text */\n label?: string;\n /** Helper text */\n helper?: string;\n /** Error message */\n error?: string;\n /** Input size */\n size?: InputSize;\n /** Input state */\n state?: InputState;\n /** Required field */\n required?: boolean;\n /** Disabled state */\n disabled?: boolean;\n /** Readonly state */\n readonly?: boolean;\n /** Autocomplete attribute */\n autocomplete?: string;\n /** Pattern for validation */\n pattern?: string;\n /** Min value (for number/date) */\n min?: string | number;\n /** Max value (for number/date) */\n max?: string | number;\n /** Step value (for number) */\n step?: string | number;\n /** Additional CSS classes */\n className?: string;\n /** HTMX attributes */\n htmx?: {\n post?: string;\n get?: string;\n target?: string;\n swap?: string;\n trigger?: string;\n validate?: boolean;\n };\n /** Data attributes */\n data?: Record<string, string>;\n /** Icon before input */\n iconBefore?: string;\n /** Icon after input */\n iconAfter?: string;\n}\n\n/**\n * Select options\n */\nexport interface SelectOption {\n value: string;\n label: string;\n disabled?: boolean;\n selected?: boolean;\n}\n\nexport interface SelectOptions\n extends Omit<InputOptions, 'type' | 'pattern' | 'min' | 'max' | 'step' | 'autocomplete'> {\n /** Select options */\n options: SelectOption[];\n /** Multiple selection */\n multiple?: boolean;\n}\n\n/**\n * Textarea options\n */\nexport interface TextareaOptions extends Omit<InputOptions, 'type' | 'pattern' | 'min' | 'max' | 'step'> {\n /** Number of rows */\n rows?: number;\n /** Resize behavior */\n resize?: 'none' | 'vertical' | 'horizontal' | 'both';\n}\n\n/**\n * Checkbox options\n */\nexport interface CheckboxOptions {\n /** Input name */\n name: string;\n /** Input ID */\n id?: string;\n /** Input value */\n value?: string;\n /** Label text */\n label: string;\n /** Checked state */\n checked?: boolean;\n /** Disabled state */\n disabled?: boolean;\n /** Helper text */\n helper?: string;\n /** Error message */\n error?: string;\n /** Additional CSS classes */\n className?: string;\n /** HTMX attributes */\n htmx?: {\n post?: string;\n get?: string;\n target?: string;\n swap?: string;\n trigger?: string;\n };\n}\n\n/**\n * Radio group options\n */\nexport interface RadioGroupOptions {\n /** Group name */\n name: string;\n /** Radio options */\n options: Array<{\n value: string;\n label: string;\n disabled?: boolean;\n }>;\n /** Selected value */\n value?: string;\n /** Label for the group */\n label?: string;\n /** Helper text */\n helper?: string;\n /** Error message */\n error?: string;\n /** Layout direction */\n direction?: 'horizontal' | 'vertical';\n /** Additional CSS classes */\n className?: string;\n}\n\n// ============================================\n// Form Builders\n// ============================================\n\n/**\n * Get size classes for inputs\n */\nfunction getInputSizeClasses(size: InputSize): string {\n const sizes: Record<InputSize, string> = {\n sm: 'px-3 py-1.5 text-sm',\n md: 'px-4 py-2.5 text-sm',\n lg: 'px-5 py-3 text-base',\n };\n return sizes[size];\n}\n\n/**\n * Get state classes for inputs\n */\nfunction getInputStateClasses(state: InputState): string {\n const states: Record<InputState, string> = {\n default: 'border-border focus:border-primary focus:ring-primary/20',\n error: 'border-danger focus:border-danger focus:ring-danger/20',\n success: 'border-success focus:border-success focus:ring-success/20',\n warning: 'border-warning focus:border-warning focus:ring-warning/20',\n };\n return states[state];\n}\n\n/**\n * Build HTMX attributes for form elements\n */\nfunction buildFormHtmxAttrs(htmx?: InputOptions['htmx']): string {\n if (!htmx) return '';\n const attrs: string[] = [];\n if (htmx.post) attrs.push(`hx-post=\"${escapeHtml(htmx.post)}\"`);\n if (htmx.get) attrs.push(`hx-get=\"${escapeHtml(htmx.get)}\"`);\n if (htmx.target) attrs.push(`hx-target=\"${escapeHtml(htmx.target)}\"`);\n if (htmx.swap) attrs.push(`hx-swap=\"${escapeHtml(htmx.swap)}\"`);\n if (htmx.trigger) attrs.push(`hx-trigger=\"${escapeHtml(htmx.trigger)}\"`);\n if (htmx.validate) attrs.push('hx-validate=\"true\"');\n return attrs.join(' ');\n}\n\n/**\n * Build data attributes\n */\nfunction buildDataAttrs(data?: Record<string, string>): string {\n if (!data) return '';\n return Object.entries(data)\n .map(([key, value]) => `data-${key}=\"${escapeHtml(value)}\"`)\n .join(' ');\n}\n\n/**\n * Build a text input component\n */\nexport function input(options: InputOptions): string {\n const {\n type = 'text',\n name,\n id = name,\n value = '',\n placeholder = '',\n label,\n helper,\n error,\n size = 'md',\n state = error ? 'error' : 'default',\n required = false,\n disabled = false,\n readonly = false,\n autocomplete,\n pattern,\n min,\n max,\n step,\n className = '',\n htmx,\n data,\n iconBefore,\n iconAfter,\n } = options;\n\n const sizeClasses = getInputSizeClasses(size);\n const stateClasses = getInputStateClasses(state);\n const hasIcon = iconBefore || iconAfter;\n\n const baseClasses = [\n 'w-full rounded-lg border bg-white',\n 'transition-colors duration-200',\n 'focus:outline-none focus:ring-2',\n disabled ? 'opacity-50 cursor-not-allowed bg-gray-50' : '',\n sizeClasses,\n stateClasses,\n hasIcon ? (iconBefore ? 'pl-10' : '') + (iconAfter ? ' pr-10' : '') : '',\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n const htmxAttrs = buildFormHtmxAttrs(htmx);\n const dataAttrs = buildDataAttrs(data);\n\n const inputAttrs = [\n `type=\"${type}\"`,\n `name=\"${escapeHtml(name)}\"`,\n `id=\"${escapeHtml(id)}\"`,\n value ? `value=\"${escapeHtml(value)}\"` : '',\n placeholder ? `placeholder=\"${escapeHtml(placeholder)}\"` : '',\n required ? 'required' : '',\n disabled ? 'disabled' : '',\n readonly ? 'readonly' : '',\n autocomplete ? `autocomplete=\"${escapeHtml(autocomplete)}\"` : '',\n pattern ? `pattern=\"${escapeHtml(pattern)}\"` : '',\n min !== undefined ? `min=\"${escapeHtml(String(min))}\"` : '',\n max !== undefined ? `max=\"${escapeHtml(String(max))}\"` : '',\n step !== undefined ? `step=\"${escapeHtml(String(step))}\"` : '',\n `class=\"${baseClasses}\"`,\n htmxAttrs,\n dataAttrs,\n ]\n .filter(Boolean)\n .join(' ');\n\n const labelHtml = label\n ? `<label for=\"${escapeHtml(id)}\" class=\"block text-sm font-medium text-text-primary mb-1.5\">\n ${escapeHtml(label)}${required ? '<span class=\"text-danger ml-1\">*</span>' : ''}\n </label>`\n : '';\n\n const helperHtml = helper && !error ? `<p class=\"mt-1.5 text-sm text-text-secondary\">${escapeHtml(helper)}</p>` : '';\n\n const errorHtml = error ? `<p class=\"mt-1.5 text-sm text-danger\">${escapeHtml(error)}</p>` : '';\n\n const iconBeforeHtml = iconBefore\n ? `<span class=\"absolute left-3 top-1/2 -translate-y-1/2 text-text-secondary\">${iconBefore}</span>`\n : '';\n\n const iconAfterHtml = iconAfter\n ? `<span class=\"absolute right-3 top-1/2 -translate-y-1/2 text-text-secondary\">${iconAfter}</span>`\n : '';\n\n const inputHtml = hasIcon\n ? `<div class=\"relative\">\n ${iconBeforeHtml}\n <input ${inputAttrs}>\n ${iconAfterHtml}\n </div>`\n : `<input ${inputAttrs}>`;\n\n return `<div class=\"form-field\">\n ${labelHtml}\n ${inputHtml}\n ${helperHtml}\n ${errorHtml}\n </div>`;\n}\n\n/**\n * Build a select component\n */\nexport function select(options: SelectOptions): string {\n const {\n name,\n id = name,\n options: selectOptions,\n value,\n label,\n helper,\n error,\n size = 'md',\n state = error ? 'error' : 'default',\n required = false,\n disabled = false,\n multiple = false,\n className = '',\n htmx,\n data,\n } = options;\n\n const sizeClasses = getInputSizeClasses(size);\n const stateClasses = getInputStateClasses(state);\n\n const baseClasses = [\n 'w-full rounded-lg border bg-white',\n 'transition-colors duration-200',\n 'focus:outline-none focus:ring-2',\n disabled ? 'opacity-50 cursor-not-allowed bg-gray-50' : '',\n sizeClasses,\n stateClasses,\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n const htmxAttrs = buildFormHtmxAttrs(htmx);\n const dataAttrs = buildDataAttrs(data);\n\n const optionsHtml = selectOptions\n .map((opt) => {\n const selected = opt.selected || opt.value === value ? 'selected' : '';\n const optDisabled = opt.disabled ? 'disabled' : '';\n return `<option value=\"${escapeHtml(opt.value)}\" ${selected} ${optDisabled}>${escapeHtml(opt.label)}</option>`;\n })\n .join('\\n');\n\n const labelHtml = label\n ? `<label for=\"${escapeHtml(id)}\" class=\"block text-sm font-medium text-text-primary mb-1.5\">\n ${escapeHtml(label)}${required ? '<span class=\"text-danger ml-1\">*</span>' : ''}\n </label>`\n : '';\n\n const helperHtml = helper && !error ? `<p class=\"mt-1.5 text-sm text-text-secondary\">${escapeHtml(helper)}</p>` : '';\n\n const errorHtml = error ? `<p class=\"mt-1.5 text-sm text-danger\">${escapeHtml(error)}</p>` : '';\n\n return `<div class=\"form-field\">\n ${labelHtml}\n <select\n name=\"${escapeHtml(name)}\"\n id=\"${escapeHtml(id)}\"\n class=\"${baseClasses}\"\n ${required ? 'required' : ''}\n ${disabled ? 'disabled' : ''}\n ${multiple ? 'multiple' : ''}\n ${htmxAttrs}\n ${dataAttrs}\n >\n ${optionsHtml}\n </select>\n ${helperHtml}\n ${errorHtml}\n </div>`;\n}\n\n/**\n * Build a textarea component\n */\nexport function textarea(options: TextareaOptions): string {\n const {\n name,\n id = name,\n value = '',\n placeholder = '',\n label,\n helper,\n error,\n size = 'md',\n state = error ? 'error' : 'default',\n required = false,\n disabled = false,\n readonly = false,\n rows = 4,\n resize = 'vertical',\n className = '',\n htmx,\n data,\n } = options;\n\n const sizeClasses = getInputSizeClasses(size);\n const stateClasses = getInputStateClasses(state);\n\n const resizeClasses: Record<string, string> = {\n none: 'resize-none',\n vertical: 'resize-y',\n horizontal: 'resize-x',\n both: 'resize',\n };\n\n const baseClasses = [\n 'w-full rounded-lg border bg-white',\n 'transition-colors duration-200',\n 'focus:outline-none focus:ring-2',\n disabled ? 'opacity-50 cursor-not-allowed bg-gray-50' : '',\n sizeClasses,\n stateClasses,\n resizeClasses[resize],\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n const htmxAttrs = buildFormHtmxAttrs(htmx);\n const dataAttrs = buildDataAttrs(data);\n\n const labelHtml = label\n ? `<label for=\"${escapeHtml(id)}\" class=\"block text-sm font-medium text-text-primary mb-1.5\">\n ${escapeHtml(label)}${required ? '<span class=\"text-danger ml-1\">*</span>' : ''}\n </label>`\n : '';\n\n const helperHtml = helper && !error ? `<p class=\"mt-1.5 text-sm text-text-secondary\">${escapeHtml(helper)}</p>` : '';\n\n const errorHtml = error ? `<p class=\"mt-1.5 text-sm text-danger\">${escapeHtml(error)}</p>` : '';\n\n return `<div class=\"form-field\">\n ${labelHtml}\n <textarea\n name=\"${escapeHtml(name)}\"\n id=\"${escapeHtml(id)}\"\n rows=\"${rows}\"\n class=\"${baseClasses}\"\n ${placeholder ? `placeholder=\"${escapeHtml(placeholder)}\"` : ''}\n ${required ? 'required' : ''}\n ${disabled ? 'disabled' : ''}\n ${readonly ? 'readonly' : ''}\n ${htmxAttrs}\n ${dataAttrs}\n >${escapeHtml(value)}</textarea>\n ${helperHtml}\n ${errorHtml}\n </div>`;\n}\n\n/**\n * Build a checkbox component\n */\nexport function checkbox(options: CheckboxOptions): string {\n const {\n name,\n id = name,\n value = 'true',\n label,\n checked = false,\n disabled = false,\n helper,\n error,\n className = '',\n htmx,\n } = options;\n\n const htmxAttrs = buildFormHtmxAttrs(htmx);\n\n const checkboxClasses = [\n 'h-4 w-4 rounded border-border text-primary',\n 'focus:ring-2 focus:ring-primary/20 focus:ring-offset-0',\n disabled ? 'opacity-50 cursor-not-allowed' : 'cursor-pointer',\n ].join(' ');\n\n const helperHtml = helper && !error ? `<p class=\"text-sm text-text-secondary\">${escapeHtml(helper)}</p>` : '';\n\n const errorHtml = error ? `<p class=\"text-sm text-danger\">${escapeHtml(error)}</p>` : '';\n\n return `<div class=\"form-field ${className}\">\n <label class=\"flex items-start gap-3 ${disabled ? 'cursor-not-allowed' : 'cursor-pointer'}\">\n <input\n type=\"checkbox\"\n name=\"${escapeHtml(name)}\"\n id=\"${escapeHtml(id)}\"\n value=\"${escapeHtml(value)}\"\n class=\"${checkboxClasses}\"\n ${checked ? 'checked' : ''}\n ${disabled ? 'disabled' : ''}\n ${htmxAttrs}\n >\n <div>\n <span class=\"text-sm font-medium text-text-primary\">${escapeHtml(label)}</span>\n ${helperHtml}\n ${errorHtml}\n </div>\n </label>\n </div>`;\n}\n\n/**\n * Build a radio group component\n */\nexport function radioGroup(options: RadioGroupOptions): string {\n const { name, options: radioOptions, value, label, helper, error, direction = 'vertical', className = '' } = options;\n\n const directionClasses = direction === 'horizontal' ? 'flex flex-row flex-wrap gap-4' : 'flex flex-col gap-2';\n\n const radioClasses = 'h-4 w-4 border-border text-primary focus:ring-2 focus:ring-primary/20 focus:ring-offset-0';\n\n const radiosHtml = radioOptions\n .map((opt, index) => {\n const radioId = `${name}-${index}`;\n const checked = opt.value === value ? 'checked' : '';\n const disabled = opt.disabled ? 'disabled' : '';\n const cursorClass = opt.disabled ? 'cursor-not-allowed opacity-50' : 'cursor-pointer';\n\n return `<label class=\"flex items-center gap-2 ${cursorClass}\">\n <input\n type=\"radio\"\n name=\"${escapeHtml(name)}\"\n id=\"${escapeHtml(radioId)}\"\n value=\"${escapeHtml(opt.value)}\"\n class=\"${radioClasses}\"\n ${checked}\n ${disabled}\n >\n <span class=\"text-sm text-text-primary\">${escapeHtml(opt.label)}</span>\n </label>`;\n })\n .join('\\n');\n\n const labelHtml = label\n ? `<label class=\"block text-sm font-medium text-text-primary mb-2\">${escapeHtml(label)}</label>`\n : '';\n\n const helperHtml = helper && !error ? `<p class=\"mt-1.5 text-sm text-text-secondary\">${escapeHtml(helper)}</p>` : '';\n\n const errorHtml = error ? `<p class=\"mt-1.5 text-sm text-danger\">${escapeHtml(error)}</p>` : '';\n\n return `<div class=\"form-field ${className}\" role=\"radiogroup\">\n ${labelHtml}\n <div class=\"${directionClasses}\">\n ${radiosHtml}\n </div>\n ${helperHtml}\n ${errorHtml}\n </div>`;\n}\n\n// ============================================\n// Form Layout Components\n// ============================================\n\n/**\n * Form wrapper options\n */\nexport interface FormOptions {\n /** Form action URL */\n action?: string;\n /** HTTP method */\n method?: 'get' | 'post';\n /** Form ID */\n id?: string;\n /** Additional CSS classes */\n className?: string;\n /** HTMX attributes */\n htmx?: {\n post?: string;\n get?: string;\n put?: string;\n delete?: string;\n target?: string;\n swap?: string;\n indicator?: string;\n confirm?: string;\n };\n /** Prevent default submission */\n preventDefault?: boolean;\n /** Autocomplete */\n autocomplete?: 'on' | 'off';\n /** Enctype for file uploads */\n enctype?: 'application/x-www-form-urlencoded' | 'multipart/form-data' | 'text/plain';\n}\n\n/**\n * Build form wrapper\n */\nexport function form(content: string, options: FormOptions = {}): string {\n const { action, method = 'post', id, className = '', htmx, preventDefault = false, autocomplete, enctype } = options;\n\n const htmxAttrs: string[] = [];\n if (htmx) {\n if (htmx.post) htmxAttrs.push(`hx-post=\"${escapeHtml(htmx.post)}\"`);\n if (htmx.get) htmxAttrs.push(`hx-get=\"${escapeHtml(htmx.get)}\"`);\n if (htmx.put) htmxAttrs.push(`hx-put=\"${escapeHtml(htmx.put)}\"`);\n if (htmx.delete) htmxAttrs.push(`hx-delete=\"${escapeHtml(htmx.delete)}\"`);\n if (htmx.target) htmxAttrs.push(`hx-target=\"${escapeHtml(htmx.target)}\"`);\n if (htmx.swap) htmxAttrs.push(`hx-swap=\"${escapeHtml(htmx.swap)}\"`);\n if (htmx.indicator) htmxAttrs.push(`hx-indicator=\"${escapeHtml(htmx.indicator)}\"`);\n if (htmx.confirm) htmxAttrs.push(`hx-confirm=\"${escapeHtml(htmx.confirm)}\"`);\n }\n\n const attrs = [\n action ? `action=\"${escapeHtml(action)}\"` : '',\n `method=\"${method}\"`,\n id ? `id=\"${escapeHtml(id)}\"` : '',\n className ? `class=\"${escapeHtml(className)}\"` : '',\n autocomplete ? `autocomplete=\"${autocomplete}\"` : '',\n enctype ? `enctype=\"${enctype}\"` : '',\n preventDefault ? 'onsubmit=\"return false;\"' : '',\n htmxAttrs.join(' '),\n ]\n .filter(Boolean)\n .join(' ');\n\n return `<form ${attrs}>${content}</form>`;\n}\n\n/**\n * Build form row (for horizontal forms)\n */\nexport function formRow(fields: string[], options: { gap?: 'sm' | 'md' | 'lg'; className?: string } = {}): string {\n const { gap = 'md', className = '' } = options;\n const gapClasses = { sm: 'gap-2', md: 'gap-4', lg: 'gap-6' };\n\n return `<div class=\"grid grid-cols-${fields.length} ${gapClasses[gap]} ${className}\">\n ${fields.join('\\n')}\n </div>`;\n}\n\n/**\n * Build form section with title\n */\nexport function formSection(\n content: string,\n options: { title?: string; description?: string; className?: string } = {},\n): string {\n const { title, description, className = '' } = options;\n\n const headerHtml = title\n ? `<div class=\"mb-4\">\n <h3 class=\"text-lg font-semibold text-text-primary\">${escapeHtml(title)}</h3>\n ${description ? `<p class=\"text-sm text-text-secondary mt-1\">${escapeHtml(description)}</p>` : ''}\n </div>`\n : '';\n\n return `<div class=\"form-section ${className}\">\n ${headerHtml}\n <div class=\"space-y-4\">\n ${content}\n </div>\n </div>`;\n}\n\n/**\n * Build form actions (submit/cancel buttons area)\n */\nexport function formActions(\n buttons: string[],\n options: { align?: 'left' | 'center' | 'right' | 'between'; className?: string } = {},\n): string {\n const { align = 'right', className = '' } = options;\n\n const alignClasses: Record<string, string> = {\n left: 'justify-start',\n center: 'justify-center',\n right: 'justify-end',\n between: 'justify-between',\n };\n\n return `<div class=\"flex items-center gap-3 pt-4 ${alignClasses[align]} ${className}\">\n ${buttons.join('\\n')}\n </div>`;\n}\n\n// ============================================\n// Hidden Input\n// ============================================\n\n/**\n * Build a hidden input\n */\nexport function hiddenInput(name: string, value: string): string {\n return `<input type=\"hidden\" name=\"${escapeHtml(name)}\" value=\"${escapeHtml(value)}\">`;\n}\n\n/**\n * Build CSRF token hidden input\n */\nexport function csrfInput(token: string): string {\n return hiddenInput('_csrf', token);\n}\n"]}