@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,303 @@
1
+ "use strict";
2
+ /**
3
+ * Progress and Status Widgets
4
+ *
5
+ * Components for displaying progress, loading states, and status information.
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.progressBar = progressBar;
9
+ exports.stepProgress = stepProgress;
10
+ exports.circularProgress = circularProgress;
11
+ exports.statusIndicator = statusIndicator;
12
+ exports.skeleton = skeleton;
13
+ exports.contentSkeleton = contentSkeleton;
14
+ const base_1 = require("../layouts/base");
15
+ /**
16
+ * Build a progress bar
17
+ */
18
+ function progressBar(options) {
19
+ const { value, showLabel = true, labelPosition = 'outside', size = 'md', variant = 'primary', animated = false, className = '', label, } = options;
20
+ const clampedValue = Math.min(100, Math.max(0, value));
21
+ const sizeClasses = {
22
+ sm: 'h-1.5',
23
+ md: 'h-2.5',
24
+ lg: 'h-4',
25
+ };
26
+ const variantClasses = {
27
+ primary: 'bg-primary',
28
+ success: 'bg-success',
29
+ warning: 'bg-warning',
30
+ danger: 'bg-danger',
31
+ info: 'bg-blue-500',
32
+ };
33
+ const animatedClass = animated ? 'bg-stripes animate-stripes' : '';
34
+ const displayLabel = label || `${Math.round(clampedValue)}%`;
35
+ const insideLabel = labelPosition === 'inside' && size === 'lg' && clampedValue > 10
36
+ ? `<span class="absolute inset-0 flex items-center justify-center text-xs font-medium text-white">${(0, base_1.escapeHtml)(displayLabel)}</span>`
37
+ : '';
38
+ const outsideLabel = showLabel && labelPosition === 'outside'
39
+ ? `<div class="flex justify-between mb-1">
40
+ <span class="text-sm font-medium text-text-primary">${label ? (0, base_1.escapeHtml)(label) : 'Progress'}</span>
41
+ <span class="text-sm text-text-secondary">${Math.round(clampedValue)}%</span>
42
+ </div>`
43
+ : '';
44
+ return `<div class="progress-bar ${className}">
45
+ ${outsideLabel}
46
+ <div class="relative w-full ${sizeClasses[size]} bg-gray-200 rounded-full overflow-hidden">
47
+ <div
48
+ class="${variantClasses[variant]} ${sizeClasses[size]} ${animatedClass} rounded-full transition-all duration-300"
49
+ style="width: ${clampedValue}%"
50
+ role="progressbar"
51
+ aria-valuenow="${clampedValue}"
52
+ aria-valuemin="0"
53
+ aria-valuemax="100"
54
+ ></div>
55
+ ${insideLabel}
56
+ </div>
57
+ </div>
58
+ ${animated
59
+ ? `<style>
60
+ .bg-stripes {
61
+ background-image: linear-gradient(
62
+ 45deg,
63
+ rgba(255,255,255,0.15) 25%,
64
+ transparent 25%,
65
+ transparent 50%,
66
+ rgba(255,255,255,0.15) 50%,
67
+ rgba(255,255,255,0.15) 75%,
68
+ transparent 75%,
69
+ transparent
70
+ );
71
+ background-size: 1rem 1rem;
72
+ }
73
+ @keyframes stripes {
74
+ from { background-position: 1rem 0; }
75
+ to { background-position: 0 0; }
76
+ }
77
+ .animate-stripes {
78
+ animation: stripes 1s linear infinite;
79
+ }
80
+ </style>`
81
+ : ''}`;
82
+ }
83
+ /**
84
+ * Build a multi-step progress indicator
85
+ */
86
+ function stepProgress(options) {
87
+ const { steps, orientation = 'horizontal', connector = 'line', className = '' } = options;
88
+ const getStepIcon = (step, index) => {
89
+ if (step.icon)
90
+ return step.icon;
91
+ if (step.status === 'completed') {
92
+ return `<svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
93
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 13l4 4L19 7"/>
94
+ </svg>`;
95
+ }
96
+ return `<span class="font-medium">${index + 1}</span>`;
97
+ };
98
+ const getStepClasses = (status) => {
99
+ switch (status) {
100
+ case 'completed':
101
+ return {
102
+ circle: 'bg-success text-white',
103
+ text: 'text-text-primary',
104
+ };
105
+ case 'current':
106
+ return {
107
+ circle: 'bg-primary text-white ring-4 ring-primary/20',
108
+ text: 'text-primary font-medium',
109
+ };
110
+ case 'upcoming':
111
+ default:
112
+ return {
113
+ circle: 'bg-gray-200 text-gray-500',
114
+ text: 'text-text-secondary',
115
+ };
116
+ }
117
+ };
118
+ if (orientation === 'vertical') {
119
+ const stepsHtml = steps
120
+ .map((step, index) => {
121
+ const classes = getStepClasses(step.status);
122
+ const isLast = index === steps.length - 1;
123
+ const connectorHtml = !isLast && connector !== 'none'
124
+ ? `<div class="ml-5 w-0.5 h-8 ${connector === 'dashed' ? 'border-l-2 border-dashed border-gray-300' : 'bg-gray-200'} ${step.status === 'completed' ? 'bg-success' : ''}"></div>`
125
+ : '';
126
+ const stepContent = `
127
+ <div class="flex items-start gap-4">
128
+ <div class="w-10 h-10 rounded-full ${classes.circle} flex items-center justify-center flex-shrink-0">
129
+ ${getStepIcon(step, index)}
130
+ </div>
131
+ <div class="pt-2">
132
+ <div class="${classes.text}">${(0, base_1.escapeHtml)(step.label)}</div>
133
+ ${step.description
134
+ ? `<p class="text-sm text-text-secondary mt-0.5">${(0, base_1.escapeHtml)(step.description)}</p>`
135
+ : ''}
136
+ </div>
137
+ </div>
138
+ ${connectorHtml}
139
+ `;
140
+ return step.href && step.status === 'completed'
141
+ ? `<a href="${(0, base_1.escapeHtml)(step.href)}" class="block hover:opacity-80">${stepContent}</a>`
142
+ : `<div>${stepContent}</div>`;
143
+ })
144
+ .join('\n');
145
+ return `<div class="step-progress ${className}">${stepsHtml}</div>`;
146
+ }
147
+ // Horizontal orientation
148
+ const stepsHtml = steps
149
+ .map((step, index) => {
150
+ const classes = getStepClasses(step.status);
151
+ const isLast = index === steps.length - 1;
152
+ const connectorHtml = !isLast && connector !== 'none'
153
+ ? `<div class="flex-1 h-0.5 mx-2 ${connector === 'dashed' ? 'border-t-2 border-dashed border-gray-300' : 'bg-gray-200'} ${step.status === 'completed' ? 'bg-success' : ''}"></div>`
154
+ : '';
155
+ const stepHtml = `
156
+ <div class="flex flex-col items-center">
157
+ <div class="w-10 h-10 rounded-full ${classes.circle} flex items-center justify-center">
158
+ ${getStepIcon(step, index)}
159
+ </div>
160
+ <div class="mt-2 text-center">
161
+ <div class="${classes.text} text-sm">${(0, base_1.escapeHtml)(step.label)}</div>
162
+ ${step.description
163
+ ? `<p class="text-xs text-text-secondary mt-0.5 max-w-[120px]">${(0, base_1.escapeHtml)(step.description)}</p>`
164
+ : ''}
165
+ </div>
166
+ </div>
167
+ `;
168
+ const clickableStep = step.href && step.status === 'completed'
169
+ ? `<a href="${(0, base_1.escapeHtml)(step.href)}" class="hover:opacity-80">${stepHtml}</a>`
170
+ : stepHtml;
171
+ return `${clickableStep}${connectorHtml}`;
172
+ })
173
+ .join('\n');
174
+ return `<div class="step-progress flex items-start ${className}">${stepsHtml}</div>`;
175
+ }
176
+ /**
177
+ * Build a circular progress indicator
178
+ */
179
+ function circularProgress(options) {
180
+ const { value, size = 80, strokeWidth = 8, variant = 'primary', showLabel = true, label, className = '' } = options;
181
+ const clampedValue = Math.min(100, Math.max(0, value));
182
+ const radius = (size - strokeWidth) / 2;
183
+ const circumference = radius * 2 * Math.PI;
184
+ const offset = circumference - (clampedValue / 100) * circumference;
185
+ const variantColors = {
186
+ primary: 'text-primary',
187
+ success: 'text-success',
188
+ warning: 'text-warning',
189
+ danger: 'text-danger',
190
+ };
191
+ const displayLabel = label || `${Math.round(clampedValue)}%`;
192
+ return `<div class="circular-progress inline-flex items-center justify-center ${className}" style="width: ${size}px; height: ${size}px;">
193
+ <svg class="transform -rotate-90" width="${size}" height="${size}">
194
+ <!-- Background circle -->
195
+ <circle
196
+ cx="${size / 2}"
197
+ cy="${size / 2}"
198
+ r="${radius}"
199
+ fill="none"
200
+ stroke="currentColor"
201
+ stroke-width="${strokeWidth}"
202
+ class="text-gray-200"
203
+ />
204
+ <!-- Progress circle -->
205
+ <circle
206
+ cx="${size / 2}"
207
+ cy="${size / 2}"
208
+ r="${radius}"
209
+ fill="none"
210
+ stroke="currentColor"
211
+ stroke-width="${strokeWidth}"
212
+ stroke-linecap="round"
213
+ class="${variantColors[variant]}"
214
+ style="stroke-dasharray: ${circumference}; stroke-dashoffset: ${offset}; transition: stroke-dashoffset 0.3s ease;"
215
+ />
216
+ </svg>
217
+ ${showLabel
218
+ ? `<span class="absolute text-sm font-semibold text-text-primary">${(0, base_1.escapeHtml)(displayLabel)}</span>`
219
+ : ''}
220
+ </div>`;
221
+ }
222
+ /**
223
+ * Build a status indicator
224
+ */
225
+ function statusIndicator(options) {
226
+ const { status, label, size = 'md', pulse = false, className = '' } = options;
227
+ const sizeClasses = {
228
+ sm: { dot: 'w-2 h-2', text: 'text-xs' },
229
+ md: { dot: 'w-2.5 h-2.5', text: 'text-sm' },
230
+ lg: { dot: 'w-3 h-3', text: 'text-base' },
231
+ };
232
+ const statusClasses = {
233
+ online: { color: 'bg-success', label: 'Online' },
234
+ offline: { color: 'bg-gray-400', label: 'Offline' },
235
+ busy: { color: 'bg-danger', label: 'Busy' },
236
+ away: { color: 'bg-warning', label: 'Away' },
237
+ loading: { color: 'bg-blue-500', label: 'Loading' },
238
+ error: { color: 'bg-danger', label: 'Error' },
239
+ success: { color: 'bg-success', label: 'Success' },
240
+ };
241
+ const statusInfo = statusClasses[status];
242
+ const sizeInfo = sizeClasses[size];
243
+ const displayLabel = label || statusInfo.label;
244
+ const pulseHtml = pulse || status === 'loading'
245
+ ? `<span class="absolute ${sizeInfo.dot} ${statusInfo.color} rounded-full animate-ping opacity-75"></span>`
246
+ : '';
247
+ return `<div class="status-indicator inline-flex items-center gap-2 ${className}">
248
+ <span class="relative flex">
249
+ ${pulseHtml}
250
+ <span class="relative ${sizeInfo.dot} ${statusInfo.color} rounded-full"></span>
251
+ </span>
252
+ ${displayLabel ? `<span class="${sizeInfo.text} text-text-secondary">${(0, base_1.escapeHtml)(displayLabel)}</span>` : ''}
253
+ </div>`;
254
+ }
255
+ /**
256
+ * Build a skeleton loader
257
+ */
258
+ function skeleton(options = {}) {
259
+ const { type = 'text', width, height, lines = 3, animated = true, className = '' } = options;
260
+ const animateClass = animated ? 'animate-pulse' : '';
261
+ const baseClass = `bg-gray-200 ${animateClass}`;
262
+ switch (type) {
263
+ case 'circle':
264
+ return `<div class="${baseClass} rounded-full ${className}" style="width: ${width || '40px'}; height: ${height || '40px'}"></div>`;
265
+ case 'rect':
266
+ return `<div class="${baseClass} rounded ${className}" style="width: ${width || '100%'}; height: ${height || '100px'}"></div>`;
267
+ case 'card':
268
+ return `<div class="${animateClass} space-y-4 ${className}">
269
+ <div class="bg-gray-200 rounded h-40"></div>
270
+ <div class="space-y-2">
271
+ <div class="bg-gray-200 h-4 rounded w-3/4"></div>
272
+ <div class="bg-gray-200 h-4 rounded w-1/2"></div>
273
+ </div>
274
+ </div>`;
275
+ case 'text':
276
+ default:
277
+ const linesHtml = Array(lines)
278
+ .fill(0)
279
+ .map((_, i) => {
280
+ const lineWidth = i === lines - 1 ? '60%' : i === 0 ? '90%' : '80%';
281
+ return `<div class="bg-gray-200 h-4 rounded" style="width: ${lineWidth}"></div>`;
282
+ })
283
+ .join('\n');
284
+ return `<div class="${animateClass} space-y-2 ${className}" style="width: ${width || '100%'}">
285
+ ${linesHtml}
286
+ </div>`;
287
+ }
288
+ }
289
+ /**
290
+ * Build a content skeleton with avatar and text
291
+ */
292
+ function contentSkeleton(options = {}) {
293
+ const { animated = true, className = '' } = options;
294
+ const animateClass = animated ? 'animate-pulse' : '';
295
+ return `<div class="${animateClass} flex gap-4 ${className}">
296
+ <div class="bg-gray-200 rounded-full w-12 h-12 flex-shrink-0"></div>
297
+ <div class="flex-1 space-y-2 py-1">
298
+ <div class="bg-gray-200 h-4 rounded w-3/4"></div>
299
+ <div class="bg-gray-200 h-4 rounded w-1/2"></div>
300
+ </div>
301
+ </div>`;
302
+ }
303
+ //# sourceMappingURL=progress.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"progress.js","sourceRoot":"","sources":["../../../src/widgets/progress.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Progress and Status Widgets\n *\n * Components for displaying progress, loading states, and status information.\n */\n\nimport { escapeHtml } from '../layouts/base';\n\n// ============================================\n// Progress Bar\n// ============================================\n\n/**\n * Progress bar options\n */\nexport interface ProgressBarOptions {\n /** Progress value (0-100) */\n value: number;\n /** Show percentage text */\n showLabel?: boolean;\n /** Label position */\n labelPosition?: 'inside' | 'outside' | 'none';\n /** Size */\n size?: 'sm' | 'md' | 'lg';\n /** Color variant */\n variant?: 'primary' | 'success' | 'warning' | 'danger' | 'info';\n /** Animated (striped) */\n animated?: boolean;\n /** Additional CSS classes */\n className?: string;\n /** Custom label */\n label?: string;\n}\n\n/**\n * Build a progress bar\n */\nexport function progressBar(options: ProgressBarOptions): string {\n const {\n value,\n showLabel = true,\n labelPosition = 'outside',\n size = 'md',\n variant = 'primary',\n animated = false,\n className = '',\n label,\n } = options;\n\n const clampedValue = Math.min(100, Math.max(0, value));\n\n const sizeClasses: Record<string, string> = {\n sm: 'h-1.5',\n md: 'h-2.5',\n lg: 'h-4',\n };\n\n const variantClasses: Record<string, string> = {\n primary: 'bg-primary',\n success: 'bg-success',\n warning: 'bg-warning',\n danger: 'bg-danger',\n info: 'bg-blue-500',\n };\n\n const animatedClass = animated ? 'bg-stripes animate-stripes' : '';\n\n const displayLabel = label || `${Math.round(clampedValue)}%`;\n\n const insideLabel =\n labelPosition === 'inside' && size === 'lg' && clampedValue > 10\n ? `<span class=\"absolute inset-0 flex items-center justify-center text-xs font-medium text-white\">${escapeHtml(\n displayLabel,\n )}</span>`\n : '';\n\n const outsideLabel =\n showLabel && labelPosition === 'outside'\n ? `<div class=\"flex justify-between mb-1\">\n <span class=\"text-sm font-medium text-text-primary\">${label ? escapeHtml(label) : 'Progress'}</span>\n <span class=\"text-sm text-text-secondary\">${Math.round(clampedValue)}%</span>\n </div>`\n : '';\n\n return `<div class=\"progress-bar ${className}\">\n ${outsideLabel}\n <div class=\"relative w-full ${sizeClasses[size]} bg-gray-200 rounded-full overflow-hidden\">\n <div\n class=\"${variantClasses[variant]} ${\n sizeClasses[size]\n } ${animatedClass} rounded-full transition-all duration-300\"\n style=\"width: ${clampedValue}%\"\n role=\"progressbar\"\n aria-valuenow=\"${clampedValue}\"\n aria-valuemin=\"0\"\n aria-valuemax=\"100\"\n ></div>\n ${insideLabel}\n </div>\n </div>\n ${\n animated\n ? `<style>\n .bg-stripes {\n background-image: linear-gradient(\n 45deg,\n rgba(255,255,255,0.15) 25%,\n transparent 25%,\n transparent 50%,\n rgba(255,255,255,0.15) 50%,\n rgba(255,255,255,0.15) 75%,\n transparent 75%,\n transparent\n );\n background-size: 1rem 1rem;\n }\n @keyframes stripes {\n from { background-position: 1rem 0; }\n to { background-position: 0 0; }\n }\n .animate-stripes {\n animation: stripes 1s linear infinite;\n }\n </style>`\n : ''\n }`;\n}\n\n// ============================================\n// Multi-Step Progress\n// ============================================\n\n/**\n * Step definition\n */\nexport interface Step {\n /** Step label */\n label: string;\n /** Step description */\n description?: string;\n /** Step status */\n status: 'completed' | 'current' | 'upcoming';\n /** Icon (optional) */\n icon?: string;\n /** URL for clickable steps */\n href?: string;\n}\n\n/**\n * Multi-step progress options\n */\nexport interface StepProgressOptions {\n /** Steps */\n steps: Step[];\n /** Orientation */\n orientation?: 'horizontal' | 'vertical';\n /** Connector style */\n connector?: 'line' | 'dashed' | 'none';\n /** Additional CSS classes */\n className?: string;\n}\n\n/**\n * Build a multi-step progress indicator\n */\nexport function stepProgress(options: StepProgressOptions): string {\n const { steps, orientation = 'horizontal', connector = 'line', className = '' } = options;\n\n const getStepIcon = (step: Step, index: number): string => {\n if (step.icon) return step.icon;\n\n if (step.status === 'completed') {\n return `<svg class=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M5 13l4 4L19 7\"/>\n </svg>`;\n }\n\n return `<span class=\"font-medium\">${index + 1}</span>`;\n };\n\n const getStepClasses = (status: Step['status']): { circle: string; text: string } => {\n switch (status) {\n case 'completed':\n return {\n circle: 'bg-success text-white',\n text: 'text-text-primary',\n };\n case 'current':\n return {\n circle: 'bg-primary text-white ring-4 ring-primary/20',\n text: 'text-primary font-medium',\n };\n case 'upcoming':\n default:\n return {\n circle: 'bg-gray-200 text-gray-500',\n text: 'text-text-secondary',\n };\n }\n };\n\n if (orientation === 'vertical') {\n const stepsHtml = steps\n .map((step, index) => {\n const classes = getStepClasses(step.status);\n const isLast = index === steps.length - 1;\n\n const connectorHtml =\n !isLast && connector !== 'none'\n ? `<div class=\"ml-5 w-0.5 h-8 ${\n connector === 'dashed' ? 'border-l-2 border-dashed border-gray-300' : 'bg-gray-200'\n } ${step.status === 'completed' ? 'bg-success' : ''}\"></div>`\n : '';\n\n const stepContent = `\n <div class=\"flex items-start gap-4\">\n <div class=\"w-10 h-10 rounded-full ${classes.circle} flex items-center justify-center flex-shrink-0\">\n ${getStepIcon(step, index)}\n </div>\n <div class=\"pt-2\">\n <div class=\"${classes.text}\">${escapeHtml(step.label)}</div>\n ${\n step.description\n ? `<p class=\"text-sm text-text-secondary mt-0.5\">${escapeHtml(step.description)}</p>`\n : ''\n }\n </div>\n </div>\n ${connectorHtml}\n `;\n\n return step.href && step.status === 'completed'\n ? `<a href=\"${escapeHtml(step.href)}\" class=\"block hover:opacity-80\">${stepContent}</a>`\n : `<div>${stepContent}</div>`;\n })\n .join('\\n');\n\n return `<div class=\"step-progress ${className}\">${stepsHtml}</div>`;\n }\n\n // Horizontal orientation\n const stepsHtml = steps\n .map((step, index) => {\n const classes = getStepClasses(step.status);\n const isLast = index === steps.length - 1;\n\n const connectorHtml =\n !isLast && connector !== 'none'\n ? `<div class=\"flex-1 h-0.5 mx-2 ${\n connector === 'dashed' ? 'border-t-2 border-dashed border-gray-300' : 'bg-gray-200'\n } ${step.status === 'completed' ? 'bg-success' : ''}\"></div>`\n : '';\n\n const stepHtml = `\n <div class=\"flex flex-col items-center\">\n <div class=\"w-10 h-10 rounded-full ${classes.circle} flex items-center justify-center\">\n ${getStepIcon(step, index)}\n </div>\n <div class=\"mt-2 text-center\">\n <div class=\"${classes.text} text-sm\">${escapeHtml(step.label)}</div>\n ${\n step.description\n ? `<p class=\"text-xs text-text-secondary mt-0.5 max-w-[120px]\">${escapeHtml(step.description)}</p>`\n : ''\n }\n </div>\n </div>\n `;\n\n const clickableStep =\n step.href && step.status === 'completed'\n ? `<a href=\"${escapeHtml(step.href)}\" class=\"hover:opacity-80\">${stepHtml}</a>`\n : stepHtml;\n\n return `${clickableStep}${connectorHtml}`;\n })\n .join('\\n');\n\n return `<div class=\"step-progress flex items-start ${className}\">${stepsHtml}</div>`;\n}\n\n// ============================================\n// Circular Progress\n// ============================================\n\n/**\n * Circular progress options\n */\nexport interface CircularProgressOptions {\n /** Progress value (0-100) */\n value: number;\n /** Size in pixels */\n size?: number;\n /** Stroke width */\n strokeWidth?: number;\n /** Color variant */\n variant?: 'primary' | 'success' | 'warning' | 'danger';\n /** Show percentage */\n showLabel?: boolean;\n /** Custom label */\n label?: string;\n /** Additional CSS classes */\n className?: string;\n}\n\n/**\n * Build a circular progress indicator\n */\nexport function circularProgress(options: CircularProgressOptions): string {\n const { value, size = 80, strokeWidth = 8, variant = 'primary', showLabel = true, label, className = '' } = options;\n\n const clampedValue = Math.min(100, Math.max(0, value));\n const radius = (size - strokeWidth) / 2;\n const circumference = radius * 2 * Math.PI;\n const offset = circumference - (clampedValue / 100) * circumference;\n\n const variantColors: Record<string, string> = {\n primary: 'text-primary',\n success: 'text-success',\n warning: 'text-warning',\n danger: 'text-danger',\n };\n\n const displayLabel = label || `${Math.round(clampedValue)}%`;\n\n return `<div class=\"circular-progress inline-flex items-center justify-center ${className}\" style=\"width: ${size}px; height: ${size}px;\">\n <svg class=\"transform -rotate-90\" width=\"${size}\" height=\"${size}\">\n <!-- Background circle -->\n <circle\n cx=\"${size / 2}\"\n cy=\"${size / 2}\"\n r=\"${radius}\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"${strokeWidth}\"\n class=\"text-gray-200\"\n />\n <!-- Progress circle -->\n <circle\n cx=\"${size / 2}\"\n cy=\"${size / 2}\"\n r=\"${radius}\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"${strokeWidth}\"\n stroke-linecap=\"round\"\n class=\"${variantColors[variant]}\"\n style=\"stroke-dasharray: ${circumference}; stroke-dashoffset: ${offset}; transition: stroke-dashoffset 0.3s ease;\"\n />\n </svg>\n ${\n showLabel\n ? `<span class=\"absolute text-sm font-semibold text-text-primary\">${escapeHtml(displayLabel)}</span>`\n : ''\n }\n </div>`;\n}\n\n// ============================================\n// Status Indicator\n// ============================================\n\n/**\n * Status indicator options\n */\nexport interface StatusIndicatorOptions {\n /** Status state */\n status: 'online' | 'offline' | 'busy' | 'away' | 'loading' | 'error' | 'success';\n /** Status label */\n label?: string;\n /** Size */\n size?: 'sm' | 'md' | 'lg';\n /** Show pulse animation */\n pulse?: boolean;\n /** Additional CSS classes */\n className?: string;\n}\n\n/**\n * Build a status indicator\n */\nexport function statusIndicator(options: StatusIndicatorOptions): string {\n const { status, label, size = 'md', pulse = false, className = '' } = options;\n\n const sizeClasses: Record<string, { dot: string; text: string }> = {\n sm: { dot: 'w-2 h-2', text: 'text-xs' },\n md: { dot: 'w-2.5 h-2.5', text: 'text-sm' },\n lg: { dot: 'w-3 h-3', text: 'text-base' },\n };\n\n const statusClasses: Record<string, { color: string; label: string }> = {\n online: { color: 'bg-success', label: 'Online' },\n offline: { color: 'bg-gray-400', label: 'Offline' },\n busy: { color: 'bg-danger', label: 'Busy' },\n away: { color: 'bg-warning', label: 'Away' },\n loading: { color: 'bg-blue-500', label: 'Loading' },\n error: { color: 'bg-danger', label: 'Error' },\n success: { color: 'bg-success', label: 'Success' },\n };\n\n const statusInfo = statusClasses[status];\n const sizeInfo = sizeClasses[size];\n const displayLabel = label || statusInfo.label;\n\n const pulseHtml =\n pulse || status === 'loading'\n ? `<span class=\"absolute ${sizeInfo.dot} ${statusInfo.color} rounded-full animate-ping opacity-75\"></span>`\n : '';\n\n return `<div class=\"status-indicator inline-flex items-center gap-2 ${className}\">\n <span class=\"relative flex\">\n ${pulseHtml}\n <span class=\"relative ${sizeInfo.dot} ${statusInfo.color} rounded-full\"></span>\n </span>\n ${displayLabel ? `<span class=\"${sizeInfo.text} text-text-secondary\">${escapeHtml(displayLabel)}</span>` : ''}\n </div>`;\n}\n\n// ============================================\n// Skeleton Loader\n// ============================================\n\n/**\n * Skeleton loader options\n */\nexport interface SkeletonOptions {\n /** Skeleton type */\n type?: 'text' | 'circle' | 'rect' | 'card';\n /** Width (CSS value) */\n width?: string;\n /** Height (CSS value) */\n height?: string;\n /** Number of text lines */\n lines?: number;\n /** Animated */\n animated?: boolean;\n /** Additional CSS classes */\n className?: string;\n}\n\n/**\n * Build a skeleton loader\n */\nexport function skeleton(options: SkeletonOptions = {}): string {\n const { type = 'text', width, height, lines = 3, animated = true, className = '' } = options;\n\n const animateClass = animated ? 'animate-pulse' : '';\n const baseClass = `bg-gray-200 ${animateClass}`;\n\n switch (type) {\n case 'circle':\n return `<div class=\"${baseClass} rounded-full ${className}\" style=\"width: ${width || '40px'}; height: ${\n height || '40px'\n }\"></div>`;\n\n case 'rect':\n return `<div class=\"${baseClass} rounded ${className}\" style=\"width: ${width || '100%'}; height: ${\n height || '100px'\n }\"></div>`;\n\n case 'card':\n return `<div class=\"${animateClass} space-y-4 ${className}\">\n <div class=\"bg-gray-200 rounded h-40\"></div>\n <div class=\"space-y-2\">\n <div class=\"bg-gray-200 h-4 rounded w-3/4\"></div>\n <div class=\"bg-gray-200 h-4 rounded w-1/2\"></div>\n </div>\n </div>`;\n\n case 'text':\n default:\n const linesHtml = Array(lines)\n .fill(0)\n .map((_, i) => {\n const lineWidth = i === lines - 1 ? '60%' : i === 0 ? '90%' : '80%';\n return `<div class=\"bg-gray-200 h-4 rounded\" style=\"width: ${lineWidth}\"></div>`;\n })\n .join('\\n');\n\n return `<div class=\"${animateClass} space-y-2 ${className}\" style=\"width: ${width || '100%'}\">\n ${linesHtml}\n </div>`;\n }\n}\n\n/**\n * Build a content skeleton with avatar and text\n */\nexport function contentSkeleton(options: { animated?: boolean; className?: string } = {}): string {\n const { animated = true, className = '' } = options;\n const animateClass = animated ? 'animate-pulse' : '';\n\n return `<div class=\"${animateClass} flex gap-4 ${className}\">\n <div class=\"bg-gray-200 rounded-full w-12 h-12 flex-shrink-0\"></div>\n <div class=\"flex-1 space-y-2 py-1\">\n <div class=\"bg-gray-200 h-4 rounded w-3/4\"></div>\n <div class=\"bg-gray-200 h-4 rounded w-1/2\"></div>\n </div>\n </div>`;\n}\n"]}
@@ -0,0 +1,162 @@
1
+ /**
2
+ * OpenAI App SDK Resource Widgets
3
+ *
4
+ * Components for displaying resources in OpenAI's App SDK format.
5
+ * These widgets are designed to work with OpenAI Canvas and similar interfaces.
6
+ */
7
+ import { type CardOptions } from '../components/card';
8
+ import { type BadgeVariant } from '../components/badge';
9
+ /**
10
+ * Resource type identifiers
11
+ */
12
+ export type ResourceType = 'document' | 'image' | 'code' | 'data' | 'file' | 'link' | 'user' | 'event' | 'message' | 'task' | 'custom';
13
+ /**
14
+ * Resource metadata
15
+ */
16
+ export interface ResourceMeta {
17
+ /** Creation timestamp */
18
+ createdAt?: string | Date;
19
+ /** Last modified timestamp */
20
+ updatedAt?: string | Date;
21
+ /** Author/creator */
22
+ author?: string;
23
+ /** File size (bytes) */
24
+ size?: number;
25
+ /** MIME type */
26
+ mimeType?: string;
27
+ /** Tags */
28
+ tags?: string[];
29
+ /** Custom metadata */
30
+ [key: string]: unknown;
31
+ }
32
+ /**
33
+ * Resource action
34
+ */
35
+ export interface ResourceAction {
36
+ /** Action label */
37
+ label: string;
38
+ /** Action icon */
39
+ icon?: string;
40
+ /** Action URL */
41
+ href?: string;
42
+ /** HTMX attributes */
43
+ htmx?: {
44
+ get?: string;
45
+ post?: string;
46
+ delete?: string;
47
+ target?: string;
48
+ swap?: string;
49
+ confirm?: string;
50
+ };
51
+ /** Variant */
52
+ variant?: 'primary' | 'secondary' | 'danger' | 'ghost';
53
+ /** Disabled */
54
+ disabled?: boolean;
55
+ }
56
+ /**
57
+ * Base resource options
58
+ */
59
+ export interface ResourceOptions {
60
+ /** Resource type */
61
+ type: ResourceType;
62
+ /** Resource title */
63
+ title: string;
64
+ /** Resource description */
65
+ description?: string;
66
+ /** Resource icon */
67
+ icon?: string;
68
+ /** Resource thumbnail URL */
69
+ thumbnail?: string;
70
+ /** Resource URL */
71
+ url?: string;
72
+ /** Resource metadata */
73
+ meta?: ResourceMeta;
74
+ /** Resource status */
75
+ status?: {
76
+ label: string;
77
+ variant: BadgeVariant;
78
+ };
79
+ /** Available actions */
80
+ actions?: ResourceAction[];
81
+ /** Additional CSS classes */
82
+ className?: string;
83
+ /** Card options */
84
+ cardOptions?: Partial<CardOptions>;
85
+ }
86
+ /**
87
+ * Build a resource widget
88
+ */
89
+ export declare function resourceWidget(options: ResourceOptions): string;
90
+ /**
91
+ * Resource list options
92
+ */
93
+ export interface ResourceListOptions {
94
+ /** Resources to display */
95
+ resources: ResourceOptions[];
96
+ /** List title */
97
+ title?: string;
98
+ /** Empty state message */
99
+ emptyMessage?: string;
100
+ /** Grid or list layout */
101
+ layout?: 'list' | 'grid';
102
+ /** Grid columns */
103
+ columns?: 1 | 2 | 3 | 4;
104
+ /** Additional CSS classes */
105
+ className?: string;
106
+ /** Show load more button */
107
+ showLoadMore?: boolean;
108
+ /** Load more URL */
109
+ loadMoreUrl?: string;
110
+ }
111
+ /**
112
+ * Build a resource list widget
113
+ */
114
+ export declare function resourceList(options: ResourceListOptions): string;
115
+ /**
116
+ * Build a compact resource item (for inline display)
117
+ */
118
+ export declare function resourceItem(options: Omit<ResourceOptions, 'cardOptions'>): string;
119
+ /**
120
+ * Code preview options
121
+ */
122
+ export interface CodePreviewOptions {
123
+ /** Code content */
124
+ code: string;
125
+ /** Language */
126
+ language?: string;
127
+ /** Filename */
128
+ filename?: string;
129
+ /** Show line numbers */
130
+ lineNumbers?: boolean;
131
+ /** Max height */
132
+ maxHeight?: string;
133
+ /** Copy button */
134
+ showCopy?: boolean;
135
+ /** Additional CSS classes */
136
+ className?: string;
137
+ }
138
+ /**
139
+ * Build a code preview widget
140
+ */
141
+ export declare function codePreview(options: CodePreviewOptions): string;
142
+ /**
143
+ * Image preview options
144
+ */
145
+ export interface ImagePreviewOptions {
146
+ /** Image URL */
147
+ src: string;
148
+ /** Alt text */
149
+ alt: string;
150
+ /** Caption */
151
+ caption?: string;
152
+ /** Max height */
153
+ maxHeight?: string;
154
+ /** Clickable (opens in new tab) */
155
+ clickable?: boolean;
156
+ /** Additional CSS classes */
157
+ className?: string;
158
+ }
159
+ /**
160
+ * Build an image preview widget
161
+ */
162
+ export declare function imagePreview(options: ImagePreviewOptions): string;