@1agh/maude 0.29.0 → 0.31.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 (162) hide show
  1. package/README.md +6 -6
  2. package/apps/studio/acp/bridge.ts +285 -0
  3. package/apps/studio/acp/env.ts +48 -0
  4. package/apps/studio/acp/index.ts +132 -0
  5. package/apps/studio/acp/probe.ts +112 -0
  6. package/apps/studio/acp/transcript.ts +149 -0
  7. package/apps/studio/ai-banner.tsx +0 -1
  8. package/apps/studio/annotations-align.ts +149 -0
  9. package/apps/studio/annotations-bindings.ts +197 -0
  10. package/apps/studio/annotations-context-toolbar.tsx +436 -186
  11. package/apps/studio/annotations-groups.ts +270 -0
  12. package/apps/studio/annotations-layer.tsx +1714 -1661
  13. package/apps/studio/annotations-model.ts +2077 -0
  14. package/apps/studio/annotations-snap.ts +125 -0
  15. package/apps/studio/api.ts +433 -182
  16. package/apps/studio/bin/_png-playwright.mjs +1 -1
  17. package/apps/studio/bin/annotate.mjs +732 -0
  18. package/apps/studio/bin/annotate.sh +17 -0
  19. package/apps/studio/bin/chat-open.sh +44 -0
  20. package/apps/studio/bin/read-annotations.mjs +152 -17
  21. package/apps/studio/build.ts +1 -1
  22. package/apps/studio/canvas-arrowheads.ts +78 -9
  23. package/apps/studio/canvas-cursors.ts +2 -0
  24. package/apps/studio/canvas-edit.ts +257 -7
  25. package/apps/studio/canvas-icons.tsx +105 -0
  26. package/apps/studio/canvas-lib.tsx +112 -19
  27. package/apps/studio/canvas-list-watch.ts +177 -0
  28. package/apps/studio/canvas-shell.tsx +326 -9
  29. package/apps/studio/client/app.jsx +3579 -250
  30. package/apps/studio/client/canvas-url.js +5 -0
  31. package/apps/studio/client/github.js +99 -0
  32. package/apps/studio/client/index.html +1 -1
  33. package/apps/studio/client/panels/ChatPanel.jsx +770 -0
  34. package/apps/studio/client/panels/CollabModelInfographic.jsx +71 -0
  35. package/apps/studio/client/panels/CreateProject.jsx +334 -0
  36. package/apps/studio/client/panels/DiffView.jsx +590 -0
  37. package/apps/studio/client/panels/GitPanel.jsx +767 -0
  38. package/apps/studio/client/panels/IdentityBar.jsx +294 -0
  39. package/apps/studio/client/panels/OnboardingWizard.jsx +563 -0
  40. package/apps/studio/client/panels/RepoBranchSwitcher.jsx +349 -0
  41. package/apps/studio/client/panels/acp-runtime.js +286 -0
  42. package/apps/studio/client/panels/chat-markdown.jsx +138 -0
  43. package/apps/studio/client/panels/git-grouping.js +86 -0
  44. package/apps/studio/client/styles/0-reset.css +4 -0
  45. package/apps/studio/client/styles/3-shell-maude.css +1326 -14
  46. package/apps/studio/client/styles/4-components.css +39 -0
  47. package/apps/studio/client/styles/5-maude-overrides.css +41 -2
  48. package/apps/studio/client/styles/6-acp-chat.css +771 -0
  49. package/apps/studio/client/styles/_index.css +2 -0
  50. package/apps/studio/client/tour/collab-tour.js +61 -0
  51. package/apps/studio/client/tour/overlay.jsx +116 -18
  52. package/apps/studio/client/tour/usage-tour.js +23 -10
  53. package/apps/studio/client/whats-new.jsx +25 -10
  54. package/apps/studio/collab/registry.ts +13 -0
  55. package/apps/studio/collab/room.ts +36 -0
  56. package/apps/studio/commands/annotation-strokes-command.ts +1 -1
  57. package/apps/studio/commands/move-artboards-command.ts +1 -1
  58. package/apps/studio/comments-overlay.tsx +7 -5
  59. package/apps/studio/context-menu.tsx +4 -3
  60. package/apps/studio/contextual-toolbar.tsx +14 -0
  61. package/apps/studio/cursors-overlay.tsx +37 -21
  62. package/apps/studio/dist/client.bundle.js +31795 -1829
  63. package/apps/studio/dist/comment-mount.js +97 -9
  64. package/apps/studio/dist/styles.css +7938 -1599
  65. package/apps/studio/dom-selection.ts +115 -0
  66. package/apps/studio/export-dialog.tsx +3 -3
  67. package/apps/studio/git/endpoints.ts +338 -0
  68. package/apps/studio/git/service.ts +1334 -0
  69. package/apps/studio/git/watch.ts +97 -0
  70. package/apps/studio/github/endpoints.ts +358 -0
  71. package/apps/studio/github/service.ts +231 -0
  72. package/apps/studio/github/token.ts +53 -0
  73. package/apps/studio/history.ts +20 -3
  74. package/apps/studio/hmr-broadcast.ts +9 -2
  75. package/apps/studio/http.ts +508 -6
  76. package/apps/studio/input-router.tsx +7 -0
  77. package/apps/studio/inspect.ts +37 -8
  78. package/apps/studio/participants-chrome.tsx +70 -16
  79. package/apps/studio/paths.ts +12 -0
  80. package/apps/studio/scaffold-design.ts +57 -0
  81. package/apps/studio/server.ts +70 -4
  82. package/apps/studio/sync/agent.ts +311 -57
  83. package/apps/studio/sync/codec.ts +69 -0
  84. package/apps/studio/sync/cold-start.ts +198 -0
  85. package/apps/studio/sync/connection-state.ts +58 -2
  86. package/apps/studio/sync/hub-link.ts +137 -0
  87. package/apps/studio/sync/index.ts +563 -221
  88. package/apps/studio/sync/journal.ts +190 -0
  89. package/apps/studio/sync/migrate-seed.ts +202 -44
  90. package/apps/studio/sync/projection.ts +22 -3
  91. package/apps/studio/sync/status.ts +15 -4
  92. package/apps/studio/test/acp-bridge.test.ts +127 -0
  93. package/apps/studio/test/acp-env.test.ts +65 -0
  94. package/apps/studio/test/acp-origin-gate.test.ts +78 -0
  95. package/apps/studio/test/acp-transcript.test.ts +112 -0
  96. package/apps/studio/test/activity.test.ts +1 -7
  97. package/apps/studio/test/annotate-write.test.ts +184 -0
  98. package/apps/studio/test/annotations-align.test.ts +88 -0
  99. package/apps/studio/test/annotations-bindings.test.ts +124 -0
  100. package/apps/studio/test/annotations-groups.test.ts +231 -0
  101. package/apps/studio/test/annotations-snap.test.ts +79 -0
  102. package/apps/studio/test/canvas-create-api.test.ts +72 -0
  103. package/apps/studio/test/canvas-edit.test.ts +181 -1
  104. package/apps/studio/test/canvas-list-watch.test.ts +322 -0
  105. package/apps/studio/test/canvas-meta-api.test.ts +161 -27
  106. package/apps/studio/test/canvas-origin-gate.test.ts +43 -0
  107. package/apps/studio/test/chat-markdown.test.tsx +58 -0
  108. package/apps/studio/test/collab-bridge.test.ts +0 -2
  109. package/apps/studio/test/collab-room.test.ts +2 -7
  110. package/apps/studio/test/collab-session-survival.test.tsx +176 -0
  111. package/apps/studio/test/csp-canvas-shell.test.ts +5 -0
  112. package/apps/studio/test/csrf-write-guard.test.ts +78 -0
  113. package/apps/studio/test/editing-presence.test.ts +103 -0
  114. package/apps/studio/test/figjam-v3-model.test.ts +342 -0
  115. package/apps/studio/test/fixtures/figjam-v3-groups-bindings.svg +1 -0
  116. package/apps/studio/test/fixtures/mock-acp-agent.mjs +45 -0
  117. package/apps/studio/test/git-api.test.ts +0 -0
  118. package/apps/studio/test/git-branches.test.ts +106 -0
  119. package/apps/studio/test/git-grouping.test.ts +106 -0
  120. package/apps/studio/test/git-watch.test.ts +97 -0
  121. package/apps/studio/test/github-api.test.ts +465 -0
  122. package/apps/studio/test/hub-link.test.ts +69 -0
  123. package/apps/studio/test/participants-chrome.test.ts +36 -1
  124. package/apps/studio/test/shared-doc-migrate.test.ts +224 -14
  125. package/apps/studio/test/sync-agent.test.ts +272 -2
  126. package/apps/studio/test/sync-codec.test.ts +65 -0
  127. package/apps/studio/test/sync-cold-seed-dedup.test.ts +187 -0
  128. package/apps/studio/test/sync-cold-start.test.ts +304 -0
  129. package/apps/studio/test/sync-connection-state.test.ts +68 -0
  130. package/apps/studio/test/sync-hardening.test.ts +0 -8
  131. package/apps/studio/test/sync-hubs-config.test.ts +0 -1
  132. package/apps/studio/test/sync-incident-replay.test.ts +211 -0
  133. package/apps/studio/test/sync-journal.test.ts +176 -0
  134. package/apps/studio/test/sync-runtime.test.ts +360 -5
  135. package/apps/studio/test/sync-status.test.ts +66 -0
  136. package/apps/studio/test/tour-overlay.test.tsx +18 -0
  137. package/apps/studio/test/use-annotation-resize.test.ts +159 -0
  138. package/apps/studio/test/use-artboard-drag.test.ts +0 -1
  139. package/apps/studio/test/use-collab.test.ts +0 -0
  140. package/apps/studio/test/use-tool-mode.test.tsx +5 -2
  141. package/apps/studio/tool-palette.tsx +30 -11
  142. package/apps/studio/undo-hud.tsx +0 -1
  143. package/apps/studio/use-agent-presence.tsx +4 -2
  144. package/apps/studio/use-annotation-resize.tsx +484 -54
  145. package/apps/studio/use-annotation-selection.tsx +16 -4
  146. package/apps/studio/use-canvas-activity.tsx +2 -2
  147. package/apps/studio/use-chrome-visibility.tsx +66 -0
  148. package/apps/studio/use-collab.tsx +434 -202
  149. package/apps/studio/use-selection-set.tsx +9 -0
  150. package/apps/studio/use-tool-mode.tsx +5 -1
  151. package/apps/studio/whats-new.json +208 -10
  152. package/apps/studio/whats-new.schema.json +18 -2
  153. package/apps/studio/ws.ts +44 -1
  154. package/cli/commands/design-link.test.mjs +84 -0
  155. package/cli/commands/design.mjs +3 -1
  156. package/cli/commands/design.test.mjs +5 -1
  157. package/cli/lib/design-link.mjs +51 -1
  158. package/cli/lib/gitignore-block.mjs +16 -3
  159. package/cli/lib/gitignore-block.test.mjs +13 -1
  160. package/package.json +11 -9
  161. package/plugins/design/dependencies.json +17 -0
  162. package/plugins/design/templates/_shell.html +58 -12
@@ -0,0 +1,771 @@
1
+ /* @layer components — Phase 31 (DDR-123) ACP chat sidepanel.
2
+ *
3
+ * Ported from `.design/ui/ChatPanel.css` (the approved mock), styling only the
4
+ * canvas-LOCAL `chat-*` content inside the `st-rpanel` Assistant tab. Every value
5
+ * is a maude token from `1-tokens-maude.css` / a component class from
6
+ * `4-components-maude.css`. Differences from the mock: the feed scrolls live
7
+ * (`overflow-y:auto`, not the mock's static `hidden`) and a few wrappers
8
+ * (`.chat-thread`, `.st-rp-body--chat`, `.chat-tool-path`) the live panel needs.
9
+ */
10
+ @layer components {
11
+ /* Menubar Assistant button (sparkle) — mirrors .st-whatsnew; the ✦ now opens
12
+ the Assistant and What's New moved to a megaphone. Busy = pulse while a turn
13
+ runs; unseen = a violet dot when a reply landed while the panel was hidden. */
14
+ .st-assistant {
15
+ position: relative;
16
+ appearance: none;
17
+ border: 0;
18
+ background: transparent;
19
+ cursor: pointer;
20
+ width: 26px;
21
+ height: 26px;
22
+ display: grid;
23
+ place-items: center;
24
+ border-radius: var(--radius-sm);
25
+ color: var(--fg-1);
26
+ }
27
+ .st-assistant:hover {
28
+ background: var(--bg-3);
29
+ color: var(--fg-0);
30
+ }
31
+ .st-assistant[data-active='true'] {
32
+ background: var(--bg-3);
33
+ color: var(--accent);
34
+ }
35
+ .st-assistant[data-busy='true'] {
36
+ color: var(--presence-agent);
37
+ animation: chat-pip 1.2s var(--ease-out) infinite;
38
+ }
39
+ .st-assistant[data-unseen='true'] {
40
+ color: var(--presence-agent);
41
+ }
42
+ .st-assistant[data-unseen='true']::after {
43
+ content: '';
44
+ position: absolute;
45
+ top: 3px;
46
+ right: 3px;
47
+ width: 7px;
48
+ height: 7px;
49
+ border-radius: var(--radius-pill);
50
+ background: var(--presence-agent);
51
+ border: 1.5px solid var(--bg-1);
52
+ }
53
+
54
+ .st-rp-body--chat {
55
+ padding: 0;
56
+ display: flex;
57
+ flex-direction: column;
58
+ min-height: 0;
59
+ }
60
+
61
+ .chat-panel {
62
+ flex: 1;
63
+ display: flex;
64
+ flex-direction: column;
65
+ min-height: 0;
66
+ }
67
+ .chat-thread {
68
+ flex: 1;
69
+ display: flex;
70
+ flex-direction: column;
71
+ min-height: 0;
72
+ }
73
+
74
+ /* Chat switcher bar — recents dropdown + New chat (repo-level history). */
75
+ .chat-bar {
76
+ display: flex;
77
+ align-items: center;
78
+ gap: var(--space-2);
79
+ padding: var(--space-2) var(--space-3);
80
+ border-bottom: 1px solid var(--border-subtle);
81
+ }
82
+ /* Custom chat dropdown — status dot (running/open/saved) + delete per row. */
83
+ .chat-switch {
84
+ position: relative;
85
+ flex: 1;
86
+ min-width: 0;
87
+ }
88
+ .chat-switch-trigger {
89
+ display: flex;
90
+ align-items: center;
91
+ gap: var(--space-2);
92
+ width: 100%;
93
+ appearance: none;
94
+ border: 1px solid var(--border-default);
95
+ background: var(--bg-3);
96
+ color: var(--fg-1);
97
+ font-family: var(--font-body);
98
+ font-size: var(--type-xs);
99
+ border-radius: var(--radius-sm);
100
+ padding: 4px var(--space-3);
101
+ cursor: pointer;
102
+ transition: border-color var(--dur-soft) var(--ease-out);
103
+ }
104
+ .chat-switch-trigger:hover {
105
+ border-color: var(--border-strong);
106
+ }
107
+ .chat-switch-title {
108
+ flex: 1;
109
+ min-width: 0;
110
+ overflow: hidden;
111
+ text-overflow: ellipsis;
112
+ white-space: nowrap;
113
+ text-align: left;
114
+ }
115
+ .chat-switch-caret {
116
+ color: var(--fg-3);
117
+ flex-shrink: 0;
118
+ }
119
+ .chat-menu-backdrop {
120
+ position: fixed;
121
+ inset: 0;
122
+ z-index: 50;
123
+ }
124
+ .chat-menu {
125
+ position: absolute;
126
+ top: calc(100% + 4px);
127
+ left: 0;
128
+ right: 0;
129
+ z-index: 51;
130
+ max-height: 260px;
131
+ overflow-y: auto;
132
+ background: var(--bg-2);
133
+ border: 1px solid var(--border-default);
134
+ border-radius: var(--radius-sm);
135
+ box-shadow: var(--shadow-lg);
136
+ padding: var(--space-1);
137
+ }
138
+ .chat-menu-row {
139
+ display: flex;
140
+ align-items: center;
141
+ border-radius: var(--radius-xs);
142
+ }
143
+ .chat-menu-row:hover,
144
+ .chat-menu-row.is-active {
145
+ background: var(--bg-3);
146
+ }
147
+ .chat-menu-open {
148
+ flex: 1;
149
+ min-width: 0;
150
+ display: flex;
151
+ align-items: center;
152
+ gap: var(--space-2);
153
+ appearance: none;
154
+ border: 0;
155
+ background: transparent;
156
+ cursor: pointer;
157
+ color: var(--fg-1);
158
+ font-family: var(--font-body);
159
+ font-size: var(--type-xs);
160
+ padding: var(--space-2);
161
+ text-align: left;
162
+ }
163
+ .chat-menu-title {
164
+ flex: 1;
165
+ min-width: 0;
166
+ overflow: hidden;
167
+ text-overflow: ellipsis;
168
+ white-space: nowrap;
169
+ }
170
+ .chat-menu-del {
171
+ appearance: none;
172
+ border: 0;
173
+ background: transparent;
174
+ cursor: pointer;
175
+ color: var(--fg-3);
176
+ display: inline-flex;
177
+ padding: var(--space-2);
178
+ border-radius: var(--radius-xs);
179
+ flex-shrink: 0;
180
+ }
181
+ .chat-menu-del:hover {
182
+ color: var(--status-error);
183
+ }
184
+ .chat-dot {
185
+ width: 7px;
186
+ height: 7px;
187
+ border-radius: var(--radius-pill);
188
+ flex-shrink: 0;
189
+ }
190
+ .chat-dot--busy {
191
+ background: var(--presence-agent);
192
+ animation: chat-pip 1s var(--ease-out) infinite;
193
+ }
194
+ .chat-dot--idle {
195
+ background: var(--status-success);
196
+ }
197
+ .chat-dot--off {
198
+ background: var(--border-strong);
199
+ }
200
+ .chat-newbtn {
201
+ appearance: none;
202
+ border: 1px solid var(--border-default);
203
+ background: var(--bg-2);
204
+ color: var(--fg-1);
205
+ font-family: var(--font-mono);
206
+ font-size: var(--type-xs);
207
+ border-radius: var(--radius-sm);
208
+ padding: 3px var(--space-3);
209
+ cursor: pointer;
210
+ white-space: nowrap;
211
+ transition:
212
+ border-color var(--dur-soft) var(--ease-out),
213
+ background var(--dur-soft) var(--ease-out);
214
+ }
215
+ .chat-newbtn:hover {
216
+ border-color: var(--border-strong);
217
+ background: var(--bg-3);
218
+ }
219
+ .chat-newbtn:focus-visible {
220
+ outline: none;
221
+ border-color: var(--accent);
222
+ box-shadow: 0 0 0 3px var(--accent-tint);
223
+ }
224
+
225
+ /* Connection status strip */
226
+ .chat-statusrow {
227
+ display: flex;
228
+ align-items: center;
229
+ gap: var(--space-2);
230
+ padding: var(--space-2) var(--space-4);
231
+ border-bottom: 1px solid var(--border-subtle);
232
+ font-family: var(--font-mono);
233
+ font-size: var(--type-xs);
234
+ color: var(--fg-2);
235
+ }
236
+ .chat-statusrow-sep {
237
+ color: var(--fg-3);
238
+ }
239
+ .chat-statusrow-cc {
240
+ color: var(--fg-1);
241
+ }
242
+ .chat-status-dot {
243
+ width: 7px;
244
+ height: 7px;
245
+ border-radius: var(--radius-pill);
246
+ background: var(--presence-offline);
247
+ }
248
+ .chat-status-dot--ready {
249
+ background: var(--status-success);
250
+ }
251
+ .chat-status-dot--working {
252
+ background: var(--presence-agent);
253
+ animation: chat-pip 1s var(--ease-out) infinite;
254
+ }
255
+ @keyframes chat-pip {
256
+ 0%,
257
+ 100% {
258
+ opacity: 1;
259
+ }
260
+ 50% {
261
+ opacity: 0.35;
262
+ }
263
+ }
264
+
265
+ /* "Still working" indicator — inline under the latest message in the feed. */
266
+ .chat-activity {
267
+ display: flex;
268
+ align-items: center;
269
+ gap: var(--space-2);
270
+ font-family: var(--font-mono);
271
+ font-size: var(--type-xs);
272
+ color: var(--presence-agent);
273
+ }
274
+ .chat-activity-spin {
275
+ width: 10px;
276
+ height: 10px;
277
+ flex-shrink: 0;
278
+ border: 1.5px solid var(--presence-agent);
279
+ border-top-color: transparent;
280
+ border-radius: var(--radius-pill);
281
+ animation: chat-spin 0.7s linear infinite;
282
+ }
283
+ @keyframes chat-spin {
284
+ to {
285
+ transform: rotate(360deg);
286
+ }
287
+ }
288
+ .chat-activity-text {
289
+ font-weight: 600;
290
+ color: var(--presence-agent);
291
+ }
292
+
293
+ /* Feed (scrolls live) */
294
+ .chat-feed {
295
+ flex: 1;
296
+ overflow-y: auto;
297
+ padding: var(--space-4);
298
+ display: flex;
299
+ flex-direction: column;
300
+ gap: var(--space-4);
301
+ }
302
+
303
+ /* Empty state */
304
+ .chat-empty {
305
+ margin: auto 0;
306
+ display: flex;
307
+ flex-direction: column;
308
+ align-items: center;
309
+ gap: var(--space-3);
310
+ text-align: center;
311
+ padding: var(--space-4) var(--space-2);
312
+ }
313
+ .chat-empty-mark {
314
+ color: var(--accent-muted);
315
+ }
316
+ .chat-empty-title {
317
+ font-size: var(--type-base);
318
+ font-weight: 600;
319
+ color: var(--fg-0);
320
+ }
321
+ .chat-empty-sub {
322
+ font-size: var(--type-sm);
323
+ color: var(--fg-2);
324
+ line-height: var(--lh-sm);
325
+ max-width: 240px;
326
+ }
327
+ .chat-sugs {
328
+ display: flex;
329
+ flex-direction: column;
330
+ gap: var(--space-2);
331
+ width: 100%;
332
+ margin-top: var(--space-2);
333
+ }
334
+ .chat-sug {
335
+ text-align: left;
336
+ width: 100%;
337
+ font-family: var(--font-body);
338
+ font-size: var(--type-sm);
339
+ color: var(--fg-1);
340
+ padding: var(--space-3) var(--space-4);
341
+ border: 1px solid var(--border-subtle);
342
+ border-radius: var(--radius-sm);
343
+ background: var(--bg-2);
344
+ cursor: pointer;
345
+ transition:
346
+ border-color var(--dur-soft) var(--ease-out),
347
+ background var(--dur-soft) var(--ease-out);
348
+ }
349
+ .chat-sug:hover {
350
+ border-color: var(--border-strong);
351
+ background: var(--bg-3);
352
+ }
353
+ .chat-sug:focus-visible {
354
+ outline: 2px solid var(--accent);
355
+ outline-offset: 1px;
356
+ }
357
+
358
+ /* Messages */
359
+ .chat-msg {
360
+ display: flex;
361
+ flex-direction: column;
362
+ gap: var(--space-2);
363
+ animation: chat-msg-in var(--dur-soft) var(--ease-out) both;
364
+ }
365
+ @keyframes chat-msg-in {
366
+ from {
367
+ opacity: 0;
368
+ transform: translateY(4px);
369
+ }
370
+ to {
371
+ opacity: 1;
372
+ transform: none;
373
+ }
374
+ }
375
+ .chat-msg-role {
376
+ display: flex;
377
+ align-items: center;
378
+ gap: var(--space-2);
379
+ font-family: var(--font-mono);
380
+ font-size: var(--type-xs);
381
+ letter-spacing: var(--tracking-wide);
382
+ text-transform: uppercase;
383
+ color: var(--fg-2);
384
+ }
385
+ .chat-msg-spark {
386
+ color: var(--presence-agent);
387
+ display: inline-flex;
388
+ }
389
+ .chat-msg--user .chat-bubble {
390
+ align-self: flex-start;
391
+ max-width: 100%;
392
+ font-size: var(--type-sm);
393
+ color: var(--fg-0);
394
+ background: var(--bg-3);
395
+ border: 1px solid var(--border-subtle);
396
+ border-radius: var(--radius-sm);
397
+ padding: var(--space-3) var(--space-4);
398
+ white-space: pre-wrap;
399
+ }
400
+ .chat-bubble code {
401
+ font-family: var(--font-mono);
402
+ font-size: var(--type-xs);
403
+ color: var(--accent);
404
+ }
405
+ .chat-msg--assistant .chat-bubble {
406
+ font-size: var(--type-sm);
407
+ color: var(--fg-1);
408
+ line-height: var(--lh-base);
409
+ }
410
+
411
+ /* Rendered markdown inside the assistant bubble (chat-markdown.jsx) */
412
+ .chat-msg--assistant .chat-bubble > * + * {
413
+ margin-top: var(--space-2);
414
+ }
415
+ .chat-md-p {
416
+ margin: 0;
417
+ white-space: pre-wrap;
418
+ }
419
+ .chat-md-h {
420
+ margin: 0;
421
+ font-weight: 600;
422
+ color: var(--fg-0);
423
+ }
424
+ .chat-md-list {
425
+ margin: 0;
426
+ padding-left: var(--space-4);
427
+ display: flex;
428
+ flex-direction: column;
429
+ gap: var(--space-1);
430
+ }
431
+ .chat-md-list li {
432
+ font-size: var(--type-sm);
433
+ }
434
+ .chat-code {
435
+ margin: 0;
436
+ padding: var(--space-3);
437
+ background: var(--bg-3);
438
+ border: 1px solid var(--border-subtle);
439
+ border-radius: var(--radius-sm);
440
+ overflow-x: auto;
441
+ }
442
+ .chat-code code {
443
+ font-family: var(--font-mono);
444
+ font-size: var(--type-xs);
445
+ color: var(--fg-1);
446
+ white-space: pre;
447
+ }
448
+ .chat-bubble strong {
449
+ font-weight: 600;
450
+ color: var(--fg-0);
451
+ }
452
+ .chat-bubble em {
453
+ font-style: italic;
454
+ }
455
+ .chat-bubble a {
456
+ color: var(--accent);
457
+ text-decoration: underline;
458
+ }
459
+
460
+ /* Collapsed "Thinking" disclosure (extended-thinking / reasoning parts) */
461
+ .chat-think {
462
+ border: 1px solid var(--border-subtle);
463
+ border-radius: var(--radius-sm);
464
+ background: var(--bg-2);
465
+ overflow: hidden;
466
+ }
467
+ .chat-think-sum {
468
+ display: flex;
469
+ align-items: center;
470
+ gap: var(--space-2);
471
+ padding: var(--space-2) var(--space-3);
472
+ font-family: var(--font-mono);
473
+ font-size: var(--type-xs);
474
+ color: var(--fg-2);
475
+ cursor: pointer;
476
+ user-select: none;
477
+ list-style: none;
478
+ }
479
+ .chat-think-sum::-webkit-details-marker {
480
+ display: none;
481
+ }
482
+ .chat-think-sum::after {
483
+ content: '▸';
484
+ margin-left: auto;
485
+ transition: transform var(--dur-soft) var(--ease-out);
486
+ }
487
+ .chat-think[open] .chat-think-sum::after {
488
+ transform: rotate(90deg);
489
+ }
490
+ .chat-think-spark {
491
+ color: var(--presence-agent);
492
+ display: inline-flex;
493
+ }
494
+ .chat-think[open] .chat-think-sum {
495
+ border-bottom: 1px solid var(--border-subtle);
496
+ }
497
+ .chat-think-body {
498
+ padding: var(--space-3);
499
+ font-size: var(--type-xs);
500
+ color: var(--fg-2);
501
+ line-height: var(--lh-base);
502
+ }
503
+ .chat-think-body .chat-md-p {
504
+ white-space: pre-wrap;
505
+ }
506
+
507
+ /* Tool-call card */
508
+ .chat-tool {
509
+ border: 1px solid var(--border-default);
510
+ border-radius: var(--radius-sm);
511
+ background: var(--bg-2);
512
+ overflow: hidden;
513
+ }
514
+ .chat-tool-hd {
515
+ display: flex;
516
+ align-items: center;
517
+ gap: var(--space-2);
518
+ padding: var(--space-2) var(--space-3);
519
+ font-family: var(--font-mono);
520
+ font-size: var(--type-xs);
521
+ color: var(--fg-1);
522
+ border-bottom: 1px solid var(--border-subtle);
523
+ }
524
+ .chat-tool-hd b {
525
+ color: var(--accent);
526
+ font-weight: 600;
527
+ }
528
+ .chat-tool-path {
529
+ color: var(--fg-2);
530
+ }
531
+ .chat-tool-dot {
532
+ width: 6px;
533
+ height: 6px;
534
+ border-radius: var(--radius-pill);
535
+ margin-left: auto;
536
+ }
537
+ .chat-tool-dot--run {
538
+ background: var(--presence-agent);
539
+ animation: chat-pip 1s var(--ease-out) infinite;
540
+ }
541
+ .chat-tool-dot--done {
542
+ background: var(--status-success);
543
+ }
544
+ .chat-tool-body {
545
+ padding: var(--space-3);
546
+ display: grid;
547
+ gap: var(--space-1);
548
+ font-family: var(--font-mono);
549
+ font-size: var(--type-xs);
550
+ }
551
+ .chat-tool-line {
552
+ display: flex;
553
+ gap: var(--space-2);
554
+ color: var(--fg-1);
555
+ }
556
+ .chat-tool-line.add {
557
+ color: var(--status-success);
558
+ }
559
+ .chat-tool-line.del {
560
+ color: var(--status-error);
561
+ }
562
+
563
+ /* Quick-action row */
564
+ .chat-quick {
565
+ display: flex;
566
+ flex-wrap: wrap;
567
+ gap: var(--space-2);
568
+ padding: var(--space-3) var(--space-4) 0;
569
+ }
570
+ .chat-qa {
571
+ font-family: var(--font-mono);
572
+ }
573
+
574
+ /* Composer */
575
+ .chat-composer {
576
+ padding: var(--space-3) var(--space-4) var(--space-4);
577
+ border-top: 1px solid var(--border-subtle);
578
+ margin-top: var(--space-3);
579
+ }
580
+ .chat-ctx {
581
+ display: inline-flex;
582
+ align-items: center;
583
+ gap: var(--space-2);
584
+ margin-bottom: var(--space-3);
585
+ font-size: var(--type-xs);
586
+ color: var(--fg-2);
587
+ }
588
+ .chat-ctx b {
589
+ color: var(--fg-1);
590
+ font-weight: 600;
591
+ }
592
+
593
+ /* Composer box — textarea on top, a bottom toolbar (model · effort · send),
594
+ Zed-style. One border + focus ring around the whole box. */
595
+ .chat-box {
596
+ display: flex;
597
+ flex-direction: column;
598
+ border: 1px solid var(--border-default);
599
+ border-radius: var(--radius-sm);
600
+ background: var(--bg-3);
601
+ overflow: hidden;
602
+ transition:
603
+ border-color var(--dur-soft) var(--ease-out),
604
+ box-shadow var(--dur-soft) var(--ease-out);
605
+ }
606
+ .chat-box:focus-within {
607
+ border-color: var(--accent);
608
+ box-shadow: 0 0 0 3px var(--accent-tint);
609
+ }
610
+ .chat-input {
611
+ appearance: none;
612
+ border: none;
613
+ background: transparent;
614
+ resize: none;
615
+ width: 100%;
616
+ min-height: 54px;
617
+ padding: var(--space-3) var(--space-4);
618
+ font-family: var(--font-body);
619
+ font-size: var(--type-sm);
620
+ color: var(--fg-0);
621
+ outline: none;
622
+ }
623
+ .chat-input::placeholder {
624
+ color: var(--fg-3);
625
+ }
626
+ .chat-toolbar {
627
+ display: flex;
628
+ align-items: center;
629
+ gap: var(--space-1);
630
+ padding: var(--space-1) var(--space-2);
631
+ }
632
+ .chat-toolbar-spacer {
633
+ flex: 1;
634
+ }
635
+ /* Compact toolbar dropdowns — borderless, hover-revealed (Zed-style). */
636
+ .chat-select {
637
+ appearance: none;
638
+ font-family: var(--font-body);
639
+ font-size: var(--type-xs);
640
+ color: var(--fg-2);
641
+ background: transparent;
642
+ border: 1px solid transparent;
643
+ border-radius: var(--radius-xs);
644
+ padding: 2px var(--space-2);
645
+ cursor: pointer;
646
+ transition:
647
+ border-color var(--dur-soft) var(--ease-out),
648
+ background var(--dur-soft) var(--ease-out),
649
+ color var(--dur-soft) var(--ease-out);
650
+ }
651
+ .chat-select:hover {
652
+ border-color: var(--border-default);
653
+ background: var(--bg-2);
654
+ color: var(--fg-1);
655
+ }
656
+ .chat-select:focus-visible {
657
+ outline: none;
658
+ border-color: var(--accent);
659
+ }
660
+ .chat-send {
661
+ width: 28px;
662
+ height: 28px;
663
+ padding: 0;
664
+ border: none;
665
+ border-radius: var(--radius-sm);
666
+ background: var(--accent);
667
+ color: var(--accent-fg);
668
+ display: inline-flex;
669
+ align-items: center;
670
+ justify-content: center;
671
+ flex-shrink: 0;
672
+ cursor: pointer;
673
+ transition: background var(--dur-soft) var(--ease-out);
674
+ }
675
+ .chat-send:hover {
676
+ background: var(--accent-hover);
677
+ }
678
+ .chat-send:disabled {
679
+ opacity: 0.45;
680
+ cursor: default;
681
+ }
682
+ .chat-foot {
683
+ display: flex;
684
+ align-items: center;
685
+ gap: var(--space-2);
686
+ margin-top: var(--space-2);
687
+ font-size: var(--type-xs);
688
+ color: var(--fg-2);
689
+ }
690
+ .chat-foot-spacer {
691
+ flex: 1;
692
+ }
693
+
694
+ /* Streaming → Stop bar */
695
+ .chat-stopbar {
696
+ display: flex;
697
+ align-items: center;
698
+ gap: var(--space-3);
699
+ }
700
+ .chat-stop-meta {
701
+ font-size: var(--type-xs);
702
+ color: var(--fg-2);
703
+ display: inline-flex;
704
+ align-items: center;
705
+ gap: var(--space-2);
706
+ }
707
+
708
+ /* Not-connected explainer */
709
+ .chat-disabled {
710
+ margin: auto 0;
711
+ display: flex;
712
+ flex-direction: column;
713
+ gap: var(--space-4);
714
+ padding: var(--space-4);
715
+ }
716
+ .chat-disabled-mark {
717
+ color: var(--fg-3);
718
+ align-self: center;
719
+ }
720
+ .chat-disabled-title {
721
+ font-size: var(--type-base);
722
+ font-weight: 600;
723
+ color: var(--fg-0);
724
+ text-align: center;
725
+ }
726
+ .chat-disabled-sub {
727
+ font-size: var(--type-sm);
728
+ color: var(--fg-2);
729
+ line-height: var(--lh-base);
730
+ text-align: center;
731
+ }
732
+ .chat-disabled-sub code {
733
+ font-family: var(--font-mono);
734
+ font-size: var(--type-xs);
735
+ color: var(--fg-0);
736
+ background: var(--bg-3);
737
+ padding: 1px 5px;
738
+ border-radius: var(--radius-xs);
739
+ }
740
+ .chat-trust {
741
+ display: flex;
742
+ flex-direction: column;
743
+ gap: var(--space-2);
744
+ padding: var(--space-3);
745
+ border: 1px solid var(--border-subtle);
746
+ border-radius: var(--radius-sm);
747
+ background: var(--bg-2);
748
+ }
749
+ .chat-trust-row {
750
+ display: flex;
751
+ align-items: center;
752
+ gap: var(--space-2);
753
+ font-size: var(--type-xs);
754
+ color: var(--fg-2);
755
+ }
756
+ .chat-trust-row svg {
757
+ color: var(--status-success);
758
+ flex-shrink: 0;
759
+ }
760
+
761
+ @media (prefers-reduced-motion: reduce) {
762
+ .chat-status-dot--working,
763
+ .chat-tool-dot--run,
764
+ .chat-activity-spin,
765
+ .st-assistant[data-busy='true'],
766
+ .chat-dot--busy,
767
+ .chat-msg {
768
+ animation: none;
769
+ }
770
+ }
771
+ }