@frontmcp/ui 0.5.1 → 0.6.1
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.
- package/README.md +140 -362
- package/bridge/adapters/base-adapter.d.ts +104 -0
- package/bridge/adapters/base-adapter.d.ts.map +1 -0
- package/bridge/adapters/claude.adapter.d.ts +67 -0
- package/bridge/adapters/claude.adapter.d.ts.map +1 -0
- package/bridge/adapters/ext-apps.adapter.d.ts +143 -0
- package/bridge/adapters/ext-apps.adapter.d.ts.map +1 -0
- package/bridge/adapters/gemini.adapter.d.ts +64 -0
- package/bridge/adapters/gemini.adapter.d.ts.map +1 -0
- package/bridge/adapters/generic.adapter.d.ts +56 -0
- package/bridge/adapters/generic.adapter.d.ts.map +1 -0
- package/bridge/adapters/index.d.ts +26 -0
- package/bridge/adapters/index.d.ts.map +1 -0
- package/bridge/adapters/openai.adapter.d.ts +65 -0
- package/bridge/adapters/openai.adapter.d.ts.map +1 -0
- package/bridge/core/adapter-registry.d.ts +122 -0
- package/bridge/core/adapter-registry.d.ts.map +1 -0
- package/bridge/core/bridge-factory.d.ts +199 -0
- package/bridge/core/bridge-factory.d.ts.map +1 -0
- package/bridge/core/index.d.ts +10 -0
- package/bridge/core/index.d.ts.map +1 -0
- package/bridge/index.d.ts +62 -0
- package/bridge/index.d.ts.map +1 -0
- package/bridge/index.js +2540 -0
- package/bridge/runtime/iife-generator.d.ts +62 -0
- package/bridge/runtime/iife-generator.d.ts.map +1 -0
- package/bridge/runtime/index.d.ts +10 -0
- package/bridge/runtime/index.d.ts.map +1 -0
- package/bridge/types.d.ts +386 -0
- package/bridge/types.d.ts.map +1 -0
- package/bundler/bundler.d.ts +208 -0
- package/bundler/bundler.d.ts.map +1 -0
- package/bundler/cache.d.ts +173 -0
- package/bundler/cache.d.ts.map +1 -0
- package/bundler/file-cache/component-builder.d.ts +167 -0
- package/bundler/file-cache/component-builder.d.ts.map +1 -0
- package/bundler/file-cache/hash-calculator.d.ts +155 -0
- package/bundler/file-cache/hash-calculator.d.ts.map +1 -0
- package/bundler/file-cache/index.d.ts +12 -0
- package/bundler/file-cache/index.d.ts.map +1 -0
- package/bundler/file-cache/storage/filesystem.d.ts +149 -0
- package/bundler/file-cache/storage/filesystem.d.ts.map +1 -0
- package/bundler/file-cache/storage/index.d.ts +11 -0
- package/bundler/file-cache/storage/index.d.ts.map +1 -0
- package/bundler/file-cache/storage/interface.d.ts +152 -0
- package/bundler/file-cache/storage/interface.d.ts.map +1 -0
- package/bundler/file-cache/storage/redis.d.ts +139 -0
- package/bundler/file-cache/storage/redis.d.ts.map +1 -0
- package/bundler/index.d.ts +43 -0
- package/bundler/index.d.ts.map +1 -0
- package/bundler/index.js +3707 -0
- package/bundler/sandbox/enclave-adapter.d.ts +121 -0
- package/bundler/sandbox/enclave-adapter.d.ts.map +1 -0
- package/bundler/sandbox/executor.d.ts +14 -0
- package/bundler/sandbox/executor.d.ts.map +1 -0
- package/bundler/sandbox/policy.d.ts +62 -0
- package/bundler/sandbox/policy.d.ts.map +1 -0
- package/bundler/types.d.ts +702 -0
- package/bundler/types.d.ts.map +1 -0
- package/components/alert.d.ts +66 -0
- package/components/alert.d.ts.map +1 -0
- package/components/alert.schema.d.ts +98 -0
- package/components/alert.schema.d.ts.map +1 -0
- package/components/avatar.d.ts +77 -0
- package/components/avatar.d.ts.map +1 -0
- package/components/avatar.schema.d.ts +170 -0
- package/components/avatar.schema.d.ts.map +1 -0
- package/components/badge.d.ts +64 -0
- package/components/badge.d.ts.map +1 -0
- package/components/badge.schema.d.ts +91 -0
- package/components/badge.schema.d.ts.map +1 -0
- package/components/button.d.ts +100 -0
- package/components/button.d.ts.map +1 -0
- package/components/button.schema.d.ts +120 -0
- package/components/button.schema.d.ts.map +1 -0
- package/components/card.d.ts +53 -0
- package/components/card.d.ts.map +1 -0
- package/components/card.schema.d.ts +93 -0
- package/components/card.schema.d.ts.map +1 -0
- package/components/form.d.ts +212 -0
- package/components/form.d.ts.map +1 -0
- package/components/form.schema.d.ts +365 -0
- package/components/form.schema.d.ts.map +1 -0
- package/components/index.d.ts +29 -0
- package/components/index.d.ts.map +1 -0
- package/components/index.js +2525 -0
- package/components/list.d.ts +121 -0
- package/components/list.d.ts.map +1 -0
- package/components/list.schema.d.ts +129 -0
- package/components/list.schema.d.ts.map +1 -0
- package/components/modal.d.ts +100 -0
- package/components/modal.d.ts.map +1 -0
- package/components/modal.schema.d.ts +151 -0
- package/components/modal.schema.d.ts.map +1 -0
- package/components/table.d.ts +91 -0
- package/components/table.d.ts.map +1 -0
- package/components/table.schema.d.ts +123 -0
- package/components/table.schema.d.ts.map +1 -0
- package/esm/bridge/adapters/base-adapter.d.ts +104 -0
- package/esm/bridge/adapters/base-adapter.d.ts.map +1 -0
- package/esm/bridge/adapters/claude.adapter.d.ts +67 -0
- package/esm/bridge/adapters/claude.adapter.d.ts.map +1 -0
- package/esm/bridge/adapters/ext-apps.adapter.d.ts +143 -0
- package/esm/bridge/adapters/ext-apps.adapter.d.ts.map +1 -0
- package/esm/bridge/adapters/gemini.adapter.d.ts +64 -0
- package/esm/bridge/adapters/gemini.adapter.d.ts.map +1 -0
- package/esm/bridge/adapters/generic.adapter.d.ts +56 -0
- package/esm/bridge/adapters/generic.adapter.d.ts.map +1 -0
- package/esm/bridge/adapters/index.d.ts +26 -0
- package/esm/bridge/adapters/index.d.ts.map +1 -0
- package/esm/bridge/adapters/openai.adapter.d.ts +65 -0
- package/esm/bridge/adapters/openai.adapter.d.ts.map +1 -0
- package/esm/bridge/core/adapter-registry.d.ts +122 -0
- package/esm/bridge/core/adapter-registry.d.ts.map +1 -0
- package/esm/bridge/core/bridge-factory.d.ts +199 -0
- package/esm/bridge/core/bridge-factory.d.ts.map +1 -0
- package/esm/bridge/core/index.d.ts +10 -0
- package/esm/bridge/core/index.d.ts.map +1 -0
- package/esm/bridge/index.d.ts +62 -0
- package/esm/bridge/index.d.ts.map +1 -0
- package/esm/bridge/index.js +2487 -0
- package/esm/bridge/runtime/iife-generator.d.ts +62 -0
- package/esm/bridge/runtime/iife-generator.d.ts.map +1 -0
- package/esm/bridge/runtime/index.d.ts +10 -0
- package/esm/bridge/runtime/index.d.ts.map +1 -0
- package/esm/bridge/types.d.ts +386 -0
- package/esm/bridge/types.d.ts.map +1 -0
- package/esm/bundler/bundler.d.ts +208 -0
- package/esm/bundler/bundler.d.ts.map +1 -0
- package/esm/bundler/cache.d.ts +173 -0
- package/esm/bundler/cache.d.ts.map +1 -0
- package/esm/bundler/file-cache/component-builder.d.ts +167 -0
- package/esm/bundler/file-cache/component-builder.d.ts.map +1 -0
- package/esm/bundler/file-cache/hash-calculator.d.ts +155 -0
- package/esm/bundler/file-cache/hash-calculator.d.ts.map +1 -0
- package/esm/bundler/file-cache/index.d.ts +12 -0
- package/esm/bundler/file-cache/index.d.ts.map +1 -0
- package/esm/bundler/file-cache/storage/filesystem.d.ts +149 -0
- package/esm/bundler/file-cache/storage/filesystem.d.ts.map +1 -0
- package/esm/bundler/file-cache/storage/index.d.ts +11 -0
- package/esm/bundler/file-cache/storage/index.d.ts.map +1 -0
- package/esm/bundler/file-cache/storage/interface.d.ts +152 -0
- package/esm/bundler/file-cache/storage/interface.d.ts.map +1 -0
- package/esm/bundler/file-cache/storage/redis.d.ts +139 -0
- package/esm/bundler/file-cache/storage/redis.d.ts.map +1 -0
- package/esm/bundler/index.d.ts +43 -0
- package/esm/bundler/index.d.ts.map +1 -0
- package/esm/bundler/index.js +3640 -0
- package/esm/bundler/sandbox/enclave-adapter.d.ts +121 -0
- package/esm/bundler/sandbox/enclave-adapter.d.ts.map +1 -0
- package/esm/bundler/sandbox/executor.d.ts +14 -0
- package/esm/bundler/sandbox/executor.d.ts.map +1 -0
- package/esm/bundler/sandbox/policy.d.ts +62 -0
- package/esm/bundler/sandbox/policy.d.ts.map +1 -0
- package/esm/bundler/types.d.ts +702 -0
- package/esm/bundler/types.d.ts.map +1 -0
- package/esm/components/alert.d.ts +66 -0
- package/esm/components/alert.d.ts.map +1 -0
- package/esm/components/alert.schema.d.ts +98 -0
- package/esm/components/alert.schema.d.ts.map +1 -0
- package/esm/components/avatar.d.ts +77 -0
- package/esm/components/avatar.d.ts.map +1 -0
- package/esm/components/avatar.schema.d.ts +170 -0
- package/esm/components/avatar.schema.d.ts.map +1 -0
- package/esm/components/badge.d.ts +64 -0
- package/esm/components/badge.d.ts.map +1 -0
- package/esm/components/badge.schema.d.ts +91 -0
- package/esm/components/badge.schema.d.ts.map +1 -0
- package/esm/components/button.d.ts +100 -0
- package/esm/components/button.d.ts.map +1 -0
- package/esm/components/button.schema.d.ts +120 -0
- package/esm/components/button.schema.d.ts.map +1 -0
- package/esm/components/card.d.ts +53 -0
- package/esm/components/card.d.ts.map +1 -0
- package/esm/components/card.schema.d.ts +93 -0
- package/esm/components/card.schema.d.ts.map +1 -0
- package/esm/components/form.d.ts +212 -0
- package/esm/components/form.d.ts.map +1 -0
- package/esm/components/form.schema.d.ts +365 -0
- package/esm/components/form.schema.d.ts.map +1 -0
- package/esm/components/index.d.ts +29 -0
- package/esm/components/index.d.ts.map +1 -0
- package/esm/components/index.js +2396 -0
- package/esm/components/list.d.ts +121 -0
- package/esm/components/list.d.ts.map +1 -0
- package/esm/components/list.schema.d.ts +129 -0
- package/esm/components/list.schema.d.ts.map +1 -0
- package/esm/components/modal.d.ts +100 -0
- package/esm/components/modal.d.ts.map +1 -0
- package/esm/components/modal.schema.d.ts +151 -0
- package/esm/components/modal.schema.d.ts.map +1 -0
- package/esm/components/table.d.ts +91 -0
- package/esm/components/table.d.ts.map +1 -0
- package/esm/components/table.schema.d.ts +123 -0
- package/esm/components/table.schema.d.ts.map +1 -0
- package/esm/index.d.ts +40 -0
- package/esm/index.d.ts.map +1 -0
- package/esm/index.js +8326 -0
- package/esm/layouts/base.d.ts +86 -0
- package/esm/layouts/base.d.ts.map +1 -0
- package/esm/layouts/index.d.ts +8 -0
- package/esm/layouts/index.d.ts.map +1 -0
- package/esm/layouts/index.js +409 -0
- package/esm/layouts/presets.d.ts +134 -0
- package/esm/layouts/presets.d.ts.map +1 -0
- package/esm/package.json +72 -0
- package/esm/pages/consent.d.ts +117 -0
- package/esm/pages/consent.d.ts.map +1 -0
- package/esm/pages/error.d.ts +101 -0
- package/esm/pages/error.d.ts.map +1 -0
- package/esm/pages/index.d.ts +9 -0
- package/esm/pages/index.d.ts.map +1 -0
- package/esm/pages/index.js +1036 -0
- package/esm/react/Alert.d.ts +101 -0
- package/esm/react/Alert.d.ts.map +1 -0
- package/esm/react/Badge.d.ts +100 -0
- package/esm/react/Badge.d.ts.map +1 -0
- package/esm/react/Button.d.ts +108 -0
- package/esm/react/Button.d.ts.map +1 -0
- package/esm/react/Card.d.ts +103 -0
- package/esm/react/Card.d.ts.map +1 -0
- package/esm/react/hooks/context.d.ts +179 -0
- package/esm/react/hooks/context.d.ts.map +1 -0
- package/esm/react/hooks/index.d.ts +42 -0
- package/esm/react/hooks/index.d.ts.map +1 -0
- package/esm/react/hooks/tools.d.ts +284 -0
- package/esm/react/hooks/tools.d.ts.map +1 -0
- package/esm/react/index.d.ts +80 -0
- package/esm/react/index.d.ts.map +1 -0
- package/esm/react/index.js +3124 -0
- package/esm/react/types.d.ts +105 -0
- package/esm/react/types.d.ts.map +1 -0
- package/esm/react/utils.d.ts +43 -0
- package/esm/react/utils.d.ts.map +1 -0
- package/esm/render/index.d.ts +8 -0
- package/esm/render/index.d.ts.map +1 -0
- package/esm/render/index.js +45 -0
- package/esm/render/prerender.d.ts +57 -0
- package/esm/render/prerender.d.ts.map +1 -0
- package/esm/renderers/index.d.ts +21 -0
- package/esm/renderers/index.d.ts.map +1 -0
- package/esm/renderers/index.js +381 -0
- package/esm/renderers/react.adapter.d.ts +70 -0
- package/esm/renderers/react.adapter.d.ts.map +1 -0
- package/esm/renderers/react.renderer.d.ts +96 -0
- package/esm/renderers/react.renderer.d.ts.map +1 -0
- package/esm/universal/UniversalApp.d.ts +108 -0
- package/esm/universal/UniversalApp.d.ts.map +1 -0
- package/esm/universal/cached-runtime.d.ts +115 -0
- package/esm/universal/cached-runtime.d.ts.map +1 -0
- package/esm/universal/context.d.ts +122 -0
- package/esm/universal/context.d.ts.map +1 -0
- package/esm/universal/index.d.ts +57 -0
- package/esm/universal/index.d.ts.map +1 -0
- package/esm/universal/index.js +1755 -0
- package/esm/universal/renderers/html.renderer.d.ts +37 -0
- package/esm/universal/renderers/html.renderer.d.ts.map +1 -0
- package/esm/universal/renderers/index.d.ts +112 -0
- package/esm/universal/renderers/index.d.ts.map +1 -0
- package/esm/universal/renderers/markdown.renderer.d.ts +33 -0
- package/esm/universal/renderers/markdown.renderer.d.ts.map +1 -0
- package/esm/universal/renderers/mdx.renderer.d.ts +38 -0
- package/esm/universal/renderers/mdx.renderer.d.ts.map +1 -0
- package/esm/universal/renderers/react.renderer.d.ts +46 -0
- package/esm/universal/renderers/react.renderer.d.ts.map +1 -0
- package/esm/universal/runtime-builder.d.ts +33 -0
- package/esm/universal/runtime-builder.d.ts.map +1 -0
- package/esm/universal/store.d.ts +135 -0
- package/esm/universal/store.d.ts.map +1 -0
- package/esm/universal/types.d.ts +199 -0
- package/esm/universal/types.d.ts.map +1 -0
- package/esm/web-components/core/attribute-parser.d.ts +82 -0
- package/esm/web-components/core/attribute-parser.d.ts.map +1 -0
- package/esm/web-components/core/base-element.d.ts +197 -0
- package/esm/web-components/core/base-element.d.ts.map +1 -0
- package/esm/web-components/core/index.d.ts +9 -0
- package/esm/web-components/core/index.d.ts.map +1 -0
- package/esm/web-components/elements/fmcp-alert.d.ts +46 -0
- package/esm/web-components/elements/fmcp-alert.d.ts.map +1 -0
- package/esm/web-components/elements/fmcp-badge.d.ts +47 -0
- package/esm/web-components/elements/fmcp-badge.d.ts.map +1 -0
- package/esm/web-components/elements/fmcp-button.d.ts +117 -0
- package/esm/web-components/elements/fmcp-button.d.ts.map +1 -0
- package/esm/web-components/elements/fmcp-card.d.ts +53 -0
- package/esm/web-components/elements/fmcp-card.d.ts.map +1 -0
- package/esm/web-components/elements/fmcp-input.d.ts +96 -0
- package/esm/web-components/elements/fmcp-input.d.ts.map +1 -0
- package/esm/web-components/elements/fmcp-select.d.ts +100 -0
- package/esm/web-components/elements/fmcp-select.d.ts.map +1 -0
- package/esm/web-components/elements/index.d.ts +13 -0
- package/esm/web-components/elements/index.d.ts.map +1 -0
- package/esm/web-components/index.d.ts +50 -0
- package/esm/web-components/index.d.ts.map +1 -0
- package/esm/web-components/index.js +1993 -0
- package/esm/web-components/register.d.ts +57 -0
- package/esm/web-components/register.d.ts.map +1 -0
- package/esm/web-components/types.d.ts +122 -0
- package/esm/web-components/types.d.ts.map +1 -0
- package/esm/widgets/index.d.ts +8 -0
- package/esm/widgets/index.d.ts.map +1 -0
- package/esm/widgets/index.js +883 -0
- package/esm/widgets/progress.d.ts +133 -0
- package/esm/widgets/progress.d.ts.map +1 -0
- package/esm/widgets/resource.d.ts +163 -0
- package/esm/widgets/resource.d.ts.map +1 -0
- package/index.d.ts +40 -0
- package/index.d.ts.map +1 -0
- package/index.js +8526 -0
- package/layouts/base.d.ts +86 -0
- package/layouts/base.d.ts.map +1 -0
- package/layouts/index.d.ts +8 -0
- package/layouts/index.d.ts.map +1 -0
- package/layouts/index.js +437 -0
- package/layouts/presets.d.ts +134 -0
- package/layouts/presets.d.ts.map +1 -0
- package/package.json +33 -110
- package/pages/consent.d.ts +117 -0
- package/pages/consent.d.ts.map +1 -0
- package/pages/error.d.ts +101 -0
- package/pages/error.d.ts.map +1 -0
- package/pages/index.d.ts +9 -0
- package/pages/index.d.ts.map +1 -0
- package/pages/index.js +1065 -0
- package/react/Alert.d.ts +101 -0
- package/react/Alert.d.ts.map +1 -0
- package/react/Badge.d.ts +100 -0
- package/react/Badge.d.ts.map +1 -0
- package/react/Button.d.ts +108 -0
- package/react/Button.d.ts.map +1 -0
- package/react/Card.d.ts +103 -0
- package/react/Card.d.ts.map +1 -0
- package/react/hooks/context.d.ts +179 -0
- package/react/hooks/context.d.ts.map +1 -0
- package/react/hooks/index.d.ts +42 -0
- package/react/hooks/index.d.ts.map +1 -0
- package/react/hooks/tools.d.ts +284 -0
- package/react/hooks/tools.d.ts.map +1 -0
- package/react/index.d.ts +80 -0
- package/react/index.d.ts.map +1 -0
- package/react/index.js +3160 -0
- package/react/types.d.ts +105 -0
- package/react/types.d.ts.map +1 -0
- package/react/utils.d.ts +43 -0
- package/react/utils.d.ts.map +1 -0
- package/render/index.d.ts +8 -0
- package/render/index.d.ts.map +1 -0
- package/render/index.js +77 -0
- package/render/prerender.d.ts +57 -0
- package/render/prerender.d.ts.map +1 -0
- package/renderers/index.d.ts +21 -0
- package/renderers/index.d.ts.map +1 -0
- package/renderers/index.js +416 -0
- package/renderers/react.adapter.d.ts +70 -0
- package/renderers/react.adapter.d.ts.map +1 -0
- package/renderers/react.renderer.d.ts +96 -0
- package/renderers/react.renderer.d.ts.map +1 -0
- package/universal/UniversalApp.d.ts +108 -0
- package/universal/UniversalApp.d.ts.map +1 -0
- package/universal/cached-runtime.d.ts +115 -0
- package/universal/cached-runtime.d.ts.map +1 -0
- package/universal/context.d.ts +122 -0
- package/universal/context.d.ts.map +1 -0
- package/universal/index.d.ts +57 -0
- package/universal/index.d.ts.map +1 -0
- package/universal/index.js +1841 -0
- package/universal/renderers/html.renderer.d.ts +37 -0
- package/universal/renderers/html.renderer.d.ts.map +1 -0
- package/universal/renderers/index.d.ts +112 -0
- package/universal/renderers/index.d.ts.map +1 -0
- package/universal/renderers/markdown.renderer.d.ts +33 -0
- package/universal/renderers/markdown.renderer.d.ts.map +1 -0
- package/universal/renderers/mdx.renderer.d.ts +38 -0
- package/universal/renderers/mdx.renderer.d.ts.map +1 -0
- package/universal/renderers/react.renderer.d.ts +46 -0
- package/universal/renderers/react.renderer.d.ts.map +1 -0
- package/universal/runtime-builder.d.ts +33 -0
- package/universal/runtime-builder.d.ts.map +1 -0
- package/universal/store.d.ts +135 -0
- package/universal/store.d.ts.map +1 -0
- package/universal/types.d.ts +199 -0
- package/universal/types.d.ts.map +1 -0
- package/web-components/core/attribute-parser.d.ts +82 -0
- package/web-components/core/attribute-parser.d.ts.map +1 -0
- package/web-components/core/base-element.d.ts +197 -0
- package/web-components/core/base-element.d.ts.map +1 -0
- package/web-components/core/index.d.ts +9 -0
- package/web-components/core/index.d.ts.map +1 -0
- package/web-components/elements/fmcp-alert.d.ts +46 -0
- package/web-components/elements/fmcp-alert.d.ts.map +1 -0
- package/web-components/elements/fmcp-badge.d.ts +47 -0
- package/web-components/elements/fmcp-badge.d.ts.map +1 -0
- package/web-components/elements/fmcp-button.d.ts +117 -0
- package/web-components/elements/fmcp-button.d.ts.map +1 -0
- package/web-components/elements/fmcp-card.d.ts +53 -0
- package/web-components/elements/fmcp-card.d.ts.map +1 -0
- package/web-components/elements/fmcp-input.d.ts +96 -0
- package/web-components/elements/fmcp-input.d.ts.map +1 -0
- package/web-components/elements/fmcp-select.d.ts +100 -0
- package/web-components/elements/fmcp-select.d.ts.map +1 -0
- package/web-components/elements/index.d.ts +13 -0
- package/web-components/elements/index.d.ts.map +1 -0
- package/web-components/index.d.ts +50 -0
- package/web-components/index.d.ts.map +1 -0
- package/web-components/index.js +2028 -0
- package/web-components/register.d.ts +57 -0
- package/web-components/register.d.ts.map +1 -0
- package/web-components/types.d.ts +122 -0
- package/web-components/types.d.ts.map +1 -0
- package/widgets/index.d.ts +8 -0
- package/widgets/index.d.ts.map +1 -0
- package/widgets/index.js +910 -0
- package/widgets/progress.d.ts +133 -0
- package/widgets/progress.d.ts.map +1 -0
- package/widgets/resource.d.ts +163 -0
- package/widgets/resource.d.ts.map +1 -0
- package/src/adapters/index.d.ts +0 -10
- package/src/adapters/index.js +0 -18
- package/src/adapters/index.js.map +0 -1
- package/src/adapters/platform-meta.d.ts +0 -165
- package/src/adapters/platform-meta.js +0 -310
- package/src/adapters/platform-meta.js.map +0 -1
- package/src/base-template/bridge.d.ts +0 -89
- package/src/base-template/bridge.js +0 -452
- package/src/base-template/bridge.js.map +0 -1
- package/src/base-template/default-base-template.d.ts +0 -91
- package/src/base-template/default-base-template.js +0 -435
- package/src/base-template/default-base-template.js.map +0 -1
- package/src/base-template/index.d.ts +0 -14
- package/src/base-template/index.js +0 -30
- package/src/base-template/index.js.map +0 -1
- package/src/base-template/polyfills.d.ts +0 -30
- package/src/base-template/polyfills.js +0 -190
- package/src/base-template/polyfills.js.map +0 -1
- package/src/base-template/theme-styles.d.ts +0 -73
- package/src/base-template/theme-styles.js +0 -95
- package/src/base-template/theme-styles.js.map +0 -1
- package/src/bridge/adapters/base-adapter.d.ts +0 -103
- package/src/bridge/adapters/base-adapter.js +0 -314
- package/src/bridge/adapters/base-adapter.js.map +0 -1
- package/src/bridge/adapters/claude.adapter.d.ts +0 -66
- package/src/bridge/adapters/claude.adapter.js +0 -145
- package/src/bridge/adapters/claude.adapter.js.map +0 -1
- package/src/bridge/adapters/ext-apps.adapter.d.ts +0 -142
- package/src/bridge/adapters/ext-apps.adapter.js +0 -416
- package/src/bridge/adapters/ext-apps.adapter.js.map +0 -1
- package/src/bridge/adapters/gemini.adapter.d.ts +0 -63
- package/src/bridge/adapters/gemini.adapter.js +0 -160
- package/src/bridge/adapters/gemini.adapter.js.map +0 -1
- package/src/bridge/adapters/generic.adapter.d.ts +0 -55
- package/src/bridge/adapters/generic.adapter.js +0 -108
- package/src/bridge/adapters/generic.adapter.js.map +0 -1
- package/src/bridge/adapters/index.d.ts +0 -25
- package/src/bridge/adapters/index.js +0 -65
- package/src/bridge/adapters/index.js.map +0 -1
- package/src/bridge/adapters/openai.adapter.d.ts +0 -64
- package/src/bridge/adapters/openai.adapter.js +0 -194
- package/src/bridge/adapters/openai.adapter.js.map +0 -1
- package/src/bridge/core/adapter-registry.d.ts +0 -121
- package/src/bridge/core/adapter-registry.js +0 -271
- package/src/bridge/core/adapter-registry.js.map +0 -1
- package/src/bridge/core/bridge-factory.d.ts +0 -198
- package/src/bridge/core/bridge-factory.js +0 -428
- package/src/bridge/core/bridge-factory.js.map +0 -1
- package/src/bridge/core/index.d.ts +0 -9
- package/src/bridge/core/index.js +0 -22
- package/src/bridge/core/index.js.map +0 -1
- package/src/bridge/index.d.ts +0 -61
- package/src/bridge/index.js +0 -94
- package/src/bridge/index.js.map +0 -1
- package/src/bridge/runtime/iife-generator.d.ts +0 -61
- package/src/bridge/runtime/iife-generator.js +0 -940
- package/src/bridge/runtime/iife-generator.js.map +0 -1
- package/src/bridge/runtime/index.d.ts +0 -8
- package/src/bridge/runtime/index.js +0 -16
- package/src/bridge/runtime/index.js.map +0 -1
- package/src/bridge/types.d.ts +0 -385
- package/src/bridge/types.js +0 -11
- package/src/bridge/types.js.map +0 -1
- package/src/build/cdn-resources.d.ts +0 -140
- package/src/build/cdn-resources.js +0 -314
- package/src/build/cdn-resources.js.map +0 -1
- package/src/build/index.d.ts +0 -294
- package/src/build/index.js +0 -325
- package/src/build/index.js.map +0 -1
- package/src/build/widget-manifest.d.ts +0 -212
- package/src/build/widget-manifest.js +0 -652
- package/src/build/widget-manifest.js.map +0 -1
- package/src/bundler/bundler.d.ts +0 -110
- package/src/bundler/bundler.js +0 -432
- package/src/bundler/bundler.js.map +0 -1
- package/src/bundler/cache.d.ts +0 -172
- package/src/bundler/cache.js +0 -250
- package/src/bundler/cache.js.map +0 -1
- package/src/bundler/index.d.ts +0 -41
- package/src/bundler/index.js +0 -73
- package/src/bundler/index.js.map +0 -1
- package/src/bundler/sandbox/enclave-adapter.d.ts +0 -120
- package/src/bundler/sandbox/enclave-adapter.js +0 -339
- package/src/bundler/sandbox/enclave-adapter.js.map +0 -1
- package/src/bundler/sandbox/executor.d.ts +0 -13
- package/src/bundler/sandbox/executor.js +0 -22
- package/src/bundler/sandbox/executor.js.map +0 -1
- package/src/bundler/sandbox/policy.d.ts +0 -61
- package/src/bundler/sandbox/policy.js +0 -238
- package/src/bundler/sandbox/policy.js.map +0 -1
- package/src/bundler/types.d.ts +0 -347
- package/src/bundler/types.js +0 -132
- package/src/bundler/types.js.map +0 -1
- package/src/components/alert.d.ts +0 -71
- package/src/components/alert.js +0 -189
- package/src/components/alert.js.map +0 -1
- package/src/components/alert.schema.d.ts +0 -114
- package/src/components/alert.schema.js +0 -105
- package/src/components/alert.schema.js.map +0 -1
- package/src/components/avatar.d.ts +0 -76
- package/src/components/avatar.js +0 -176
- package/src/components/avatar.js.map +0 -1
- package/src/components/avatar.schema.d.ts +0 -169
- package/src/components/avatar.schema.js +0 -103
- package/src/components/avatar.schema.js.map +0 -1
- package/src/components/badge.d.ts +0 -70
- package/src/components/badge.js +0 -149
- package/src/components/badge.js.map +0 -1
- package/src/components/badge.schema.d.ts +0 -109
- package/src/components/badge.schema.js +0 -96
- package/src/components/badge.schema.js.map +0 -1
- package/src/components/button.d.ts +0 -111
- package/src/components/button.js +0 -336
- package/src/components/button.js.map +0 -1
- package/src/components/button.schema.d.ts +0 -148
- package/src/components/button.schema.js +0 -121
- package/src/components/button.schema.js.map +0 -1
- package/src/components/card.d.ts +0 -60
- package/src/components/card.js +0 -117
- package/src/components/card.js.map +0 -1
- package/src/components/card.schema.d.ts +0 -113
- package/src/components/card.schema.js +0 -98
- package/src/components/card.schema.js.map +0 -1
- package/src/components/form.d.ts +0 -239
- package/src/components/form.js +0 -420
- package/src/components/form.js.map +0 -1
- package/src/components/form.schema.d.ts +0 -441
- package/src/components/form.schema.js +0 -406
- package/src/components/form.schema.js.map +0 -1
- package/src/components/index.d.ts +0 -29
- package/src/components/index.js +0 -98
- package/src/components/index.js.map +0 -1
- package/src/components/list.d.ts +0 -127
- package/src/components/list.js +0 -279
- package/src/components/list.js.map +0 -1
- package/src/components/list.schema.d.ts +0 -134
- package/src/components/list.schema.js +0 -168
- package/src/components/list.schema.js.map +0 -1
- package/src/components/modal.d.ts +0 -111
- package/src/components/modal.js +0 -260
- package/src/components/modal.js.map +0 -1
- package/src/components/modal.schema.d.ts +0 -186
- package/src/components/modal.schema.js +0 -167
- package/src/components/modal.schema.js.map +0 -1
- package/src/components/table.d.ts +0 -105
- package/src/components/table.js +0 -283
- package/src/components/table.js.map +0 -1
- package/src/components/table.schema.d.ts +0 -159
- package/src/components/table.schema.js +0 -173
- package/src/components/table.schema.js.map +0 -1
- package/src/handlebars/helpers.d.ts +0 -348
- package/src/handlebars/helpers.js +0 -605
- package/src/handlebars/helpers.js.map +0 -1
- package/src/handlebars/index.d.ts +0 -193
- package/src/handlebars/index.js +0 -350
- package/src/handlebars/index.js.map +0 -1
- package/src/index.d.ts +0 -50
- package/src/index.js +0 -192
- package/src/index.js.map +0 -1
- package/src/layouts/base.d.ts +0 -88
- package/src/layouts/base.js +0 -227
- package/src/layouts/base.js.map +0 -1
- package/src/layouts/index.d.ts +0 -7
- package/src/layouts/index.js +0 -25
- package/src/layouts/index.js.map +0 -1
- package/src/layouts/presets.d.ts +0 -133
- package/src/layouts/presets.js +0 -277
- package/src/layouts/presets.js.map +0 -1
- package/src/pages/consent.d.ts +0 -116
- package/src/pages/consent.js +0 -218
- package/src/pages/consent.js.map +0 -1
- package/src/pages/error.d.ts +0 -100
- package/src/pages/error.js +0 -263
- package/src/pages/error.js.map +0 -1
- package/src/pages/index.d.ts +0 -8
- package/src/pages/index.js +0 -27
- package/src/pages/index.js.map +0 -1
- package/src/react/Alert.d.ts +0 -101
- package/src/react/Alert.js +0 -51
- package/src/react/Alert.js.map +0 -1
- package/src/react/Badge.d.ts +0 -100
- package/src/react/Badge.js +0 -55
- package/src/react/Badge.js.map +0 -1
- package/src/react/Button.d.ts +0 -108
- package/src/react/Button.js +0 -52
- package/src/react/Button.js.map +0 -1
- package/src/react/Card.d.ts +0 -103
- package/src/react/Card.js +0 -55
- package/src/react/Card.js.map +0 -1
- package/src/react/hooks/context.d.ts +0 -178
- package/src/react/hooks/context.js +0 -287
- package/src/react/hooks/context.js.map +0 -1
- package/src/react/hooks/index.d.ts +0 -41
- package/src/react/hooks/index.js +0 -61
- package/src/react/hooks/index.js.map +0 -1
- package/src/react/hooks/tools.d.ts +0 -283
- package/src/react/hooks/tools.js +0 -465
- package/src/react/hooks/tools.js.map +0 -1
- package/src/react/index.d.ts +0 -80
- package/src/react/index.js +0 -113
- package/src/react/index.js.map +0 -1
- package/src/react/types.d.ts +0 -105
- package/src/react/types.js +0 -12
- package/src/react/types.js.map +0 -1
- package/src/react/utils.d.ts +0 -42
- package/src/react/utils.js +0 -99
- package/src/react/utils.js.map +0 -1
- package/src/registry/index.d.ts +0 -45
- package/src/registry/index.js +0 -67
- package/src/registry/index.js.map +0 -1
- package/src/registry/render-template.d.ts +0 -86
- package/src/registry/render-template.js +0 -239
- package/src/registry/render-template.js.map +0 -1
- package/src/registry/tool-ui.registry.d.ts +0 -260
- package/src/registry/tool-ui.registry.js +0 -438
- package/src/registry/tool-ui.registry.js.map +0 -1
- package/src/registry/uri-utils.d.ts +0 -55
- package/src/registry/uri-utils.js +0 -97
- package/src/registry/uri-utils.js.map +0 -1
- package/src/render/index.d.ts +0 -7
- package/src/render/index.js +0 -14
- package/src/render/index.js.map +0 -1
- package/src/render/prerender.d.ts +0 -56
- package/src/render/prerender.js +0 -98
- package/src/render/prerender.js.map +0 -1
- package/src/renderers/cache.d.ts +0 -144
- package/src/renderers/cache.js +0 -240
- package/src/renderers/cache.js.map +0 -1
- package/src/renderers/html.renderer.d.ts +0 -122
- package/src/renderers/html.renderer.js +0 -204
- package/src/renderers/html.renderer.js.map +0 -1
- package/src/renderers/index.d.ts +0 -35
- package/src/renderers/index.js +0 -70
- package/src/renderers/index.js.map +0 -1
- package/src/renderers/mdx.renderer.d.ts +0 -119
- package/src/renderers/mdx.renderer.js +0 -305
- package/src/renderers/mdx.renderer.js.map +0 -1
- package/src/renderers/react.renderer.d.ts +0 -95
- package/src/renderers/react.renderer.js +0 -260
- package/src/renderers/react.renderer.js.map +0 -1
- package/src/renderers/registry.d.ts +0 -133
- package/src/renderers/registry.js +0 -232
- package/src/renderers/registry.js.map +0 -1
- package/src/renderers/types.d.ts +0 -341
- package/src/renderers/types.js +0 -9
- package/src/renderers/types.js.map +0 -1
- package/src/renderers/utils/detect.d.ts +0 -106
- package/src/renderers/utils/detect.js +0 -267
- package/src/renderers/utils/detect.js.map +0 -1
- package/src/renderers/utils/hash.d.ts +0 -39
- package/src/renderers/utils/hash.js +0 -75
- package/src/renderers/utils/hash.js.map +0 -1
- package/src/renderers/utils/index.d.ts +0 -8
- package/src/renderers/utils/index.js +0 -28
- package/src/renderers/utils/index.js.map +0 -1
- package/src/renderers/utils/transpiler.d.ts +0 -88
- package/src/renderers/utils/transpiler.js +0 -215
- package/src/renderers/utils/transpiler.js.map +0 -1
- package/src/runtime/adapters/html.adapter.d.ts +0 -58
- package/src/runtime/adapters/html.adapter.js +0 -131
- package/src/runtime/adapters/html.adapter.js.map +0 -1
- package/src/runtime/adapters/index.d.ts +0 -25
- package/src/runtime/adapters/index.js +0 -54
- package/src/runtime/adapters/index.js.map +0 -1
- package/src/runtime/adapters/mdx.adapter.d.ts +0 -72
- package/src/runtime/adapters/mdx.adapter.js +0 -241
- package/src/runtime/adapters/mdx.adapter.js.map +0 -1
- package/src/runtime/adapters/react.adapter.d.ts +0 -69
- package/src/runtime/adapters/react.adapter.js +0 -245
- package/src/runtime/adapters/react.adapter.js.map +0 -1
- package/src/runtime/adapters/types.d.ts +0 -94
- package/src/runtime/adapters/types.js +0 -11
- package/src/runtime/adapters/types.js.map +0 -1
- package/src/runtime/csp.d.ts +0 -37
- package/src/runtime/csp.js +0 -140
- package/src/runtime/csp.js.map +0 -1
- package/src/runtime/index.d.ts +0 -16
- package/src/runtime/index.js +0 -72
- package/src/runtime/index.js.map +0 -1
- package/src/runtime/mcp-bridge.d.ts +0 -100
- package/src/runtime/mcp-bridge.js +0 -581
- package/src/runtime/mcp-bridge.js.map +0 -1
- package/src/runtime/renderer-runtime.d.ts +0 -132
- package/src/runtime/renderer-runtime.js +0 -389
- package/src/runtime/renderer-runtime.js.map +0 -1
- package/src/runtime/sanitizer.d.ts +0 -171
- package/src/runtime/sanitizer.js +0 -318
- package/src/runtime/sanitizer.js.map +0 -1
- package/src/runtime/types.d.ts +0 -414
- package/src/runtime/types.js +0 -12
- package/src/runtime/types.js.map +0 -1
- package/src/runtime/wrapper.d.ts +0 -375
- package/src/runtime/wrapper.js +0 -1793
- package/src/runtime/wrapper.js.map +0 -1
- package/src/styles/index.d.ts +0 -7
- package/src/styles/index.js +0 -11
- package/src/styles/index.js.map +0 -1
- package/src/styles/variants.d.ts +0 -50
- package/src/styles/variants.js +0 -175
- package/src/styles/variants.js.map +0 -1
- package/src/theme/cdn.d.ts +0 -194
- package/src/theme/cdn.js +0 -375
- package/src/theme/cdn.js.map +0 -1
- package/src/theme/index.d.ts +0 -17
- package/src/theme/index.js +0 -57
- package/src/theme/index.js.map +0 -1
- package/src/theme/platforms.d.ts +0 -106
- package/src/theme/platforms.js +0 -161
- package/src/theme/platforms.js.map +0 -1
- package/src/theme/presets/github-openai.d.ts +0 -49
- package/src/theme/presets/github-openai.js +0 -189
- package/src/theme/presets/github-openai.js.map +0 -1
- package/src/theme/presets/index.d.ts +0 -10
- package/src/theme/presets/index.js +0 -17
- package/src/theme/presets/index.js.map +0 -1
- package/src/theme/theme.d.ts +0 -395
- package/src/theme/theme.js +0 -332
- package/src/theme/theme.js.map +0 -1
- package/src/tool-template/builder.d.ts +0 -212
- package/src/tool-template/builder.js +0 -397
- package/src/tool-template/builder.js.map +0 -1
- package/src/tool-template/index.d.ts +0 -15
- package/src/tool-template/index.js +0 -38
- package/src/tool-template/index.js.map +0 -1
- package/src/types/index.d.ts +0 -13
- package/src/types/index.js +0 -26
- package/src/types/index.js.map +0 -1
- package/src/types/ui-config.d.ts +0 -357
- package/src/types/ui-config.js +0 -12
- package/src/types/ui-config.js.map +0 -1
- package/src/types/ui-runtime.d.ts +0 -965
- package/src/types/ui-runtime.js +0 -117
- package/src/types/ui-runtime.js.map +0 -1
- package/src/validation/error-box.d.ts +0 -55
- package/src/validation/error-box.js +0 -75
- package/src/validation/error-box.js.map +0 -1
- package/src/validation/index.d.ts +0 -12
- package/src/validation/index.js +0 -21
- package/src/validation/index.js.map +0 -1
- package/src/validation/wrapper.d.ts +0 -96
- package/src/validation/wrapper.js +0 -117
- package/src/validation/wrapper.js.map +0 -1
- package/src/web-components/core/attribute-parser.d.ts +0 -85
- package/src/web-components/core/attribute-parser.js +0 -189
- package/src/web-components/core/attribute-parser.js.map +0 -1
- package/src/web-components/core/base-element.d.ts +0 -197
- package/src/web-components/core/base-element.js +0 -289
- package/src/web-components/core/base-element.js.map +0 -1
- package/src/web-components/core/index.d.ts +0 -8
- package/src/web-components/core/index.js +0 -18
- package/src/web-components/core/index.js.map +0 -1
- package/src/web-components/elements/fmcp-alert.d.ts +0 -45
- package/src/web-components/elements/fmcp-alert.js +0 -93
- package/src/web-components/elements/fmcp-alert.js.map +0 -1
- package/src/web-components/elements/fmcp-badge.d.ts +0 -46
- package/src/web-components/elements/fmcp-badge.js +0 -99
- package/src/web-components/elements/fmcp-badge.js.map +0 -1
- package/src/web-components/elements/fmcp-button.d.ts +0 -124
- package/src/web-components/elements/fmcp-button.js +0 -233
- package/src/web-components/elements/fmcp-button.js.map +0 -1
- package/src/web-components/elements/fmcp-card.d.ts +0 -52
- package/src/web-components/elements/fmcp-card.js +0 -115
- package/src/web-components/elements/fmcp-card.js.map +0 -1
- package/src/web-components/elements/fmcp-input.d.ts +0 -95
- package/src/web-components/elements/fmcp-input.js +0 -248
- package/src/web-components/elements/fmcp-input.js.map +0 -1
- package/src/web-components/elements/fmcp-select.d.ts +0 -99
- package/src/web-components/elements/fmcp-select.js +0 -243
- package/src/web-components/elements/fmcp-select.js.map +0 -1
- package/src/web-components/elements/index.d.ts +0 -12
- package/src/web-components/elements/index.js +0 -34
- package/src/web-components/elements/index.js.map +0 -1
- package/src/web-components/index.d.ts +0 -49
- package/src/web-components/index.js +0 -75
- package/src/web-components/index.js.map +0 -1
- package/src/web-components/register.d.ts +0 -56
- package/src/web-components/register.js +0 -80
- package/src/web-components/register.js.map +0 -1
- package/src/web-components/types.d.ts +0 -121
- package/src/web-components/types.js +0 -25
- package/src/web-components/types.js.map +0 -1
- package/src/widgets/index.d.ts +0 -7
- package/src/widgets/index.js +0 -24
- package/src/widgets/index.js.map +0 -1
- package/src/widgets/progress.d.ts +0 -132
- package/src/widgets/progress.js +0 -303
- package/src/widgets/progress.js.map +0 -1
- package/src/widgets/resource.d.ts +0 -162
- package/src/widgets/resource.js +0 -340
- package/src/widgets/resource.js.map +0 -1
|
@@ -0,0 +1,883 @@
|
|
|
1
|
+
// libs/ui/src/layouts/base.ts
|
|
2
|
+
import {
|
|
3
|
+
OPENAI_PLATFORM,
|
|
4
|
+
canUseCdn,
|
|
5
|
+
needsInlineScripts,
|
|
6
|
+
DEFAULT_THEME,
|
|
7
|
+
buildThemeCss,
|
|
8
|
+
mergeThemes,
|
|
9
|
+
buildFontPreconnect,
|
|
10
|
+
buildFontStylesheets,
|
|
11
|
+
buildCdnScripts
|
|
12
|
+
} from "@frontmcp/uipack/theme";
|
|
13
|
+
import { escapeHtml } from "@frontmcp/uipack/utils";
|
|
14
|
+
import { escapeHtml as escapeHtml2 } from "@frontmcp/uipack/utils";
|
|
15
|
+
|
|
16
|
+
// libs/ui/src/components/card.ts
|
|
17
|
+
function getVariantClasses(variant) {
|
|
18
|
+
const variants = {
|
|
19
|
+
default: "bg-white border border-border rounded-xl shadow-sm",
|
|
20
|
+
outlined: "bg-transparent border-2 border-border rounded-xl",
|
|
21
|
+
elevated: "bg-white rounded-xl shadow-lg",
|
|
22
|
+
filled: "bg-gray-50 rounded-xl",
|
|
23
|
+
ghost: "bg-transparent"
|
|
24
|
+
};
|
|
25
|
+
return variants[variant];
|
|
26
|
+
}
|
|
27
|
+
function getSizeClasses(size) {
|
|
28
|
+
const sizes = {
|
|
29
|
+
sm: "p-4",
|
|
30
|
+
md: "p-6",
|
|
31
|
+
lg: "p-8"
|
|
32
|
+
};
|
|
33
|
+
return sizes[size];
|
|
34
|
+
}
|
|
35
|
+
function buildDataAttrs(data) {
|
|
36
|
+
if (!data) return "";
|
|
37
|
+
return Object.entries(data).map(([key, value]) => `data-${key}="${escapeHtml2(value)}"`).join(" ");
|
|
38
|
+
}
|
|
39
|
+
function card(content, options = {}) {
|
|
40
|
+
const {
|
|
41
|
+
variant = "default",
|
|
42
|
+
size = "md",
|
|
43
|
+
title,
|
|
44
|
+
subtitle,
|
|
45
|
+
headerActions,
|
|
46
|
+
footer,
|
|
47
|
+
className = "",
|
|
48
|
+
id,
|
|
49
|
+
data,
|
|
50
|
+
clickable = false,
|
|
51
|
+
href
|
|
52
|
+
} = options;
|
|
53
|
+
const variantClasses = getVariantClasses(variant);
|
|
54
|
+
const sizeClasses = getSizeClasses(size);
|
|
55
|
+
const clickableClasses = clickable ? "cursor-pointer hover:shadow-md transition-shadow" : "";
|
|
56
|
+
const allClasses = [variantClasses, sizeClasses, clickableClasses, className].filter(Boolean).join(" ");
|
|
57
|
+
const dataAttrs = buildDataAttrs(data);
|
|
58
|
+
const idAttr = id ? `id="${escapeHtml2(id)}"` : "";
|
|
59
|
+
const hasHeader = title || subtitle || headerActions;
|
|
60
|
+
const headerHtml = hasHeader ? `<div class="flex items-start justify-between mb-4">
|
|
61
|
+
<div>
|
|
62
|
+
${title ? `<h3 class="text-lg font-semibold text-text-primary">${escapeHtml2(title)}</h3>` : ""}
|
|
63
|
+
${subtitle ? `<p class="text-sm text-text-secondary mt-1">${escapeHtml2(subtitle)}</p>` : ""}
|
|
64
|
+
</div>
|
|
65
|
+
${headerActions ? `<div class="flex items-center gap-2">${headerActions}</div>` : ""}
|
|
66
|
+
</div>` : "";
|
|
67
|
+
const footerHtml = footer ? `<div class="mt-4 pt-4 border-t border-divider">${footer}</div>` : "";
|
|
68
|
+
if (href) {
|
|
69
|
+
return `<a href="${escapeHtml2(href)}" class="${allClasses}" ${idAttr} ${dataAttrs}>
|
|
70
|
+
${headerHtml}
|
|
71
|
+
${content}
|
|
72
|
+
${footerHtml}
|
|
73
|
+
</a>`;
|
|
74
|
+
}
|
|
75
|
+
return `<div class="${allClasses}" ${idAttr} ${dataAttrs}>
|
|
76
|
+
${headerHtml}
|
|
77
|
+
${content}
|
|
78
|
+
${footerHtml}
|
|
79
|
+
</div>`;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
// libs/ui/src/components/badge.ts
|
|
83
|
+
function getVariantClasses2(variant) {
|
|
84
|
+
const variants = {
|
|
85
|
+
default: "bg-gray-100 text-gray-800",
|
|
86
|
+
primary: "bg-primary/10 text-primary",
|
|
87
|
+
secondary: "bg-secondary/10 text-secondary",
|
|
88
|
+
success: "bg-success/10 text-success",
|
|
89
|
+
warning: "bg-warning/10 text-warning",
|
|
90
|
+
danger: "bg-danger/10 text-danger",
|
|
91
|
+
info: "bg-blue-100 text-blue-800",
|
|
92
|
+
outline: "border border-border text-text-primary bg-transparent"
|
|
93
|
+
};
|
|
94
|
+
return variants[variant];
|
|
95
|
+
}
|
|
96
|
+
function getSizeClasses2(size, dot) {
|
|
97
|
+
if (dot) {
|
|
98
|
+
const dotSizes = {
|
|
99
|
+
sm: "w-2 h-2",
|
|
100
|
+
md: "w-2.5 h-2.5",
|
|
101
|
+
lg: "w-3 h-3"
|
|
102
|
+
};
|
|
103
|
+
return dotSizes[size];
|
|
104
|
+
}
|
|
105
|
+
const sizes = {
|
|
106
|
+
sm: "px-2 py-0.5 text-xs",
|
|
107
|
+
md: "px-2.5 py-1 text-xs",
|
|
108
|
+
lg: "px-3 py-1.5 text-sm"
|
|
109
|
+
};
|
|
110
|
+
return sizes[size];
|
|
111
|
+
}
|
|
112
|
+
function badge(text, options = {}) {
|
|
113
|
+
const {
|
|
114
|
+
variant = "default",
|
|
115
|
+
size = "md",
|
|
116
|
+
pill = false,
|
|
117
|
+
icon,
|
|
118
|
+
dot = false,
|
|
119
|
+
className = "",
|
|
120
|
+
removable = false
|
|
121
|
+
} = options;
|
|
122
|
+
if (dot) {
|
|
123
|
+
const dotVariants = {
|
|
124
|
+
default: "bg-gray-400",
|
|
125
|
+
primary: "bg-primary",
|
|
126
|
+
secondary: "bg-secondary",
|
|
127
|
+
success: "bg-success",
|
|
128
|
+
warning: "bg-warning",
|
|
129
|
+
danger: "bg-danger",
|
|
130
|
+
info: "bg-blue-500",
|
|
131
|
+
outline: "border border-current"
|
|
132
|
+
};
|
|
133
|
+
const dotClasses = ["inline-block rounded-full", getSizeClasses2(size, true), dotVariants[variant], className].filter(Boolean).join(" ");
|
|
134
|
+
return `<span class="${dotClasses}" aria-label="${escapeHtml2(text)}" title="${escapeHtml2(text)}"></span>`;
|
|
135
|
+
}
|
|
136
|
+
const variantClasses = getVariantClasses2(variant);
|
|
137
|
+
const sizeClasses = getSizeClasses2(size, false);
|
|
138
|
+
const baseClasses = [
|
|
139
|
+
"inline-flex items-center font-medium",
|
|
140
|
+
pill ? "rounded-full" : "rounded-md",
|
|
141
|
+
variantClasses,
|
|
142
|
+
sizeClasses,
|
|
143
|
+
className
|
|
144
|
+
].filter(Boolean).join(" ");
|
|
145
|
+
const iconHtml = icon ? `<span class="mr-1">${icon}</span>` : "";
|
|
146
|
+
const removeHtml = removable ? `<button
|
|
147
|
+
type="button"
|
|
148
|
+
class="ml-1.5 -mr-1 hover:opacity-70 transition-opacity"
|
|
149
|
+
onclick="this.parentElement.remove()"
|
|
150
|
+
aria-label="Remove"
|
|
151
|
+
>
|
|
152
|
+
<svg class="w-3 h-3" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
153
|
+
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12"/>
|
|
154
|
+
</svg>
|
|
155
|
+
</button>` : "";
|
|
156
|
+
return `<span class="${baseClasses}">
|
|
157
|
+
${iconHtml}${escapeHtml2(text)}${removeHtml}
|
|
158
|
+
</span>`;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
// libs/ui/src/components/button.ts
|
|
162
|
+
import { validateOptions } from "@frontmcp/uipack/validation";
|
|
163
|
+
|
|
164
|
+
// libs/ui/src/components/button.schema.ts
|
|
165
|
+
import { z } from "zod";
|
|
166
|
+
var ButtonVariantSchema = z.enum(["primary", "secondary", "outline", "ghost", "danger", "success", "link"]);
|
|
167
|
+
var ButtonSizeSchema = z.enum(["xs", "sm", "md", "lg", "xl"]);
|
|
168
|
+
var ButtonOptionsSchema = z.object({
|
|
169
|
+
/** Button variant */
|
|
170
|
+
variant: ButtonVariantSchema.optional(),
|
|
171
|
+
/** Button size */
|
|
172
|
+
size: ButtonSizeSchema.optional(),
|
|
173
|
+
/** Button type attribute */
|
|
174
|
+
type: z.enum(["button", "submit", "reset"]).optional(),
|
|
175
|
+
/** Disabled state */
|
|
176
|
+
disabled: z.boolean().optional(),
|
|
177
|
+
/** Loading state */
|
|
178
|
+
loading: z.boolean().optional(),
|
|
179
|
+
/** Full width */
|
|
180
|
+
fullWidth: z.boolean().optional(),
|
|
181
|
+
/** Icon before text (HTML string) */
|
|
182
|
+
iconBefore: z.string().optional(),
|
|
183
|
+
/** Icon after text (HTML string) */
|
|
184
|
+
iconAfter: z.string().optional(),
|
|
185
|
+
/** Icon only (no text) */
|
|
186
|
+
iconOnly: z.boolean().optional(),
|
|
187
|
+
/** Additional CSS classes */
|
|
188
|
+
className: z.string().optional(),
|
|
189
|
+
/** Button ID */
|
|
190
|
+
id: z.string().optional(),
|
|
191
|
+
/** Name attribute */
|
|
192
|
+
name: z.string().optional(),
|
|
193
|
+
/** Value attribute */
|
|
194
|
+
value: z.string().optional(),
|
|
195
|
+
/** Click handler (URL for links) */
|
|
196
|
+
href: z.string().optional(),
|
|
197
|
+
/** Open in new tab */
|
|
198
|
+
target: z.enum(["_blank", "_self"]).optional(),
|
|
199
|
+
/** Data attributes */
|
|
200
|
+
data: z.record(z.string(), z.string()).optional(),
|
|
201
|
+
/** ARIA label */
|
|
202
|
+
ariaLabel: z.string().optional()
|
|
203
|
+
}).strict();
|
|
204
|
+
var ButtonGroupOptionsSchema = z.object({
|
|
205
|
+
/** Attach buttons visually */
|
|
206
|
+
attached: z.boolean().optional(),
|
|
207
|
+
/** Direction */
|
|
208
|
+
direction: z.enum(["horizontal", "vertical"]).optional(),
|
|
209
|
+
/** Gap between buttons */
|
|
210
|
+
gap: z.enum(["sm", "md", "lg"]).optional(),
|
|
211
|
+
/** Additional CSS classes */
|
|
212
|
+
className: z.string().optional()
|
|
213
|
+
}).strict();
|
|
214
|
+
|
|
215
|
+
// libs/ui/src/components/button.ts
|
|
216
|
+
function getVariantClasses3(variant) {
|
|
217
|
+
const variants = {
|
|
218
|
+
primary: "bg-primary hover:bg-primary/90 text-white shadow-sm",
|
|
219
|
+
secondary: "bg-secondary hover:bg-secondary/90 text-white shadow-sm",
|
|
220
|
+
outline: "border-2 border-primary text-primary hover:bg-primary/10",
|
|
221
|
+
ghost: "text-text-primary hover:bg-gray-100",
|
|
222
|
+
danger: "bg-danger hover:bg-danger/90 text-white shadow-sm",
|
|
223
|
+
success: "bg-success hover:bg-success/90 text-white shadow-sm",
|
|
224
|
+
link: "text-primary hover:text-primary/80 hover:underline"
|
|
225
|
+
};
|
|
226
|
+
return variants[variant];
|
|
227
|
+
}
|
|
228
|
+
function getSizeClasses3(size, iconOnly) {
|
|
229
|
+
if (iconOnly) {
|
|
230
|
+
const iconSizes = {
|
|
231
|
+
xs: "p-1.5",
|
|
232
|
+
sm: "p-2",
|
|
233
|
+
md: "p-2.5",
|
|
234
|
+
lg: "p-3",
|
|
235
|
+
xl: "p-4"
|
|
236
|
+
};
|
|
237
|
+
return iconSizes[size];
|
|
238
|
+
}
|
|
239
|
+
const sizes = {
|
|
240
|
+
xs: "px-2.5 py-1.5 text-xs",
|
|
241
|
+
sm: "px-3 py-2 text-sm",
|
|
242
|
+
md: "px-4 py-2.5 text-sm",
|
|
243
|
+
lg: "px-5 py-3 text-base",
|
|
244
|
+
xl: "px-6 py-3.5 text-lg"
|
|
245
|
+
};
|
|
246
|
+
return sizes[size];
|
|
247
|
+
}
|
|
248
|
+
function sanitizeDataKey(key) {
|
|
249
|
+
const sanitized = key.toLowerCase().replace(/[^a-z0-9_-]/g, "-").replace(/-+/g, "-").replace(/^-|-$/g, "");
|
|
250
|
+
if (!sanitized) {
|
|
251
|
+
console.warn(`[frontmcp/ui] Dropping invalid data-* key: "${key}"`);
|
|
252
|
+
return null;
|
|
253
|
+
}
|
|
254
|
+
return sanitized;
|
|
255
|
+
}
|
|
256
|
+
var loadingSpinner = `<svg class="animate-spin -ml-1 mr-2 h-4 w-4" fill="none" viewBox="0 0 24 24">
|
|
257
|
+
<circle class="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" stroke-width="4"></circle>
|
|
258
|
+
<path class="opacity-75" fill="currentColor" d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"></path>
|
|
259
|
+
</svg>`;
|
|
260
|
+
function isValidHrefProtocol(href) {
|
|
261
|
+
const trimmed = href.trim().toLowerCase();
|
|
262
|
+
return trimmed.startsWith("http://") || trimmed.startsWith("https://") || trimmed.startsWith("/") || trimmed.startsWith("#") || trimmed.startsWith("mailto:") || trimmed.startsWith("tel:");
|
|
263
|
+
}
|
|
264
|
+
function button(text, options = {}) {
|
|
265
|
+
const validation = validateOptions(options, {
|
|
266
|
+
schema: ButtonOptionsSchema,
|
|
267
|
+
componentName: "button"
|
|
268
|
+
});
|
|
269
|
+
if (!validation.success) {
|
|
270
|
+
return validation.error;
|
|
271
|
+
}
|
|
272
|
+
const validatedOptions = validation.data;
|
|
273
|
+
const {
|
|
274
|
+
variant = "primary",
|
|
275
|
+
size = "md",
|
|
276
|
+
type = "button",
|
|
277
|
+
disabled = false,
|
|
278
|
+
loading = false,
|
|
279
|
+
fullWidth = false,
|
|
280
|
+
iconBefore,
|
|
281
|
+
iconAfter,
|
|
282
|
+
iconOnly = false,
|
|
283
|
+
className = "",
|
|
284
|
+
id,
|
|
285
|
+
name,
|
|
286
|
+
value,
|
|
287
|
+
href,
|
|
288
|
+
target,
|
|
289
|
+
data,
|
|
290
|
+
ariaLabel
|
|
291
|
+
} = validatedOptions;
|
|
292
|
+
if (!iconOnly && !text.trim()) {
|
|
293
|
+
console.warn("[frontmcp/ui] Button has empty text. Consider providing text or using iconOnly with ariaLabel.");
|
|
294
|
+
}
|
|
295
|
+
if (iconOnly && !ariaLabel && !text.trim()) {
|
|
296
|
+
console.warn(
|
|
297
|
+
"[frontmcp/ui] iconOnly button requires non-empty text or ariaLabel for accessibility; control will have no label."
|
|
298
|
+
);
|
|
299
|
+
}
|
|
300
|
+
if (href && !isValidHrefProtocol(href)) {
|
|
301
|
+
console.warn(`[frontmcp/ui] Button href contains potentially dangerous protocol: "${href.slice(0, 20)}..."`);
|
|
302
|
+
}
|
|
303
|
+
const variantClasses = getVariantClasses3(variant);
|
|
304
|
+
const sizeClasses = getSizeClasses3(size, iconOnly);
|
|
305
|
+
const safeClassName = className ? escapeHtml2(className) : "";
|
|
306
|
+
const baseClasses = [
|
|
307
|
+
"inline-flex items-center justify-center",
|
|
308
|
+
"font-medium",
|
|
309
|
+
"rounded-lg",
|
|
310
|
+
"transition-colors duration-200",
|
|
311
|
+
"focus:outline-none focus:ring-2 focus:ring-primary/50 focus:ring-offset-2",
|
|
312
|
+
disabled || loading ? "opacity-50 cursor-not-allowed" : "cursor-pointer",
|
|
313
|
+
fullWidth ? "w-full" : "",
|
|
314
|
+
variantClasses,
|
|
315
|
+
sizeClasses,
|
|
316
|
+
safeClassName
|
|
317
|
+
].filter(Boolean).join(" ");
|
|
318
|
+
const dataAttrs = data ? Object.entries(data).map(([key, val]) => {
|
|
319
|
+
const safeKey = sanitizeDataKey(key);
|
|
320
|
+
return safeKey ? `data-${safeKey}="${escapeHtml2(val)}"` : "";
|
|
321
|
+
}).filter(Boolean).join(" ") : "";
|
|
322
|
+
const idAttr = id ? `id="${escapeHtml2(id)}"` : "";
|
|
323
|
+
const nameAttr = name ? `name="${escapeHtml2(name)}"` : "";
|
|
324
|
+
const valueAttr = value ? `value="${escapeHtml2(value)}"` : "";
|
|
325
|
+
const disabledAttr = disabled || loading ? "disabled" : "";
|
|
326
|
+
const targetAttr = target ? `target="${escapeHtml2(target)}"` : "";
|
|
327
|
+
const relAttr = target === "_blank" ? 'rel="noopener noreferrer"' : "";
|
|
328
|
+
const trimmedText = text.trim();
|
|
329
|
+
const effectiveAriaLabel = ariaLabel ?? (iconOnly && trimmedText ? trimmedText : void 0);
|
|
330
|
+
const ariaLabelAttr = effectiveAriaLabel ? `aria-label="${escapeHtml2(effectiveAriaLabel)}"` : "";
|
|
331
|
+
const iconBeforeHtml = iconBefore && !loading ? `<span class="${iconOnly ? "" : "mr-2"}">${iconBefore}</span>` : "";
|
|
332
|
+
const iconAfterHtml = iconAfter && !loading ? `<span class="${iconOnly ? "" : "ml-2"}">${iconAfter}</span>` : "";
|
|
333
|
+
const loadingHtml = loading ? loadingSpinner : "";
|
|
334
|
+
const textHtml = iconOnly ? "" : escapeHtml2(text);
|
|
335
|
+
const contentHtml = `${loadingHtml}${iconBeforeHtml}${textHtml}${iconAfterHtml}`;
|
|
336
|
+
if (href && !disabled && !loading && isValidHrefProtocol(href)) {
|
|
337
|
+
return `<a href="${escapeHtml2(
|
|
338
|
+
href
|
|
339
|
+
)}" class="${baseClasses}" ${idAttr} ${dataAttrs} ${ariaLabelAttr} ${targetAttr} ${relAttr}>
|
|
340
|
+
${contentHtml}
|
|
341
|
+
</a>`;
|
|
342
|
+
}
|
|
343
|
+
return `<button type="${type}" class="${baseClasses}" ${idAttr} ${nameAttr} ${valueAttr} ${disabledAttr} ${dataAttrs} ${ariaLabelAttr}>
|
|
344
|
+
${contentHtml}
|
|
345
|
+
</button>`;
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
// libs/ui/src/widgets/resource.ts
|
|
349
|
+
var resourceIcons = {
|
|
350
|
+
document: `<svg class="w-8 h-8" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
351
|
+
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"/>
|
|
352
|
+
</svg>`,
|
|
353
|
+
image: `<svg class="w-8 h-8" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
354
|
+
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 16l4.586-4.586a2 2 0 012.828 0L16 16m-2-2l1.586-1.586a2 2 0 012.828 0L20 14m-6-6h.01M6 20h12a2 2 0 002-2V6a2 2 0 00-2-2H6a2 2 0 00-2 2v12a2 2 0 002 2z"/>
|
|
355
|
+
</svg>`,
|
|
356
|
+
code: `<svg class="w-8 h-8" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
357
|
+
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M10 20l4-16m4 4l4 4-4 4M6 16l-4-4 4-4"/>
|
|
358
|
+
</svg>`,
|
|
359
|
+
data: `<svg class="w-8 h-8" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
360
|
+
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 7v10c0 2.21 3.582 4 8 4s8-1.79 8-4V7M4 7c0 2.21 3.582 4 8 4s8-1.79 8-4M4 7c0-2.21 3.582-4 8-4s8 1.79 8 4"/>
|
|
361
|
+
</svg>`,
|
|
362
|
+
file: `<svg class="w-8 h-8" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
363
|
+
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M7 21h10a2 2 0 002-2V9.414a1 1 0 00-.293-.707l-5.414-5.414A1 1 0 0012.586 3H7a2 2 0 00-2 2v14a2 2 0 002 2z"/>
|
|
364
|
+
</svg>`,
|
|
365
|
+
link: `<svg class="w-8 h-8" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
366
|
+
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1"/>
|
|
367
|
+
</svg>`,
|
|
368
|
+
user: `<svg class="w-8 h-8" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
369
|
+
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M16 7a4 4 0 11-8 0 4 4 0 018 0zM12 14a7 7 0 00-7 7h14a7 7 0 00-7-7z"/>
|
|
370
|
+
</svg>`,
|
|
371
|
+
event: `<svg class="w-8 h-8" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
372
|
+
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/>
|
|
373
|
+
</svg>`,
|
|
374
|
+
message: `<svg class="w-8 h-8" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
375
|
+
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M8 10h.01M12 10h.01M16 10h.01M9 16H5a2 2 0 01-2-2V6a2 2 0 012-2h14a2 2 0 012 2v8a2 2 0 01-2 2h-5l-5 5v-5z"/>
|
|
376
|
+
</svg>`,
|
|
377
|
+
task: `<svg class="w-8 h-8" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
378
|
+
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"/>
|
|
379
|
+
</svg>`,
|
|
380
|
+
custom: `<svg class="w-8 h-8" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
381
|
+
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 11H5m14 0a2 2 0 012 2v6a2 2 0 01-2 2H5a2 2 0 01-2-2v-6a2 2 0 012-2m14 0V9a2 2 0 00-2-2M5 11V9a2 2 0 012-2m0 0V5a2 2 0 012-2h6a2 2 0 012 2v2M7 7h10"/>
|
|
382
|
+
</svg>`
|
|
383
|
+
};
|
|
384
|
+
function formatFileSize(bytes) {
|
|
385
|
+
if (bytes === 0) return "0 B";
|
|
386
|
+
const k = 1024;
|
|
387
|
+
const sizes = ["B", "KB", "MB", "GB", "TB"];
|
|
388
|
+
const i = Math.floor(Math.log(bytes) / Math.log(k));
|
|
389
|
+
return `${parseFloat((bytes / Math.pow(k, i)).toFixed(1))} ${sizes[i]}`;
|
|
390
|
+
}
|
|
391
|
+
function formatDate(date) {
|
|
392
|
+
const d = typeof date === "string" ? new Date(date) : date;
|
|
393
|
+
return d.toLocaleDateString("en-US", {
|
|
394
|
+
year: "numeric",
|
|
395
|
+
month: "short",
|
|
396
|
+
day: "numeric"
|
|
397
|
+
});
|
|
398
|
+
}
|
|
399
|
+
function resourceWidget(options) {
|
|
400
|
+
const {
|
|
401
|
+
type,
|
|
402
|
+
title,
|
|
403
|
+
description,
|
|
404
|
+
icon,
|
|
405
|
+
thumbnail,
|
|
406
|
+
url,
|
|
407
|
+
meta,
|
|
408
|
+
status,
|
|
409
|
+
actions = [],
|
|
410
|
+
className = "",
|
|
411
|
+
cardOptions = {}
|
|
412
|
+
} = options;
|
|
413
|
+
const iconHtml = thumbnail ? `<div class="w-16 h-16 rounded-lg overflow-hidden bg-gray-100 flex-shrink-0">
|
|
414
|
+
<img src="${escapeHtml2(thumbnail)}" alt="${escapeHtml2(title)}" class="w-full h-full object-cover">
|
|
415
|
+
</div>` : `<div class="w-16 h-16 rounded-lg bg-gray-100 flex items-center justify-center flex-shrink-0 text-gray-400">
|
|
416
|
+
${icon || resourceIcons[type]}
|
|
417
|
+
</div>`;
|
|
418
|
+
const statusHtml = status ? badge(status.label, { variant: status.variant, size: "sm" }) : "";
|
|
419
|
+
const metaItems = [];
|
|
420
|
+
if (meta?.size) {
|
|
421
|
+
metaItems.push(formatFileSize(meta.size));
|
|
422
|
+
}
|
|
423
|
+
if (meta?.mimeType) {
|
|
424
|
+
metaItems.push(meta.mimeType);
|
|
425
|
+
}
|
|
426
|
+
if (meta?.updatedAt) {
|
|
427
|
+
metaItems.push(`Updated ${formatDate(meta.updatedAt)}`);
|
|
428
|
+
} else if (meta?.createdAt) {
|
|
429
|
+
metaItems.push(`Created ${formatDate(meta.createdAt)}`);
|
|
430
|
+
}
|
|
431
|
+
if (meta?.author) {
|
|
432
|
+
metaItems.push(`by ${meta.author}`);
|
|
433
|
+
}
|
|
434
|
+
const metaHtml = metaItems.length > 0 ? `<div class="text-xs text-text-secondary mt-1">${metaItems.join(" \u2022 ")}</div>` : "";
|
|
435
|
+
const tagsHtml = meta?.tags && meta.tags.length > 0 ? `<div class="flex flex-wrap gap-1 mt-2">
|
|
436
|
+
${meta.tags.map((tag) => badge(tag, { variant: "default", size: "sm" })).join("")}
|
|
437
|
+
</div>` : "";
|
|
438
|
+
const actionsHtml = actions.length > 0 ? `<div class="flex gap-2 mt-4">
|
|
439
|
+
${actions.map((action) => {
|
|
440
|
+
const variantMap = {
|
|
441
|
+
primary: "primary",
|
|
442
|
+
secondary: "secondary",
|
|
443
|
+
danger: "danger",
|
|
444
|
+
ghost: "ghost"
|
|
445
|
+
};
|
|
446
|
+
const variant = action.variant ? variantMap[action.variant] : "ghost";
|
|
447
|
+
const htmxAttrs = [];
|
|
448
|
+
if (action.htmx) {
|
|
449
|
+
if (action.htmx.get) htmxAttrs.push(`hx-get="${escapeHtml2(action.htmx.get)}"`);
|
|
450
|
+
if (action.htmx.post) htmxAttrs.push(`hx-post="${escapeHtml2(action.htmx.post)}"`);
|
|
451
|
+
if (action.htmx.delete) htmxAttrs.push(`hx-delete="${escapeHtml2(action.htmx.delete)}"`);
|
|
452
|
+
if (action.htmx.target) htmxAttrs.push(`hx-target="${escapeHtml2(action.htmx.target)}"`);
|
|
453
|
+
if (action.htmx.swap) htmxAttrs.push(`hx-swap="${escapeHtml2(action.htmx.swap)}"`);
|
|
454
|
+
if (action.htmx.confirm) htmxAttrs.push(`hx-confirm="${escapeHtml2(action.htmx.confirm)}"`);
|
|
455
|
+
}
|
|
456
|
+
return button(action.label, {
|
|
457
|
+
variant,
|
|
458
|
+
size: "sm",
|
|
459
|
+
href: action.href,
|
|
460
|
+
disabled: action.disabled,
|
|
461
|
+
iconBefore: action.icon
|
|
462
|
+
});
|
|
463
|
+
}).join("")}
|
|
464
|
+
</div>` : "";
|
|
465
|
+
const content = `
|
|
466
|
+
<div class="flex gap-4">
|
|
467
|
+
${iconHtml}
|
|
468
|
+
<div class="flex-1 min-w-0">
|
|
469
|
+
<div class="flex items-start justify-between gap-2">
|
|
470
|
+
<div class="min-w-0">
|
|
471
|
+
${url ? `<a href="${escapeHtml2(
|
|
472
|
+
url
|
|
473
|
+
)}" class="font-semibold text-text-primary hover:text-primary truncate block">${escapeHtml2(
|
|
474
|
+
title
|
|
475
|
+
)}</a>` : `<h3 class="font-semibold text-text-primary truncate">${escapeHtml2(title)}</h3>`}
|
|
476
|
+
${description ? `<p class="text-sm text-text-secondary mt-0.5 line-clamp-2">${escapeHtml2(description)}</p>` : ""}
|
|
477
|
+
${metaHtml}
|
|
478
|
+
${tagsHtml}
|
|
479
|
+
</div>
|
|
480
|
+
${statusHtml}
|
|
481
|
+
</div>
|
|
482
|
+
${actionsHtml}
|
|
483
|
+
</div>
|
|
484
|
+
</div>
|
|
485
|
+
`;
|
|
486
|
+
return card(content, {
|
|
487
|
+
variant: "default",
|
|
488
|
+
size: "md",
|
|
489
|
+
className: `resource-widget resource-${type} ${className}`,
|
|
490
|
+
...cardOptions
|
|
491
|
+
});
|
|
492
|
+
}
|
|
493
|
+
function resourceList(options) {
|
|
494
|
+
const {
|
|
495
|
+
resources,
|
|
496
|
+
title,
|
|
497
|
+
emptyMessage = "No resources found",
|
|
498
|
+
layout = "list",
|
|
499
|
+
columns = 2,
|
|
500
|
+
className = "",
|
|
501
|
+
showLoadMore = false,
|
|
502
|
+
loadMoreUrl
|
|
503
|
+
} = options;
|
|
504
|
+
const titleHtml = title ? `<h2 class="text-lg font-semibold text-text-primary mb-4">${escapeHtml2(title)}</h2>` : "";
|
|
505
|
+
if (resources.length === 0) {
|
|
506
|
+
return `<div class="${className}">
|
|
507
|
+
${titleHtml}
|
|
508
|
+
<div class="text-center py-12 text-text-secondary">
|
|
509
|
+
<svg class="w-12 h-12 mx-auto mb-4 text-gray-300" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
510
|
+
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M20 13V6a2 2 0 00-2-2H6a2 2 0 00-2 2v7m16 0v5a2 2 0 01-2 2H6a2 2 0 01-2-2v-5m16 0h-2.586a1 1 0 00-.707.293l-2.414 2.414a1 1 0 01-.707.293h-3.172a1 1 0 01-.707-.293l-2.414-2.414A1 1 0 006.586 13H4"/>
|
|
511
|
+
</svg>
|
|
512
|
+
<p>${escapeHtml2(emptyMessage)}</p>
|
|
513
|
+
</div>
|
|
514
|
+
</div>`;
|
|
515
|
+
}
|
|
516
|
+
const layoutClasses = layout === "grid" ? `grid grid-cols-1 md:grid-cols-${columns} gap-4` : "space-y-4";
|
|
517
|
+
const resourcesHtml = resources.map((r) => resourceWidget(r)).join("\n");
|
|
518
|
+
const loadMoreHtml = showLoadMore && loadMoreUrl ? `<div class="text-center mt-6">
|
|
519
|
+
${button("Load More", {
|
|
520
|
+
variant: "outline",
|
|
521
|
+
href: loadMoreUrl
|
|
522
|
+
})}
|
|
523
|
+
</div>` : "";
|
|
524
|
+
return `<div class="resource-list ${className}">
|
|
525
|
+
${titleHtml}
|
|
526
|
+
<div class="${layoutClasses}">
|
|
527
|
+
${resourcesHtml}
|
|
528
|
+
</div>
|
|
529
|
+
${loadMoreHtml}
|
|
530
|
+
</div>`;
|
|
531
|
+
}
|
|
532
|
+
function resourceItem(options) {
|
|
533
|
+
const { type, title, description, icon, url, meta, status } = options;
|
|
534
|
+
const iconHtml = `<div class="w-10 h-10 rounded-lg bg-gray-100 flex items-center justify-center flex-shrink-0 text-gray-400">
|
|
535
|
+
${icon || resourceIcons[type]}
|
|
536
|
+
</div>`;
|
|
537
|
+
const statusHtml = status ? badge(status.label, { variant: status.variant, size: "sm" }) : "";
|
|
538
|
+
const metaText = meta?.size ? formatFileSize(meta.size) : "";
|
|
539
|
+
const titleElement = url ? `<a href="${escapeHtml2(url)}" class="font-medium text-text-primary hover:text-primary">${escapeHtml2(title)}</a>` : `<span class="font-medium text-text-primary">${escapeHtml2(title)}</span>`;
|
|
540
|
+
return `<div class="flex items-center gap-3 p-3 rounded-lg hover:bg-gray-50 transition-colors">
|
|
541
|
+
${iconHtml}
|
|
542
|
+
<div class="flex-1 min-w-0">
|
|
543
|
+
<div class="flex items-center gap-2">
|
|
544
|
+
${titleElement}
|
|
545
|
+
${statusHtml}
|
|
546
|
+
</div>
|
|
547
|
+
${description || metaText ? `<p class="text-sm text-text-secondary truncate">${escapeHtml2(description || metaText)}</p>` : ""}
|
|
548
|
+
</div>
|
|
549
|
+
</div>`;
|
|
550
|
+
}
|
|
551
|
+
function codePreview(options) {
|
|
552
|
+
const {
|
|
553
|
+
code,
|
|
554
|
+
language = "text",
|
|
555
|
+
filename,
|
|
556
|
+
lineNumbers = true,
|
|
557
|
+
maxHeight = "400px",
|
|
558
|
+
showCopy = true,
|
|
559
|
+
className = ""
|
|
560
|
+
} = options;
|
|
561
|
+
const lines = code.split("\n");
|
|
562
|
+
const lineNumbersHtml = lineNumbers ? `<div class="text-right select-none pr-4 text-gray-500">
|
|
563
|
+
${lines.map((_, i) => `<div>${i + 1}</div>`).join("")}
|
|
564
|
+
</div>` : "";
|
|
565
|
+
const copyScript = showCopy ? `<script>
|
|
566
|
+
function copyCode(btn, code) {
|
|
567
|
+
navigator.clipboard.writeText(code).then(() => {
|
|
568
|
+
const original = btn.innerHTML;
|
|
569
|
+
btn.innerHTML = '<svg class="w-4 h-4 text-success" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 13l4 4L19 7"/></svg>';
|
|
570
|
+
setTimeout(() => btn.innerHTML = original, 2000);
|
|
571
|
+
});
|
|
572
|
+
}
|
|
573
|
+
</script>` : "";
|
|
574
|
+
const copyButton = showCopy ? `<button
|
|
575
|
+
type="button"
|
|
576
|
+
onclick="copyCode(this, ${escapeHtml2(JSON.stringify(code))})"
|
|
577
|
+
class="p-1.5 rounded hover:bg-gray-700 transition-colors"
|
|
578
|
+
title="Copy code"
|
|
579
|
+
>
|
|
580
|
+
<svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
581
|
+
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z"/>
|
|
582
|
+
</svg>
|
|
583
|
+
</button>` : "";
|
|
584
|
+
return `<div class="code-preview rounded-lg overflow-hidden ${className}">
|
|
585
|
+
${filename || showCopy ? `
|
|
586
|
+
<div class="flex items-center justify-between px-4 py-2 bg-gray-800 border-b border-gray-700">
|
|
587
|
+
${filename ? `<span class="text-sm text-gray-300">${escapeHtml2(filename)}</span>` : "<span></span>"}
|
|
588
|
+
<div class="flex items-center gap-2">
|
|
589
|
+
${language ? `<span class="text-xs text-gray-500">${escapeHtml2(language)}</span>` : ""}
|
|
590
|
+
${copyButton}
|
|
591
|
+
</div>
|
|
592
|
+
</div>
|
|
593
|
+
` : ""}
|
|
594
|
+
<div class="bg-gray-900 p-4 overflow-auto" style="max-height: ${maxHeight}">
|
|
595
|
+
<div class="flex text-sm font-mono">
|
|
596
|
+
${lineNumbersHtml}
|
|
597
|
+
<pre class="flex-1 text-gray-100"><code>${escapeHtml2(code)}</code></pre>
|
|
598
|
+
</div>
|
|
599
|
+
</div>
|
|
600
|
+
${copyScript}
|
|
601
|
+
</div>`;
|
|
602
|
+
}
|
|
603
|
+
function imagePreview(options) {
|
|
604
|
+
const { src, alt, caption, maxHeight = "400px", clickable = true, className = "" } = options;
|
|
605
|
+
const imageHtml = `<img
|
|
606
|
+
src="${escapeHtml2(src)}"
|
|
607
|
+
alt="${escapeHtml2(alt)}"
|
|
608
|
+
class="max-w-full h-auto rounded-lg"
|
|
609
|
+
style="max-height: ${maxHeight}"
|
|
610
|
+
>`;
|
|
611
|
+
const captionHtml = caption ? `<p class="text-sm text-text-secondary mt-2 text-center">${escapeHtml2(caption)}</p>` : "";
|
|
612
|
+
const content = clickable ? `<a href="${escapeHtml2(src)}" target="_blank" rel="noopener" class="block">${imageHtml}</a>` : imageHtml;
|
|
613
|
+
return `<div class="image-preview ${className}">
|
|
614
|
+
${content}
|
|
615
|
+
${captionHtml}
|
|
616
|
+
</div>`;
|
|
617
|
+
}
|
|
618
|
+
|
|
619
|
+
// libs/ui/src/widgets/progress.ts
|
|
620
|
+
function progressBar(options) {
|
|
621
|
+
const {
|
|
622
|
+
value,
|
|
623
|
+
showLabel = true,
|
|
624
|
+
labelPosition = "outside",
|
|
625
|
+
size = "md",
|
|
626
|
+
variant = "primary",
|
|
627
|
+
animated = false,
|
|
628
|
+
className = "",
|
|
629
|
+
label
|
|
630
|
+
} = options;
|
|
631
|
+
const clampedValue = Math.min(100, Math.max(0, value));
|
|
632
|
+
const sizeClasses = {
|
|
633
|
+
sm: "h-1.5",
|
|
634
|
+
md: "h-2.5",
|
|
635
|
+
lg: "h-4"
|
|
636
|
+
};
|
|
637
|
+
const variantClasses = {
|
|
638
|
+
primary: "bg-primary",
|
|
639
|
+
success: "bg-success",
|
|
640
|
+
warning: "bg-warning",
|
|
641
|
+
danger: "bg-danger",
|
|
642
|
+
info: "bg-blue-500"
|
|
643
|
+
};
|
|
644
|
+
const animatedClass = animated ? "bg-stripes animate-stripes" : "";
|
|
645
|
+
const displayLabel = label || `${Math.round(clampedValue)}%`;
|
|
646
|
+
const insideLabel = labelPosition === "inside" && size === "lg" && clampedValue > 10 ? `<span class="absolute inset-0 flex items-center justify-center text-xs font-medium text-white">${escapeHtml2(
|
|
647
|
+
displayLabel
|
|
648
|
+
)}</span>` : "";
|
|
649
|
+
const outsideLabel = showLabel && labelPosition === "outside" ? `<div class="flex justify-between mb-1">
|
|
650
|
+
<span class="text-sm font-medium text-text-primary">${label ? escapeHtml2(label) : "Progress"}</span>
|
|
651
|
+
<span class="text-sm text-text-secondary">${Math.round(clampedValue)}%</span>
|
|
652
|
+
</div>` : "";
|
|
653
|
+
return `<div class="progress-bar ${className}">
|
|
654
|
+
${outsideLabel}
|
|
655
|
+
<div class="relative w-full ${sizeClasses[size]} bg-gray-200 rounded-full overflow-hidden">
|
|
656
|
+
<div
|
|
657
|
+
class="${variantClasses[variant]} ${sizeClasses[size]} ${animatedClass} rounded-full transition-all duration-300"
|
|
658
|
+
style="width: ${clampedValue}%"
|
|
659
|
+
role="progressbar"
|
|
660
|
+
aria-valuenow="${clampedValue}"
|
|
661
|
+
aria-valuemin="0"
|
|
662
|
+
aria-valuemax="100"
|
|
663
|
+
></div>
|
|
664
|
+
${insideLabel}
|
|
665
|
+
</div>
|
|
666
|
+
</div>
|
|
667
|
+
${animated ? `<style>
|
|
668
|
+
.bg-stripes {
|
|
669
|
+
background-image: linear-gradient(
|
|
670
|
+
45deg,
|
|
671
|
+
rgba(255,255,255,0.15) 25%,
|
|
672
|
+
transparent 25%,
|
|
673
|
+
transparent 50%,
|
|
674
|
+
rgba(255,255,255,0.15) 50%,
|
|
675
|
+
rgba(255,255,255,0.15) 75%,
|
|
676
|
+
transparent 75%,
|
|
677
|
+
transparent
|
|
678
|
+
);
|
|
679
|
+
background-size: 1rem 1rem;
|
|
680
|
+
}
|
|
681
|
+
@keyframes stripes {
|
|
682
|
+
from { background-position: 1rem 0; }
|
|
683
|
+
to { background-position: 0 0; }
|
|
684
|
+
}
|
|
685
|
+
.animate-stripes {
|
|
686
|
+
animation: stripes 1s linear infinite;
|
|
687
|
+
}
|
|
688
|
+
</style>` : ""}`;
|
|
689
|
+
}
|
|
690
|
+
function stepProgress(options) {
|
|
691
|
+
const { steps, orientation = "horizontal", connector = "line", className = "" } = options;
|
|
692
|
+
const getStepIcon = (step, index) => {
|
|
693
|
+
if (step.icon) return step.icon;
|
|
694
|
+
if (step.status === "completed") {
|
|
695
|
+
return `<svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
696
|
+
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 13l4 4L19 7"/>
|
|
697
|
+
</svg>`;
|
|
698
|
+
}
|
|
699
|
+
return `<span class="font-medium">${index + 1}</span>`;
|
|
700
|
+
};
|
|
701
|
+
const getStepClasses = (status) => {
|
|
702
|
+
switch (status) {
|
|
703
|
+
case "completed":
|
|
704
|
+
return {
|
|
705
|
+
circle: "bg-success text-white",
|
|
706
|
+
text: "text-text-primary"
|
|
707
|
+
};
|
|
708
|
+
case "current":
|
|
709
|
+
return {
|
|
710
|
+
circle: "bg-primary text-white ring-4 ring-primary/20",
|
|
711
|
+
text: "text-primary font-medium"
|
|
712
|
+
};
|
|
713
|
+
case "upcoming":
|
|
714
|
+
default:
|
|
715
|
+
return {
|
|
716
|
+
circle: "bg-gray-200 text-gray-500",
|
|
717
|
+
text: "text-text-secondary"
|
|
718
|
+
};
|
|
719
|
+
}
|
|
720
|
+
};
|
|
721
|
+
if (orientation === "vertical") {
|
|
722
|
+
const stepsHtml2 = steps.map((step, index) => {
|
|
723
|
+
const classes = getStepClasses(step.status);
|
|
724
|
+
const isLast = index === steps.length - 1;
|
|
725
|
+
const connectorHtml = !isLast && connector !== "none" ? `<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>` : "";
|
|
726
|
+
const stepContent = `
|
|
727
|
+
<div class="flex items-start gap-4">
|
|
728
|
+
<div class="w-10 h-10 rounded-full ${classes.circle} flex items-center justify-center flex-shrink-0">
|
|
729
|
+
${getStepIcon(step, index)}
|
|
730
|
+
</div>
|
|
731
|
+
<div class="pt-2">
|
|
732
|
+
<div class="${classes.text}">${escapeHtml2(step.label)}</div>
|
|
733
|
+
${step.description ? `<p class="text-sm text-text-secondary mt-0.5">${escapeHtml2(step.description)}</p>` : ""}
|
|
734
|
+
</div>
|
|
735
|
+
</div>
|
|
736
|
+
${connectorHtml}
|
|
737
|
+
`;
|
|
738
|
+
return step.href && step.status === "completed" ? `<a href="${escapeHtml2(step.href)}" class="block hover:opacity-80">${stepContent}</a>` : `<div>${stepContent}</div>`;
|
|
739
|
+
}).join("\n");
|
|
740
|
+
return `<div class="step-progress ${className}">${stepsHtml2}</div>`;
|
|
741
|
+
}
|
|
742
|
+
const stepsHtml = steps.map((step, index) => {
|
|
743
|
+
const classes = getStepClasses(step.status);
|
|
744
|
+
const isLast = index === steps.length - 1;
|
|
745
|
+
const connectorHtml = !isLast && connector !== "none" ? `<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>` : "";
|
|
746
|
+
const stepHtml = `
|
|
747
|
+
<div class="flex flex-col items-center">
|
|
748
|
+
<div class="w-10 h-10 rounded-full ${classes.circle} flex items-center justify-center">
|
|
749
|
+
${getStepIcon(step, index)}
|
|
750
|
+
</div>
|
|
751
|
+
<div class="mt-2 text-center">
|
|
752
|
+
<div class="${classes.text} text-sm">${escapeHtml2(step.label)}</div>
|
|
753
|
+
${step.description ? `<p class="text-xs text-text-secondary mt-0.5 max-w-[120px]">${escapeHtml2(step.description)}</p>` : ""}
|
|
754
|
+
</div>
|
|
755
|
+
</div>
|
|
756
|
+
`;
|
|
757
|
+
const clickableStep = step.href && step.status === "completed" ? `<a href="${escapeHtml2(step.href)}" class="hover:opacity-80">${stepHtml}</a>` : stepHtml;
|
|
758
|
+
return `${clickableStep}${connectorHtml}`;
|
|
759
|
+
}).join("\n");
|
|
760
|
+
return `<div class="step-progress flex items-start ${className}">${stepsHtml}</div>`;
|
|
761
|
+
}
|
|
762
|
+
function circularProgress(options) {
|
|
763
|
+
const { value, size = 80, strokeWidth = 8, variant = "primary", showLabel = true, label, className = "" } = options;
|
|
764
|
+
const clampedValue = Math.min(100, Math.max(0, value));
|
|
765
|
+
const radius = (size - strokeWidth) / 2;
|
|
766
|
+
const circumference = radius * 2 * Math.PI;
|
|
767
|
+
const offset = circumference - clampedValue / 100 * circumference;
|
|
768
|
+
const variantColors = {
|
|
769
|
+
primary: "text-primary",
|
|
770
|
+
success: "text-success",
|
|
771
|
+
warning: "text-warning",
|
|
772
|
+
danger: "text-danger"
|
|
773
|
+
};
|
|
774
|
+
const displayLabel = label || `${Math.round(clampedValue)}%`;
|
|
775
|
+
return `<div class="circular-progress inline-flex items-center justify-center ${className}" style="width: ${size}px; height: ${size}px;">
|
|
776
|
+
<svg class="transform -rotate-90" width="${size}" height="${size}">
|
|
777
|
+
<!-- Background circle -->
|
|
778
|
+
<circle
|
|
779
|
+
cx="${size / 2}"
|
|
780
|
+
cy="${size / 2}"
|
|
781
|
+
r="${radius}"
|
|
782
|
+
fill="none"
|
|
783
|
+
stroke="currentColor"
|
|
784
|
+
stroke-width="${strokeWidth}"
|
|
785
|
+
class="text-gray-200"
|
|
786
|
+
/>
|
|
787
|
+
<!-- Progress circle -->
|
|
788
|
+
<circle
|
|
789
|
+
cx="${size / 2}"
|
|
790
|
+
cy="${size / 2}"
|
|
791
|
+
r="${radius}"
|
|
792
|
+
fill="none"
|
|
793
|
+
stroke="currentColor"
|
|
794
|
+
stroke-width="${strokeWidth}"
|
|
795
|
+
stroke-linecap="round"
|
|
796
|
+
class="${variantColors[variant]}"
|
|
797
|
+
style="stroke-dasharray: ${circumference}; stroke-dashoffset: ${offset}; transition: stroke-dashoffset 0.3s ease;"
|
|
798
|
+
/>
|
|
799
|
+
</svg>
|
|
800
|
+
${showLabel ? `<span class="absolute text-sm font-semibold text-text-primary">${escapeHtml2(displayLabel)}</span>` : ""}
|
|
801
|
+
</div>`;
|
|
802
|
+
}
|
|
803
|
+
function statusIndicator(options) {
|
|
804
|
+
const { status, label, size = "md", pulse = false, className = "" } = options;
|
|
805
|
+
const sizeClasses = {
|
|
806
|
+
sm: { dot: "w-2 h-2", text: "text-xs" },
|
|
807
|
+
md: { dot: "w-2.5 h-2.5", text: "text-sm" },
|
|
808
|
+
lg: { dot: "w-3 h-3", text: "text-base" }
|
|
809
|
+
};
|
|
810
|
+
const statusClasses = {
|
|
811
|
+
online: { color: "bg-success", label: "Online" },
|
|
812
|
+
offline: { color: "bg-gray-400", label: "Offline" },
|
|
813
|
+
busy: { color: "bg-danger", label: "Busy" },
|
|
814
|
+
away: { color: "bg-warning", label: "Away" },
|
|
815
|
+
loading: { color: "bg-blue-500", label: "Loading" },
|
|
816
|
+
error: { color: "bg-danger", label: "Error" },
|
|
817
|
+
success: { color: "bg-success", label: "Success" }
|
|
818
|
+
};
|
|
819
|
+
const statusInfo = statusClasses[status];
|
|
820
|
+
const sizeInfo = sizeClasses[size];
|
|
821
|
+
const displayLabel = label || statusInfo.label;
|
|
822
|
+
const pulseHtml = pulse || status === "loading" ? `<span class="absolute ${sizeInfo.dot} ${statusInfo.color} rounded-full animate-ping opacity-75"></span>` : "";
|
|
823
|
+
return `<div class="status-indicator inline-flex items-center gap-2 ${className}">
|
|
824
|
+
<span class="relative flex">
|
|
825
|
+
${pulseHtml}
|
|
826
|
+
<span class="relative ${sizeInfo.dot} ${statusInfo.color} rounded-full"></span>
|
|
827
|
+
</span>
|
|
828
|
+
${displayLabel ? `<span class="${sizeInfo.text} text-text-secondary">${escapeHtml2(displayLabel)}</span>` : ""}
|
|
829
|
+
</div>`;
|
|
830
|
+
}
|
|
831
|
+
function skeleton(options = {}) {
|
|
832
|
+
const { type = "text", width, height, lines = 3, animated = true, className = "" } = options;
|
|
833
|
+
const animateClass = animated ? "animate-pulse" : "";
|
|
834
|
+
const baseClass = `bg-gray-200 ${animateClass}`;
|
|
835
|
+
switch (type) {
|
|
836
|
+
case "circle":
|
|
837
|
+
return `<div class="${baseClass} rounded-full ${className}" style="width: ${width || "40px"}; height: ${height || "40px"}"></div>`;
|
|
838
|
+
case "rect":
|
|
839
|
+
return `<div class="${baseClass} rounded ${className}" style="width: ${width || "100%"}; height: ${height || "100px"}"></div>`;
|
|
840
|
+
case "card":
|
|
841
|
+
return `<div class="${animateClass} space-y-4 ${className}">
|
|
842
|
+
<div class="bg-gray-200 rounded h-40"></div>
|
|
843
|
+
<div class="space-y-2">
|
|
844
|
+
<div class="bg-gray-200 h-4 rounded w-3/4"></div>
|
|
845
|
+
<div class="bg-gray-200 h-4 rounded w-1/2"></div>
|
|
846
|
+
</div>
|
|
847
|
+
</div>`;
|
|
848
|
+
case "text":
|
|
849
|
+
default: {
|
|
850
|
+
const linesHtml = Array(lines).fill(0).map((_, i) => {
|
|
851
|
+
const lineWidth = i === lines - 1 ? "60%" : i === 0 ? "90%" : "80%";
|
|
852
|
+
return `<div class="bg-gray-200 h-4 rounded" style="width: ${lineWidth}"></div>`;
|
|
853
|
+
}).join("\n");
|
|
854
|
+
return `<div class="${animateClass} space-y-2 ${className}" style="width: ${width || "100%"}">
|
|
855
|
+
${linesHtml}
|
|
856
|
+
</div>`;
|
|
857
|
+
}
|
|
858
|
+
}
|
|
859
|
+
}
|
|
860
|
+
function contentSkeleton(options = {}) {
|
|
861
|
+
const { animated = true, className = "" } = options;
|
|
862
|
+
const animateClass = animated ? "animate-pulse" : "";
|
|
863
|
+
return `<div class="${animateClass} flex gap-4 ${className}">
|
|
864
|
+
<div class="bg-gray-200 rounded-full w-12 h-12 flex-shrink-0"></div>
|
|
865
|
+
<div class="flex-1 space-y-2 py-1">
|
|
866
|
+
<div class="bg-gray-200 h-4 rounded w-3/4"></div>
|
|
867
|
+
<div class="bg-gray-200 h-4 rounded w-1/2"></div>
|
|
868
|
+
</div>
|
|
869
|
+
</div>`;
|
|
870
|
+
}
|
|
871
|
+
export {
|
|
872
|
+
circularProgress,
|
|
873
|
+
codePreview,
|
|
874
|
+
contentSkeleton,
|
|
875
|
+
imagePreview,
|
|
876
|
+
progressBar,
|
|
877
|
+
resourceItem,
|
|
878
|
+
resourceList,
|
|
879
|
+
resourceWidget,
|
|
880
|
+
skeleton,
|
|
881
|
+
statusIndicator,
|
|
882
|
+
stepProgress
|
|
883
|
+
};
|