forked from bots-garden/ori
| ✨ Introduce new feature(s): ACP web client — Go backend (agent, bridge, httpserver, mockagent) + React SPA (Zed-like agent panel), tests, quality gate PASS | 1 | /* Ori — agent panel styling, in the spirit of Zed's agent panel: |
| 2 | a quiet column of conversation, tool activity and a composer pinned at | |
| ✨ Workspace panel, selectors, previews, desktop app, sandbox template, resizable file tree, light/dark theme | 3 | the bottom. Light is the default palette; the dark one applies when the |
| 4 | theme store stamps data-theme="dark" on <html> (see ui/src/theme.ts). */ | |
| ✨ Introduce new feature(s): ACP web client — Go backend (agent, bridge, httpserver, mockagent) + React SPA (Zed-like agent panel), tests, quality gate PASS | 5 | |
| 6 | :root { | |
| ✨ Workspace panel, selectors, previews, desktop app, sandbox template, resizable file tree, light/dark theme | 7 | color-scheme: light; |
| ✨ Introduce new feature(s): ACP web client — Go backend (agent, bridge, httpserver, mockagent) + React SPA (Zed-like agent panel), tests, quality gate PASS | 8 | font-family: system-ui, -apple-system, "Segoe UI", sans-serif; |
| 9 | ||
| 10 | --bg: #fafafa; | |
| 11 | --panel: #ffffff; | |
| 12 | --text: #1c1c1c; | |
| 13 | --muted: #6b6b6b; | |
| 14 | --border: #e2e2e2; | |
| 15 | --accent: #3b82f6; | |
| 16 | --user-bubble: #e8f0fe; | |
| 17 | --error: #b91c1c; | |
| 18 | --error-bg: #fee2e2; | |
| 19 | --code-bg: #f2f2f2; | |
| 20 | } | |
| 21 | ||
| ✨ Workspace panel, selectors, previews, desktop app, sandbox template, resizable file tree, light/dark theme | 22 | :root[data-theme="dark"] { |
| 23 | color-scheme: dark; | |
| 24 | --bg: #1e2025; | |
| 25 | --panel: #26282e; | |
| 26 | --text: #e6e6e6; | |
| 27 | --muted: #9a9a9a; | |
| 28 | --border: #3a3d45; | |
| 29 | --accent: #60a5fa; | |
| 30 | --user-bubble: #2f3a4f; | |
| 31 | --error: #fca5a5; | |
| 32 | --error-bg: #3f2222; | |
| 33 | --code-bg: #1a1c20; | |
| ✨ Introduce new feature(s): ACP web client — Go backend (agent, bridge, httpserver, mockagent) + React SPA (Zed-like agent panel), tests, quality gate PASS | 34 | } |
| 35 | ||
| 36 | body { | |
| 37 | margin: 0; | |
| 38 | background: var(--bg); | |
| 39 | color: var(--text); | |
| 40 | } | |
| 41 | ||
| 42 | .app { | |
| 43 | display: flex; | |
| 44 | flex-direction: column; | |
| 45 | height: 100vh; | |
| ✨ Workspace panel, selectors, previews, desktop app, sandbox template, resizable file tree, light/dark theme | 46 | } |
| 47 | ||
| 48 | .app-body { | |
| 49 | flex: 1; | |
| 50 | display: flex; | |
| 51 | min-height: 0; | |
| 52 | justify-content: center; | |
| 53 | } | |
| 54 | ||
| 55 | .chat-column { | |
| 56 | display: flex; | |
| 57 | flex-direction: column; | |
| 58 | flex: 1; | |
| ✨ Introduce new feature(s): ACP web client — Go backend (agent, bridge, httpserver, mockagent) + React SPA (Zed-like agent panel), tests, quality gate PASS | 59 | max-width: 52rem; |
| ✨ Workspace panel, selectors, previews, desktop app, sandbox template, resizable file tree, light/dark theme | 60 | min-width: 0; |
| 61 | } | |
| 62 | ||
| 63 | .app-body.with-workspace .chat-column { | |
| 64 | max-width: none; | |
| 65 | flex: 0 0 42%; | |
| 66 | border-right: 1px solid var(--border); | |
| ✨ Introduce new feature(s): ACP web client — Go backend (agent, bridge, httpserver, mockagent) + React SPA (Zed-like agent panel), tests, quality gate PASS | 67 | } |
| 68 | ||
| 69 | /* ---- header ---- */ | |
| 70 | ||
| 71 | .topbar { | |
| 72 | display: flex; | |
| 73 | align-items: baseline; | |
| 74 | gap: 0.75rem; | |
| 75 | padding: 0.6rem 1rem; | |
| 76 | border-bottom: 1px solid var(--border); | |
| 77 | } | |
| 78 | ||
| 79 | .topbar-title { | |
| 80 | font-size: 1.05rem; | |
| 81 | margin: 0; | |
| 82 | } | |
| 83 | ||
| 84 | .status { | |
| 85 | font-size: 0.75rem; | |
| 86 | color: var(--muted); | |
| 87 | } | |
| 88 | ||
| 89 | .status-online::before, | |
| 90 | .status-offline::before, | |
| 91 | .status-connecting::before { | |
| 92 | content: "●"; | |
| 93 | margin-right: 0.3rem; | |
| 94 | } | |
| 95 | ||
| 96 | .status-online::before { | |
| 97 | color: #22c55e; | |
| 98 | } | |
| 99 | ||
| 100 | .status-offline::before { | |
| 101 | color: #ef4444; | |
| 102 | } | |
| 103 | ||
| 104 | .status-connecting::before { | |
| 105 | color: #eab308; | |
| 106 | } | |
| 107 | ||
| ✨ Workspace panel, selectors, previews, desktop app, sandbox template, resizable file tree, light/dark theme | 108 | .topbar-theme, |
| 109 | .topbar-workspace { | |
| 110 | border: 1px solid var(--border); | |
| 111 | border-radius: 6px; | |
| 112 | background: var(--panel); | |
| 113 | color: var(--text); | |
| 114 | font: inherit; | |
| 115 | font-size: 0.8rem; | |
| 116 | padding: 0.25rem 0.7rem; | |
| 117 | cursor: pointer; | |
| 118 | } | |
| 119 | ||
| 120 | .topbar-workspace-active { | |
| 121 | border-color: var(--accent); | |
| 122 | color: var(--accent); | |
| 123 | } | |
| 124 | ||
| 125 | .topbar-theme { | |
| 126 | margin-left: auto; | |
| 127 | padding: 0.25rem 0.5rem; | |
| 128 | } | |
| 129 | ||
| 130 | /* ---- workspace panel ---- */ | |
| 131 | ||
| 132 | .workspace { | |
| 133 | flex: 1; | |
| 134 | display: flex; | |
| 135 | min-width: 0; | |
| 136 | background: var(--bg); | |
| 137 | } | |
| 138 | ||
| 139 | .workspace-hidden { | |
| 140 | display: none; | |
| 141 | } | |
| 142 | ||
| 143 | .workspace-pane { | |
| 144 | height: 100%; | |
| 145 | } | |
| 146 | ||
| 147 | .workspace-pane-hidden { | |
| 148 | display: none; | |
| 149 | } | |
| 150 | ||
| 151 | /* ---- terminal pane ---- */ | |
| 152 | ||
| 153 | /* The terminal keeps a dark background whatever the app theme, like an IDE. */ | |
| 154 | .terminal { | |
| 155 | height: 100%; | |
| 156 | padding: 0.4rem; | |
| 157 | background: #1e1e1e; | |
| 158 | } | |
| 159 | ||
| 160 | .terminal .xterm { | |
| 161 | height: 100%; | |
| 162 | } | |
| 163 | ||
| 164 | .filetree { | |
| 165 | /* Width driven by the workspace store (see Workspace.tsx); 14rem default. */ | |
| 166 | flex: 0 0 var(--filetree-width, 14rem); | |
| 167 | overflow-y: auto; | |
| 168 | padding: 0.5rem; | |
| 169 | font-size: 0.85rem; | |
| 170 | } | |
| 171 | ||
| 172 | /* ---- resize handle between the file tree and the tabs ---- */ | |
| 173 | ||
| 174 | .resize-handle { | |
| 175 | /* The visible line is the 1px border; the padding widens the grab area. */ | |
| 176 | flex: 0 0 1px; | |
| 177 | box-sizing: content-box; | |
| 178 | padding: 0 3px; | |
| 179 | margin: 0 -3px; | |
| 180 | background: var(--border); | |
| 181 | background-clip: content-box; | |
| 182 | cursor: col-resize; | |
| 183 | touch-action: none; | |
| 184 | z-index: 1; | |
| 185 | } | |
| 186 | ||
| 187 | .resize-handle:hover, | |
| 188 | .resize-handle-active { | |
| 189 | background-color: var(--accent); | |
| 190 | } | |
| 191 | ||
| 192 | .resize-handle:focus-visible { | |
| 193 | outline: 2px solid var(--accent); | |
| 194 | outline-offset: -1px; | |
| 195 | } | |
| 196 | ||
| 197 | .filetree-header { | |
| 198 | display: flex; | |
| 199 | align-items: center; | |
| 200 | justify-content: space-between; | |
| 201 | color: var(--muted); | |
| 202 | font-size: 0.75rem; | |
| 203 | text-transform: uppercase; | |
| 204 | letter-spacing: 0.05em; | |
| 205 | margin-bottom: 0.4rem; | |
| 206 | } | |
| 207 | ||
| 208 | .filetree-refresh { | |
| 209 | border: none; | |
| 210 | background: none; | |
| 211 | color: var(--muted); | |
| 212 | cursor: pointer; | |
| 213 | font-size: 0.9rem; | |
| 214 | } | |
| 215 | ||
| 216 | .filetree-error { | |
| 217 | color: var(--error); | |
| 218 | font-size: 0.8rem; | |
| 219 | } | |
| 220 | ||
| 221 | .filetree-loading { | |
| 222 | color: var(--muted); | |
| 223 | font-style: italic; | |
| 224 | } | |
| 225 | ||
| 226 | .filetree-list { | |
| 227 | list-style: none; | |
| 228 | margin: 0; | |
| 229 | padding: 0; | |
| 230 | } | |
| 231 | ||
| 232 | .filetree-list-nested { | |
| 233 | /* VS Code-style indent guide */ | |
| 234 | margin-left: 0.55rem; | |
| 235 | border-left: 1px solid var(--border); | |
| 236 | } | |
| 237 | ||
| 238 | .filetree-entry { | |
| 239 | display: flex; | |
| 240 | align-items: center; | |
| 241 | gap: 0.3rem; | |
| 242 | width: 100%; | |
| 243 | text-align: left; | |
| 244 | border: none; | |
| 245 | background: none; | |
| 246 | color: var(--text); | |
| 247 | font: inherit; | |
| 248 | font-size: 0.82rem; | |
| 249 | padding: 0.14rem 0.3rem; | |
| 250 | border-radius: 4px; | |
| 251 | cursor: pointer; | |
| 252 | white-space: nowrap; | |
| 253 | } | |
| 254 | ||
| 255 | .filetree-entry:hover { | |
| 256 | background: var(--panel); | |
| 257 | } | |
| 258 | ||
| 259 | .filetree-active { | |
| 260 | background: var(--user-bubble); | |
| 261 | } | |
| 262 | ||
| 263 | .filetree-chevron { | |
| 264 | flex: 0 0 0.7rem; | |
| 265 | color: var(--muted); | |
| 266 | font-size: 0.8rem; | |
| 267 | line-height: 1; | |
| 268 | text-align: center; | |
| 269 | } | |
| 270 | ||
| 271 | .filetree-icon { | |
| 272 | flex: 0 0 1rem; | |
| 273 | width: 1rem; | |
| 274 | height: 1rem; | |
| 275 | } | |
| 276 | ||
| 277 | .filetree-name { | |
| 278 | overflow: hidden; | |
| 279 | text-overflow: ellipsis; | |
| 280 | } | |
| 281 | ||
| 282 | .workspace-main { | |
| 283 | flex: 1; | |
| 284 | display: flex; | |
| 285 | flex-direction: column; | |
| 286 | min-width: 0; | |
| 287 | } | |
| 288 | ||
| 289 | .workspace-tabs { | |
| 290 | display: flex; | |
| 291 | gap: 0.25rem; | |
| 292 | border-bottom: 1px solid var(--border); | |
| 293 | padding: 0.3rem 0.5rem 0; | |
| 294 | } | |
| 295 | ||
| 296 | .workspace-tab { | |
| 297 | border: 1px solid transparent; | |
| 298 | border-bottom: none; | |
| 299 | border-radius: 6px 6px 0 0; | |
| 300 | background: none; | |
| 301 | color: var(--muted); | |
| 302 | font: inherit; | |
| 303 | font-size: 0.85rem; | |
| 304 | padding: 0.3rem 0.9rem; | |
| 305 | cursor: pointer; | |
| 306 | } | |
| 307 | ||
| 308 | .workspace-tab-active { | |
| 309 | border-color: var(--border); | |
| 310 | background: var(--panel); | |
| 311 | color: var(--text); | |
| 312 | } | |
| 313 | ||
| 314 | .workspace-content { | |
| 315 | flex: 1; | |
| 316 | min-height: 0; | |
| 317 | overflow: auto; | |
| 318 | position: relative; | |
| 319 | } | |
| 320 | ||
| 321 | .pane-empty { | |
| 322 | color: var(--muted); | |
| 323 | font-style: italic; | |
| 324 | padding: 1rem; | |
| 325 | } | |
| 326 | ||
| 327 | .pane-error { | |
| 328 | color: var(--error); | |
| 329 | padding: 1rem; | |
| 330 | } | |
| 331 | ||
| 332 | /* ---- preview pane ---- */ | |
| 333 | ||
| 334 | .preview { | |
| 335 | display: flex; | |
| 336 | flex-direction: column; | |
| 337 | height: 100%; | |
| 338 | } | |
| 339 | ||
| 340 | .pane-header { | |
| 341 | display: flex; | |
| 342 | align-items: center; | |
| 343 | gap: 0.6rem; | |
| 344 | padding: 0.35rem 0.8rem; | |
| 345 | border-bottom: 1px solid var(--border); | |
| 346 | font-size: 0.85rem; | |
| 347 | } | |
| 348 | ||
| 349 | .pane-path { | |
| 350 | font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; | |
| 351 | overflow: hidden; | |
| 352 | text-overflow: ellipsis; | |
| 353 | white-space: nowrap; | |
| 354 | } | |
| 355 | ||
| 356 | .pane-modes { | |
| 357 | display: flex; | |
| 358 | gap: 0.25rem; | |
| 359 | margin-left: auto; | |
| 360 | } | |
| 361 | ||
| 362 | .pane-mode { | |
| 363 | border: 1px solid var(--border); | |
| 364 | border-radius: 6px; | |
| 365 | background: none; | |
| 366 | color: var(--muted); | |
| 367 | font: inherit; | |
| 368 | font-size: 0.75rem; | |
| 369 | padding: 0.15rem 0.6rem; | |
| 370 | cursor: pointer; | |
| 371 | } | |
| 372 | ||
| 373 | .pane-mode-active { | |
| 374 | background: var(--panel); | |
| 375 | color: var(--text); | |
| 376 | border-color: var(--accent); | |
| 377 | } | |
| 378 | ||
| 379 | .pane-action { | |
| 380 | border: 1px solid var(--border); | |
| 381 | border-radius: 6px; | |
| 382 | background: none; | |
| 383 | color: var(--text); | |
| 384 | font: inherit; | |
| 385 | font-size: 0.75rem; | |
| 386 | padding: 0.15rem 0.6rem; | |
| 387 | cursor: pointer; | |
| 388 | } | |
| 389 | ||
| 390 | .pane-modes + .pane-action { | |
| 391 | margin-left: 0; | |
| 392 | } | |
| 393 | ||
| 394 | .pane-header .pane-action:last-child { | |
| 395 | margin-left: auto; | |
| 396 | } | |
| 397 | ||
| 398 | .pane-modes + .pane-action:last-child { | |
| 399 | margin-left: 0; | |
| 400 | } | |
| 401 | ||
| 402 | .preview-body { | |
| 403 | flex: 1; | |
| 404 | min-height: 0; | |
| 405 | overflow: auto; | |
| 406 | } | |
| 407 | ||
| 408 | .preview-rendered { | |
| 409 | padding: 1rem; | |
| 410 | max-width: 48rem; | |
| 411 | } | |
| 412 | ||
| 413 | /* ---- image preview ---- */ | |
| 414 | ||
| 415 | .image-view { | |
| 416 | margin: 0; | |
| 417 | padding: 1rem; | |
| 418 | display: flex; | |
| 419 | flex-direction: column; | |
| 420 | gap: 0.5rem; | |
| 421 | align-items: flex-start; | |
| 422 | } | |
| 423 | ||
| 424 | .image-view-canvas { | |
| 425 | max-width: 100%; | |
| 426 | border: 1px solid var(--border); | |
| 427 | border-radius: 6px; | |
| 428 | --check: rgba(127, 127, 127, 0.18); | |
| 429 | background-color: var(--panel); | |
| 430 | background-image: linear-gradient(45deg, var(--check) 25%, transparent 25%), | |
| 431 | linear-gradient(-45deg, var(--check) 25%, transparent 25%), | |
| 432 | linear-gradient(45deg, transparent 75%, var(--check) 75%), | |
| 433 | linear-gradient(-45deg, transparent 75%, var(--check) 75%); | |
| 434 | background-size: 16px 16px; | |
| 435 | background-position: 0 0, 0 8px, 8px -8px, -8px 0; | |
| 436 | } | |
| 437 | ||
| 438 | .image-view-canvas img { | |
| 439 | display: block; | |
| 440 | max-width: 100%; | |
| 441 | height: auto; | |
| 442 | } | |
| 443 | ||
| 444 | .image-view-meta { | |
| 445 | color: var(--muted); | |
| 446 | font-size: 0.8rem; | |
| 447 | font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; | |
| 448 | } | |
| 449 | ||
| 450 | /* ---- draw.io preview ---- */ | |
| 451 | ||
| 452 | .drawio-view { | |
| 453 | display: flex; | |
| 454 | flex-direction: column; | |
| 455 | height: 100%; | |
| 456 | } | |
| 457 | ||
| 458 | .drawio-frame { | |
| 459 | flex: 1; | |
| 460 | width: 100%; | |
| 461 | min-height: 20rem; | |
| 462 | border: none; | |
| 463 | background: var(--panel); | |
| 464 | } | |
| 465 | ||
| 466 | .drawio-view-loading .drawio-frame { | |
| 467 | visibility: hidden; | |
| 468 | flex: 0; | |
| 469 | min-height: 0; | |
| 470 | } | |
| 471 | ||
| 472 | .drawio-notice { | |
| 473 | margin: 1rem; | |
| 474 | padding: 0.6rem 0.8rem; | |
| 475 | border: 1px solid var(--border); | |
| 476 | border-radius: 6px; | |
| 477 | color: var(--muted); | |
| 478 | font-size: 0.85rem; | |
| 479 | } | |
| 480 | ||
| 481 | /* ---- editor pane ---- */ | |
| 482 | ||
| 483 | .editor { | |
| 484 | display: flex; | |
| 485 | flex-direction: column; | |
| 486 | height: 100%; | |
| 487 | } | |
| 488 | ||
| 489 | .editor-body { | |
| 490 | flex: 1; | |
| 491 | min-height: 0; | |
| 492 | } | |
| 493 | ||
| 494 | .pane-saved { | |
| 495 | color: #22c55e; | |
| 496 | font-size: 0.75rem; | |
| 497 | } | |
| 498 | ||
| 499 | .pane-error-inline { | |
| 500 | color: var(--error); | |
| 501 | font-size: 0.75rem; | |
| 502 | overflow: hidden; | |
| 503 | text-overflow: ellipsis; | |
| 504 | white-space: nowrap; | |
| 505 | } | |
| 506 | ||
| 507 | .editor .pane-action { | |
| 508 | margin-left: auto; | |
| 509 | } | |
| 510 | ||
| 511 | .editor .pane-saved, | |
| 512 | .editor .pane-error-inline { | |
| 513 | margin-left: auto; | |
| 514 | } | |
| 515 | ||
| 516 | .editor .pane-saved + .pane-action, | |
| 517 | .editor .pane-error-inline + .pane-action { | |
| 518 | margin-left: 0.5rem; | |
| 519 | } | |
| 520 | ||
| ✨ Introduce new feature(s): ACP web client — Go backend (agent, bridge, httpserver, mockagent) + React SPA (Zed-like agent panel), tests, quality gate PASS | 521 | /* ---- thread ---- */ |
| 522 | ||
| 523 | .thread { | |
| 524 | flex: 1; | |
| 525 | overflow-y: auto; | |
| 526 | padding: 1rem; | |
| 527 | display: flex; | |
| 528 | flex-direction: column; | |
| 529 | gap: 0.75rem; | |
| 530 | } | |
| 531 | ||
| ✨ Workspace panel, selectors, previews, desktop app, sandbox template, resizable file tree, light/dark theme | 532 | .thread-empty { |
| ✨ Introduce new feature(s): ACP web client — Go backend (agent, bridge, httpserver, mockagent) + React SPA (Zed-like agent panel), tests, quality gate PASS | 533 | color: var(--muted); |
| 534 | font-size: 0.85rem; | |
| 535 | font-style: italic; | |
| 536 | } | |
| 537 | ||
| ✨ Workspace panel, selectors, previews, desktop app, sandbox template, resizable file tree, light/dark theme | 538 | /* ---- working indicator ---- */ |
| 539 | ||
| 540 | .working { | |
| 541 | display: flex; | |
| 542 | align-items: center; | |
| 543 | gap: 0.5rem; | |
| 544 | color: var(--muted); | |
| 545 | font-size: 0.85rem; | |
| 546 | font-style: italic; | |
| 547 | } | |
| 548 | ||
| 549 | .spinner { | |
| 550 | width: 0.85rem; | |
| 551 | height: 0.85rem; | |
| 552 | border: 2px solid var(--border); | |
| 553 | border-top-color: var(--accent); | |
| 554 | border-radius: 50%; | |
| 555 | animation: spinner-turn 0.8s linear infinite; | |
| 556 | } | |
| 557 | ||
| 558 | @keyframes spinner-turn { | |
| 559 | to { | |
| 560 | transform: rotate(360deg); | |
| 561 | } | |
| 562 | } | |
| 563 | ||
| ✨ Introduce new feature(s): ACP web client — Go backend (agent, bridge, httpserver, mockagent) + React SPA (Zed-like agent panel), tests, quality gate PASS | 564 | .message { |
| 565 | border-radius: 8px; | |
| 566 | padding: 0.55rem 0.8rem; | |
| 567 | line-height: 1.5; | |
| 568 | overflow-wrap: anywhere; | |
| 569 | } | |
| 570 | ||
| 571 | .message-user { | |
| 572 | align-self: flex-end; | |
| 573 | background: var(--user-bubble); | |
| 574 | white-space: pre-wrap; | |
| 575 | max-width: 85%; | |
| 576 | } | |
| 577 | ||
| 578 | .message-agent { | |
| 579 | background: var(--panel); | |
| 580 | border: 1px solid var(--border); | |
| 581 | } | |
| 582 | ||
| 583 | .message-error { | |
| 584 | background: var(--error-bg); | |
| 585 | color: var(--error); | |
| 586 | font-size: 0.85rem; | |
| 587 | } | |
| 588 | ||
| 589 | /* ---- markdown ---- */ | |
| 590 | ||
| 591 | .markdown > :first-child { | |
| 592 | margin-top: 0; | |
| 593 | } | |
| 594 | ||
| 595 | .markdown > :last-child { | |
| 596 | margin-bottom: 0; | |
| 597 | } | |
| 598 | ||
| 599 | .markdown pre { | |
| 600 | background: var(--code-bg); | |
| 601 | border: 1px solid var(--border); | |
| 602 | border-radius: 6px; | |
| 603 | padding: 0.6rem; | |
| 604 | overflow-x: auto; | |
| 605 | } | |
| 606 | ||
| 607 | .markdown code { | |
| 608 | background: var(--code-bg); | |
| 609 | border-radius: 4px; | |
| 610 | padding: 0.1rem 0.3rem; | |
| 611 | font-size: 0.85em; | |
| 612 | } | |
| 613 | ||
| 614 | .markdown pre code { | |
| 615 | background: none; | |
| 616 | padding: 0; | |
| 617 | } | |
| 618 | ||
| 619 | .markdown table { | |
| 620 | border-collapse: collapse; | |
| 621 | } | |
| 622 | ||
| 623 | .markdown th, | |
| 624 | .markdown td { | |
| 625 | border: 1px solid var(--border); | |
| 626 | padding: 0.3rem 0.6rem; | |
| 627 | } | |
| 628 | ||
| 629 | /* ---- thoughts ---- */ | |
| 630 | ||
| 631 | .thought { | |
| 632 | border: 1px dashed var(--border); | |
| 633 | border-radius: 8px; | |
| 634 | padding: 0.35rem 0.8rem; | |
| 635 | color: var(--muted); | |
| 636 | font-size: 0.9rem; | |
| 637 | } | |
| 638 | ||
| 639 | .thought-summary { | |
| 640 | cursor: pointer; | |
| 641 | user-select: none; | |
| 642 | } | |
| 643 | ||
| ✨ Workspace panel, selectors, previews, desktop app, sandbox template, resizable file tree, light/dark theme | 644 | .thought-live .thought-summary { |
| 645 | cursor: default; | |
| 646 | margin: 0; | |
| 647 | } | |
| 648 | ||
| ✨ Introduce new feature(s): ACP web client — Go backend (agent, bridge, httpserver, mockagent) + React SPA (Zed-like agent panel), tests, quality gate PASS | 649 | .thought-body { |
| 650 | padding-top: 0.4rem; | |
| 651 | } | |
| 652 | ||
| 653 | /* ---- tool calls ---- */ | |
| 654 | ||
| 655 | .tool { | |
| 656 | border: 1px solid var(--border); | |
| 657 | border-left: 3px solid var(--muted); | |
| 658 | border-radius: 8px; | |
| 659 | padding: 0.35rem 0.8rem; | |
| 660 | background: var(--panel); | |
| 661 | font-size: 0.9rem; | |
| 662 | } | |
| 663 | ||
| 664 | .tool-in_progress { | |
| 665 | border-left-color: var(--accent); | |
| 666 | } | |
| 667 | ||
| 668 | .tool-completed { | |
| 669 | border-left-color: #22c55e; | |
| 670 | } | |
| 671 | ||
| 672 | .tool-failed { | |
| 673 | border-left-color: #ef4444; | |
| 674 | } | |
| 675 | ||
| 676 | .tool-summary { | |
| 677 | display: flex; | |
| 678 | align-items: center; | |
| 679 | gap: 0.5rem; | |
| 680 | cursor: pointer; | |
| 681 | user-select: none; | |
| 682 | } | |
| 683 | ||
| 684 | .tool-title { | |
| 685 | flex: 1; | |
| 686 | overflow: hidden; | |
| 687 | text-overflow: ellipsis; | |
| 688 | white-space: nowrap; | |
| 689 | } | |
| 690 | ||
| 691 | .tool-status { | |
| 692 | font-size: 0.72rem; | |
| 693 | color: var(--muted); | |
| 694 | border: 1px solid var(--border); | |
| 695 | border-radius: 999px; | |
| 696 | padding: 0.05rem 0.5rem; | |
| 697 | } | |
| 698 | ||
| 699 | .tool-status-failed { | |
| 700 | color: var(--error); | |
| 701 | } | |
| 702 | ||
| 703 | .tool-body { | |
| 704 | padding: 0.4rem 0 0.2rem; | |
| 705 | } | |
| 706 | ||
| 707 | .tool-locations { | |
| 708 | margin: 0 0 0.4rem; | |
| 709 | padding-left: 1.1rem; | |
| 710 | color: var(--muted); | |
| 711 | } | |
| 712 | ||
| 713 | .tool-diff { | |
| 714 | background: var(--code-bg); | |
| 715 | border: 1px solid var(--border); | |
| 716 | border-radius: 6px; | |
| 717 | padding: 0.5rem; | |
| 718 | overflow-x: auto; | |
| 719 | } | |
| 720 | ||
| 721 | .tool-diff-path { | |
| 722 | display: block; | |
| 723 | margin-bottom: 0.3rem; | |
| 724 | color: var(--muted); | |
| 725 | } | |
| 726 | ||
| 727 | .tool-diff pre { | |
| 728 | margin: 0; | |
| 729 | font-size: 0.8rem; | |
| 730 | } | |
| 731 | ||
| 732 | .tool-diff-old { | |
| 733 | color: #dc2626; | |
| 734 | } | |
| 735 | ||
| 736 | .tool-diff-new { | |
| 737 | color: #16a34a; | |
| 738 | } | |
| 739 | ||
| 740 | .tool-terminal { | |
| 741 | color: var(--muted); | |
| 742 | font-style: italic; | |
| 743 | } | |
| 744 | ||
| ✨ Workspace panel, selectors, previews, desktop app, sandbox template, resizable file tree, light/dark theme | 745 | .inline-code { |
| 746 | background: var(--code-bg); | |
| 747 | border: 1px solid var(--border); | |
| 748 | border-radius: 4px; | |
| 749 | padding: 0 0.3rem; | |
| 750 | font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, "Liberation Mono", | |
| 751 | monospace; | |
| 752 | font-size: 0.85em; | |
| 753 | } | |
| 754 | ||
| 755 | .tool-output { | |
| 756 | background: var(--code-bg); | |
| 757 | border: 1px solid var(--border); | |
| 758 | border-radius: 6px; | |
| 759 | padding: 0.5rem; | |
| 760 | overflow-x: auto; | |
| 761 | margin: 0.3rem 0; | |
| 762 | font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, "Liberation Mono", | |
| 763 | monospace; | |
| 764 | font-size: 0.8rem; | |
| 765 | line-height: 1.4; | |
| 766 | } | |
| 767 | ||
| ✨ Introduce new feature(s): ACP web client — Go backend (agent, bridge, httpserver, mockagent) + React SPA (Zed-like agent panel), tests, quality gate PASS | 768 | /* ---- plan ---- */ |
| 769 | ||
| 770 | .plan { | |
| 771 | margin: 0 1rem; | |
| 772 | border: 1px solid var(--border); | |
| 773 | border-radius: 8px; | |
| 774 | padding: 0.4rem 0.8rem; | |
| 775 | background: var(--panel); | |
| 776 | font-size: 0.85rem; | |
| 777 | } | |
| 778 | ||
| 779 | .plan-summary { | |
| 780 | cursor: pointer; | |
| 781 | user-select: none; | |
| 782 | color: var(--muted); | |
| 783 | } | |
| 784 | ||
| 785 | .plan-entries { | |
| 786 | list-style: none; | |
| 787 | margin: 0.4rem 0 0.2rem; | |
| 788 | padding: 0; | |
| 789 | } | |
| 790 | ||
| 791 | .plan-entry { | |
| 792 | padding: 0.1rem 0; | |
| 793 | } | |
| 794 | ||
| 795 | .plan-entry-completed { | |
| 796 | color: var(--muted); | |
| 797 | text-decoration: line-through; | |
| 798 | } | |
| 799 | ||
| 800 | .plan-entry-in_progress { | |
| 801 | color: var(--accent); | |
| 802 | } | |
| 803 | ||
| 804 | /* ---- permissions ---- */ | |
| 805 | ||
| 806 | .permission { | |
| 807 | margin: 0.5rem 1rem 0; | |
| 808 | border: 1px solid var(--accent); | |
| 809 | border-radius: 8px; | |
| 810 | padding: 0.6rem 0.8rem; | |
| 811 | background: var(--panel); | |
| 812 | } | |
| 813 | ||
| 814 | .permission-title { | |
| 815 | margin: 0 0 0.5rem; | |
| 816 | font-size: 0.9rem; | |
| 817 | } | |
| 818 | ||
| 819 | .permission-options { | |
| 820 | display: flex; | |
| 821 | gap: 0.5rem; | |
| 822 | flex-wrap: wrap; | |
| 823 | } | |
| 824 | ||
| 825 | .permission-option { | |
| 826 | border: 1px solid var(--border); | |
| 827 | border-radius: 6px; | |
| 828 | padding: 0.35rem 0.8rem; | |
| 829 | font: inherit; | |
| 830 | font-size: 0.85rem; | |
| 831 | cursor: pointer; | |
| 832 | background: var(--panel); | |
| 833 | color: var(--text); | |
| 834 | } | |
| 835 | ||
| 836 | .permission-allow_once, | |
| 837 | .permission-allow_always { | |
| 838 | background: var(--accent); | |
| 839 | border-color: var(--accent); | |
| 840 | color: #ffffff; | |
| 841 | } | |
| 842 | ||
| 843 | .permission-reject_once, | |
| 844 | .permission-reject_always { | |
| 845 | border-color: #dc2626; | |
| 846 | color: #dc2626; | |
| 847 | } | |
| 848 | ||
| 849 | /* ---- composer ---- */ | |
| 850 | ||
| 851 | .composer { | |
| 852 | display: flex; | |
| 853 | gap: 0.5rem; | |
| 854 | padding: 0.75rem 1rem 1rem; | |
| 855 | border-top: 1px solid var(--border); | |
| 856 | } | |
| 857 | ||
| ✨ Workspace panel, selectors, previews, desktop app, sandbox template, resizable file tree, light/dark theme | 858 | .composer-field { |
| 859 | flex: 1; | |
| 860 | position: relative; | |
| 861 | display: flex; | |
| 862 | } | |
| 863 | ||
| ✨ Introduce new feature(s): ACP web client — Go backend (agent, bridge, httpserver, mockagent) + React SPA (Zed-like agent panel), tests, quality gate PASS | 864 | .composer-input { |
| 865 | flex: 1; | |
| 866 | resize: none; | |
| 867 | background: var(--panel); | |
| 868 | color: var(--text); | |
| 869 | border: 1px solid var(--border); | |
| 870 | border-radius: 8px; | |
| 871 | padding: 0.55rem 0.7rem; | |
| 872 | font: inherit; | |
| 873 | } | |
| 874 | ||
| 875 | .composer-input:focus { | |
| 876 | outline: 2px solid var(--accent); | |
| 877 | outline-offset: -1px; | |
| 878 | } | |
| 879 | ||
| 880 | .composer-send, | |
| 881 | .composer-stop { | |
| 882 | align-self: flex-end; | |
| 883 | border: none; | |
| 884 | border-radius: 8px; | |
| 885 | padding: 0.55rem 1rem; | |
| 886 | font: inherit; | |
| 887 | cursor: pointer; | |
| 888 | color: #ffffff; | |
| 889 | } | |
| 890 | ||
| 891 | .composer-send { | |
| 892 | background: var(--accent); | |
| 893 | } | |
| 894 | ||
| 895 | .composer-send:disabled { | |
| 896 | opacity: 0.5; | |
| 897 | cursor: default; | |
| 898 | } | |
| 899 | ||
| 900 | .composer-stop { | |
| 901 | background: #dc2626; | |
| 902 | } | |
| ✨ Workspace panel, selectors, previews, desktop app, sandbox template, resizable file tree, light/dark theme | 903 | |
| 904 | /* ---- completion popup (@ files, / skills) ---- */ | |
| 905 | ||
| 906 | .completion { | |
| 907 | position: absolute; | |
| 908 | left: 0; | |
| 909 | right: 0; | |
| 910 | bottom: calc(100% + 0.35rem); | |
| 911 | max-height: 16rem; | |
| 912 | overflow-y: auto; | |
| 913 | margin: 0; | |
| 914 | padding: 0.25rem; | |
| 915 | list-style: none; | |
| 916 | background: var(--panel); | |
| 917 | border: 1px solid var(--border); | |
| 918 | border-radius: 8px; | |
| 919 | box-shadow: 0 6px 24px rgba(0, 0, 0, 0.18); | |
| 920 | font-size: 0.85rem; | |
| 921 | z-index: 5; | |
| 922 | } | |
| 923 | ||
| 924 | .completion-item { | |
| 925 | display: flex; | |
| 926 | align-items: baseline; | |
| 927 | gap: 0.5rem; | |
| 928 | padding: 0.35rem 0.6rem; | |
| 929 | border-radius: 6px; | |
| 930 | cursor: pointer; | |
| 931 | } | |
| 932 | ||
| 933 | .completion-item-active { | |
| 934 | background: var(--user-bubble); | |
| 935 | } | |
| 936 | ||
| 937 | .completion-label { | |
| 938 | font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; | |
| 939 | white-space: nowrap; | |
| 940 | } | |
| 941 | ||
| 942 | .completion-description { | |
| 943 | flex: 1; | |
| 944 | min-width: 0; | |
| 945 | color: var(--muted); | |
| 946 | overflow: hidden; | |
| 947 | text-overflow: ellipsis; | |
| 948 | white-space: nowrap; | |
| 949 | } | |
| 950 | ||
| 951 | .completion-source { | |
| 952 | margin-left: auto; | |
| 953 | font-size: 0.7rem; | |
| 954 | text-transform: uppercase; | |
| 955 | letter-spacing: 0.04em; | |
| 956 | color: var(--muted); | |
| 957 | border: 1px solid var(--border); | |
| 958 | border-radius: 999px; | |
| 959 | padding: 0 0.45rem; | |
| 960 | } | |
| 961 | ||
| 962 | .completion-source-skill { | |
| 963 | color: var(--accent); | |
| 964 | border-color: var(--accent); | |
| 965 | } | |
| Add copy-paste functionality for code blocks and completion widgets | 966 | |
| 967 | /* ---- copy button ---- */ | |
| 968 | ||
| 969 | .copy-btn { | |
| 970 | display: inline-flex; | |
| 971 | align-items: center; | |
| 972 | justify-content: center; | |
| 973 | padding: 0.35rem; | |
| 974 | background: var(--panel); | |
| 975 | border: 1px solid var(--border); | |
| 976 | border-radius: 4px; | |
| 977 | color: var(--muted); | |
| 978 | cursor: pointer; | |
| 979 | transition: all 0.15s ease; | |
| 980 | font-size: 0; | |
| 981 | } | |
| 982 | ||
| 983 | .copy-btn:hover { | |
| 984 | background: var(--bg); | |
| 985 | color: var(--text); | |
| 986 | border-color: var(--accent); | |
| 987 | } | |
| 988 | ||
| 989 | .copy-btn:active { | |
| 990 | transform: scale(0.95); | |
| 991 | } | |
| 992 | ||
| 993 | .copy-btn-copied { | |
| 994 | color: #22c55e; | |
| 995 | border-color: #22c55e; | |
| 996 | } | |
| 997 | ||
| 998 | .copy-btn svg { | |
| 999 | display: block; | |
| 1000 | } | |
| 1001 | ||
| 1002 | /* Copy button positioning in various contexts */ | |
| 1003 | ||
| 1004 | .code-block-wrapper { | |
| 1005 | position: relative; | |
| 1006 | } | |
| 1007 | ||
| 1008 | .code-block-wrapper .copy-btn { | |
| 1009 | position: absolute; | |
| 1010 | top: 0.5rem; | |
| 1011 | right: 0.5rem; | |
| 1012 | z-index: 1; | |
| 1013 | } | |
| 1014 | ||
| 1015 | .thought-summary .copy-btn { | |
| 1016 | float: right; | |
| 1017 | margin-left: 0.5rem; | |
| 1018 | } | |
| 1019 | ||
| 1020 | .tool-summary .copy-btn { | |
| 1021 | margin-left: auto; | |
| 1022 | } | |
| 1023 | ||
| 1024 | .message-agent .copy-btn { | |
| 1025 | float: right; | |
| 1026 | margin: 0 0 0.5rem 0.5rem; | |
| 1027 | } |