@xenosystem/agent-interface-ui 0.1.108 → 0.1.110
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.
- package/dist/agent.css +476 -25
- package/package.json +6 -6
package/dist/agent.css
CHANGED
|
@@ -7567,6 +7567,10 @@ a.xeno-source-card:focus-visible {
|
|
|
7567
7567
|
/* the bench's motion rule: a person who asked for less motion gets none — no rise, no glide, no breathing */
|
|
7568
7568
|
@media (prefers-reduced-motion: reduce) {
|
|
7569
7569
|
:where(.xa-app, .xa-transcript, .xa-dock), :where(.xa-app, .xa-transcript, .xa-dock) *, :where(.xa-app, .xa-transcript, .xa-dock) *::before, :where(.xa-app, .xa-transcript, .xa-dock) *::after { animation: none !important; transition: none !important; }
|
|
7570
|
+
/* animations are off, so an exit has to be its end state: the outgoing tool line and the settling dot go at once
|
|
7571
|
+
instead of sitting under what replaced them until their element is removed */
|
|
7572
|
+
.xa-line .xa-cur .xa-gl.xa-out, .xa-line .xa-cur .xa-t.xa-out { display: none; }
|
|
7573
|
+
.xa-turn.xa-settle .xa-line .xa-dot, .xa-turn.xa-settle .xa-line.xa-thoughtsolo > .xa-vr { opacity: 0; }
|
|
7570
7574
|
}
|
|
7571
7575
|
/* back to the live end of the thread — shows only when you have scrolled up (bench `.tobottom`) */
|
|
7572
7576
|
.xa-tobottom { position: absolute; right: 22px; z-index: 5; width: 24px; height: 24px; border-radius: 4px; background: var(--xa-plate); border: 1px solid var(--xa-line-tip); color: var(--xa-t3); opacity: 0; pointer-events: none; transform: translateY(6px); transition: opacity 160ms linear, transform 160ms var(--xa-ease); }
|
|
@@ -8029,10 +8033,6 @@ a.xeno-source-card:focus-visible {
|
|
|
8029
8033
|
.xa-row.xa-think .xa-full { min-height: 0; overflow: hidden; font-size: 11.5px; line-height: 16px; color: var(--xa-t4); }
|
|
8030
8034
|
.xa-row.xa-think .xa-full p { margin: 0 0 4px; } .xa-row.xa-think .xa-full p:last-child { margin: 0; }
|
|
8031
8035
|
/* the plan row keeps the list folded under it for the record; the list itself rides the composer */
|
|
8032
|
-
.xa-row.xa-plan .xa-head { display: flex; align-items: center; gap: 9px; flex: 1; min-width: 0; cursor: pointer; }
|
|
8033
|
-
.xa-planwrap { flex-basis: 100%; margin: -9px 0 0 43px; display: grid; grid-template-rows: 0fr; transition: grid-template-rows 220ms var(--xa-ease), margin 220ms var(--xa-ease); }
|
|
8034
|
-
.xa-row.xa-plan.xa-open .xa-planwrap { grid-template-rows: 1fr; margin: 0 0 0 43px; }
|
|
8035
|
-
.xa-planwrap > div { min-height: 0; overflow: hidden; }
|
|
8036
8036
|
.xa-plan-list { display: flex; flex-direction: column; padding-bottom: 2px; }
|
|
8037
8037
|
.xa-plan-list .xa-item, .xa-tasks .xa-item { display: flex; align-items: center; gap: 9px; min-height: 22px; font-size: 11px; color: var(--xa-t4); }
|
|
8038
8038
|
.xa-plan-list .xa-item .xa-sq, .xa-tasks .xa-item .xa-sq { flex: none; width: 6px; height: 6px; border-radius: 1px; border: 1px solid var(--xa-t5); background: none; transition: background 160ms linear, border-color 160ms linear; }
|
|
@@ -8304,6 +8304,10 @@ img.xa-fav { padding: 1px; background: #fff; }
|
|
|
8304
8304
|
.xa-tasks.xa-open .xa-listwrap { grid-template-rows: 1fr; }
|
|
8305
8305
|
.xa-tasks .xa-list { min-height: 0; overflow: hidden; }
|
|
8306
8306
|
.xa-tasks .xa-list .xa-in { padding: 2px 10px 6px; border-top: 1px solid rgba(var(--xa-ink), 0.05); max-height: 160px; overflow-y: auto; scrollbar-width: thin; scrollbar-color: rgba(var(--xa-ink), 0.12) transparent; }
|
|
8307
|
+
/* while the person is typing, the trays above the field step back: the field is the focus, the trays are context.
|
|
8308
|
+
Hover or focus on a tray brings it back to full strength. */
|
|
8309
|
+
.xa-tasks { transition: opacity 160ms linear; }
|
|
8310
|
+
.xa-dock:has(.xa-field textarea:focus) .xa-tasks:not(:hover):not(:focus-within) { opacity: 0.45; }
|
|
8307
8311
|
|
|
8308
8312
|
/* a background run's controls — on the row that started it, and on the tray's items. Text, never a
|
|
8309
8313
|
button plate: a row is a sentence, and these are the two verbs it accepts. */
|
|
@@ -8320,6 +8324,92 @@ img.xa-fav { padding: 1px; background: #fff; }
|
|
|
8320
8324
|
|
|
8321
8325
|
/* the thread is still opening: the clock line alone, the reply not yet begun */
|
|
8322
8326
|
.xa-turn.xa-opening .xa-rail { min-height: 0; }
|
|
8327
|
+
|
|
8328
|
+
|
|
8329
|
+
|
|
8330
|
+
/* =============================================================================
|
|
8331
|
+
The rail — XENO AGENT PANEL - SPEC.md D10 and XENO AGENT TRANSCRIPT - STEP KINDS.md, unchanged:
|
|
8332
|
+
the family's glyph in an 18px square on one rail that joins the markers, the box EARNED (bare and
|
|
8333
|
+
breathing on the 1.4s clock while the step runs, boxed when it settles), `verb · object` then the
|
|
8334
|
+
result right-aligned and tabular.
|
|
8335
|
+
|
|
8336
|
+
One amendment (owner, 2026-10-16): an OPENED step becomes a plate — the row and what it prints, in one
|
|
8337
|
+
full-width surface one step lighter than the ground — instead of its detail hanging off the rail on
|
|
8338
|
+
branches. The rail runs through the plate's marker column unbroken; nothing about a closed step changes.
|
|
8339
|
+
============================================================================= */
|
|
8340
|
+
.xa-rail { margin: 0 -8px; padding: 0 8px; } /* room for an open plate on both sides, evenly — the thread scrubber sits outside the column, so it needs no gutter here */
|
|
8341
|
+
.xa-row > .xa-res { margin-left: auto; padding-left: 12px; }
|
|
8342
|
+
.xa-row > .xa-chev { margin-left: 8px; }
|
|
8343
|
+
.xa-row.xa-hasd:not(.xa-open):not(.xa-now) { cursor: pointer; }
|
|
8344
|
+
.xa-row.xa-hasd:not(.xa-open):not(.xa-now):hover > .xa-verb,
|
|
8345
|
+
.xa-row.xa-hasd:not(.xa-open):not(.xa-now):hover > .xa-obj { color: var(--xa-t2); }
|
|
8346
|
+
.xa-row.xa-hasd:not(.xa-open):not(.xa-now):hover > .xa-chev { color: var(--xa-t3); }
|
|
8347
|
+
|
|
8348
|
+
/* rhythm: 28px rows, 4px apart (was 12) — the rail stays one unbroken line from marker to marker */
|
|
8349
|
+
.xa-rail { gap: 4px; }
|
|
8350
|
+
.xa-row:not(.xa-note):not(.xa-plan):not(.xa-think) { align-items: center; row-gap: 0; }
|
|
8351
|
+
.xa-row:not(.xa-now):not(.xa-open) > .xa-dwrap { margin-top: 0; } /* a folded detail adds no height under the band */
|
|
8352
|
+
.xa-row:not(.xa-note):not(.xa-plan):not(.xa-think) > .xa-ic { margin-top: 5px; margin-bottom: 5px; } /* one 28px band; the icon and words centre in it */
|
|
8353
|
+
.xa-row::before { left: 8.5px; top: 23px; bottom: -9px; }
|
|
8354
|
+
.xa-row:has(+ .xa-row:not(.xa-note):not(.xa-plan):not(.xa-sub):is(.xa-open, .xa-now:has(> .xa-dwrap .xa-detail :is(pre:not(:empty), .xa-file, .xa-it))))::before, .xa-row:has(+ .xa-row.xa-think.xa-open)::before { bottom: -4px; } /* into a plate: stop at its edge */ /* from this marker's bottom edge to the next marker's top edge, across the 4px gap */
|
|
8355
|
+
|
|
8356
|
+
/* the plate: margin and padding cancel, so the marker, words and rail stay exactly where they were.
|
|
8357
|
+
A step is on a plate whenever something is printed under it — opened, or a live step streaming its output
|
|
8358
|
+
(a dev server, a test run) — and a closed step shows no plate. */
|
|
8359
|
+
.xa-row:not(.xa-note):not(.xa-plan):not(.xa-sub):is(.xa-open, .xa-now:has(> .xa-dwrap .xa-detail :is(pre:not(:empty), .xa-file, .xa-it))),
|
|
8360
|
+
.xa-row.xa-think.xa-open {
|
|
8361
|
+
margin: 0 -8px; padding: 3px 8px 8px; border-radius: 4px;
|
|
8362
|
+
background: var(--xa-plate); box-shadow: inset 0 0 0 1px var(--xa-line-soft);
|
|
8363
|
+
}
|
|
8364
|
+
/* a closed step you can open takes no plate on hover (owner, 2026-10-16): its words brighten, nothing moves */
|
|
8365
|
+
/* a plate is itself the step: the rail stops at its edge and resumes from its bottom edge to the next marker,
|
|
8366
|
+
never running through what the step printed */
|
|
8367
|
+
.xa-row:not(.xa-note):not(.xa-plan):not(.xa-sub):is(.xa-open, .xa-now:has(> .xa-dwrap .xa-detail :is(pre:not(:empty), .xa-file, .xa-it)))::before,
|
|
8368
|
+
.xa-row.xa-think.xa-open::before { left: 16.5px; top: 100%; bottom: -4px; }
|
|
8369
|
+
.xa-row.xa-open > .xa-verb, .xa-row.xa-open > .xa-obj { color: var(--xa-t2); }
|
|
8370
|
+
|
|
8371
|
+
/* inside the plate the detail spans it: the same 8px from the line above, the sides and the bottom */
|
|
8372
|
+
.xa-row:is(.xa-open, .xa-now) .xa-dwrap { margin: 0; }
|
|
8373
|
+
.xa-row:is(.xa-open, .xa-now) .xa-detail, .xa-row:is(.xa-open, .xa-now) .xa-dwrap .xa-detail { margin: 8px 0 0 0; }
|
|
8374
|
+
/* every detail sits in the same inner box: the well, a hairline, small corners */
|
|
8375
|
+
.xa-row:is(.xa-open, .xa-now) .xa-detail:not(.xa-output):not(.xa-diff):not(.xa-slice):not(.xa-nest) {
|
|
8376
|
+
padding: 6px 10px; border: 1px solid rgba(var(--xa-ink), 0.06); border-radius: 4px; background: var(--xa-well);
|
|
8377
|
+
}
|
|
8378
|
+
.xa-row.xa-think.xa-open .xa-fullwrap { margin: 3px 0 0 0; }
|
|
8379
|
+
.xa-row:is(.xa-open, .xa-now) .xa-dwrap::before, .xa-row:is(.xa-open, .xa-now) .xa-dwrap::after,
|
|
8380
|
+
.xa-row:is(.xa-open, .xa-now) .xa-dwrap > div::before, .xa-row:is(.xa-open, .xa-now) .xa-dwrap > div::after,
|
|
8381
|
+
.xa-row:is(.xa-open, .xa-now) .xa-detail .xa-it::before, .xa-row:is(.xa-open, .xa-now) .xa-detail .xa-file::before,
|
|
8382
|
+
.xa-row:is(.xa-open, .xa-now) .xa-detail.xa-matches .xa-lns::before,
|
|
8383
|
+
.xa-row:is(.xa-open, .xa-now) .xa-detail.xa-matches .xa-ln .xa-n::before { display: none !important; }
|
|
8384
|
+
.xa-row.xa-open .xa-detail.xa-output .xa-foot:not(:has(.xa-cwd)) { display: none; } /* exit and time are on the row */
|
|
8385
|
+
|
|
8386
|
+
/* the edited-files card spans the transcript */
|
|
8387
|
+
.xa-files { width: 100%; max-width: none; box-sizing: border-box; }
|
|
8388
|
+
|
|
8389
|
+
/* matches: the file, then its lines indented to the file name, numbers right-aligned in one column */
|
|
8390
|
+
.xa-row.xa-open .xa-detail.xa-matches .xa-ln { padding-left: 0; gap: 8px; }
|
|
8391
|
+
.xa-row.xa-open .xa-detail.xa-matches .xa-ln .xa-n { width: 26px; }
|
|
8392
|
+
/* the diff: the step's line already names the file, so the hunk header keeps only the range; no empty space under the code */
|
|
8393
|
+
.xa-row .xa-detail.xa-diff .xa-hunk > .xa-mono + .xa-mono { display: none; }
|
|
8394
|
+
.xa-row .xa-detail.xa-diff pre { padding-bottom: 6px; }
|
|
8395
|
+
.xa-row .xa-detail.xa-diff, .xa-row .xa-detail.xa-output { margin-top: 2px; }
|
|
8396
|
+
|
|
8397
|
+
/* the thinking line opens the same way */
|
|
8398
|
+
|
|
8399
|
+
|
|
8400
|
+
/* An ask answered above the box reads on its step's own line: the answer in the result column, quiet; the
|
|
8401
|
+
marker already carries the verdict's colour (xa-ok / xa-bad). Pending, it says what it waits on, brighter. */
|
|
8402
|
+
.xa-row > .xa-res[data-tone] { font-size: 11px; color: var(--xa-t5); }
|
|
8403
|
+
.xa-row > .xa-res[data-tone='pending'] { color: var(--xa-t2); }
|
|
8404
|
+
.xa-row > .xa-res[data-tone='no'], .xa-row > .xa-res[data-tone='cancelled'] { color: var(--xa-t5); }
|
|
8405
|
+
/* the options a question offered, opened inside the step's plate */
|
|
8406
|
+
.xa-row .xa-detail.xa-q-rec-body { margin: 8px 0 0; padding: 6px 10px; border: 1px solid rgba(var(--xa-ink), 0.06); border-radius: 4px; background: var(--xa-well); }
|
|
8407
|
+
.xa-row .xa-detail.xa-q-rec-body ol { margin: 0; padding: 0; list-style: none; display: flex; flex-direction: column; gap: 2px; }
|
|
8408
|
+
.xa-row .xa-detail.xa-q-rec-body li { display: flex; align-items: center; gap: 9px; min-height: 22px; font-size: 11.5px; color: var(--xa-t4); }
|
|
8409
|
+
.xa-row .xa-detail.xa-q-rec-body li[data-picked='true'] { color: var(--xa-t1); }
|
|
8410
|
+
.xa-row .xa-detail.xa-q-rec-body .xa-q-key { width: 18px; height: 18px; border-radius: 3px; }
|
|
8411
|
+
.xa-row .xa-detail.xa-q-rec-body .xa-q-keyc { font-size: 10px; }
|
|
8412
|
+
.xa-row .xa-detail.xa-q-rec-body .xa-q-rec-why { margin-top: 6px; font-size: 11.5px; color: var(--xa-t3); }
|
|
8323
8413
|
/* =============================================================================
|
|
8324
8414
|
The XENO Agent composer — D9 / D9a / D11 of `XENO AGENT PANEL - SPEC.md`.
|
|
8325
8415
|
-----------------------------------------------------------------------------
|
|
@@ -8386,16 +8476,16 @@ img.xa-fav { padding: 1px; background: #fff; }
|
|
|
8386
8476
|
|
|
8387
8477
|
.xa-dock .xa-box { display: flex; flex-direction: column; justify-content: center; gap: 9px; min-height: 46px; padding: 9px 11px; background: var(--xa-plate); border: 1px solid var(--xa-line); border-radius: 6px; }
|
|
8388
8478
|
.xa-dock .xa-box.xa-off { opacity: 0.55; }
|
|
8389
|
-
.xa-dock .xa-box textarea {
|
|
8479
|
+
.xa-dock .xa-box .xa-field textarea {
|
|
8390
8480
|
display: block; width: 100%; margin: 0; padding: 0; border: 0; background: transparent; resize: none;
|
|
8391
8481
|
font: inherit; font-size: 13px; line-height: 1.5; color: var(--xa-ink-text); caret-color: var(--xa-t1);
|
|
8392
8482
|
min-height: 19.5px; max-height: 220px; overflow-y: auto; scrollbar-width: thin;
|
|
8393
8483
|
}
|
|
8394
|
-
.xa-dock .xa-box textarea::placeholder { color: var(--xa-t6); }
|
|
8484
|
+
.xa-dock .xa-box .xa-field textarea::placeholder { color: var(--xa-t6); }
|
|
8395
8485
|
/* the bench's `textarea:focus { outline: none }`: the box is the field's frame, so a host's focus ring
|
|
8396
8486
|
(`*:focus-visible`, drawn outside the field) reads as a stray stroke over it — DESIGN_SYSTEM.md exempts
|
|
8397
8487
|
text entry, and only text entry, from the ring */
|
|
8398
|
-
.xa-dock .xa-box textarea:focus, .xa-dock .xa-box textarea:focus-visible { outline: none; box-shadow: none; }
|
|
8488
|
+
.xa-dock .xa-box .xa-field textarea:focus, .xa-dock .xa-box .xa-field textarea:focus-visible { outline: none; box-shadow: none; }
|
|
8399
8489
|
.xa-dock .xa-tiles { display: flex; flex-wrap: wrap; gap: 7px; }
|
|
8400
8490
|
.xa-dock .xa-tile { position: relative; width: 44px; height: 44px; background: var(--xa-tile); border: 1px solid var(--xa-line-tip); border-radius: 4px; display: flex; align-items: center; justify-content: center; font-size: 11px; font-weight: 500; color: var(--xa-t3); }
|
|
8401
8491
|
.xa-dock .xa-tile.xa-img { background: var(--xa-tile-img); overflow: visible; }
|
|
@@ -8421,6 +8511,14 @@ img.xa-fav { padding: 1px; background: #fff; }
|
|
|
8421
8511
|
of the square once the group has folded */
|
|
8422
8512
|
.xa-dock .xa-status { display: none; position: absolute; right: 31px; top: 50%; transform: translateY(-50%); font-size: 11px; color: var(--xa-t4); white-space: nowrap; }
|
|
8423
8513
|
.xa-dock .xa-controls.xa-running .xa-status { display: inline; animation: xa-stin 200ms ease-out var(--xa-stin, 520ms) both; }
|
|
8514
|
+
/* the fold above is an animation, and reduced motion switches animations off, which left the lane and model
|
|
8515
|
+
labels standing under `Working · 2s`. Without motion the running state is reached directly. */
|
|
8516
|
+
@media (prefers-reduced-motion: reduce) {
|
|
8517
|
+
.xa-dock .xa-controls.xa-running .xa-mgrp { display: none; }
|
|
8518
|
+
/* the same for everything else whose exit is an animation: go straight to where the animation ends */
|
|
8519
|
+
.xa-dock .xa-permgrp.xa-sink { visibility: hidden; }
|
|
8520
|
+
.xa-dock .xa-permgrp .xa-permicon.xa-out, .xa-dock .xa-mgrp .xa-laneicon.xa-out { display: none; }
|
|
8521
|
+
}
|
|
8424
8522
|
@keyframes xa-stin { from { opacity: 0; transform: translate(6px, -50%); } to { opacity: 1; transform: translate(0, -50%); } }
|
|
8425
8523
|
.xa-dock .xa-controls .xa-grow { flex: 1; }
|
|
8426
8524
|
.xa-dock .xa-ic { width: 24px; height: 24px; border-radius: 4px; color: var(--xa-t4); }
|
|
@@ -8535,7 +8633,7 @@ img.xa-fav { padding: 1px; background: #fff; }
|
|
|
8535
8633
|
.xa-dock .xa-menu.xa-typed .xa-none { padding: 7px 9px; font-size: 11px; color: var(--xa-t5); }
|
|
8536
8634
|
/* a taken reference is a chip in the SENT message (`.xa-chip`, with its glyph); in the box it is the
|
|
8537
8635
|
words as typed — the bench's field is the textarea and nothing else */
|
|
8538
|
-
.xa-dock .xa-box textarea { letter-spacing: -0.006em; } /* a form control does not inherit it */
|
|
8636
|
+
.xa-dock .xa-box .xa-field textarea { letter-spacing: -0.006em; } /* a form control does not inherit it */
|
|
8539
8637
|
.xa-dock .xa-chip { display: inline-flex; align-items: center; gap: 4px; vertical-align: -2px; padding: 1px 5px 1px 4px; background: rgba(var(--xa-ink),0.07); border: 1px solid var(--xa-line-soft); border-radius: 3px; font-size: 12px; line-height: 1.3; color: var(--xa-t1); white-space: nowrap; }
|
|
8540
8638
|
.xa-dock .xa-chip svg { flex: none; color: var(--xa-t4); }
|
|
8541
8639
|
.xa-dock .xa-mrow { display: flex; align-items: center; gap: 9px; width: 100%; padding: 7px 9px; border-radius: 4px; text-align: left; font-size: 12px; color: var(--xa-t3); }
|
|
@@ -8657,6 +8755,373 @@ img.xa-fav { padding: 1px; background: #fff; }
|
|
|
8657
8755
|
The dot is not animated, so it can simply own its spacing the way the icon does. This belongs
|
|
8658
8756
|
in the prototype too. */
|
|
8659
8757
|
.xa-dock .xa-mgrp .xa-txt.xa-down .xa-dot { margin-right: 6px; }
|
|
8758
|
+
/* =============================================================================
|
|
8759
|
+
The agent's question, docked on the composer (QuestionPanel.tsx) — the XENO platform chat's
|
|
8760
|
+
question panel (xeno-platform `chatQuestion.css`, approved 2026-10-02), on the Agent interface's own
|
|
8761
|
+
tokens so it follows both themes. Same card the queue uses (queue.css), on purpose: the slot above the
|
|
8762
|
+
box holds one kind of card.
|
|
8763
|
+
============================================================================= */
|
|
8764
|
+
.xa-dock .xa-above { display: flex; flex-direction: column; gap: 8px; }
|
|
8765
|
+
|
|
8766
|
+
.xa-q {
|
|
8767
|
+
display: flex; flex-direction: column;
|
|
8768
|
+
background: var(--xa-plate); border: 1px solid var(--xa-line); border-radius: 8px;
|
|
8769
|
+
box-shadow: 0 1px 2px rgb(0 0 0 / 0.25), 0 12px 32px rgb(0 0 0 / 0.3);
|
|
8770
|
+
overflow: hidden; outline: none; color: var(--xa-t2);
|
|
8771
|
+
animation: xa-q-rise 0.34s var(--xa-ease) both;
|
|
8772
|
+
}
|
|
8773
|
+
/* The panel takes focus only so its keys work. It is a container, not a control: it never draws a focus
|
|
8774
|
+
ring (a ring that appears on open and vanishes on the first click reads as a glitch). */
|
|
8775
|
+
.xa-q:focus, .xa-q:focus-visible { outline: none; border-color: var(--xa-line); }
|
|
8776
|
+
@keyframes xa-q-rise { from { opacity: 0; transform: translateY(6px); } to { opacity: 1; transform: none; } }
|
|
8777
|
+
|
|
8778
|
+
/* The marker: a filled square, never animated. Bright while the question waits, dim once answered. */
|
|
8779
|
+
.xa-q-sq { flex: none; width: 10px; height: 10px; border-radius: 2.5px; background: var(--xa-t1); }
|
|
8780
|
+
|
|
8781
|
+
.xa-q-head { display: flex; align-items: flex-start; gap: 10px; padding: 12px 12px 6px 14px; }
|
|
8782
|
+
.xa-q-mark { flex: none; width: 20px; height: 20px; display: flex; align-items: center; justify-content: center; }
|
|
8783
|
+
.xa-q-text { flex: 1; min-width: 0; font-size: 14px; font-weight: 500; line-height: 20px; color: var(--xa-t1); user-select: text; }
|
|
8784
|
+
.xa-q-text small { display: block; font-size: 11.5px; font-weight: 400; line-height: 1.4; color: var(--xa-t4); margin-top: 2px; }
|
|
8785
|
+
.xa-q-fold { flex: none; width: 26px; height: 26px; margin: -3px -4px 0 0; border-radius: 6px; color: var(--xa-t4); display: inline-flex; align-items: center; justify-content: center; background: none; border: 0; cursor: pointer; }
|
|
8786
|
+
.xa-q-fold:hover { background: var(--xa-wash-hover); color: var(--xa-t1); }
|
|
8787
|
+
|
|
8788
|
+
.xa-q-list { list-style: none; margin: 0; padding: 2px 6px 4px; display: flex; flex-direction: column; gap: 1px; max-height: min(46vh, 420px); overflow-y: auto; overscroll-behavior: contain; }
|
|
8789
|
+
.xa-q-opt {
|
|
8790
|
+
width: 100%; display: flex; align-items: flex-start; gap: 10px; padding: 7px 8px; border-radius: 6px;
|
|
8791
|
+
text-align: left; font: inherit; font-size: 13.5px; line-height: 1.45; color: var(--xa-t2);
|
|
8792
|
+
background: none; border: 0; cursor: pointer; transition: background 0.12s;
|
|
8793
|
+
}
|
|
8794
|
+
.xa-q-opt:hover { background: var(--xa-wash-hover); }
|
|
8795
|
+
.xa-q-opt[aria-checked='true'] { background: var(--xa-wash); color: var(--xa-t1); }
|
|
8796
|
+
.xa-q-opt[data-active='true'] { background: var(--xa-wash-hover); }
|
|
8797
|
+
.xa-q-opt:focus-visible { outline: none; background: var(--xa-wash-hover); }
|
|
8798
|
+
.xa-q-key {
|
|
8799
|
+
flex: none; width: 20px; height: 20px; border-radius: 5px; border: 1px solid var(--xa-line-tip); background: var(--xa-well);
|
|
8800
|
+
color: var(--xa-t4); display: inline-flex; align-items: center; justify-content: center; transition: background 0.12s, color 0.12s;
|
|
8801
|
+
}
|
|
8802
|
+
.xa-q-opt[data-multi='true'] .xa-q-key { border-radius: 3px; }
|
|
8803
|
+
.xa-q-opt[aria-checked='true'] .xa-q-key { background: var(--xa-send); border-color: var(--xa-send); color: var(--xa-ground); }
|
|
8804
|
+
/* Centre the CAPITAL, not the line box: a line box reserves descender room capitals never use. */
|
|
8805
|
+
.xa-q-keyc { display: block; font-size: 11px; font-weight: 600; line-height: 1; text-box: trim-both cap alphabetic; }
|
|
8806
|
+
.xa-q-opt-text { flex: 1; min-width: 0; }
|
|
8807
|
+
|
|
8808
|
+
.xa-q-why { margin: 4px 12px 0; }
|
|
8809
|
+
.xa-q-why textarea, .xa-q-why input {
|
|
8810
|
+
display: block; width: 100%; box-sizing: border-box; resize: none; min-height: 36px; max-height: 120px; border: 1px solid var(--xa-line-tip);
|
|
8811
|
+
background: var(--xa-well); color: var(--xa-t1); border-radius: 6px; padding: 8px 10px; font: inherit; font-size: 13px; line-height: 1.45; outline: none;
|
|
8812
|
+
}
|
|
8813
|
+
.xa-q-why textarea:focus, .xa-q-why input:focus { border-color: var(--xa-t4); box-shadow: none; }
|
|
8814
|
+
.xa-q-why textarea::placeholder, .xa-q-why input::placeholder { color: var(--xa-t6); }
|
|
8815
|
+
.xa-q-error { margin: 6px 14px 0; font-size: 12px; color: var(--xa-red); }
|
|
8816
|
+
|
|
8817
|
+
.xa-q-foot { display: flex; align-items: center; gap: 6px; padding: 8px 10px 10px 12px; }
|
|
8818
|
+
.xa-q-addwhy { display: inline-flex; align-items: center; gap: 5px; font: inherit; font-size: 12.5px; color: var(--xa-t4); padding: 5px 6px; margin-left: -6px; border-radius: 6px; background: none; border: 0; cursor: pointer; }
|
|
8819
|
+
.xa-q-addwhy:hover { color: var(--xa-t1); background: var(--xa-wash-hover); }
|
|
8820
|
+
.xa-q-keys { margin-left: auto; margin-right: 4px; font-size: 11.5px; color: var(--xa-t5); white-space: nowrap; }
|
|
8821
|
+
.xa-q-keys kbd { font: inherit; font-size: 10.5px; padding: 1px 5px; border: 1px solid var(--xa-line-tip); border-radius: 4px; background: var(--xa-well); }
|
|
8822
|
+
.xa-q-btn { height: 30px; padding: 0 12px; border-radius: 6px; font: inherit; font-size: 12.5px; font-weight: 500; white-space: nowrap; border: 0; cursor: pointer; transition: background 0.12s, color 0.12s, opacity 0.12s; }
|
|
8823
|
+
.xa-q-btn[data-variant='ghost'] { background: none; color: var(--xa-t4); }
|
|
8824
|
+
.xa-q-btn[data-variant='ghost']:hover { background: var(--xa-wash-hover); color: var(--xa-t1); }
|
|
8825
|
+
.xa-q-btn[data-variant='primary'] { background: var(--xa-send); color: var(--xa-ground); }
|
|
8826
|
+
.xa-q-btn[data-variant='primary']:hover:not(:disabled) { background: var(--xa-send-hover); }
|
|
8827
|
+
.xa-q-btn:disabled { opacity: 0.35; cursor: not-allowed; }
|
|
8828
|
+
|
|
8829
|
+
/* Folded (Esc): one line, still waiting. */
|
|
8830
|
+
.xa-q-bar { width: 100%; display: flex; align-items: center; gap: 9px; padding: 10px 12px; text-align: left; font: inherit; font-size: 13px; background: none; border: 0; cursor: pointer; color: var(--xa-t1); }
|
|
8831
|
+
.xa-q-bar:hover { background: var(--xa-wash); }
|
|
8832
|
+
.xa-q-bar .xa-q-sq { margin: 0 5px; }
|
|
8833
|
+
.xa-q-bar-q { flex: 1; min-width: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; color: var(--xa-t4); }
|
|
8834
|
+
.xa-q-bar b { flex: none; font-weight: 600; }
|
|
8835
|
+
.xa-q-bar-open { flex: none; font-size: 12px; color: var(--xa-t4); }
|
|
8836
|
+
|
|
8837
|
+
/* The record inside the transcript: one line, expands on click. */
|
|
8838
|
+
.xa-q-rec { margin: 4px 0; border: 1px solid var(--xa-line); border-radius: 7px; background: var(--xa-plate); overflow: hidden; max-width: 560px; }
|
|
8839
|
+
.xa-q-rec-line { width: 100%; display: flex; align-items: center; gap: 8px; padding: 8px 11px; font: inherit; font-size: 12.5px; line-height: 1.4; text-align: left; color: var(--xa-t4); background: none; border: 0; cursor: pointer; }
|
|
8840
|
+
.xa-q-rec-line:hover { background: var(--xa-wash); }
|
|
8841
|
+
.xa-q-rec .xa-q-sq { background: var(--xa-t5); }
|
|
8842
|
+
.xa-q-rec[data-pending='true'] .xa-q-sq { background: var(--xa-t1); }
|
|
8843
|
+
.xa-q-rec-q { flex: 1; min-width: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
|
|
8844
|
+
.xa-q-rec-a { flex: none; max-width: 46%; color: var(--xa-t1); font-weight: 500; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
|
|
8845
|
+
.xa-q-rec-chev { flex: none; display: flex; transition: transform 0.15s; }
|
|
8846
|
+
.xa-q-rec[data-open='true'] .xa-q-rec-chev { transform: rotate(180deg); }
|
|
8847
|
+
.xa-q-rec-body { border-top: 1px solid var(--xa-line); padding: 6px 6px 8px; user-select: text; }
|
|
8848
|
+
.xa-q-rec-qq { padding: 6px 6px 4px; font-size: 13px; font-weight: 500; color: var(--xa-t1); }
|
|
8849
|
+
.xa-q-rec-body ol { list-style: none; margin: 0; padding: 0; }
|
|
8850
|
+
.xa-q-rec-body li { display: flex; gap: 9px; align-items: flex-start; padding: 5px 6px; border-radius: 6px; font-size: 12.5px; line-height: 1.45; color: var(--xa-t4); }
|
|
8851
|
+
.xa-q-rec-body li[data-picked='true'] { background: var(--xa-wash); color: var(--xa-t1); }
|
|
8852
|
+
.xa-q-rec-body li .xa-q-key { width: 18px; height: 18px; border-radius: 4px; }
|
|
8853
|
+
.xa-q-rec-body li[data-picked='true'] .xa-q-key { background: var(--xa-send); border-color: var(--xa-send); color: var(--xa-ground); }
|
|
8854
|
+
.xa-q-rec-why { margin: 6px 6px 0; font-size: 12.5px; line-height: 1.5; color: var(--xa-t1); white-space: pre-wrap; }
|
|
8855
|
+
.xa-q-rec-why span { color: var(--xa-t4); }
|
|
8856
|
+
|
|
8857
|
+
@container (max-width: 520px) {
|
|
8858
|
+
.xa-q-keys { display: none; }
|
|
8859
|
+
.xa-q-list { max-height: 26vh; }
|
|
8860
|
+
.xa-q-opt { font-size: 13px; line-height: 1.4; padding: 6px; }
|
|
8861
|
+
.xa-q-head { padding: 10px 10px 4px 12px; }
|
|
8862
|
+
.xa-q-text { font-size: 13.5px; }
|
|
8863
|
+
.xa-q-foot { padding: 6px 8px 8px 10px; }
|
|
8864
|
+
}
|
|
8865
|
+
@media (prefers-reduced-motion: reduce) { .xa-q { animation: none; } }
|
|
8866
|
+
|
|
8867
|
+
/* =============================================================================
|
|
8868
|
+
A permission in the same slot (PermissionPanel.tsx): the question's card, carrying what the agent wants to
|
|
8869
|
+
do — the command as a block, or the folder and why — and the three answers: this once, refuse, remember.
|
|
8870
|
+
============================================================================= */
|
|
8871
|
+
.xa-perm .xa-perm-ic { color: var(--xa-t2); border-radius: 4px; background: var(--xa-box); box-shadow: inset 0 0 0 1px var(--xa-line-soft); animation: xa-breathe 1.4s ease-in-out infinite; }
|
|
8872
|
+
.xa-perm-body { margin: 2px 12px 4px 44px; padding: 8px 10px; font-size: 12px; line-height: 18px; color: var(--xa-t1); white-space: pre-wrap; word-break: break-all; background: var(--xa-well); border: 1px solid rgba(var(--xa-ink), 0.06); border-radius: 4px; user-select: text; }
|
|
8873
|
+
.xa-perm-note { margin: 2px 12px 4px 44px; font-size: 12.5px; line-height: 1.45; color: var(--xa-t3); }
|
|
8874
|
+
.xa-perm-always { display: inline-flex; gap: 2px; }
|
|
8875
|
+
.xa-perm-always kbd { font: inherit; font-size: 10px; padding: 0 4px; border: 1px solid var(--xa-line-tip); border-radius: 3px; background: var(--xa-well); color: var(--xa-t4); }
|
|
8876
|
+
.xa-q-addwhy:disabled { opacity: 0.35; cursor: not-allowed; }
|
|
8877
|
+
.xa-perm .xa-q-foot { padding-left: 44px; }
|
|
8878
|
+
@media (prefers-reduced-motion: reduce) { .xa-perm .xa-perm-ic { animation: none; } }
|
|
8879
|
+
|
|
8880
|
+
/* the permission's record in the transcript: one line, coloured once answered */
|
|
8881
|
+
.xa-q-rec[data-agent-permission-record] .xa-q-rec-line { cursor: default; }
|
|
8882
|
+
.xa-q-rec[data-agent-permission-record] .xa-q-rec-line:hover { background: none; }
|
|
8883
|
+
.xa-q-rec[data-tone='yes'] .xa-q-sq { background: var(--xa-green); }
|
|
8884
|
+
.xa-q-rec[data-tone='no'] .xa-q-sq, .xa-q-rec[data-tone='cancelled'] .xa-q-sq { background: var(--xa-red); }
|
|
8885
|
+
|
|
8886
|
+
/* The ask is answered above the box now, so in collapsed mode the turn does not surface it a second time: the
|
|
8887
|
+
clock line keeps saying what the agent is waiting on, and the rail stays folded. (Spec D10's "an ask still
|
|
8888
|
+
surfaces in collapsed mode" is met by the card above the composer.) */
|
|
8889
|
+
.xa-collapsed .xa-turn.xa-live.xa-asking:not(.xa-open):has(.xa-rail [data-agent-permission-record], .xa-rail [data-agent-question-record]) .xa-railwrap { grid-template-rows: 0fr; }
|
|
8890
|
+
.xa-collapsed .xa-turn.xa-live.xa-asking:not(.xa-open):has(.xa-rail [data-agent-permission-record], .xa-rail [data-agent-question-record]) .xa-line .xa-vr { display: block; }
|
|
8891
|
+
/* the ticker is a flex row (glyph slot, then the words): `revert` here made it inline, and the words — absolutely
|
|
8892
|
+
placed inside their own box — landed on the glyph */
|
|
8893
|
+
.xa-collapsed .xa-turn.xa-live.xa-asking:not(.xa-open):has(.xa-rail [data-agent-permission-record], .xa-rail [data-agent-question-record]) .xa-line .xa-cur { display: flex; }
|
|
8894
|
+
|
|
8895
|
+
/* =============================================================================
|
|
8896
|
+
The ask lives INSIDE the input box, at its top (owner, 2026-10-16): the box grows upward to hold it, a
|
|
8897
|
+
hairline divides it from the field. Full width, no card of its own — the box IS the card.
|
|
8898
|
+
============================================================================= */
|
|
8899
|
+
.xa-dock .xa-box.xa-asking { padding-top: 0; }
|
|
8900
|
+
.xa-box-ask { margin: 0 -11px 2px; border-bottom: 1px solid var(--xa-line); }
|
|
8901
|
+
.xa-box-ask .xa-q { background: none; border: 0; border-radius: 0; box-shadow: none; }
|
|
8902
|
+
.xa-box-ask .xa-q[data-folded='true'] .xa-q-bar { padding: 9px 12px; }
|
|
8903
|
+
.xa-box-ask .xa-q-head { padding: 11px 11px 4px 12px; }
|
|
8904
|
+
.xa-box-ask .xa-q-list { padding: 2px 4px 2px; }
|
|
8905
|
+
.xa-box-ask .xa-q-foot { padding: 6px 10px 9px 12px; }
|
|
8906
|
+
.xa-box-ask .xa-perm .xa-q-foot { padding-left: 42px; }
|
|
8907
|
+
.xa-box-ask .xa-perm-body, .xa-box-ask .xa-perm-note { margin-left: 42px; margin-right: 11px; }
|
|
8908
|
+
/* while the agent waits on an answer the box IS the ask: the message field steps aside (it comes back the
|
|
8909
|
+
moment the ask is answered, with whatever was typed still in it) */
|
|
8910
|
+
.xa-dock .xa-box.xa-asking { padding: 0; gap: 0; }
|
|
8911
|
+
.xa-dock .xa-box.xa-asking > :not(.xa-box-ask):not(input[type='file']) { display: none !important; }
|
|
8912
|
+
.xa-dock .xa-box.xa-asking .xa-box-ask { margin: 0; border-bottom: 0; }
|
|
8913
|
+
|
|
8914
|
+
/* the ask, in the same family (inside the box: the box is its border) */
|
|
8915
|
+
.xa-box-ask .xa-q-head { align-items: center; padding: 8px 10px 4px 12px; gap: 9px; }
|
|
8916
|
+
.xa-box-ask .xa-q-mark { width: 18px; height: 18px; }
|
|
8917
|
+
.xa-box-ask .xa-q-sq { width: 6px; height: 6px; border-radius: 1.5px; animation: xa-breathe 1.4s ease-in-out infinite; }
|
|
8918
|
+
.xa-box-ask .xa-q-text { font-size: 12.5px; font-weight: 500; line-height: 18px; }
|
|
8919
|
+
.xa-box-ask .xa-q-text small { font-size: 11px; color: var(--xa-t4); margin-top: 0; }
|
|
8920
|
+
.xa-box-ask .xa-q-fold { width: 22px; height: 22px; margin: 0; border-radius: 3px; color: var(--xa-t6); }
|
|
8921
|
+
.xa-box-ask .xa-q-list { padding: 0 6px 2px; gap: 0; }
|
|
8922
|
+
.xa-box-ask .xa-q-opt { padding: 5px 6px; gap: 9px; border-radius: 3px; font-size: 12.5px; line-height: 18px; }
|
|
8923
|
+
.xa-box-ask .xa-q-key { width: 18px; height: 18px; }
|
|
8924
|
+
.xa-box-ask .xa-q-keyc { font-size: 10px; border-radius: 3px; }
|
|
8925
|
+
.xa-box-ask .xa-q-foot { padding: 4px 8px 8px 12px; gap: 4px; }
|
|
8926
|
+
.xa-box-ask .xa-q-addwhy { font-size: 11.5px; padding: 4px 6px; border-radius: 3px; }
|
|
8927
|
+
.xa-box-ask .xa-q-keys { font-size: 10.5px; }
|
|
8928
|
+
.xa-box-ask .xa-q-keys kbd { font-size: 10px; padding: 0 4px; border-radius: 3px; }
|
|
8929
|
+
.xa-box-ask .xa-q-btn { height: 24px; padding: 0 10px; border-radius: 3px; font-size: 11.5px; }
|
|
8930
|
+
.xa-box-ask .xa-perm .xa-q-foot, .xa-box-ask .xa-perm-body, .xa-box-ask .xa-perm-note { margin-left: 0; padding-left: 12px; }
|
|
8931
|
+
.xa-box-ask .xa-perm .xa-q-foot { padding-left: 39px; }
|
|
8932
|
+
.xa-box-ask .xa-perm-body { margin: 2px 10px 4px 39px; padding: 6px 9px; font-size: 11.5px; line-height: 16px; }
|
|
8933
|
+
.xa-box-ask .xa-perm-note { margin: 2px 10px 4px 39px; padding: 0; font-size: 11.5px; }
|
|
8934
|
+
.xa-box-ask .xa-perm .xa-perm-ic { width: 18px; height: 18px; border-radius: 3px; }
|
|
8935
|
+
/* the reasoning field, in the footer where "Add your reasoning" was — same line, same left edge */
|
|
8936
|
+
.xa-q-whyin {
|
|
8937
|
+
flex: 1 1 auto; min-width: 0; resize: none; overflow-y: auto; box-sizing: border-box;
|
|
8938
|
+
margin: 0 6px 0 -6px; padding: 4px 6px; min-height: 24px; max-height: 96px;
|
|
8939
|
+
font: inherit; font-size: 12px; line-height: 16px; color: var(--xa-t1);
|
|
8940
|
+
background: var(--xa-well); border: 1px solid var(--xa-line-soft); border-radius: 3px; outline: none;
|
|
8941
|
+
}
|
|
8942
|
+
.xa-q-whyin::placeholder { color: var(--xa-t5); }
|
|
8943
|
+
.xa-q-whyin:focus { border-color: var(--xa-line-tip); }
|
|
8944
|
+
.xa-q-foot:has(.xa-q-whyin) .xa-q-keys { display: none; }
|
|
8945
|
+
/* the prompt and the field are one slot: the same 28px height, the same text line, so nothing moves when it opens */
|
|
8946
|
+
.xa-box-ask .xa-q-addwhy { height: 28px; box-sizing: border-box; padding: 0 6px; line-height: 16px; }
|
|
8947
|
+
.xa-q-whyin { height: 28px; min-height: 28px; padding: 5px 6px; line-height: 16px; font-size: 11.5px; margin-left: -6px !important; }
|
|
8948
|
+
.xa-box-ask .xa-q-foot > .xa-q-whyin { margin: 0 6px 0 -6px; }
|
|
8949
|
+
/* typed text starts where the words "Add your reasoning" started — after the plus — so the text does not jump sideways */
|
|
8950
|
+
.xa-box-ask .xa-q-foot > .xa-q-whyin { padding-left: 23px; }
|
|
8951
|
+
/* one frame only: a host's focus ring is suppressed for text entry (DESIGN_SYSTEM.md), the field's own edge brightens */
|
|
8952
|
+
.xa-box-ask .xa-q-foot > .xa-q-whyin:focus, .xa-box-ask .xa-q-foot > .xa-q-whyin:focus-visible { outline: none !important; box-shadow: none !important; }
|
|
8953
|
+
/* the plus stays where it was, now inside the field, so the slot reads as the same thing opened */
|
|
8954
|
+
.xa-box-ask .xa-q-foot > .xa-q-whyin {
|
|
8955
|
+
background-image: linear-gradient(currentColor, currentColor), linear-gradient(currentColor, currentColor);
|
|
8956
|
+
background-size: 9px 1.4px, 1.4px 9px; background-position: 8px 13px, 11.8px 9.2px; background-repeat: no-repeat;
|
|
8957
|
+
color: var(--xa-t1); background-color: var(--xa-well);
|
|
8958
|
+
}
|
|
8959
|
+
/* no stroke on the reasoning field, focused or not (owner, 2026-10-16): the well's shade alone says "type here" */
|
|
8960
|
+
.xa-q-whyin, .xa-q-whyin:hover, .xa-q-whyin:focus, .xa-q-whyin:focus-visible,
|
|
8961
|
+
.xa-box-ask .xa-q-foot > .xa-q-whyin, .xa-box-ask .xa-q-foot > .xa-q-whyin:focus, .xa-box-ask .xa-q-foot > .xa-q-whyin:focus-visible {
|
|
8962
|
+
border-color: transparent !important; outline: none !important; box-shadow: none !important;
|
|
8963
|
+
}
|
|
8964
|
+
/* the open reasoning slot keeps the very same plus icon, in the very same place as the button's: the slot is the
|
|
8965
|
+
button's box (same padding, same gap), the field fills the rest of it */
|
|
8966
|
+
.xa-q-whyslot { flex: 1 1 auto; min-width: 0; display: flex; align-items: flex-start; gap: 5px; font-size: 11.5px; height: auto; min-height: 28px; padding: 0 6px; margin-left: -6px; margin-right: 6px; box-sizing: border-box; border-radius: 3px; background: var(--xa-well); color: var(--xa-t4); }
|
|
8967
|
+
.xa-q-whyplus { flex: none; display: inline-flex; align-items: center; height: 28px; }
|
|
8968
|
+
.xa-box-ask .xa-q-foot .xa-q-whyslot > .xa-q-whyin {
|
|
8969
|
+
flex: 1 1 auto; margin: 0 !important; padding: 6px 0 !important; background: none !important; background-image: none !important;
|
|
8970
|
+
height: 28px; min-height: 28px; line-height: 16px; font-size: 11.5px; color: var(--xa-t1);
|
|
8971
|
+
}
|
|
8972
|
+
.xa-q-foot:has(.xa-q-whyslot) .xa-q-keys { display: none; }
|
|
8973
|
+
/* the reasoning field scrolls with the wheel past four lines but never shows a scrollbar */
|
|
8974
|
+
.xa-q-whyin { scrollbar-width: none; }
|
|
8975
|
+
.xa-q-whyin::-webkit-scrollbar { display: none; }
|
|
8976
|
+
/* the permission's command and its answers start at the card's left edge, under the icon — not indented under
|
|
8977
|
+
the title (owner, 2026-10-16) */
|
|
8978
|
+
.xa-box-ask .xa-perm .xa-perm-body, .xa-box-ask .xa-perm .xa-perm-note { margin-left: 12px !important; }
|
|
8979
|
+
.xa-box-ask .xa-perm .xa-q-foot { padding-left: 12px !important; }
|
|
8980
|
+
.xa-box-ask .xa-perm .xa-perm-body, .xa-box-ask .xa-perm .xa-perm-note { margin-right: 12px !important; }
|
|
8981
|
+
.xa-box-ask .xa-perm .xa-q-foot { padding-right: 12px !important; }
|
|
8982
|
+
.xa-box-ask .xa-perm .xa-q-head { padding-right: 12px; }
|
|
8983
|
+
/* the permission's title and its scope share one line: "Wants to run a command | In the project, on this machine · once" */
|
|
8984
|
+
.xa-box-ask .xa-perm .xa-q-text { display: flex; align-items: center; min-width: 0; gap: 0; white-space: nowrap; }
|
|
8985
|
+
.xa-box-ask .xa-perm .xa-q-text small { display: block; min-width: 0; overflow: hidden; text-overflow: ellipsis; margin: 0; font-size: 11.5px; font-weight: 400; line-height: 18px; color: var(--xa-t4); }
|
|
8986
|
+
.xa-box-ask .xa-perm .xa-q-text small::before { content: ''; display: inline-block; width: 1px; height: 11px; margin: 0 9px; vertical-align: -1px; background: var(--xa-line-tip); }
|
|
8987
|
+
.xa-box-ask .xa-perm .xa-q-head { align-items: center; padding-bottom: 6px; }
|
|
8988
|
+
/* folded, the bar is the whole box: no minimum height around it, and its hover fills the box to its corners */
|
|
8989
|
+
.xa-dock .xa-box.xa-asking { min-height: 0; overflow: hidden; }
|
|
8990
|
+
.xa-box-ask .xa-q[data-folded='true'] .xa-q-bar { border-radius: 5px; }
|
|
8991
|
+
|
|
8992
|
+
/* While the agent waits on an answer, the box holds the focus: the cards stacked above it in the dock — Tasks,
|
|
8993
|
+
Delegated, Running, Queued — and the workspace row step back. A pointer on any of them brings it back at once,
|
|
8994
|
+
so nothing is out of reach; it is emphasis, not a lock. */
|
|
8995
|
+
.xa-dock-inner:has(.xa-box.xa-asking) > :not(.xa-box):not(.xa-foot):not(.xa-notice):not(.xa-controls) {
|
|
8996
|
+
opacity: 0.45; transition: opacity 200ms var(--xa-ease);
|
|
8997
|
+
}
|
|
8998
|
+
.xa-dock-inner:has(.xa-box.xa-asking) > :not(.xa-box):not(.xa-foot):not(.xa-notice):not(.xa-controls):hover,
|
|
8999
|
+
.xa-dock-inner:has(.xa-box.xa-asking) > :not(.xa-box):not(.xa-foot):not(.xa-notice):not(.xa-controls):focus-within { opacity: 1; }
|
|
9000
|
+
.xa-dock-inner > :not(.xa-box) { transition: opacity 200ms var(--xa-ease); }
|
|
9001
|
+
@media (prefers-reduced-motion: reduce) { .xa-dock-inner > * { transition: none !important; } }
|
|
9002
|
+
/* =============================================================================
|
|
9003
|
+
The queue (QueuePanel.tsx) — the XENO platform chat's queue card (xeno-platform `chatQueue.css`,
|
|
9004
|
+
approved 2026-09-30), on the Agent interface's tokens. Same card as the question (question.css).
|
|
9005
|
+
============================================================================= */
|
|
9006
|
+
.xa-queue {
|
|
9007
|
+
display: flex; flex-direction: column;
|
|
9008
|
+
background: var(--xa-plate); border: 1px solid var(--xa-line); border-radius: 8px;
|
|
9009
|
+
box-shadow: 0 1px 2px rgb(0 0 0 / 0.25), 0 12px 32px rgb(0 0 0 / 0.3);
|
|
9010
|
+
overflow: hidden; color: var(--xa-t2);
|
|
9011
|
+
animation: xa-queue-rise 0.34s var(--xa-ease) both;
|
|
9012
|
+
}
|
|
9013
|
+
.xa-queue-bar { width: 100%; display: flex; align-items: center; gap: 8px; padding: 10px 12px 10px 11px; color: var(--xa-t1); font: inherit; text-align: left; background: none; border: 0; cursor: pointer; transition: background 0.12s; }
|
|
9014
|
+
.xa-queue-bar:hover { background: var(--xa-wash); }
|
|
9015
|
+
.xa-queue-ico { color: var(--xa-t4); display: flex; }
|
|
9016
|
+
.xa-queue-title { font-size: 12.5px; font-weight: 600; letter-spacing: -0.01em; flex: none; }
|
|
9017
|
+
.xa-queue-vr { flex: none; width: 1px; height: 12px; background: var(--xa-line-tip); margin: 0 3px; }
|
|
9018
|
+
.xa-queue-note { flex: 1; min-width: 0; color: var(--xa-t5); font-size: 11px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
|
|
9019
|
+
.xa-queue-count { margin-left: auto; flex: none; font-size: 11px; color: var(--xa-t4); font-variant-numeric: tabular-nums; }
|
|
9020
|
+
.xa-queue-chev { flex: none; color: var(--xa-t4); display: flex; transition: transform 0.2s; }
|
|
9021
|
+
.xa-queue[data-expanded='true'] .xa-queue-chev { transform: rotate(180deg); }
|
|
9022
|
+
.xa-queue-hold { flex: none; width: 6px; height: 6px; border-radius: 1.5px; background: var(--xa-t1); animation: xa-queue-breathe 1.2s ease-in-out infinite; }
|
|
9023
|
+
.xa-queue[data-held='true'] .xa-queue-note { color: var(--xa-t2); }
|
|
9024
|
+
.xa-queue[data-grace='true'] .xa-queue-count { color: var(--xa-red); }
|
|
9025
|
+
.xa-queue[data-grace='true'] .xa-queue-hold { background: var(--xa-red); }
|
|
9026
|
+
|
|
9027
|
+
.xa-queue-wrap { display: grid; grid-template-rows: 0fr; transition: grid-template-rows 0.22s var(--xa-ease); }
|
|
9028
|
+
.xa-queue[data-expanded='true'] .xa-queue-wrap { grid-template-rows: 1fr; }
|
|
9029
|
+
.xa-queue-inner { min-height: 0; overflow: hidden; }
|
|
9030
|
+
.xa-queue-list { list-style: none; margin: 0; padding: 6px 8px 8px; display: flex; flex-direction: column; max-height: 260px; overflow-y: auto; }
|
|
9031
|
+
|
|
9032
|
+
.xa-queue-item { display: flex; align-items: flex-start; gap: 9px; padding: 8px 6px 8px 7px; border-radius: 6px; position: relative; transition: background 0.18s, box-shadow 0.2s ease, transform 0.2s var(--xa-ease); animation: xa-queue-rise 0.26s var(--xa-ease) both; }
|
|
9033
|
+
.xa-queue-item:hover { background: var(--xa-wash); }
|
|
9034
|
+
.xa-queue-item[data-lifted='true'] { transition: none; z-index: 20; cursor: grabbing; background: var(--xa-menu); box-shadow: 0 0 0 1px var(--xa-line-tip), 0 14px 30px -8px rgb(0 0 0 / 0.35), 0 5px 12px -6px rgb(0 0 0 / 0.25); }
|
|
9035
|
+
|
|
9036
|
+
/* The square IS the drag handle: the marker by default, the grip on hover. */
|
|
9037
|
+
.xa-queue-mark { flex: none; position: relative; width: 14px; height: 20px; margin-top: 1px; display: flex; align-items: flex-start; justify-content: center; }
|
|
9038
|
+
.xa-queue-sq { width: 6px; height: 6px; margin-top: 7px; border-radius: 1.5px; background: var(--xa-t5); transition: opacity 0.12s; }
|
|
9039
|
+
.xa-queue-grip { position: absolute; inset: 0; display: flex; align-items: flex-start; justify-content: center; color: var(--xa-t4); opacity: 0; transition: opacity 0.12s; }
|
|
9040
|
+
.xa-queue-grip svg { margin-top: 4px; }
|
|
9041
|
+
.xa-queue-item:hover .xa-queue-mark { cursor: grab; }
|
|
9042
|
+
.xa-queue-item:hover .xa-queue-sq { opacity: 0; }
|
|
9043
|
+
.xa-queue-item:hover .xa-queue-grip { opacity: 0.8; }
|
|
9044
|
+
.xa-queue-item[data-next='true'] .xa-queue-sq { background: var(--xa-t1); animation: xa-queue-breathe 1.6s ease-in-out infinite; }
|
|
9045
|
+
.xa-queue[data-held='true'] .xa-queue-item[data-next='true'] .xa-queue-sq { animation: none; opacity: 0.3; }
|
|
9046
|
+
|
|
9047
|
+
.xa-queue-main { flex: 1; min-width: 0; }
|
|
9048
|
+
.xa-queue-text { min-width: 0; color: var(--xa-t1); font-size: 13px; line-height: 1.5; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; cursor: text; }
|
|
9049
|
+
.xa-queue-text:focus-visible { outline: none; text-decoration: underline; text-decoration-color: var(--xa-t5); }
|
|
9050
|
+
.xa-queue-edit { display: block; width: 100%; box-sizing: border-box; font: inherit; font-size: 13px; line-height: 1.5; color: var(--xa-t1); background: transparent; border: none; border-bottom: 1.5px solid var(--xa-line-tip); border-radius: 0; padding: 0 0 3px; margin: 0; resize: none; outline: none; overflow: hidden; }
|
|
9051
|
+
.xa-queue-edit:focus { border-bottom-color: var(--xa-t3); box-shadow: none; }
|
|
9052
|
+
.xa-queue-att { display: inline-flex; align-items: center; vertical-align: middle; gap: 3px; height: 16px; max-width: 124px; margin-left: 6px; padding: 0 5px; border: 1px solid var(--xa-line-tip); border-radius: 4px; color: var(--xa-t4); font-size: 10px; line-height: 1; }
|
|
9053
|
+
.xa-queue-att > span { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
9054
|
+
.xa-queue-atts { display: flex; flex-wrap: wrap; align-items: center; gap: 6px; margin-top: 8px; }
|
|
9055
|
+
.xa-queue-att.xa-edit { height: 20px; max-width: 190px; margin-left: 0; padding: 0 3px 0 6px; }
|
|
9056
|
+
.xa-queue-att-x { flex: none; display: inline-flex; align-items: center; justify-content: center; width: 15px; height: 15px; margin-left: 2px; padding: 0; border: none; border-radius: 3px; background: transparent; color: var(--xa-t4); cursor: pointer; }
|
|
9057
|
+
.xa-queue-att-x:hover { background: var(--xa-wash-hover); color: var(--xa-red); }
|
|
9058
|
+
|
|
9059
|
+
.xa-queue-right { flex: none; position: relative; width: 52px; min-height: 20px; margin-top: 1px; }
|
|
9060
|
+
.xa-queue-tag { display: flex; justify-content: flex-end; align-items: center; height: 20px; padding-right: 4px; transition: opacity 0.2s, filter 0.2s; }
|
|
9061
|
+
.xa-queue-item:hover .xa-queue-tag, .xa-queue-item[data-editing='true'] .xa-queue-tag { opacity: 0; filter: blur(3px); }
|
|
9062
|
+
.xa-queue-next { padding: 0 6px; height: 17px; border-radius: 4px; background: var(--xa-t1); color: var(--xa-ground); font-size: 9px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.06em; display: flex; align-items: center; }
|
|
9063
|
+
.xa-queue-n { color: var(--xa-t4); font-size: 11px; font-weight: 600; font-variant-numeric: tabular-nums; }
|
|
9064
|
+
.xa-queue-acts { position: absolute; top: -3px; right: -3px; display: flex; align-items: center; gap: 1px; pointer-events: none; }
|
|
9065
|
+
.xa-queue-item:hover .xa-queue-acts, .xa-queue-item[data-editing='true'] .xa-queue-acts { pointer-events: auto; }
|
|
9066
|
+
.xa-queue-b {
|
|
9067
|
+
width: 25px; height: 25px; border-radius: 6px; border: 0; background: none; color: var(--xa-t4);
|
|
9068
|
+
display: inline-flex; align-items: center; justify-content: center; cursor: pointer;
|
|
9069
|
+
opacity: 0; transform: translateX(12px); filter: blur(4px);
|
|
9070
|
+
transition: opacity 0.24s var(--xa-ease), transform 0.3s var(--xa-ease), filter 0.24s, background 0.12s linear, color 0.12s linear;
|
|
9071
|
+
}
|
|
9072
|
+
.xa-queue-item:hover .xa-queue-b, .xa-queue-item[data-editing='true'] .xa-queue-b, .xa-queue-b:focus-visible { opacity: 1; transform: none; filter: blur(0); outline: none; }
|
|
9073
|
+
.xa-queue-item:hover .xa-queue-b:nth-child(2) { transition-delay: 50ms; }
|
|
9074
|
+
.xa-queue-b:hover, .xa-queue-b:focus-visible { background: var(--xa-wash-hover); color: var(--xa-t1); }
|
|
9075
|
+
.xa-queue-b:active { transform: scale(0.88); }
|
|
9076
|
+
.xa-queue-b.xa-del:hover { color: var(--xa-red); }
|
|
9077
|
+
.xa-queue-b.xa-save { color: var(--xa-t1); }
|
|
9078
|
+
.xa-queue[data-grace='true'] .xa-queue-b.xa-save { animation: xa-queue-breathe 1.1s ease-in-out infinite; }
|
|
9079
|
+
|
|
9080
|
+
@keyframes xa-queue-rise { from { transform: translateY(6px); opacity: 0; filter: blur(2px); } to { transform: none; opacity: 1; filter: blur(0); } }
|
|
9081
|
+
@keyframes xa-queue-breathe { 0%, 100% { opacity: 0.4; } 50% { opacity: 1; } }
|
|
9082
|
+
@media (prefers-reduced-motion: reduce) {
|
|
9083
|
+
.xa-queue, .xa-queue-item { animation: none; }
|
|
9084
|
+
.xa-queue-tag, .xa-queue-b { transition: opacity 0.12s linear !important; transform: none !important; filter: none !important; }
|
|
9085
|
+
}
|
|
9086
|
+
/* the list scrolls up and down only: a long word wraps instead of opening a sideways scrollbar */
|
|
9087
|
+
.xa-queue-list { overflow-x: hidden; }
|
|
9088
|
+
.xa-queue-item { min-width: 0; }
|
|
9089
|
+
.xa-queue-text, .xa-queue-edit { overflow-wrap: anywhere; }
|
|
9090
|
+
.xa-queue-item[data-lifted='true'] { transform-origin: center; }
|
|
9091
|
+
.xa-queue-acts { right: 0; }
|
|
9092
|
+
|
|
9093
|
+
/* =============================================================================
|
|
9094
|
+
One family with the composer's other cards — Tasks, Delegated, Running (transcript.css `.xa-tasks`):
|
|
9095
|
+
the same wash, hairline and 4px corners, the same 30px bar with a small uppercase label, the same
|
|
9096
|
+
sizes inside. Owner, 2026-10-16: the queue and the ask look like the rest of the app, not like a chat.
|
|
9097
|
+
============================================================================= */
|
|
9098
|
+
.xa-queue { background: var(--xa-wash); border: 1px solid var(--xa-line-soft); border-radius: 4px; box-shadow: none; animation: none; }
|
|
9099
|
+
.xa-queue-bar { height: 30px; padding: 0 10px; gap: 8px; }
|
|
9100
|
+
.xa-queue-bar:hover { background: var(--xa-wash-hover); }
|
|
9101
|
+
.xa-queue-ico { display: none; }
|
|
9102
|
+
.xa-queue-title { font-size: 10px; font-weight: 600; letter-spacing: 0.08em; text-transform: uppercase; color: var(--xa-label); }
|
|
9103
|
+
.xa-queue-vr { display: none; }
|
|
9104
|
+
.xa-queue-note { font-size: 11px; color: var(--xa-t3); }
|
|
9105
|
+
.xa-queue-count { font-size: 10px; color: var(--xa-t6); }
|
|
9106
|
+
.xa-queue-chev { color: var(--xa-t6); }
|
|
9107
|
+
.xa-queue-list { padding: 2px 6px 6px; border-top: 1px solid rgba(var(--xa-ink), 0.05); }
|
|
9108
|
+
.xa-queue-item { padding: 4px 4px 4px 4px; gap: 8px; border-radius: 3px; }
|
|
9109
|
+
.xa-queue-text, .xa-queue-edit { font-size: 12px; line-height: 18px; color: var(--xa-t2); }
|
|
9110
|
+
.xa-queue-mark { height: 18px; }
|
|
9111
|
+
.xa-queue-sq { margin-top: 6px; }
|
|
9112
|
+
.xa-queue-right { min-height: 18px; }
|
|
9113
|
+
.xa-queue-tag { height: 18px; }
|
|
9114
|
+
.xa-queue-next { height: 15px; padding: 0 5px; font-size: 8.5px; border-radius: 3px; }
|
|
9115
|
+
.xa-queue-n { font-size: 10px; color: var(--xa-t6); }
|
|
9116
|
+
.xa-queue-b { width: 22px; height: 22px; border-radius: 3px; }
|
|
9117
|
+
.xa-queue-acts { top: -2px; }
|
|
9118
|
+
/* editing a queued message: the same field as the reasoning one — no stroke, no ring, a slightly darker
|
|
9119
|
+
ground — and the words stay exactly where they were before the click */
|
|
9120
|
+
.xa-queue-edit, .xa-queue-edit:hover, .xa-queue-edit:focus, .xa-queue-edit:focus-visible {
|
|
9121
|
+
border: 0 !important; outline: none !important; box-shadow: none !important;
|
|
9122
|
+
}
|
|
9123
|
+
.xa-queue-edit { padding: 0 6px; margin: 0 -6px; width: calc(100% + 12px); border-radius: 3px; background: var(--xa-well); scrollbar-width: none; }
|
|
9124
|
+
.xa-queue-edit::-webkit-scrollbar { display: none; }
|
|
8660
9125
|
|
|
8661
9126
|
*, ::before, ::after {
|
|
8662
9127
|
--tw-border-spacing-x: 0;
|
|
@@ -9132,9 +9597,6 @@ img.xa-fav { padding: 1px; background: #fff; }
|
|
|
9132
9597
|
margin-top: auto;
|
|
9133
9598
|
margin-bottom: auto;
|
|
9134
9599
|
}
|
|
9135
|
-
.-mb-\[9px\] {
|
|
9136
|
-
margin-bottom: -9px;
|
|
9137
|
-
}
|
|
9138
9600
|
.-ml-1 {
|
|
9139
9601
|
margin-left: -0.25rem;
|
|
9140
9602
|
}
|
|
@@ -9744,9 +10206,6 @@ img.xa-fav { padding: 1px; background: #fff; }
|
|
|
9744
10206
|
.min-w-0 {
|
|
9745
10207
|
min-width: 0px;
|
|
9746
10208
|
}
|
|
9747
|
-
.min-w-5 {
|
|
9748
|
-
min-width: 1.25rem;
|
|
9749
|
-
}
|
|
9750
10209
|
.min-w-64 {
|
|
9751
10210
|
min-width: 16rem;
|
|
9752
10211
|
}
|
|
@@ -10014,6 +10473,9 @@ img.xa-fav { padding: 1px; background: #fff; }
|
|
|
10014
10473
|
.select-none {
|
|
10015
10474
|
user-select: none;
|
|
10016
10475
|
}
|
|
10476
|
+
.select-all {
|
|
10477
|
+
user-select: all;
|
|
10478
|
+
}
|
|
10017
10479
|
.resize-none {
|
|
10018
10480
|
resize: none;
|
|
10019
10481
|
}
|
|
@@ -10448,10 +10910,6 @@ img.xa-fav { padding: 1px; background: #fff; }
|
|
|
10448
10910
|
border-top-left-radius: 0.5rem;
|
|
10449
10911
|
border-top-right-radius: 0.5rem;
|
|
10450
10912
|
}
|
|
10451
|
-
.rounded-t-md {
|
|
10452
|
-
border-top-left-radius: 0.375rem;
|
|
10453
|
-
border-top-right-radius: 0.375rem;
|
|
10454
|
-
}
|
|
10455
10913
|
.rounded-t-none {
|
|
10456
10914
|
border-top-left-radius: 0px;
|
|
10457
10915
|
border-top-right-radius: 0px;
|
|
@@ -10496,9 +10954,6 @@ img.xa-fav { padding: 1px; background: #fff; }
|
|
|
10496
10954
|
.border-b {
|
|
10497
10955
|
border-bottom-width: 1px;
|
|
10498
10956
|
}
|
|
10499
|
-
.border-b-0 {
|
|
10500
|
-
border-bottom-width: 0px;
|
|
10501
|
-
}
|
|
10502
10957
|
.border-l {
|
|
10503
10958
|
border-left-width: 1px;
|
|
10504
10959
|
}
|
|
@@ -14158,10 +14613,6 @@ body, #root, #app {
|
|
|
14158
14613
|
outline-color: rgb(255 255 255 / 0.25);
|
|
14159
14614
|
}
|
|
14160
14615
|
|
|
14161
|
-
.focus-visible\:outline-white\/35:focus-visible {
|
|
14162
|
-
outline-color: rgb(255 255 255 / 0.35);
|
|
14163
|
-
}
|
|
14164
|
-
|
|
14165
14616
|
.focus-visible\:outline-white\/40:focus-visible {
|
|
14166
14617
|
outline-color: rgb(255 255 255 / 0.4);
|
|
14167
14618
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@xenosystem/agent-interface-ui",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.110",
|
|
4
4
|
"license": "UNLICENSED",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -41,11 +41,11 @@
|
|
|
41
41
|
"react-markdown": "^10.1.0",
|
|
42
42
|
"remark-gfm": "^4.0.1",
|
|
43
43
|
"zustand": "^5.0.2",
|
|
44
|
-
"@xenosystem/agent-conversation": "0.1.
|
|
45
|
-
"@xenosystem/agent-interface-
|
|
46
|
-
"@xenosystem/agent-interface-
|
|
47
|
-
"@xenosystem/agent-interface-
|
|
48
|
-
"@xenosystem/agent-interface-
|
|
44
|
+
"@xenosystem/agent-conversation": "0.1.110",
|
|
45
|
+
"@xenosystem/agent-interface-core": "0.1.110",
|
|
46
|
+
"@xenosystem/agent-interface-hub-adapter": "0.1.110",
|
|
47
|
+
"@xenosystem/agent-interface-contract": "0.1.110",
|
|
48
|
+
"@xenosystem/agent-interface-client": "0.1.110"
|
|
49
49
|
},
|
|
50
50
|
"peerDependencies": {
|
|
51
51
|
"react": "^19.0.0",
|