@kitn.ai/ui 0.14.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +394 -0
- package/dist/bash-InADTalH.js +1 -0
- package/dist/core-AYMC6_lb.js +12 -0
- package/dist/css-M7EaDHN_.js +1 -0
- package/dist/custom-elements.json +4739 -0
- package/dist/engine-javascript-vq0WuIJl.js +141 -0
- package/dist/github-dark-dimmed-DUshB20C.js +1 -0
- package/dist/github-light-JYsPkUQd.js +1 -0
- package/dist/host-embed.d.ts +33 -0
- package/dist/html-CPZ3oZQ7.js +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/javascript-C25yR2R2.js +1 -0
- package/dist/json-DxJze_jm.js +1 -0
- package/dist/kitn-chat-provider.d.ts +2 -0
- package/dist/kitn-chat-provider.es.js +240 -0
- package/dist/kitn-chat.es.js +77 -0
- package/dist/llms/llms-full.txt +1018 -0
- package/dist/llms/llms.txt +104 -0
- package/dist/origin.d.ts +5 -0
- package/dist/provider-runtime.d.ts +27 -0
- package/dist/schemas/card-envelope.schema.json +14 -0
- package/dist/schemas/card-event.schema.json +12 -0
- package/dist/schemas/choice.schema.json +70 -0
- package/dist/schemas/confirm.schema.json +65 -0
- package/dist/schemas/embed.schema.json +65 -0
- package/dist/schemas/form.result.schema.json +7 -0
- package/dist/schemas/form.schema.json +33 -0
- package/dist/schemas/link.schema.json +56 -0
- package/dist/schemas/tasks.result.schema.json +16 -0
- package/dist/schemas/tasks.schema.json +78 -0
- package/dist/svelte--5p79yCD.js +1 -0
- package/dist/theme.tokens.css +176 -0
- package/dist/tsx-B8rCNbgL.js +1 -0
- package/dist/typescript-RycA9KXf.js +1 -0
- package/dist/validate.d.ts +4 -0
- package/dist/version.d.ts +4 -0
- package/dist/vue-BmIZj4XD.js +1 -0
- package/dist/wire.d.ts +53 -0
- package/frameworks/react/index.tsx +948 -0
- package/frameworks/react/runtime.tsx +94 -0
- package/llms-full.txt +1018 -0
- package/llms.txt +104 -0
- package/package.json +141 -0
- package/src/components/artifact.stories.tsx +138 -0
- package/src/components/artifact.tsx +743 -0
- package/src/components/attachments.stories.tsx +303 -0
- package/src/components/attachments.test.tsx +64 -0
- package/src/components/attachments.tsx +399 -0
- package/src/components/card-fallback.tsx +28 -0
- package/src/components/card-renderer.tsx +52 -0
- package/src/components/card.tsx +110 -0
- package/src/components/chain-of-thought.stories.tsx +211 -0
- package/src/components/chain-of-thought.tsx +139 -0
- package/src/components/chat-container.stories.tsx +187 -0
- package/src/components/chat-container.tsx +82 -0
- package/src/components/chat-scope-picker.tsx +47 -0
- package/src/components/chat-thread.test.tsx +58 -0
- package/src/components/chat-thread.tsx +249 -0
- package/src/components/checkpoint.stories.tsx +102 -0
- package/src/components/checkpoint.tsx +88 -0
- package/src/components/choice-card.tsx +569 -0
- package/src/components/code-block.stories.tsx +150 -0
- package/src/components/code-block.tsx +105 -0
- package/src/components/component-meta.json +3735 -0
- package/src/components/confirm-card.stories.tsx +74 -0
- package/src/components/confirm-card.tsx +315 -0
- package/src/components/context.stories.tsx +229 -0
- package/src/components/context.test.tsx +133 -0
- package/src/components/context.tsx +363 -0
- package/src/components/conversation-item.stories.tsx +125 -0
- package/src/components/conversation-item.tsx +16 -0
- package/src/components/conversation-list.stories.tsx +133 -0
- package/src/components/conversation-list.tsx +101 -0
- package/src/components/default-input.test.tsx +111 -0
- package/src/components/embed.tsx +196 -0
- package/src/components/empty.stories.tsx +434 -0
- package/src/components/empty.tsx +166 -0
- package/src/components/feedback-bar.stories.tsx +138 -0
- package/src/components/feedback-bar.test.tsx +103 -0
- package/src/components/feedback-bar.tsx +166 -0
- package/src/components/file-tree.stories.tsx +73 -0
- package/src/components/file-tree.tsx +383 -0
- package/src/components/file-upload.stories.tsx +156 -0
- package/src/components/file-upload.tsx +161 -0
- package/src/components/form-widgets.tsx +461 -0
- package/src/components/form.tsx +873 -0
- package/src/components/image.stories.tsx +89 -0
- package/src/components/image.tsx +67 -0
- package/src/components/link-preview.tsx +194 -0
- package/src/components/loader.stories.tsx +181 -0
- package/src/components/loader.tsx +333 -0
- package/src/components/markdown.stories.tsx +180 -0
- package/src/components/markdown.tsx +81 -0
- package/src/components/message-action-bar.test.tsx +128 -0
- package/src/components/message-narrow.stories.tsx +329 -0
- package/src/components/message-skills.stories.tsx +211 -0
- package/src/components/message-skills.tsx +36 -0
- package/src/components/message.stories.tsx +281 -0
- package/src/components/message.tsx +227 -0
- package/src/components/model-switcher.stories.tsx +123 -0
- package/src/components/model-switcher.test.tsx +65 -0
- package/src/components/model-switcher.tsx +87 -0
- package/src/components/prompt-input.stories.tsx +222 -0
- package/src/components/prompt-input.tsx +211 -0
- package/src/components/prompt-suggestion.stories.tsx +142 -0
- package/src/components/prompt-suggestion.tsx +115 -0
- package/src/components/reasoning.stories.tsx +140 -0
- package/src/components/reasoning.tsx +156 -0
- package/src/components/resizable.test.tsx +226 -0
- package/src/components/response-stream.tsx +103 -0
- package/src/components/scroll-button.stories.tsx +100 -0
- package/src/components/scroll-button.tsx +34 -0
- package/src/components/slash-command.stories.tsx +163 -0
- package/src/components/slash-command.tsx +232 -0
- package/src/components/source-list.test.tsx +152 -0
- package/src/components/source.stories.tsx +124 -0
- package/src/components/source.tsx +129 -0
- package/src/components/tasks-card.stories.tsx +78 -0
- package/src/components/tasks-card.tsx +432 -0
- package/src/components/text-shimmer.stories.tsx +87 -0
- package/src/components/text-shimmer.tsx +37 -0
- package/src/components/thinking-bar.stories.tsx +87 -0
- package/src/components/thinking-bar.tsx +50 -0
- package/src/components/tool.stories.tsx +153 -0
- package/src/components/tool.tsx +184 -0
- package/src/components/use-card-resolution.ts +28 -0
- package/src/components/voice-input.stories.tsx +83 -0
- package/src/components/voice-input.tsx +107 -0
- package/src/elements/artifact.stories.tsx +506 -0
- package/src/elements/artifact.tsx +137 -0
- package/src/elements/attachments.stories.tsx +190 -0
- package/src/elements/attachments.tsx +136 -0
- package/src/elements/card.stories.tsx +113 -0
- package/src/elements/card.tsx +40 -0
- package/src/elements/cards.stories.tsx +59 -0
- package/src/elements/cards.tsx +97 -0
- package/src/elements/catalog.stories.tsx +491 -0
- package/src/elements/chain-of-thought.declarative.test.tsx +153 -0
- package/src/elements/chain-of-thought.stories.tsx +113 -0
- package/src/elements/chain-of-thought.tsx +92 -0
- package/src/elements/chat-scope-picker.stories.tsx +73 -0
- package/src/elements/chat-scope-picker.tsx +36 -0
- package/src/elements/chat-types.ts +42 -0
- package/src/elements/chat-workspace.stories.tsx +288 -0
- package/src/elements/chat-workspace.tsx +161 -0
- package/src/elements/chat.stories.tsx +151 -0
- package/src/elements/chat.tsx +80 -0
- package/src/elements/checkpoint.stories.tsx +72 -0
- package/src/elements/checkpoint.tsx +47 -0
- package/src/elements/choice.stories.tsx +240 -0
- package/src/elements/choice.tsx +48 -0
- package/src/elements/code-block.stories.tsx +83 -0
- package/src/elements/code-block.tsx +42 -0
- package/src/elements/compiled.css +2 -0
- package/src/elements/composed-shell.stories.tsx +316 -0
- package/src/elements/confirm-card.stories.tsx +227 -0
- package/src/elements/confirm-card.tsx +51 -0
- package/src/elements/context-meter.stories.tsx +151 -0
- package/src/elements/context-meter.tsx +121 -0
- package/src/elements/conversation-list.declarative.test.tsx +137 -0
- package/src/elements/conversation-list.stories.tsx +243 -0
- package/src/elements/conversation-list.tsx +80 -0
- package/src/elements/css.ts +5 -0
- package/src/elements/default-input.tsx +247 -0
- package/src/elements/define.tsx +171 -0
- package/src/elements/element-meta.json +3314 -0
- package/src/elements/element-types.d.ts +710 -0
- package/src/elements/embed.stories.tsx +213 -0
- package/src/elements/embed.tsx +35 -0
- package/src/elements/empty.stories.tsx +111 -0
- package/src/elements/empty.tsx +29 -0
- package/src/elements/feedback-bar.stories.tsx +114 -0
- package/src/elements/feedback-bar.tsx +61 -0
- package/src/elements/file-tree.stories.tsx +134 -0
- package/src/elements/file-tree.tsx +52 -0
- package/src/elements/file-upload.stories.tsx +82 -0
- package/src/elements/file-upload.tsx +44 -0
- package/src/elements/form.stories.tsx +248 -0
- package/src/elements/form.tsx +43 -0
- package/src/elements/framework-usage.json +563 -0
- package/src/elements/image.stories.tsx +71 -0
- package/src/elements/image.tsx +32 -0
- package/src/elements/link-preview.stories.tsx +209 -0
- package/src/elements/link-preview.tsx +34 -0
- package/src/elements/loader.stories.tsx +88 -0
- package/src/elements/loader.tsx +25 -0
- package/src/elements/markdown.stories.tsx +76 -0
- package/src/elements/markdown.tsx +38 -0
- package/src/elements/message-skills.declarative.test.tsx +104 -0
- package/src/elements/message-skills.stories.tsx +114 -0
- package/src/elements/message-skills.tsx +85 -0
- package/src/elements/message.stories.tsx +218 -0
- package/src/elements/message.tsx +162 -0
- package/src/elements/model-switcher.declarative.test.tsx +130 -0
- package/src/elements/model-switcher.stories.tsx +198 -0
- package/src/elements/model-switcher.tsx +93 -0
- package/src/elements/popover.stories.tsx +80 -0
- package/src/elements/popover.tsx +59 -0
- package/src/elements/prompt-input-slash-command.test.tsx +128 -0
- package/src/elements/prompt-input-stoppable.test.tsx +88 -0
- package/src/elements/prompt-input-toolbar-actions.test.tsx +120 -0
- package/src/elements/prompt-input.stories.tsx +331 -0
- package/src/elements/prompt-input.tsx +185 -0
- package/src/elements/prompt-suggestions.declarative.test.tsx +164 -0
- package/src/elements/prompt-suggestions.stories.tsx +213 -0
- package/src/elements/prompt-suggestions.tsx +94 -0
- package/src/elements/reasoning.stories.tsx +77 -0
- package/src/elements/reasoning.tsx +50 -0
- package/src/elements/register.ts +56 -0
- package/src/elements/remote.stories.tsx +314 -0
- package/src/elements/remote.tsx +221 -0
- package/src/elements/resizable.d.ts +27 -0
- package/src/elements/resizable.stories.tsx +426 -0
- package/src/elements/resizable.tsx +553 -0
- package/src/elements/response-stream.stories.tsx +79 -0
- package/src/elements/response-stream.tsx +40 -0
- package/src/elements/scroll-button.stories.tsx +202 -0
- package/src/elements/scroll-button.test.tsx +148 -0
- package/src/elements/scroll-button.tsx +126 -0
- package/src/elements/source-list.stories.tsx +143 -0
- package/src/elements/source.stories.tsx +88 -0
- package/src/elements/source.tsx +120 -0
- package/src/elements/styles.css +199 -0
- package/src/elements/switch.stories.tsx +56 -0
- package/src/elements/switch.tsx +43 -0
- package/src/elements/tasks.stories.tsx +237 -0
- package/src/elements/tasks.tsx +46 -0
- package/src/elements/text-shimmer.stories.tsx +64 -0
- package/src/elements/text-shimmer.tsx +28 -0
- package/src/elements/thinking-bar.stories.tsx +72 -0
- package/src/elements/thinking-bar.tsx +34 -0
- package/src/elements/tool.stories.tsx +89 -0
- package/src/elements/tool.tsx +23 -0
- package/src/elements/voice-input.stories.tsx +88 -0
- package/src/elements/voice-input.tsx +41 -0
- package/src/index.ts +253 -0
- package/src/primitives/card-contract.ts +71 -0
- package/src/primitives/card-host.tsx +35 -0
- package/src/primitives/card-registry.tsx +67 -0
- package/src/primitives/card-resolution.ts +36 -0
- package/src/primitives/card-routing.ts +79 -0
- package/src/primitives/card-schemas/card-envelope.schema.json +14 -0
- package/src/primitives/card-schemas/card-event.schema.json +12 -0
- package/src/primitives/card-schemas/choice.schema.json +70 -0
- package/src/primitives/card-schemas/confirm.schema.json +65 -0
- package/src/primitives/card-schemas/embed.schema.json +65 -0
- package/src/primitives/card-schemas/form.result.schema.json +7 -0
- package/src/primitives/card-schemas/form.schema.json +33 -0
- package/src/primitives/card-schemas/link.schema.json +56 -0
- package/src/primitives/card-schemas/tasks.result.schema.json +16 -0
- package/src/primitives/card-schemas/tasks.schema.json +78 -0
- package/src/primitives/card-validate.ts +95 -0
- package/src/primitives/chat-config.tsx +76 -0
- package/src/primitives/controllable.test.ts +47 -0
- package/src/primitives/controllable.ts +21 -0
- package/src/primitives/embed-providers.ts +254 -0
- package/src/primitives/highlighter.ts +157 -0
- package/src/primitives/link-preview.ts +87 -0
- package/src/primitives/pdf-preview.ts +121 -0
- package/src/primitives/use-auto-resize.ts +31 -0
- package/src/primitives/use-resize-observer.ts +12 -0
- package/src/primitives/use-stick-to-bottom.ts +43 -0
- package/src/primitives/use-text-stream.ts +112 -0
- package/src/primitives/use-voice-recorder.ts +50 -0
- package/src/remote/host-embed.ts +345 -0
- package/src/remote/index.ts +2 -0
- package/src/remote/origin.ts +30 -0
- package/src/remote/provider-runtime.ts +259 -0
- package/src/remote/provider.ts +2 -0
- package/src/remote/validate.ts +22 -0
- package/src/remote/version.ts +12 -0
- package/src/remote/wire.ts +48 -0
- package/src/stories/chat-panel-layout.stories.tsx +145 -0
- package/src/stories/chat-scene.tsx +571 -0
- package/src/stories/checkpoint-restore.stories.tsx +256 -0
- package/src/stories/context-usage.stories.tsx +212 -0
- package/src/stories/conversation-with-reasoning.stories.tsx +182 -0
- package/src/stories/conversation-with-sources.stories.tsx +471 -0
- package/src/stories/docs/Accessibility.mdx +119 -0
- package/src/stories/docs/ChildElements.mdx +269 -0
- package/src/stories/docs/ForAIAgents.mdx +162 -0
- package/src/stories/docs/GettingStarted.mdx +65 -0
- package/src/stories/docs/Installation.mdx +83 -0
- package/src/stories/docs/Introduction.mdx +50 -0
- package/src/stories/docs/SolidJsAdvanced.mdx +17 -0
- package/src/stories/docs/Theming.mdx +85 -0
- package/src/stories/docs/element-controls.ts +121 -0
- package/src/stories/docs/frameworks/Angular.mdx +245 -0
- package/src/stories/docs/frameworks/Html.mdx +227 -0
- package/src/stories/docs/frameworks/Overview.mdx +47 -0
- package/src/stories/docs/frameworks/React.mdx +227 -0
- package/src/stories/docs/frameworks/Solid.mdx +173 -0
- package/src/stories/docs/frameworks/Svelte.mdx +194 -0
- package/src/stories/docs/frameworks/Vue.mdx +238 -0
- package/src/stories/docs/generative-ui-overview.mdx +186 -0
- package/src/stories/docs/recipes/SpeechToText.mdx +7 -0
- package/src/stories/docs/recipes/Streaming.mdx +68 -0
- package/src/stories/docs/recipes/TextToSpeech.mdx +35 -0
- package/src/stories/docs/theme-editor/canvas.tsx +32 -0
- package/src/stories/docs/theme-editor/inspector.tsx +66 -0
- package/src/stories/docs/theme-editor/presets.test.ts +32 -0
- package/src/stories/docs/theme-editor/presets.ts +64 -0
- package/src/stories/docs/theme-editor/theme-css.test.ts +19 -0
- package/src/stories/docs/theme-editor/theme-css.ts +15 -0
- package/src/stories/docs/theme-editor/theme-editor.tsx +146 -0
- package/src/stories/docs/theme-tokens.tsx +174 -0
- package/src/stories/examples/ChoosingComponents.mdx +106 -0
- package/src/stories/examples/sample-data.ts +79 -0
- package/src/stories/examples/usage/checkpoint-restore.ts +156 -0
- package/src/stories/examples/usage/context-usage.ts +591 -0
- package/src/stories/examples/usage/conversation-with-reasoning.ts +224 -0
- package/src/stories/examples/usage/conversation-with-sources.ts +589 -0
- package/src/stories/examples/usage/empty-state.ts +144 -0
- package/src/stories/examples/usage/full-chat-app.ts +277 -0
- package/src/stories/examples/usage/index.ts +63 -0
- package/src/stories/examples/usage/message-actions.ts +704 -0
- package/src/stories/examples/usage/pattern-centered-conversation.ts +446 -0
- package/src/stories/examples/usage/pattern-chat-panel-layout.ts +442 -0
- package/src/stories/examples/usage/pattern-docked-widget.ts +479 -0
- package/src/stories/examples/usage/prompt-input-variants.ts +1356 -0
- package/src/stories/examples/usage/streaming-response.ts +687 -0
- package/src/stories/examples/usage/types.ts +33 -0
- package/src/stories/full-chat.stories.tsx +18 -0
- package/src/stories/message-actions.stories.tsx +230 -0
- package/src/stories/pattern-centered-conversation.stories.tsx +93 -0
- package/src/stories/pattern-docked-widget.stories.tsx +93 -0
- package/src/stories/pattern-empty-state.stories.tsx +76 -0
- package/src/stories/prompt-input-variants.stories.tsx +456 -0
- package/src/stories/streaming-response.stories.tsx +438 -0
- package/src/stories/theme-editor.stories.tsx +16 -0
- package/src/stories/token-reference.stories.tsx +18 -0
- package/src/stories/typography.stories.tsx +78 -0
- package/src/types.ts +47 -0
- package/src/ui/action-icons.ts +52 -0
- package/src/ui/avatar.stories.tsx +103 -0
- package/src/ui/avatar.tsx +23 -0
- package/src/ui/badge.stories.tsx +86 -0
- package/src/ui/badge.tsx +21 -0
- package/src/ui/button.stories.tsx +145 -0
- package/src/ui/button.tsx +38 -0
- package/src/ui/collapsible.stories.tsx +69 -0
- package/src/ui/collapsible.tsx +125 -0
- package/src/ui/dropdown.stories.tsx +59 -0
- package/src/ui/dropdown.tsx +196 -0
- package/src/ui/hover-card.stories.tsx +77 -0
- package/src/ui/hover-card.test.tsx +30 -0
- package/src/ui/hover-card.tsx +172 -0
- package/src/ui/overlay.stories.tsx +115 -0
- package/src/ui/overlay.tsx +158 -0
- package/src/ui/popover.stories.tsx +81 -0
- package/src/ui/popover.test.tsx +99 -0
- package/src/ui/popover.tsx +92 -0
- package/src/ui/resizable.stories.tsx +236 -0
- package/src/ui/resizable.tsx +576 -0
- package/src/ui/scroll-area.stories.tsx +50 -0
- package/src/ui/scroll-area.tsx +15 -0
- package/src/ui/separator.stories.tsx +81 -0
- package/src/ui/separator.tsx +10 -0
- package/src/ui/skeleton.stories.tsx +337 -0
- package/src/ui/skeleton.tsx +16 -0
- package/src/ui/switch.stories.tsx +51 -0
- package/src/ui/switch.test.tsx +59 -0
- package/src/ui/switch.tsx +62 -0
- package/src/ui/textarea.stories.tsx +76 -0
- package/src/ui/textarea.tsx +21 -0
- package/src/ui/tooltip.stories.tsx +74 -0
- package/src/ui/tooltip.tsx +68 -0
- package/src/utils/cn.ts +24 -0
- package/theme.css +187 -0
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
<!-- AUTO-GENERATED by scripts/gen-llms.mjs — do not edit by hand. Run `npm run build`. -->
|
|
2
|
+
# @kitn.ai/ui
|
|
3
|
+
|
|
4
|
+
> Framework-agnostic, Shadow-DOM web components for building AI chat interfaces — works in React, Vue, Angular, Svelte, or plain HTML. 44 `kitn-*` custom elements: streaming responses, markdown + code rendering, reasoning/tool panels, attachments, conversation sidebar, voice input. Zero framework dependency for consumers; the SolidJS runtime it is authored in is bundled in, so the host needs nothing.
|
|
5
|
+
|
|
6
|
+
## Install
|
|
7
|
+
|
|
8
|
+
```bash
|
|
9
|
+
npm install @kitn.ai/ui
|
|
10
|
+
# SolidJS consumers also need the peer dep:
|
|
11
|
+
npm install solid-js
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
## #1 rule: array/object data goes on JS PROPERTIES, not HTML attributes
|
|
15
|
+
|
|
16
|
+
This is the single most common mistake. Arrays and objects (`messages`, `models`, `context`, `suggestions`, `slashCommands`, …) MUST be assigned as JavaScript properties on the element. They CANNOT be passed as HTML attributes — an HTML attribute is always a string and will be ignored or mis-parsed.
|
|
17
|
+
|
|
18
|
+
```js
|
|
19
|
+
const chat = document.querySelector('kai-chat');
|
|
20
|
+
chat.messages = [{ id: '1', role: 'assistant', content: 'Hi!' }]; // ✅ property
|
|
21
|
+
```
|
|
22
|
+
```html
|
|
23
|
+
<kai-chat messages="[...]"></kai-chat> <!-- ❌ never works -->
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
Only scalar values (string/number/boolean) work as attributes (e.g. `placeholder`, `loading`, `theme`).
|
|
27
|
+
|
|
28
|
+
## Two layers
|
|
29
|
+
|
|
30
|
+
**Layer 1 — batteries-included web components** (`import '@kitn.ai/ui/elements'`):
|
|
31
|
+
Drop an element into any framework (React, Vue, plain HTML). Data in via JS properties; interactions out via non-bubbling CustomEvents.
|
|
32
|
+
|
|
33
|
+
- `<kai-chat>` — full chat UI (message list + prompt input). The primary starting point.
|
|
34
|
+
- `<kai-conversations>` — sidebar conversation browser with group support.
|
|
35
|
+
- `<kai-prompt-input>` — standalone composer with send button.
|
|
36
|
+
|
|
37
|
+
**Layer 2 — composable primitives** (`import { … } from '@kitn.ai/ui'`):
|
|
38
|
+
All 44 elements are also exported individually. Use them for custom layouts or features `<kai-chat>` does not expose (ChainOfThought, FeedbackBar, ThinkingBar, VoiceInput, …). Your bundler tree-shakes the rest.
|
|
39
|
+
|
|
40
|
+
## Key rules for the web components
|
|
41
|
+
|
|
42
|
+
1. **Array/object data = JS properties** (see above). Scalars may be attributes.
|
|
43
|
+
2. **Events are non-bubbling `CustomEvent`s** — listen directly on the element:
|
|
44
|
+
`chat.addEventListener('kai-submit', (e) => console.log(e.detail.value))`
|
|
45
|
+
3. **`theme` attribute** (`'light' | 'dark' | 'auto'`) works on every element. Default `auto` follows `prefers-color-scheme`.
|
|
46
|
+
4. **Theming via CSS custom properties** — override `--kai-color-*` tokens on `:root`; they pierce Shadow DOM.
|
|
47
|
+
|
|
48
|
+
## ChatMessage schema (required for `<kai-chat>`)
|
|
49
|
+
|
|
50
|
+
```ts
|
|
51
|
+
interface ChatMessage {
|
|
52
|
+
id: string;
|
|
53
|
+
role: 'user' | 'assistant';
|
|
54
|
+
content: string;
|
|
55
|
+
reasoning?: { text: string; label?: string };
|
|
56
|
+
tools?: ToolPart[];
|
|
57
|
+
attachments?: AttachmentData[];
|
|
58
|
+
actions?: ('copy' | 'like' | 'dislike' | 'regenerate' | 'edit')[];
|
|
59
|
+
}
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
## Framework wiring
|
|
63
|
+
|
|
64
|
+
**Plain HTML / CDN**
|
|
65
|
+
```html
|
|
66
|
+
<script type="module" src="https://unpkg.com/@kitn.ai/ui/elements"></script>
|
|
67
|
+
<kai-chat style="display:block;height:100vh"></kai-chat>
|
|
68
|
+
<script type="module">
|
|
69
|
+
const chat = document.querySelector('kai-chat');
|
|
70
|
+
chat.messages = [];
|
|
71
|
+
</script>
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
**React** — typed wrappers auto-set properties and expose `on<Event>` props:
|
|
75
|
+
```tsx
|
|
76
|
+
import { Chat } from '@kitn.ai/ui/react';
|
|
77
|
+
<Chat messages={messages} onSubmit={(e) => send(e.detail.value)} />
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
**Vue** — use the element directly; pass arrays via `.prop`:
|
|
81
|
+
```vue
|
|
82
|
+
<kai-chat :messages.prop="messages" @kai-submit="send" />
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
## Theming
|
|
86
|
+
|
|
87
|
+
```css
|
|
88
|
+
:root {
|
|
89
|
+
--kai-color-background: #0f0f0f;
|
|
90
|
+
--kai-color-primary: #7c3aed;
|
|
91
|
+
--kai-color-muted: #1e1e1e;
|
|
92
|
+
}
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
For plain HTML/CDN: `<link rel="stylesheet" href="…/@kitn.ai/ui/theme.tokens.css">`.
|
|
96
|
+
For Tailwind builds: `@import "@kitn.ai/ui/theme.css"` in your CSS.
|
|
97
|
+
|
|
98
|
+
## Docs
|
|
99
|
+
|
|
100
|
+
- Full element reference (all 44 elements, every prop/event): ./llms-full.txt — https://kitn.dev/llms-full.txt
|
|
101
|
+
- Machine-readable Custom Elements Manifest: https://unpkg.com/@kitn.ai/ui/dist/custom-elements.json
|
|
102
|
+
- Working examples: https://github.com/kitn-ai/ui/tree/main/examples
|
|
103
|
+
- Storybook: https://storybook.kitn.dev
|
|
104
|
+
- Repository: https://github.com/kitn-ai/ui
|
package/dist/origin.d.ts
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export declare function assertOrigin(actual: string, expected: string): boolean;
|
|
2
|
+
/** Fail-closed precondition (H-F): the iframe must be cross-origin to the host so
|
|
3
|
+
* `allow-same-origin` can't reach host DOM, and `src` must be on the provider origin. */
|
|
4
|
+
export declare function assertCrossOrigin(src: string, providerOrigin: string, hostOrigin: string): void;
|
|
5
|
+
export declare function redactFrame(value: unknown): unknown;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { CardEnvelope, CardHost } from '../primitives/card-contract';
|
|
2
|
+
import { JsonSchema } from '../primitives/card-validate';
|
|
3
|
+
/** A provider-side renderer for one card `type`. Renamed (was CardRenderer) per H-K
|
|
4
|
+
* to avoid colliding with the exported Solid `<CardRenderer>` component. */
|
|
5
|
+
export interface RemoteCardRenderer {
|
|
6
|
+
/** The card `type` this renderer handles. */
|
|
7
|
+
type: string;
|
|
8
|
+
/** Optional JSON Schema for this type's `data`; validated best-effort before mount. */
|
|
9
|
+
schema?: JsonSchema;
|
|
10
|
+
/** Mount into `root`, given the envelope + a CardHost. Return a disposer. */
|
|
11
|
+
mount(root: HTMLElement, envelope: CardEnvelope, host: CardHost): () => void;
|
|
12
|
+
}
|
|
13
|
+
export interface CreateCardBridgeOptions {
|
|
14
|
+
/** Element the card mounts into + whose height is observed. */
|
|
15
|
+
root: HTMLElement;
|
|
16
|
+
/** Renderers by card type. Unknown type → inline "unsupported card" + event{error}. */
|
|
17
|
+
renderers: RemoteCardRenderer[];
|
|
18
|
+
/** Versions this runtime supports (default ['1']). */
|
|
19
|
+
supportedVersions?: string[];
|
|
20
|
+
}
|
|
21
|
+
export interface CardBridge {
|
|
22
|
+
/** Begin: listen for `hello`, complete handshake, render on `render`. */
|
|
23
|
+
start(): void;
|
|
24
|
+
/** Stop observers + listeners + dispose current card. */
|
|
25
|
+
stop(): void;
|
|
26
|
+
}
|
|
27
|
+
export declare function createCardBridge(options: CreateCardBridgeOptions): CardBridge;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://kitn.ai/schemas/card/card-envelope.schema.json",
|
|
4
|
+
"title": "CardEnvelope",
|
|
5
|
+
"description": "A card the agent/server asks the chat to render. `data` validates against the per-type schema.",
|
|
6
|
+
"type": "object",
|
|
7
|
+
"required": ["type", "id", "data"],
|
|
8
|
+
"properties": {
|
|
9
|
+
"type": { "type": "string", "minLength": 1 },
|
|
10
|
+
"id": { "type": "string", "minLength": 1 },
|
|
11
|
+
"data": {},
|
|
12
|
+
"title": { "type": "string" }
|
|
13
|
+
}
|
|
14
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://kitn.ai/schemas/card/card-event.schema.json",
|
|
4
|
+
"title": "CardEvent",
|
|
5
|
+
"description": "An event a card emits up to the host. `kind` discriminates the payload.",
|
|
6
|
+
"type": "object",
|
|
7
|
+
"required": ["kind"],
|
|
8
|
+
"properties": {
|
|
9
|
+
"kind": { "enum": ["ready", "submit", "action", "send-prompt", "open", "resize", "state", "dismiss", "error"] },
|
|
10
|
+
"cardId": { "type": "string" }
|
|
11
|
+
}
|
|
12
|
+
}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://kitn.ai/schemas/card/choice.schema.json",
|
|
4
|
+
"title": "ChoiceCardData",
|
|
5
|
+
"description": "Data payload for a `choice` card (CardEnvelope.data when type='choice'). A single-select 'pick one of N rich options' card; activating an option emits the `action` verb.",
|
|
6
|
+
"type": "object",
|
|
7
|
+
"required": ["options"],
|
|
8
|
+
"properties": {
|
|
9
|
+
"prompt": {
|
|
10
|
+
"type": "string",
|
|
11
|
+
"description": "Optional question/body text rendered above the options. Distinct from CardEnvelope.title (the card chrome heading)."
|
|
12
|
+
},
|
|
13
|
+
"submitLabel": {
|
|
14
|
+
"type": "string",
|
|
15
|
+
"description": "Label for the Submit button; default 'Submit'."
|
|
16
|
+
},
|
|
17
|
+
"options": {
|
|
18
|
+
"type": "array",
|
|
19
|
+
"minItems": 1,
|
|
20
|
+
"description": "The selectable options, rendered in order. Exactly one can be chosen.",
|
|
21
|
+
"items": {
|
|
22
|
+
"type": "object",
|
|
23
|
+
"required": ["id", "label"],
|
|
24
|
+
"properties": {
|
|
25
|
+
"id": {
|
|
26
|
+
"type": "string",
|
|
27
|
+
"minLength": 1,
|
|
28
|
+
"description": "Emitted as CardEvent.action. Must be unique within `options`. (The reserved id '__other__' is used by the allowOther escape.)",
|
|
29
|
+
"x-kai-unique": true
|
|
30
|
+
},
|
|
31
|
+
"label": { "type": "string", "minLength": 1, "description": "Visible option label." },
|
|
32
|
+
"description": {
|
|
33
|
+
"type": "string",
|
|
34
|
+
"description": "Optional secondary line under the label."
|
|
35
|
+
},
|
|
36
|
+
"media": {
|
|
37
|
+
"type": "object",
|
|
38
|
+
"description": "Optional leading media: an image URL or a named icon.",
|
|
39
|
+
"properties": {
|
|
40
|
+
"image": { "type": "string", "description": "Image URL rendered as a leading thumbnail in the row." },
|
|
41
|
+
"imageAlt": { "type": "string", "description": "Accessible alt text for `image` (decorative if omitted)." },
|
|
42
|
+
"icon": { "type": "string", "description": "Named icon rendered as a leading glyph." }
|
|
43
|
+
}
|
|
44
|
+
},
|
|
45
|
+
"meta": {
|
|
46
|
+
"type": "string",
|
|
47
|
+
"description": "Trailing freeform text (e.g. a price or badge), right-aligned in the row."
|
|
48
|
+
},
|
|
49
|
+
"recommended": {
|
|
50
|
+
"type": "boolean",
|
|
51
|
+
"default": false,
|
|
52
|
+
"description": "Renders a small 'Recommended' pill near the label."
|
|
53
|
+
},
|
|
54
|
+
"disabled": {
|
|
55
|
+
"type": "boolean",
|
|
56
|
+
"default": false,
|
|
57
|
+
"description": "Option is shown but not selectable, and skipped in keyboard nav."
|
|
58
|
+
},
|
|
59
|
+
"payload": {
|
|
60
|
+
"description": "Optional opaque payload echoed back in CardEvent.payload (any JSON)."
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
},
|
|
65
|
+
"allowOther": {
|
|
66
|
+
"description": "Optional free-text escape ('none of these / specify'). `true` appends a final 'Other…' option; an object customizes its `label`/`placeholder`. Selecting it reveals a text input; the shared Submit button then emits `{ kind:'action', action:'__other__', payload:{ text } }`.",
|
|
67
|
+
"x-kai-control": "allow-other"
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://kitn.ai/schemas/card/confirm.schema.json",
|
|
4
|
+
"title": "ConfirmCardData",
|
|
5
|
+
"description": "Data payload for a `confirm` card (CardEnvelope.data when type='confirm').",
|
|
6
|
+
"type": "object",
|
|
7
|
+
"required": ["actions"],
|
|
8
|
+
"properties": {
|
|
9
|
+
"heading": {
|
|
10
|
+
"type": "string",
|
|
11
|
+
"description": "Optional in-body heading. Distinct from CardEnvelope.title (the card chrome title)."
|
|
12
|
+
},
|
|
13
|
+
"body": {
|
|
14
|
+
"type": "string",
|
|
15
|
+
"description": "Body text. Plain text in v1 (rendered safely; no HTML injection)."
|
|
16
|
+
},
|
|
17
|
+
"tone": {
|
|
18
|
+
"type": "string",
|
|
19
|
+
"enum": ["default", "warning", "danger"],
|
|
20
|
+
"default": "default",
|
|
21
|
+
"description": "Overall card tone; 'danger' adds a warning icon + accent for destructive approvals.",
|
|
22
|
+
"x-kai-control": "tone"
|
|
23
|
+
},
|
|
24
|
+
"actions": {
|
|
25
|
+
"type": "array",
|
|
26
|
+
"minItems": 1,
|
|
27
|
+
"maxItems": 4,
|
|
28
|
+
"description": "The choice set. Rendered as buttons in order; max 4 keeps it a decision, not a menu.",
|
|
29
|
+
"items": {
|
|
30
|
+
"type": "object",
|
|
31
|
+
"required": ["id", "label"],
|
|
32
|
+
"properties": {
|
|
33
|
+
"id": {
|
|
34
|
+
"type": "string",
|
|
35
|
+
"minLength": 1,
|
|
36
|
+
"description": "Emitted as CardEvent.action. Must be unique within `actions`.",
|
|
37
|
+
"x-kai-unique": true
|
|
38
|
+
},
|
|
39
|
+
"label": { "type": "string", "minLength": 1, "description": "Visible button label." },
|
|
40
|
+
"style": {
|
|
41
|
+
"type": "string",
|
|
42
|
+
"enum": ["primary", "default", "destructive"],
|
|
43
|
+
"default": "default",
|
|
44
|
+
"description": "Button emphasis. 'destructive' = red/danger; 'primary' = filled accent.",
|
|
45
|
+
"x-kai-control": "button-style"
|
|
46
|
+
},
|
|
47
|
+
"payload": {
|
|
48
|
+
"description": "Optional opaque payload echoed back in CardEvent.payload (any JSON)."
|
|
49
|
+
},
|
|
50
|
+
"default": {
|
|
51
|
+
"type": "boolean",
|
|
52
|
+
"default": false,
|
|
53
|
+
"description": "If true, this action is the keyboard default (Enter) and gets initial focus. At most one should be true; the card uses the first if several are.",
|
|
54
|
+
"x-kai-default-action": true
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
},
|
|
59
|
+
"dismissible": {
|
|
60
|
+
"type": "boolean",
|
|
61
|
+
"default": false,
|
|
62
|
+
"description": "Show a close affordance that emits the `dismiss` verb."
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://kitn.ai/schemas/card/embed.schema.json",
|
|
4
|
+
"title": "EmbedCardData",
|
|
5
|
+
"description": "Lazy media-embed payload (YouTube / Vimeo / generic player URL).",
|
|
6
|
+
"type": "object",
|
|
7
|
+
"x-kai-card-type": "embed",
|
|
8
|
+
"x-kai-contract-version": "1",
|
|
9
|
+
"required": ["provider"],
|
|
10
|
+
"additionalProperties": false,
|
|
11
|
+
"properties": {
|
|
12
|
+
"provider": {
|
|
13
|
+
"type": "string",
|
|
14
|
+
"enum": ["youtube", "vimeo", "generic"],
|
|
15
|
+
"description": "Media provider. 'generic' frames `url` directly (must be an https embeddable player URL whose origin is app-allowlisted).",
|
|
16
|
+
"x-kai-control": "select"
|
|
17
|
+
},
|
|
18
|
+
"id": {
|
|
19
|
+
"type": "string",
|
|
20
|
+
"description": "Provider video id (required for youtube/vimeo when `url` is absent). e.g. 'dQw4w9WgXcQ'.",
|
|
21
|
+
"maxLength": 64,
|
|
22
|
+
"pattern": "^[A-Za-z0-9_-]+$"
|
|
23
|
+
},
|
|
24
|
+
"url": {
|
|
25
|
+
"type": "string",
|
|
26
|
+
"format": "uri",
|
|
27
|
+
"description": "Full media/watch URL. For youtube/vimeo it is parsed to an id; for 'generic' it is the embeddable player src (https only).",
|
|
28
|
+
"x-kai-format": "url"
|
|
29
|
+
},
|
|
30
|
+
"title": {
|
|
31
|
+
"type": "string",
|
|
32
|
+
"description": "Accessible title for the player iframe + the poster label. Strongly recommended for a11y.",
|
|
33
|
+
"maxLength": 300
|
|
34
|
+
},
|
|
35
|
+
"poster": {
|
|
36
|
+
"type": "string",
|
|
37
|
+
"format": "uri",
|
|
38
|
+
"description": "Thumbnail shown before play. When omitted, youtube/vimeo derive a default thumbnail; 'generic' shows a neutral play placeholder.",
|
|
39
|
+
"x-kai-format": "url"
|
|
40
|
+
},
|
|
41
|
+
"start": {
|
|
42
|
+
"type": "integer",
|
|
43
|
+
"minimum": 0,
|
|
44
|
+
"description": "Optional start offset in seconds.",
|
|
45
|
+
"x-kai-unit": "seconds"
|
|
46
|
+
},
|
|
47
|
+
"aspectRatio": {
|
|
48
|
+
"type": "string",
|
|
49
|
+
"enum": ["16:9", "4:3", "1:1", "9:16"],
|
|
50
|
+
"default": "16:9",
|
|
51
|
+
"description": "Player box aspect ratio (CSS aspect-ratio).",
|
|
52
|
+
"x-kai-control": "select"
|
|
53
|
+
}
|
|
54
|
+
},
|
|
55
|
+
"allOf": [
|
|
56
|
+
{
|
|
57
|
+
"if": { "properties": { "provider": { "const": "generic" } } },
|
|
58
|
+
"then": { "required": ["url"] }
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
"if": { "properties": { "provider": { "enum": ["youtube", "vimeo"] } } },
|
|
62
|
+
"then": { "anyOf": [{ "required": ["id"] }, { "required": ["url"] }] }
|
|
63
|
+
}
|
|
64
|
+
]
|
|
65
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://kitn.ai/schemas/card/form.result.schema.json",
|
|
4
|
+
"title": "kai-form submit payload",
|
|
5
|
+
"description": "The CardEvent {kind:'submit'} `data` for a form card: an object that validates against the form-definition schema that was sent down in CardEnvelope.data. Standard JSON Schema validation (type/enum/required/min-max/length/pattern) holds. Optional empty strings are omitted.",
|
|
6
|
+
"type": "object"
|
|
7
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://kitn.ai/schemas/card/form.schema.json",
|
|
4
|
+
"title": "kai-form data (a form definition)",
|
|
5
|
+
"description": "The CardEnvelope.data for a card of type 'form': a JSON Schema (type:'object') describing the fields kai-form renders, plus optional x-kai-* UI hints. The same schema validates the submission.",
|
|
6
|
+
"type": "object",
|
|
7
|
+
"required": ["type", "properties"],
|
|
8
|
+
"properties": {
|
|
9
|
+
"type": { "const": "object" },
|
|
10
|
+
"title": { "type": "string" },
|
|
11
|
+
"description": { "type": "string" },
|
|
12
|
+
"required": { "type": "array", "items": { "type": "string" } },
|
|
13
|
+
"properties": {
|
|
14
|
+
"type": "object"
|
|
15
|
+
},
|
|
16
|
+
"x-kai-order": { "type": "array", "items": { "type": "string" } },
|
|
17
|
+
"x-kai-inlineMax": { "type": "integer", "minimum": 1 },
|
|
18
|
+
"x-kai-submitLabel": { "type": "string" },
|
|
19
|
+
"x-kai-dismissible": { "type": "boolean" },
|
|
20
|
+
"x-kai-actions": {
|
|
21
|
+
"type": "array",
|
|
22
|
+
"items": {
|
|
23
|
+
"type": "object",
|
|
24
|
+
"required": ["id", "label"],
|
|
25
|
+
"properties": {
|
|
26
|
+
"id": { "type": "string" },
|
|
27
|
+
"label": { "type": "string" },
|
|
28
|
+
"variant": { "enum": ["default", "ghost", "outline"] }
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://kitn.ai/schemas/card/link.schema.json",
|
|
4
|
+
"title": "LinkPreviewData",
|
|
5
|
+
"description": "Rich link / Open-Graph preview payload. The card renders from this; it never fetches.",
|
|
6
|
+
"type": "object",
|
|
7
|
+
"x-kai-card-type": "link",
|
|
8
|
+
"x-kai-contract-version": "1",
|
|
9
|
+
"required": ["url"],
|
|
10
|
+
"additionalProperties": false,
|
|
11
|
+
"properties": {
|
|
12
|
+
"url": {
|
|
13
|
+
"type": "string",
|
|
14
|
+
"format": "uri",
|
|
15
|
+
"description": "Canonical destination. Opened via the contract `open` verb (target 'tab').",
|
|
16
|
+
"x-kai-format": "url"
|
|
17
|
+
},
|
|
18
|
+
"title": {
|
|
19
|
+
"type": "string",
|
|
20
|
+
"description": "OG title (og:title). Falls back to the domain when absent.",
|
|
21
|
+
"maxLength": 300
|
|
22
|
+
},
|
|
23
|
+
"description": {
|
|
24
|
+
"type": "string",
|
|
25
|
+
"description": "OG description (og:description). Clamped to 3 lines in the UI.",
|
|
26
|
+
"maxLength": 1000
|
|
27
|
+
},
|
|
28
|
+
"image": {
|
|
29
|
+
"type": "string",
|
|
30
|
+
"format": "uri",
|
|
31
|
+
"description": "Preview image (og:image). Optional; the card degrades gracefully when missing or it fails to load.",
|
|
32
|
+
"x-kai-format": "url"
|
|
33
|
+
},
|
|
34
|
+
"imageAlt": {
|
|
35
|
+
"type": "string",
|
|
36
|
+
"description": "Alt text for the preview image. Defaults to the title (or empty = decorative) when omitted.",
|
|
37
|
+
"maxLength": 300
|
|
38
|
+
},
|
|
39
|
+
"favicon": {
|
|
40
|
+
"type": "string",
|
|
41
|
+
"format": "uri",
|
|
42
|
+
"description": "Site favicon shown next to the domain.",
|
|
43
|
+
"x-kai-format": "url"
|
|
44
|
+
},
|
|
45
|
+
"domain": {
|
|
46
|
+
"type": "string",
|
|
47
|
+
"description": "Display domain (e.g. 'example.com'). Derived from `url` when omitted.",
|
|
48
|
+
"maxLength": 253
|
|
49
|
+
},
|
|
50
|
+
"siteName": {
|
|
51
|
+
"type": "string",
|
|
52
|
+
"description": "OG site name (og:site_name). Shown in place of the domain when present.",
|
|
53
|
+
"maxLength": 200
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://kitn.ai/schemas/card/tasks.result.schema.json",
|
|
4
|
+
"title": "TasksCardResult",
|
|
5
|
+
"description": "Payload of CardEvent { kind: 'submit' } from a tasks card.",
|
|
6
|
+
"type": "object",
|
|
7
|
+
"required": ["selected"],
|
|
8
|
+
"properties": {
|
|
9
|
+
"selected": {
|
|
10
|
+
"type": "array",
|
|
11
|
+
"description": "Ids of the checked tasks, in the order they appear in `tasks`. Subset of the input task ids.",
|
|
12
|
+
"items": { "type": "string", "minLength": 1 },
|
|
13
|
+
"uniqueItems": true
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://kitn.ai/schemas/card/tasks.schema.json",
|
|
4
|
+
"title": "TasksCardData",
|
|
5
|
+
"description": "Data payload for a `tasks` card (CardEnvelope.data when type='tasks').",
|
|
6
|
+
"type": "object",
|
|
7
|
+
"required": ["tasks"],
|
|
8
|
+
"properties": {
|
|
9
|
+
"mode": {
|
|
10
|
+
"type": "string",
|
|
11
|
+
"enum": ["select"],
|
|
12
|
+
"default": "select",
|
|
13
|
+
"description": "v1 supports only 'select' (toggle + confirm). 'progress' (live AG-UI status) is a future enum value; restricting it now keeps the wire forward-compatible.",
|
|
14
|
+
"x-kai-mode": true
|
|
15
|
+
},
|
|
16
|
+
"heading": {
|
|
17
|
+
"type": "string",
|
|
18
|
+
"description": "Optional in-body heading; distinct from CardEnvelope.title."
|
|
19
|
+
},
|
|
20
|
+
"tasks": {
|
|
21
|
+
"type": "array",
|
|
22
|
+
"minItems": 1,
|
|
23
|
+
"description": "The selectable rows, rendered in order.",
|
|
24
|
+
"items": {
|
|
25
|
+
"type": "object",
|
|
26
|
+
"required": ["id", "label"],
|
|
27
|
+
"properties": {
|
|
28
|
+
"id": {
|
|
29
|
+
"type": "string",
|
|
30
|
+
"minLength": 1,
|
|
31
|
+
"description": "Stable id; the selected ids are returned in the result. Unique within `tasks`.",
|
|
32
|
+
"x-kai-unique": true
|
|
33
|
+
},
|
|
34
|
+
"label": { "type": "string", "minLength": 1, "description": "Row label." },
|
|
35
|
+
"description": { "type": "string", "description": "Optional secondary line under the label." },
|
|
36
|
+
"checked": {
|
|
37
|
+
"type": "boolean",
|
|
38
|
+
"default": false,
|
|
39
|
+
"description": "Initial checked state of the row."
|
|
40
|
+
},
|
|
41
|
+
"disabled": {
|
|
42
|
+
"type": "boolean",
|
|
43
|
+
"default": false,
|
|
44
|
+
"description": "Row is shown but not toggleable (and excluded from select-all)."
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
},
|
|
49
|
+
"selectAll": {
|
|
50
|
+
"type": "boolean",
|
|
51
|
+
"default": false,
|
|
52
|
+
"description": "Render a master select-all checkbox above the list.",
|
|
53
|
+
"x-kai-control": "select-all"
|
|
54
|
+
},
|
|
55
|
+
"confirmLabel": {
|
|
56
|
+
"type": "string",
|
|
57
|
+
"default": "Confirm",
|
|
58
|
+
"description": "Label for the confirm button."
|
|
59
|
+
},
|
|
60
|
+
"allowEmpty": {
|
|
61
|
+
"type": "boolean",
|
|
62
|
+
"default": false,
|
|
63
|
+
"description": "If true, confirm is enabled with zero selected (emits { selected: [] }). If false, confirm is disabled until >=1 selected."
|
|
64
|
+
},
|
|
65
|
+
"min": {
|
|
66
|
+
"type": "integer",
|
|
67
|
+
"minimum": 0,
|
|
68
|
+
"description": "Optional minimum number that must be selected to confirm.",
|
|
69
|
+
"x-kai-select-min": true
|
|
70
|
+
},
|
|
71
|
+
"max": {
|
|
72
|
+
"type": "integer",
|
|
73
|
+
"minimum": 1,
|
|
74
|
+
"description": "Optional maximum selectable; further toggles are blocked once reached.",
|
|
75
|
+
"x-kai-select-max": true
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|