@kitnai/chat 0.7.0 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (212) hide show
  1. package/README.md +9 -9
  2. package/dist/custom-elements.json +1626 -883
  3. package/dist/kitn-chat.es.js +36 -36
  4. package/dist/llms/llms-full.txt +303 -142
  5. package/dist/llms/llms.txt +18 -18
  6. package/dist/schemas/card-envelope.schema.json +14 -0
  7. package/dist/schemas/card-event.schema.json +12 -0
  8. package/dist/schemas/confirm.schema.json +65 -0
  9. package/dist/schemas/embed.schema.json +65 -0
  10. package/dist/schemas/form.result.schema.json +7 -0
  11. package/dist/schemas/form.schema.json +33 -0
  12. package/dist/schemas/link.schema.json +56 -0
  13. package/dist/schemas/task-list.result.schema.json +16 -0
  14. package/dist/schemas/task-list.schema.json +78 -0
  15. package/dist/theme.tokens.css +65 -65
  16. package/dist/tsx-B8rCNbgL.js +1 -0
  17. package/dist/typescript-RycA9KXf.js +1 -0
  18. package/frameworks/react/index.tsx +356 -189
  19. package/frameworks/react/runtime.tsx +2 -2
  20. package/llms-full.txt +303 -142
  21. package/llms.txt +18 -18
  22. package/package.json +5 -2
  23. package/src/components/artifact.stories.tsx +138 -0
  24. package/src/components/artifact.tsx +581 -0
  25. package/src/components/attachments.stories.tsx +7 -8
  26. package/src/components/attachments.tsx +2 -2
  27. package/src/components/card.tsx +110 -0
  28. package/src/components/chain-of-thought.stories.tsx +7 -8
  29. package/src/components/chat-container.stories.tsx +7 -8
  30. package/src/components/chat-container.tsx +4 -0
  31. package/src/components/checkpoint.stories.tsx +7 -8
  32. package/src/components/code-block.stories.tsx +8 -9
  33. package/src/components/component-meta.json +3411 -0
  34. package/src/components/confirm-card.stories.tsx +74 -0
  35. package/src/components/confirm-card.tsx +299 -0
  36. package/src/components/context.stories.tsx +7 -8
  37. package/src/components/conversation-item.stories.tsx +7 -8
  38. package/src/components/conversation-item.tsx +2 -2
  39. package/src/components/conversation-list.stories.tsx +7 -8
  40. package/src/components/conversation-list.tsx +1 -1
  41. package/src/components/embed.tsx +196 -0
  42. package/src/components/empty.stories.tsx +8 -9
  43. package/src/components/feedback-bar.stories.tsx +7 -8
  44. package/src/components/file-tree.stories.tsx +73 -0
  45. package/src/components/file-tree.tsx +383 -0
  46. package/src/components/file-upload.stories.tsx +7 -8
  47. package/src/components/form-widgets.tsx +461 -0
  48. package/src/components/form.tsx +796 -0
  49. package/src/components/image.stories.tsx +7 -8
  50. package/src/components/link-card.tsx +194 -0
  51. package/src/components/loader.stories.tsx +7 -8
  52. package/src/components/markdown.stories.tsx +7 -8
  53. package/src/components/message-narrow.stories.tsx +12 -13
  54. package/src/components/message-skills.stories.tsx +16 -17
  55. package/src/components/message.stories.tsx +17 -18
  56. package/src/components/model-switcher.stories.tsx +7 -8
  57. package/src/components/prompt-input.stories.tsx +8 -9
  58. package/src/components/prompt-suggestion.stories.tsx +7 -8
  59. package/src/components/prompt-suggestion.tsx +3 -3
  60. package/src/components/reasoning.stories.tsx +7 -8
  61. package/src/components/scroll-button.stories.tsx +7 -8
  62. package/src/components/slash-command.stories.tsx +8 -9
  63. package/src/components/slash-command.tsx +2 -2
  64. package/src/components/source.stories.tsx +7 -8
  65. package/src/components/source.tsx +1 -1
  66. package/src/components/task-list-card.stories.tsx +78 -0
  67. package/src/components/task-list-card.tsx +388 -0
  68. package/src/components/text-shimmer.stories.tsx +7 -8
  69. package/src/components/thinking-bar.stories.tsx +7 -8
  70. package/src/components/tool.stories.tsx +7 -8
  71. package/src/components/tool.tsx +2 -2
  72. package/src/components/voice-input.stories.tsx +7 -8
  73. package/src/elements/artifact.stories.tsx +291 -0
  74. package/src/elements/artifact.tsx +72 -0
  75. package/src/elements/{kitn-attachments.stories.tsx → attachments.stories.tsx} +11 -20
  76. package/src/elements/attachments.tsx +4 -4
  77. package/src/elements/card.stories.tsx +118 -0
  78. package/src/elements/card.tsx +40 -0
  79. package/src/elements/catalog.stories.tsx +491 -0
  80. package/src/elements/{kitn-chain-of-thought.stories.tsx → chain-of-thought.stories.tsx} +13 -22
  81. package/src/elements/chain-of-thought.tsx +3 -3
  82. package/src/elements/{kitn-chat-scope-picker.stories.tsx → chat-scope-picker.stories.tsx} +10 -19
  83. package/src/elements/chat-scope-picker.tsx +4 -4
  84. package/src/elements/{kitn-chat-workspace.stories.tsx → chat-workspace.stories.tsx} +15 -23
  85. package/src/elements/chat-workspace.tsx +2 -2
  86. package/src/elements/{kitn-chat.stories.tsx → chat.stories.tsx} +12 -20
  87. package/src/elements/chat.tsx +2 -2
  88. package/src/elements/{kitn-checkpoint.stories.tsx → checkpoint.stories.tsx} +11 -20
  89. package/src/elements/checkpoint.tsx +4 -4
  90. package/src/elements/{kitn-code-block.stories.tsx → code-block.stories.tsx} +10 -19
  91. package/src/elements/code-block.tsx +3 -3
  92. package/src/elements/compiled.css +1 -1
  93. package/src/elements/composed-shell.stories.tsx +316 -0
  94. package/src/elements/confirm-card.stories.tsx +186 -0
  95. package/src/elements/confirm-card.tsx +45 -0
  96. package/src/elements/{kitn-context-meter.stories.tsx → context-meter.stories.tsx} +10 -19
  97. package/src/elements/context-meter.tsx +3 -3
  98. package/src/elements/{kitn-conversation-list.stories.tsx → conversation-list.stories.tsx} +12 -20
  99. package/src/elements/conversation-list.tsx +2 -2
  100. package/src/elements/css.ts +1 -1
  101. package/src/elements/define.tsx +10 -10
  102. package/src/elements/element-meta.json +1379 -733
  103. package/src/elements/element-types.d.ts +251 -125
  104. package/src/elements/embed.stories.tsx +197 -0
  105. package/src/elements/embed.tsx +35 -0
  106. package/src/elements/{kitn-empty.stories.tsx → empty.stories.tsx} +12 -21
  107. package/src/elements/empty.tsx +3 -3
  108. package/src/elements/{kitn-feedback-bar.stories.tsx → feedback-bar.stories.tsx} +11 -20
  109. package/src/elements/feedback-bar.tsx +4 -4
  110. package/src/elements/file-tree.stories.tsx +133 -0
  111. package/src/elements/file-tree.tsx +52 -0
  112. package/src/elements/{kitn-file-upload.stories.tsx → file-upload.stories.tsx} +12 -21
  113. package/src/elements/file-upload.tsx +4 -4
  114. package/src/elements/form.stories.tsx +204 -0
  115. package/src/elements/form.tsx +37 -0
  116. package/src/elements/{kitn-image.stories.tsx → image.stories.tsx} +10 -19
  117. package/src/elements/image.tsx +3 -3
  118. package/src/elements/link-card.stories.tsx +193 -0
  119. package/src/elements/link-card.tsx +34 -0
  120. package/src/elements/{kitn-loader.stories.tsx → loader.stories.tsx} +11 -20
  121. package/src/elements/loader.tsx +3 -3
  122. package/src/elements/{kitn-markdown.stories.tsx → markdown.stories.tsx} +10 -19
  123. package/src/elements/markdown.tsx +3 -3
  124. package/src/elements/{kitn-message-skills.stories.tsx → message-skills.stories.tsx} +10 -19
  125. package/src/elements/message-skills.tsx +3 -3
  126. package/src/elements/{kitn-message.stories.tsx → message.stories.tsx} +12 -21
  127. package/src/elements/message.tsx +5 -5
  128. package/src/elements/{kitn-model-switcher.stories.tsx → model-switcher.stories.tsx} +10 -19
  129. package/src/elements/model-switcher.tsx +5 -5
  130. package/src/elements/{kitn-prompt-input.stories.tsx → prompt-input.stories.tsx} +14 -22
  131. package/src/elements/prompt-input.tsx +3 -3
  132. package/src/elements/{kitn-prompt-suggestions.stories.tsx → prompt-suggestions.stories.tsx} +13 -22
  133. package/src/elements/prompt-suggestions.tsx +4 -4
  134. package/src/elements/{kitn-reasoning.stories.tsx → reasoning.stories.tsx} +10 -19
  135. package/src/elements/reasoning.tsx +4 -4
  136. package/src/elements/register.ts +11 -1
  137. package/src/elements/resizable.stories.tsx +200 -0
  138. package/src/elements/resizable.tsx +264 -0
  139. package/src/elements/{kitn-response-stream.stories.tsx → response-stream.stories.tsx} +10 -19
  140. package/src/elements/response-stream.tsx +4 -4
  141. package/src/elements/{kitn-source-list.stories.tsx → source-list.stories.tsx} +11 -20
  142. package/src/elements/{kitn-source.stories.tsx → source.stories.tsx} +12 -21
  143. package/src/elements/source.tsx +5 -5
  144. package/src/elements/styles.css +140 -1
  145. package/src/elements/task-list-card.stories.tsx +194 -0
  146. package/src/elements/task-list-card.tsx +40 -0
  147. package/src/elements/{kitn-text-shimmer.stories.tsx → text-shimmer.stories.tsx} +10 -19
  148. package/src/elements/text-shimmer.tsx +3 -3
  149. package/src/elements/{kitn-thinking-bar.stories.tsx → thinking-bar.stories.tsx} +11 -20
  150. package/src/elements/thinking-bar.tsx +5 -5
  151. package/src/elements/{kitn-tool.stories.tsx → tool.stories.tsx} +10 -19
  152. package/src/elements/tool.tsx +3 -3
  153. package/src/elements/{kitn-voice-input.stories.tsx → voice-input.stories.tsx} +10 -19
  154. package/src/elements/voice-input.tsx +4 -4
  155. package/src/index.ts +94 -2
  156. package/src/primitives/card-contract.ts +60 -0
  157. package/src/primitives/card-host.tsx +35 -0
  158. package/src/primitives/card-routing.ts +79 -0
  159. package/src/primitives/card-schemas/card-envelope.schema.json +14 -0
  160. package/src/primitives/card-schemas/card-event.schema.json +12 -0
  161. package/src/primitives/card-schemas/confirm.schema.json +65 -0
  162. package/src/primitives/card-schemas/embed.schema.json +65 -0
  163. package/src/primitives/card-schemas/form.result.schema.json +7 -0
  164. package/src/primitives/card-schemas/form.schema.json +33 -0
  165. package/src/primitives/card-schemas/link.schema.json +56 -0
  166. package/src/primitives/card-schemas/task-list.result.schema.json +16 -0
  167. package/src/primitives/card-schemas/task-list.schema.json +78 -0
  168. package/src/primitives/card-validate.ts +95 -0
  169. package/src/primitives/embed-providers.ts +254 -0
  170. package/src/primitives/highlighter.ts +4 -0
  171. package/src/primitives/link-preview.ts +87 -0
  172. package/src/primitives/pdf-preview.ts +121 -0
  173. package/src/stories/chat-panel-layout.stories.tsx +2 -1
  174. package/src/stories/chat-scene.tsx +22 -21
  175. package/src/stories/checkpoint-restore.stories.tsx +10 -10
  176. package/src/stories/conversation-with-reasoning.stories.tsx +4 -4
  177. package/src/stories/conversation-with-sources.stories.tsx +7 -7
  178. package/src/stories/docs/Accessibility.mdx +2 -2
  179. package/src/stories/docs/ForAIAgents.mdx +3 -3
  180. package/src/stories/docs/GettingStarted.mdx +2 -2
  181. package/src/stories/docs/Installation.mdx +2 -2
  182. package/src/stories/docs/Integrations.mdx +29 -29
  183. package/src/stories/docs/Introduction.mdx +3 -3
  184. package/src/stories/docs/Theming.mdx +2 -2
  185. package/src/stories/docs/element-controls.ts +32 -0
  186. package/src/stories/docs/theme-editor/theme-editor.tsx +1 -0
  187. package/src/stories/examples/ChoosingComponents.mdx +94 -0
  188. package/src/stories/examples/sample-data.ts +79 -0
  189. package/src/stories/message-actions.stories.tsx +13 -13
  190. package/src/stories/pattern-centered-conversation.stories.tsx +3 -3
  191. package/src/stories/pattern-docked-widget.stories.tsx +1 -1
  192. package/src/stories/pattern-empty-state.stories.tsx +3 -3
  193. package/src/stories/prompt-input-variants.stories.tsx +13 -13
  194. package/src/stories/streaming-response.stories.tsx +3 -3
  195. package/src/stories/typography.stories.tsx +4 -4
  196. package/src/ui/avatar.stories.tsx +7 -8
  197. package/src/ui/badge.stories.tsx +7 -8
  198. package/src/ui/button.stories.tsx +8 -9
  199. package/src/ui/button.tsx +1 -0
  200. package/src/ui/collapsible.stories.tsx +6 -7
  201. package/src/ui/dropdown.stories.tsx +6 -7
  202. package/src/ui/hover-card.stories.tsx +6 -7
  203. package/src/ui/resizable.stories.tsx +74 -9
  204. package/src/ui/resizable.tsx +351 -71
  205. package/src/ui/scroll-area.stories.tsx +6 -7
  206. package/src/ui/scroll-area.tsx +3 -1
  207. package/src/ui/separator.stories.tsx +7 -8
  208. package/src/ui/skeleton.stories.tsx +7 -8
  209. package/src/ui/textarea.stories.tsx +6 -7
  210. package/src/ui/tooltip.stories.tsx +8 -9
  211. package/theme.css +65 -65
  212. package/src/stories/docs/element-spec.tsx +0 -86
@@ -1,6 +1,6 @@
1
1
  // AUTO-GENERATED by scripts/gen-element-api.mjs — do not edit by hand.
2
2
  // Typed custom-element interfaces + HTMLElementTagNameMap augmentation, so
3
- // `document.querySelector('kitn-message')` is typed and gets prop autocomplete.
3
+ // `document.querySelector('kc-message')` is typed and gets prop autocomplete.
4
4
 
5
5
 
6
6
  // Re-exports for `import { … } from '@kitnai/chat/elements'`.
@@ -8,7 +8,24 @@ export type { ChatMessage, ChatMessageAction } from './chat-types';
8
8
  export { configureCodeHighlighting, isCodeHighlightingEnabled } from '../primitives/highlighter';
9
9
  export type { CodeHighlightingOptions } from '../primitives/highlighter';
10
10
 
11
- export interface KitnAttachmentsElement extends HTMLElement {
11
+ export interface KcArtifactElement extends HTMLElement {
12
+ /** Color mode (`auto` follows prefers-color-scheme). */
13
+ theme?: 'light' | 'dark' | 'auto';
14
+ /** URL the preview iframe frames. Consumer-controlled. */
15
+ src?: string;
16
+ /** Files for the Code tab tree + each file's preview `url`. Set as a JS property (array). */
17
+ files: { path: string; url?: undefined | string; code?: undefined | string; language?: undefined | string; type?: undefined | "html" | "pdf" | "image" | "other" }[];
18
+ /** Active tab: `preview` (default) or `code`. */
19
+ tab?: "preview" | "code";
20
+ /** Selected file path — syncs the tree highlight, Code source, and preview. */
21
+ activeFile?: string;
22
+ /** iframe `sandbox` override. Secure default `allow-scripts allow-forms` (NOT `allow-same-origin`). */
23
+ sandbox?: string;
24
+ /** Accessible title for the preview iframe. */
25
+ iframeTitle?: string;
26
+ }
27
+
28
+ export interface KcAttachmentsElement extends HTMLElement {
12
29
  /** Color mode (`auto` follows prefers-color-scheme). */
13
30
  theme?: 'light' | 'dark' | 'auto';
14
31
  /** The attachments to render. Set as a JS property (array). */
@@ -25,14 +42,27 @@ export interface KitnAttachmentsElement extends HTMLElement {
25
42
  emptyText?: string;
26
43
  }
27
44
 
28
- export interface KitnChainOfThoughtElement extends HTMLElement {
45
+ export interface KcCardElement extends HTMLElement {
46
+ /** Color mode (`auto` follows prefers-color-scheme). */
47
+ theme?: 'light' | 'dark' | 'auto';
48
+ /** Heading rendered in the card chrome (= CardEnvelope.title). Attribute: `heading`. */
49
+ heading?: string;
50
+ /** Supporting text under the heading. Attribute: `description`. */
51
+ description?: string;
52
+ /** When set, the card renders its inline error state instead of the body. Attribute: `error-message`. */
53
+ errorMessage?: string;
54
+ /** Compact spacing for dense lists. Attribute: `dense`. */
55
+ dense?: boolean;
56
+ }
57
+
58
+ export interface KcChainOfThoughtElement extends HTMLElement {
29
59
  /** Color mode (`auto` follows prefers-color-scheme). */
30
60
  theme?: 'light' | 'dark' | 'auto';
31
61
  /** The reasoning steps. Set as a JS property. Compound sub-parts collapse to this one data model (Route 1). */
32
62
  steps: { label: string; content?: undefined | string }[];
33
63
  }
34
64
 
35
- export interface KitnChatElement extends HTMLElement {
65
+ export interface KcChatElement extends HTMLElement {
36
66
  /** Color mode (`auto` follows prefers-color-scheme). */
37
67
  theme?: 'light' | 'dark' | 'auto';
38
68
  /** The full message thread to render, newest last. Each entry carries its role, content, and optional reasoning/tools/attachments/actions. Set as a JS property (`el.messages = [...]`). */
@@ -75,57 +105,7 @@ export interface KitnChatElement extends HTMLElement {
75
105
  slashCompact?: boolean;
76
106
  }
77
107
 
78
- export interface KitnChatScopePickerElement extends HTMLElement {
79
- /** Color mode (`auto` follows prefers-color-scheme). */
80
- theme?: 'light' | 'dark' | 'auto';
81
- /** Authors to offer as scope filters. Set as a JS property. */
82
- availableAuthors: string[];
83
- /** Tags to offer as scope filters. Set as a JS property. */
84
- availableTags: string[];
85
- /** The label shown on the trigger for the active scope. */
86
- currentLabel?: string;
87
- }
88
-
89
- export interface KitnChatWorkspaceElement extends HTMLElement {
90
- /** Color mode (`auto` follows prefers-color-scheme). */
91
- theme?: 'light' | 'dark' | 'auto';
92
- /** Pre-bucketed conversation groups for the sidebar. Set as a JS property. */
93
- groups: { id: string; userId?: undefined | string; teamId?: undefined | string; name: string; sortOrder: number; createdAt: string }[];
94
- /** Flat conversation list (auto-bucketed if `groups` is empty). Set as a JS property. */
95
- conversations: { id: string; title: string; groupId?: undefined | string; scope: { type: "document" | "collection"; documentId?: undefined | string; filters?: undefined | { tags?: undefined | string[]; authors?: undefined | string[]; contentType?: undefined | "transcript" | "markdown"; dateRange?: undefined | { from: string; to: string } } }; messageCount: number; lastMessageAt: string; updatedAt: string }[];
96
- /** Id of the open conversation, highlighted in the sidebar. */
97
- activeId?: string;
98
- /** The active conversation's message thread, newest last. Set as a JS property. */
99
- messages: { id: string; role: "user" | "assistant"; content: string; reasoning?: undefined | { text: string; label?: undefined | string }; tools?: undefined | { type: string; state: "input-streaming" | "input-available" | "output-available" | "output-error"; input?: undefined | Record<string, unknown>; output?: undefined | Record<string, unknown>; toolCallId?: undefined | string; errorText?: undefined | string }[]; attachments?: undefined | { id: string; type: "file" | "source-document"; filename?: undefined | string; mediaType?: undefined | string; url?: undefined | string; title?: undefined | string }[]; actions?: undefined | ("copy" | "like" | "dislike" | "regenerate" | "edit")[] }[];
100
- value?: string;
101
- placeholder?: string;
102
- loading?: boolean;
103
- suggestions?: string[];
104
- suggestionMode?: "submit" | "fill";
105
- proseSize?: "xs" | "sm" | "base" | "lg";
106
- codeTheme?: string;
107
- codeHighlight?: boolean;
108
- chatTitle?: string;
109
- models?: { id: string; name: string; provider?: string }[];
110
- currentModel?: string;
111
- context?: { usedTokens: number; maxTokens: number; inputTokens?: number; outputTokens?: number; estimatedCost?: number };
112
- scrollButton?: boolean;
113
- search?: boolean;
114
- voice?: boolean;
115
- slashCommands?: { id: string; label: string; description?: string; category?: string }[];
116
- slashActiveIds?: string[];
117
- slashCompact?: boolean;
118
- /** Sidebar default width as a percent of the workspace (default 22). */
119
- sidebarWidth?: number;
120
- /** Sidebar min width in px (default 200). */
121
- sidebarMinWidth?: number;
122
- /** Sidebar max width in px (default 420). */
123
- sidebarMaxWidth?: number;
124
- /** Initial collapsed state of the sidebar (default false). */
125
- sidebarCollapsed?: boolean;
126
- }
127
-
128
- export interface KitnCheckpointElement extends HTMLElement {
108
+ export interface KcCheckpointElement extends HTMLElement {
129
109
  /** Color mode (`auto` follows prefers-color-scheme). */
130
110
  theme?: 'light' | 'dark' | 'auto';
131
111
  /** Optional text beside the icon. */
@@ -138,7 +118,7 @@ export interface KitnCheckpointElement extends HTMLElement {
138
118
  size?: "sm" | "lg" | "md" | "icon" | "icon-sm";
139
119
  }
140
120
 
141
- export interface KitnCodeBlockElement extends HTMLElement {
121
+ export interface KcCodeBlockElement extends HTMLElement {
142
122
  /** Color mode (`auto` follows prefers-color-scheme). */
143
123
  theme?: 'light' | 'dark' | 'auto';
144
124
  /** The source code to render. */
@@ -153,14 +133,27 @@ export interface KitnCodeBlockElement extends HTMLElement {
153
133
  proseSize?: "xs" | "sm" | "base" | "lg";
154
134
  }
155
135
 
156
- export interface KitnContextMeterElement extends HTMLElement {
136
+ export interface KcConfirmElement extends HTMLElement {
137
+ /** Color mode (`auto` follows prefers-color-scheme). */
138
+ theme?: 'light' | 'dark' | 'auto';
139
+ /** The confirm definition (the CardEnvelope.data). Set as a JS PROPERTY: `el.data = { body, tone, actions:[…] }`. Import `ConfirmCardData` from `@kitnai/chat` for the full shape. */
140
+ data?: Record<string, unknown>;
141
+ /** Stable card id correlating every emitted CardEvent. Attribute: `card-id`. */
142
+ cardId?: string;
143
+ /** Heading rendered in the card chrome (= CardEnvelope.title). Attribute: `heading`. */
144
+ heading?: string;
145
+ /** Focus the default action on mount (off by default — no focus-stealing). Attribute: `autofocus`. */
146
+ autofocus?: boolean;
147
+ }
148
+
149
+ export interface KcContextElement extends HTMLElement {
157
150
  /** Color mode (`auto` follows prefers-color-scheme). */
158
151
  theme?: 'light' | 'dark' | 'auto';
159
152
  /** Token-usage data. Set as a JS property. */
160
153
  context?: { usedTokens: number; maxTokens: number; inputTokens?: number; outputTokens?: number; reasoningTokens?: number; cacheTokens?: number; estimatedCost?: number };
161
154
  }
162
155
 
163
- export interface KitnConversationListElement extends HTMLElement {
156
+ export interface KcConversationsElement extends HTMLElement {
164
157
  /** Color mode (`auto` follows prefers-color-scheme). */
165
158
  theme?: 'light' | 'dark' | 'auto';
166
159
  /** Pre-bucketed conversation groups (e.g. "Today", "Yesterday"), each with its own conversations. Use this when you want to control the grouping/headers yourself; otherwise pass a flat `conversations` array. Set as a JS property. */
@@ -171,7 +164,16 @@ export interface KitnConversationListElement extends HTMLElement {
171
164
  activeId?: string;
172
165
  }
173
166
 
174
- export interface KitnEmptyElement extends HTMLElement {
167
+ export interface KcEmbedElement extends HTMLElement {
168
+ /** Color mode (`auto` follows prefers-color-scheme). */
169
+ theme?: 'light' | 'dark' | 'auto';
170
+ /** Stable card id correlating every emitted event. Set as an attribute or property. */
171
+ cardId?: string;
172
+ /** The embed payload (provider + id/url + options). Set as a JS **property** (object). */
173
+ data?: { provider: "youtube" | "vimeo" | "generic"; id?: string; url?: string; title?: string; poster?: string; start?: number; aspectRatio?: "16:9" | "4:3" | "1:1" | "9:16" };
174
+ }
175
+
176
+ export interface KcEmptyElement extends HTMLElement {
175
177
  /** Color mode (`auto` follows prefers-color-scheme). */
176
178
  theme?: 'light' | 'dark' | 'auto';
177
179
  /** Title text. Attribute: `empty-title` (`title` is a global HTML attribute). */
@@ -180,14 +182,25 @@ export interface KitnEmptyElement extends HTMLElement {
180
182
  description?: string;
181
183
  }
182
184
 
183
- export interface KitnFeedbackBarElement extends HTMLElement {
185
+ export interface KcFeedbackBarElement extends HTMLElement {
184
186
  /** Color mode (`auto` follows prefers-color-scheme). */
185
187
  theme?: 'light' | 'dark' | 'auto';
186
188
  /** The banner label (e.g. "Was this helpful?"). Attribute: `bar-title` (`title` is avoided — it's a global HTML attribute). */
187
189
  barTitle?: string;
188
190
  }
189
191
 
190
- export interface KitnFileUploadElement extends HTMLElement {
192
+ export interface KcFileTreeElement extends HTMLElement {
193
+ /** Color mode (`auto` follows prefers-color-scheme). */
194
+ theme?: 'light' | 'dark' | 'auto';
195
+ /** The files to render. Set as a JS property (array of `{ path, url?, code?, language?, type? }`). */
196
+ files: { path: string; url?: undefined | string; code?: undefined | string; language?: undefined | string; type?: undefined | "html" | "pdf" | "image" | "other" }[];
197
+ /** Selected file path — highlighted in the tree. */
198
+ activeFile?: string;
199
+ /** Folder paths expanded initially. Omit to start with all folders open. */
200
+ defaultExpanded?: string[];
201
+ }
202
+
203
+ export interface KcFileUploadElement extends HTMLElement {
191
204
  /** Color mode (`auto` follows prefers-color-scheme). */
192
205
  theme?: 'light' | 'dark' | 'auto';
193
206
  /** Allow selecting multiple files (default true). */
@@ -200,7 +213,18 @@ export interface KitnFileUploadElement extends HTMLElement {
200
213
  label?: string;
201
214
  }
202
215
 
203
- export interface KitnImageElement extends HTMLElement {
216
+ export interface KcFormElement extends HTMLElement {
217
+ /** Color mode (`auto` follows prefers-color-scheme). */
218
+ theme?: 'light' | 'dark' | 'auto';
219
+ /** The form definition — a JSON Schema (`type:'object'`) + `x-kc-*` UI hints (the CardEnvelope.data). Set as a JS PROPERTY: `el.data = { type:'object', properties:{…} }`. Import the `FormDefinition` type from `@kitnai/chat` for the full shape (it is self-referential, so the element types it loosely). */
220
+ data?: Record<string, unknown>;
221
+ /** Stable card id correlating every emitted CardEvent. Attribute: `card-id`. */
222
+ cardId?: string;
223
+ /** Heading rendered in the card chrome (= CardEnvelope.title). Attribute: `heading`. */
224
+ heading?: string;
225
+ }
226
+
227
+ export interface KcImageElement extends HTMLElement {
204
228
  /** Color mode (`auto` follows prefers-color-scheme). */
205
229
  theme?: 'light' | 'dark' | 'auto';
206
230
  /** Base64-encoded image data (pair with `media-type`). */
@@ -213,7 +237,16 @@ export interface KitnImageElement extends HTMLElement {
213
237
  mediaType?: string;
214
238
  }
215
239
 
216
- export interface KitnLoaderElement extends HTMLElement {
240
+ export interface KcLinkCardElement extends HTMLElement {
241
+ /** Color mode (`auto` follows prefers-color-scheme). */
242
+ theme?: 'light' | 'dark' | 'auto';
243
+ /** Stable card id correlating every emitted event. Set as an attribute or property. */
244
+ cardId?: string;
245
+ /** The link payload (OG metadata). Set as a JS **property** (object). */
246
+ data?: { url: string; title?: string; description?: string; image?: string; imageAlt?: string; favicon?: string; domain?: string; siteName?: string };
247
+ }
248
+
249
+ export interface KcLoaderElement extends HTMLElement {
217
250
  /** Color mode (`auto` follows prefers-color-scheme). */
218
251
  theme?: 'light' | 'dark' | 'auto';
219
252
  /** The animation style: `'circular' | 'classic' | 'pulse' | 'pulse-dot' | 'dots' | 'typing' | 'wave' | 'bars' | 'terminal' | 'text-blink' | 'text-shimmer' | 'loading-dots'`. Defaults to `'circular'`. */
@@ -224,7 +257,7 @@ export interface KitnLoaderElement extends HTMLElement {
224
257
  text?: string;
225
258
  }
226
259
 
227
- export interface KitnMarkdownElement extends HTMLElement {
260
+ export interface KcMarkdownElement extends HTMLElement {
228
261
  /** Color mode (`auto` follows prefers-color-scheme). */
229
262
  theme?: 'light' | 'dark' | 'auto';
230
263
  /** The markdown source to render. */
@@ -237,7 +270,7 @@ export interface KitnMarkdownElement extends HTMLElement {
237
270
  codeHighlight?: boolean;
238
271
  }
239
272
 
240
- export interface KitnMessageElement extends HTMLElement {
273
+ export interface KcMessageElement extends HTMLElement {
241
274
  /** Color mode (`auto` follows prefers-color-scheme). */
242
275
  theme?: 'light' | 'dark' | 'auto';
243
276
  /** The full message object. Set as a JS property. */
@@ -256,14 +289,7 @@ export interface KitnMessageElement extends HTMLElement {
256
289
  codeHighlight?: boolean;
257
290
  }
258
291
 
259
- export interface KitnMessageSkillsElement extends HTMLElement {
260
- /** Color mode (`auto` follows prefers-color-scheme). */
261
- theme?: 'light' | 'dark' | 'auto';
262
- /** The active skills to badge. Set as a JS property. */
263
- skills: { id: string; name: string }[];
264
- }
265
-
266
- export interface KitnModelSwitcherElement extends HTMLElement {
292
+ export interface KcModelSwitcherElement extends HTMLElement {
267
293
  /** Color mode (`auto` follows prefers-color-scheme). */
268
294
  theme?: 'light' | 'dark' | 'auto';
269
295
  /** The selectable models. Set as a JS property (array). */
@@ -272,7 +298,7 @@ export interface KitnModelSwitcherElement extends HTMLElement {
272
298
  currentModel?: string;
273
299
  }
274
300
 
275
- export interface KitnPromptInputElement extends HTMLElement {
301
+ export interface KcPromptInputElement extends HTMLElement {
276
302
  /** Color mode (`auto` follows prefers-color-scheme). */
277
303
  theme?: 'light' | 'dark' | 'auto';
278
304
  /** Controlled value of the input. When set, the host owns the text and must update it on `valuechange`; leave unset for uncontrolled behavior. */
@@ -301,22 +327,7 @@ export interface KitnPromptInputElement extends HTMLElement {
301
327
  attachments?: { id: string; type: "file" | "source-document"; filename?: string; mediaType?: string; url?: string; title?: string }[];
302
328
  }
303
329
 
304
- export interface KitnPromptSuggestionsElement extends HTMLElement {
305
- /** Color mode (`auto` follows prefers-color-scheme). */
306
- theme?: 'light' | 'dark' | 'auto';
307
- /** The suggestions. Strings, or `{ label, value }` when the displayed text and the emitted value differ. Set as a JS property. */
308
- suggestions: (string | { label: string; value?: undefined | string })[];
309
- /** Chip style: `'outline'` (default), `'ghost'`, or `'default'` (filled). */
310
- variant?: "ghost" | "default" | "outline";
311
- /** Size preset for each chip. Defaults to the pill default (`'lg'`); pass `'sm'` for smaller pills (or `'md'`). */
312
- size?: "sm" | "lg" | "md" | "icon" | "icon-sm";
313
- /** Full-width left-aligned rows instead of pills. */
314
- block?: boolean;
315
- /** Substring to highlight within each suggestion. */
316
- highlight?: string;
317
- }
318
-
319
- export interface KitnReasoningElement extends HTMLElement {
330
+ export interface KcReasoningElement extends HTMLElement {
320
331
  /** Color mode (`auto` follows prefers-color-scheme). */
321
332
  theme?: 'light' | 'dark' | 'auto';
322
333
  /** The reasoning text to display. */
@@ -331,7 +342,29 @@ export interface KitnReasoningElement extends HTMLElement {
331
342
  markdown?: boolean;
332
343
  }
333
344
 
334
- export interface KitnResponseStreamElement extends HTMLElement {
345
+ export interface KcResizableElement extends HTMLElement {
346
+ /** Color mode (`auto` follows prefers-color-scheme). */
347
+ theme?: 'light' | 'dark' | 'auto';
348
+ /** Layout axis: `horizontal` (row, default) or `vertical` (column). */
349
+ orientation?: "horizontal" | "vertical";
350
+ }
351
+
352
+ export interface KcResizableItemElement extends HTMLElement {
353
+ /** Color mode (`auto` follows prefers-color-scheme). */
354
+ theme?: 'light' | 'dark' | 'auto';
355
+ /** Initial main-axis size: `"280px"` (fixed) or `"25%"`/`25` (percent). Omitted → flexible. */
356
+ size?: string;
357
+ /** Minimum size during resize (px or %). */
358
+ min?: string;
359
+ /** Maximum size during resize (px or %). */
360
+ max?: string;
361
+ /** Fix this panel's size; adjacent dividers become non-draggable. */
362
+ locked?: boolean;
363
+ /** Hide this panel; its divider is dropped and the rest reflow. */
364
+ hidden?: boolean;
365
+ }
366
+
367
+ export interface KcResponseStreamElement extends HTMLElement {
335
368
  /** Color mode (`auto` follows prefers-color-scheme). */
336
369
  theme?: 'light' | 'dark' | 'auto';
337
370
  /** Text to stream. A string, or an `AsyncIterable<string>` (set as a JS property — async iterables can't be HTML attributes). */
@@ -344,7 +377,25 @@ export interface KitnResponseStreamElement extends HTMLElement {
344
377
  as?: string;
345
378
  }
346
379
 
347
- export interface KitnSourceElement extends HTMLElement {
380
+ export interface KcScopePickerElement extends HTMLElement {
381
+ /** Color mode (`auto` follows prefers-color-scheme). */
382
+ theme?: 'light' | 'dark' | 'auto';
383
+ /** Authors to offer as scope filters. Set as a JS property. */
384
+ availableAuthors: string[];
385
+ /** Tags to offer as scope filters. Set as a JS property. */
386
+ availableTags: string[];
387
+ /** The label shown on the trigger for the active scope. */
388
+ currentLabel?: string;
389
+ }
390
+
391
+ export interface KcSkillsElement extends HTMLElement {
392
+ /** Color mode (`auto` follows prefers-color-scheme). */
393
+ theme?: 'light' | 'dark' | 'auto';
394
+ /** The active skills to badge. Set as a JS property. */
395
+ skills: { id: string; name: string }[];
396
+ }
397
+
398
+ export interface KcSourceElement extends HTMLElement {
348
399
  /** Color mode (`auto` follows prefers-color-scheme). */
349
400
  theme?: 'light' | 'dark' | 'auto';
350
401
  /** The URL this citation links to (the domain also seeds the default label/favicon). */
@@ -359,7 +410,7 @@ export interface KitnSourceElement extends HTMLElement {
359
410
  showFavicon?: boolean;
360
411
  }
361
412
 
362
- export interface KitnSourceListElement extends HTMLElement {
413
+ export interface KcSourcesElement extends HTMLElement {
363
414
  /** Color mode (`auto` follows prefers-color-scheme). */
364
415
  theme?: 'light' | 'dark' | 'auto';
365
416
  /** The sources to render. Set as a JS property. */
@@ -368,7 +419,33 @@ export interface KitnSourceListElement extends HTMLElement {
368
419
  showFavicon?: boolean;
369
420
  }
370
421
 
371
- export interface KitnTextShimmerElement extends HTMLElement {
422
+ export interface KcSuggestionsElement extends HTMLElement {
423
+ /** Color mode (`auto` follows prefers-color-scheme). */
424
+ theme?: 'light' | 'dark' | 'auto';
425
+ /** The suggestions. Strings, or `{ label, value }` when the displayed text and the emitted value differ. Set as a JS property. */
426
+ suggestions: (string | { label: string; value?: undefined | string })[];
427
+ /** Chip style: `'outline'` (default), `'ghost'`, or `'default'` (filled). */
428
+ variant?: "ghost" | "default" | "outline";
429
+ /** Size preset for each chip. Defaults to the pill default (`'lg'`); pass `'sm'` for smaller pills (or `'md'`). */
430
+ size?: "sm" | "lg" | "md" | "icon" | "icon-sm";
431
+ /** Full-width left-aligned rows instead of pills. */
432
+ block?: boolean;
433
+ /** Substring to highlight within each suggestion. */
434
+ highlight?: string;
435
+ }
436
+
437
+ export interface KcTaskListElement extends HTMLElement {
438
+ /** Color mode (`auto` follows prefers-color-scheme). */
439
+ theme?: 'light' | 'dark' | 'auto';
440
+ /** The task-list definition (the CardEnvelope.data). Set as a JS PROPERTY: `el.data = { tasks:[…], selectAll, confirmLabel, … }`. Import `TaskListCardData` from `@kitnai/chat` for the full shape. */
441
+ data?: Record<string, unknown>;
442
+ /** Stable card id correlating every emitted CardEvent. Attribute: `card-id`. */
443
+ cardId?: string;
444
+ /** Heading rendered in the card chrome (= CardEnvelope.title). Attribute: `heading`. */
445
+ heading?: string;
446
+ }
447
+
448
+ export interface KcTextShimmerElement extends HTMLElement {
372
449
  /** Color mode (`auto` follows prefers-color-scheme). */
373
450
  theme?: 'light' | 'dark' | 'auto';
374
451
  /** The text to shimmer. */
@@ -381,7 +458,7 @@ export interface KitnTextShimmerElement extends HTMLElement {
381
458
  spread?: number;
382
459
  }
383
460
 
384
- export interface KitnThinkingBarElement extends HTMLElement {
461
+ export interface KcThinkingBarElement extends HTMLElement {
385
462
  /** Color mode (`auto` follows prefers-color-scheme). */
386
463
  theme?: 'light' | 'dark' | 'auto';
387
464
  /** The shimmering label, e.g. "Thinking…". */
@@ -392,7 +469,7 @@ export interface KitnThinkingBarElement extends HTMLElement {
392
469
  stopLabel?: string;
393
470
  }
394
471
 
395
- export interface KitnToolElement extends HTMLElement {
472
+ export interface KcToolElement extends HTMLElement {
396
473
  /** Color mode (`auto` follows prefers-color-scheme). */
397
474
  theme?: 'light' | 'dark' | 'auto';
398
475
  /** The tool-call to display. Set as a JS property. */
@@ -401,7 +478,7 @@ export interface KitnToolElement extends HTMLElement {
401
478
  open?: boolean;
402
479
  }
403
480
 
404
- export interface KitnVoiceInputElement extends HTMLElement {
481
+ export interface KcVoiceInputElement extends HTMLElement {
405
482
  /** Color mode (`auto` follows prefers-color-scheme). */
406
483
  theme?: 'light' | 'dark' | 'auto';
407
484
  /** Transcriber the host supplies — records audio, returns the text. This is a **function-valued property** (`el.transcribe = async blob => '...'`) because a value-returning callback can't be modelled as a fire-and-forget event. */
@@ -410,35 +487,84 @@ export interface KitnVoiceInputElement extends HTMLElement {
410
487
  disabled?: boolean;
411
488
  }
412
489
 
490
+ export interface KcWorkspaceElement extends HTMLElement {
491
+ /** Color mode (`auto` follows prefers-color-scheme). */
492
+ theme?: 'light' | 'dark' | 'auto';
493
+ /** Pre-bucketed conversation groups for the sidebar. Set as a JS property. */
494
+ groups: { id: string; userId?: undefined | string; teamId?: undefined | string; name: string; sortOrder: number; createdAt: string }[];
495
+ /** Flat conversation list (auto-bucketed if `groups` is empty). Set as a JS property. */
496
+ conversations: { id: string; title: string; groupId?: undefined | string; scope: { type: "document" | "collection"; documentId?: undefined | string; filters?: undefined | { tags?: undefined | string[]; authors?: undefined | string[]; contentType?: undefined | "transcript" | "markdown"; dateRange?: undefined | { from: string; to: string } } }; messageCount: number; lastMessageAt: string; updatedAt: string }[];
497
+ /** Id of the open conversation, highlighted in the sidebar. */
498
+ activeId?: string;
499
+ /** The active conversation's message thread, newest last. Set as a JS property. */
500
+ messages: { id: string; role: "user" | "assistant"; content: string; reasoning?: undefined | { text: string; label?: undefined | string }; tools?: undefined | { type: string; state: "input-streaming" | "input-available" | "output-available" | "output-error"; input?: undefined | Record<string, unknown>; output?: undefined | Record<string, unknown>; toolCallId?: undefined | string; errorText?: undefined | string }[]; attachments?: undefined | { id: string; type: "file" | "source-document"; filename?: undefined | string; mediaType?: undefined | string; url?: undefined | string; title?: undefined | string }[]; actions?: undefined | ("copy" | "like" | "dislike" | "regenerate" | "edit")[] }[];
501
+ value?: string;
502
+ placeholder?: string;
503
+ loading?: boolean;
504
+ suggestions?: string[];
505
+ suggestionMode?: "submit" | "fill";
506
+ proseSize?: "xs" | "sm" | "base" | "lg";
507
+ codeTheme?: string;
508
+ codeHighlight?: boolean;
509
+ chatTitle?: string;
510
+ models?: { id: string; name: string; provider?: string }[];
511
+ currentModel?: string;
512
+ context?: { usedTokens: number; maxTokens: number; inputTokens?: number; outputTokens?: number; estimatedCost?: number };
513
+ scrollButton?: boolean;
514
+ search?: boolean;
515
+ voice?: boolean;
516
+ slashCommands?: { id: string; label: string; description?: string; category?: string }[];
517
+ slashActiveIds?: string[];
518
+ slashCompact?: boolean;
519
+ /** Sidebar default width as a percent of the workspace (default 22). */
520
+ sidebarWidth?: number;
521
+ /** Sidebar min width in px (default 200). */
522
+ sidebarMinWidth?: number;
523
+ /** Sidebar max width in px (default 420). */
524
+ sidebarMaxWidth?: number;
525
+ /** Initial collapsed state of the sidebar (default false). */
526
+ sidebarCollapsed?: boolean;
527
+ }
528
+
413
529
  declare global {
414
530
  interface HTMLElementTagNameMap {
415
- 'kitn-attachments': KitnAttachmentsElement;
416
- 'kitn-chain-of-thought': KitnChainOfThoughtElement;
417
- 'kitn-chat': KitnChatElement;
418
- 'kitn-chat-scope-picker': KitnChatScopePickerElement;
419
- 'kitn-chat-workspace': KitnChatWorkspaceElement;
420
- 'kitn-checkpoint': KitnCheckpointElement;
421
- 'kitn-code-block': KitnCodeBlockElement;
422
- 'kitn-context-meter': KitnContextMeterElement;
423
- 'kitn-conversation-list': KitnConversationListElement;
424
- 'kitn-empty': KitnEmptyElement;
425
- 'kitn-feedback-bar': KitnFeedbackBarElement;
426
- 'kitn-file-upload': KitnFileUploadElement;
427
- 'kitn-image': KitnImageElement;
428
- 'kitn-loader': KitnLoaderElement;
429
- 'kitn-markdown': KitnMarkdownElement;
430
- 'kitn-message': KitnMessageElement;
431
- 'kitn-message-skills': KitnMessageSkillsElement;
432
- 'kitn-model-switcher': KitnModelSwitcherElement;
433
- 'kitn-prompt-input': KitnPromptInputElement;
434
- 'kitn-prompt-suggestions': KitnPromptSuggestionsElement;
435
- 'kitn-reasoning': KitnReasoningElement;
436
- 'kitn-response-stream': KitnResponseStreamElement;
437
- 'kitn-source': KitnSourceElement;
438
- 'kitn-source-list': KitnSourceListElement;
439
- 'kitn-text-shimmer': KitnTextShimmerElement;
440
- 'kitn-thinking-bar': KitnThinkingBarElement;
441
- 'kitn-tool': KitnToolElement;
442
- 'kitn-voice-input': KitnVoiceInputElement;
531
+ 'kc-artifact': KcArtifactElement;
532
+ 'kc-attachments': KcAttachmentsElement;
533
+ 'kc-card': KcCardElement;
534
+ 'kc-chain-of-thought': KcChainOfThoughtElement;
535
+ 'kc-chat': KcChatElement;
536
+ 'kc-checkpoint': KcCheckpointElement;
537
+ 'kc-code-block': KcCodeBlockElement;
538
+ 'kc-confirm': KcConfirmElement;
539
+ 'kc-context': KcContextElement;
540
+ 'kc-conversations': KcConversationsElement;
541
+ 'kc-embed': KcEmbedElement;
542
+ 'kc-empty': KcEmptyElement;
543
+ 'kc-feedback-bar': KcFeedbackBarElement;
544
+ 'kc-file-tree': KcFileTreeElement;
545
+ 'kc-file-upload': KcFileUploadElement;
546
+ 'kc-form': KcFormElement;
547
+ 'kc-image': KcImageElement;
548
+ 'kc-link-card': KcLinkCardElement;
549
+ 'kc-loader': KcLoaderElement;
550
+ 'kc-markdown': KcMarkdownElement;
551
+ 'kc-message': KcMessageElement;
552
+ 'kc-model-switcher': KcModelSwitcherElement;
553
+ 'kc-prompt-input': KcPromptInputElement;
554
+ 'kc-reasoning': KcReasoningElement;
555
+ 'kc-resizable': KcResizableElement;
556
+ 'kc-resizable-item': KcResizableItemElement;
557
+ 'kc-response-stream': KcResponseStreamElement;
558
+ 'kc-scope-picker': KcScopePickerElement;
559
+ 'kc-skills': KcSkillsElement;
560
+ 'kc-source': KcSourceElement;
561
+ 'kc-sources': KcSourcesElement;
562
+ 'kc-suggestions': KcSuggestionsElement;
563
+ 'kc-task-list': KcTaskListElement;
564
+ 'kc-text-shimmer': KcTextShimmerElement;
565
+ 'kc-thinking-bar': KcThinkingBarElement;
566
+ 'kc-tool': KcToolElement;
567
+ 'kc-voice-input': KcVoiceInputElement;
568
+ 'kc-workspace': KcWorkspaceElement;
443
569
  }
444
570
  }