@ouraihub/aether-ui 0.0.0-stage → 0.1.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.
Files changed (212) hide show
  1. package/LICENSE +789 -0
  2. package/fixtures/model-classify.json +42 -0
  3. package/fixtures/pricing-cost.json +56 -0
  4. package/fixtures/reasoning-infer.json +44 -0
  5. package/fixtures/sse/anthropic-messages/chinese.sse +24 -0
  6. package/fixtures/sse/anthropic-messages/multi-tool.sse +33 -0
  7. package/fixtures/sse/anthropic-messages/single-tool.sse +39 -0
  8. package/fixtures/sse/anthropic-messages/text.sse +27 -0
  9. package/fixtures/sse/anthropic-messages/truncated.sse +21 -0
  10. package/fixtures/sse/anthropic-messages/upstream-error.sse +12 -0
  11. package/fixtures/sse/expect.json +20 -0
  12. package/fixtures/sse/openai-chat/chinese.sse +14 -0
  13. package/fixtures/sse/openai-chat/multi-tool.sse +18 -0
  14. package/fixtures/sse/openai-chat/single-tool.sse +22 -0
  15. package/fixtures/sse/openai-chat/text.sse +14 -0
  16. package/fixtures/sse/openai-chat/truncated.sse +12 -0
  17. package/fixtures/sse/openai-chat/upstream-error.sse +6 -0
  18. package/fixtures/sse/openai-responses/chinese.sse +33 -0
  19. package/fixtures/sse/openai-responses/multi-tool.sse +36 -0
  20. package/fixtures/sse/openai-responses/single-tool.sse +27 -0
  21. package/fixtures/sse/openai-responses/text.sse +33 -0
  22. package/fixtures/sse/openai-responses/truncated.sse +30 -0
  23. package/fixtures/sse/openai-responses/upstream-error.sse +9 -0
  24. package/package.json +71 -3
  25. package/src/CopyInput.svelte +33 -0
  26. package/src/KitNotifier.svelte +33 -0
  27. package/src/chat/ApprovalCard.svelte +29 -0
  28. package/src/chat/ChatComposer.svelte +277 -0
  29. package/src/chat/ChatMessage.svelte +262 -0
  30. package/src/chat/ChatPanel.css +386 -0
  31. package/src/chat/ChatPanel.svelte +496 -0
  32. package/src/chat/ChatPanelApprovals.svelte +28 -0
  33. package/src/chat/ChatPanelComposer.svelte +317 -0
  34. package/src/chat/ChatPanelDialogs.svelte +242 -0
  35. package/src/chat/ChatPanelHeader.svelte +132 -0
  36. package/src/chat/ChatPanelMessages.svelte +166 -0
  37. package/src/chat/ChatPanelMode.svelte +190 -0
  38. package/src/chat/ChatPanelState.svelte.ts +1 -0
  39. package/src/chat/ChatPanelToolbar.svelte +425 -0
  40. package/src/chat/ChatSurface.svelte +168 -0
  41. package/src/chat/MessageItem.svelte +480 -0
  42. package/src/chat/ReasoningControl.svelte +286 -0
  43. package/src/chat/SkillPicker.svelte +133 -0
  44. package/src/chat/ToolCallItem.svelte +23 -0
  45. package/src/chat/UsageControl.svelte +216 -0
  46. package/src/chat/UsageDetails.svelte +76 -0
  47. package/src/chat/chat-attachments.svelte.ts +74 -0
  48. package/src/chat/chat-panel-history.svelte.ts +430 -0
  49. package/src/chat/chat-panel-props.ts +32 -0
  50. package/src/chat/index.ts +6 -0
  51. package/src/chat/run-session-history.ts +56 -0
  52. package/src/chat/run-session-types.ts +69 -0
  53. package/src/chat/run-session.svelte.ts +494 -0
  54. package/src/chat/test-support/chat-fixture.ts +178 -0
  55. package/src/chat/test-support/conversation-fixtures.ts +32 -0
  56. package/src/chat/test-support/run-session-fixture.ts +112 -0
  57. package/src/components/ui/alert/alert-action.svelte +20 -0
  58. package/src/components/ui/alert/alert-description.svelte +23 -0
  59. package/src/components/ui/alert/alert-title.svelte +23 -0
  60. package/src/components/ui/alert/alert.svelte +43 -0
  61. package/src/components/ui/alert/index.ts +17 -0
  62. package/src/components/ui/alert-dialog/alert-dialog-action.svelte +27 -0
  63. package/src/components/ui/alert-dialog/alert-dialog-cancel.svelte +27 -0
  64. package/src/components/ui/alert-dialog/alert-dialog-content.svelte +32 -0
  65. package/src/components/ui/alert-dialog/alert-dialog-description.svelte +17 -0
  66. package/src/components/ui/alert-dialog/alert-dialog-footer.svelte +23 -0
  67. package/src/components/ui/alert-dialog/alert-dialog-header.svelte +20 -0
  68. package/src/components/ui/alert-dialog/alert-dialog-media.svelte +20 -0
  69. package/src/components/ui/alert-dialog/alert-dialog-overlay.svelte +17 -0
  70. package/src/components/ui/alert-dialog/alert-dialog-portal.svelte +7 -0
  71. package/src/components/ui/alert-dialog/alert-dialog-title.svelte +17 -0
  72. package/src/components/ui/alert-dialog/alert-dialog-trigger.svelte +7 -0
  73. package/src/components/ui/alert-dialog/alert-dialog.svelte +7 -0
  74. package/src/components/ui/alert-dialog/index.ts +40 -0
  75. package/src/components/ui/button/button.svelte +81 -0
  76. package/src/components/ui/button/index.ts +17 -0
  77. package/src/components/ui/dialog/dialog-close.svelte +11 -0
  78. package/src/components/ui/dialog/dialog-content.svelte +48 -0
  79. package/src/components/ui/dialog/dialog-description.svelte +17 -0
  80. package/src/components/ui/dialog/dialog-footer.svelte +32 -0
  81. package/src/components/ui/dialog/dialog-header.svelte +20 -0
  82. package/src/components/ui/dialog/dialog-overlay.svelte +17 -0
  83. package/src/components/ui/dialog/dialog-portal.svelte +7 -0
  84. package/src/components/ui/dialog/dialog-title.svelte +17 -0
  85. package/src/components/ui/dialog/dialog-trigger.svelte +11 -0
  86. package/src/components/ui/dialog/dialog.svelte +7 -0
  87. package/src/components/ui/dialog/index.ts +34 -0
  88. package/src/components/ui/dropdown-menu/dropdown-menu-checkbox-group.svelte +16 -0
  89. package/src/components/ui/dropdown-menu/dropdown-menu-checkbox-item.svelte +46 -0
  90. package/src/components/ui/dropdown-menu/dropdown-menu-content.svelte +31 -0
  91. package/src/components/ui/dropdown-menu/dropdown-menu-group-heading.svelte +22 -0
  92. package/src/components/ui/dropdown-menu/dropdown-menu-group.svelte +7 -0
  93. package/src/components/ui/dropdown-menu/dropdown-menu-item.svelte +27 -0
  94. package/src/components/ui/dropdown-menu/dropdown-menu-label.svelte +24 -0
  95. package/src/components/ui/dropdown-menu/dropdown-menu-portal.svelte +7 -0
  96. package/src/components/ui/dropdown-menu/dropdown-menu-radio-group.svelte +17 -0
  97. package/src/components/ui/dropdown-menu/dropdown-menu-radio-item.svelte +36 -0
  98. package/src/components/ui/dropdown-menu/dropdown-menu-separator.svelte +17 -0
  99. package/src/components/ui/dropdown-menu/dropdown-menu-shortcut.svelte +20 -0
  100. package/src/components/ui/dropdown-menu/dropdown-menu-sub-content.svelte +31 -0
  101. package/src/components/ui/dropdown-menu/dropdown-menu-sub-trigger.svelte +29 -0
  102. package/src/components/ui/dropdown-menu/dropdown-menu-sub.svelte +7 -0
  103. package/src/components/ui/dropdown-menu/dropdown-menu-trigger.svelte +7 -0
  104. package/src/components/ui/dropdown-menu/dropdown-menu.svelte +7 -0
  105. package/src/components/ui/dropdown-menu/index.ts +54 -0
  106. package/src/components/ui/empty/empty-content.svelte +23 -0
  107. package/src/components/ui/empty/empty-description.svelte +23 -0
  108. package/src/components/ui/empty/empty-header.svelte +20 -0
  109. package/src/components/ui/empty/empty-media.svelte +41 -0
  110. package/src/components/ui/empty/empty-title.svelte +20 -0
  111. package/src/components/ui/empty/empty.svelte +23 -0
  112. package/src/components/ui/empty/index.ts +22 -0
  113. package/src/components/ui/field/field-content.svelte +20 -0
  114. package/src/components/ui/field/field-description.svelte +25 -0
  115. package/src/components/ui/field/field-error.svelte +58 -0
  116. package/src/components/ui/field/field-group.svelte +23 -0
  117. package/src/components/ui/field/field-label.svelte +25 -0
  118. package/src/components/ui/field/field-legend.svelte +24 -0
  119. package/src/components/ui/field/field-separator.svelte +35 -0
  120. package/src/components/ui/field/field-set.svelte +20 -0
  121. package/src/components/ui/field/field-title.svelte +20 -0
  122. package/src/components/ui/field/field.svelte +47 -0
  123. package/src/components/ui/field/index.ts +33 -0
  124. package/src/components/ui/input/index.ts +7 -0
  125. package/src/components/ui/input/input.svelte +48 -0
  126. package/src/components/ui/label/index.ts +7 -0
  127. package/src/components/ui/label/label.svelte +20 -0
  128. package/src/components/ui/select/index.ts +40 -0
  129. package/src/components/ui/select/select-content.svelte +45 -0
  130. package/src/components/ui/select/select-group-heading.svelte +21 -0
  131. package/src/components/ui/select/select-group.svelte +17 -0
  132. package/src/components/ui/select/select-item.svelte +43 -0
  133. package/src/components/ui/select/select-label.svelte +20 -0
  134. package/src/components/ui/select/select-portal.svelte +7 -0
  135. package/src/components/ui/select/select-scroll-down-button.svelte +20 -0
  136. package/src/components/ui/select/select-scroll-up-button.svelte +20 -0
  137. package/src/components/ui/select/select-separator.svelte +18 -0
  138. package/src/components/ui/select/select-trigger.svelte +29 -0
  139. package/src/components/ui/select/select-value.svelte +7 -0
  140. package/src/components/ui/select/select.svelte +11 -0
  141. package/src/components/ui/separator/index.ts +7 -0
  142. package/src/components/ui/separator/separator.svelte +21 -0
  143. package/src/components/ui/sonner/index.ts +1 -0
  144. package/src/components/ui/sonner/sonner.svelte +40 -0
  145. package/src/components/ui/switch/index.ts +7 -0
  146. package/src/components/ui/switch/switch.svelte +34 -0
  147. package/src/components/ui/textarea/index.ts +7 -0
  148. package/src/components/ui/textarea/textarea.svelte +22 -0
  149. package/src/context.ts +34 -0
  150. package/src/dev/Demo.svelte +47 -0
  151. package/src/dev/main.ts +7 -0
  152. package/src/i18n/en.ts +645 -0
  153. package/src/i18n/index.ts +28 -0
  154. package/src/i18n/zh-CN.ts +610 -0
  155. package/src/index.ts +10 -0
  156. package/src/logs/LogPanel.svelte +103 -0
  157. package/src/logs/LogSettings.svelte +58 -0
  158. package/src/logs/index.ts +5 -0
  159. package/src/logs/logger.ts +96 -0
  160. package/src/markdown.ts +8 -0
  161. package/src/mcp/McpClientEditor.svelte +204 -0
  162. package/src/mcp/McpClientSettings.svelte +418 -0
  163. package/src/mcp/McpServerSettings.svelte +363 -0
  164. package/src/mcp/config.ts +26 -0
  165. package/src/mcp/index.ts +3 -0
  166. package/src/mcp/input.ts +74 -0
  167. package/src/notify.svelte.ts +43 -0
  168. package/src/ports/contract.ts +174 -0
  169. package/src/ports/fake-optional.ts +81 -0
  170. package/src/ports/fake.ts +488 -0
  171. package/src/ports/index.ts +7 -0
  172. package/src/ports/search.ts +56 -0
  173. package/src/ports/skill-sources.ts +45 -0
  174. package/src/ports/test-support/fake-fixture.ts +63 -0
  175. package/src/providers/EndpointKeysDialog.svelte +357 -0
  176. package/src/providers/EndpointModels.svelte +311 -0
  177. package/src/providers/EndpointPanel.svelte +266 -0
  178. package/src/providers/ModelPickerDialog.svelte +230 -0
  179. package/src/providers/ModelPricing.svelte +125 -0
  180. package/src/providers/ModelSelect.svelte +448 -0
  181. package/src/providers/ModelSettingsDialog.svelte +388 -0
  182. package/src/providers/ProviderDialogs.svelte +120 -0
  183. package/src/providers/ProviderList.svelte +159 -0
  184. package/src/providers/ProvidersSettings.svelte +491 -0
  185. package/src/providers/RequestConfigDialog.svelte +278 -0
  186. package/src/providers/SecretInput.svelte +284 -0
  187. package/src/providers/draft.ts +355 -0
  188. package/src/providers/edit-session.ts +170 -0
  189. package/src/providers/index.ts +5 -0
  190. package/src/providers/reasoning.ts +55 -0
  191. package/src/providers/revision.svelte.ts +6 -0
  192. package/src/providers/test-support/providers-fixture.ts +120 -0
  193. package/src/search/SearchAdvancedTools.svelte +182 -0
  194. package/src/search/SearchProviderCard.svelte +195 -0
  195. package/src/search/SearchSettings.svelte +500 -0
  196. package/src/search/index.ts +13 -0
  197. package/src/search/settings-flow.ts +67 -0
  198. package/src/session.ts +20 -0
  199. package/src/skills/SkillAdd.svelte +380 -0
  200. package/src/skills/SkillAuthoring.svelte +430 -0
  201. package/src/skills/SkillEditor.svelte +104 -0
  202. package/src/skills/SkillPreviewDialog.svelte +136 -0
  203. package/src/skills/SkillsSettings.svelte +147 -0
  204. package/src/skills/error.ts +32 -0
  205. package/src/skills/index.ts +4 -0
  206. package/src/skills/test-support/skills-fixture.ts +139 -0
  207. package/src/styles/kit.css +137 -0
  208. package/src/styles/tokens.css +22 -0
  209. package/src/tauri/index.ts +298 -0
  210. package/src/utils.ts +22 -0
  211. package/src/web/index.ts +441 -0
  212. package/README.md +0 -3
@@ -0,0 +1,262 @@
1
+ <script lang="ts">
2
+ import type { Snippet } from 'svelte'
3
+ import { renderMarkdown } from '../markdown'
4
+ import { Button } from '#lib/components/ui/button/index.js'
5
+
6
+ let {
7
+ role,
8
+ text,
9
+ label,
10
+ status,
11
+ reasoning,
12
+ reasoningLabel = 'Reasoning',
13
+ process,
14
+ attachments,
15
+ children,
16
+ actions,
17
+ latest = false,
18
+ selected = false,
19
+ showMoreLabel = 'Show more',
20
+ showLessLabel = 'Show less',
21
+ }: {
22
+ role: 'user' | 'assistant'
23
+ text: string
24
+ label?: string | undefined
25
+ status?: string | undefined
26
+ reasoning?: string | undefined
27
+ reasoningLabel?: string | undefined
28
+ process?: Snippet | undefined
29
+ attachments?: Snippet | undefined
30
+ children?: Snippet | undefined
31
+ actions?: Snippet | undefined
32
+ latest?: boolean | undefined
33
+ selected?: boolean | undefined
34
+ showMoreLabel?: string | undefined
35
+ showLessLabel?: string | undefined
36
+ } = $props()
37
+ const html = $derived(role === 'assistant' ? renderMarkdown(text) : '')
38
+ const preview = $derived.by(() => {
39
+ if (role !== 'user') return null
40
+ let lines = 0
41
+ let end = 0
42
+ for (const line of text.split('\n')) {
43
+ if (line.trim() && ++lines > 5) return text.slice(0, end).trimEnd()
44
+ end += line.length + 1
45
+ }
46
+ return null
47
+ })
48
+ let expanded = $state(false)
49
+ </script>
50
+
51
+ <div
52
+ class="chat-message"
53
+ data-status={status}
54
+ class:user={role === 'user'}
55
+ class:assistant={role === 'assistant'}
56
+ class:latest
57
+ class:selected
58
+ >
59
+ {#if label}<div class="reply-source">{label}</div>{/if}
60
+ {#if attachments}{@render attachments()}{/if}
61
+ {#if reasoning}<details class="thinking">
62
+ <summary>{reasoningLabel}</summary>
63
+ <p>{reasoning}</p>
64
+ </details>{/if}
65
+ {#if process}{@render process()}{/if}
66
+ {#if role === 'user'}
67
+ <div class="user-bubble">
68
+ <p class="user-message">{preview !== null && !expanded ? preview : text}</p>
69
+ {#if preview !== null}<Button
70
+ type="button"
71
+ variant="ghost"
72
+ size="sm"
73
+ aria-expanded={expanded}
74
+ onclick={() => {
75
+ expanded = !expanded
76
+ }}>{expanded ? showLessLabel : showMoreLabel}</Button
77
+ >{/if}
78
+ </div>
79
+ {:else}
80
+ <div
81
+ class="markdown"
82
+ {@attach (node) => {
83
+ node.innerHTML = html
84
+ }}
85
+ ></div>
86
+ {/if}
87
+ {#if children}{@render children()}{/if}
88
+ {#if actions}<div class="message-actions">{@render actions()}</div>{/if}
89
+ </div>
90
+
91
+ <style>
92
+ /* Hallmark · component: open assistant message · theme: host semantic tokens */
93
+ .chat-message {
94
+ display: flex;
95
+ flex-direction: column;
96
+ gap: 0.75rem;
97
+ min-width: 0;
98
+ max-width: 100%;
99
+ overflow-wrap: anywhere;
100
+ color: var(--color-foreground);
101
+ }
102
+ .assistant {
103
+ padding-block: 0.75rem;
104
+ }
105
+ .selected {
106
+ outline: 1px solid var(--color-border);
107
+ outline-offset: 0.5rem;
108
+ border-radius: var(--kit-radius, var(--radius));
109
+ }
110
+ .user {
111
+ align-items: flex-end;
112
+ }
113
+ .user-bubble {
114
+ max-width: min(90%, 42rem);
115
+ border-radius: var(--kit-radius, var(--radius));
116
+ padding: 0.625rem 0.875rem;
117
+ background: var(--color-muted);
118
+ }
119
+ .user-message {
120
+ margin: 0;
121
+ font-size: var(--kit-text-base);
122
+ white-space: pre-wrap;
123
+ }
124
+ .reply-source,
125
+ .thinking {
126
+ color: var(--color-muted-foreground);
127
+ font-size: var(--kit-text-sm);
128
+ }
129
+ .thinking summary {
130
+ cursor: pointer;
131
+ }
132
+ .thinking summary:focus-visible {
133
+ outline: 2px solid var(--color-ring);
134
+ outline-offset: 2px;
135
+ }
136
+ .thinking p {
137
+ white-space: pre-wrap;
138
+ margin-block: 0.5rem;
139
+ }
140
+ .message-actions {
141
+ display: flex;
142
+ align-items: center;
143
+ flex-wrap: wrap;
144
+ gap: 0.25rem;
145
+ min-height: 2rem;
146
+ }
147
+ .message-actions :global(button) {
148
+ min-width: 2rem;
149
+ min-height: 2rem;
150
+ }
151
+ @media (hover: hover) {
152
+ .assistant:not(.latest) .message-actions {
153
+ opacity: 0;
154
+ }
155
+ .assistant:hover .message-actions,
156
+ .assistant:focus-within .message-actions {
157
+ opacity: 1;
158
+ }
159
+ }
160
+ .markdown {
161
+ font-size: var(--kit-text-base);
162
+ line-height: 1.6;
163
+ }
164
+ .markdown :global(p),
165
+ .markdown :global(ul),
166
+ .markdown :global(ol),
167
+ .markdown :global(blockquote),
168
+ .markdown :global(pre),
169
+ .markdown :global(table) {
170
+ margin: 0.75em 0;
171
+ }
172
+ .markdown :global(h1),
173
+ .markdown :global(h2),
174
+ .markdown :global(h3),
175
+ .markdown :global(h4),
176
+ .markdown :global(h5),
177
+ .markdown :global(h6) {
178
+ margin: 1em 0 0.5em;
179
+ font-weight: 600;
180
+ line-height: 1.35;
181
+ }
182
+ .markdown :global(h1) {
183
+ font-size: 1.4em;
184
+ }
185
+ .markdown :global(h2) {
186
+ font-size: 1.25em;
187
+ }
188
+ .markdown :global(h3) {
189
+ font-size: 1.1em;
190
+ }
191
+ .markdown :global(ul),
192
+ .markdown :global(ol) {
193
+ padding-inline-start: 1.5em;
194
+ }
195
+ .markdown :global(ul) {
196
+ list-style: disc;
197
+ }
198
+ .markdown :global(ol) {
199
+ list-style: decimal;
200
+ }
201
+ .markdown :global(li) {
202
+ margin: 0.25em 0;
203
+ }
204
+ .markdown :global(li::marker) {
205
+ color: var(--color-muted-foreground);
206
+ }
207
+ .markdown :global(blockquote) {
208
+ border-inline-start: 3px solid var(--color-border);
209
+ padding-inline-start: 0.75em;
210
+ color: var(--color-muted-foreground);
211
+ }
212
+ .markdown :global(a) {
213
+ color: var(--color-primary);
214
+ text-decoration: underline;
215
+ overflow-wrap: anywhere;
216
+ }
217
+ .markdown :global(code) {
218
+ border-radius: var(--kit-radius-sm);
219
+ background: var(--color-background);
220
+ padding: 0.1em 0.3em;
221
+ font-size: 0.95em;
222
+ }
223
+ .markdown :global(pre) {
224
+ max-width: 100%;
225
+ overflow-x: auto;
226
+ padding: 0.75em;
227
+ border: 1px solid var(--color-border);
228
+ border-radius: var(--kit-radius-sm);
229
+ background: var(--color-background);
230
+ white-space: pre;
231
+ overflow-wrap: normal;
232
+ }
233
+ .markdown :global(pre code) {
234
+ padding: 0;
235
+ background: none;
236
+ }
237
+ .markdown :global(table) {
238
+ display: block;
239
+ max-width: 100%;
240
+ overflow-x: auto;
241
+ border-collapse: collapse;
242
+ }
243
+ .markdown :global(th),
244
+ .markdown :global(td) {
245
+ padding: 0.4em 0.6em;
246
+ border: 1px solid var(--color-border);
247
+ }
248
+ .markdown :global(th) {
249
+ font-weight: 600;
250
+ }
251
+ .markdown :global(img),
252
+ .markdown :global(video) {
253
+ max-width: 100%;
254
+ height: auto;
255
+ }
256
+ .markdown :global(:first-child) {
257
+ margin-top: 0;
258
+ }
259
+ .markdown :global(:last-child) {
260
+ margin-bottom: 0;
261
+ }
262
+ </style>
@@ -0,0 +1,386 @@
1
+ .chat-panel {
2
+ display: flex;
3
+ flex: 1;
4
+ flex-direction: column;
5
+ gap: 0.75rem;
6
+ min-width: 0;
7
+ min-height: 0;
8
+ height: 100%;
9
+ container-type: size;
10
+ }
11
+ .chat-header {
12
+ display: flex;
13
+ flex-direction: column;
14
+ gap: 0.5rem;
15
+ flex: none;
16
+ min-width: 0;
17
+ }
18
+ .title-row {
19
+ display: flex;
20
+ align-items: center;
21
+ gap: 0.25rem;
22
+ min-width: 0;
23
+ }
24
+ .title-row h2 {
25
+ flex: 1;
26
+ min-width: 0;
27
+ margin: 0;
28
+ font: inherit;
29
+ font-weight: 600;
30
+ overflow: hidden;
31
+ text-overflow: ellipsis;
32
+ white-space: nowrap;
33
+ }
34
+ .title-row :global(button) {
35
+ flex-shrink: 0;
36
+ }
37
+ .model-row {
38
+ min-width: 0;
39
+ }
40
+ .turns {
41
+ display: flex;
42
+ flex-direction: column;
43
+ gap: 1rem;
44
+ padding: 0;
45
+ margin: 0;
46
+ list-style: none;
47
+ }
48
+ .empty-message {
49
+ color: var(--color-muted-foreground);
50
+ text-align: center;
51
+ padding: 1.5rem 0.5rem;
52
+ margin: 0;
53
+ }
54
+ .context-chip {
55
+ display: flex;
56
+ align-items: center;
57
+ align-self: flex-start;
58
+ gap: 0.25rem;
59
+ max-width: calc(100% - 2rem);
60
+ padding-left: 0.5rem;
61
+ background: var(--color-muted);
62
+ border-radius: var(--kit-radius, var(--radius));
63
+ }
64
+ .context-chip span {
65
+ min-width: 0;
66
+ overflow: hidden;
67
+ text-overflow: ellipsis;
68
+ white-space: nowrap;
69
+ }
70
+ .context-chip :global(button) {
71
+ flex-shrink: 0;
72
+ }
73
+ .image-tray {
74
+ display: flex;
75
+ flex-wrap: wrap;
76
+ gap: 0.375rem;
77
+ margin: 0;
78
+ padding: 0;
79
+ list-style: none;
80
+ }
81
+ .image-tray li {
82
+ position: relative;
83
+ }
84
+ .image-tray img {
85
+ width: 3.5rem;
86
+ height: 3.5rem;
87
+ object-fit: cover;
88
+ border: 1px solid var(--color-border);
89
+ border-radius: var(--kit-radius, var(--radius));
90
+ }
91
+ .image-tray :global(button) {
92
+ position: absolute;
93
+ top: -0.375rem;
94
+ right: -0.375rem;
95
+ }
96
+ .approval-override {
97
+ display: flex;
98
+ flex-direction: column;
99
+ gap: 0.5rem;
100
+ min-width: 0;
101
+ }
102
+ .approval-override > :global(button) {
103
+ align-self: flex-end;
104
+ }
105
+ .chat-panel :global(button.search-toggle) {
106
+ color: var(--color-muted-foreground);
107
+ }
108
+ .chat-panel :global(button.search-toggle[aria-pressed='true']) {
109
+ color: var(--color-primary-foreground);
110
+ background: var(--color-primary);
111
+ border-color: var(--color-primary);
112
+ }
113
+ .chat-panel :global(button.search-toggle[aria-pressed='true']:hover:not(:disabled)) {
114
+ background: color-mix(in oklch, var(--color-primary) 85%, var(--color-foreground));
115
+ }
116
+ :global(.tools-menu) {
117
+ z-index: 50;
118
+ box-sizing: border-box;
119
+ width: min(16rem, calc(100vw - 1rem));
120
+ display: flex;
121
+ flex-direction: column;
122
+ padding: 0.25rem;
123
+ border: 1px solid var(--color-border);
124
+ border-radius: var(--kit-radius, var(--radius));
125
+ background: var(--color-popover);
126
+ color: var(--color-popover-foreground);
127
+ box-shadow: 0 4px 12px color-mix(in oklch, var(--color-foreground) 12%, transparent);
128
+ font-size: var(--kit-font-size-sm, 0.8125rem);
129
+ }
130
+ :global(.tools-item) {
131
+ display: flex;
132
+ align-items: center;
133
+ gap: 0.5rem;
134
+ min-height: 2.25rem;
135
+ padding: 0.25rem 0.625rem;
136
+ border: 0;
137
+ border-radius: calc(var(--kit-radius, var(--radius)) - 2px);
138
+ background: transparent;
139
+ color: inherit;
140
+ font: inherit;
141
+ text-align: left;
142
+ cursor: pointer;
143
+ }
144
+ :global(.tools-item:hover:not(:disabled)),
145
+ :global(.tools-item:focus-visible) {
146
+ background: var(--color-accent);
147
+ color: var(--color-accent-foreground);
148
+ outline: none;
149
+ }
150
+ :global(.tools-item:disabled) {
151
+ cursor: not-allowed;
152
+ opacity: 0.55;
153
+ }
154
+ :global(.tools-item svg) {
155
+ width: 1rem;
156
+ height: 1rem;
157
+ flex-shrink: 0;
158
+ }
159
+ :global(.tools-item small) {
160
+ margin-left: auto;
161
+ color: var(--color-muted-foreground);
162
+ font-size: 0.75rem;
163
+ }
164
+ :global(.tools-item > svg:last-child:not(:first-child)) {
165
+ margin-left: auto;
166
+ }
167
+ :global(.tools-footer) {
168
+ margin-top: 0.25rem;
169
+ border-top: 1px solid var(--color-border);
170
+ border-radius: 0 0 calc(var(--kit-radius, var(--radius)) - 2px)
171
+ calc(var(--kit-radius, var(--radius)) - 2px);
172
+ color: var(--color-muted-foreground);
173
+ }
174
+ :global(.tools-title) {
175
+ margin: 0;
176
+ padding: 0.375rem 0.5rem;
177
+ font-size: 0.875rem;
178
+ font-weight: 500;
179
+ }
180
+ :global(.tools-order) {
181
+ display: flex;
182
+ flex-direction: column;
183
+ gap: 0.125rem;
184
+ margin: 0;
185
+ padding: 0;
186
+ list-style: none;
187
+ }
188
+ :global(.tools-row) {
189
+ display: flex;
190
+ align-items: center;
191
+ gap: 0.5rem;
192
+ min-height: 2rem;
193
+ padding: 0 0.375rem;
194
+ border-radius: calc(var(--kit-radius, var(--radius)) - 2px);
195
+ font-size: 0.875rem;
196
+ }
197
+ :global(.tools-row:hover) {
198
+ background: var(--color-accent);
199
+ }
200
+ :global(.tools-row > svg) {
201
+ width: 1rem;
202
+ height: 1rem;
203
+ flex-shrink: 0;
204
+ color: var(--color-muted-foreground);
205
+ }
206
+ :global(.tools-row > span) {
207
+ flex: 1;
208
+ min-width: 0;
209
+ overflow: hidden;
210
+ text-overflow: ellipsis;
211
+ white-space: nowrap;
212
+ }
213
+ :global(.tools-grip) {
214
+ display: inline-flex;
215
+ padding: 0.125rem;
216
+ border: 0;
217
+ border-radius: 0.25rem;
218
+ background: none;
219
+ color: var(--color-muted-foreground);
220
+ cursor: grab;
221
+ touch-action: none;
222
+ }
223
+ :global(.tools-grip:focus-visible) {
224
+ outline: 2px solid var(--color-ring);
225
+ }
226
+ :global(.tools-grip svg) {
227
+ width: 0.875rem;
228
+ height: 0.875rem;
229
+ }
230
+ .plan-badge {
231
+ padding: 0.125rem 0.5rem;
232
+ border: 1px solid var(--color-border);
233
+ border-radius: 999px;
234
+ color: var(--color-muted-foreground);
235
+ font-size: var(--kit-font-size-sm, 0.8125rem);
236
+ white-space: nowrap;
237
+ }
238
+ :global(.mode-menu) {
239
+ width: min(35rem, calc(100vw - 1rem));
240
+ padding: 0.375rem;
241
+ border-radius: 0.75rem;
242
+ }
243
+ :global(.mode-option) {
244
+ display: grid;
245
+ grid-template-columns: 1rem 7.5rem minmax(0, 1fr) 1rem 0.875rem;
246
+ align-items: center;
247
+ column-gap: 0.5rem;
248
+ min-height: 2.125rem;
249
+ padding: 0.375rem 0.5rem;
250
+ border-radius: 0.5rem;
251
+ font-size: var(--kit-font-size-sm, 0.8125rem);
252
+ }
253
+ :global(.mode-option[aria-current='true']) {
254
+ background: var(--color-muted);
255
+ }
256
+ :global(.mode-option > svg) {
257
+ color: var(--color-muted-foreground);
258
+ width: 0.875rem;
259
+ height: 0.875rem;
260
+ }
261
+ .mode-name {
262
+ white-space: nowrap;
263
+ }
264
+ .mode-description {
265
+ color: var(--color-muted-foreground);
266
+ font-size: var(--kit-font-size-xs, 0.75rem);
267
+ text-align: right;
268
+ line-height: 1.5;
269
+ }
270
+ .mode-notice,
271
+ .mode-check {
272
+ display: flex;
273
+ align-items: center;
274
+ justify-content: center;
275
+ color: var(--color-muted-foreground);
276
+ }
277
+ .mode-notice {
278
+ color: var(--color-warning, var(--color-muted-foreground));
279
+ }
280
+ .mode-notice :global(svg),
281
+ .mode-check :global(svg) {
282
+ display: block;
283
+ width: 0.8125rem;
284
+ height: 0.8125rem;
285
+ }
286
+ :global(.mode-danger),
287
+ :global(.mode-danger) :is(.mode-name, .mode-description, .mode-notice),
288
+ :global(.mode-option.mode-danger > svg) {
289
+ color: var(--color-destructive);
290
+ }
291
+ .mode-footer {
292
+ display: flex;
293
+ justify-content: space-between;
294
+ align-items: center;
295
+ gap: 0.75rem;
296
+ padding: 0.625rem 0.375rem 0.125rem;
297
+ color: var(--color-muted-foreground);
298
+ font-size: var(--kit-font-size-xs, 0.75rem);
299
+ }
300
+ .mode-keys {
301
+ display: flex;
302
+ align-items: center;
303
+ gap: 0.25rem;
304
+ }
305
+ .mode-keys kbd {
306
+ padding: 0 0.25rem;
307
+ border-radius: 0.25rem;
308
+ background: var(--color-muted);
309
+ font: inherit;
310
+ }
311
+ .mode-keys kbd:not(:first-child) {
312
+ margin-left: 0.375rem;
313
+ }
314
+ @media (max-width: 480px) {
315
+ :global(.mode-option) {
316
+ grid-template-columns: 1rem minmax(0, 1fr) 1rem 0.875rem;
317
+ row-gap: 0.125rem;
318
+ }
319
+ .mode-description {
320
+ grid-column: 2;
321
+ grid-row: 2;
322
+ text-align: left;
323
+ }
324
+ .mode-notice {
325
+ grid-column: 3;
326
+ grid-row: 1;
327
+ }
328
+ .mode-check {
329
+ grid-column: 4;
330
+ grid-row: 1;
331
+ }
332
+ }
333
+ .skills-control {
334
+ min-width: 0;
335
+ max-width: 100%;
336
+ }
337
+ .skills-control :global(div:first-child) {
338
+ flex-wrap: wrap;
339
+ min-width: 0;
340
+ }
341
+ .skills-control :global([data-slot='select-trigger']) {
342
+ width: auto;
343
+ max-width: 100%;
344
+ }
345
+ .search-status,
346
+ .draft-recovery {
347
+ margin: 0;
348
+ color: var(--color-muted-foreground);
349
+ font-size: var(--kit-font-size-sm, 0.8125rem);
350
+ }
351
+ .draft-recovery {
352
+ display: flex;
353
+ flex-wrap: wrap;
354
+ align-items: center;
355
+ gap: 0.5rem;
356
+ }
357
+ .history-list {
358
+ display: flex;
359
+ flex-direction: column;
360
+ gap: 0.25rem;
361
+ max-height: 40vh;
362
+ overflow-y: auto;
363
+ min-width: 0;
364
+ }
365
+ .history-list :global(button) {
366
+ justify-content: flex-start;
367
+ min-width: 0;
368
+ }
369
+ .history-list span {
370
+ min-width: 0;
371
+ overflow: hidden;
372
+ text-overflow: ellipsis;
373
+ white-space: nowrap;
374
+ }
375
+ :global(.reply-dialog) {
376
+ max-height: calc(100dvh - 2rem);
377
+ overflow-y: auto;
378
+ }
379
+ :global(.reply-dialog form),
380
+ :global(.reply-dialog [data-slot='field-group']) {
381
+ min-width: 0;
382
+ }
383
+ :global(.reply-dialog textarea) {
384
+ max-height: 45dvh;
385
+ overflow-y: auto;
386
+ }