@nextclaw/ui 0.14.4 → 0.15.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 (194) hide show
  1. package/CHANGELOG.md +54 -0
  2. package/dist/assets/api-DLtsiBKm.js +13 -0
  3. package/dist/assets/appearance-settings-page-CtkeYXux.js +1 -0
  4. package/dist/assets/book-open-BQwWBDKb.js +1 -0
  5. package/dist/assets/channels-list-page-Cv8o9Hxg.js +8 -0
  6. package/dist/assets/chat-page-BtA7H1Ea.js +1 -0
  7. package/dist/assets/{config-split-page-CRhlZ_pH.js → config-split-page-EidRBpP2.js} +1 -1
  8. package/dist/assets/confirm-dialog-iIJFFp2T.js +5 -0
  9. package/dist/assets/desktop-update-config-C6n_TB1r.js +1 -0
  10. package/dist/assets/{dist-CikkhOlq.js → dist-CBxWOazz.js} +1 -1
  11. package/dist/assets/{dist-PVA_xL1D.js → dist-D2eZC3OR.js} +1 -1
  12. package/dist/assets/doc-browser-B76XOXmW.js +1 -0
  13. package/dist/assets/doc-browser-DBnj9UMB.js +1 -0
  14. package/dist/assets/{doc-browser-context-MTw4EvKd.js → doc-browser-context-Sv-044Cl.js} +1 -1
  15. package/dist/assets/{ellipsis-y6vDtq4M.js → ellipsis-2uzhypw5.js} +1 -1
  16. package/dist/assets/es2015-DhQo_oS6.js +41 -0
  17. package/dist/assets/{external-link-DVJIQf_G.js → external-link-CM5dnUI6.js} +1 -1
  18. package/dist/assets/host-capabilities-9bB_998Z.js +1 -0
  19. package/dist/assets/i18n-provider-di1waTGX.js +1 -0
  20. package/dist/assets/index-CBRP-7-a.css +1 -0
  21. package/dist/assets/index-Z1fYpbNd.js +104 -0
  22. package/dist/assets/loader-circle-BjmN5DeJ.js +1 -0
  23. package/dist/assets/mcp-marketplace-page-C_MVQUbT.js +9 -0
  24. package/dist/assets/mcp-marketplace-page-CoZIiD6G.js +1 -0
  25. package/dist/assets/model-config-page-Cdr9P6TQ.js +1 -0
  26. package/dist/assets/plus-3ztRZD_l.js +1 -0
  27. package/dist/assets/provider-scoped-model-input-g1WkGiJ8.js +1 -0
  28. package/dist/assets/providers-config-page-CWlO7J4A.js +1 -0
  29. package/dist/assets/{react-VNqT5Zp7.js → react-DjpzoZXB.js} +1 -1
  30. package/dist/assets/refresh-cw-DaTv3zxE.js +1 -0
  31. package/dist/assets/remote-CKWZfVVB.js +1 -0
  32. package/dist/assets/rotate-cw-CHcaRUDz.js +1 -0
  33. package/dist/assets/runtime-config-page-CfTqh1nv.js +1 -0
  34. package/dist/assets/{save-BOJ477H-.js → save-BZof1uie.js} +1 -1
  35. package/dist/assets/{search-BEti5beA.js → search-MxAarS_g.js} +1 -1
  36. package/dist/assets/search-config-page-Dm8daYny.js +1 -0
  37. package/dist/assets/{secrets-config-page--IzrIOid.js → secrets-config-page-D8AbcR05.js} +2 -2
  38. package/dist/assets/security-config-Ds0LsJmo.js +1 -0
  39. package/dist/assets/select-D7GcNP0z.js +1 -0
  40. package/dist/assets/setting-row-CuozlnJd.js +1 -0
  41. package/dist/assets/side-dock-BcLau5S_.js +3 -0
  42. package/dist/assets/skeleton-shfmXuYp.js +1 -0
  43. package/dist/assets/switch-C1BWMU5c.js +1 -0
  44. package/dist/assets/tag-chip-DCUrQUCP.js +1 -0
  45. package/dist/assets/tooltip-DfAHHA76.js +1 -0
  46. package/dist/assets/use-config-DAdbT5QJ.js +1 -0
  47. package/dist/assets/use-confirm-dialog-eWcJ6V-s.js +1 -0
  48. package/dist/assets/x-DqL1mYLC.js +1 -0
  49. package/dist/index.html +53 -17
  50. package/index.html +25 -2
  51. package/package.json +9 -9
  52. package/src/app/components/layout/__tests__/app-layout.test.tsx +27 -0
  53. package/src/app/components/layout/__tests__/settings-entry-page.test.tsx +9 -1
  54. package/src/app/components/layout/__tests__/sidebar.layout.test.tsx +6 -3
  55. package/src/app/components/layout/app-layout.tsx +10 -3
  56. package/src/app/components/layout/sidebar-items.tsx +8 -8
  57. package/src/app/components/layout/sidebar-rail.styles.ts +4 -2
  58. package/src/app/components/layout/sidebar.tsx +21 -28
  59. package/src/app/configs/app-navigation.config.ts +11 -5
  60. package/src/app/index.tsx +8 -0
  61. package/src/app/managers/__tests__/viewport-layout.manager.test.ts +59 -0
  62. package/src/app/managers/viewport-layout.manager.ts +39 -0
  63. package/src/app/presenters/app.presenter.ts +25 -2
  64. package/src/app/styles/design-system.css +91 -4
  65. package/src/features/chat/components/conversation/__tests__/chat-conversation-content.test.tsx +86 -0
  66. package/src/features/chat/components/conversation/chat-conversation-content.tsx +47 -17
  67. package/src/features/chat/components/layout/__tests__/chat-sidebar-read-state.test.tsx +7 -0
  68. package/src/features/chat/components/layout/chat-sidebar-desktop-layout.tsx +9 -5
  69. package/src/features/chat/components/layout/chat-sidebar-utility-menu.tsx +5 -5
  70. package/src/features/chat/features/conversation/components/__tests__/session-conversation-area.test.tsx +51 -2
  71. package/src/features/chat/features/conversation/components/__tests__/session-conversation-input.streaming.test.tsx +170 -1
  72. package/src/features/chat/features/conversation/components/session-conversation-area.tsx +23 -1
  73. package/src/features/chat/features/conversation/components/session-conversation-input.tsx +24 -7
  74. package/src/features/chat/features/conversation/components/session-queued-input-rows.tsx +96 -0
  75. package/src/features/chat/features/conversation/hooks/__tests__/use-session-conversation-controller.test.tsx +181 -0
  76. package/src/features/chat/features/conversation/hooks/use-session-conversation-controller.ts +351 -89
  77. package/src/features/chat/features/input/hooks/__tests__/use-chat-input-surface-state.test.tsx +29 -4
  78. package/src/features/chat/features/input/hooks/use-chat-input-surface-state.ts +28 -3
  79. package/src/features/chat/features/input/input-surface-plugins/__tests__/slash-command-plugin.test.ts +108 -8
  80. package/src/features/chat/features/input/input-surface-plugins/panel-app-reference-plugin.utils.ts +50 -14
  81. package/src/features/chat/features/input/input-surface-plugins/slash-command-plugin.utils.ts +77 -6
  82. package/src/features/chat/features/message/components/__tests__/chat-inline-panel-app-card.test.tsx +21 -12
  83. package/src/features/chat/features/message/components/__tests__/chat-message-list.container.test.tsx +166 -0
  84. package/src/features/chat/features/message/components/chat-inline-panel-app-card.tsx +19 -11
  85. package/src/features/chat/features/message/components/chat-message-list.container.tsx +38 -64
  86. package/src/features/chat/features/message/utils/__tests__/chat-message-process-summary.utils.test.ts +59 -0
  87. package/src/features/chat/features/message/utils/__tests__/chat-message-show-content-tool-card.utils.test.ts +56 -1
  88. package/src/features/chat/features/message/utils/chat-inline-panel-app-card.utils.ts +0 -2
  89. package/src/features/chat/features/message/utils/chat-message-process-summary.utils.ts +80 -0
  90. package/src/features/chat/features/message/utils/chat-message-show-content-tool-card.utils.ts +12 -3
  91. package/src/features/chat/features/message/utils/chat-message-texts.utils.ts +60 -0
  92. package/src/features/chat/features/message/utils/chat-message.utils.ts +3 -0
  93. package/src/features/chat/features/ncp/hooks/__tests__/use-ncp-agent-runtime.test.tsx +39 -0
  94. package/src/features/chat/features/session/components/chat-sidebar-project-groups.tsx +2 -2
  95. package/src/features/chat/features/session/components/chat-sidebar-session-item.tsx +1 -1
  96. package/src/features/chat/features/session/components/session-header/__tests__/chat-session-header-actions.test.tsx +3 -1
  97. package/src/features/chat/features/session/components/session-header/chat-session-metadata-dialog.tsx +1 -1
  98. package/src/features/chat/features/workspace/components/__tests__/chat-session-workspace-file-preview.test.tsx +270 -115
  99. package/src/features/chat/features/workspace/components/chat-session-workspace-file-breadcrumb-browser.tsx +121 -0
  100. package/src/features/chat/features/workspace/components/chat-session-workspace-file-breadcrumbs.tsx +75 -20
  101. package/src/features/chat/features/workspace/components/chat-session-workspace-file-preview.tsx +70 -5
  102. package/src/features/chat/features/workspace/utils/chat-workspace-file-tab-persistence.utils.ts +83 -0
  103. package/src/features/chat/managers/__tests__/chat-thread.manager.test.ts +79 -1
  104. package/src/features/chat/managers/__tests__/chat-ui.manager.test.ts +2 -0
  105. package/src/features/chat/managers/chat-thread.manager.ts +9 -3
  106. package/src/features/chat/managers/chat-ui.manager.ts +5 -1
  107. package/src/features/chat/presenters/chat.presenter.ts +2 -1
  108. package/src/features/chat/stores/__tests__/chat-thread.store.test.ts +4 -0
  109. package/src/features/chat/stores/chat-thread.store.ts +6 -64
  110. package/src/features/chat/types/chat-message.types.ts +4 -0
  111. package/src/features/marketplace/components/__tests__/marketplace-page-detail.test.tsx +33 -26
  112. package/src/features/marketplace/components/__tests__/marketplace-page.test.tsx +1 -0
  113. package/src/features/marketplace/components/curated-shelves/__tests__/marketplace-curated-scene-route.test.tsx +1 -0
  114. package/src/features/marketplace/components/detail-doc/__tests__/marketplace-detail-doc.test.tsx +115 -0
  115. package/src/features/marketplace/components/marketplace-detail-doc.tsx +441 -0
  116. package/src/features/marketplace/components/mcp/__tests__/mcp-marketplace-page.test.tsx +3 -3
  117. package/src/features/marketplace/components/mcp/mcp-marketplace-doc.ts +0 -60
  118. package/src/features/marketplace/components/mcp/mcp-marketplace-page.tsx +64 -29
  119. package/src/features/marketplace/hooks/use-marketplace-item-detail.ts +42 -31
  120. package/src/features/marketplace/index.ts +3 -0
  121. package/src/features/marketplace/stores/marketplace-detail-doc.store.ts +38 -0
  122. package/src/features/panel-apps/components/__tests__/panel-apps-list.test.tsx +32 -2
  123. package/src/features/pwa/managers/__tests__/pwa-shell-theme.manager.test.ts +11 -0
  124. package/src/features/pwa/managers/pwa-shell-theme.manager.ts +8 -3
  125. package/src/features/settings/pages/__tests__/appearance-settings-page.test.tsx +25 -0
  126. package/src/features/settings/pages/appearance-settings-page.tsx +40 -0
  127. package/src/features/side-dock/components/__tests__/side-dock.test.tsx +44 -2
  128. package/src/features/side-dock/components/side-dock.tsx +100 -13
  129. package/src/features/side-dock/configs/side-dock-built-in-items.config.ts +10 -0
  130. package/src/features/side-dock/managers/__tests__/side-dock.manager.test.ts +32 -2
  131. package/src/features/side-dock/managers/side-dock.manager.ts +17 -7
  132. package/src/features/side-dock/stores/side-dock.store.ts +9 -0
  133. package/src/features/side-dock/types/side-dock.types.ts +10 -3
  134. package/src/features/side-dock/utils/side-dock-item.utils.ts +15 -2
  135. package/src/index.css +501 -27
  136. package/src/platforms/desktop/components/desktop-window-chrome.tsx +1 -1
  137. package/src/shared/components/doc-browser/__tests__/doc-browser-context.test.tsx +30 -1
  138. package/src/shared/components/doc-browser/__tests__/doc-browser.test.tsx +206 -38
  139. package/src/shared/components/doc-browser/doc-browser-panel-parts.tsx +34 -11
  140. package/src/shared/components/doc-browser/doc-browser-renderer.types.ts +1 -1
  141. package/src/shared/components/doc-browser/doc-browser-tab-strip.tsx +23 -5
  142. package/src/shared/components/doc-browser/doc-browser.tsx +128 -75
  143. package/src/shared/components/doc-browser/managers/doc-browser.manager.ts +9 -1
  144. package/src/shared/components/doc-browser/utils/doc-browser-floating-panel.utils.ts +83 -0
  145. package/src/shared/components/ui/__tests__/dialog.test.tsx +27 -0
  146. package/src/shared/components/ui/actions/icon-action-button.tsx +14 -2
  147. package/src/shared/components/ui/dialog.tsx +2 -2
  148. package/src/shared/components/ui/popover.tsx +1 -1
  149. package/src/shared/components/ui/select.tsx +1 -1
  150. package/src/shared/components/ui/switch.tsx +4 -3
  151. package/src/shared/components/ui/tab-strip/__tests__/compact-tab-strip.test.tsx +54 -0
  152. package/src/shared/components/ui/tab-strip/compact-tab-strip.tsx +4 -5
  153. package/src/shared/components/ui/tooltip.tsx +1 -1
  154. package/src/shared/lib/api/utils/server-path.utils.ts +27 -1
  155. package/src/shared/lib/i18n/locales/en-US/chat.json +15 -6
  156. package/src/shared/lib/i18n/locales/en-US/core.json +2 -0
  157. package/src/shared/lib/i18n/locales/en-US/doc-browser.json +11 -0
  158. package/src/shared/lib/i18n/locales/en-US/marketplace.json +5 -0
  159. package/src/shared/lib/i18n/locales/zh-CN/chat.json +15 -6
  160. package/src/shared/lib/i18n/locales/zh-CN/core.json +2 -0
  161. package/src/shared/lib/i18n/locales/zh-CN/doc-browser.json +11 -0
  162. package/src/shared/lib/i18n/locales/zh-CN/marketplace.json +5 -0
  163. package/src/shared/lib/session-project/__tests__/workspace-file-breadcrumb.test.ts +14 -0
  164. package/src/shared/lib/session-project/index.ts +1 -1
  165. package/src/shared/lib/session-project/{workspace-file-breadcrumb.ts → workspace-file-breadcrumb.utils.ts} +62 -8
  166. package/src/shared/lib/theme/index.ts +51 -13
  167. package/dist/assets/api-BP_8IaxB.js +0 -13
  168. package/dist/assets/channels-list-page-DEh5Jjqx.js +0 -8
  169. package/dist/assets/chat-page-BRB0N5WW.js +0 -105
  170. package/dist/assets/confirm-dialog-DsivFJ4r.js +0 -5
  171. package/dist/assets/desktop-update-config-B0w9p2ep.js +0 -1
  172. package/dist/assets/doc-browser-BoNJ7-tE.js +0 -1
  173. package/dist/assets/doc-browser-CdJ_d4ik.js +0 -1
  174. package/dist/assets/index-BiE-K8-q.css +0 -1
  175. package/dist/assets/index-D9BAE_L_.js +0 -105
  176. package/dist/assets/mcp-marketplace-page-B1SZNY5m.js +0 -40
  177. package/dist/assets/mcp-marketplace-page-Cq_Tw42T.js +0 -1
  178. package/dist/assets/model-config-page-DotaTUHb.js +0 -1
  179. package/dist/assets/plus-BbZqquJe.js +0 -1
  180. package/dist/assets/provider-scoped-model-input-DsFRuWJH.js +0 -1
  181. package/dist/assets/providers-config-page-DW4tQSLN.js +0 -1
  182. package/dist/assets/remote-B8TiUfwW.js +0 -1
  183. package/dist/assets/rotate-cw-DjHDTkCv.js +0 -1
  184. package/dist/assets/runtime-config-page-S6ErRHR8.js +0 -1
  185. package/dist/assets/search-config-page-DGj5am03.js +0 -1
  186. package/dist/assets/select-hoj8dK4K.js +0 -41
  187. package/dist/assets/tag-chip-T8-h-die.js +0 -1
  188. package/dist/assets/use-config-CjRV2hwL.js +0 -1
  189. package/dist/assets/x-D9PXs_xP.js +0 -1
  190. package/src/features/marketplace/components/detail-doc/__tests__/marketplace-detail-doc.test.ts +0 -40
  191. package/src/features/marketplace/components/detail-doc/marketplace-detail-doc-renderer.ts +0 -201
  192. package/src/features/marketplace/components/marketplace-detail-doc.ts +0 -142
  193. /package/dist/assets/{config-hints-BkYBc7z0.js → config-hints-fGnUjDe9.js} +0 -0
  194. /package/dist/assets/{middleware-CkFT3R4v.js → middleware-BILWbJE4.js} +0 -0
package/src/index.css CHANGED
@@ -1,5 +1,5 @@
1
1
  /* Import Design System - must be first */
2
- @import './app/styles/design-system.css';
2
+ @import "./app/styles/design-system.css";
3
3
 
4
4
  @tailwind base;
5
5
  @tailwind components;
@@ -37,14 +37,15 @@
37
37
  }
38
38
 
39
39
  @layer utilities {
40
-
41
40
  .desktop-window-drag {
42
41
  -webkit-app-region: drag;
43
42
  app-region: drag;
44
43
  user-select: none;
45
44
  }
46
45
 
47
- .desktop-window-no-drag, .desktop-window-drag :is(button, a, input, select, textarea, [role='button'], [tabindex]) {
46
+ .desktop-window-no-drag,
47
+ .desktop-window-drag
48
+ :is(button, a, input, select, textarea, [role="button"], [tabindex]) {
48
49
  -webkit-app-region: no-drag;
49
50
  app-region: no-drag;
50
51
  }
@@ -118,47 +119,427 @@
118
119
  GLASSMORPHISM
119
120
  ======================================== */
120
121
  .glass {
121
- background: rgba(255, 255, 255, 0.85);
122
+ background: hsl(var(--card) / 0.85);
122
123
  backdrop-filter: blur(12px);
123
124
  -webkit-backdrop-filter: blur(12px);
124
- border: 1px solid rgba(255, 255, 255, 0.3);
125
+ border: 1px solid hsl(var(--border) / 0.6);
125
126
  }
126
127
 
127
128
  .glass-dark {
128
- background: rgba(0, 0, 0, 0.06);
129
+ background: hsl(var(--background-secondary) / 0.72);
129
130
  backdrop-filter: blur(12px);
130
131
  -webkit-backdrop-filter: blur(12px);
131
- border: 1px solid rgba(255, 255, 255, 0.1);
132
+ border: 1px solid hsl(var(--border) / 0.48);
132
133
  }
133
134
 
134
135
  /* ========================================
135
136
  SHADOWS
136
137
  ======================================== */
137
138
  .shadow-card {
138
- box-shadow: 0 1px 3px -1px rgba(30, 20, 10, 0.03), 0 1px 2px -1px rgba(30, 20, 10, 0.02);
139
+ box-shadow: var(--shadow-card);
139
140
  }
140
141
 
141
142
  .shadow-card-hover {
142
- box-shadow: 0 8px 20px -4px rgba(30, 20, 10, 0.06), 0 4px 8px -4px rgba(30, 20, 10, 0.03);
143
+ box-shadow: var(--shadow-card-hover);
143
144
  }
144
145
 
145
146
  .shadow-premium {
146
- box-shadow: 0 8px 24px -8px rgba(30, 20, 10, 0.06), 0 4px 10px -4px rgba(30, 20, 10, 0.03);
147
+ box-shadow: var(--shadow-lg);
147
148
  }
148
149
 
149
150
  .shadow-premium-hover {
150
- box-shadow: 0 16px 32px -12px rgba(30, 20, 10, 0.1), 0 6px 12px -4px rgba(30, 20, 10, 0.04);
151
+ box-shadow: var(--shadow-xl);
151
152
  }
152
153
 
153
154
  /* ========================================
154
155
  GRADIENTS
155
156
  ======================================== */
156
157
  .bg-gradient-hero {
157
- background: linear-gradient(180deg, hsl(var(--background)) 0%, hsl(var(--gray-50)) 100%);
158
+ background: linear-gradient(
159
+ 180deg,
160
+ hsl(var(--background)) 0%,
161
+ hsl(var(--gray-50)) 100%
162
+ );
158
163
  }
159
164
 
160
165
  .bg-gradient-subtle {
161
- background: linear-gradient(180deg, hsl(var(--gray-50)) 0%, hsl(var(--background)) 100%);
166
+ background: linear-gradient(
167
+ 180deg,
168
+ hsl(var(--gray-50)) 0%,
169
+ hsl(var(--background)) 100%
170
+ );
171
+ }
172
+
173
+ :root[data-theme-appearance="dark"] .bg-white {
174
+ background-color: hsl(var(--card));
175
+ }
176
+
177
+ :root[data-theme-appearance="dark"] .bg-white\/95 {
178
+ background-color: hsl(var(--card) / 0.95);
179
+ }
180
+
181
+ :root[data-theme-appearance="dark"] .bg-white\/90 {
182
+ background-color: hsl(var(--card) / 0.9);
183
+ }
184
+
185
+ :root[data-theme-appearance="dark"] .bg-white\/85 {
186
+ background-color: hsl(var(--card) / 0.85);
187
+ }
188
+
189
+ :root[data-theme-appearance="dark"] .bg-white\/80 {
190
+ background-color: hsl(var(--card) / 0.8);
191
+ }
192
+
193
+ :root[data-theme-appearance="dark"] .bg-white\/70 {
194
+ background-color: hsl(var(--card) / 0.7);
195
+ }
196
+
197
+ :root[data-theme-appearance="dark"] .hover\:bg-white:hover {
198
+ background-color: hsl(var(--accent));
199
+ }
200
+
201
+ :root[data-theme-appearance="dark"] .bg-gray-50 {
202
+ background-color: hsl(var(--background-secondary));
203
+ }
204
+
205
+ :root[data-theme-appearance="dark"] .bg-gray-50\/70 {
206
+ background-color: hsl(var(--background-secondary) / 0.7);
207
+ }
208
+
209
+ :root[data-theme-appearance="dark"] .bg-gray-50\/90 {
210
+ background-color: hsl(var(--background-secondary) / 0.9);
211
+ }
212
+
213
+ :root[data-theme-appearance="dark"] .bg-gray-50\/85 {
214
+ background-color: hsl(var(--background-secondary) / 0.85);
215
+ }
216
+
217
+ :root[data-theme-appearance="dark"] .bg-gray-50\/80 {
218
+ background-color: hsl(var(--background-secondary) / 0.8);
219
+ }
220
+
221
+ :root[data-theme-appearance="dark"] .bg-gray-50\/60 {
222
+ background-color: hsl(var(--background-secondary) / 0.6);
223
+ }
224
+
225
+ :root[data-theme-appearance="dark"] .bg-gray-50\/55 {
226
+ background-color: hsl(var(--background-secondary) / 0.55);
227
+ }
228
+
229
+ :root[data-theme-appearance="dark"] .bg-gray-50\/50 {
230
+ background-color: hsl(var(--background-secondary) / 0.5);
231
+ }
232
+
233
+ :root[data-theme-appearance="dark"] .hover\:bg-gray-50:hover,
234
+ :root[data-theme-appearance="dark"] .hover\:bg-gray-50\/70:hover,
235
+ :root[data-theme-appearance="dark"] .hover\:bg-gray-50\/60:hover,
236
+ :root[data-theme-appearance="dark"] .group:hover .group-hover\:bg-gray-50 {
237
+ background-color: hsl(var(--accent));
238
+ }
239
+
240
+ :root[data-theme-appearance="dark"] .bg-gray-100 {
241
+ background-color: hsl(var(--muted));
242
+ }
243
+
244
+ :root[data-theme-appearance="dark"] .bg-gray-100\/80 {
245
+ background-color: hsl(var(--muted) / 0.8);
246
+ }
247
+
248
+ :root[data-theme-appearance="dark"] .bg-gray-100\/70 {
249
+ background-color: hsl(var(--muted) / 0.7);
250
+ }
251
+
252
+ :root[data-theme-appearance="dark"] .bg-gray-100\/60 {
253
+ background-color: hsl(var(--muted) / 0.6);
254
+ }
255
+
256
+ :root[data-theme-appearance="dark"] .hover\:bg-gray-100:hover,
257
+ :root[data-theme-appearance="dark"] .hover\:bg-gray-100\/70:hover,
258
+ :root[data-theme-appearance="dark"] .group:hover .group-hover\:bg-gray-100 {
259
+ background-color: hsl(var(--accent));
260
+ }
261
+
262
+ :root[data-theme-appearance="dark"] .bg-gray-200 {
263
+ background-color: hsl(var(--accent));
264
+ }
265
+
266
+ :root[data-theme-appearance="dark"] .bg-gray-200\/60 {
267
+ background-color: hsl(var(--accent) / 0.72);
268
+ }
269
+
270
+ :root[data-theme-appearance="dark"] .bg-gray-200\/40 {
271
+ background-color: hsl(var(--accent) / 0.42);
272
+ }
273
+
274
+ :root[data-theme-appearance="dark"] .bg-gray-200\/70,
275
+ :root[data-theme-appearance="dark"] .bg-gray-200\/80 {
276
+ background-color: hsl(var(--accent));
277
+ }
278
+
279
+ :root[data-theme-appearance="dark"] .hover\:bg-gray-200:hover,
280
+ :root[data-theme-appearance="dark"] .hover\:bg-gray-200\/40:hover,
281
+ :root[data-theme-appearance="dark"] .hover\:bg-gray-200\/60:hover,
282
+ :root[data-theme-appearance="dark"] .hover\:bg-gray-200\/80:hover,
283
+ :root[data-theme-appearance="dark"] .active\:bg-gray-200\/80:active {
284
+ background-color: hsl(var(--accent));
285
+ }
286
+
287
+ :root[data-theme-appearance="dark"] .bg-gray-300 {
288
+ background-color: hsl(var(--foreground-muted));
289
+ }
290
+
291
+ :root[data-theme-appearance="dark"] .bg-gray-400 {
292
+ background-color: hsl(var(--foreground-tertiary));
293
+ }
294
+
295
+ :root[data-theme-appearance="dark"] .bg-primary-50\/45 {
296
+ background-color: hsl(var(--accent) / 0.76);
297
+ }
298
+
299
+ :root[data-theme-appearance="dark"] .bg-primary-50\/50 {
300
+ background-color: hsl(var(--accent) / 0.78);
301
+ }
302
+
303
+ :root[data-theme-appearance="dark"] .bg-primary-50\/70 {
304
+ background-color: hsl(var(--accent) / 0.82);
305
+ }
306
+
307
+ :root[data-theme-appearance="dark"] .from-primary-50\/70 {
308
+ --tw-gradient-from: hsl(var(--accent) / 0.78) var(--tw-gradient-from-position);
309
+ --tw-gradient-to: hsl(var(--accent) / 0) var(--tw-gradient-to-position);
310
+ --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to);
311
+ }
312
+
313
+ :root[data-theme-appearance="dark"] .via-white {
314
+ --tw-gradient-to: hsl(var(--background-secondary) / 0) var(--tw-gradient-to-position);
315
+ --tw-gradient-stops:
316
+ var(--tw-gradient-from), hsl(var(--background-secondary) / 0.88) var(--tw-gradient-via-position),
317
+ var(--tw-gradient-to);
318
+ }
319
+
320
+ :root[data-theme-appearance="dark"] .to-emerald-50\/60 {
321
+ --tw-gradient-to: hsl(var(--success) / 0.14) var(--tw-gradient-to-position);
322
+ }
323
+
324
+ :root[data-theme-appearance="dark"] .bg-emerald-50 {
325
+ background-color: hsl(var(--success) / 0.14);
326
+ }
327
+
328
+ :root[data-theme-appearance="dark"] .bg-emerald-50\/70 {
329
+ background-color: hsl(var(--success) / 0.1);
330
+ }
331
+
332
+ :root[data-theme-appearance="dark"] .bg-emerald-100,
333
+ :root[data-theme-appearance="dark"] .hover\:bg-emerald-100:hover {
334
+ background-color: hsl(var(--success) / 0.2);
335
+ }
336
+
337
+ :root[data-theme-appearance="dark"] .bg-rose-50 {
338
+ background-color: hsl(var(--destructive) / 0.14);
339
+ }
340
+
341
+ :root[data-theme-appearance="dark"] .bg-rose-50\/85 {
342
+ background-color: hsl(var(--destructive) / 0.12);
343
+ }
344
+
345
+ :root[data-theme-appearance="dark"] .bg-rose-100\/80,
346
+ :root[data-theme-appearance="dark"] .hover\:bg-rose-50:hover {
347
+ background-color: hsl(var(--destructive) / 0.2);
348
+ }
349
+
350
+ :root[data-theme-appearance="dark"] .bg-red-50,
351
+ :root[data-theme-appearance="dark"] .bg-red-50\/70,
352
+ :root[data-theme-appearance="dark"] .bg-red-50\/80 {
353
+ background-color: hsl(var(--destructive) / 0.14);
354
+ }
355
+
356
+ :root[data-theme-appearance="dark"] .hover\:bg-red-50:hover {
357
+ background-color: hsl(var(--destructive) / 0.2);
358
+ }
359
+
360
+ :root[data-theme-appearance="dark"] .bg-amber-50 {
361
+ background-color: hsl(var(--warning) / 0.14);
362
+ }
363
+
364
+ :root[data-theme-appearance="dark"] .bg-amber-50\/70,
365
+ :root[data-theme-appearance="dark"] .bg-orange-50 {
366
+ background-color: hsl(var(--warning) / 0.12);
367
+ }
368
+
369
+ :root[data-theme-appearance="dark"] .bg-amber-100,
370
+ :root[data-theme-appearance="dark"] .hover\:bg-amber-100:hover,
371
+ :root[data-theme-appearance="dark"] .group:hover .group-hover\:bg-amber-100 {
372
+ background-color: hsl(var(--warning) / 0.2);
373
+ }
374
+
375
+ :root[data-theme-appearance="dark"] .border-gray-100 {
376
+ border-color: hsl(var(--border) / 0.58);
377
+ }
378
+
379
+ :root[data-theme-appearance="dark"] .border-gray-200 {
380
+ border-color: hsl(var(--border));
381
+ }
382
+
383
+ :root[data-theme-appearance="dark"] .border-gray-200\/50 {
384
+ border-color: hsl(var(--border) / 0.5);
385
+ }
386
+
387
+ :root[data-theme-appearance="dark"] .border-gray-200\/60 {
388
+ border-color: hsl(var(--border) / 0.6);
389
+ }
390
+
391
+ :root[data-theme-appearance="dark"] .border-gray-200\/70 {
392
+ border-color: hsl(var(--border) / 0.7);
393
+ }
394
+
395
+ :root[data-theme-appearance="dark"] .border-gray-200\/80 {
396
+ border-color: hsl(var(--border) / 0.8);
397
+ }
398
+
399
+ :root[data-theme-appearance="dark"] .border-gray-300,
400
+ :root[data-theme-appearance="dark"] .hover\:border-gray-300:hover {
401
+ border-color: hsl(var(--border-hover));
402
+ }
403
+
404
+ :root[data-theme-appearance="dark"] .border-gray-400 {
405
+ border-color: hsl(var(--foreground-muted));
406
+ }
407
+
408
+ :root[data-theme-appearance="dark"] .border-emerald-200,
409
+ :root[data-theme-appearance="dark"] .ring-emerald-100 {
410
+ border-color: hsl(var(--success) / 0.34);
411
+ --tw-ring-color: hsl(var(--success) / 0.24);
412
+ }
413
+
414
+ :root[data-theme-appearance="dark"] .border-rose-200,
415
+ :root[data-theme-appearance="dark"] .border-rose-200\/80,
416
+ :root[data-theme-appearance="dark"] .hover\:border-rose-200:hover,
417
+ :root[data-theme-appearance="dark"] .hover\:border-rose-300:hover {
418
+ border-color: hsl(var(--destructive) / 0.36);
419
+ }
420
+
421
+ :root[data-theme-appearance="dark"] .border-red-100,
422
+ :root[data-theme-appearance="dark"] .border-red-200,
423
+ :root[data-theme-appearance="dark"] .border-red-200\/80,
424
+ :root[data-theme-appearance="dark"] .ring-red-100 {
425
+ border-color: hsl(var(--destructive) / 0.36);
426
+ --tw-ring-color: hsl(var(--destructive) / 0.24);
427
+ }
428
+
429
+ :root[data-theme-appearance="dark"] .border-amber-200,
430
+ :root[data-theme-appearance="dark"] .border-amber-200\/70,
431
+ :root[data-theme-appearance="dark"] .ring-amber-100 {
432
+ border-color: hsl(var(--warning) / 0.36);
433
+ --tw-ring-color: hsl(var(--warning) / 0.22);
434
+ }
435
+
436
+ :root[data-theme-appearance="dark"] .text-gray-950 {
437
+ color: hsl(var(--foreground));
438
+ }
439
+
440
+ :root[data-theme-appearance="dark"] .text-gray-900,
441
+ :root[data-theme-appearance="dark"] .group:hover .group-hover\:text-gray-900,
442
+ :root[data-theme-appearance="dark"] .hover\:text-gray-900:hover {
443
+ color: hsl(var(--foreground));
444
+ }
445
+
446
+ :root[data-theme-appearance="dark"] .text-gray-800,
447
+ :root[data-theme-appearance="dark"] .hover\:text-gray-800:hover {
448
+ color: hsl(var(--foreground-secondary));
449
+ }
450
+
451
+ :root[data-theme-appearance="dark"] .text-gray-700,
452
+ :root[data-theme-appearance="dark"] .hover\:text-gray-700:hover,
453
+ :root[data-theme-appearance="dark"] .group:hover .group-hover\:text-gray-700 {
454
+ color: hsl(var(--foreground-secondary));
455
+ }
456
+
457
+ :root[data-theme-appearance="dark"] .text-gray-600,
458
+ :root[data-theme-appearance="dark"] .hover\:text-gray-600:hover {
459
+ color: hsl(var(--foreground-tertiary));
460
+ }
461
+
462
+ :root[data-theme-appearance="dark"] .text-gray-500,
463
+ :root[data-theme-appearance="dark"] .hover\:text-gray-500:hover,
464
+ :root[data-theme-appearance="dark"] .group:hover .group-hover\:text-gray-500 {
465
+ color: hsl(var(--muted-foreground));
466
+ }
467
+
468
+ :root[data-theme-appearance="dark"] .text-gray-300 {
469
+ color: hsl(var(--foreground-tertiary));
470
+ }
471
+
472
+ :root[data-theme-appearance="dark"] .text-gray-400 {
473
+ color: hsl(var(--muted-foreground));
474
+ }
475
+
476
+ :root[data-theme-appearance="dark"] .text-muted-foreground\/60 {
477
+ color: hsl(var(--muted-foreground) / 0.82);
478
+ }
479
+
480
+ :root[data-theme-appearance="dark"] .text-muted-foreground\/65 {
481
+ color: hsl(var(--muted-foreground));
482
+ }
483
+
484
+ :root[data-theme-appearance="dark"] .text-muted-foreground\/70 {
485
+ color: hsl(var(--muted-foreground) / 0.88);
486
+ }
487
+
488
+ :root[data-theme-appearance="dark"] .text-muted-foreground\/75 {
489
+ color: hsl(var(--muted-foreground) / 0.92);
490
+ }
491
+
492
+ :root[data-theme-appearance="dark"] .text-emerald-600,
493
+ :root[data-theme-appearance="dark"] .text-emerald-700,
494
+ :root[data-theme-appearance="dark"] .text-emerald-900,
495
+ :root[data-theme-appearance="dark"] .text-emerald-950 {
496
+ color: hsl(var(--success));
497
+ }
498
+
499
+ :root[data-theme-appearance="dark"] .text-rose-600,
500
+ :root[data-theme-appearance="dark"] .text-rose-700,
501
+ :root[data-theme-appearance="dark"] .hover\:text-rose-600:hover {
502
+ color: hsl(var(--destructive));
503
+ }
504
+
505
+ :root[data-theme-appearance="dark"] .text-rose-950,
506
+ :root[data-theme-appearance="dark"] .text-rose-950\/85 {
507
+ color: hsl(var(--destructive) / 0.9);
508
+ }
509
+
510
+ :root[data-theme-appearance="dark"] .text-red-500,
511
+ :root[data-theme-appearance="dark"] .text-red-600,
512
+ :root[data-theme-appearance="dark"] .text-red-700,
513
+ :root[data-theme-appearance="dark"] .text-red-800,
514
+ :root[data-theme-appearance="dark"] .hover\:text-red-500:hover {
515
+ color: hsl(var(--destructive));
516
+ }
517
+
518
+ :root[data-theme-appearance="dark"] .text-amber-600,
519
+ :root[data-theme-appearance="dark"] .text-amber-700,
520
+ :root[data-theme-appearance="dark"] .text-amber-800,
521
+ :root[data-theme-appearance="dark"] .text-amber-900,
522
+ :root[data-theme-appearance="dark"] .text-amber-950,
523
+ :root[data-theme-appearance="dark"] .text-orange-400 {
524
+ color: hsl(var(--warning));
525
+ }
526
+
527
+ :root[data-theme-appearance="dark"] .switch-track[data-state="unchecked"] {
528
+ background-color: hsl(var(--input));
529
+ border-color: hsl(var(--border-hover));
530
+ }
531
+
532
+ :root[data-theme-appearance="dark"] .switch-track[data-state="unchecked"]:hover {
533
+ background-color: hsl(var(--accent));
534
+ }
535
+
536
+ :root[data-theme-appearance="dark"] .switch-track[data-state="unchecked"] .switch-thumb {
537
+ background-color: hsl(var(--foreground-secondary));
538
+ box-shadow: 0 1px 3px rgb(0 0 0 / 0.45);
539
+ }
540
+
541
+ :root[data-theme-appearance="dark"] .switch-track[data-state="checked"] .switch-thumb {
542
+ background-color: hsl(var(--primary-foreground));
162
543
  }
163
544
 
164
545
  /* ========================================
@@ -211,7 +592,6 @@
211
592
  }
212
593
 
213
594
  @keyframes pulse-soft {
214
-
215
595
  0%,
216
596
  100% {
217
597
  opacity: 1;
@@ -295,6 +675,32 @@
295
675
  --md-table-head-bg: rgba(191, 219, 254, 0.16);
296
676
  }
297
677
 
678
+ :root[data-theme-appearance="dark"] .chat-markdown-assistant {
679
+ --md-text: hsl(var(--foreground));
680
+ --md-muted: hsl(var(--foreground-tertiary));
681
+ --md-border: hsl(var(--border-hover) / 0.76);
682
+ --md-link: hsl(var(--primary-hover));
683
+ --md-inline-code-bg: hsl(var(--muted) / 0.9);
684
+ --md-inline-code-color: hsl(var(--foreground));
685
+ --md-blockquote-border: hsl(var(--primary) / 0.58);
686
+ --md-blockquote-bg: hsl(var(--accent) / 0.56);
687
+ --md-code-surface: hsl(220 18% 7%);
688
+ --md-code-toolbar-bg: hsl(var(--background-secondary) / 0.9);
689
+ --md-code-toolbar-border: hsl(var(--border-hover) / 0.74);
690
+ --md-code-text: #dfe7f1;
691
+ --md-code-muted: #8fa0b5;
692
+ --md-code-keyword: #c8a7ff;
693
+ --md-code-title: #8ab4ff;
694
+ --md-code-string: #8fd9a8;
695
+ --md-code-number: #f6c177;
696
+ --md-code-comment: #7d8ea3;
697
+ --md-code-attr: #7dd3fc;
698
+ --md-code-meta: #f0abfc;
699
+ --md-code-deletion: #ff9aa2;
700
+ --md-code-addition: #86efac;
701
+ --md-table-head-bg: hsl(var(--muted) / 0.84);
702
+ }
703
+
298
704
  .chat-markdown > * + * {
299
705
  margin-top: 0.72rem;
300
706
  }
@@ -371,7 +777,7 @@
371
777
  }
372
778
 
373
779
  .chat-markdown li::marker {
374
- color: rgba(51, 65, 85, 0.9);
780
+ color: var(--md-muted);
375
781
  font-weight: 600;
376
782
  }
377
783
 
@@ -428,7 +834,9 @@
428
834
  }
429
835
 
430
836
  .chat-markdown code {
431
- font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
837
+ font-family:
838
+ ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono",
839
+ "Courier New", monospace;
432
840
  font-size: 0.82rem;
433
841
  }
434
842
 
@@ -484,7 +892,9 @@
484
892
  padding: 0.18rem 0.36rem;
485
893
  background: transparent;
486
894
  cursor: pointer;
487
- transition: background-color 0.15s ease, border-color 0.15s ease;
895
+ transition:
896
+ background-color 0.15s ease,
897
+ border-color 0.15s ease;
488
898
  }
489
899
 
490
900
  .chat-codeblock-copy:hover {
@@ -511,67 +921,131 @@
511
921
  tab-size: 2;
512
922
  }
513
923
 
924
+ .chat-file-code-syntax {
925
+ --md-code-text: #111827;
926
+ --md-code-muted: #64748b;
927
+ --md-code-keyword: #7c3aed;
928
+ --md-code-title: #2563eb;
929
+ --md-code-string: #047857;
930
+ --md-code-number: #b45309;
931
+ --md-code-comment: #64748b;
932
+ --md-code-attr: #0891b2;
933
+ --md-code-meta: #a21caf;
934
+ --md-code-deletion: #be123c;
935
+ --md-code-addition: #047857;
936
+ color: var(--md-code-text);
937
+ font-variant-ligatures: none;
938
+ tab-size: 2;
939
+ }
940
+
941
+ :root[data-theme-appearance="dark"] .chat-file-code-syntax {
942
+ --md-code-text: #dfe7f1;
943
+ --md-code-muted: #8fa0b5;
944
+ --md-code-keyword: #c8a7ff;
945
+ --md-code-title: #8ab4ff;
946
+ --md-code-string: #8fd9a8;
947
+ --md-code-number: #f6c177;
948
+ --md-code-comment: #7d8ea3;
949
+ --md-code-attr: #7dd3fc;
950
+ --md-code-meta: #f0abfc;
951
+ --md-code-deletion: #ff9aa2;
952
+ --md-code-addition: #86efac;
953
+ }
954
+
514
955
  .chat-codeblock .hljs-keyword,
956
+ .chat-file-code-syntax .hljs-keyword,
515
957
  .chat-codeblock .hljs-built_in,
958
+ .chat-file-code-syntax .hljs-built_in,
516
959
  .chat-codeblock .hljs-type,
960
+ .chat-file-code-syntax .hljs-type,
517
961
  .chat-codeblock .hljs-literal,
518
- .chat-codeblock .hljs-selector-tag {
962
+ .chat-file-code-syntax .hljs-literal,
963
+ .chat-codeblock .hljs-selector-tag,
964
+ .chat-file-code-syntax .hljs-selector-tag {
519
965
  color: var(--md-code-keyword);
520
966
  }
521
967
 
522
968
  .chat-codeblock .hljs-title,
969
+ .chat-file-code-syntax .hljs-title,
523
970
  .chat-codeblock .hljs-title.function_,
971
+ .chat-file-code-syntax .hljs-title.function_,
524
972
  .chat-codeblock .hljs-title.class_,
973
+ .chat-file-code-syntax .hljs-title.class_,
525
974
  .chat-codeblock .hljs-section,
526
- .chat-codeblock .hljs-selector-id {
975
+ .chat-file-code-syntax .hljs-section,
976
+ .chat-codeblock .hljs-selector-id,
977
+ .chat-file-code-syntax .hljs-selector-id {
527
978
  color: var(--md-code-title);
528
979
  }
529
980
 
530
981
  .chat-codeblock .hljs-string,
982
+ .chat-file-code-syntax .hljs-string,
531
983
  .chat-codeblock .hljs-regexp,
984
+ .chat-file-code-syntax .hljs-regexp,
532
985
  .chat-codeblock .hljs-symbol,
533
- .chat-codeblock .hljs-bullet {
986
+ .chat-file-code-syntax .hljs-symbol,
987
+ .chat-codeblock .hljs-bullet,
988
+ .chat-file-code-syntax .hljs-bullet {
534
989
  color: var(--md-code-string);
535
990
  }
536
991
 
537
992
  .chat-codeblock .hljs-number,
993
+ .chat-file-code-syntax .hljs-number,
538
994
  .chat-codeblock .hljs-variable,
995
+ .chat-file-code-syntax .hljs-variable,
539
996
  .chat-codeblock .hljs-template-variable,
540
- .chat-codeblock .hljs-params {
997
+ .chat-file-code-syntax .hljs-template-variable,
998
+ .chat-codeblock .hljs-params,
999
+ .chat-file-code-syntax .hljs-params {
541
1000
  color: var(--md-code-number);
542
1001
  }
543
1002
 
544
1003
  .chat-codeblock .hljs-comment,
545
- .chat-codeblock .hljs-quote {
1004
+ .chat-file-code-syntax .hljs-comment,
1005
+ .chat-codeblock .hljs-quote,
1006
+ .chat-file-code-syntax .hljs-quote {
546
1007
  color: var(--md-code-comment);
547
1008
  font-style: italic;
548
1009
  }
549
1010
 
550
1011
  .chat-codeblock .hljs-attr,
1012
+ .chat-file-code-syntax .hljs-attr,
551
1013
  .chat-codeblock .hljs-attribute,
1014
+ .chat-file-code-syntax .hljs-attribute,
552
1015
  .chat-codeblock .hljs-property,
1016
+ .chat-file-code-syntax .hljs-property,
553
1017
  .chat-codeblock .hljs-name,
554
- .chat-codeblock .hljs-selector-class {
1018
+ .chat-file-code-syntax .hljs-name,
1019
+ .chat-codeblock .hljs-selector-class,
1020
+ .chat-file-code-syntax .hljs-selector-class {
555
1021
  color: var(--md-code-attr);
556
1022
  }
557
1023
 
558
1024
  .chat-codeblock .hljs-meta,
1025
+ .chat-file-code-syntax .hljs-meta,
559
1026
  .chat-codeblock .hljs-doctag,
560
- .chat-codeblock .hljs-tag {
1027
+ .chat-file-code-syntax .hljs-doctag,
1028
+ .chat-codeblock .hljs-tag,
1029
+ .chat-file-code-syntax .hljs-tag {
561
1030
  color: var(--md-code-meta);
562
1031
  }
563
1032
 
564
1033
  .chat-codeblock .hljs-subst,
1034
+ .chat-file-code-syntax .hljs-subst,
565
1035
  .chat-codeblock .hljs-punctuation,
566
- .chat-codeblock .hljs-operator {
1036
+ .chat-file-code-syntax .hljs-punctuation,
1037
+ .chat-codeblock .hljs-operator,
1038
+ .chat-file-code-syntax .hljs-operator {
567
1039
  color: var(--md-code-muted);
568
1040
  }
569
1041
 
570
- .chat-codeblock .hljs-deletion {
1042
+ .chat-codeblock .hljs-deletion,
1043
+ .chat-file-code-syntax .hljs-deletion {
571
1044
  color: var(--md-code-deletion);
572
1045
  }
573
1046
 
574
- .chat-codeblock .hljs-addition {
1047
+ .chat-codeblock .hljs-addition,
1048
+ .chat-file-code-syntax .hljs-addition {
575
1049
  color: var(--md-code-addition);
576
1050
  }
577
1051
 
@@ -30,7 +30,7 @@ export function DesktopWindowChrome({
30
30
 
31
31
  return (
32
32
  <header
33
- className="desktop-window-drag relative flex h-[var(--desktop-titlebar-height)] shrink-0 bg-secondary after:absolute after:bottom-0 after:left-[var(--desktop-sidebar-width)] after:right-0 after:border-b after:border-[#ebe7dc]/80"
33
+ className="desktop-window-drag relative flex h-[var(--desktop-titlebar-height)] shrink-0 bg-secondary after:absolute after:bottom-0 after:left-[var(--desktop-sidebar-width)] after:right-0 after:border-b after:border-border/80"
34
34
  data-testid="desktop-window-chrome"
35
35
  >
36
36
  <div