@mooncompany/uplink-chat 0.5.2 → 0.32.3

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 (215) hide show
  1. package/LICENSE +14 -1
  2. package/README.md +105 -3
  3. package/bin/uplink.js +3 -0
  4. package/middleware/error-handler.js +1 -0
  5. package/package.json +89 -5
  6. package/public/css/agents.1fd7567a.css +1499 -0
  7. package/public/css/app.bc7e7484.css +2819 -0
  8. package/public/css/artifacts.css +488 -0
  9. package/public/css/commands.css +77 -0
  10. package/public/css/connection.css +131 -0
  11. package/public/css/cron-panel.css +364 -0
  12. package/public/css/dashboard.css +233 -0
  13. package/public/css/developer.css +342 -0
  14. package/public/css/files.css +123 -0
  15. package/public/css/markdown.css +156 -0
  16. package/public/css/message-actions.css +285 -0
  17. package/public/css/mobile.css +614 -0
  18. package/public/css/panels-unified.css +485 -0
  19. package/public/css/premium.css +415 -0
  20. package/public/css/realtime.css +189 -0
  21. package/public/css/satellites.7fa72088.css +632 -0
  22. package/public/css/settings-redesign.css +1322 -0
  23. package/public/css/shortcuts.css +185 -0
  24. package/public/css/split-view.4bc23474.css +858 -0
  25. package/public/css/themes.css +387 -0
  26. package/public/css/timestamps.css +54 -0
  27. package/public/css/variables.css +81 -0
  28. package/public/dist/bundle.493af136.js +1 -0
  29. package/public/favicon-256.png +0 -0
  30. package/public/icon-192.png +0 -0
  31. package/public/icon-512.png +0 -0
  32. package/public/img/icons/icon-alert-triangle.svg +17 -0
  33. package/public/img/icons/icon-brain.svg +20 -0
  34. package/public/img/icons/icon-brand-python.svg +19 -0
  35. package/public/img/icons/icon-camera.svg +16 -0
  36. package/public/img/icons/icon-chart-bar.svg +18 -0
  37. package/public/img/icons/icon-check.svg +15 -0
  38. package/public/img/icons/icon-circle-check.svg +16 -0
  39. package/public/img/icons/icon-clipboard.svg +16 -0
  40. package/public/img/icons/icon-cloud.svg +15 -0
  41. package/public/img/icons/icon-confetti.svg +24 -0
  42. package/public/img/icons/icon-device-mobile.svg +17 -0
  43. package/public/img/icons/icon-diamond.svg +16 -0
  44. package/public/img/icons/icon-file-text.svg +19 -0
  45. package/public/img/icons/icon-file-type-css.svg +19 -0
  46. package/public/img/icons/icon-file-type-csv.svg +19 -0
  47. package/public/img/icons/icon-file-type-doc.svg +19 -0
  48. package/public/img/icons/icon-file-type-html.svg +23 -0
  49. package/public/img/icons/icon-file-type-js.svg +18 -0
  50. package/public/img/icons/icon-file-type-pdf.svg +20 -0
  51. package/public/img/icons/icon-file-zip.svg +22 -0
  52. package/public/img/icons/icon-file.svg +16 -0
  53. package/public/img/icons/icon-folder.svg +15 -0
  54. package/public/img/icons/icon-headphones.svg +17 -0
  55. package/public/img/icons/icon-hourglass.svg +18 -0
  56. package/public/img/icons/icon-keyboard.svg +22 -0
  57. package/public/img/icons/icon-link.svg +17 -0
  58. package/public/img/icons/icon-lock-open.svg +17 -0
  59. package/public/img/icons/icon-lock.svg +17 -0
  60. package/public/img/icons/icon-mail.svg +16 -0
  61. package/public/img/icons/icon-message-dots.svg +18 -0
  62. package/public/img/icons/icon-microphone-2.svg +16 -0
  63. package/public/img/icons/icon-microphone.svg +18 -0
  64. package/public/img/icons/icon-movie.svg +22 -0
  65. package/public/img/icons/icon-music.svg +18 -0
  66. package/public/img/icons/icon-palette.svg +18 -0
  67. package/public/img/icons/icon-paperclip.svg +15 -0
  68. package/public/img/icons/icon-pencil.svg +16 -0
  69. package/public/img/icons/icon-photo.svg +18 -0
  70. package/public/img/icons/icon-presentation.svg +19 -0
  71. package/public/img/icons/icon-robot.svg +23 -0
  72. package/public/img/icons/icon-rocket.svg +17 -0
  73. package/public/img/icons/icon-satellite.svg +20 -0
  74. package/public/img/icons/icon-settings.svg +16 -0
  75. package/public/img/icons/icon-shield-lock.svg +17 -0
  76. package/public/img/icons/icon-sparkles.svg +15 -0
  77. package/public/img/icons/icon-star-filled.svg +11 -0
  78. package/public/img/icons/icon-tool.svg +15 -0
  79. package/public/img/icons/icon-trash.svg +19 -0
  80. package/public/img/icons/icon-volume.svg +17 -0
  81. package/public/img/icons/icon-world.svg +19 -0
  82. package/public/img/icons/icon-x.svg +16 -0
  83. package/public/img/logo.svg +13 -0
  84. package/public/img/wordmark.svg +35 -0
  85. package/public/index.html +1195 -0
  86. package/public/js/agents-data.js +1 -0
  87. package/public/js/agents-ui.js +1 -0
  88. package/public/js/agents.js +1 -0
  89. package/public/js/app.js +1 -0
  90. package/public/js/appearance-settings.js +1 -0
  91. package/public/js/artifacts.js +1 -0
  92. package/public/js/audio-pcm-processor.js +1 -0
  93. package/public/js/audio-queue.js +1 -0
  94. package/public/js/bootstrap.js +1 -0
  95. package/public/js/chat.js +1 -0
  96. package/public/js/commands.js +1 -0
  97. package/public/js/connection-api.js +1 -0
  98. package/public/js/connection.js +1 -0
  99. package/public/js/context-tracker.js +1 -0
  100. package/public/js/core.js +1 -0
  101. package/public/js/cron-panel.js +1 -0
  102. package/public/js/dashboard.js +1 -0
  103. package/public/js/developer.js +1 -0
  104. package/public/js/encryption.js +1 -0
  105. package/public/js/errors.js +1 -0
  106. package/public/js/event-bus.js +1 -0
  107. package/public/js/fetch-utils.js +1 -0
  108. package/public/js/file-handler.js +1 -0
  109. package/public/js/files.js +1 -0
  110. package/public/js/gateway-chat.js +1 -0
  111. package/public/js/logger.js +1 -0
  112. package/public/js/markdown.js +1 -0
  113. package/public/js/message-actions.js +1 -0
  114. package/public/js/message-renderer.js +1 -0
  115. package/public/js/missed-messages.js +1 -0
  116. package/public/js/mobile-debug.js +1 -0
  117. package/public/js/notifications.js +1 -0
  118. package/public/js/offline-queue.js +1 -0
  119. package/public/js/onboarding.js +1 -0
  120. package/public/js/panels.js +1 -0
  121. package/public/js/premium.js +1 -0
  122. package/public/js/primary-header.js +1 -0
  123. package/public/js/realtime-voice.js +1 -0
  124. package/public/js/satellite-sync.js +1 -0
  125. package/public/js/satellite-ui.js +1 -0
  126. package/public/js/satellites.js +1 -0
  127. package/public/js/settings.js +1 -0
  128. package/public/js/shortcuts.js +1 -0
  129. package/public/js/split-chat.js +1 -0
  130. package/public/js/split-resize.js +1 -0
  131. package/public/js/splitview.js +1 -0
  132. package/public/js/storage.js +1 -0
  133. package/public/js/streaming-handler.js +1 -0
  134. package/public/js/stt-settings.js +1 -0
  135. package/public/js/themes.js +1 -0
  136. package/public/js/timestamps.js +1 -0
  137. package/public/js/tts-settings.js +1 -0
  138. package/public/js/ui.js +1 -0
  139. package/public/js/update-notifier.js +1 -0
  140. package/public/js/utils/constants.js +1 -0
  141. package/public/js/utils/icons.js +1 -0
  142. package/public/js/utils/sanitize.js +1 -0
  143. package/public/js/utils/sse-parser.js +1 -0
  144. package/public/js/vad.js +1 -0
  145. package/public/js/vendor/dompurify.min.js +2 -0
  146. package/public/js/voice-settings-v2.js +1 -0
  147. package/public/js/voice.js +1 -0
  148. package/public/manifest.json +66 -0
  149. package/public/moon_texture.jpg +0 -0
  150. package/public/sw.js +1 -0
  151. package/public/three.min.js +6 -0
  152. package/public/u-icon.png +0 -0
  153. package/server/channel.js +1 -0
  154. package/server/chat.js +1 -0
  155. package/server/config-store.js +1 -0
  156. package/server/config.js +1 -0
  157. package/server/context.js +1 -0
  158. package/server/gateway-api-proxy.js +1 -0
  159. package/server/gateway-commands.js +1 -0
  160. package/server/gateway-proxy.js +1 -0
  161. package/server/index.js +1 -0
  162. package/server/logger.js +1 -0
  163. package/server/message-store.js +1 -0
  164. package/server/middleware/auth.js +1 -0
  165. package/server/middleware.js +1 -0
  166. package/server/openclaw-discover.js +1 -0
  167. package/server/premium/index.js +1 -0
  168. package/server/premium/license.js +1 -0
  169. package/server/realtime/bridge.js +1 -0
  170. package/server/realtime/index.js +1 -0
  171. package/server/realtime/tts-stream.js +1 -0
  172. package/server/routes/agents.js +1 -0
  173. package/server/routes/artifacts.js +1 -0
  174. package/server/routes/chat.js +1 -0
  175. package/server/routes/config-settings.js +1 -0
  176. package/server/routes/config.js +1 -0
  177. package/server/routes/cron.js +1 -0
  178. package/server/routes/files.js +1 -0
  179. package/server/routes/index.js +1 -0
  180. package/server/routes/media.js +1 -0
  181. package/server/routes/missed-messages.js +1 -0
  182. package/server/routes/premium.js +1 -0
  183. package/server/routes/push.js +1 -0
  184. package/server/routes/satellite.js +1 -0
  185. package/server/routes/status.js +1 -0
  186. package/server/routes/stt.js +1 -0
  187. package/server/routes/voice.js +1 -0
  188. package/server/routes/webhooks.js +1 -0
  189. package/server/routes.js +1 -0
  190. package/server/runtime-config.js +1 -0
  191. package/server/share.js +1 -0
  192. package/server/stt/faster-whisper.js +1 -0
  193. package/server/stt/groq.js +1 -0
  194. package/server/stt/index.js +1 -0
  195. package/server/stt/openai.js +1 -0
  196. package/server/sync.js +1 -0
  197. package/server/tailscale-https.js +1 -0
  198. package/server/tts.js +1 -0
  199. package/server/update-checker.js +1 -0
  200. package/server/utils/filename.js +1 -0
  201. package/server/utils.js +1 -0
  202. package/server/watchdog.js +3 -0
  203. package/server/websocket/broadcast.js +1 -0
  204. package/server/websocket/connections.js +1 -0
  205. package/server/websocket/index.js +1 -0
  206. package/server/websocket/routing.js +1 -0
  207. package/server/websocket/sync.js +1 -0
  208. package/server.js +1 -0
  209. package/utils/detect-tool-usage.js +1 -0
  210. package/utils/errors.js +1 -0
  211. package/utils/html-escape.js +1 -0
  212. package/utils/id-sanitize.js +1 -0
  213. package/utils/response.js +1 -0
  214. package/utils/with-retry.js +1 -0
  215. package/index.js +0 -2
@@ -0,0 +1,342 @@
1
+ /* ============================================
2
+ ACTIVITY PANEL STYLES
3
+ ============================================ */
4
+
5
+ /* Floating toggle button removed - now using Activity tab in mode-tabs */
6
+
7
+ .dev-panel {
8
+ position: fixed;
9
+ bottom: 160px;
10
+ right: var(--space-4);
11
+ width: 360px;
12
+ max-width: calc(100vw - var(--space-8));
13
+ max-height: 400px;
14
+ background: var(--bg-secondary);
15
+ border: 1px solid var(--border);
16
+ border-radius: var(--radius-xl);
17
+ z-index: var(--z-modal);
18
+ display: none;
19
+ flex-direction: column;
20
+ overflow: hidden;
21
+ box-shadow: 0 10px 40px var(--black-40);
22
+ }
23
+
24
+ .dev-panel.visible {
25
+ display: flex;
26
+ }
27
+
28
+ .dev-panel-header {
29
+ display: flex;
30
+ align-items: center;
31
+ justify-content: space-between;
32
+ padding: var(--space-3) var(--space-4);
33
+ border-bottom: 1px solid var(--border);
34
+ background: var(--black-20);
35
+ }
36
+
37
+ .dev-panel-title {
38
+ font-family: var(--font-mono);
39
+ font-size: var(--text-sm);
40
+ color: var(--accent);
41
+ letter-spacing: 1px;
42
+ text-transform: uppercase;
43
+ }
44
+
45
+ .dev-panel-close {
46
+ background: none;
47
+ border: none;
48
+ color: var(--text-muted);
49
+ font-size: var(--text-2xl);
50
+ cursor: pointer;
51
+ min-width: 44px;
52
+ min-height: 44px;
53
+ display: flex;
54
+ align-items: center;
55
+ justify-content: center;
56
+ line-height: 1;
57
+ border-radius: var(--radius-md);
58
+ }
59
+
60
+ .dev-panel-close:hover {
61
+ color: var(--text);
62
+ }
63
+
64
+ .dev-panel-tabs {
65
+ display: flex;
66
+ border-bottom: 1px solid var(--border);
67
+ }
68
+
69
+ .dev-tab {
70
+ flex: 1;
71
+ padding: var(--space-2) var(--space-2);
72
+ background: none;
73
+ border: none;
74
+ color: var(--text-muted);
75
+ font-size: var(--text-xs);
76
+ cursor: pointer;
77
+ transition: all 0.15s;
78
+ border-bottom: 2px solid transparent;
79
+ }
80
+
81
+ .dev-tab:hover {
82
+ color: var(--text);
83
+ background: var(--accent-05);
84
+ }
85
+
86
+ .dev-tab.active {
87
+ color: var(--accent);
88
+ border-bottom-color: var(--accent);
89
+ }
90
+
91
+ .dev-panel-content {
92
+ flex: 1;
93
+ overflow: hidden;
94
+ }
95
+
96
+ .dev-tab-content {
97
+ display: none;
98
+ height: 100%;
99
+ padding: var(--space-4);
100
+ overflow-y: auto;
101
+ }
102
+
103
+ .dev-tab-content.active {
104
+ display: block;
105
+ }
106
+
107
+ /* Token Stats */
108
+ .token-stats {
109
+ display: grid;
110
+ grid-template-columns: 1fr 1fr;
111
+ gap: var(--space-3);
112
+ margin-bottom: var(--space-4);
113
+ }
114
+
115
+ .token-stat {
116
+ background: var(--black-20);
117
+ border: 1px solid var(--border);
118
+ border-radius: var(--radius-md);
119
+ padding: var(--space-3);
120
+ text-align: center;
121
+ }
122
+
123
+ .token-stat.total {
124
+ grid-column: span 2;
125
+ background: var(--accent-05);
126
+ border-color: var(--accent);
127
+ }
128
+
129
+ .token-label {
130
+ display: block;
131
+ font-size: var(--text-xs);
132
+ color: var(--text-muted);
133
+ text-transform: uppercase;
134
+ letter-spacing: 0.5px;
135
+ margin-bottom: var(--space-1);
136
+ }
137
+
138
+ .token-value {
139
+ font-family: var(--font-mono);
140
+ font-size: var(--text-xl);
141
+ color: var(--text);
142
+ }
143
+
144
+ .token-session {
145
+ display: flex;
146
+ justify-content: space-between;
147
+ align-items: center;
148
+ padding: var(--space-3);
149
+ background: var(--black-20);
150
+ border: 1px solid var(--border);
151
+ border-radius: var(--radius-md);
152
+ margin-bottom: var(--space-3);
153
+ }
154
+
155
+ .token-session .token-label {
156
+ margin-bottom: 0;
157
+ }
158
+
159
+ .token-session .token-value {
160
+ color: var(--accent);
161
+ }
162
+
163
+ .dev-btn {
164
+ width: 100%;
165
+ padding: var(--space-2);
166
+ background: var(--bg-input);
167
+ border: 1px solid var(--border);
168
+ border-radius: var(--radius-md);
169
+ color: var(--text-muted);
170
+ font-size: var(--text-sm);
171
+ cursor: pointer;
172
+ transition: all 0.15s;
173
+ }
174
+
175
+ .dev-btn:hover {
176
+ border-color: var(--accent);
177
+ color: var(--accent);
178
+ }
179
+
180
+ /* API Logs */
181
+ .api-log-list,
182
+ .tool-list,
183
+ .error-list {
184
+ display: flex;
185
+ flex-direction: column;
186
+ gap: var(--space-2);
187
+ }
188
+
189
+ .empty-log {
190
+ text-align: center;
191
+ color: var(--text-dim);
192
+ font-size: var(--text-sm);
193
+ padding: var(--space-5);
194
+ }
195
+
196
+ .api-log-entry,
197
+ .tool-entry,
198
+ .error-entry {
199
+ background: var(--black-20);
200
+ border: 1px solid var(--border);
201
+ border-radius: var(--radius-md);
202
+ padding: var(--space-2);
203
+ }
204
+
205
+ .api-log-header,
206
+ .tool-header,
207
+ .error-header {
208
+ display: flex;
209
+ align-items: center;
210
+ gap: var(--space-2);
211
+ flex-wrap: wrap;
212
+ }
213
+
214
+ .api-method {
215
+ font-family: var(--font-mono);
216
+ font-size: var(--text-xs);
217
+ padding: 2px var(--space-2);
218
+ border-radius: var(--radius-sm);
219
+ background: var(--bg-input);
220
+ color: var(--text-muted);
221
+ }
222
+
223
+ .api-method.POST { background: var(--success-20); color: var(--success); }
224
+ .api-method.GET { background: var(--accent-20); color: var(--accent); }
225
+ .api-method.DELETE { background: var(--error-20); color: var(--error); }
226
+
227
+ .api-url {
228
+ font-size: var(--text-sm);
229
+ color: var(--text);
230
+ flex: 1;
231
+ white-space: nowrap;
232
+ overflow: hidden;
233
+ text-overflow: ellipsis;
234
+ }
235
+
236
+ .api-status {
237
+ font-family: var(--font-mono);
238
+ font-size: var(--text-xs);
239
+ padding: 2px var(--space-2);
240
+ border-radius: var(--radius-sm);
241
+ }
242
+
243
+ .api-status.status-2 { background: var(--success-20); color: var(--success); }
244
+ .api-status.status-4,
245
+ .api-status.status-5 { background: var(--error-20); color: var(--error); }
246
+
247
+ .api-duration {
248
+ font-family: var(--font-mono);
249
+ font-size: var(--text-xs);
250
+ color: var(--text-dim);
251
+ }
252
+
253
+ .api-response,
254
+ .tool-args {
255
+ margin-top: var(--space-2);
256
+ }
257
+
258
+ .api-response summary,
259
+ .tool-args summary {
260
+ font-size: var(--text-xs);
261
+ color: var(--text-muted);
262
+ cursor: pointer;
263
+ }
264
+
265
+ .api-response pre,
266
+ .tool-args pre {
267
+ margin-top: var(--space-2);
268
+ padding: var(--space-2);
269
+ background: var(--black-30);
270
+ border-radius: var(--radius-sm);
271
+ font-size: var(--text-xs);
272
+ overflow-x: auto;
273
+ color: var(--text);
274
+ white-space: pre-wrap;
275
+ word-break: break-all;
276
+ }
277
+
278
+ /* Tool Calls */
279
+ .tool-name {
280
+ font-family: var(--font-mono);
281
+ font-size: var(--text-sm);
282
+ color: var(--accent);
283
+ }
284
+
285
+ .tool-summary {
286
+ font-size: var(--text-xs);
287
+ color: var(--text-muted);
288
+ margin-top: 2px;
289
+ white-space: nowrap;
290
+ overflow: hidden;
291
+ text-overflow: ellipsis;
292
+ font-family: var(--font-mono);
293
+ }
294
+
295
+ .tool-entry.has-error .tool-summary {
296
+ color: var(--error);
297
+ }
298
+
299
+ .tool-time,
300
+ .error-time {
301
+ font-size: var(--text-xs);
302
+ color: var(--text-dim);
303
+ margin-left: auto;
304
+ }
305
+
306
+ /* Errors */
307
+ .error-entry {
308
+ border-color: var(--error-30);
309
+ }
310
+
311
+ .error-message {
312
+ font-size: var(--text-sm);
313
+ color: var(--error);
314
+ flex: 1;
315
+ }
316
+
317
+ .error-context {
318
+ font-size: var(--text-xs);
319
+ color: var(--text-dim);
320
+ margin-top: var(--space-2);
321
+ }
322
+
323
+ /* Mobile adjustments (--breakpoint-sm: 480px) */
324
+ @media (max-width: 480px) {
325
+ .dev-panel {
326
+ bottom: 140px;
327
+ left: var(--space-4);
328
+ right: var(--space-4);
329
+ width: auto;
330
+ }
331
+ }
332
+
333
+ /* Accessibility: Respect reduced motion preference (M-09) */
334
+ @media (prefers-reduced-motion: reduce) {
335
+ *,
336
+ *::before,
337
+ *::after {
338
+ animation-duration: 0.01ms !important;
339
+ animation-iteration-count: 1 !important;
340
+ transition-duration: 0.01ms !important;
341
+ }
342
+ }
@@ -0,0 +1,123 @@
1
+ /* ============================================
2
+ FILES MODULE STYLES
3
+ Drag & drop, file preview enhancements
4
+ ============================================ */
5
+
6
+ /* Drop zone overlay */
7
+ .drop-zone {
8
+ position: absolute;
9
+ top: 0;
10
+ left: 0;
11
+ right: 0;
12
+ bottom: 0;
13
+ background: rgba(0, 0, 0, 0.85);
14
+ display: none;
15
+ align-items: center;
16
+ justify-content: center;
17
+ z-index: var(--z-dropdown);
18
+ pointer-events: none;
19
+ }
20
+
21
+ .drop-zone.visible {
22
+ display: flex;
23
+ pointer-events: auto;
24
+ }
25
+
26
+ .drop-zone-content {
27
+ text-align: center;
28
+ padding: var(--space-10);
29
+ border: 2px dashed var(--accent);
30
+ border-radius: var(--radius-2xl);
31
+ background: rgba(0, 240, 255, 0.05);
32
+ animation: drop-pulse 1.5s ease-in-out infinite;
33
+ }
34
+
35
+ @keyframes drop-pulse {
36
+ 0%, 100% {
37
+ transform: scale(1);
38
+ border-color: var(--accent);
39
+ }
40
+ 50% {
41
+ transform: scale(1.02);
42
+ border-color: var(--success);
43
+ }
44
+ }
45
+
46
+ .drop-zone-icon {
47
+ font-size: 3rem;
48
+ margin-bottom: var(--space-4);
49
+ animation: bounce-soft 1s ease-in-out infinite;
50
+ }
51
+
52
+ @keyframes bounce-soft {
53
+ 0%, 100% { transform: translateY(0); }
54
+ 50% { transform: translateY(-8px); }
55
+ }
56
+
57
+ .drop-zone-text {
58
+ font-size: var(--text-lg);
59
+ color: var(--text);
60
+ margin-bottom: var(--space-2);
61
+ }
62
+
63
+ .drop-zone-hint {
64
+ font-size: var(--text-sm);
65
+ color: var(--text-muted);
66
+ }
67
+
68
+ /* Enhanced file preview */
69
+ .file-label {
70
+ display: flex;
71
+ align-items: center;
72
+ gap: var(--space-2);
73
+ padding: var(--space-3) var(--space-4);
74
+ background: var(--bg-input);
75
+ border: 1px solid var(--border);
76
+ border-radius: var(--radius-lg);
77
+ font-size: var(--text-sm);
78
+ color: var(--text);
79
+ max-width: 250px;
80
+ }
81
+
82
+ .file-label .file-size {
83
+ color: var(--text-dim);
84
+ font-size: var(--text-xs);
85
+ }
86
+
87
+ /* Code file preview - syntax hint */
88
+ .file-preview-code {
89
+ background: rgba(0, 20, 40, 0.9);
90
+ border: 1px solid var(--border);
91
+ border-radius: var(--radius-md);
92
+ padding: var(--space-3);
93
+ font-family: var(--font-mono);
94
+ font-size: var(--text-xs);
95
+ max-height: 150px;
96
+ overflow: auto;
97
+ white-space: pre-wrap;
98
+ color: var(--text);
99
+ margin-top: var(--space-2);
100
+ }
101
+
102
+ /* Text file icon colors */
103
+ .file-icon-js { color: var(--file-js); }
104
+ .file-icon-ts { color: var(--file-ts); }
105
+ .file-icon-py { color: var(--file-py); }
106
+ .file-icon-json { color: var(--file-json); }
107
+ .file-icon-html { color: var(--file-html); }
108
+ .file-icon-css { color: var(--file-css); }
109
+ .file-icon-md { color: var(--file-md); }
110
+
111
+ /* Image preview enhancements */
112
+ .image-preview img {
113
+ border: 1px solid var(--border);
114
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);
115
+ }
116
+
117
+ /* Preview with code content */
118
+ .file-preview-wrapper {
119
+ display: flex;
120
+ flex-direction: column;
121
+ gap: var(--space-2);
122
+ max-width: 300px;
123
+ }
@@ -0,0 +1,156 @@
1
+ /* ============================================
2
+ MARKDOWN STYLES
3
+ ============================================ */
4
+
5
+ /* Code blocks */
6
+ .message pre {
7
+ background: var(--bg-input);
8
+ border: 1px solid var(--border);
9
+ border-radius: var(--radius-md);
10
+ padding: var(--space-3);
11
+ overflow-x: auto;
12
+ margin: var(--space-2) 0;
13
+ font-family: var(--font-mono);
14
+ font-size: var(--text-sm);
15
+ line-height: 1.5;
16
+ }
17
+
18
+ .message pre code {
19
+ background: none;
20
+ padding: 0;
21
+ border: none;
22
+ color: var(--text);
23
+ }
24
+
25
+ /* Inline code */
26
+ .message code {
27
+ background: var(--bg-input);
28
+ padding: 2px var(--space-2);
29
+ border-radius: var(--radius-sm);
30
+ font-family: var(--font-mono);
31
+ font-size: var(--text-sm);
32
+ color: var(--accent);
33
+ }
34
+
35
+ /* Syntax highlighting */
36
+ .md-keyword {
37
+ color: var(--syntax-keyword, #c792ea);
38
+ }
39
+
40
+ .md-string {
41
+ color: var(--syntax-string, #c3e88d);
42
+ }
43
+
44
+ .md-comment {
45
+ color: var(--syntax-comment, #546e7a);
46
+ font-style: italic;
47
+ }
48
+
49
+ .md-number {
50
+ color: var(--syntax-number, #f78c6c);
51
+ }
52
+
53
+ /* Headers */
54
+ .message h2, .message h3, .message h4 {
55
+ margin: var(--space-3) 0 var(--space-2) 0;
56
+ font-weight: 600;
57
+ color: var(--text);
58
+ }
59
+
60
+ .message h2 { font-size: var(--text-2xl); }
61
+ .message h3 { font-size: var(--text-lg); }
62
+ .message h4 { font-size: var(--text-base); }
63
+
64
+ /* Lists */
65
+ .message ul, .message ol {
66
+ margin: var(--space-2) 0;
67
+ padding-left: var(--space-5);
68
+ }
69
+
70
+ .message ul {
71
+ list-style-type: disc;
72
+ }
73
+
74
+ .message ol {
75
+ list-style-type: decimal;
76
+ }
77
+
78
+ .message li {
79
+ margin: var(--space-1) 0;
80
+ }
81
+
82
+ /* Blockquotes */
83
+ .message blockquote {
84
+ border-left: 3px solid var(--accent);
85
+ margin: var(--space-2) 0;
86
+ padding: var(--space-1) var(--space-3);
87
+ background: rgba(0, 240, 255, 0.05);
88
+ color: var(--text-muted);
89
+ font-style: italic;
90
+ }
91
+
92
+ /* Horizontal rule */
93
+ .message hr {
94
+ border: none;
95
+ border-top: 1px solid var(--border);
96
+ margin: var(--space-4) 0;
97
+ }
98
+
99
+ /* Links */
100
+ .message a {
101
+ color: var(--accent);
102
+ text-decoration: none;
103
+ }
104
+
105
+ .message a:hover {
106
+ text-decoration: underline;
107
+ }
108
+
109
+ /* Tables */
110
+ .message .md-table {
111
+ width: 100%;
112
+ border-collapse: collapse;
113
+ margin: var(--space-3) 0;
114
+ font-size: var(--text-sm);
115
+ overflow-x: auto;
116
+ display: block;
117
+ }
118
+
119
+ .message .md-table thead {
120
+ background: var(--bg-input);
121
+ }
122
+
123
+ .message .md-table th,
124
+ .message .md-table td {
125
+ padding: var(--space-2) var(--space-3);
126
+ border: 1px solid var(--border);
127
+ text-align: left;
128
+ }
129
+
130
+ .message .md-table th {
131
+ font-weight: 600;
132
+ color: var(--text);
133
+ }
134
+
135
+ .message .md-table td {
136
+ color: var(--text-muted);
137
+ }
138
+
139
+ .message .md-table tbody tr:nth-child(even) {
140
+ background: rgba(255, 255, 255, 0.02);
141
+ }
142
+
143
+ /* Strong and emphasis */
144
+ .message strong {
145
+ font-weight: 600;
146
+ color: var(--text);
147
+ }
148
+
149
+ .message em {
150
+ font-style: italic;
151
+ }
152
+
153
+ .message del {
154
+ text-decoration: line-through;
155
+ opacity: 0.7;
156
+ }