@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,248 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* @file fmcp-input.ts
|
|
4
|
+
* @description FrontMCP Input Web Component.
|
|
5
|
+
*
|
|
6
|
+
* A custom element wrapper around the input() HTML function.
|
|
7
|
+
*
|
|
8
|
+
* @example Basic usage
|
|
9
|
+
* ```html
|
|
10
|
+
* <fmcp-input name="email" type="email" label="Email Address"></fmcp-input>
|
|
11
|
+
* <fmcp-input name="password" type="password" label="Password" required></fmcp-input>
|
|
12
|
+
* ```
|
|
13
|
+
*
|
|
14
|
+
* @example With validation
|
|
15
|
+
* ```html
|
|
16
|
+
* <fmcp-input
|
|
17
|
+
* name="username"
|
|
18
|
+
* label="Username"
|
|
19
|
+
* helper="Choose a unique username"
|
|
20
|
+
* pattern="[a-z0-9]+"
|
|
21
|
+
* ></fmcp-input>
|
|
22
|
+
* ```
|
|
23
|
+
*
|
|
24
|
+
* @module @frontmcp/ui/web-components/elements/fmcp-input
|
|
25
|
+
*/
|
|
26
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
27
|
+
exports.FmcpInput = void 0;
|
|
28
|
+
exports.registerFmcpInput = registerFmcpInput;
|
|
29
|
+
const core_1 = require("../core");
|
|
30
|
+
const form_1 = require("../../components/form");
|
|
31
|
+
const form_schema_1 = require("../../components/form.schema");
|
|
32
|
+
/**
|
|
33
|
+
* FmcpInput Web Component
|
|
34
|
+
*/
|
|
35
|
+
class FmcpInput extends core_1.FmcpElement {
|
|
36
|
+
config = {
|
|
37
|
+
name: 'input',
|
|
38
|
+
schema: form_schema_1.InputOptionsSchema,
|
|
39
|
+
defaults: {
|
|
40
|
+
type: 'text',
|
|
41
|
+
size: 'md',
|
|
42
|
+
state: 'default',
|
|
43
|
+
},
|
|
44
|
+
};
|
|
45
|
+
static get observedAttributes() {
|
|
46
|
+
return [
|
|
47
|
+
'name',
|
|
48
|
+
'type',
|
|
49
|
+
'id',
|
|
50
|
+
'value',
|
|
51
|
+
'placeholder',
|
|
52
|
+
'label',
|
|
53
|
+
'helper',
|
|
54
|
+
'error',
|
|
55
|
+
'size',
|
|
56
|
+
'state',
|
|
57
|
+
'required',
|
|
58
|
+
'disabled',
|
|
59
|
+
'readonly',
|
|
60
|
+
'autocomplete',
|
|
61
|
+
'pattern',
|
|
62
|
+
'min',
|
|
63
|
+
'max',
|
|
64
|
+
'step',
|
|
65
|
+
'class',
|
|
66
|
+
'icon-before',
|
|
67
|
+
'icon-after',
|
|
68
|
+
'hx-get',
|
|
69
|
+
'hx-post',
|
|
70
|
+
'hx-target',
|
|
71
|
+
'hx-swap',
|
|
72
|
+
'hx-trigger',
|
|
73
|
+
];
|
|
74
|
+
}
|
|
75
|
+
renderHtml(options, _content) {
|
|
76
|
+
return (0, form_1.input)(options);
|
|
77
|
+
}
|
|
78
|
+
// ============================================
|
|
79
|
+
// Property Setters
|
|
80
|
+
// ============================================
|
|
81
|
+
set name(value) {
|
|
82
|
+
this._options.name = value;
|
|
83
|
+
this._scheduleRender();
|
|
84
|
+
}
|
|
85
|
+
get name() {
|
|
86
|
+
return this._options.name ?? '';
|
|
87
|
+
}
|
|
88
|
+
set type(value) {
|
|
89
|
+
this._options.type = value;
|
|
90
|
+
this._scheduleRender();
|
|
91
|
+
}
|
|
92
|
+
get type() {
|
|
93
|
+
return this._options.type;
|
|
94
|
+
}
|
|
95
|
+
set label(value) {
|
|
96
|
+
this._options.label = value;
|
|
97
|
+
this._scheduleRender();
|
|
98
|
+
}
|
|
99
|
+
get label() {
|
|
100
|
+
return this._options.label;
|
|
101
|
+
}
|
|
102
|
+
set placeholder(value) {
|
|
103
|
+
this._options.placeholder = value;
|
|
104
|
+
this._scheduleRender();
|
|
105
|
+
}
|
|
106
|
+
get placeholder() {
|
|
107
|
+
return this._options.placeholder;
|
|
108
|
+
}
|
|
109
|
+
set helper(value) {
|
|
110
|
+
this._options.helper = value;
|
|
111
|
+
this._scheduleRender();
|
|
112
|
+
}
|
|
113
|
+
get helper() {
|
|
114
|
+
return this._options.helper;
|
|
115
|
+
}
|
|
116
|
+
set error(value) {
|
|
117
|
+
this._options.error = value;
|
|
118
|
+
this._scheduleRender();
|
|
119
|
+
}
|
|
120
|
+
get error() {
|
|
121
|
+
return this._options.error;
|
|
122
|
+
}
|
|
123
|
+
set size(value) {
|
|
124
|
+
this._options.size = value;
|
|
125
|
+
this._scheduleRender();
|
|
126
|
+
}
|
|
127
|
+
get size() {
|
|
128
|
+
return this._options.size;
|
|
129
|
+
}
|
|
130
|
+
set state(value) {
|
|
131
|
+
this._options.state = value;
|
|
132
|
+
this._scheduleRender();
|
|
133
|
+
}
|
|
134
|
+
get state() {
|
|
135
|
+
return this._options.state;
|
|
136
|
+
}
|
|
137
|
+
set required(value) {
|
|
138
|
+
this._options.required = value;
|
|
139
|
+
this._scheduleRender();
|
|
140
|
+
}
|
|
141
|
+
get required() {
|
|
142
|
+
return this._options.required ?? false;
|
|
143
|
+
}
|
|
144
|
+
set disabled(value) {
|
|
145
|
+
this._options.disabled = value;
|
|
146
|
+
this._scheduleRender();
|
|
147
|
+
}
|
|
148
|
+
get disabled() {
|
|
149
|
+
return this._options.disabled ?? false;
|
|
150
|
+
}
|
|
151
|
+
set readonly(value) {
|
|
152
|
+
this._options.readonly = value;
|
|
153
|
+
this._scheduleRender();
|
|
154
|
+
}
|
|
155
|
+
get readonly() {
|
|
156
|
+
return this._options.readonly ?? false;
|
|
157
|
+
}
|
|
158
|
+
// ============================================
|
|
159
|
+
// Form Integration
|
|
160
|
+
// ============================================
|
|
161
|
+
connectedCallback() {
|
|
162
|
+
super.connectedCallback();
|
|
163
|
+
// Forward input/change events
|
|
164
|
+
this.addEventListener('input', this._handleInput.bind(this));
|
|
165
|
+
this.addEventListener('change', this._handleChange.bind(this));
|
|
166
|
+
}
|
|
167
|
+
_handleInput(e) {
|
|
168
|
+
const inputEl = this.querySelector('input');
|
|
169
|
+
if (inputEl && (e.target === inputEl || inputEl.contains(e.target))) {
|
|
170
|
+
this.dispatchEvent(new CustomEvent('fmcp:input', {
|
|
171
|
+
bubbles: true,
|
|
172
|
+
detail: { value: inputEl.value, name: this._options.name },
|
|
173
|
+
}));
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
_handleChange(e) {
|
|
177
|
+
const inputEl = this.querySelector('input');
|
|
178
|
+
if (inputEl && (e.target === inputEl || inputEl.contains(e.target))) {
|
|
179
|
+
this.dispatchEvent(new CustomEvent('fmcp:change', {
|
|
180
|
+
bubbles: true,
|
|
181
|
+
detail: { value: inputEl.value, name: this._options.name },
|
|
182
|
+
}));
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Get current input value.
|
|
187
|
+
*/
|
|
188
|
+
get value() {
|
|
189
|
+
const inputEl = this.querySelector('input');
|
|
190
|
+
return inputEl?.value ?? this._options.value ?? '';
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Set input value.
|
|
194
|
+
*/
|
|
195
|
+
set value(val) {
|
|
196
|
+
const inputEl = this.querySelector('input');
|
|
197
|
+
if (inputEl) {
|
|
198
|
+
inputEl.value = val;
|
|
199
|
+
}
|
|
200
|
+
this._options.value = val;
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Get validity state.
|
|
204
|
+
*/
|
|
205
|
+
get validity() {
|
|
206
|
+
return this.querySelector('input')?.validity;
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Check validity.
|
|
210
|
+
*/
|
|
211
|
+
checkValidity() {
|
|
212
|
+
return this.querySelector('input')?.checkValidity() ?? true;
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Report validity.
|
|
216
|
+
*/
|
|
217
|
+
reportValidity() {
|
|
218
|
+
return this.querySelector('input')?.reportValidity() ?? true;
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* Focus the input.
|
|
222
|
+
*/
|
|
223
|
+
focus() {
|
|
224
|
+
this.querySelector('input')?.focus();
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* Blur the input.
|
|
228
|
+
*/
|
|
229
|
+
blur() {
|
|
230
|
+
this.querySelector('input')?.blur();
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* Select all text.
|
|
234
|
+
*/
|
|
235
|
+
select() {
|
|
236
|
+
this.querySelector('input')?.select();
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
exports.FmcpInput = FmcpInput;
|
|
240
|
+
/**
|
|
241
|
+
* Register the fmcp-input custom element.
|
|
242
|
+
*/
|
|
243
|
+
function registerFmcpInput() {
|
|
244
|
+
if (typeof customElements !== 'undefined' && !customElements.get('fmcp-input')) {
|
|
245
|
+
customElements.define('fmcp-input', FmcpInput);
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
//# sourceMappingURL=fmcp-input.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fmcp-input.js","sourceRoot":"","sources":["../../../../src/web-components/elements/fmcp-input.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;;;AAwPH,8CAIC;AA1PD,kCAA+F;AAC/F,gDAAiE;AACjE,8DAAkE;AAElE;;GAEG;AACH,MAAa,SAAU,SAAQ,kBAAyB;IACnC,MAAM,GAAoC;QAC3D,IAAI,EAAE,OAAO;QACb,MAAM,EAAE,gCAAkB;QAC1B,QAAQ,EAAE;YACR,IAAI,EAAE,MAAM;YACZ,IAAI,EAAE,IAAI;YACV,KAAK,EAAE,SAAS;SACjB;KACF,CAAC;IAEF,MAAM,KAAK,kBAAkB;QAC3B,OAAO;YACL,MAAM;YACN,MAAM;YACN,IAAI;YACJ,OAAO;YACP,aAAa;YACb,OAAO;YACP,QAAQ;YACR,OAAO;YACP,MAAM;YACN,OAAO;YACP,UAAU;YACV,UAAU;YACV,UAAU;YACV,cAAc;YACd,SAAS;YACT,KAAK;YACL,KAAK;YACL,MAAM;YACN,OAAO;YACP,aAAa;YACb,YAAY;YACZ,QAAQ;YACR,SAAS;YACT,WAAW;YACX,SAAS;YACT,YAAY;SACb,CAAC;IACJ,CAAC;IAES,UAAU,CAAC,OAAqB,EAAE,QAAgB;QAC1D,OAAO,IAAA,YAAK,EAAC,OAAO,CAAC,CAAC;IACxB,CAAC;IAED,+CAA+C;IAC/C,mBAAmB;IACnB,+CAA+C;IAE/C,IAAI,IAAI,CAAC,KAAa;QACpB,IAAI,CAAC,QAAQ,CAAC,IAAI,GAAG,KAAK,CAAC;QAC3B,IAAI,CAAC,eAAe,EAAE,CAAC;IACzB,CAAC;IACD,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,IAAI,EAAE,CAAC;IAClC,CAAC;IAED,IAAI,IAAI,CAAC,KAA2B;QAClC,IAAI,CAAC,QAAQ,CAAC,IAAI,GAAG,KAAK,CAAC;QAC3B,IAAI,CAAC,eAAe,EAAE,CAAC;IACzB,CAAC;IACD,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;IAC5B,CAAC;IAED,IAAI,KAAK,CAAC,KAAyB;QACjC,IAAI,CAAC,QAAQ,CAAC,KAAK,GAAG,KAAK,CAAC;QAC5B,IAAI,CAAC,eAAe,EAAE,CAAC;IACzB,CAAC;IACD,IAAI,KAAK;QACP,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;IAC7B,CAAC;IAED,IAAI,WAAW,CAAC,KAAyB;QACvC,IAAI,CAAC,QAAQ,CAAC,WAAW,GAAG,KAAK,CAAC;QAClC,IAAI,CAAC,eAAe,EAAE,CAAC;IACzB,CAAC;IACD,IAAI,WAAW;QACb,OAAO,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC;IACnC,CAAC;IAED,IAAI,MAAM,CAAC,KAAyB;QAClC,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,KAAK,CAAC;QAC7B,IAAI,CAAC,eAAe,EAAE,CAAC;IACzB,CAAC;IACD,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;IAC9B,CAAC;IAED,IAAI,KAAK,CAAC,KAAyB;QACjC,IAAI,CAAC,QAAQ,CAAC,KAAK,GAAG,KAAK,CAAC;QAC5B,IAAI,CAAC,eAAe,EAAE,CAAC;IACzB,CAAC;IACD,IAAI,KAAK;QACP,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;IAC7B,CAAC;IAED,IAAI,IAAI,CAAC,KAA2B;QAClC,IAAI,CAAC,QAAQ,CAAC,IAAI,GAAG,KAAK,CAAC;QAC3B,IAAI,CAAC,eAAe,EAAE,CAAC;IACzB,CAAC;IACD,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;IAC5B,CAAC;IAED,IAAI,KAAK,CAAC,KAA4B;QACpC,IAAI,CAAC,QAAQ,CAAC,KAAK,GAAG,KAAK,CAAC;QAC5B,IAAI,CAAC,eAAe,EAAE,CAAC;IACzB,CAAC;IACD,IAAI,KAAK;QACP,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;IAC7B,CAAC;IAED,IAAI,QAAQ,CAAC,KAAc;QACzB,IAAI,CAAC,QAAQ,CAAC,QAAQ,GAAG,KAAK,CAAC;QAC/B,IAAI,CAAC,eAAe,EAAE,CAAC;IACzB,CAAC;IACD,IAAI,QAAQ;QACV,OAAO,IAAI,CAAC,QAAQ,CAAC,QAAQ,IAAI,KAAK,CAAC;IACzC,CAAC;IAED,IAAI,QAAQ,CAAC,KAAc;QACzB,IAAI,CAAC,QAAQ,CAAC,QAAQ,GAAG,KAAK,CAAC;QAC/B,IAAI,CAAC,eAAe,EAAE,CAAC;IACzB,CAAC;IACD,IAAI,QAAQ;QACV,OAAO,IAAI,CAAC,QAAQ,CAAC,QAAQ,IAAI,KAAK,CAAC;IACzC,CAAC;IAED,IAAI,QAAQ,CAAC,KAAc;QACzB,IAAI,CAAC,QAAQ,CAAC,QAAQ,GAAG,KAAK,CAAC;QAC/B,IAAI,CAAC,eAAe,EAAE,CAAC;IACzB,CAAC;IACD,IAAI,QAAQ;QACV,OAAO,IAAI,CAAC,QAAQ,CAAC,QAAQ,IAAI,KAAK,CAAC;IACzC,CAAC;IAED,+CAA+C;IAC/C,mBAAmB;IACnB,+CAA+C;IAEtC,iBAAiB;QACxB,KAAK,CAAC,iBAAiB,EAAE,CAAC;QAE1B,8BAA8B;QAC9B,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAC7D,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACjE,CAAC;IAEO,YAAY,CAAC,CAAQ;QAC3B,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;QAC5C,IAAI,OAAO,IAAI,CAAC,CAAC,CAAC,MAAM,KAAK,OAAO,IAAI,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAc,CAAC,CAAC,EAAE,CAAC;YAC5E,IAAI,CAAC,aAAa,CAChB,IAAI,WAAW,CAAC,YAAY,EAAE;gBAC5B,OAAO,EAAE,IAAI;gBACb,MAAM,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE;aAC3D,CAAC,CACH,CAAC;QACJ,CAAC;IACH,CAAC;IAEO,aAAa,CAAC,CAAQ;QAC5B,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;QAC5C,IAAI,OAAO,IAAI,CAAC,CAAC,CAAC,MAAM,KAAK,OAAO,IAAI,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAc,CAAC,CAAC,EAAE,CAAC;YAC5E,IAAI,CAAC,aAAa,CAChB,IAAI,WAAW,CAAC,aAAa,EAAE;gBAC7B,OAAO,EAAE,IAAI;gBACb,MAAM,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE;aAC3D,CAAC,CACH,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;OAEG;IACH,IAAI,KAAK;QACP,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;QAC5C,OAAO,OAAO,EAAE,KAAK,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,IAAI,EAAE,CAAC;IACrD,CAAC;IAED;;OAEG;IACH,IAAI,KAAK,CAAC,GAAW;QACnB,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;QAC5C,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,CAAC,KAAK,GAAG,GAAG,CAAC;QACtB,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,KAAK,GAAG,GAAG,CAAC;IAC5B,CAAC;IAED;;OAEG;IACH,IAAI,QAAQ;QACV,OAAO,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE,QAAQ,CAAC;IAC/C,CAAC;IAED;;OAEG;IACH,aAAa;QACX,OAAO,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE,aAAa,EAAE,IAAI,IAAI,CAAC;IAC9D,CAAC;IAED;;OAEG;IACH,cAAc;QACZ,OAAO,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE,cAAc,EAAE,IAAI,IAAI,CAAC;IAC/D,CAAC;IAED;;OAEG;IACM,KAAK;QACZ,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,CAAC;IACvC,CAAC;IAED;;OAEG;IACM,IAAI;QACX,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,CAAC;IACtC,CAAC;IAED;;OAEG;IACH,MAAM;QACJ,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACxC,CAAC;CACF;AA1OD,8BA0OC;AAED;;GAEG;AACH,SAAgB,iBAAiB;IAC/B,IAAI,OAAO,cAAc,KAAK,WAAW,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC;QAC/E,cAAc,CAAC,MAAM,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC;IACjD,CAAC;AACH,CAAC","sourcesContent":["/**\n * @file fmcp-input.ts\n * @description FrontMCP Input Web Component.\n *\n * A custom element wrapper around the input() HTML function.\n *\n * @example Basic usage\n * ```html\n * <fmcp-input name=\"email\" type=\"email\" label=\"Email Address\"></fmcp-input>\n * <fmcp-input name=\"password\" type=\"password\" label=\"Password\" required></fmcp-input>\n * ```\n *\n * @example With validation\n * ```html\n * <fmcp-input\n * name=\"username\"\n * label=\"Username\"\n * helper=\"Choose a unique username\"\n * pattern=\"[a-z0-9]+\"\n * ></fmcp-input>\n * ```\n *\n * @module @frontmcp/ui/web-components/elements/fmcp-input\n */\n\nimport { FmcpElement, type FmcpElementConfig, getObservedAttributesFromSchema } from '../core';\nimport { input, type InputOptions } from '../../components/form';\nimport { InputOptionsSchema } from '../../components/form.schema';\n\n/**\n * FmcpInput Web Component\n */\nexport class FmcpInput extends FmcpElement<InputOptions> {\n protected readonly config: FmcpElementConfig<InputOptions> = {\n name: 'input',\n schema: InputOptionsSchema,\n defaults: {\n type: 'text',\n size: 'md',\n state: 'default',\n },\n };\n\n static get observedAttributes(): string[] {\n return [\n 'name',\n 'type',\n 'id',\n 'value',\n 'placeholder',\n 'label',\n 'helper',\n 'error',\n 'size',\n 'state',\n 'required',\n 'disabled',\n 'readonly',\n 'autocomplete',\n 'pattern',\n 'min',\n 'max',\n 'step',\n 'class',\n 'icon-before',\n 'icon-after',\n 'hx-get',\n 'hx-post',\n 'hx-target',\n 'hx-swap',\n 'hx-trigger',\n ];\n }\n\n protected renderHtml(options: InputOptions, _content: string): string {\n return input(options);\n }\n\n // ============================================\n // Property Setters\n // ============================================\n\n set name(value: string) {\n this._options.name = value;\n this._scheduleRender();\n }\n get name(): string {\n return this._options.name ?? '';\n }\n\n set type(value: InputOptions['type']) {\n this._options.type = value;\n this._scheduleRender();\n }\n get type(): InputOptions['type'] {\n return this._options.type;\n }\n\n set label(value: string | undefined) {\n this._options.label = value;\n this._scheduleRender();\n }\n get label(): string | undefined {\n return this._options.label;\n }\n\n set placeholder(value: string | undefined) {\n this._options.placeholder = value;\n this._scheduleRender();\n }\n get placeholder(): string | undefined {\n return this._options.placeholder;\n }\n\n set helper(value: string | undefined) {\n this._options.helper = value;\n this._scheduleRender();\n }\n get helper(): string | undefined {\n return this._options.helper;\n }\n\n set error(value: string | undefined) {\n this._options.error = value;\n this._scheduleRender();\n }\n get error(): string | undefined {\n return this._options.error;\n }\n\n set size(value: InputOptions['size']) {\n this._options.size = value;\n this._scheduleRender();\n }\n get size(): InputOptions['size'] {\n return this._options.size;\n }\n\n set state(value: InputOptions['state']) {\n this._options.state = value;\n this._scheduleRender();\n }\n get state(): InputOptions['state'] {\n return this._options.state;\n }\n\n set required(value: boolean) {\n this._options.required = value;\n this._scheduleRender();\n }\n get required(): boolean {\n return this._options.required ?? false;\n }\n\n set disabled(value: boolean) {\n this._options.disabled = value;\n this._scheduleRender();\n }\n get disabled(): boolean {\n return this._options.disabled ?? false;\n }\n\n set readonly(value: boolean) {\n this._options.readonly = value;\n this._scheduleRender();\n }\n get readonly(): boolean {\n return this._options.readonly ?? false;\n }\n\n // ============================================\n // Form Integration\n // ============================================\n\n override connectedCallback(): void {\n super.connectedCallback();\n\n // Forward input/change events\n this.addEventListener('input', this._handleInput.bind(this));\n this.addEventListener('change', this._handleChange.bind(this));\n }\n\n private _handleInput(e: Event): void {\n const inputEl = this.querySelector('input');\n if (inputEl && (e.target === inputEl || inputEl.contains(e.target as Node))) {\n this.dispatchEvent(\n new CustomEvent('fmcp:input', {\n bubbles: true,\n detail: { value: inputEl.value, name: this._options.name },\n }),\n );\n }\n }\n\n private _handleChange(e: Event): void {\n const inputEl = this.querySelector('input');\n if (inputEl && (e.target === inputEl || inputEl.contains(e.target as Node))) {\n this.dispatchEvent(\n new CustomEvent('fmcp:change', {\n bubbles: true,\n detail: { value: inputEl.value, name: this._options.name },\n }),\n );\n }\n }\n\n /**\n * Get current input value.\n */\n get value(): string {\n const inputEl = this.querySelector('input');\n return inputEl?.value ?? this._options.value ?? '';\n }\n\n /**\n * Set input value.\n */\n set value(val: string) {\n const inputEl = this.querySelector('input');\n if (inputEl) {\n inputEl.value = val;\n }\n this._options.value = val;\n }\n\n /**\n * Get validity state.\n */\n get validity(): ValidityState | undefined {\n return this.querySelector('input')?.validity;\n }\n\n /**\n * Check validity.\n */\n checkValidity(): boolean {\n return this.querySelector('input')?.checkValidity() ?? true;\n }\n\n /**\n * Report validity.\n */\n reportValidity(): boolean {\n return this.querySelector('input')?.reportValidity() ?? true;\n }\n\n /**\n * Focus the input.\n */\n override focus(): void {\n this.querySelector('input')?.focus();\n }\n\n /**\n * Blur the input.\n */\n override blur(): void {\n this.querySelector('input')?.blur();\n }\n\n /**\n * Select all text.\n */\n select(): void {\n this.querySelector('input')?.select();\n }\n}\n\n/**\n * Register the fmcp-input custom element.\n */\nexport function registerFmcpInput(): void {\n if (typeof customElements !== 'undefined' && !customElements.get('fmcp-input')) {\n customElements.define('fmcp-input', FmcpInput);\n }\n}\n"]}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file fmcp-select.ts
|
|
3
|
+
* @description FrontMCP Select Web Component.
|
|
4
|
+
*
|
|
5
|
+
* A custom element wrapper around the select() HTML function.
|
|
6
|
+
*
|
|
7
|
+
* @example Basic usage
|
|
8
|
+
* ```html
|
|
9
|
+
* <fmcp-select name="country" label="Country" placeholder="Select a country">
|
|
10
|
+
* </fmcp-select>
|
|
11
|
+
* ```
|
|
12
|
+
*
|
|
13
|
+
* @example With options via property
|
|
14
|
+
* ```tsx
|
|
15
|
+
* const selectEl = document.querySelector('fmcp-select');
|
|
16
|
+
* selectEl.selectOptions = [
|
|
17
|
+
* { value: 'us', label: 'United States' },
|
|
18
|
+
* { value: 'uk', label: 'United Kingdom' },
|
|
19
|
+
* ];
|
|
20
|
+
* ```
|
|
21
|
+
*
|
|
22
|
+
* @module @frontmcp/ui/web-components/elements/fmcp-select
|
|
23
|
+
*/
|
|
24
|
+
import { FmcpElement, type FmcpElementConfig } from '../core';
|
|
25
|
+
import { type SelectOptions } from '../../components/form';
|
|
26
|
+
import { type SelectOptionItem } from '../../components/form.schema';
|
|
27
|
+
/**
|
|
28
|
+
* FmcpSelect Web Component
|
|
29
|
+
*/
|
|
30
|
+
export declare class FmcpSelect extends FmcpElement<SelectOptions> {
|
|
31
|
+
protected readonly config: FmcpElementConfig<SelectOptions>;
|
|
32
|
+
/** Select options stored separately since they're complex objects */
|
|
33
|
+
private _selectOptions;
|
|
34
|
+
static get observedAttributes(): string[];
|
|
35
|
+
protected renderHtml(options: SelectOptions, _content: string): string;
|
|
36
|
+
set name(value: string);
|
|
37
|
+
get name(): string;
|
|
38
|
+
set label(value: string | undefined);
|
|
39
|
+
get label(): string | undefined;
|
|
40
|
+
set placeholder(value: string | undefined);
|
|
41
|
+
get placeholder(): string | undefined;
|
|
42
|
+
set helper(value: string | undefined);
|
|
43
|
+
get helper(): string | undefined;
|
|
44
|
+
set error(value: string | undefined);
|
|
45
|
+
get error(): string | undefined;
|
|
46
|
+
set size(value: SelectOptions['size']);
|
|
47
|
+
get size(): SelectOptions['size'];
|
|
48
|
+
set state(value: SelectOptions['state']);
|
|
49
|
+
get state(): SelectOptions['state'];
|
|
50
|
+
set required(value: boolean);
|
|
51
|
+
get required(): boolean;
|
|
52
|
+
set disabled(value: boolean);
|
|
53
|
+
get disabled(): boolean;
|
|
54
|
+
set multiple(value: boolean);
|
|
55
|
+
get multiple(): boolean;
|
|
56
|
+
/**
|
|
57
|
+
* Set select options (array of { value, label, disabled?, selected? })
|
|
58
|
+
*/
|
|
59
|
+
set selectOptions(value: SelectOptionItem[]);
|
|
60
|
+
get selectOptions(): SelectOptionItem[];
|
|
61
|
+
connectedCallback(): void;
|
|
62
|
+
private _handleChange;
|
|
63
|
+
/**
|
|
64
|
+
* Get current select value.
|
|
65
|
+
*/
|
|
66
|
+
get value(): string;
|
|
67
|
+
/**
|
|
68
|
+
* Set select value.
|
|
69
|
+
*/
|
|
70
|
+
set value(val: string);
|
|
71
|
+
/**
|
|
72
|
+
* Get selected options (for multiple select).
|
|
73
|
+
*/
|
|
74
|
+
get selectedOptions(): string[];
|
|
75
|
+
/**
|
|
76
|
+
* Get validity state.
|
|
77
|
+
*/
|
|
78
|
+
get validity(): ValidityState | undefined;
|
|
79
|
+
/**
|
|
80
|
+
* Check validity.
|
|
81
|
+
*/
|
|
82
|
+
checkValidity(): boolean;
|
|
83
|
+
/**
|
|
84
|
+
* Report validity.
|
|
85
|
+
*/
|
|
86
|
+
reportValidity(): boolean;
|
|
87
|
+
/**
|
|
88
|
+
* Focus the select.
|
|
89
|
+
*/
|
|
90
|
+
focus(): void;
|
|
91
|
+
/**
|
|
92
|
+
* Blur the select.
|
|
93
|
+
*/
|
|
94
|
+
blur(): void;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Register the fmcp-select custom element.
|
|
98
|
+
*/
|
|
99
|
+
export declare function registerFmcpSelect(): void;
|
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* @file fmcp-select.ts
|
|
4
|
+
* @description FrontMCP Select Web Component.
|
|
5
|
+
*
|
|
6
|
+
* A custom element wrapper around the select() HTML function.
|
|
7
|
+
*
|
|
8
|
+
* @example Basic usage
|
|
9
|
+
* ```html
|
|
10
|
+
* <fmcp-select name="country" label="Country" placeholder="Select a country">
|
|
11
|
+
* </fmcp-select>
|
|
12
|
+
* ```
|
|
13
|
+
*
|
|
14
|
+
* @example With options via property
|
|
15
|
+
* ```tsx
|
|
16
|
+
* const selectEl = document.querySelector('fmcp-select');
|
|
17
|
+
* selectEl.selectOptions = [
|
|
18
|
+
* { value: 'us', label: 'United States' },
|
|
19
|
+
* { value: 'uk', label: 'United Kingdom' },
|
|
20
|
+
* ];
|
|
21
|
+
* ```
|
|
22
|
+
*
|
|
23
|
+
* @module @frontmcp/ui/web-components/elements/fmcp-select
|
|
24
|
+
*/
|
|
25
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
+
exports.FmcpSelect = void 0;
|
|
27
|
+
exports.registerFmcpSelect = registerFmcpSelect;
|
|
28
|
+
const core_1 = require("../core");
|
|
29
|
+
const form_1 = require("../../components/form");
|
|
30
|
+
const form_schema_1 = require("../../components/form.schema");
|
|
31
|
+
/**
|
|
32
|
+
* FmcpSelect Web Component
|
|
33
|
+
*/
|
|
34
|
+
class FmcpSelect extends core_1.FmcpElement {
|
|
35
|
+
config = {
|
|
36
|
+
name: 'select',
|
|
37
|
+
schema: form_schema_1.SelectOptionsSchema,
|
|
38
|
+
defaults: {
|
|
39
|
+
size: 'md',
|
|
40
|
+
state: 'default',
|
|
41
|
+
},
|
|
42
|
+
};
|
|
43
|
+
/** Select options stored separately since they're complex objects */
|
|
44
|
+
_selectOptions = [];
|
|
45
|
+
static get observedAttributes() {
|
|
46
|
+
return [
|
|
47
|
+
'name',
|
|
48
|
+
'id',
|
|
49
|
+
'value',
|
|
50
|
+
'placeholder',
|
|
51
|
+
'label',
|
|
52
|
+
'helper',
|
|
53
|
+
'error',
|
|
54
|
+
'size',
|
|
55
|
+
'state',
|
|
56
|
+
'required',
|
|
57
|
+
'disabled',
|
|
58
|
+
'multiple',
|
|
59
|
+
'class',
|
|
60
|
+
'hx-get',
|
|
61
|
+
'hx-post',
|
|
62
|
+
'hx-target',
|
|
63
|
+
'hx-swap',
|
|
64
|
+
'hx-trigger',
|
|
65
|
+
];
|
|
66
|
+
}
|
|
67
|
+
renderHtml(options, _content) {
|
|
68
|
+
// Merge stored select options
|
|
69
|
+
const mergedOptions = {
|
|
70
|
+
...options,
|
|
71
|
+
options: this._selectOptions.length > 0 ? this._selectOptions : options.options,
|
|
72
|
+
};
|
|
73
|
+
return (0, form_1.select)(mergedOptions);
|
|
74
|
+
}
|
|
75
|
+
// ============================================
|
|
76
|
+
// Property Setters
|
|
77
|
+
// ============================================
|
|
78
|
+
set name(value) {
|
|
79
|
+
this._options.name = value;
|
|
80
|
+
this._scheduleRender();
|
|
81
|
+
}
|
|
82
|
+
get name() {
|
|
83
|
+
return this._options.name ?? '';
|
|
84
|
+
}
|
|
85
|
+
set label(value) {
|
|
86
|
+
this._options.label = value;
|
|
87
|
+
this._scheduleRender();
|
|
88
|
+
}
|
|
89
|
+
get label() {
|
|
90
|
+
return this._options.label;
|
|
91
|
+
}
|
|
92
|
+
set placeholder(value) {
|
|
93
|
+
this._options.placeholder = value;
|
|
94
|
+
this._scheduleRender();
|
|
95
|
+
}
|
|
96
|
+
get placeholder() {
|
|
97
|
+
return this._options.placeholder;
|
|
98
|
+
}
|
|
99
|
+
set helper(value) {
|
|
100
|
+
this._options.helper = value;
|
|
101
|
+
this._scheduleRender();
|
|
102
|
+
}
|
|
103
|
+
get helper() {
|
|
104
|
+
return this._options.helper;
|
|
105
|
+
}
|
|
106
|
+
set error(value) {
|
|
107
|
+
this._options.error = value;
|
|
108
|
+
this._scheduleRender();
|
|
109
|
+
}
|
|
110
|
+
get error() {
|
|
111
|
+
return this._options.error;
|
|
112
|
+
}
|
|
113
|
+
set size(value) {
|
|
114
|
+
this._options.size = value;
|
|
115
|
+
this._scheduleRender();
|
|
116
|
+
}
|
|
117
|
+
get size() {
|
|
118
|
+
return this._options.size;
|
|
119
|
+
}
|
|
120
|
+
set state(value) {
|
|
121
|
+
this._options.state = value;
|
|
122
|
+
this._scheduleRender();
|
|
123
|
+
}
|
|
124
|
+
get state() {
|
|
125
|
+
return this._options.state;
|
|
126
|
+
}
|
|
127
|
+
set required(value) {
|
|
128
|
+
this._options.required = value;
|
|
129
|
+
this._scheduleRender();
|
|
130
|
+
}
|
|
131
|
+
get required() {
|
|
132
|
+
return this._options.required ?? false;
|
|
133
|
+
}
|
|
134
|
+
set disabled(value) {
|
|
135
|
+
this._options.disabled = value;
|
|
136
|
+
this._scheduleRender();
|
|
137
|
+
}
|
|
138
|
+
get disabled() {
|
|
139
|
+
return this._options.disabled ?? false;
|
|
140
|
+
}
|
|
141
|
+
set multiple(value) {
|
|
142
|
+
this._options.multiple = value;
|
|
143
|
+
this._scheduleRender();
|
|
144
|
+
}
|
|
145
|
+
get multiple() {
|
|
146
|
+
return this._options.multiple ?? false;
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Set select options (array of { value, label, disabled?, selected? })
|
|
150
|
+
*/
|
|
151
|
+
set selectOptions(value) {
|
|
152
|
+
this._selectOptions = value;
|
|
153
|
+
this._scheduleRender();
|
|
154
|
+
}
|
|
155
|
+
get selectOptions() {
|
|
156
|
+
return this._selectOptions;
|
|
157
|
+
}
|
|
158
|
+
// ============================================
|
|
159
|
+
// Form Integration
|
|
160
|
+
// ============================================
|
|
161
|
+
connectedCallback() {
|
|
162
|
+
super.connectedCallback();
|
|
163
|
+
// Forward change events
|
|
164
|
+
this.addEventListener('change', this._handleChange.bind(this));
|
|
165
|
+
}
|
|
166
|
+
_handleChange(e) {
|
|
167
|
+
const selectEl = this.querySelector('select');
|
|
168
|
+
if (selectEl && (e.target === selectEl || selectEl.contains(e.target))) {
|
|
169
|
+
this.dispatchEvent(new CustomEvent('fmcp:change', {
|
|
170
|
+
bubbles: true,
|
|
171
|
+
detail: {
|
|
172
|
+
value: selectEl.value,
|
|
173
|
+
name: this._options.name,
|
|
174
|
+
selectedOptions: Array.from(selectEl.selectedOptions).map((opt) => opt.value),
|
|
175
|
+
},
|
|
176
|
+
}));
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Get current select value.
|
|
181
|
+
*/
|
|
182
|
+
get value() {
|
|
183
|
+
const selectEl = this.querySelector('select');
|
|
184
|
+
return selectEl?.value ?? this._options.value ?? '';
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Set select value.
|
|
188
|
+
*/
|
|
189
|
+
set value(val) {
|
|
190
|
+
const selectEl = this.querySelector('select');
|
|
191
|
+
if (selectEl) {
|
|
192
|
+
selectEl.value = val;
|
|
193
|
+
}
|
|
194
|
+
this._options.value = val;
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Get selected options (for multiple select).
|
|
198
|
+
*/
|
|
199
|
+
get selectedOptions() {
|
|
200
|
+
const selectEl = this.querySelector('select');
|
|
201
|
+
return selectEl ? Array.from(selectEl.selectedOptions).map((opt) => opt.value) : [];
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Get validity state.
|
|
205
|
+
*/
|
|
206
|
+
get validity() {
|
|
207
|
+
return this.querySelector('select')?.validity;
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* Check validity.
|
|
211
|
+
*/
|
|
212
|
+
checkValidity() {
|
|
213
|
+
return this.querySelector('select')?.checkValidity() ?? true;
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Report validity.
|
|
217
|
+
*/
|
|
218
|
+
reportValidity() {
|
|
219
|
+
return this.querySelector('select')?.reportValidity() ?? true;
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Focus the select.
|
|
223
|
+
*/
|
|
224
|
+
focus() {
|
|
225
|
+
this.querySelector('select')?.focus();
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* Blur the select.
|
|
229
|
+
*/
|
|
230
|
+
blur() {
|
|
231
|
+
this.querySelector('select')?.blur();
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
exports.FmcpSelect = FmcpSelect;
|
|
235
|
+
/**
|
|
236
|
+
* Register the fmcp-select custom element.
|
|
237
|
+
*/
|
|
238
|
+
function registerFmcpSelect() {
|
|
239
|
+
if (typeof customElements !== 'undefined' && !customElements.get('fmcp-select')) {
|
|
240
|
+
customElements.define('fmcp-select', FmcpSelect);
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
//# sourceMappingURL=fmcp-select.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fmcp-select.js","sourceRoot":"","sources":["../../../../src/web-components/elements/fmcp-select.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @file fmcp-select.ts\n * @description FrontMCP Select Web Component.\n *\n * A custom element wrapper around the select() HTML function.\n *\n * @example Basic usage\n * ```html\n * <fmcp-select name=\"country\" label=\"Country\" placeholder=\"Select a country\">\n * </fmcp-select>\n * ```\n *\n * @example With options via property\n * ```tsx\n * const selectEl = document.querySelector('fmcp-select');\n * selectEl.selectOptions = [\n * { value: 'us', label: 'United States' },\n * { value: 'uk', label: 'United Kingdom' },\n * ];\n * ```\n *\n * @module @frontmcp/ui/web-components/elements/fmcp-select\n */\n\nimport { FmcpElement, type FmcpElementConfig, getObservedAttributesFromSchema } from '../core';\nimport { select, type SelectOptions } from '../../components/form';\nimport { SelectOptionsSchema, type SelectOptionItem } from '../../components/form.schema';\n\n/**\n * FmcpSelect Web Component\n */\nexport class FmcpSelect extends FmcpElement<SelectOptions> {\n protected readonly config: FmcpElementConfig<SelectOptions> = {\n name: 'select',\n schema: SelectOptionsSchema,\n defaults: {\n size: 'md',\n state: 'default',\n },\n };\n\n /** Select options stored separately since they're complex objects */\n private _selectOptions: SelectOptionItem[] = [];\n\n static get observedAttributes(): string[] {\n return [\n 'name',\n 'id',\n 'value',\n 'placeholder',\n 'label',\n 'helper',\n 'error',\n 'size',\n 'state',\n 'required',\n 'disabled',\n 'multiple',\n 'class',\n 'hx-get',\n 'hx-post',\n 'hx-target',\n 'hx-swap',\n 'hx-trigger',\n ];\n }\n\n protected renderHtml(options: SelectOptions, _content: string): string {\n // Merge stored select options\n const mergedOptions: SelectOptions = {\n ...options,\n options: this._selectOptions.length > 0 ? this._selectOptions : options.options,\n };\n return select(mergedOptions);\n }\n\n // ============================================\n // Property Setters\n // ============================================\n\n set name(value: string) {\n this._options.name = value;\n this._scheduleRender();\n }\n get name(): string {\n return this._options.name ?? '';\n }\n\n set label(value: string | undefined) {\n this._options.label = value;\n this._scheduleRender();\n }\n get label(): string | undefined {\n return this._options.label;\n }\n\n set placeholder(value: string | undefined) {\n this._options.placeholder = value;\n this._scheduleRender();\n }\n get placeholder(): string | undefined {\n return this._options.placeholder;\n }\n\n set helper(value: string | undefined) {\n this._options.helper = value;\n this._scheduleRender();\n }\n get helper(): string | undefined {\n return this._options.helper;\n }\n\n set error(value: string | undefined) {\n this._options.error = value;\n this._scheduleRender();\n }\n get error(): string | undefined {\n return this._options.error;\n }\n\n set size(value: SelectOptions['size']) {\n this._options.size = value;\n this._scheduleRender();\n }\n get size(): SelectOptions['size'] {\n return this._options.size;\n }\n\n set state(value: SelectOptions['state']) {\n this._options.state = value;\n this._scheduleRender();\n }\n get state(): SelectOptions['state'] {\n return this._options.state;\n }\n\n set required(value: boolean) {\n this._options.required = value;\n this._scheduleRender();\n }\n get required(): boolean {\n return this._options.required ?? false;\n }\n\n set disabled(value: boolean) {\n this._options.disabled = value;\n this._scheduleRender();\n }\n get disabled(): boolean {\n return this._options.disabled ?? false;\n }\n\n set multiple(value: boolean) {\n this._options.multiple = value;\n this._scheduleRender();\n }\n get multiple(): boolean {\n return this._options.multiple ?? false;\n }\n\n /**\n * Set select options (array of { value, label, disabled?, selected? })\n */\n set selectOptions(value: SelectOptionItem[]) {\n this._selectOptions = value;\n this._scheduleRender();\n }\n get selectOptions(): SelectOptionItem[] {\n return this._selectOptions;\n }\n\n // ============================================\n // Form Integration\n // ============================================\n\n override connectedCallback(): void {\n super.connectedCallback();\n\n // Forward change events\n this.addEventListener('change', this._handleChange.bind(this));\n }\n\n private _handleChange(e: Event): void {\n const selectEl = this.querySelector('select');\n if (selectEl && (e.target === selectEl || selectEl.contains(e.target as Node))) {\n this.dispatchEvent(\n new CustomEvent('fmcp:change', {\n bubbles: true,\n detail: {\n value: selectEl.value,\n name: this._options.name,\n selectedOptions: Array.from(selectEl.selectedOptions).map((opt) => opt.value),\n },\n }),\n );\n }\n }\n\n /**\n * Get current select value.\n */\n get value(): string {\n const selectEl = this.querySelector('select');\n return selectEl?.value ?? this._options.value ?? '';\n }\n\n /**\n * Set select value.\n */\n set value(val: string) {\n const selectEl = this.querySelector('select');\n if (selectEl) {\n selectEl.value = val;\n }\n this._options.value = val;\n }\n\n /**\n * Get selected options (for multiple select).\n */\n get selectedOptions(): string[] {\n const selectEl = this.querySelector('select');\n return selectEl ? Array.from(selectEl.selectedOptions).map((opt) => opt.value) : [];\n }\n\n /**\n * Get validity state.\n */\n get validity(): ValidityState | undefined {\n return this.querySelector('select')?.validity;\n }\n\n /**\n * Check validity.\n */\n checkValidity(): boolean {\n return this.querySelector('select')?.checkValidity() ?? true;\n }\n\n /**\n * Report validity.\n */\n reportValidity(): boolean {\n return this.querySelector('select')?.reportValidity() ?? true;\n }\n\n /**\n * Focus the select.\n */\n override focus(): void {\n this.querySelector('select')?.focus();\n }\n\n /**\n * Blur the select.\n */\n override blur(): void {\n this.querySelector('select')?.blur();\n }\n}\n\n/**\n * Register the fmcp-select custom element.\n */\nexport function registerFmcpSelect(): void {\n if (typeof customElements !== 'undefined' && !customElements.get('fmcp-select')) {\n customElements.define('fmcp-select', FmcpSelect);\n }\n}\n"]}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file elements/index.ts
|
|
3
|
+
* @description Barrel exports for FrontMCP Web Component elements.
|
|
4
|
+
*
|
|
5
|
+
* @module @frontmcp/ui/web-components/elements
|
|
6
|
+
*/
|
|
7
|
+
export { FmcpButton, registerFmcpButton } from './fmcp-button';
|
|
8
|
+
export { FmcpCard, registerFmcpCard } from './fmcp-card';
|
|
9
|
+
export { FmcpAlert, registerFmcpAlert } from './fmcp-alert';
|
|
10
|
+
export { FmcpBadge, registerFmcpBadge } from './fmcp-badge';
|
|
11
|
+
export { FmcpInput, registerFmcpInput } from './fmcp-input';
|
|
12
|
+
export { FmcpSelect, registerFmcpSelect } from './fmcp-select';
|