@frontmcp/ui 0.6.0 → 0.6.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +140 -362
- package/bridge/core/bridge-factory.d.ts +1 -0
- package/bridge/core/bridge-factory.d.ts.map +1 -1
- package/bridge/index.d.ts +1 -1
- package/bridge/index.d.ts.map +1 -1
- package/bridge/index.js +39 -881
- package/bridge/runtime/index.d.ts +2 -1
- package/bridge/runtime/index.d.ts.map +1 -1
- package/bundler/browser-components.d.ts +42 -0
- package/bundler/browser-components.d.ts.map +1 -0
- package/bundler/bundler.d.ts +78 -4
- package/bundler/bundler.d.ts.map +1 -1
- package/bundler/index.d.ts +8 -8
- package/bundler/index.d.ts.map +1 -1
- package/bundler/index.js +1411 -2997
- package/bundler/types.d.ts +188 -7
- package/bundler/types.d.ts.map +1 -1
- package/components/alert.schema.d.ts +6 -6
- package/components/avatar.schema.d.ts +9 -9
- package/components/badge.schema.d.ts +9 -9
- package/components/button.schema.d.ts +9 -9
- package/components/card.schema.d.ts +7 -7
- package/components/form.schema.d.ts +24 -24
- package/components/index.js +128 -198
- package/components/modal.schema.d.ts +8 -8
- package/components/table.schema.d.ts +6 -6
- package/esm/bridge/{index.js → index.mjs} +40 -877
- package/esm/bundler/index.mjs +3136 -0
- package/esm/components/{index.js → index.mjs} +136 -196
- package/esm/index.mjs +5450 -0
- package/esm/layouts/index.mjs +409 -0
- package/esm/package.json +15 -32
- package/esm/react/{index.js → index.mjs} +71 -260
- package/esm/renderers/index.mjs +611 -0
- package/esm/universal/index.mjs +1951 -0
- package/esm/web-components/{index.js → index.mjs} +232 -287
- package/index.d.ts +22 -41
- package/index.d.ts.map +1 -1
- package/index.js +4286 -19607
- package/layouts/base.d.ts +2 -2
- package/layouts/base.d.ts.map +1 -1
- package/layouts/index.js +46 -539
- package/layouts/presets.d.ts.map +1 -1
- package/package.json +15 -32
- package/react/Alert.d.ts +1 -2
- package/react/Alert.d.ts.map +1 -1
- package/react/Badge.d.ts +1 -2
- package/react/Badge.d.ts.map +1 -1
- package/react/Button.d.ts +1 -2
- package/react/Button.d.ts.map +1 -1
- package/react/Card.d.ts +1 -2
- package/react/Card.d.ts.map +1 -1
- package/react/hooks/context.d.ts +1 -1
- package/react/hooks/context.d.ts.map +1 -1
- package/react/index.d.ts +5 -7
- package/react/index.d.ts.map +1 -1
- package/react/index.js +55 -269
- package/react/types.d.ts +1 -2
- package/react/types.d.ts.map +1 -1
- package/renderers/index.d.ts +15 -25
- package/renderers/index.d.ts.map +1 -1
- package/renderers/index.js +393 -1619
- package/renderers/mdx.renderer.d.ts +13 -34
- package/renderers/mdx.renderer.d.ts.map +1 -1
- package/{esm/runtime/adapters → renderers}/react.adapter.d.ts +2 -2
- package/renderers/react.adapter.d.ts.map +1 -0
- package/renderers/react.renderer.d.ts +25 -16
- package/renderers/react.renderer.d.ts.map +1 -1
- package/renderers/transpiler.d.ts +49 -0
- package/renderers/transpiler.d.ts.map +1 -0
- package/universal/cached-runtime.d.ts +25 -1
- package/universal/cached-runtime.d.ts.map +1 -1
- package/universal/index.js +2037 -0
- package/universal/runtime-builder.d.ts.map +1 -1
- package/universal/types.d.ts.map +1 -1
- package/web-components/elements/fmcp-input.d.ts.map +1 -1
- package/web-components/elements/fmcp-select.d.ts.map +1 -1
- package/web-components/index.d.ts +0 -1
- package/web-components/index.d.ts.map +1 -1
- package/web-components/index.js +224 -289
- package/adapters/index.d.ts +0 -13
- package/adapters/index.d.ts.map +0 -1
- package/adapters/index.js +0 -462
- package/adapters/platform-meta.d.ts +0 -166
- package/adapters/platform-meta.d.ts.map +0 -1
- package/adapters/response-builder.d.ts +0 -108
- package/adapters/response-builder.d.ts.map +0 -1
- package/adapters/serving-mode.d.ts +0 -107
- package/adapters/serving-mode.d.ts.map +0 -1
- package/base-template/bridge.d.ts +0 -90
- package/base-template/bridge.d.ts.map +0 -1
- package/base-template/default-base-template.d.ts +0 -92
- package/base-template/default-base-template.d.ts.map +0 -1
- package/base-template/index.d.ts +0 -15
- package/base-template/index.d.ts.map +0 -1
- package/base-template/index.js +0 -1398
- package/base-template/polyfills.d.ts +0 -31
- package/base-template/polyfills.d.ts.map +0 -1
- package/base-template/theme-styles.d.ts +0 -74
- package/base-template/theme-styles.d.ts.map +0 -1
- package/build/cdn-resources.d.ts +0 -243
- package/build/cdn-resources.d.ts.map +0 -1
- package/build/index.d.ts +0 -295
- package/build/index.d.ts.map +0 -1
- package/build/index.js +0 -7096
- package/build/widget-manifest.d.ts +0 -362
- package/build/widget-manifest.d.ts.map +0 -1
- package/bundler/cache.d.ts +0 -173
- package/bundler/cache.d.ts.map +0 -1
- package/bundler/file-cache/component-builder.d.ts +0 -167
- package/bundler/file-cache/component-builder.d.ts.map +0 -1
- package/bundler/file-cache/hash-calculator.d.ts +0 -155
- package/bundler/file-cache/hash-calculator.d.ts.map +0 -1
- package/bundler/file-cache/index.d.ts +0 -12
- package/bundler/file-cache/index.d.ts.map +0 -1
- package/bundler/file-cache/storage/filesystem.d.ts +0 -149
- package/bundler/file-cache/storage/filesystem.d.ts.map +0 -1
- package/bundler/file-cache/storage/index.d.ts +0 -11
- package/bundler/file-cache/storage/index.d.ts.map +0 -1
- package/bundler/file-cache/storage/interface.d.ts +0 -152
- package/bundler/file-cache/storage/interface.d.ts.map +0 -1
- package/bundler/file-cache/storage/redis.d.ts +0 -139
- package/bundler/file-cache/storage/redis.d.ts.map +0 -1
- package/bundler/sandbox/enclave-adapter.d.ts +0 -121
- package/bundler/sandbox/enclave-adapter.d.ts.map +0 -1
- package/bundler/sandbox/executor.d.ts +0 -14
- package/bundler/sandbox/executor.d.ts.map +0 -1
- package/bundler/sandbox/policy.d.ts +0 -62
- package/bundler/sandbox/policy.d.ts.map +0 -1
- package/dependency/cdn-registry.d.ts +0 -98
- package/dependency/cdn-registry.d.ts.map +0 -1
- package/dependency/import-map.d.ts +0 -186
- package/dependency/import-map.d.ts.map +0 -1
- package/dependency/import-parser.d.ts +0 -82
- package/dependency/import-parser.d.ts.map +0 -1
- package/dependency/index.d.ts +0 -17
- package/dependency/index.d.ts.map +0 -1
- package/dependency/resolver.d.ts +0 -164
- package/dependency/resolver.d.ts.map +0 -1
- package/dependency/schemas.d.ts +0 -486
- package/dependency/schemas.d.ts.map +0 -1
- package/dependency/template-loader.d.ts +0 -204
- package/dependency/template-loader.d.ts.map +0 -1
- package/dependency/template-processor.d.ts +0 -118
- package/dependency/template-processor.d.ts.map +0 -1
- package/dependency/types.d.ts +0 -739
- package/dependency/types.d.ts.map +0 -1
- package/esm/adapters/index.d.ts +0 -13
- package/esm/adapters/index.d.ts.map +0 -1
- package/esm/adapters/index.js +0 -427
- package/esm/adapters/platform-meta.d.ts +0 -166
- package/esm/adapters/platform-meta.d.ts.map +0 -1
- package/esm/adapters/response-builder.d.ts +0 -108
- package/esm/adapters/response-builder.d.ts.map +0 -1
- package/esm/adapters/serving-mode.d.ts +0 -107
- package/esm/adapters/serving-mode.d.ts.map +0 -1
- package/esm/base-template/bridge.d.ts +0 -90
- package/esm/base-template/bridge.d.ts.map +0 -1
- package/esm/base-template/default-base-template.d.ts +0 -92
- package/esm/base-template/default-base-template.d.ts.map +0 -1
- package/esm/base-template/index.d.ts +0 -15
- package/esm/base-template/index.d.ts.map +0 -1
- package/esm/base-template/index.js +0 -1364
- package/esm/base-template/polyfills.d.ts +0 -31
- package/esm/base-template/polyfills.d.ts.map +0 -1
- package/esm/base-template/theme-styles.d.ts +0 -74
- package/esm/base-template/theme-styles.d.ts.map +0 -1
- package/esm/bridge/adapters/base-adapter.d.ts +0 -104
- package/esm/bridge/adapters/base-adapter.d.ts.map +0 -1
- package/esm/bridge/adapters/claude.adapter.d.ts +0 -67
- package/esm/bridge/adapters/claude.adapter.d.ts.map +0 -1
- package/esm/bridge/adapters/ext-apps.adapter.d.ts +0 -143
- package/esm/bridge/adapters/ext-apps.adapter.d.ts.map +0 -1
- package/esm/bridge/adapters/gemini.adapter.d.ts +0 -64
- package/esm/bridge/adapters/gemini.adapter.d.ts.map +0 -1
- package/esm/bridge/adapters/generic.adapter.d.ts +0 -56
- package/esm/bridge/adapters/generic.adapter.d.ts.map +0 -1
- package/esm/bridge/adapters/index.d.ts +0 -26
- package/esm/bridge/adapters/index.d.ts.map +0 -1
- package/esm/bridge/adapters/openai.adapter.d.ts +0 -65
- package/esm/bridge/adapters/openai.adapter.d.ts.map +0 -1
- package/esm/bridge/core/adapter-registry.d.ts +0 -122
- package/esm/bridge/core/adapter-registry.d.ts.map +0 -1
- package/esm/bridge/core/bridge-factory.d.ts +0 -199
- package/esm/bridge/core/bridge-factory.d.ts.map +0 -1
- package/esm/bridge/core/index.d.ts +0 -10
- package/esm/bridge/core/index.d.ts.map +0 -1
- package/esm/bridge/index.d.ts +0 -62
- package/esm/bridge/index.d.ts.map +0 -1
- package/esm/bridge/runtime/iife-generator.d.ts +0 -62
- package/esm/bridge/runtime/iife-generator.d.ts.map +0 -1
- package/esm/bridge/runtime/index.d.ts +0 -9
- package/esm/bridge/runtime/index.d.ts.map +0 -1
- package/esm/bridge/types.d.ts +0 -386
- package/esm/bridge/types.d.ts.map +0 -1
- package/esm/build/cdn-resources.d.ts +0 -243
- package/esm/build/cdn-resources.d.ts.map +0 -1
- package/esm/build/index.d.ts +0 -295
- package/esm/build/index.d.ts.map +0 -1
- package/esm/build/index.js +0 -7021
- package/esm/build/widget-manifest.d.ts +0 -362
- package/esm/build/widget-manifest.d.ts.map +0 -1
- package/esm/bundler/bundler.d.ts +0 -208
- package/esm/bundler/bundler.d.ts.map +0 -1
- package/esm/bundler/cache.d.ts +0 -173
- package/esm/bundler/cache.d.ts.map +0 -1
- package/esm/bundler/file-cache/component-builder.d.ts +0 -167
- package/esm/bundler/file-cache/component-builder.d.ts.map +0 -1
- package/esm/bundler/file-cache/hash-calculator.d.ts +0 -155
- package/esm/bundler/file-cache/hash-calculator.d.ts.map +0 -1
- package/esm/bundler/file-cache/index.d.ts +0 -12
- package/esm/bundler/file-cache/index.d.ts.map +0 -1
- package/esm/bundler/file-cache/storage/filesystem.d.ts +0 -149
- package/esm/bundler/file-cache/storage/filesystem.d.ts.map +0 -1
- package/esm/bundler/file-cache/storage/index.d.ts +0 -11
- package/esm/bundler/file-cache/storage/index.d.ts.map +0 -1
- package/esm/bundler/file-cache/storage/interface.d.ts +0 -152
- package/esm/bundler/file-cache/storage/interface.d.ts.map +0 -1
- package/esm/bundler/file-cache/storage/redis.d.ts +0 -139
- package/esm/bundler/file-cache/storage/redis.d.ts.map +0 -1
- package/esm/bundler/index.d.ts +0 -43
- package/esm/bundler/index.d.ts.map +0 -1
- package/esm/bundler/index.js +0 -4687
- package/esm/bundler/sandbox/enclave-adapter.d.ts +0 -121
- package/esm/bundler/sandbox/enclave-adapter.d.ts.map +0 -1
- package/esm/bundler/sandbox/executor.d.ts +0 -14
- package/esm/bundler/sandbox/executor.d.ts.map +0 -1
- package/esm/bundler/sandbox/policy.d.ts +0 -62
- package/esm/bundler/sandbox/policy.d.ts.map +0 -1
- package/esm/bundler/types.d.ts +0 -702
- package/esm/bundler/types.d.ts.map +0 -1
- package/esm/components/alert.d.ts +0 -66
- package/esm/components/alert.d.ts.map +0 -1
- package/esm/components/alert.schema.d.ts +0 -98
- package/esm/components/alert.schema.d.ts.map +0 -1
- package/esm/components/avatar.d.ts +0 -77
- package/esm/components/avatar.d.ts.map +0 -1
- package/esm/components/avatar.schema.d.ts +0 -170
- package/esm/components/avatar.schema.d.ts.map +0 -1
- package/esm/components/badge.d.ts +0 -64
- package/esm/components/badge.d.ts.map +0 -1
- package/esm/components/badge.schema.d.ts +0 -91
- package/esm/components/badge.schema.d.ts.map +0 -1
- package/esm/components/button.d.ts +0 -100
- package/esm/components/button.d.ts.map +0 -1
- package/esm/components/button.schema.d.ts +0 -120
- package/esm/components/button.schema.d.ts.map +0 -1
- package/esm/components/card.d.ts +0 -53
- package/esm/components/card.d.ts.map +0 -1
- package/esm/components/card.schema.d.ts +0 -93
- package/esm/components/card.schema.d.ts.map +0 -1
- package/esm/components/form.d.ts +0 -212
- package/esm/components/form.d.ts.map +0 -1
- package/esm/components/form.schema.d.ts +0 -365
- package/esm/components/form.schema.d.ts.map +0 -1
- package/esm/components/index.d.ts +0 -29
- package/esm/components/index.d.ts.map +0 -1
- package/esm/components/list.d.ts +0 -121
- package/esm/components/list.d.ts.map +0 -1
- package/esm/components/list.schema.d.ts +0 -129
- package/esm/components/list.schema.d.ts.map +0 -1
- package/esm/components/modal.d.ts +0 -100
- package/esm/components/modal.d.ts.map +0 -1
- package/esm/components/modal.schema.d.ts +0 -151
- package/esm/components/modal.schema.d.ts.map +0 -1
- package/esm/components/table.d.ts +0 -91
- package/esm/components/table.d.ts.map +0 -1
- package/esm/components/table.schema.d.ts +0 -123
- package/esm/components/table.schema.d.ts.map +0 -1
- package/esm/dependency/cdn-registry.d.ts +0 -98
- package/esm/dependency/cdn-registry.d.ts.map +0 -1
- package/esm/dependency/import-map.d.ts +0 -186
- package/esm/dependency/import-map.d.ts.map +0 -1
- package/esm/dependency/import-parser.d.ts +0 -82
- package/esm/dependency/import-parser.d.ts.map +0 -1
- package/esm/dependency/index.d.ts +0 -17
- package/esm/dependency/index.d.ts.map +0 -1
- package/esm/dependency/resolver.d.ts +0 -164
- package/esm/dependency/resolver.d.ts.map +0 -1
- package/esm/dependency/schemas.d.ts +0 -486
- package/esm/dependency/schemas.d.ts.map +0 -1
- package/esm/dependency/template-loader.d.ts +0 -204
- package/esm/dependency/template-loader.d.ts.map +0 -1
- package/esm/dependency/template-processor.d.ts +0 -118
- package/esm/dependency/template-processor.d.ts.map +0 -1
- package/esm/dependency/types.d.ts +0 -739
- package/esm/dependency/types.d.ts.map +0 -1
- package/esm/handlebars/expression-extractor.d.ts +0 -147
- package/esm/handlebars/expression-extractor.d.ts.map +0 -1
- package/esm/handlebars/helpers.d.ts +0 -339
- package/esm/handlebars/helpers.d.ts.map +0 -1
- package/esm/handlebars/index.d.ts +0 -195
- package/esm/handlebars/index.d.ts.map +0 -1
- package/esm/handlebars/index.js +0 -587
- package/esm/index.d.ts +0 -56
- package/esm/index.d.ts.map +0 -1
- package/esm/index.js +0 -20511
- package/esm/layouts/base.d.ts +0 -86
- package/esm/layouts/base.d.ts.map +0 -1
- package/esm/layouts/index.d.ts +0 -8
- package/esm/layouts/index.d.ts.map +0 -1
- package/esm/layouts/index.js +0 -892
- package/esm/layouts/presets.d.ts +0 -134
- package/esm/layouts/presets.d.ts.map +0 -1
- package/esm/pages/consent.d.ts +0 -117
- package/esm/pages/consent.d.ts.map +0 -1
- package/esm/pages/error.d.ts +0 -101
- package/esm/pages/error.d.ts.map +0 -1
- package/esm/pages/index.d.ts +0 -9
- package/esm/pages/index.d.ts.map +0 -1
- package/esm/pages/index.js +0 -1563
- package/esm/react/Alert.d.ts +0 -102
- package/esm/react/Alert.d.ts.map +0 -1
- package/esm/react/Badge.d.ts +0 -101
- package/esm/react/Badge.d.ts.map +0 -1
- package/esm/react/Button.d.ts +0 -109
- package/esm/react/Button.d.ts.map +0 -1
- package/esm/react/Card.d.ts +0 -104
- package/esm/react/Card.d.ts.map +0 -1
- package/esm/react/hooks/context.d.ts +0 -179
- package/esm/react/hooks/context.d.ts.map +0 -1
- package/esm/react/hooks/index.d.ts +0 -42
- package/esm/react/hooks/index.d.ts.map +0 -1
- package/esm/react/hooks/tools.d.ts +0 -284
- package/esm/react/hooks/tools.d.ts.map +0 -1
- package/esm/react/index.d.ts +0 -81
- package/esm/react/index.d.ts.map +0 -1
- package/esm/react/types.d.ts +0 -106
- package/esm/react/types.d.ts.map +0 -1
- package/esm/react/utils.d.ts +0 -43
- package/esm/react/utils.d.ts.map +0 -1
- package/esm/registry/index.d.ts +0 -46
- package/esm/registry/index.d.ts.map +0 -1
- package/esm/registry/index.js +0 -6422
- package/esm/registry/render-template.d.ts +0 -91
- package/esm/registry/render-template.d.ts.map +0 -1
- package/esm/registry/tool-ui.registry.d.ts +0 -294
- package/esm/registry/tool-ui.registry.d.ts.map +0 -1
- package/esm/registry/uri-utils.d.ts +0 -56
- package/esm/registry/uri-utils.d.ts.map +0 -1
- package/esm/render/index.d.ts +0 -8
- package/esm/render/index.d.ts.map +0 -1
- package/esm/render/prerender.d.ts +0 -57
- package/esm/render/prerender.d.ts.map +0 -1
- package/esm/renderers/cache.d.ts +0 -145
- package/esm/renderers/cache.d.ts.map +0 -1
- package/esm/renderers/html.renderer.d.ts +0 -123
- package/esm/renderers/html.renderer.d.ts.map +0 -1
- package/esm/renderers/index.d.ts +0 -36
- package/esm/renderers/index.d.ts.map +0 -1
- package/esm/renderers/index.js +0 -1827
- package/esm/renderers/mdx.renderer.d.ts +0 -120
- package/esm/renderers/mdx.renderer.d.ts.map +0 -1
- package/esm/renderers/react.renderer.d.ts +0 -96
- package/esm/renderers/react.renderer.d.ts.map +0 -1
- package/esm/renderers/registry.d.ts +0 -134
- package/esm/renderers/registry.d.ts.map +0 -1
- package/esm/renderers/types.d.ts +0 -342
- package/esm/renderers/types.d.ts.map +0 -1
- package/esm/renderers/utils/detect.d.ts +0 -107
- package/esm/renderers/utils/detect.d.ts.map +0 -1
- package/esm/renderers/utils/hash.d.ts +0 -40
- package/esm/renderers/utils/hash.d.ts.map +0 -1
- package/esm/renderers/utils/index.d.ts +0 -9
- package/esm/renderers/utils/index.d.ts.map +0 -1
- package/esm/renderers/utils/transpiler.d.ts +0 -89
- package/esm/renderers/utils/transpiler.d.ts.map +0 -1
- package/esm/runtime/adapters/html.adapter.d.ts +0 -59
- package/esm/runtime/adapters/html.adapter.d.ts.map +0 -1
- package/esm/runtime/adapters/index.d.ts +0 -26
- package/esm/runtime/adapters/index.d.ts.map +0 -1
- package/esm/runtime/adapters/mdx.adapter.d.ts +0 -73
- package/esm/runtime/adapters/mdx.adapter.d.ts.map +0 -1
- package/esm/runtime/adapters/react.adapter.d.ts.map +0 -1
- package/esm/runtime/adapters/types.d.ts +0 -95
- package/esm/runtime/adapters/types.d.ts.map +0 -1
- package/esm/runtime/csp.d.ts +0 -48
- package/esm/runtime/csp.d.ts.map +0 -1
- package/esm/runtime/index.d.ts +0 -17
- package/esm/runtime/index.d.ts.map +0 -1
- package/esm/runtime/index.js +0 -5186
- package/esm/runtime/mcp-bridge.d.ts +0 -101
- package/esm/runtime/mcp-bridge.d.ts.map +0 -1
- package/esm/runtime/renderer-runtime.d.ts +0 -133
- package/esm/runtime/renderer-runtime.d.ts.map +0 -1
- package/esm/runtime/sanitizer.d.ts +0 -172
- package/esm/runtime/sanitizer.d.ts.map +0 -1
- package/esm/runtime/types.d.ts +0 -415
- package/esm/runtime/types.d.ts.map +0 -1
- package/esm/runtime/wrapper.d.ts +0 -421
- package/esm/runtime/wrapper.d.ts.map +0 -1
- package/esm/styles/index.d.ts +0 -8
- package/esm/styles/index.d.ts.map +0 -1
- package/esm/styles/index.js +0 -171
- package/esm/styles/variants.d.ts +0 -51
- package/esm/styles/variants.d.ts.map +0 -1
- package/esm/theme/cdn.d.ts +0 -195
- package/esm/theme/cdn.d.ts.map +0 -1
- package/esm/theme/index.d.ts +0 -18
- package/esm/theme/index.d.ts.map +0 -1
- package/esm/theme/index.js +0 -700
- package/esm/theme/platforms.d.ts +0 -107
- package/esm/theme/platforms.d.ts.map +0 -1
- package/esm/theme/presets/github-openai.d.ts +0 -50
- package/esm/theme/presets/github-openai.d.ts.map +0 -1
- package/esm/theme/presets/index.d.ts +0 -11
- package/esm/theme/presets/index.d.ts.map +0 -1
- package/esm/theme/theme.d.ts +0 -396
- package/esm/theme/theme.d.ts.map +0 -1
- package/esm/tool-template/builder.d.ts +0 -213
- package/esm/tool-template/builder.d.ts.map +0 -1
- package/esm/tool-template/index.d.ts +0 -16
- package/esm/tool-template/index.d.ts.map +0 -1
- package/esm/tool-template/index.js +0 -3515
- package/esm/types/index.d.ts +0 -14
- package/esm/types/index.d.ts.map +0 -1
- package/esm/types/index.js +0 -75
- package/esm/types/ui-config.d.ts +0 -639
- package/esm/types/ui-config.d.ts.map +0 -1
- package/esm/types/ui-runtime.d.ts +0 -1007
- package/esm/types/ui-runtime.d.ts.map +0 -1
- package/esm/typings/cache/cache-adapter.d.ts +0 -125
- package/esm/typings/cache/cache-adapter.d.ts.map +0 -1
- package/esm/typings/cache/index.d.ts +0 -10
- package/esm/typings/cache/index.d.ts.map +0 -1
- package/esm/typings/cache/memory-cache.d.ts +0 -92
- package/esm/typings/cache/memory-cache.d.ts.map +0 -1
- package/esm/typings/dts-parser.d.ts +0 -90
- package/esm/typings/dts-parser.d.ts.map +0 -1
- package/esm/typings/index.d.ts +0 -48
- package/esm/typings/index.d.ts.map +0 -1
- package/esm/typings/schemas.d.ts +0 -232
- package/esm/typings/schemas.d.ts.map +0 -1
- package/esm/typings/type-fetcher.d.ts +0 -89
- package/esm/typings/type-fetcher.d.ts.map +0 -1
- package/esm/typings/types.d.ts +0 -320
- package/esm/typings/types.d.ts.map +0 -1
- package/esm/universal/UniversalApp.d.ts +0 -108
- package/esm/universal/UniversalApp.d.ts.map +0 -1
- package/esm/universal/cached-runtime.d.ts +0 -115
- package/esm/universal/cached-runtime.d.ts.map +0 -1
- package/esm/universal/context.d.ts +0 -122
- package/esm/universal/context.d.ts.map +0 -1
- package/esm/universal/index.d.ts +0 -57
- package/esm/universal/index.d.ts.map +0 -1
- package/esm/universal/renderers/html.renderer.d.ts +0 -37
- package/esm/universal/renderers/html.renderer.d.ts.map +0 -1
- package/esm/universal/renderers/index.d.ts +0 -112
- package/esm/universal/renderers/index.d.ts.map +0 -1
- package/esm/universal/renderers/markdown.renderer.d.ts +0 -33
- package/esm/universal/renderers/markdown.renderer.d.ts.map +0 -1
- package/esm/universal/renderers/mdx.renderer.d.ts +0 -38
- package/esm/universal/renderers/mdx.renderer.d.ts.map +0 -1
- package/esm/universal/renderers/react.renderer.d.ts +0 -46
- package/esm/universal/renderers/react.renderer.d.ts.map +0 -1
- package/esm/universal/runtime-builder.d.ts +0 -33
- package/esm/universal/runtime-builder.d.ts.map +0 -1
- package/esm/universal/store.d.ts +0 -135
- package/esm/universal/store.d.ts.map +0 -1
- package/esm/universal/types.d.ts +0 -199
- package/esm/universal/types.d.ts.map +0 -1
- package/esm/utils/escape-html.d.ts +0 -58
- package/esm/utils/escape-html.d.ts.map +0 -1
- package/esm/utils/index.d.ts +0 -10
- package/esm/utils/index.d.ts.map +0 -1
- package/esm/utils/index.js +0 -40
- package/esm/utils/safe-stringify.d.ts +0 -30
- package/esm/utils/safe-stringify.d.ts.map +0 -1
- package/esm/validation/error-box.d.ts +0 -56
- package/esm/validation/error-box.d.ts.map +0 -1
- package/esm/validation/index.d.ts +0 -13
- package/esm/validation/index.d.ts.map +0 -1
- package/esm/validation/index.js +0 -562
- package/esm/validation/schema-paths.d.ts +0 -118
- package/esm/validation/schema-paths.d.ts.map +0 -1
- package/esm/validation/template-validator.d.ts +0 -143
- package/esm/validation/template-validator.d.ts.map +0 -1
- package/esm/validation/wrapper.d.ts +0 -97
- package/esm/validation/wrapper.d.ts.map +0 -1
- package/esm/web-components/core/attribute-parser.d.ts +0 -82
- package/esm/web-components/core/attribute-parser.d.ts.map +0 -1
- package/esm/web-components/core/base-element.d.ts +0 -197
- package/esm/web-components/core/base-element.d.ts.map +0 -1
- package/esm/web-components/core/index.d.ts +0 -9
- package/esm/web-components/core/index.d.ts.map +0 -1
- package/esm/web-components/elements/fmcp-alert.d.ts +0 -46
- package/esm/web-components/elements/fmcp-alert.d.ts.map +0 -1
- package/esm/web-components/elements/fmcp-badge.d.ts +0 -47
- package/esm/web-components/elements/fmcp-badge.d.ts.map +0 -1
- package/esm/web-components/elements/fmcp-button.d.ts +0 -117
- package/esm/web-components/elements/fmcp-button.d.ts.map +0 -1
- package/esm/web-components/elements/fmcp-card.d.ts +0 -53
- package/esm/web-components/elements/fmcp-card.d.ts.map +0 -1
- package/esm/web-components/elements/fmcp-input.d.ts +0 -96
- package/esm/web-components/elements/fmcp-input.d.ts.map +0 -1
- package/esm/web-components/elements/fmcp-select.d.ts +0 -100
- package/esm/web-components/elements/fmcp-select.d.ts.map +0 -1
- package/esm/web-components/elements/index.d.ts +0 -13
- package/esm/web-components/elements/index.d.ts.map +0 -1
- package/esm/web-components/index.d.ts +0 -50
- package/esm/web-components/index.d.ts.map +0 -1
- package/esm/web-components/register.d.ts +0 -57
- package/esm/web-components/register.d.ts.map +0 -1
- package/esm/web-components/types.d.ts +0 -122
- package/esm/web-components/types.d.ts.map +0 -1
- package/esm/widgets/index.d.ts +0 -8
- package/esm/widgets/index.d.ts.map +0 -1
- package/esm/widgets/index.js +0 -941
- package/esm/widgets/progress.d.ts +0 -133
- package/esm/widgets/progress.d.ts.map +0 -1
- package/esm/widgets/resource.d.ts +0 -163
- package/esm/widgets/resource.d.ts.map +0 -1
- package/handlebars/expression-extractor.d.ts +0 -147
- package/handlebars/expression-extractor.d.ts.map +0 -1
- package/handlebars/helpers.d.ts +0 -339
- package/handlebars/helpers.d.ts.map +0 -1
- package/handlebars/index.d.ts +0 -195
- package/handlebars/index.d.ts.map +0 -1
- package/handlebars/index.js +0 -666
- package/pages/consent.d.ts +0 -117
- package/pages/consent.d.ts.map +0 -1
- package/pages/error.d.ts +0 -101
- package/pages/error.d.ts.map +0 -1
- package/pages/index.d.ts +0 -9
- package/pages/index.d.ts.map +0 -1
- package/pages/index.js +0 -1602
- package/react/utils.d.ts +0 -43
- package/react/utils.d.ts.map +0 -1
- package/registry/index.d.ts +0 -46
- package/registry/index.d.ts.map +0 -1
- package/registry/index.js +0 -6465
- package/registry/render-template.d.ts +0 -91
- package/registry/render-template.d.ts.map +0 -1
- package/registry/tool-ui.registry.d.ts +0 -294
- package/registry/tool-ui.registry.d.ts.map +0 -1
- package/registry/uri-utils.d.ts +0 -56
- package/registry/uri-utils.d.ts.map +0 -1
- package/renderers/cache.d.ts +0 -145
- package/renderers/cache.d.ts.map +0 -1
- package/renderers/html.renderer.d.ts +0 -123
- package/renderers/html.renderer.d.ts.map +0 -1
- package/renderers/registry.d.ts +0 -134
- package/renderers/registry.d.ts.map +0 -1
- package/renderers/types.d.ts +0 -342
- package/renderers/types.d.ts.map +0 -1
- package/renderers/utils/detect.d.ts +0 -107
- package/renderers/utils/detect.d.ts.map +0 -1
- package/renderers/utils/hash.d.ts +0 -40
- package/renderers/utils/hash.d.ts.map +0 -1
- package/renderers/utils/index.d.ts +0 -9
- package/renderers/utils/index.d.ts.map +0 -1
- package/renderers/utils/transpiler.d.ts +0 -89
- package/renderers/utils/transpiler.d.ts.map +0 -1
- package/runtime/adapters/html.adapter.d.ts +0 -59
- package/runtime/adapters/html.adapter.d.ts.map +0 -1
- package/runtime/adapters/index.d.ts +0 -26
- package/runtime/adapters/index.d.ts.map +0 -1
- package/runtime/adapters/mdx.adapter.d.ts +0 -73
- package/runtime/adapters/mdx.adapter.d.ts.map +0 -1
- package/runtime/adapters/react.adapter.d.ts +0 -70
- package/runtime/adapters/react.adapter.d.ts.map +0 -1
- package/runtime/adapters/types.d.ts +0 -95
- package/runtime/adapters/types.d.ts.map +0 -1
- package/runtime/csp.d.ts +0 -48
- package/runtime/csp.d.ts.map +0 -1
- package/runtime/index.d.ts +0 -17
- package/runtime/index.d.ts.map +0 -1
- package/runtime/index.js +0 -5264
- package/runtime/mcp-bridge.d.ts +0 -101
- package/runtime/mcp-bridge.d.ts.map +0 -1
- package/runtime/renderer-runtime.d.ts +0 -133
- package/runtime/renderer-runtime.d.ts.map +0 -1
- package/runtime/sanitizer.d.ts +0 -172
- package/runtime/sanitizer.d.ts.map +0 -1
- package/runtime/types.d.ts +0 -415
- package/runtime/types.d.ts.map +0 -1
- package/runtime/wrapper.d.ts +0 -421
- package/runtime/wrapper.d.ts.map +0 -1
- package/styles/index.d.ts +0 -8
- package/styles/index.d.ts.map +0 -1
- package/styles/index.js +0 -222
- package/styles/variants.d.ts +0 -51
- package/styles/variants.d.ts.map +0 -1
- package/theme/cdn.d.ts +0 -195
- package/theme/cdn.d.ts.map +0 -1
- package/theme/index.d.ts +0 -18
- package/theme/index.d.ts.map +0 -1
- package/theme/index.js +0 -757
- package/theme/platforms.d.ts +0 -107
- package/theme/platforms.d.ts.map +0 -1
- package/theme/presets/github-openai.d.ts +0 -50
- package/theme/presets/github-openai.d.ts.map +0 -1
- package/theme/presets/index.d.ts +0 -11
- package/theme/presets/index.d.ts.map +0 -1
- package/theme/theme.d.ts +0 -396
- package/theme/theme.d.ts.map +0 -1
- package/tool-template/builder.d.ts +0 -213
- package/tool-template/builder.d.ts.map +0 -1
- package/tool-template/index.d.ts +0 -16
- package/tool-template/index.d.ts.map +0 -1
- package/tool-template/index.js +0 -3559
- package/types/index.d.ts +0 -14
- package/types/index.d.ts.map +0 -1
- package/types/index.js +0 -108
- package/types/ui-config.d.ts +0 -639
- package/types/ui-config.d.ts.map +0 -1
- package/types/ui-runtime.d.ts +0 -1007
- package/types/ui-runtime.d.ts.map +0 -1
- package/typings/cache/cache-adapter.d.ts +0 -125
- package/typings/cache/cache-adapter.d.ts.map +0 -1
- package/typings/cache/index.d.ts +0 -10
- package/typings/cache/index.d.ts.map +0 -1
- package/typings/cache/memory-cache.d.ts +0 -92
- package/typings/cache/memory-cache.d.ts.map +0 -1
- package/typings/dts-parser.d.ts +0 -90
- package/typings/dts-parser.d.ts.map +0 -1
- package/typings/index.d.ts +0 -48
- package/typings/index.d.ts.map +0 -1
- package/typings/schemas.d.ts +0 -232
- package/typings/schemas.d.ts.map +0 -1
- package/typings/type-fetcher.d.ts +0 -89
- package/typings/type-fetcher.d.ts.map +0 -1
- package/typings/types.d.ts +0 -320
- package/typings/types.d.ts.map +0 -1
- package/utils/escape-html.d.ts +0 -58
- package/utils/escape-html.d.ts.map +0 -1
- package/utils/index.d.ts +0 -10
- package/utils/index.d.ts.map +0 -1
- package/utils/index.js +0 -70
- package/utils/safe-stringify.d.ts +0 -30
- package/utils/safe-stringify.d.ts.map +0 -1
- package/validation/error-box.d.ts +0 -56
- package/validation/error-box.d.ts.map +0 -1
- package/validation/index.d.ts +0 -13
- package/validation/index.d.ts.map +0 -1
- package/validation/index.js +0 -603
- package/validation/schema-paths.d.ts +0 -118
- package/validation/schema-paths.d.ts.map +0 -1
- package/validation/template-validator.d.ts +0 -143
- package/validation/template-validator.d.ts.map +0 -1
- package/validation/wrapper.d.ts +0 -97
- package/validation/wrapper.d.ts.map +0 -1
- package/widgets/index.d.ts +0 -8
- package/widgets/index.d.ts.map +0 -1
- package/widgets/index.js +0 -978
- package/widgets/progress.d.ts +0 -133
- package/widgets/progress.d.ts.map +0 -1
- package/widgets/resource.d.ts +0 -163
- package/widgets/resource.d.ts.map +0 -1
- /package/esm/render/{index.js → index.mjs} +0 -0
|
@@ -677,83 +677,23 @@ var ActionListOptionsSchema = z9.object({
|
|
|
677
677
|
className: z9.string().optional()
|
|
678
678
|
}).strict();
|
|
679
679
|
|
|
680
|
-
// libs/ui/src/
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
mode: "artifacts",
|
|
695
|
-
framework: "react"
|
|
696
|
-
// Claude artifacts prefer React
|
|
697
|
-
}
|
|
698
|
-
};
|
|
699
|
-
|
|
700
|
-
// libs/ui/src/utils/escape-html.ts
|
|
701
|
-
function escapeHtml(str) {
|
|
702
|
-
if (str === null || str === void 0) {
|
|
703
|
-
return "";
|
|
704
|
-
}
|
|
705
|
-
const s = String(str);
|
|
706
|
-
return s.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">").replace(/"/g, """).replace(/'/g, "'").replace(/\u2028/g, "\\u2028").replace(/\u2029/g, "\\u2029");
|
|
707
|
-
}
|
|
708
|
-
|
|
709
|
-
// libs/ui/src/validation/error-box.ts
|
|
710
|
-
var errorIcon = `<svg class="w-5 h-5 flex-shrink-0" fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true">
|
|
711
|
-
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z"/>
|
|
712
|
-
</svg>`;
|
|
713
|
-
function validationErrorBox(options) {
|
|
714
|
-
const { componentName, invalidParam } = options;
|
|
715
|
-
return `<div
|
|
716
|
-
class="validation-error flex items-start gap-3 p-4 bg-red-50 border border-red-200 text-red-800 rounded-lg"
|
|
717
|
-
role="alert"
|
|
718
|
-
data-testid="validation-error"
|
|
719
|
-
data-component="${escapeHtml(componentName)}"
|
|
720
|
-
data-param="${escapeHtml(invalidParam)}"
|
|
721
|
-
>
|
|
722
|
-
${errorIcon}
|
|
723
|
-
<div class="min-w-0">
|
|
724
|
-
<p class="font-semibold text-sm">${escapeHtml(componentName)}: Invalid Configuration</p>
|
|
725
|
-
<p class="text-sm opacity-90 mt-0.5">The "${escapeHtml(invalidParam)}" parameter is invalid.</p>
|
|
726
|
-
</div>
|
|
727
|
-
</div>`;
|
|
728
|
-
}
|
|
729
|
-
|
|
730
|
-
// libs/ui/src/validation/wrapper.ts
|
|
731
|
-
function getFirstInvalidPath(error) {
|
|
732
|
-
const firstError = error.issues[0];
|
|
733
|
-
if (!firstError || firstError.path.length === 0) {
|
|
734
|
-
return "options";
|
|
735
|
-
}
|
|
736
|
-
return firstError.path.map(String).join(".");
|
|
737
|
-
}
|
|
738
|
-
function validateOptions(options, config) {
|
|
739
|
-
const result = config.schema.safeParse(options);
|
|
740
|
-
if (result.success) {
|
|
741
|
-
return { success: true, data: result.data };
|
|
742
|
-
}
|
|
743
|
-
const invalidParam = getFirstInvalidPath(result.error);
|
|
744
|
-
return {
|
|
745
|
-
success: false,
|
|
746
|
-
error: validationErrorBox({
|
|
747
|
-
componentName: config.componentName,
|
|
748
|
-
invalidParam
|
|
749
|
-
})
|
|
750
|
-
};
|
|
751
|
-
}
|
|
752
|
-
|
|
753
|
-
// libs/ui/src/validation/schema-paths.ts
|
|
754
|
-
import { z as z10 } from "zod";
|
|
680
|
+
// libs/ui/src/layouts/base.ts
|
|
681
|
+
import {
|
|
682
|
+
OPENAI_PLATFORM,
|
|
683
|
+
canUseCdn,
|
|
684
|
+
needsInlineScripts,
|
|
685
|
+
DEFAULT_THEME,
|
|
686
|
+
buildThemeCss,
|
|
687
|
+
mergeThemes,
|
|
688
|
+
buildFontPreconnect,
|
|
689
|
+
buildFontStylesheets,
|
|
690
|
+
buildCdnScripts
|
|
691
|
+
} from "@frontmcp/uipack/theme";
|
|
692
|
+
import { escapeHtml } from "@frontmcp/uipack/utils";
|
|
693
|
+
import { escapeHtml as escapeHtml2 } from "@frontmcp/uipack/utils";
|
|
755
694
|
|
|
756
695
|
// libs/ui/src/components/button.ts
|
|
696
|
+
import { validateOptions } from "@frontmcp/uipack/validation";
|
|
757
697
|
function getVariantClasses(variant) {
|
|
758
698
|
const variants = {
|
|
759
699
|
primary: "bg-primary hover:bg-primary/90 text-white shadow-sm",
|
|
@@ -843,7 +783,7 @@ function button(text, options = {}) {
|
|
|
843
783
|
}
|
|
844
784
|
const variantClasses = getVariantClasses(variant);
|
|
845
785
|
const sizeClasses = getSizeClasses(size, iconOnly);
|
|
846
|
-
const safeClassName = className ?
|
|
786
|
+
const safeClassName = className ? escapeHtml2(className) : "";
|
|
847
787
|
const baseClasses = [
|
|
848
788
|
"inline-flex items-center justify-center",
|
|
849
789
|
"font-medium",
|
|
@@ -858,24 +798,24 @@ function button(text, options = {}) {
|
|
|
858
798
|
].filter(Boolean).join(" ");
|
|
859
799
|
const dataAttrs = data ? Object.entries(data).map(([key, val]) => {
|
|
860
800
|
const safeKey = sanitizeDataKey(key);
|
|
861
|
-
return safeKey ? `data-${safeKey}="${
|
|
801
|
+
return safeKey ? `data-${safeKey}="${escapeHtml2(val)}"` : "";
|
|
862
802
|
}).filter(Boolean).join(" ") : "";
|
|
863
|
-
const idAttr = id ? `id="${
|
|
864
|
-
const nameAttr = name ? `name="${
|
|
865
|
-
const valueAttr = value ? `value="${
|
|
803
|
+
const idAttr = id ? `id="${escapeHtml2(id)}"` : "";
|
|
804
|
+
const nameAttr = name ? `name="${escapeHtml2(name)}"` : "";
|
|
805
|
+
const valueAttr = value ? `value="${escapeHtml2(value)}"` : "";
|
|
866
806
|
const disabledAttr = disabled || loading ? "disabled" : "";
|
|
867
|
-
const targetAttr = target ? `target="${
|
|
807
|
+
const targetAttr = target ? `target="${escapeHtml2(target)}"` : "";
|
|
868
808
|
const relAttr = target === "_blank" ? 'rel="noopener noreferrer"' : "";
|
|
869
809
|
const trimmedText = text.trim();
|
|
870
810
|
const effectiveAriaLabel = ariaLabel ?? (iconOnly && trimmedText ? trimmedText : void 0);
|
|
871
|
-
const ariaLabelAttr = effectiveAriaLabel ? `aria-label="${
|
|
811
|
+
const ariaLabelAttr = effectiveAriaLabel ? `aria-label="${escapeHtml2(effectiveAriaLabel)}"` : "";
|
|
872
812
|
const iconBeforeHtml = iconBefore && !loading ? `<span class="${iconOnly ? "" : "mr-2"}">${iconBefore}</span>` : "";
|
|
873
813
|
const iconAfterHtml = iconAfter && !loading ? `<span class="${iconOnly ? "" : "ml-2"}">${iconAfter}</span>` : "";
|
|
874
814
|
const loadingHtml = loading ? loadingSpinner : "";
|
|
875
|
-
const textHtml = iconOnly ? "" :
|
|
815
|
+
const textHtml = iconOnly ? "" : escapeHtml2(text);
|
|
876
816
|
const contentHtml = `${loadingHtml}${iconBeforeHtml}${textHtml}${iconAfterHtml}`;
|
|
877
817
|
if (href && !disabled && !loading && isValidHrefProtocol(href)) {
|
|
878
|
-
return `<a href="${
|
|
818
|
+
return `<a href="${escapeHtml2(
|
|
879
819
|
href
|
|
880
820
|
)}" class="${baseClasses}" ${idAttr} ${dataAttrs} ${ariaLabelAttr} ${targetAttr} ${relAttr}>
|
|
881
821
|
${contentHtml}
|
|
@@ -899,7 +839,7 @@ function buttonGroup(buttons, options = {}) {
|
|
|
899
839
|
}
|
|
900
840
|
const validatedOptions = validation.data;
|
|
901
841
|
const { attached = false, direction = "horizontal", gap = "md", className = "" } = validatedOptions;
|
|
902
|
-
const safeClassName = className ?
|
|
842
|
+
const safeClassName = className ? escapeHtml2(className) : "";
|
|
903
843
|
if (attached) {
|
|
904
844
|
const classes = direction === "horizontal" ? "inline-flex rounded-lg shadow-sm [&>*:first-child]:rounded-r-none [&>*:last-child]:rounded-l-none [&>*:not(:first-child):not(:last-child)]:rounded-none [&>*:not(:first-child)]:-ml-px" : "inline-flex flex-col rounded-lg shadow-sm [&>*:first-child]:rounded-b-none [&>*:last-child]:rounded-t-none [&>*:not(:first-child):not(:last-child)]:rounded-none [&>*:not(:first-child)]:-mt-px";
|
|
905
845
|
return `<div class="${classes} ${safeClassName}">${buttons.join("")}</div>`;
|
|
@@ -936,7 +876,7 @@ function getSizeClasses2(size) {
|
|
|
936
876
|
}
|
|
937
877
|
function buildDataAttrs(data) {
|
|
938
878
|
if (!data) return "";
|
|
939
|
-
return Object.entries(data).map(([key, value]) => `data-${key}="${
|
|
879
|
+
return Object.entries(data).map(([key, value]) => `data-${key}="${escapeHtml2(value)}"`).join(" ");
|
|
940
880
|
}
|
|
941
881
|
function card(content, options = {}) {
|
|
942
882
|
const {
|
|
@@ -957,18 +897,18 @@ function card(content, options = {}) {
|
|
|
957
897
|
const clickableClasses = clickable ? "cursor-pointer hover:shadow-md transition-shadow" : "";
|
|
958
898
|
const allClasses = [variantClasses, sizeClasses, clickableClasses, className].filter(Boolean).join(" ");
|
|
959
899
|
const dataAttrs = buildDataAttrs(data);
|
|
960
|
-
const idAttr = id ? `id="${
|
|
900
|
+
const idAttr = id ? `id="${escapeHtml2(id)}"` : "";
|
|
961
901
|
const hasHeader = title || subtitle || headerActions;
|
|
962
902
|
const headerHtml = hasHeader ? `<div class="flex items-start justify-between mb-4">
|
|
963
903
|
<div>
|
|
964
|
-
${title ? `<h3 class="text-lg font-semibold text-text-primary">${
|
|
965
|
-
${subtitle ? `<p class="text-sm text-text-secondary mt-1">${
|
|
904
|
+
${title ? `<h3 class="text-lg font-semibold text-text-primary">${escapeHtml2(title)}</h3>` : ""}
|
|
905
|
+
${subtitle ? `<p class="text-sm text-text-secondary mt-1">${escapeHtml2(subtitle)}</p>` : ""}
|
|
966
906
|
</div>
|
|
967
907
|
${headerActions ? `<div class="flex items-center gap-2">${headerActions}</div>` : ""}
|
|
968
908
|
</div>` : "";
|
|
969
909
|
const footerHtml = footer ? `<div class="mt-4 pt-4 border-t border-divider">${footer}</div>` : "";
|
|
970
910
|
if (href) {
|
|
971
|
-
return `<a href="${
|
|
911
|
+
return `<a href="${escapeHtml2(href)}" class="${allClasses}" ${idAttr} ${dataAttrs}>
|
|
972
912
|
${headerHtml}
|
|
973
913
|
${content}
|
|
974
914
|
${footerHtml}
|
|
@@ -1009,7 +949,7 @@ function getInputStateClasses(state) {
|
|
|
1009
949
|
}
|
|
1010
950
|
function buildDataAttrs2(data) {
|
|
1011
951
|
if (!data) return "";
|
|
1012
|
-
return Object.entries(data).map(([key, value]) => `data-${key}="${
|
|
952
|
+
return Object.entries(data).map(([key, value]) => `data-${key}="${escapeHtml2(value)}"`).join(" ");
|
|
1013
953
|
}
|
|
1014
954
|
function input(options) {
|
|
1015
955
|
const {
|
|
@@ -1052,26 +992,26 @@ function input(options) {
|
|
|
1052
992
|
const dataAttrs = buildDataAttrs2(data);
|
|
1053
993
|
const inputAttrs = [
|
|
1054
994
|
`type="${type}"`,
|
|
1055
|
-
`name="${
|
|
1056
|
-
`id="${
|
|
1057
|
-
value ? `value="${
|
|
1058
|
-
placeholder ? `placeholder="${
|
|
995
|
+
`name="${escapeHtml2(name)}"`,
|
|
996
|
+
`id="${escapeHtml2(id)}"`,
|
|
997
|
+
value ? `value="${escapeHtml2(value)}"` : "",
|
|
998
|
+
placeholder ? `placeholder="${escapeHtml2(placeholder)}"` : "",
|
|
1059
999
|
required ? "required" : "",
|
|
1060
1000
|
disabled ? "disabled" : "",
|
|
1061
1001
|
readonly ? "readonly" : "",
|
|
1062
|
-
autocomplete ? `autocomplete="${
|
|
1063
|
-
pattern ? `pattern="${
|
|
1064
|
-
min !== void 0 ? `min="${
|
|
1065
|
-
max !== void 0 ? `max="${
|
|
1066
|
-
step !== void 0 ? `step="${
|
|
1002
|
+
autocomplete ? `autocomplete="${escapeHtml2(autocomplete)}"` : "",
|
|
1003
|
+
pattern ? `pattern="${escapeHtml2(pattern)}"` : "",
|
|
1004
|
+
min !== void 0 ? `min="${escapeHtml2(String(min))}"` : "",
|
|
1005
|
+
max !== void 0 ? `max="${escapeHtml2(String(max))}"` : "",
|
|
1006
|
+
step !== void 0 ? `step="${escapeHtml2(String(step))}"` : "",
|
|
1067
1007
|
`class="${baseClasses}"`,
|
|
1068
1008
|
dataAttrs
|
|
1069
1009
|
].filter(Boolean).join(" ");
|
|
1070
|
-
const labelHtml = label ? `<label for="${
|
|
1071
|
-
${
|
|
1010
|
+
const labelHtml = label ? `<label for="${escapeHtml2(id)}" class="block text-sm font-medium text-text-primary mb-1.5">
|
|
1011
|
+
${escapeHtml2(label)}${required ? '<span class="text-danger ml-1">*</span>' : ""}
|
|
1072
1012
|
</label>` : "";
|
|
1073
|
-
const helperHtml = helper && !error ? `<p class="mt-1.5 text-sm text-text-secondary">${
|
|
1074
|
-
const errorHtml = error ? `<p class="mt-1.5 text-sm text-danger">${
|
|
1013
|
+
const helperHtml = helper && !error ? `<p class="mt-1.5 text-sm text-text-secondary">${escapeHtml2(helper)}</p>` : "";
|
|
1014
|
+
const errorHtml = error ? `<p class="mt-1.5 text-sm text-danger">${escapeHtml2(error)}</p>` : "";
|
|
1075
1015
|
const iconBeforeHtml = iconBefore ? `<span class="absolute left-3 top-1/2 -translate-y-1/2 text-text-secondary">${iconBefore}</span>` : "";
|
|
1076
1016
|
const iconAfterHtml = iconAfter ? `<span class="absolute right-3 top-1/2 -translate-y-1/2 text-text-secondary">${iconAfter}</span>` : "";
|
|
1077
1017
|
const inputHtml = hasIcon ? `<div class="relative">
|
|
@@ -1118,18 +1058,18 @@ function select(options) {
|
|
|
1118
1058
|
const optionsHtml = selectOptions.map((opt) => {
|
|
1119
1059
|
const selected = opt.selected || opt.value === value ? "selected" : "";
|
|
1120
1060
|
const optDisabled = opt.disabled ? "disabled" : "";
|
|
1121
|
-
return `<option value="${
|
|
1061
|
+
return `<option value="${escapeHtml2(opt.value)}" ${selected} ${optDisabled}>${escapeHtml2(opt.label)}</option>`;
|
|
1122
1062
|
}).join("\n");
|
|
1123
|
-
const labelHtml = label ? `<label for="${
|
|
1124
|
-
${
|
|
1063
|
+
const labelHtml = label ? `<label for="${escapeHtml2(id)}" class="block text-sm font-medium text-text-primary mb-1.5">
|
|
1064
|
+
${escapeHtml2(label)}${required ? '<span class="text-danger ml-1">*</span>' : ""}
|
|
1125
1065
|
</label>` : "";
|
|
1126
|
-
const helperHtml = helper && !error ? `<p class="mt-1.5 text-sm text-text-secondary">${
|
|
1127
|
-
const errorHtml = error ? `<p class="mt-1.5 text-sm text-danger">${
|
|
1066
|
+
const helperHtml = helper && !error ? `<p class="mt-1.5 text-sm text-text-secondary">${escapeHtml2(helper)}</p>` : "";
|
|
1067
|
+
const errorHtml = error ? `<p class="mt-1.5 text-sm text-danger">${escapeHtml2(error)}</p>` : "";
|
|
1128
1068
|
return `<div class="form-field">
|
|
1129
1069
|
${labelHtml}
|
|
1130
1070
|
<select
|
|
1131
|
-
name="${
|
|
1132
|
-
id="${
|
|
1071
|
+
name="${escapeHtml2(name)}"
|
|
1072
|
+
id="${escapeHtml2(id)}"
|
|
1133
1073
|
class="${baseClasses}"
|
|
1134
1074
|
${required ? "required" : ""}
|
|
1135
1075
|
${disabled ? "disabled" : ""}
|
|
@@ -1180,24 +1120,24 @@ function textarea(options) {
|
|
|
1180
1120
|
className
|
|
1181
1121
|
].filter(Boolean).join(" ");
|
|
1182
1122
|
const dataAttrs = buildDataAttrs2(data);
|
|
1183
|
-
const labelHtml = label ? `<label for="${
|
|
1184
|
-
${
|
|
1123
|
+
const labelHtml = label ? `<label for="${escapeHtml2(id)}" class="block text-sm font-medium text-text-primary mb-1.5">
|
|
1124
|
+
${escapeHtml2(label)}${required ? '<span class="text-danger ml-1">*</span>' : ""}
|
|
1185
1125
|
</label>` : "";
|
|
1186
|
-
const helperHtml = helper && !error ? `<p class="mt-1.5 text-sm text-text-secondary">${
|
|
1187
|
-
const errorHtml = error ? `<p class="mt-1.5 text-sm text-danger">${
|
|
1126
|
+
const helperHtml = helper && !error ? `<p class="mt-1.5 text-sm text-text-secondary">${escapeHtml2(helper)}</p>` : "";
|
|
1127
|
+
const errorHtml = error ? `<p class="mt-1.5 text-sm text-danger">${escapeHtml2(error)}</p>` : "";
|
|
1188
1128
|
return `<div class="form-field">
|
|
1189
1129
|
${labelHtml}
|
|
1190
1130
|
<textarea
|
|
1191
|
-
name="${
|
|
1192
|
-
id="${
|
|
1131
|
+
name="${escapeHtml2(name)}"
|
|
1132
|
+
id="${escapeHtml2(id)}"
|
|
1193
1133
|
rows="${rows}"
|
|
1194
1134
|
class="${baseClasses}"
|
|
1195
|
-
${placeholder ? `placeholder="${
|
|
1135
|
+
${placeholder ? `placeholder="${escapeHtml2(placeholder)}"` : ""}
|
|
1196
1136
|
${required ? "required" : ""}
|
|
1197
1137
|
${disabled ? "disabled" : ""}
|
|
1198
1138
|
${readonly ? "readonly" : ""}
|
|
1199
1139
|
${dataAttrs}
|
|
1200
|
-
>${
|
|
1140
|
+
>${escapeHtml2(value)}</textarea>
|
|
1201
1141
|
${helperHtml}
|
|
1202
1142
|
${errorHtml}
|
|
1203
1143
|
</div>`;
|
|
@@ -1219,21 +1159,21 @@ function checkbox(options) {
|
|
|
1219
1159
|
"focus:ring-2 focus:ring-primary/20 focus:ring-offset-0",
|
|
1220
1160
|
disabled ? "opacity-50 cursor-not-allowed" : "cursor-pointer"
|
|
1221
1161
|
].join(" ");
|
|
1222
|
-
const helperHtml = helper && !error ? `<p class="text-sm text-text-secondary">${
|
|
1223
|
-
const errorHtml = error ? `<p class="text-sm text-danger">${
|
|
1162
|
+
const helperHtml = helper && !error ? `<p class="text-sm text-text-secondary">${escapeHtml2(helper)}</p>` : "";
|
|
1163
|
+
const errorHtml = error ? `<p class="text-sm text-danger">${escapeHtml2(error)}</p>` : "";
|
|
1224
1164
|
return `<div class="form-field ${className}">
|
|
1225
1165
|
<label class="flex items-start gap-3 ${disabled ? "cursor-not-allowed" : "cursor-pointer"}">
|
|
1226
1166
|
<input
|
|
1227
1167
|
type="checkbox"
|
|
1228
|
-
name="${
|
|
1229
|
-
id="${
|
|
1230
|
-
value="${
|
|
1168
|
+
name="${escapeHtml2(name)}"
|
|
1169
|
+
id="${escapeHtml2(id)}"
|
|
1170
|
+
value="${escapeHtml2(value)}"
|
|
1231
1171
|
class="${checkboxClasses}"
|
|
1232
1172
|
${checked ? "checked" : ""}
|
|
1233
1173
|
${disabled ? "disabled" : ""}
|
|
1234
1174
|
>
|
|
1235
1175
|
<div>
|
|
1236
|
-
<span class="text-sm font-medium text-text-primary">${
|
|
1176
|
+
<span class="text-sm font-medium text-text-primary">${escapeHtml2(label)}</span>
|
|
1237
1177
|
${helperHtml}
|
|
1238
1178
|
${errorHtml}
|
|
1239
1179
|
</div>
|
|
@@ -1252,19 +1192,19 @@ function radioGroup(options) {
|
|
|
1252
1192
|
return `<label class="flex items-center gap-2 ${cursorClass}">
|
|
1253
1193
|
<input
|
|
1254
1194
|
type="radio"
|
|
1255
|
-
name="${
|
|
1256
|
-
id="${
|
|
1257
|
-
value="${
|
|
1195
|
+
name="${escapeHtml2(name)}"
|
|
1196
|
+
id="${escapeHtml2(radioId)}"
|
|
1197
|
+
value="${escapeHtml2(opt.value)}"
|
|
1258
1198
|
class="${radioClasses}"
|
|
1259
1199
|
${checked}
|
|
1260
1200
|
${disabled}
|
|
1261
1201
|
>
|
|
1262
|
-
<span class="text-sm text-text-primary">${
|
|
1202
|
+
<span class="text-sm text-text-primary">${escapeHtml2(opt.label)}</span>
|
|
1263
1203
|
</label>`;
|
|
1264
1204
|
}).join("\n");
|
|
1265
|
-
const labelHtml = label ? `<label class="block text-sm font-medium text-text-primary mb-2">${
|
|
1266
|
-
const helperHtml = helper && !error ? `<p class="mt-1.5 text-sm text-text-secondary">${
|
|
1267
|
-
const errorHtml = error ? `<p class="mt-1.5 text-sm text-danger">${
|
|
1205
|
+
const labelHtml = label ? `<label class="block text-sm font-medium text-text-primary mb-2">${escapeHtml2(label)}</label>` : "";
|
|
1206
|
+
const helperHtml = helper && !error ? `<p class="mt-1.5 text-sm text-text-secondary">${escapeHtml2(helper)}</p>` : "";
|
|
1207
|
+
const errorHtml = error ? `<p class="mt-1.5 text-sm text-danger">${escapeHtml2(error)}</p>` : "";
|
|
1268
1208
|
return `<div class="form-field ${className}" role="radiogroup">
|
|
1269
1209
|
${labelHtml}
|
|
1270
1210
|
<div class="${directionClasses}">
|
|
@@ -1277,10 +1217,10 @@ function radioGroup(options) {
|
|
|
1277
1217
|
function form(content, options = {}) {
|
|
1278
1218
|
const { action, method = "post", id, className = "", preventDefault = false, autocomplete, enctype } = options;
|
|
1279
1219
|
const attrs = [
|
|
1280
|
-
action ? `action="${
|
|
1220
|
+
action ? `action="${escapeHtml2(action)}"` : "",
|
|
1281
1221
|
`method="${method}"`,
|
|
1282
|
-
id ? `id="${
|
|
1283
|
-
className ? `class="${
|
|
1222
|
+
id ? `id="${escapeHtml2(id)}"` : "",
|
|
1223
|
+
className ? `class="${escapeHtml2(className)}"` : "",
|
|
1284
1224
|
autocomplete ? `autocomplete="${autocomplete}"` : "",
|
|
1285
1225
|
enctype ? `enctype="${enctype}"` : "",
|
|
1286
1226
|
preventDefault ? 'onsubmit="return false;"' : ""
|
|
@@ -1297,8 +1237,8 @@ function formRow(fields, options = {}) {
|
|
|
1297
1237
|
function formSection(content, options = {}) {
|
|
1298
1238
|
const { title, description, className = "" } = options;
|
|
1299
1239
|
const headerHtml = title ? `<div class="mb-4">
|
|
1300
|
-
<h3 class="text-lg font-semibold text-text-primary">${
|
|
1301
|
-
${description ? `<p class="text-sm text-text-secondary mt-1">${
|
|
1240
|
+
<h3 class="text-lg font-semibold text-text-primary">${escapeHtml2(title)}</h3>
|
|
1241
|
+
${description ? `<p class="text-sm text-text-secondary mt-1">${escapeHtml2(description)}</p>` : ""}
|
|
1302
1242
|
</div>` : "";
|
|
1303
1243
|
return `<div class="form-section ${className}">
|
|
1304
1244
|
${headerHtml}
|
|
@@ -1320,7 +1260,7 @@ function formActions(buttons, options = {}) {
|
|
|
1320
1260
|
</div>`;
|
|
1321
1261
|
}
|
|
1322
1262
|
function hiddenInput(name, value) {
|
|
1323
|
-
return `<input type="hidden" name="${
|
|
1263
|
+
return `<input type="hidden" name="${escapeHtml2(name)}" value="${escapeHtml2(value)}">`;
|
|
1324
1264
|
}
|
|
1325
1265
|
function csrfInput(token) {
|
|
1326
1266
|
return hiddenInput("_csrf", token);
|
|
@@ -1378,7 +1318,7 @@ function badge(text, options = {}) {
|
|
|
1378
1318
|
outline: "border border-current"
|
|
1379
1319
|
};
|
|
1380
1320
|
const dotClasses = ["inline-block rounded-full", getSizeClasses3(size, true), dotVariants[variant], className].filter(Boolean).join(" ");
|
|
1381
|
-
return `<span class="${dotClasses}" aria-label="${
|
|
1321
|
+
return `<span class="${dotClasses}" aria-label="${escapeHtml2(text)}" title="${escapeHtml2(text)}"></span>`;
|
|
1382
1322
|
}
|
|
1383
1323
|
const variantClasses = getVariantClasses3(variant);
|
|
1384
1324
|
const sizeClasses = getSizeClasses3(size, false);
|
|
@@ -1401,7 +1341,7 @@ function badge(text, options = {}) {
|
|
|
1401
1341
|
</svg>
|
|
1402
1342
|
</button>` : "";
|
|
1403
1343
|
return `<span class="${baseClasses}">
|
|
1404
|
-
${iconHtml}${
|
|
1344
|
+
${iconHtml}${escapeHtml2(text)}${removeHtml}
|
|
1405
1345
|
</span>`;
|
|
1406
1346
|
}
|
|
1407
1347
|
function badgeGroup(badges, options = {}) {
|
|
@@ -1472,7 +1412,7 @@ function alert(message, options = {}) {
|
|
|
1472
1412
|
const iconHtml = showIcon ? `<div class="flex-shrink-0 ${variantClasses.icon}">
|
|
1473
1413
|
${icon || alertIcons[variant]}
|
|
1474
1414
|
</div>` : "";
|
|
1475
|
-
const titleHtml = title ? `<h3 class="font-semibold">${
|
|
1415
|
+
const titleHtml = title ? `<h3 class="font-semibold">${escapeHtml2(title)}</h3>` : "";
|
|
1476
1416
|
const dismissHtml = dismissible ? `<button
|
|
1477
1417
|
type="button"
|
|
1478
1418
|
class="flex-shrink-0 ml-auto -mr-1 -mt-1 p-1 rounded hover:bg-black/5 transition-colors"
|
|
@@ -1484,13 +1424,13 @@ function alert(message, options = {}) {
|
|
|
1484
1424
|
</svg>
|
|
1485
1425
|
</button>` : "";
|
|
1486
1426
|
const actionsHtml = actions ? `<div class="mt-3">${actions}</div>` : "";
|
|
1487
|
-
const idAttr = id ? `id="${
|
|
1427
|
+
const idAttr = id ? `id="${escapeHtml2(id)}"` : "";
|
|
1488
1428
|
return `<div class="alert ${baseClasses}" role="alert" ${idAttr}>
|
|
1489
1429
|
<div class="flex gap-3">
|
|
1490
1430
|
${iconHtml}
|
|
1491
1431
|
<div class="flex-1">
|
|
1492
1432
|
${titleHtml}
|
|
1493
|
-
<div class="${title ? "mt-1" : ""}">${
|
|
1433
|
+
<div class="${title ? "mt-1" : ""}">${escapeHtml2(message)}</div>
|
|
1494
1434
|
${actionsHtml}
|
|
1495
1435
|
</div>
|
|
1496
1436
|
${dismissHtml}
|
|
@@ -1512,7 +1452,7 @@ function toast(message, options = {}) {
|
|
|
1512
1452
|
"top-center": "top-4 left-1/2 -translate-x-1/2",
|
|
1513
1453
|
"bottom-center": "bottom-4 left-1/2 -translate-x-1/2"
|
|
1514
1454
|
};
|
|
1515
|
-
const titleHtml = title ? `<h4 class="font-semibold">${
|
|
1455
|
+
const titleHtml = title ? `<h4 class="font-semibold">${escapeHtml2(title)}</h4>` : "";
|
|
1516
1456
|
const autoDismissScript = duration > 0 ? `<script>
|
|
1517
1457
|
setTimeout(() => {
|
|
1518
1458
|
const toast = document.getElementById('${id}');
|
|
@@ -1523,7 +1463,7 @@ function toast(message, options = {}) {
|
|
|
1523
1463
|
}, ${duration});
|
|
1524
1464
|
</script>` : "";
|
|
1525
1465
|
return `<div
|
|
1526
|
-
id="${
|
|
1466
|
+
id="${escapeHtml2(id)}"
|
|
1527
1467
|
class="fixed ${positionClasses[position]} z-50 min-w-[300px] max-w-md rounded-lg border shadow-lg ${variantClasses.container} transition-all duration-300 transform"
|
|
1528
1468
|
role="alert"
|
|
1529
1469
|
>
|
|
@@ -1533,7 +1473,7 @@ function toast(message, options = {}) {
|
|
|
1533
1473
|
</div>
|
|
1534
1474
|
<div class="flex-1">
|
|
1535
1475
|
${titleHtml}
|
|
1536
|
-
<p class="${title ? "mt-1 text-sm opacity-90" : ""}">${
|
|
1476
|
+
<p class="${title ? "mt-1 text-sm opacity-90" : ""}">${escapeHtml2(message)}</p>
|
|
1537
1477
|
</div>
|
|
1538
1478
|
<button
|
|
1539
1479
|
type="button"
|
|
@@ -1558,7 +1498,7 @@ function toastContainer(position = "top-right", id = "toast-container") {
|
|
|
1558
1498
|
"top-center": "top-4 left-1/2 -translate-x-1/2",
|
|
1559
1499
|
"bottom-center": "bottom-4 left-1/2 -translate-x-1/2"
|
|
1560
1500
|
};
|
|
1561
|
-
return `<div id="${
|
|
1501
|
+
return `<div id="${escapeHtml2(id)}" class="fixed ${positionClasses[position]} z-50 flex flex-col gap-2"></div>`;
|
|
1562
1502
|
}
|
|
1563
1503
|
|
|
1564
1504
|
// libs/ui/src/components/avatar.ts
|
|
@@ -1631,7 +1571,7 @@ function avatar(options) {
|
|
|
1631
1571
|
shapeClasses,
|
|
1632
1572
|
className
|
|
1633
1573
|
].filter(Boolean).join(" ");
|
|
1634
|
-
const contentHtml = src ? `<img src="${
|
|
1574
|
+
const contentHtml = src ? `<img src="${escapeHtml2(src)}" alt="${escapeHtml2(alt)}" class="w-full h-full object-cover">` : `<span class="font-medium text-white ${sizeClasses.text}">${escapeHtml2(displayInitials)}</span>`;
|
|
1635
1575
|
const bgClasses = src ? "bg-gray-200" : displayBgColor;
|
|
1636
1576
|
const statusHtml = status !== "none" ? `<span class="absolute bottom-0 right-0 block ${sizeClasses.status} ${shapeClasses} ${statusColor} border-white"></span>` : "";
|
|
1637
1577
|
const innerHtml = `
|
|
@@ -1641,7 +1581,7 @@ function avatar(options) {
|
|
|
1641
1581
|
</div>
|
|
1642
1582
|
`;
|
|
1643
1583
|
if (href) {
|
|
1644
|
-
return `<a href="${
|
|
1584
|
+
return `<a href="${escapeHtml2(href)}" class="inline-block">${innerHtml}</a>`;
|
|
1645
1585
|
}
|
|
1646
1586
|
return innerHtml;
|
|
1647
1587
|
}
|
|
@@ -1676,8 +1616,8 @@ function avatarWithText(options) {
|
|
|
1676
1616
|
const avatarHtml = avatar({ ...avatarOptions, alt: avatarOptions.alt || name });
|
|
1677
1617
|
const textHtml = `
|
|
1678
1618
|
<div class="${align === "right" ? "text-right" : ""}">
|
|
1679
|
-
<div class="font-medium text-text-primary">${
|
|
1680
|
-
${subtitle ? `<div class="text-sm text-text-secondary">${
|
|
1619
|
+
<div class="font-medium text-text-primary">${escapeHtml2(name)}</div>
|
|
1620
|
+
${subtitle ? `<div class="text-sm text-text-secondary">${escapeHtml2(subtitle)}</div>` : ""}
|
|
1681
1621
|
</div>
|
|
1682
1622
|
`;
|
|
1683
1623
|
const flexDirection = align === "right" ? "flex-row-reverse" : "flex-row";
|
|
@@ -1722,12 +1662,12 @@ function modal(content, options) {
|
|
|
1722
1662
|
const sizeClasses = getSizeClasses5(size);
|
|
1723
1663
|
const visibilityClasses = open ? "" : "hidden";
|
|
1724
1664
|
const headerHtml = title || showClose ? `<div class="flex items-center justify-between p-4 border-b border-divider">
|
|
1725
|
-
${title ? `<h3 class="text-lg font-semibold text-text-primary">${
|
|
1665
|
+
${title ? `<h3 class="text-lg font-semibold text-text-primary">${escapeHtml2(title)}</h3>` : "<div></div>"}
|
|
1726
1666
|
${showClose ? `
|
|
1727
1667
|
<button
|
|
1728
1668
|
type="button"
|
|
1729
1669
|
class="p-1 rounded-lg text-text-secondary hover:text-text-primary hover:bg-gray-100 transition-colors"
|
|
1730
|
-
onclick="document.getElementById('${
|
|
1670
|
+
onclick="document.getElementById('${escapeHtml2(id)}').classList.add('hidden')"
|
|
1731
1671
|
aria-label="Close"
|
|
1732
1672
|
>
|
|
1733
1673
|
<svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
@@ -1743,18 +1683,18 @@ function modal(content, options) {
|
|
|
1743
1683
|
const escapeHandler = closeOnEscape ? `<script>
|
|
1744
1684
|
document.addEventListener('keydown', function(e) {
|
|
1745
1685
|
if (e.key === 'Escape') {
|
|
1746
|
-
document.getElementById('${
|
|
1686
|
+
document.getElementById('${escapeHtml2(id)}')?.classList.add('hidden');
|
|
1747
1687
|
}
|
|
1748
1688
|
});
|
|
1749
1689
|
</script>` : "";
|
|
1750
1690
|
return `
|
|
1751
1691
|
<div
|
|
1752
|
-
id="${
|
|
1692
|
+
id="${escapeHtml2(id)}"
|
|
1753
1693
|
class="fixed inset-0 z-50 overflow-y-auto ${visibilityClasses}"
|
|
1754
1694
|
${backdropClickHandler}
|
|
1755
1695
|
role="dialog"
|
|
1756
1696
|
aria-modal="true"
|
|
1757
|
-
aria-labelledby="${
|
|
1697
|
+
aria-labelledby="${escapeHtml2(id)}-title"
|
|
1758
1698
|
>
|
|
1759
1699
|
<!-- Backdrop -->
|
|
1760
1700
|
<div class="fixed inset-0 bg-black/50 transition-opacity"></div>
|
|
@@ -1777,7 +1717,7 @@ function modalTrigger(triggerContent, modalId, options = {}) {
|
|
|
1777
1717
|
const { className = "", tag = "button" } = options;
|
|
1778
1718
|
const attrs = `
|
|
1779
1719
|
class="${className}"
|
|
1780
|
-
onclick="document.getElementById('${
|
|
1720
|
+
onclick="document.getElementById('${escapeHtml2(modalId)}').classList.remove('hidden')"
|
|
1781
1721
|
`;
|
|
1782
1722
|
if (tag === "button") {
|
|
1783
1723
|
return `<button type="button" ${attrs}>${triggerContent}</button>`;
|
|
@@ -1822,29 +1762,29 @@ function confirmModal(options) {
|
|
|
1822
1762
|
<div class="mx-auto w-12 h-12 rounded-full ${iconColors[variant]} flex items-center justify-center mb-4">
|
|
1823
1763
|
${displayIcon}
|
|
1824
1764
|
</div>
|
|
1825
|
-
<h3 class="text-lg font-semibold text-text-primary mb-2">${
|
|
1826
|
-
<p class="text-text-secondary">${
|
|
1765
|
+
<h3 class="text-lg font-semibold text-text-primary mb-2">${escapeHtml2(title)}</h3>
|
|
1766
|
+
<p class="text-text-secondary">${escapeHtml2(message)}</p>
|
|
1827
1767
|
</div>
|
|
1828
1768
|
`;
|
|
1829
1769
|
const confirmButton = confirmHref && isSafeUrl(confirmHref) ? `<a
|
|
1830
|
-
href="${
|
|
1770
|
+
href="${escapeHtml2(confirmHref)}"
|
|
1831
1771
|
class="px-4 py-2 rounded-lg ${variantClasses[variant]} transition-colors"
|
|
1832
1772
|
>
|
|
1833
|
-
${
|
|
1773
|
+
${escapeHtml2(confirmText)}
|
|
1834
1774
|
</a>` : `<button
|
|
1835
1775
|
type="button"
|
|
1836
1776
|
class="px-4 py-2 rounded-lg ${variantClasses[variant]} transition-colors"
|
|
1837
|
-
onclick="document.getElementById('${
|
|
1777
|
+
onclick="document.getElementById('${escapeHtml2(id)}').classList.add('hidden')"
|
|
1838
1778
|
>
|
|
1839
|
-
${
|
|
1779
|
+
${escapeHtml2(confirmText)}
|
|
1840
1780
|
</button>`;
|
|
1841
1781
|
const footer = `
|
|
1842
1782
|
<button
|
|
1843
1783
|
type="button"
|
|
1844
1784
|
class="px-4 py-2 rounded-lg border border-border text-text-primary hover:bg-gray-50 transition-colors"
|
|
1845
|
-
onclick="document.getElementById('${
|
|
1785
|
+
onclick="document.getElementById('${escapeHtml2(id)}').classList.add('hidden')"
|
|
1846
1786
|
>
|
|
1847
|
-
${
|
|
1787
|
+
${escapeHtml2(cancelText)}
|
|
1848
1788
|
</button>
|
|
1849
1789
|
${confirmButton}
|
|
1850
1790
|
`;
|
|
@@ -1887,12 +1827,12 @@ function drawer(content, options) {
|
|
|
1887
1827
|
};
|
|
1888
1828
|
const visibilityClasses = open ? "" : "hidden";
|
|
1889
1829
|
const headerHtml = title || showClose ? `<div class="flex items-center justify-between p-4 border-b border-divider">
|
|
1890
|
-
${title ? `<h3 class="text-lg font-semibold text-text-primary">${
|
|
1830
|
+
${title ? `<h3 class="text-lg font-semibold text-text-primary">${escapeHtml2(title)}</h3>` : "<div></div>"}
|
|
1891
1831
|
${showClose ? `
|
|
1892
1832
|
<button
|
|
1893
1833
|
type="button"
|
|
1894
1834
|
class="p-1 rounded-lg text-text-secondary hover:text-text-primary hover:bg-gray-100 transition-colors"
|
|
1895
|
-
onclick="document.getElementById('${
|
|
1835
|
+
onclick="document.getElementById('${escapeHtml2(id)}').classList.add('hidden')"
|
|
1896
1836
|
aria-label="Close"
|
|
1897
1837
|
>
|
|
1898
1838
|
<svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
@@ -1905,7 +1845,7 @@ function drawer(content, options) {
|
|
|
1905
1845
|
const backdropClickHandler = closeOnBackdrop ? `onclick="if (event.target === this) this.classList.add('hidden')"` : "";
|
|
1906
1846
|
return `
|
|
1907
1847
|
<div
|
|
1908
|
-
id="${
|
|
1848
|
+
id="${escapeHtml2(id)}"
|
|
1909
1849
|
class="fixed inset-0 z-50 ${visibilityClasses}"
|
|
1910
1850
|
${backdropClickHandler}
|
|
1911
1851
|
role="dialog"
|
|
@@ -1968,9 +1908,9 @@ function buildTableHeader(columns, options) {
|
|
|
1968
1908
|
class="${paddingClass} ${alignClass} font-semibold text-text-primary ${sortableClasses} ${col.headerClass || ""}"
|
|
1969
1909
|
${widthStyle}
|
|
1970
1910
|
>
|
|
1971
|
-
${col.sortable ? `<span class="inline-flex items-center">${
|
|
1911
|
+
${col.sortable ? `<span class="inline-flex items-center">${escapeHtml2(col.header)}${buildSortIndicator(
|
|
1972
1912
|
col.sortDirection || null
|
|
1973
|
-
)}</span>` :
|
|
1913
|
+
)}</span>` : escapeHtml2(col.header)}
|
|
1974
1914
|
</th>`;
|
|
1975
1915
|
}).join("\n");
|
|
1976
1916
|
return `<thead class="bg-gray-50 border-b border-border">
|
|
@@ -2007,20 +1947,20 @@ function buildTableBody(data, columns, options) {
|
|
|
2007
1947
|
bordered ? "border-b border-border" : "",
|
|
2008
1948
|
onRowClick ? "cursor-pointer" : ""
|
|
2009
1949
|
].filter(Boolean).join(" ");
|
|
2010
|
-
const clickHandler = onRowClick ? `onclick="window.location.href='${
|
|
1950
|
+
const clickHandler = onRowClick ? `onclick="window.location.href='${escapeHtml2(onRowClick.replace("{key}", rowId))}'"` : "";
|
|
2011
1951
|
const selectCell = selectable ? `<td class="${paddingClass}" onclick="event.stopPropagation()">
|
|
2012
1952
|
<input
|
|
2013
1953
|
type="checkbox"
|
|
2014
1954
|
class="w-4 h-4 rounded border-border text-primary focus:ring-primary/20"
|
|
2015
1955
|
name="selected[]"
|
|
2016
|
-
value="${
|
|
1956
|
+
value="${escapeHtml2(rowId)}"
|
|
2017
1957
|
aria-label="Select row"
|
|
2018
1958
|
>
|
|
2019
1959
|
</td>` : "";
|
|
2020
1960
|
const cells = columns.map((col) => {
|
|
2021
1961
|
const value = row[col.key];
|
|
2022
1962
|
const alignClass = getAlignClasses(col.align);
|
|
2023
|
-
const cellContent = col.render ? col.render(value, row, rowIndex) :
|
|
1963
|
+
const cellContent = col.render ? col.render(value, row, rowIndex) : escapeHtml2(String(value ?? ""));
|
|
2024
1964
|
return `<td class="${paddingClass} ${alignClass} ${col.cellClass || ""}">${cellContent}</td>`;
|
|
2025
1965
|
}).join("\n");
|
|
2026
1966
|
return `<tr class="${rowClasses}" ${clickHandler}>
|
|
@@ -2042,7 +1982,7 @@ function table(data, options) {
|
|
|
2042
1982
|
const { id, bordered, stickyHeader, className = "", loading = false } = options;
|
|
2043
1983
|
const tableClasses = ["w-full", bordered ? "border border-border" : "", "text-sm"].filter(Boolean).join(" ");
|
|
2044
1984
|
const wrapperClasses = ["relative overflow-x-auto", stickyHeader ? "max-h-96 overflow-y-auto" : "", className].filter(Boolean).join(" ");
|
|
2045
|
-
const idAttr = id ? `id="${
|
|
1985
|
+
const idAttr = id ? `id="${escapeHtml2(id)}"` : "";
|
|
2046
1986
|
const header = buildTableHeader(options.columns, options);
|
|
2047
1987
|
const body = buildTableBody(data, options.columns, options);
|
|
2048
1988
|
const loadingOverlay = loading ? buildLoadingOverlay() : "";
|
|
@@ -2072,7 +2012,7 @@ function pagination(options) {
|
|
|
2072
2012
|
return `<span class="${baseClasses} ${stateClasses}">${label}</span>`;
|
|
2073
2013
|
}
|
|
2074
2014
|
const pageUrl = baseUrl ? `${baseUrl}${baseUrl.includes("?") ? "&" : "?"}page=${pageNum}` : `?page=${pageNum}`;
|
|
2075
|
-
return `<a href="${
|
|
2015
|
+
return `<a href="${escapeHtml2(pageUrl)}" class="${baseClasses} ${stateClasses}">${label}</a>`;
|
|
2076
2016
|
};
|
|
2077
2017
|
const pageNumbers = [];
|
|
2078
2018
|
const maxVisible = 5;
|
|
@@ -2170,19 +2110,19 @@ function getPermissionIcon(scope, customIcon) {
|
|
|
2170
2110
|
}
|
|
2171
2111
|
function permissionList(permissions, options = {}) {
|
|
2172
2112
|
const { id, checkable = false, inputName = "scopes", title, className = "" } = options;
|
|
2173
|
-
const titleHtml = title ? `<h4 class="font-medium text-text-primary mb-3">${
|
|
2113
|
+
const titleHtml = title ? `<h4 class="font-medium text-text-primary mb-3">${escapeHtml2(title)}</h4>` : "";
|
|
2174
2114
|
const itemsHtml = permissions.map((perm, index) => {
|
|
2175
2115
|
const icon = getPermissionIcon(perm.scope, perm.icon);
|
|
2176
2116
|
const sensitiveClasses = perm.sensitive ? "border-warning/30 bg-warning/5" : "border-border";
|
|
2177
2117
|
const sensitiveLabel = perm.sensitive ? '<span class="text-xs text-warning font-medium ml-2">Sensitive</span>' : "";
|
|
2178
2118
|
const checkboxHtml = checkable ? `<input
|
|
2179
2119
|
type="checkbox"
|
|
2180
|
-
name="${
|
|
2181
|
-
value="${
|
|
2120
|
+
name="${escapeHtml2(inputName)}[]"
|
|
2121
|
+
value="${escapeHtml2(perm.scope)}"
|
|
2182
2122
|
class="w-4 h-4 rounded border-border text-primary focus:ring-primary/20"
|
|
2183
2123
|
${perm.checked || perm.required ? "checked" : ""}
|
|
2184
2124
|
${perm.required ? "disabled" : ""}
|
|
2185
|
-
id="${id ?
|
|
2125
|
+
id="${id ? escapeHtml2(id) : "perm"}-${index}"
|
|
2186
2126
|
>` : `<div class="w-5 h-5 rounded-full bg-success/10 text-success flex items-center justify-center">
|
|
2187
2127
|
<svg class="w-3 h-3" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
2188
2128
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="3" d="M5 13l4 4L19 7"/>
|
|
@@ -2194,18 +2134,18 @@ function permissionList(permissions, options = {}) {
|
|
|
2194
2134
|
</div>
|
|
2195
2135
|
<div class="flex-1 min-w-0">
|
|
2196
2136
|
<div class="flex items-center">
|
|
2197
|
-
<span class="font-medium text-text-primary">${
|
|
2137
|
+
<span class="font-medium text-text-primary">${escapeHtml2(perm.name)}</span>
|
|
2198
2138
|
${perm.required ? '<span class="text-xs text-text-secondary ml-2">(Required)</span>' : ""}
|
|
2199
2139
|
${sensitiveLabel}
|
|
2200
2140
|
</div>
|
|
2201
|
-
${perm.description ? `<p class="text-sm text-text-secondary mt-0.5">${
|
|
2141
|
+
${perm.description ? `<p class="text-sm text-text-secondary mt-0.5">${escapeHtml2(perm.description)}</p>` : ""}
|
|
2202
2142
|
</div>
|
|
2203
2143
|
<div class="flex-shrink-0">
|
|
2204
2144
|
${checkboxHtml}
|
|
2205
2145
|
</div>
|
|
2206
2146
|
</div>`;
|
|
2207
2147
|
}).join("\n");
|
|
2208
|
-
const idAttr = id ? `id="${
|
|
2148
|
+
const idAttr = id ? `id="${escapeHtml2(id)}"` : "";
|
|
2209
2149
|
return `<div class="permission-list ${className}" ${idAttr}>
|
|
2210
2150
|
${titleHtml}
|
|
2211
2151
|
<div class="space-y-2">
|
|
@@ -2235,8 +2175,8 @@ function featureList(features, options = {}) {
|
|
|
2235
2175
|
return `<li class="flex items-start gap-3">
|
|
2236
2176
|
<div class="flex-shrink-0 mt-0.5">${iconHtml}</div>
|
|
2237
2177
|
<div class="flex-1">
|
|
2238
|
-
<span class="${textClasses}">${
|
|
2239
|
-
${feature.description ? `<p class="text-sm text-text-secondary">${
|
|
2178
|
+
<span class="${textClasses}">${escapeHtml2(feature.name)}</span>
|
|
2179
|
+
${feature.description ? `<p class="text-sm text-text-secondary">${escapeHtml2(feature.description)}</p>` : ""}
|
|
2240
2180
|
</div>
|
|
2241
2181
|
</li>`;
|
|
2242
2182
|
}).join("\n");
|
|
@@ -2258,7 +2198,7 @@ function descriptionList(items, options = {}) {
|
|
|
2258
2198
|
const hasCopyable = items.some((item) => item.copyable);
|
|
2259
2199
|
if (layout === "horizontal") {
|
|
2260
2200
|
const itemsHtml2 = items.map((item) => {
|
|
2261
|
-
const copyBtn = item.copyable ? `<button type="button" onclick="copyToClipboard('${
|
|
2201
|
+
const copyBtn = item.copyable ? `<button type="button" onclick="copyToClipboard('${escapeHtml2(
|
|
2262
2202
|
item.description
|
|
2263
2203
|
)}', this)" class="ml-2 p-1 rounded hover:bg-gray-100 transition-colors">
|
|
2264
2204
|
<svg class="w-4 h-4 text-text-secondary" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
@@ -2266,9 +2206,9 @@ function descriptionList(items, options = {}) {
|
|
|
2266
2206
|
</svg>
|
|
2267
2207
|
</button>` : "";
|
|
2268
2208
|
return `<div class="py-3 sm:grid sm:grid-cols-3 sm:gap-4 ${dividers ? "border-b border-divider" : ""}">
|
|
2269
|
-
<dt class="text-sm font-medium text-text-secondary">${
|
|
2209
|
+
<dt class="text-sm font-medium text-text-secondary">${escapeHtml2(item.term)}</dt>
|
|
2270
2210
|
<dd class="mt-1 sm:mt-0 sm:col-span-2 text-sm text-text-primary flex items-center">
|
|
2271
|
-
${
|
|
2211
|
+
${escapeHtml2(item.description)}
|
|
2272
2212
|
${copyBtn}
|
|
2273
2213
|
</dd>
|
|
2274
2214
|
</div>`;
|
|
@@ -2277,7 +2217,7 @@ function descriptionList(items, options = {}) {
|
|
|
2277
2217
|
}
|
|
2278
2218
|
if (layout === "grid") {
|
|
2279
2219
|
const itemsHtml2 = items.map((item) => {
|
|
2280
|
-
const copyBtn = item.copyable ? `<button type="button" onclick="copyToClipboard('${
|
|
2220
|
+
const copyBtn = item.copyable ? `<button type="button" onclick="copyToClipboard('${escapeHtml2(
|
|
2281
2221
|
item.description
|
|
2282
2222
|
)}', this)" class="absolute top-2 right-2 p-1 rounded hover:bg-gray-100 transition-colors">
|
|
2283
2223
|
<svg class="w-4 h-4 text-text-secondary" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
@@ -2285,15 +2225,15 @@ function descriptionList(items, options = {}) {
|
|
|
2285
2225
|
</svg>
|
|
2286
2226
|
</button>` : "";
|
|
2287
2227
|
return `<div class="relative p-4 bg-gray-50 rounded-lg">
|
|
2288
|
-
<dt class="text-sm font-medium text-text-secondary">${
|
|
2289
|
-
<dd class="mt-1 text-sm text-text-primary font-medium">${
|
|
2228
|
+
<dt class="text-sm font-medium text-text-secondary">${escapeHtml2(item.term)}</dt>
|
|
2229
|
+
<dd class="mt-1 text-sm text-text-primary font-medium">${escapeHtml2(item.description)}</dd>
|
|
2290
2230
|
${copyBtn}
|
|
2291
2231
|
</div>`;
|
|
2292
2232
|
}).join("\n");
|
|
2293
2233
|
return `<dl class="grid grid-cols-2 gap-4 ${className}">${itemsHtml2}</dl>${hasCopyable ? copyScript : ""}`;
|
|
2294
2234
|
}
|
|
2295
2235
|
const itemsHtml = items.map((item) => {
|
|
2296
|
-
const copyBtn = item.copyable ? `<button type="button" onclick="copyToClipboard('${
|
|
2236
|
+
const copyBtn = item.copyable ? `<button type="button" onclick="copyToClipboard('${escapeHtml2(
|
|
2297
2237
|
item.description
|
|
2298
2238
|
)}', this)" class="ml-2 p-1 rounded hover:bg-gray-100 transition-colors">
|
|
2299
2239
|
<svg class="w-4 h-4 text-text-secondary" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
@@ -2301,9 +2241,9 @@ function descriptionList(items, options = {}) {
|
|
|
2301
2241
|
</svg>
|
|
2302
2242
|
</button>` : "";
|
|
2303
2243
|
return `<div class="${dividers ? "py-3 border-b border-divider last:border-0" : "py-2"}">
|
|
2304
|
-
<dt class="text-sm text-text-secondary">${
|
|
2244
|
+
<dt class="text-sm text-text-secondary">${escapeHtml2(item.term)}</dt>
|
|
2305
2245
|
<dd class="mt-1 text-sm text-text-primary font-medium flex items-center">
|
|
2306
|
-
${
|
|
2246
|
+
${escapeHtml2(item.description)}
|
|
2307
2247
|
${copyBtn}
|
|
2308
2248
|
</dd>
|
|
2309
2249
|
</div>`;
|
|
@@ -2320,10 +2260,10 @@ function actionList(items, className = "") {
|
|
|
2320
2260
|
const contentHtml = `
|
|
2321
2261
|
${iconHtml}
|
|
2322
2262
|
<div class="flex-1 min-w-0">
|
|
2323
|
-
<div class="font-medium ${item.destructive ? "text-danger" : "text-text-primary"}">${
|
|
2263
|
+
<div class="font-medium ${item.destructive ? "text-danger" : "text-text-primary"}">${escapeHtml2(
|
|
2324
2264
|
item.label
|
|
2325
2265
|
)}</div>
|
|
2326
|
-
${item.description ? `<p class="text-sm text-text-secondary">${
|
|
2266
|
+
${item.description ? `<p class="text-sm text-text-secondary">${escapeHtml2(item.description)}</p>` : ""}
|
|
2327
2267
|
</div>
|
|
2328
2268
|
<svg class="w-5 h-5 text-text-secondary" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
2329
2269
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 5l7 7-7 7"/>
|
|
@@ -2333,7 +2273,7 @@ function actionList(items, className = "") {
|
|
|
2333
2273
|
return `<div class="${baseClasses}">${contentHtml}</div>`;
|
|
2334
2274
|
}
|
|
2335
2275
|
if (item.href) {
|
|
2336
|
-
return `<a href="${
|
|
2276
|
+
return `<a href="${escapeHtml2(item.href)}" class="${baseClasses}">${contentHtml}</a>`;
|
|
2337
2277
|
}
|
|
2338
2278
|
return `<div class="${baseClasses}">${contentHtml}</div>`;
|
|
2339
2279
|
}).join("\n");
|