@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.
- package/LICENSE +201 -0
- package/README.md +438 -0
- package/package.json +147 -0
- package/src/adapters/index.d.ts +10 -0
- package/src/adapters/index.js +18 -0
- package/src/adapters/index.js.map +1 -0
- package/src/adapters/platform-meta.d.ts +165 -0
- package/src/adapters/platform-meta.js +310 -0
- package/src/adapters/platform-meta.js.map +1 -0
- package/src/base-template/bridge.d.ts +89 -0
- package/src/base-template/bridge.js +452 -0
- package/src/base-template/bridge.js.map +1 -0
- package/src/base-template/default-base-template.d.ts +91 -0
- package/src/base-template/default-base-template.js +435 -0
- package/src/base-template/default-base-template.js.map +1 -0
- package/src/base-template/index.d.ts +14 -0
- package/src/base-template/index.js +30 -0
- package/src/base-template/index.js.map +1 -0
- package/src/base-template/polyfills.d.ts +30 -0
- package/src/base-template/polyfills.js +190 -0
- package/src/base-template/polyfills.js.map +1 -0
- package/src/base-template/theme-styles.d.ts +73 -0
- package/src/base-template/theme-styles.js +95 -0
- package/src/base-template/theme-styles.js.map +1 -0
- package/src/bridge/adapters/base-adapter.d.ts +103 -0
- package/src/bridge/adapters/base-adapter.js +314 -0
- package/src/bridge/adapters/base-adapter.js.map +1 -0
- package/src/bridge/adapters/claude.adapter.d.ts +66 -0
- package/src/bridge/adapters/claude.adapter.js +145 -0
- package/src/bridge/adapters/claude.adapter.js.map +1 -0
- package/src/bridge/adapters/ext-apps.adapter.d.ts +142 -0
- package/src/bridge/adapters/ext-apps.adapter.js +416 -0
- package/src/bridge/adapters/ext-apps.adapter.js.map +1 -0
- package/src/bridge/adapters/gemini.adapter.d.ts +63 -0
- package/src/bridge/adapters/gemini.adapter.js +160 -0
- package/src/bridge/adapters/gemini.adapter.js.map +1 -0
- package/src/bridge/adapters/generic.adapter.d.ts +55 -0
- package/src/bridge/adapters/generic.adapter.js +108 -0
- package/src/bridge/adapters/generic.adapter.js.map +1 -0
- package/src/bridge/adapters/index.d.ts +25 -0
- package/src/bridge/adapters/index.js +65 -0
- package/src/bridge/adapters/index.js.map +1 -0
- package/src/bridge/adapters/openai.adapter.d.ts +64 -0
- package/src/bridge/adapters/openai.adapter.js +194 -0
- package/src/bridge/adapters/openai.adapter.js.map +1 -0
- package/src/bridge/core/adapter-registry.d.ts +121 -0
- package/src/bridge/core/adapter-registry.js +271 -0
- package/src/bridge/core/adapter-registry.js.map +1 -0
- package/src/bridge/core/bridge-factory.d.ts +198 -0
- package/src/bridge/core/bridge-factory.js +428 -0
- package/src/bridge/core/bridge-factory.js.map +1 -0
- package/src/bridge/core/index.d.ts +9 -0
- package/src/bridge/core/index.js +22 -0
- package/src/bridge/core/index.js.map +1 -0
- package/src/bridge/index.d.ts +61 -0
- package/src/bridge/index.js +94 -0
- package/src/bridge/index.js.map +1 -0
- package/src/bridge/runtime/iife-generator.d.ts +61 -0
- package/src/bridge/runtime/iife-generator.js +940 -0
- package/src/bridge/runtime/iife-generator.js.map +1 -0
- package/src/bridge/runtime/index.d.ts +8 -0
- package/src/bridge/runtime/index.js +16 -0
- package/src/bridge/runtime/index.js.map +1 -0
- package/src/bridge/types.d.ts +385 -0
- package/src/bridge/types.js +11 -0
- package/src/bridge/types.js.map +1 -0
- package/src/build/cdn-resources.d.ts +140 -0
- package/src/build/cdn-resources.js +314 -0
- package/src/build/cdn-resources.js.map +1 -0
- package/src/build/index.d.ts +294 -0
- package/src/build/index.js +325 -0
- package/src/build/index.js.map +1 -0
- package/src/build/widget-manifest.d.ts +212 -0
- package/src/build/widget-manifest.js +652 -0
- package/src/build/widget-manifest.js.map +1 -0
- package/src/bundler/bundler.d.ts +110 -0
- package/src/bundler/bundler.js +432 -0
- package/src/bundler/bundler.js.map +1 -0
- package/src/bundler/cache.d.ts +172 -0
- package/src/bundler/cache.js +250 -0
- package/src/bundler/cache.js.map +1 -0
- package/src/bundler/index.d.ts +41 -0
- package/src/bundler/index.js +73 -0
- package/src/bundler/index.js.map +1 -0
- package/src/bundler/sandbox/enclave-adapter.d.ts +120 -0
- package/src/bundler/sandbox/enclave-adapter.js +339 -0
- package/src/bundler/sandbox/enclave-adapter.js.map +1 -0
- package/src/bundler/sandbox/executor.d.ts +13 -0
- package/src/bundler/sandbox/executor.js +22 -0
- package/src/bundler/sandbox/executor.js.map +1 -0
- package/src/bundler/sandbox/policy.d.ts +61 -0
- package/src/bundler/sandbox/policy.js +238 -0
- package/src/bundler/sandbox/policy.js.map +1 -0
- package/src/bundler/types.d.ts +347 -0
- package/src/bundler/types.js +132 -0
- package/src/bundler/types.js.map +1 -0
- package/src/components/alert.d.ts +71 -0
- package/src/components/alert.js +189 -0
- package/src/components/alert.js.map +1 -0
- package/src/components/alert.schema.d.ts +114 -0
- package/src/components/alert.schema.js +105 -0
- package/src/components/alert.schema.js.map +1 -0
- package/src/components/avatar.d.ts +76 -0
- package/src/components/avatar.js +176 -0
- package/src/components/avatar.js.map +1 -0
- package/src/components/avatar.schema.d.ts +169 -0
- package/src/components/avatar.schema.js +103 -0
- package/src/components/avatar.schema.js.map +1 -0
- package/src/components/badge.d.ts +70 -0
- package/src/components/badge.js +149 -0
- package/src/components/badge.js.map +1 -0
- package/src/components/badge.schema.d.ts +109 -0
- package/src/components/badge.schema.js +96 -0
- package/src/components/badge.schema.js.map +1 -0
- package/src/components/button.d.ts +111 -0
- package/src/components/button.js +336 -0
- package/src/components/button.js.map +1 -0
- package/src/components/button.schema.d.ts +148 -0
- package/src/components/button.schema.js +121 -0
- package/src/components/button.schema.js.map +1 -0
- package/src/components/card.d.ts +60 -0
- package/src/components/card.js +117 -0
- package/src/components/card.js.map +1 -0
- package/src/components/card.schema.d.ts +113 -0
- package/src/components/card.schema.js +98 -0
- package/src/components/card.schema.js.map +1 -0
- package/src/components/form.d.ts +239 -0
- package/src/components/form.js +420 -0
- package/src/components/form.js.map +1 -0
- package/src/components/form.schema.d.ts +441 -0
- package/src/components/form.schema.js +406 -0
- package/src/components/form.schema.js.map +1 -0
- package/src/components/index.d.ts +29 -0
- package/src/components/index.js +98 -0
- package/src/components/index.js.map +1 -0
- package/src/components/list.d.ts +127 -0
- package/src/components/list.js +279 -0
- package/src/components/list.js.map +1 -0
- package/src/components/list.schema.d.ts +134 -0
- package/src/components/list.schema.js +168 -0
- package/src/components/list.schema.js.map +1 -0
- package/src/components/modal.d.ts +111 -0
- package/src/components/modal.js +260 -0
- package/src/components/modal.js.map +1 -0
- package/src/components/modal.schema.d.ts +186 -0
- package/src/components/modal.schema.js +167 -0
- package/src/components/modal.schema.js.map +1 -0
- package/src/components/table.d.ts +105 -0
- package/src/components/table.js +283 -0
- package/src/components/table.js.map +1 -0
- package/src/components/table.schema.d.ts +159 -0
- package/src/components/table.schema.js +173 -0
- package/src/components/table.schema.js.map +1 -0
- package/src/handlebars/helpers.d.ts +348 -0
- package/src/handlebars/helpers.js +605 -0
- package/src/handlebars/helpers.js.map +1 -0
- package/src/handlebars/index.d.ts +193 -0
- package/src/handlebars/index.js +350 -0
- package/src/handlebars/index.js.map +1 -0
- package/src/index.d.ts +50 -0
- package/src/index.js +192 -0
- package/src/index.js.map +1 -0
- package/src/layouts/base.d.ts +88 -0
- package/src/layouts/base.js +227 -0
- package/src/layouts/base.js.map +1 -0
- package/src/layouts/index.d.ts +7 -0
- package/src/layouts/index.js +25 -0
- package/src/layouts/index.js.map +1 -0
- package/src/layouts/presets.d.ts +133 -0
- package/src/layouts/presets.js +277 -0
- package/src/layouts/presets.js.map +1 -0
- package/src/pages/consent.d.ts +116 -0
- package/src/pages/consent.js +218 -0
- package/src/pages/consent.js.map +1 -0
- package/src/pages/error.d.ts +100 -0
- package/src/pages/error.js +263 -0
- package/src/pages/error.js.map +1 -0
- package/src/pages/index.d.ts +8 -0
- package/src/pages/index.js +27 -0
- package/src/pages/index.js.map +1 -0
- package/src/react/Alert.d.ts +101 -0
- package/src/react/Alert.js +51 -0
- package/src/react/Alert.js.map +1 -0
- package/src/react/Badge.d.ts +100 -0
- package/src/react/Badge.js +55 -0
- package/src/react/Badge.js.map +1 -0
- package/src/react/Button.d.ts +108 -0
- package/src/react/Button.js +52 -0
- package/src/react/Button.js.map +1 -0
- package/src/react/Card.d.ts +103 -0
- package/src/react/Card.js +55 -0
- package/src/react/Card.js.map +1 -0
- package/src/react/hooks/context.d.ts +178 -0
- package/src/react/hooks/context.js +287 -0
- package/src/react/hooks/context.js.map +1 -0
- package/src/react/hooks/index.d.ts +41 -0
- package/src/react/hooks/index.js +61 -0
- package/src/react/hooks/index.js.map +1 -0
- package/src/react/hooks/tools.d.ts +283 -0
- package/src/react/hooks/tools.js +465 -0
- package/src/react/hooks/tools.js.map +1 -0
- package/src/react/index.d.ts +80 -0
- package/src/react/index.js +113 -0
- package/src/react/index.js.map +1 -0
- package/src/react/types.d.ts +105 -0
- package/src/react/types.js +12 -0
- package/src/react/types.js.map +1 -0
- package/src/react/utils.d.ts +42 -0
- package/src/react/utils.js +99 -0
- package/src/react/utils.js.map +1 -0
- package/src/registry/index.d.ts +45 -0
- package/src/registry/index.js +67 -0
- package/src/registry/index.js.map +1 -0
- package/src/registry/render-template.d.ts +86 -0
- package/src/registry/render-template.js +239 -0
- package/src/registry/render-template.js.map +1 -0
- package/src/registry/tool-ui.registry.d.ts +260 -0
- package/src/registry/tool-ui.registry.js +438 -0
- package/src/registry/tool-ui.registry.js.map +1 -0
- package/src/registry/uri-utils.d.ts +55 -0
- package/src/registry/uri-utils.js +97 -0
- package/src/registry/uri-utils.js.map +1 -0
- package/src/render/index.d.ts +7 -0
- package/src/render/index.js +14 -0
- package/src/render/index.js.map +1 -0
- package/src/render/prerender.d.ts +56 -0
- package/src/render/prerender.js +98 -0
- package/src/render/prerender.js.map +1 -0
- package/src/renderers/cache.d.ts +144 -0
- package/src/renderers/cache.js +240 -0
- package/src/renderers/cache.js.map +1 -0
- package/src/renderers/html.renderer.d.ts +122 -0
- package/src/renderers/html.renderer.js +204 -0
- package/src/renderers/html.renderer.js.map +1 -0
- package/src/renderers/index.d.ts +35 -0
- package/src/renderers/index.js +70 -0
- package/src/renderers/index.js.map +1 -0
- package/src/renderers/mdx.renderer.d.ts +119 -0
- package/src/renderers/mdx.renderer.js +305 -0
- package/src/renderers/mdx.renderer.js.map +1 -0
- package/src/renderers/react.renderer.d.ts +95 -0
- package/src/renderers/react.renderer.js +260 -0
- package/src/renderers/react.renderer.js.map +1 -0
- package/src/renderers/registry.d.ts +133 -0
- package/src/renderers/registry.js +232 -0
- package/src/renderers/registry.js.map +1 -0
- package/src/renderers/types.d.ts +341 -0
- package/src/renderers/types.js +9 -0
- package/src/renderers/types.js.map +1 -0
- package/src/renderers/utils/detect.d.ts +106 -0
- package/src/renderers/utils/detect.js +267 -0
- package/src/renderers/utils/detect.js.map +1 -0
- package/src/renderers/utils/hash.d.ts +39 -0
- package/src/renderers/utils/hash.js +75 -0
- package/src/renderers/utils/hash.js.map +1 -0
- package/src/renderers/utils/index.d.ts +8 -0
- package/src/renderers/utils/index.js +28 -0
- package/src/renderers/utils/index.js.map +1 -0
- package/src/renderers/utils/transpiler.d.ts +88 -0
- package/src/renderers/utils/transpiler.js +215 -0
- package/src/renderers/utils/transpiler.js.map +1 -0
- package/src/runtime/adapters/html.adapter.d.ts +58 -0
- package/src/runtime/adapters/html.adapter.js +131 -0
- package/src/runtime/adapters/html.adapter.js.map +1 -0
- package/src/runtime/adapters/index.d.ts +25 -0
- package/src/runtime/adapters/index.js +54 -0
- package/src/runtime/adapters/index.js.map +1 -0
- package/src/runtime/adapters/mdx.adapter.d.ts +72 -0
- package/src/runtime/adapters/mdx.adapter.js +241 -0
- package/src/runtime/adapters/mdx.adapter.js.map +1 -0
- package/src/runtime/adapters/react.adapter.d.ts +69 -0
- package/src/runtime/adapters/react.adapter.js +245 -0
- package/src/runtime/adapters/react.adapter.js.map +1 -0
- package/src/runtime/adapters/types.d.ts +94 -0
- package/src/runtime/adapters/types.js +11 -0
- package/src/runtime/adapters/types.js.map +1 -0
- package/src/runtime/csp.d.ts +37 -0
- package/src/runtime/csp.js +140 -0
- package/src/runtime/csp.js.map +1 -0
- package/src/runtime/index.d.ts +16 -0
- package/src/runtime/index.js +72 -0
- package/src/runtime/index.js.map +1 -0
- package/src/runtime/mcp-bridge.d.ts +100 -0
- package/src/runtime/mcp-bridge.js +581 -0
- package/src/runtime/mcp-bridge.js.map +1 -0
- package/src/runtime/renderer-runtime.d.ts +132 -0
- package/src/runtime/renderer-runtime.js +389 -0
- package/src/runtime/renderer-runtime.js.map +1 -0
- package/src/runtime/sanitizer.d.ts +171 -0
- package/src/runtime/sanitizer.js +318 -0
- package/src/runtime/sanitizer.js.map +1 -0
- package/src/runtime/types.d.ts +414 -0
- package/src/runtime/types.js +12 -0
- package/src/runtime/types.js.map +1 -0
- package/src/runtime/wrapper.d.ts +375 -0
- package/src/runtime/wrapper.js +1793 -0
- package/src/runtime/wrapper.js.map +1 -0
- package/src/styles/index.d.ts +7 -0
- package/src/styles/index.js +11 -0
- package/src/styles/index.js.map +1 -0
- package/src/styles/variants.d.ts +50 -0
- package/src/styles/variants.js +175 -0
- package/src/styles/variants.js.map +1 -0
- package/src/theme/cdn.d.ts +194 -0
- package/src/theme/cdn.js +375 -0
- package/src/theme/cdn.js.map +1 -0
- package/src/theme/index.d.ts +17 -0
- package/src/theme/index.js +57 -0
- package/src/theme/index.js.map +1 -0
- package/src/theme/platforms.d.ts +106 -0
- package/src/theme/platforms.js +161 -0
- package/src/theme/platforms.js.map +1 -0
- package/src/theme/presets/github-openai.d.ts +49 -0
- package/src/theme/presets/github-openai.js +189 -0
- package/src/theme/presets/github-openai.js.map +1 -0
- package/src/theme/presets/index.d.ts +10 -0
- package/src/theme/presets/index.js +17 -0
- package/src/theme/presets/index.js.map +1 -0
- package/src/theme/theme.d.ts +395 -0
- package/src/theme/theme.js +332 -0
- package/src/theme/theme.js.map +1 -0
- package/src/tool-template/builder.d.ts +212 -0
- package/src/tool-template/builder.js +397 -0
- package/src/tool-template/builder.js.map +1 -0
- package/src/tool-template/index.d.ts +15 -0
- package/src/tool-template/index.js +38 -0
- package/src/tool-template/index.js.map +1 -0
- package/src/types/index.d.ts +13 -0
- package/src/types/index.js +26 -0
- package/src/types/index.js.map +1 -0
- package/src/types/ui-config.d.ts +357 -0
- package/src/types/ui-config.js +12 -0
- package/src/types/ui-config.js.map +1 -0
- package/src/types/ui-runtime.d.ts +965 -0
- package/src/types/ui-runtime.js +117 -0
- package/src/types/ui-runtime.js.map +1 -0
- package/src/validation/error-box.d.ts +55 -0
- package/src/validation/error-box.js +75 -0
- package/src/validation/error-box.js.map +1 -0
- package/src/validation/index.d.ts +12 -0
- package/src/validation/index.js +21 -0
- package/src/validation/index.js.map +1 -0
- package/src/validation/wrapper.d.ts +96 -0
- package/src/validation/wrapper.js +117 -0
- package/src/validation/wrapper.js.map +1 -0
- package/src/web-components/core/attribute-parser.d.ts +85 -0
- package/src/web-components/core/attribute-parser.js +189 -0
- package/src/web-components/core/attribute-parser.js.map +1 -0
- package/src/web-components/core/base-element.d.ts +197 -0
- package/src/web-components/core/base-element.js +289 -0
- package/src/web-components/core/base-element.js.map +1 -0
- package/src/web-components/core/index.d.ts +8 -0
- package/src/web-components/core/index.js +18 -0
- package/src/web-components/core/index.js.map +1 -0
- package/src/web-components/elements/fmcp-alert.d.ts +45 -0
- package/src/web-components/elements/fmcp-alert.js +93 -0
- package/src/web-components/elements/fmcp-alert.js.map +1 -0
- package/src/web-components/elements/fmcp-badge.d.ts +46 -0
- package/src/web-components/elements/fmcp-badge.js +99 -0
- package/src/web-components/elements/fmcp-badge.js.map +1 -0
- package/src/web-components/elements/fmcp-button.d.ts +124 -0
- package/src/web-components/elements/fmcp-button.js +233 -0
- package/src/web-components/elements/fmcp-button.js.map +1 -0
- package/src/web-components/elements/fmcp-card.d.ts +52 -0
- package/src/web-components/elements/fmcp-card.js +115 -0
- package/src/web-components/elements/fmcp-card.js.map +1 -0
- package/src/web-components/elements/fmcp-input.d.ts +95 -0
- package/src/web-components/elements/fmcp-input.js +248 -0
- package/src/web-components/elements/fmcp-input.js.map +1 -0
- package/src/web-components/elements/fmcp-select.d.ts +99 -0
- package/src/web-components/elements/fmcp-select.js +243 -0
- package/src/web-components/elements/fmcp-select.js.map +1 -0
- package/src/web-components/elements/index.d.ts +12 -0
- package/src/web-components/elements/index.js +34 -0
- package/src/web-components/elements/index.js.map +1 -0
- package/src/web-components/index.d.ts +49 -0
- package/src/web-components/index.js +75 -0
- package/src/web-components/index.js.map +1 -0
- package/src/web-components/register.d.ts +56 -0
- package/src/web-components/register.js +80 -0
- package/src/web-components/register.js.map +1 -0
- package/src/web-components/types.d.ts +121 -0
- package/src/web-components/types.js +25 -0
- package/src/web-components/types.js.map +1 -0
- package/src/widgets/index.d.ts +7 -0
- package/src/widgets/index.js +24 -0
- package/src/widgets/index.js.map +1 -0
- package/src/widgets/progress.d.ts +132 -0
- package/src/widgets/progress.js +303 -0
- package/src/widgets/progress.js.map +1 -0
- package/src/widgets/resource.d.ts +162 -0
- package/src/widgets/resource.js +340 -0
- 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;
|