@xenosystem/agent-conversation 0.1.35 → 0.1.37
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/adapters/xenoAgentHostCatalog.d.ts.map +1 -1
- package/dist/adapters/xenoAgentHostCatalog.js +20 -5
- package/dist/adapters/xenoAgentHostCatalog.js.map +1 -1
- package/dist/components/agent/AgentView.d.ts +9 -0
- package/dist/components/agent/AgentView.d.ts.map +1 -1
- package/dist/components/agent/AgentView.js +883 -1045
- package/dist/components/agent/AgentView.js.map +1 -1
- package/dist/components/agent/GhostTextArea.d.ts +6 -0
- package/dist/components/agent/GhostTextArea.d.ts.map +1 -1
- package/dist/components/agent/GhostTextArea.js +15 -5
- package/dist/components/agent/GhostTextArea.js.map +1 -1
- package/dist/components/agent/LiveConversationCollaboration.d.ts +3 -1
- package/dist/components/agent/LiveConversationCollaboration.d.ts.map +1 -1
- package/dist/components/agent/LiveConversationCollaboration.js +3 -1
- package/dist/components/agent/LiveConversationCollaboration.js.map +1 -1
- package/dist/components/agent/MessageText.d.ts +36 -0
- package/dist/components/agent/MessageText.d.ts.map +1 -0
- package/dist/components/agent/MessageText.js +76 -0
- package/dist/components/agent/MessageText.js.map +1 -0
- package/dist/components/agent/SdkSessionPanel.d.ts +2 -0
- package/dist/components/agent/SdkSessionPanel.d.ts.map +1 -1
- package/dist/components/agent/SdkSessionPanel.js +1 -1
- package/dist/components/agent/SdkSessionPanel.js.map +1 -1
- package/dist/components/agent/composer/Composer.d.ts +282 -0
- package/dist/components/agent/composer/Composer.d.ts.map +1 -0
- package/dist/components/agent/composer/Composer.js +393 -0
- package/dist/components/agent/composer/Composer.js.map +1 -0
- package/dist/components/agent/composer/EffortCells.d.ts +12 -0
- package/dist/components/agent/composer/EffortCells.d.ts.map +1 -0
- package/dist/components/agent/composer/EffortCells.js +146 -0
- package/dist/components/agent/composer/EffortCells.js.map +1 -0
- package/dist/components/agent/composer/Tip.d.ts +19 -0
- package/dist/components/agent/composer/Tip.d.ts.map +1 -0
- package/dist/components/agent/composer/Tip.js +78 -0
- package/dist/components/agent/composer/Tip.js.map +1 -0
- package/dist/components/agent/composer/TypedMenu.d.ts +56 -0
- package/dist/components/agent/composer/TypedMenu.d.ts.map +1 -0
- package/dist/components/agent/composer/TypedMenu.js +156 -0
- package/dist/components/agent/composer/TypedMenu.js.map +1 -0
- package/dist/components/agent/mainAssistant.d.ts +9 -2
- package/dist/components/agent/mainAssistant.d.ts.map +1 -1
- package/dist/components/agent/mainAssistant.js +9 -2
- package/dist/components/agent/mainAssistant.js.map +1 -1
- package/dist/components/agent/toolCallDerive.d.ts +82 -0
- package/dist/components/agent/toolCallDerive.d.ts.map +1 -0
- package/dist/components/agent/toolCallDerive.js +741 -0
- package/dist/components/agent/toolCallDerive.js.map +1 -0
- package/dist/components/agent/transcript/Transcript.d.ts +127 -0
- package/dist/components/agent/transcript/Transcript.d.ts.map +1 -0
- package/dist/components/agent/transcript/Transcript.js +544 -0
- package/dist/components/agent/transcript/Transcript.js.map +1 -0
- package/dist/components/agent/transcript/glyphs.d.ts +83 -0
- package/dist/components/agent/transcript/glyphs.d.ts.map +1 -0
- package/dist/components/agent/transcript/glyphs.js +124 -0
- package/dist/components/agent/transcript/glyphs.js.map +1 -0
- package/dist/components/agent/transcript/stepModel.d.ts +163 -0
- package/dist/components/agent/transcript/stepModel.d.ts.map +1 -0
- package/dist/components/agent/transcript/stepModel.js +701 -0
- package/dist/components/agent/transcript/stepModel.js.map +1 -0
- package/dist/components/agent/transcript/turnModel.d.ts +124 -0
- package/dist/components/agent/transcript/turnModel.d.ts.map +1 -0
- package/dist/components/agent/transcript/turnModel.js +166 -0
- package/dist/components/agent/transcript/turnModel.js.map +1 -0
- package/dist/components/agent/transcript/useAskActions.d.ts +23 -0
- package/dist/components/agent/transcript/useAskActions.d.ts.map +1 -0
- package/dist/components/agent/transcript/useAskActions.js +92 -0
- package/dist/components/agent/transcript/useAskActions.js.map +1 -0
- package/dist/parityFixture.d.ts +54 -0
- package/dist/parityFixture.d.ts.map +1 -0
- package/dist/parityFixture.js +195 -0
- package/dist/parityFixture.js.map +1 -0
- package/dist/platformApiTypes.d.ts +10 -1
- package/dist/platformApiTypes.d.ts.map +1 -1
- package/dist/stores/agentChatStore.d.ts +61 -1
- package/dist/stores/agentChatStore.d.ts.map +1 -1
- package/dist/stores/agentChatStore.js +63 -8
- package/dist/stores/agentChatStore.js.map +1 -1
- package/dist/types/agentPermissions.d.ts +3 -1
- package/dist/types/agentPermissions.d.ts.map +1 -1
- package/dist/utils/acpExecutionAuthority.d.ts.map +1 -1
- package/dist/utils/acpExecutionAuthority.js +2 -0
- package/dist/utils/acpExecutionAuthority.js.map +1 -1
- package/package.json +6 -5
- package/src/composer.css +334 -0
- package/src/styles.css +7 -0
- package/src/transcript.css +585 -0
|
@@ -41,5 +41,7 @@ export interface AgentCapabilities {
|
|
|
41
41
|
dataAnalysis?: boolean;
|
|
42
42
|
}
|
|
43
43
|
/** The named permission posture a conversation runs under. */
|
|
44
|
-
export type AgentPermissionProfileName = 'standard' | 'read-only' | 'edit-with-approval' | 'trusted-workspace' | 'plan'
|
|
44
|
+
export type AgentPermissionProfileName = 'standard' | 'read-only' | 'edit-with-approval' | 'trusted-workspace' | 'plan'
|
|
45
|
+
/** The composer's "Full access" — no asks; the walls (mode envelope, sandbox) still stand. */
|
|
46
|
+
| 'full-access';
|
|
45
47
|
//# sourceMappingURL=agentPermissions.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agentPermissions.d.ts","sourceRoot":"","sources":["../../src/types/agentPermissions.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,sCAAsC;AACtC,MAAM,MAAM,wBAAwB,GAAG,UAAU,GAAG,SAAS,CAAA;AAE7D,2CAA2C;AAC3C,MAAM,MAAM,uBAAuB,GAC/B,oBAAoB,GACpB,aAAa,GACb,cAAc,GACd,aAAa,GACb,YAAY,CAAA;AAEhB,gFAAgF;AAChF,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAA;IACV,OAAO,EAAE,wBAAwB,CAAA;IACjC,MAAM,EAAE,uBAAuB,CAAA;IAC/B,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,wCAAwC;AACxC,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,OAAO,CAAA;IACjB,QAAQ,EAAE,OAAO,CAAA;IACjB,SAAS,EAAE,OAAO,CAAA;IAClB,SAAS,EAAE,OAAO,CAAA;IAClB,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,YAAY,CAAC,EAAE,OAAO,CAAA;CACvB;AAED,8DAA8D;AAC9D,MAAM,MAAM,0BAA0B,GAClC,UAAU,GACV,WAAW,GACX,oBAAoB,GACpB,mBAAmB,GACnB,MAAM,CAAA"}
|
|
1
|
+
{"version":3,"file":"agentPermissions.d.ts","sourceRoot":"","sources":["../../src/types/agentPermissions.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,sCAAsC;AACtC,MAAM,MAAM,wBAAwB,GAAG,UAAU,GAAG,SAAS,CAAA;AAE7D,2CAA2C;AAC3C,MAAM,MAAM,uBAAuB,GAC/B,oBAAoB,GACpB,aAAa,GACb,cAAc,GACd,aAAa,GACb,YAAY,CAAA;AAEhB,gFAAgF;AAChF,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAA;IACV,OAAO,EAAE,wBAAwB,CAAA;IACjC,MAAM,EAAE,uBAAuB,CAAA;IAC/B,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,wCAAwC;AACxC,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,OAAO,CAAA;IACjB,QAAQ,EAAE,OAAO,CAAA;IACjB,SAAS,EAAE,OAAO,CAAA;IAClB,SAAS,EAAE,OAAO,CAAA;IAClB,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,YAAY,CAAC,EAAE,OAAO,CAAA;CACvB;AAED,8DAA8D;AAC9D,MAAM,MAAM,0BAA0B,GAClC,UAAU,GACV,WAAW,GACX,oBAAoB,GACpB,mBAAmB,GACnB,MAAM;AACR,8FAA8F;GAC5F,aAAa,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"acpExecutionAuthority.d.ts","sourceRoot":"","sources":["../../src/utils/acpExecutionAuthority.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,0BAA0B,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAA;AACnG,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,sCAAsC,CAAA;AAEtF,MAAM,WAAW,4BAA4B;IAC3C,aAAa,EAAE,CAAC,CAAA;IAChB,iBAAiB,EAAE,0BAA0B,CAAA;IAC7C,UAAU,EAAE,WAAW,GAAG,iBAAiB,CAAA;CAC5C;
|
|
1
|
+
{"version":3,"file":"acpExecutionAuthority.d.ts","sourceRoot":"","sources":["../../src/utils/acpExecutionAuthority.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,0BAA0B,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAA;AACnG,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,sCAAsC,CAAA;AAEtF,MAAM,WAAW,4BAA4B;IAC3C,aAAa,EAAE,CAAC,CAAA;IAChB,iBAAiB,EAAE,0BAA0B,CAAA;IAC7C,UAAU,EAAE,WAAW,GAAG,iBAAiB,CAAA;CAC5C;AAQD,+FAA+F;AAC/F,wBAAgB,wCAAwC,CACtD,kBAAkB,CAAC,EAAE,0BAA0B,GAC9C,UAAU,GAAG,SAAS,CAKxB;AAED;;;GAGG;AACH,wBAAgB,yCAAyC,CACvD,iBAAiB,CAAC,EAAE,0BAA0B,GAC7C,0BAA0B,CAa5B;AAED;;;;;;GAMG;AACH,wBAAgB,mCAAmC,CAAC,KAAK,EAAE;IACzD,iBAAiB,CAAC,EAAE,0BAA0B,CAAA;IAC9C,YAAY,CAAC,EAAE,oBAAoB,CAAA;CACpC,GAAG,4BAA4B,CAS/B"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
const WORKSPACE_WRITE_PROFILES = new Set([
|
|
2
2
|
'standard',
|
|
3
3
|
'trusted-workspace',
|
|
4
|
+
'full-access',
|
|
4
5
|
]);
|
|
5
6
|
/** Map XENO's permission profile to the deliberately narrow native-provider trust contract. */
|
|
6
7
|
export function nativeWorkspaceTrustForPermissionProfile(_permissionProfile) {
|
|
@@ -22,6 +23,7 @@ export function nativeExecutionPolicyForPermissionProfile(permissionProfile) {
|
|
|
22
23
|
return 'prompted-workspace';
|
|
23
24
|
case 'standard':
|
|
24
25
|
case 'trusted-workspace':
|
|
26
|
+
case 'full-access':
|
|
25
27
|
default:
|
|
26
28
|
return 'autonomous-workspace';
|
|
27
29
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"acpExecutionAuthority.js","sourceRoot":"","sources":["../../src/utils/acpExecutionAuthority.ts"],"names":[],"mappings":"AASA,MAAM,wBAAwB,GAAG,IAAI,GAAG,CAA6B;IACnE,UAAU;IACV,mBAAmB;
|
|
1
|
+
{"version":3,"file":"acpExecutionAuthority.js","sourceRoot":"","sources":["../../src/utils/acpExecutionAuthority.ts"],"names":[],"mappings":"AASA,MAAM,wBAAwB,GAAG,IAAI,GAAG,CAA6B;IACnE,UAAU;IACV,mBAAmB;IACnB,aAAa;CACd,CAAC,CAAA;AAEF,+FAA+F;AAC/F,MAAM,UAAU,wCAAwC,CACtD,kBAA+C;IAE/C,0EAA0E;IAC1E,6EAA6E;IAC7E,4EAA4E;IAC5E,OAAO,SAAS,CAAA;AAClB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,yCAAyC,CACvD,iBAA8C;IAE9C,QAAQ,iBAAiB,EAAE,CAAC;QAC1B,KAAK,WAAW,CAAC;QACjB,KAAK,MAAM;YACT,OAAO,WAAW,CAAA;QACpB,KAAK,oBAAoB;YACvB,OAAO,oBAAoB,CAAA;QAC7B,KAAK,UAAU,CAAC;QAChB,KAAK,mBAAmB,CAAC;QACzB,KAAK,aAAa,CAAC;QACnB;YACE,OAAO,sBAAsB,CAAA;IACjC,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,mCAAmC,CAAC,KAGnD;IACC,MAAM,iBAAiB,GAAG,KAAK,CAAC,iBAAiB,IAAI,UAAU,CAAA;IAC/D,MAAM,YAAY,GAAG,KAAK,CAAC,YAAY,EAAE,SAAS,KAAK,KAAK;WACvD,wBAAwB,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAA;IACpD,OAAO;QACL,aAAa,EAAE,CAAC;QAChB,iBAAiB;QACjB,UAAU,EAAE,YAAY,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,WAAW;KAC3D,CAAA;AACH,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@xenosystem/agent-conversation",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.37",
|
|
4
4
|
"license": "UNLICENSED",
|
|
5
5
|
"description": "The XENO Agent conversation surface: the transcript, the composer, and the logic behind them.",
|
|
6
6
|
"type": "module",
|
|
@@ -33,6 +33,7 @@
|
|
|
33
33
|
"directory": "packages/conversation"
|
|
34
34
|
},
|
|
35
35
|
"dependencies": {
|
|
36
|
+
"@xenosystem/elements": "0.0.1",
|
|
36
37
|
"@xenosystem/elements-react": "0.0.1",
|
|
37
38
|
"@xterm/addon-fit": "^0.11.0",
|
|
38
39
|
"@xterm/xterm": "^6.0.0",
|
|
@@ -42,10 +43,10 @@
|
|
|
42
43
|
"react-markdown": "^10.1.0",
|
|
43
44
|
"remark-gfm": "^4.0.1",
|
|
44
45
|
"zustand": "^5.0.2",
|
|
45
|
-
"@xenosystem/agent-interface-contract": "0.1.
|
|
46
|
-
"@xenosystem/agent-interface-
|
|
47
|
-
"@xenosystem/agent-interface-
|
|
48
|
-
"@xenosystem/agent-interface-
|
|
46
|
+
"@xenosystem/agent-interface-contract": "0.1.37",
|
|
47
|
+
"@xenosystem/agent-interface-client": "0.1.37",
|
|
48
|
+
"@xenosystem/agent-interface-core": "0.1.37",
|
|
49
|
+
"@xenosystem/agent-interface-hub-adapter": "0.1.37"
|
|
49
50
|
},
|
|
50
51
|
"peerDependencies": {
|
|
51
52
|
"react": "^19.0.0",
|
package/src/composer.css
ADDED
|
@@ -0,0 +1,334 @@
|
|
|
1
|
+
/* =============================================================================
|
|
2
|
+
The XENO Agent composer — D9 / D9a / D11 of `XENO AGENT PANEL - SPEC.md`.
|
|
3
|
+
-----------------------------------------------------------------------------
|
|
4
|
+
🔴 PORTED VERBATIM from the LOCKED prototype — artifact `XENO Agent Panel`
|
|
5
|
+
(https://claude.ai/code/artifact/ed288e2e-6d99-490a-9e99-0f3dea486ce0), source
|
|
6
|
+
`xeno-agent-panel-proto.html`. Every rule, number and comment below is the prototype's, through
|
|
7
|
+
three mechanical transforms and NOTHING else:
|
|
8
|
+
|
|
9
|
+
1. the bench's ink conversion, so one stylesheet serves both themes
|
|
10
|
+
(`rgba(255,255,255,a)` → `rgba(var(--xa-ink),a)`, the white hover → `--xa-send-hover`),
|
|
11
|
+
2. the `xa-` prefix D9a requires — classes, keyframes and custom properties — because a bare
|
|
12
|
+
`.working` or `.menu .h` collides with a host's stylesheet, and both collisions have happened,
|
|
13
|
+
3. the `.xa-dock` scope, so nothing here reaches a document the panel is mounted in.
|
|
14
|
+
|
|
15
|
+
⚠️ Do not "improve" a rule here. The prototype is the locked one; a defect in this file is a
|
|
16
|
+
defect there, and the fix belongs there first. `transcript.css` declares the token set.
|
|
17
|
+
============================================================================= */
|
|
18
|
+
|
|
19
|
+
/* ── dock: notices → context strip → composer ─────────────────────────── */
|
|
20
|
+
.xa-dock { position: relative; flex: none; padding: 0 16px 14px; container-type: inline-size; }
|
|
21
|
+
.xa-dock-inner { max-width: 820px; margin: 0 auto; display: flex; flex-direction: column; gap: 9px; }
|
|
22
|
+
|
|
23
|
+
.xa-dock .xa-notice { display: flex; align-items: flex-start; gap: 10px; padding: 11px 12px; background: var(--xa-plate); border: 1px solid var(--xa-line); border-radius: 6px; }
|
|
24
|
+
.xa-dock .xa-notice.xa-center { align-items: center; }
|
|
25
|
+
.xa-dock .xa-notice .xa-txt { display: flex; flex-direction: column; gap: 3px; min-width: 0; }
|
|
26
|
+
.xa-dock .xa-notice .xa-ttl { font-size: 12px; line-height: 1.3; font-weight: 600; color: var(--xa-t1); }
|
|
27
|
+
.xa-dock .xa-notice .xa-sub { font-size: 11px; line-height: 1.45; color: var(--xa-t4); }
|
|
28
|
+
.xa-dock .xa-notice .xa-grow { flex: 1; }
|
|
29
|
+
.xa-dock .xa-notice .xa-act { height: 24px; padding: 0 10px; background: var(--xa-send); border-radius: 4px; font-size: 11px; font-weight: 500; color: var(--xa-ground); flex: none; }
|
|
30
|
+
.xa-dock .xa-notice .xa-act:hover { background: var(--xa-send-hover); }
|
|
31
|
+
.xa-dock .xa-x { width: 20px; height: 20px; border-radius: 3px; flex: none; color: var(--xa-t5); }
|
|
32
|
+
.xa-dock .xa-x:hover { background: var(--xa-wash-hover); color: var(--xa-t2); }
|
|
33
|
+
|
|
34
|
+
.xa-dock .xa-ctx { display: flex; align-items: center; height: 30px; padding-right: 4px; background: var(--xa-wash); border: 1px solid var(--xa-line-soft); border-radius: 4px; overflow: hidden; }
|
|
35
|
+
.xa-dock .xa-wsrow { display: flex; align-items: stretch; gap: 7px; }
|
|
36
|
+
.xa-dock .xa-wsrow .xa-ctx { flex: 1; min-width: 0; }
|
|
37
|
+
.xa-dock .xa-wsrow .xa-segc { flex: none; height: 30px; padding: 3px; }
|
|
38
|
+
.xa-dock .xa-wsrow .xa-segc button { height: 22px; padding: 0 9px; }
|
|
39
|
+
.xa-dock .xa-ctx .xa-seg { display: flex; align-items: center; gap: 7px; padding: 0 10px; font-size: 11px; white-space: nowrap; }
|
|
40
|
+
.xa-dock .xa-ctx .xa-seg.xa-name { font-weight: 500; color: var(--xa-t3); }
|
|
41
|
+
.xa-dock .xa-ctx button.xa-seg { height: 100%; border-radius: 0; }
|
|
42
|
+
.xa-dock .xa-ctx button.xa-seg:hover { color: var(--xa-t2); }
|
|
43
|
+
.xa-dock .xa-ctx .xa-act1 { height: 22px; padding: 0 9px; background: rgba(var(--xa-ink),0.07); border-radius: 3px; font-size: 11px; font-weight: 500; color: var(--xa-t2); }
|
|
44
|
+
.xa-dock .xa-ctx .xa-act1:hover { background: rgba(var(--xa-ink),0.11); }
|
|
45
|
+
.xa-dock .xa-ctx .xa-meter { display: flex; align-items: center; gap: 6px; padding: 0 10px; font-size: 11px; color: var(--xa-t4); }
|
|
46
|
+
.xa-dock .xa-ctx .xa-meter .xa-cells { display: flex; gap: 2px; }
|
|
47
|
+
.xa-dock .xa-ctx .xa-meter .xa-cells span { width: 6px; height: 8px; background: rgba(var(--xa-ink),0.10); border-radius: 1px; }
|
|
48
|
+
.xa-dock .xa-ctx .xa-meter .xa-cells span.xa-on { background: rgba(var(--xa-ink),0.45); }
|
|
49
|
+
.xa-dock .xa-ctx .xa-seg.xa-repo { font-weight: 500; color: var(--xa-t3); }
|
|
50
|
+
.xa-dock .xa-ctx .xa-seg.xa-dim { color: var(--xa-t4); }
|
|
51
|
+
.xa-dock .xa-ctx .xa-vr { width: 1px; height: 14px; background: var(--xa-line); flex: none; }
|
|
52
|
+
.xa-dock .xa-ctx .xa-grow { flex: 1; }
|
|
53
|
+
.xa-dock .xa-ctx .xa-diff { display: flex; gap: 6px; padding: 0 10px; font-size: 11px; font-weight: 500; }
|
|
54
|
+
.xa-dock .xa-ctx .xa-diff .xa-a { color: var(--xa-green); } .xa-ctx .xa-diff .xa-d { color: var(--xa-red); }
|
|
55
|
+
.xa-dock .xa-split { display: flex; align-items: stretch; height: 22px; }
|
|
56
|
+
.xa-dock .xa-split button { padding: 0 9px; background: rgba(var(--xa-ink),0.07); font-size: 11px; font-weight: 500; color: var(--xa-t2); border-radius: 3px 0 0 3px; }
|
|
57
|
+
.xa-dock .xa-split .xa-vr { width: 1px; background: rgba(0,0,0,0.35); height: auto; }
|
|
58
|
+
.xa-dock .xa-split button.xa-caret { width: 20px; padding: 0; border-radius: 0 3px 3px 0; }
|
|
59
|
+
.xa-dock .xa-split button:hover { background: rgba(var(--xa-ink),0.11); }
|
|
60
|
+
.xa-dock .xa-ctx .xa-x { width: 22px; height: 22px; margin-left: 4px; }
|
|
61
|
+
|
|
62
|
+
.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; }
|
|
63
|
+
.xa-dock .xa-box.xa-off { opacity: 0.55; }
|
|
64
|
+
.xa-dock .xa-box textarea {
|
|
65
|
+
display: block; width: 100%; margin: 0; padding: 0; border: 0; background: transparent; resize: none;
|
|
66
|
+
font: inherit; font-size: 13px; line-height: 1.5; color: var(--xa-ink-text); caret-color: var(--xa-t1);
|
|
67
|
+
min-height: 19.5px; max-height: 220px; overflow-y: auto; scrollbar-width: thin;
|
|
68
|
+
}
|
|
69
|
+
.xa-dock .xa-box textarea::placeholder { color: var(--xa-t6); }
|
|
70
|
+
/* the bench's `textarea:focus { outline: none }`: the box is the field's frame, so a host's focus ring
|
|
71
|
+
(`*:focus-visible`, drawn outside the field) reads as a stray stroke over it — DESIGN_SYSTEM.md exempts
|
|
72
|
+
text entry, and only text entry, from the ring */
|
|
73
|
+
.xa-dock .xa-box textarea:focus, .xa-dock .xa-box textarea:focus-visible { outline: none; box-shadow: none; }
|
|
74
|
+
.xa-dock .xa-tiles { display: flex; flex-wrap: wrap; gap: 7px; }
|
|
75
|
+
.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); }
|
|
76
|
+
.xa-dock .xa-tile.xa-img { background: var(--xa-tile-img); overflow: visible; }
|
|
77
|
+
.xa-dock .xa-tile.xa-img .xa-thumb { position: absolute; inset: 0; border-radius: 3px; background: linear-gradient(135deg, #3a3a40 0%, #232326 55%, #2d2d31 100%); }
|
|
78
|
+
.xa-dock .xa-tile.xa-img svg { position: relative; }
|
|
79
|
+
.xa-dock .xa-tile .xa-rm { position: absolute; top: -5px; right: -5px; width: 14px; height: 14px; background: var(--xa-ground); border: 1px solid rgba(var(--xa-ink),0.18); border-radius: 3px; color: var(--xa-t2); opacity: 0; transition: opacity 90ms; }
|
|
80
|
+
.xa-dock .xa-tile:hover .xa-rm, .xa-dock .xa-tile .xa-rm:focus-visible { opacity: 1; }
|
|
81
|
+
.xa-dock .xa-tile.xa-more { background: rgba(var(--xa-ink),0.02); border: 1px dashed rgba(var(--xa-ink),0.14); color: var(--xa-t5); }
|
|
82
|
+
.xa-dock .xa-tile.xa-more:hover { color: var(--xa-t3); }
|
|
83
|
+
|
|
84
|
+
.xa-dock .xa-controls { position: relative; display: flex; align-items: center; flex-wrap: wrap; gap: 7px; }
|
|
85
|
+
/* while a turn runs the lane, model and effort are locked to it, so they leave — one by one,
|
|
86
|
+
left to right, each blurring and fading where it stands before it drops (the chip's own sink);
|
|
87
|
+
the group folds its width once the last has gone and the counter lands beside the square.
|
|
88
|
+
Approvals and + stay: those are still yours mid-turn. Back: the reverse order, materialising
|
|
89
|
+
as they land. The per-child delays ride on --xa-d/--xa-r (set by cadence() at render), because the
|
|
90
|
+
animation shorthand resets animation-delay and outranks any per-child rule. */
|
|
91
|
+
.xa-dock .xa-controls.xa-running .xa-mgrp { pointer-events: none; animation: xa-mgfold 1ms linear var(--xa-fold, 500ms) both; }
|
|
92
|
+
.xa-dock .xa-controls.xa-running .xa-mgrp > * { animation: xa-sink 200ms cubic-bezier(.4,0,.8,.4) both; animation-delay: var(--xa-d, 0ms); }
|
|
93
|
+
.xa-dock .xa-controls.xa-idle .xa-mgrp > * { animation: xa-rise 280ms cubic-bezier(.2,.7,.2,1) both; animation-delay: var(--xa-r, 0ms); }
|
|
94
|
+
@keyframes xa-mgfold { to { width: 0; overflow: hidden; opacity: 0; } }
|
|
95
|
+
/* the counter is out of the flow — it can never push the fading group — and lands to the left
|
|
96
|
+
of the square once the group has folded */
|
|
97
|
+
.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; }
|
|
98
|
+
.xa-dock .xa-controls.xa-running .xa-status { display: inline; animation: xa-stin 200ms ease-out var(--xa-stin, 520ms) both; }
|
|
99
|
+
@keyframes xa-stin { from { opacity: 0; transform: translate(6px, -50%); } to { opacity: 1; transform: translate(0, -50%); } }
|
|
100
|
+
.xa-dock .xa-controls .xa-grow { flex: 1; }
|
|
101
|
+
.xa-dock .xa-ic { width: 24px; height: 24px; border-radius: 4px; color: var(--xa-t4); }
|
|
102
|
+
.xa-dock .xa-ic:hover, .xa-dock .xa-ic.xa-open { background: var(--xa-wash-hover); color: var(--xa-t2); }
|
|
103
|
+
.xa-dock .xa-segc { display: flex; align-items: center; gap: 2px; padding: 2px; background: var(--xa-wash); border: 1px solid var(--xa-line-soft); border-radius: 4px; }
|
|
104
|
+
.xa-dock .xa-segc button { padding: 3px 8px; border-radius: 3px; font-size: 11px; line-height: 1; font-weight: 500; color: var(--xa-t4); }
|
|
105
|
+
.xa-dock .xa-segc button:hover { color: var(--xa-t2); }
|
|
106
|
+
.xa-dock .xa-segc button.xa-on { background: var(--xa-seg-on); color: var(--xa-t1); }
|
|
107
|
+
.xa-dock .xa-segc:hover { border-color: var(--xa-line-tip); }
|
|
108
|
+
.xa-dock .xa-txt { gap: 6px; height: 24px; padding: 0 6px; border-radius: 4px; font-size: 11px; line-height: 1; font-weight: 500; color: var(--xa-t3); white-space: nowrap; }
|
|
109
|
+
.xa-dock .xa-txt:hover, .xa-dock .xa-txt.xa-open { background: var(--xa-wash-hover); color: var(--xa-t1); }
|
|
110
|
+
.xa-dock .xa-txt.xa-amber { color: var(--xa-amber); }
|
|
111
|
+
.xa-dock .xa-txt.xa-amber:hover, .xa-dock .xa-txt.xa-amber.xa-open { background: rgba(217,154,78,0.12); color: var(--xa-amber); }
|
|
112
|
+
/* approvals — the chip is its own chooser, the mirror of the lane: this side is left-anchored,
|
|
113
|
+
so the icon blurs away and the word slides LEFT into its space while the other two policies
|
|
114
|
+
unfold to the RIGHT. The whole group rises in with Agent and sinks out with Chat. */
|
|
115
|
+
.xa-dock .xa-permgrp { display: inline-flex; align-items: center; }
|
|
116
|
+
.xa-dock .xa-permgrp .xa-txt[data-permpick] { gap: 0; }
|
|
117
|
+
.xa-dock .xa-permgrp .xa-permicon { display: inline-flex; width: 12px; margin-right: 6px; overflow: hidden; }
|
|
118
|
+
.xa-dock .xa-permgrp .xa-permicon.xa-out { animation: xa-blurout 220ms ease-out both; }
|
|
119
|
+
.xa-dock .xa-permgrp .xa-permicon.xa-hold { width: 0; margin-right: 0; opacity: 0; }
|
|
120
|
+
.xa-dock .xa-permgrp .xa-permicon.xa-in { animation: xa-blurin 260ms ease-out both; }
|
|
121
|
+
.xa-dock .xa-permgrp .xa-permpick { display: inline-flex; align-items: center; gap: 2px; margin-left: 2px; }
|
|
122
|
+
.xa-dock .xa-permgrp .xa-permpick .xa-alt { height: 24px; padding: 0 6px; border-radius: 4px; font-size: 11px; line-height: 1; font-weight: 500; color: var(--xa-t4); animation: xa-altinL 200ms cubic-bezier(.2,.7,.2,1) both; }
|
|
123
|
+
.xa-dock .xa-permgrp .xa-permpick .xa-alt:hover { color: var(--xa-t1); }
|
|
124
|
+
.xa-dock .xa-permgrp .xa-permpick .xa-alt.xa-amber { color: var(--xa-amber); }
|
|
125
|
+
@keyframes xa-altinL { from { opacity: 0; transform: translateX(-10px); filter: blur(2px); } to { opacity: 1; transform: none; filter: none; } }
|
|
126
|
+
.xa-dock .xa-permgrp .xa-txt:hover, .xa-dock .xa-permgrp .xa-txt.xa-open { background: none; color: var(--xa-t1); }
|
|
127
|
+
.xa-dock .xa-permgrp .xa-txt.xa-amber:hover, .xa-dock .xa-permgrp .xa-txt.xa-amber.xa-open { background: none; color: var(--xa-amber); }
|
|
128
|
+
.xa-dock .xa-permgrp.xa-rise { animation: xa-rise 280ms cubic-bezier(.2,.7,.2,1) both; }
|
|
129
|
+
.xa-dock .xa-permgrp.xa-sink { animation: xa-sink 200ms cubic-bezier(.4,0,.8,.4) both; pointer-events: none; }
|
|
130
|
+
@keyframes xa-rise { 0% { transform: translateY(44px); opacity: 0; filter: blur(3px); } 45% { transform: translateY(14px); opacity: 0; filter: blur(3px); } 100% { transform: none; opacity: 1; filter: blur(0); } }
|
|
131
|
+
@keyframes xa-sink { 0% { transform: none; opacity: 1; filter: blur(0); } 55% { transform: translateY(14px); opacity: 0; filter: blur(3px); } 100% { transform: translateY(44px); opacity: 0; filter: blur(3px); } }
|
|
132
|
+
.xa-dock .xa-txt .xa-vr { width: 1px; height: 10px; background: rgba(var(--xa-ink),0.12); }
|
|
133
|
+
.xa-dock .xa-txt .xa-pill { padding: 3px 6px; background: rgba(var(--xa-ink),0.06); border-radius: 3px; font-size: 10px; line-height: 1; color: var(--xa-t4); } /* 16px tall, 3px corners — the knob's own geometry */
|
|
134
|
+
.xa-dock .xa-txt .xa-model { max-width: 26ch; overflow: hidden; text-overflow: ellipsis; }
|
|
135
|
+
/* the model control: three segments, three popovers, one visual object */
|
|
136
|
+
.xa-dock .xa-mgrp { display: flex; align-items: center; height: 24px; }
|
|
137
|
+
.xa-dock .xa-mgrp .xa-txt { padding: 0 6px; height: 24px; }
|
|
138
|
+
.xa-dock .xa-mgrp .xa-vr { width: 1px; height: 10px; background: rgba(var(--xa-ink),0.12); flex: none; }
|
|
139
|
+
.xa-dock .xa-mgrp .xa-txt.xa-pillbtn { padding: 0 4px; }
|
|
140
|
+
/* inside the model group hover is a TEXT change, never a box under a word */
|
|
141
|
+
.xa-dock .xa-mgrp .xa-txt:hover, .xa-dock .xa-mgrp .xa-txt.xa-open { background: none; color: var(--xa-t1); }
|
|
142
|
+
.xa-dock .xa-mgrp .xa-txt.xa-down:hover, .xa-dock .xa-mgrp .xa-txt.xa-down.xa-open { background: var(--xa-amber-wash); color: var(--xa-amber); }
|
|
143
|
+
.xa-dock .xa-mgrp .xa-txt.xa-pillbtn:hover, .xa-dock .xa-mgrp .xa-txt.xa-pillbtn.xa-open { background: none; }
|
|
144
|
+
.xa-dock .xa-mgrp .xa-txt.xa-pillbtn:hover .xa-pill { background: var(--xa-seg-on); color: var(--xa-t1); }
|
|
145
|
+
.xa-dock .xa-mgrp .xa-txt.xa-pillbtn.xa-open .xa-pill { background: var(--xa-send); color: var(--xa-ground); font-weight: 600; } /* while the popover is open the pill IS the knob */
|
|
146
|
+
/* the lane chooser: click the lane and it becomes the choice — the icon blurs away, the
|
|
147
|
+
two other lanes unfold to the LEFT of the label, one click picks, the new icon blurs in */
|
|
148
|
+
.xa-dock .xa-mgrp .xa-txt[data-lanepick] { gap: 0; }
|
|
149
|
+
.xa-dock .xa-mgrp .xa-laneicon { display: inline-flex; width: 12px; margin-right: 6px; overflow: hidden; }
|
|
150
|
+
.xa-dock .xa-mgrp .xa-laneicon.xa-out { animation: xa-blurout 220ms ease-out both; }
|
|
151
|
+
.xa-dock .xa-mgrp .xa-laneicon.xa-hold { width: 0; margin-right: 0; opacity: 0; }
|
|
152
|
+
.xa-dock .xa-mgrp .xa-laneicon.xa-in { animation: xa-blurin 260ms ease-out both; }
|
|
153
|
+
@keyframes xa-blurout { from { filter: blur(0); opacity: 1; width: 12px; margin-right: 6px; } 60% { filter: blur(4px); opacity: 0; width: 12px; margin-right: 6px; } to { filter: blur(4px); opacity: 0; width: 0; margin-right: 0; } }
|
|
154
|
+
@keyframes xa-blurin { from { filter: blur(4px); opacity: 0; width: 0; margin-right: 0; } 40% { filter: blur(4px); opacity: 0; width: 12px; margin-right: 6px; } to { filter: blur(0); opacity: 1; width: 12px; margin-right: 6px; } }
|
|
155
|
+
.xa-dock .xa-mgrp .xa-lanepick { display: inline-flex; align-items: center; gap: 2px; margin-right: 2px; }
|
|
156
|
+
.xa-dock .xa-mgrp .xa-lanepick .xa-alt { gap: 5px; height: 24px; padding: 0 6px; border-radius: 4px; font-size: 11px; line-height: 1; font-weight: 500; color: var(--xa-t4); animation: xa-altin 200ms cubic-bezier(.2,.7,.2,1) both; }
|
|
157
|
+
.xa-dock .xa-mgrp .xa-lanepick .xa-alt:hover { color: var(--xa-t1); }
|
|
158
|
+
.xa-dock .xa-mgrp .xa-lanepick .xa-alt.xa-na { color: var(--xa-amber); }
|
|
159
|
+
.xa-dock .xa-mgrp .xa-lanepick .xa-alt .xa-dot { width: 6px; height: 6px; background: var(--xa-amber); border-radius: 1px; }
|
|
160
|
+
@keyframes xa-altin { from { opacity: 0; transform: translateX(10px); filter: blur(2px); } to { opacity: 1; transform: none; filter: none; } }
|
|
161
|
+
.xa-dock .xa-txt.xa-down { padding: 0 9px; height: 26px; background: var(--xa-amber-wash); border: 1px solid var(--xa-amber-line); color: var(--xa-amber); }
|
|
162
|
+
.xa-dock .xa-txt.xa-down:hover { background: rgba(217,154,78,0.13); }
|
|
163
|
+
.xa-dock .xa-txt.xa-down .xa-dot { width: 6px; height: 6px; background: var(--xa-amber); border-radius: 1px; }
|
|
164
|
+
.xa-dock .xa-send { width: 24px; height: 24px; border-radius: 4px; background: var(--xa-send); color: var(--xa-ground); }
|
|
165
|
+
.xa-dock .xa-send:hover { background: var(--xa-send-hover); }
|
|
166
|
+
.xa-dock .xa-send.xa-idle { background: rgba(var(--xa-ink),0.10); color: var(--xa-t5); }
|
|
167
|
+
.xa-dock .xa-send.xa-idle:hover { background: rgba(var(--xa-ink),0.14); }
|
|
168
|
+
/* send ⇄ stop: one 24px square. While a turn runs the arrow gives way to a breathing square
|
|
169
|
+
inside a faint ring, with a low-opacity light running the edge — the same 1.4s clock as the
|
|
170
|
+
transcript's mark. Clicking it stops the turn. */
|
|
171
|
+
.xa-dock .xa-send { position: relative; overflow: hidden; transition: background 160ms cubic-bezier(.2,.7,.2,1), color 160ms cubic-bezier(.2,.7,.2,1), transform 90ms cubic-bezier(.2,.7,.2,1); }
|
|
172
|
+
.xa-dock .xa-send:active { transform: scale(0.88); } /* the press — send and stop alike; release is the click */
|
|
173
|
+
.xa-dock .xa-send .xa-arrow, .xa-dock .xa-send .xa-stop { position: absolute; inset: 0; display: flex; align-items: center; justify-content: center; transition: opacity 160ms cubic-bezier(.2,.7,.2,1), transform 160ms cubic-bezier(.2,.7,.2,1), filter 160ms cubic-bezier(.2,.7,.2,1); }
|
|
174
|
+
.xa-dock .xa-send .xa-stop span { width: 9px; height: 9px; background: currentColor; border-radius: 3px; } /* the ring's rx and the knob's radius — one number */
|
|
175
|
+
.xa-dock .xa-send .xa-stop { opacity: 0; transform: scale(0.6); filter: blur(2px); }
|
|
176
|
+
.xa-dock .xa-send.xa-running { background: rgba(var(--xa-ink),0.11); color: var(--xa-t1); } /* on the plate 8% vanished and the ring read as a smaller square */
|
|
177
|
+
.xa-dock .xa-send.xa-running .xa-arrow { opacity: 0; transform: scale(0.6); filter: blur(2px); }
|
|
178
|
+
.xa-dock .xa-send.xa-running .xa-stop { opacity: 1; transform: none; filter: none; }
|
|
179
|
+
.xa-dock .xa-send.xa-running .xa-stop span { animation: xa-breathe 1.4s ease-in-out infinite; }
|
|
180
|
+
/* both animations are gated on .xa-running so they start on the same instant as the square's */
|
|
181
|
+
/* hover while running: the same square, the same breath, the same running light — only the
|
|
182
|
+
colours invert. White ground, black square, a dark light on the edge. Nothing pauses. */
|
|
183
|
+
.xa-dock .xa-send.xa-running:hover, .xa-dock .xa-send.xa-running:focus-visible { background: var(--xa-send-hover); color: var(--xa-ground); }
|
|
184
|
+
|
|
185
|
+
/* ── menus ────────────────────────────────────────────────────────────── */
|
|
186
|
+
.xa-dock .xa-menu { position: absolute; z-index: 30; display: none; flex-direction: column; padding: 5px; background: var(--xa-menu); border: 1px solid var(--xa-line-menu); border-radius: 8px; max-width: calc(100vw - 32px); }
|
|
187
|
+
.xa-dock .xa-menu.xa-show { display: flex; }
|
|
188
|
+
.xa-dock .xa-menu .xa-h { padding: 7px 9px 6px; }
|
|
189
|
+
.xa-dock .xa-menu .xa-hr { height: 1px; margin: 5px 9px; background: var(--xa-line-soft); }
|
|
190
|
+
/* typed prefixes — one popover for the three: / do · @ read · # for. It opens above the box,
|
|
191
|
+
left-aligned to it, and filters as you type; ↑↓ move, ↵ or ⇥ take, Esc closes. */
|
|
192
|
+
/* the cursor is one 6px square that travels up and down the list; the row it lands on moves its
|
|
193
|
+
content right to make room, the others sit flush at the padding. Both motions linear, 120ms. */
|
|
194
|
+
.xa-dock .xa-menu.xa-typed { position: absolute; }
|
|
195
|
+
.xa-dock .xa-menu.xa-typed .xa-mrow { gap: 8px; padding-left: 9px; transition: padding-left 120ms linear; }
|
|
196
|
+
.xa-dock .xa-menu.xa-typed .xa-mrow .xa-gl { flex: none; display: inline-flex; color: var(--xa-t5); }
|
|
197
|
+
.xa-dock .xa-menu.xa-typed .xa-mrow.xa-on .xa-gl { color: var(--xa-t2); }
|
|
198
|
+
.xa-dock .xa-menu.xa-typed .xa-h + .xa-h, .xa-dock .xa-menu.xa-typed .xa-mrow + .xa-h { margin-top: 4px; }
|
|
199
|
+
.xa-dock .xa-menu.xa-typed .xa-typed-rows { max-height: 312px; overflow-y: auto; scrollbar-width: thin; }
|
|
200
|
+
.xa-dock .xa-menu.xa-typed .xa-mrow.xa-on { padding-left: 23px; }
|
|
201
|
+
.xa-dock .xa-menu.xa-typed .xa-mark { position: absolute; left: 14px; top: 0; width: 6px; height: 6px; border-radius: 1px; background: var(--xa-send); pointer-events: none; transition: transform 120ms linear; }
|
|
202
|
+
.xa-dock .xa-menu.xa-typed .xa-mark.xa-still { transition: none; }
|
|
203
|
+
.xa-dock .xa-menu.xa-typed .xa-mark[hidden] { display: none; }
|
|
204
|
+
.xa-dock .xa-menu.xa-typed .xa-mrow .xa-tok { display: flex; min-width: 0; color: var(--xa-t2); }
|
|
205
|
+
.xa-dock .xa-menu.xa-typed .xa-mrow .xa-tok .xa-dir { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; color: var(--xa-t4); } /* the folder gives way; the name never does */
|
|
206
|
+
.xa-dock .xa-menu.xa-typed .xa-mrow .xa-tok .xa-name { flex: none; white-space: nowrap; }
|
|
207
|
+
.xa-dock .xa-menu.xa-typed .xa-mrow .xa-desc { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: 11px; color: var(--xa-t5); }
|
|
208
|
+
.xa-dock .xa-menu.xa-typed .xa-mrow.xa-on .xa-desc { color: var(--xa-t4); }
|
|
209
|
+
.xa-dock .xa-menu.xa-typed .xa-mrow .xa-kind { margin-left: auto; flex: none; font-size: 10px; letter-spacing: 0.04em; text-transform: uppercase; color: var(--xa-t6); }
|
|
210
|
+
.xa-dock .xa-menu.xa-typed .xa-none { padding: 7px 9px; font-size: 11px; color: var(--xa-t5); }
|
|
211
|
+
/* a taken reference is a chip in the SENT message (`.xa-chip`, with its glyph); in the box it is the
|
|
212
|
+
words as typed — the bench's field is the textarea and nothing else */
|
|
213
|
+
.xa-dock .xa-box textarea { letter-spacing: -0.006em; } /* a form control does not inherit it */
|
|
214
|
+
.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; }
|
|
215
|
+
.xa-dock .xa-chip svg { flex: none; color: var(--xa-t4); }
|
|
216
|
+
.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); }
|
|
217
|
+
.xa-dock .xa-mrow .xa-rail { width: 2px; height: 13px; background: transparent; flex: none; }
|
|
218
|
+
.xa-dock .xa-mrow.xa-tall { align-items: stretch; padding: 8px 9px; } .xa-mrow.xa-tall .xa-rail { height: auto; }
|
|
219
|
+
.xa-dock .xa-mrow .xa-col { display: flex; flex-direction: column; gap: 3px; min-width: 0; }
|
|
220
|
+
.xa-dock .xa-mrow .xa-sub { font-size: 11px; line-height: 1.35; color: var(--xa-t5); }
|
|
221
|
+
.xa-dock .xa-mrow .xa-idx { margin-left: auto; font-size: 11px; color: var(--xa-t6); }
|
|
222
|
+
.xa-dock .xa-mrow .xa-na { margin-left: auto; font-size: 10px; color: var(--xa-t6); }
|
|
223
|
+
.xa-dock .xa-mrow:hover { background: rgba(var(--xa-ink),0.04); color: var(--xa-t2); }
|
|
224
|
+
.xa-dock .xa-menu .xa-mrow + .xa-mrow { margin-top: 2px; } /* a chosen row and a hovered one beneath it are two things, not one block */
|
|
225
|
+
.xa-dock .xa-mrow.xa-on { background: var(--xa-wash-hover); color: var(--xa-t1); font-weight: 500; }
|
|
226
|
+
.xa-dock .xa-mrow.xa-on .xa-rail { background: var(--xa-send); }
|
|
227
|
+
.xa-dock .xa-mrow.xa-on.xa-amber { background: var(--xa-amber-wash); color: var(--xa-amber); }
|
|
228
|
+
.xa-dock .xa-mrow.xa-on.xa-amber .xa-rail { background: var(--xa-amber); }
|
|
229
|
+
.xa-dock .xa-mrow.xa-on.xa-amber .xa-sub { color: var(--xa-amber-dim); }
|
|
230
|
+
.xa-dock .xa-mrow:disabled { color: var(--xa-t6); } .xa-mrow:disabled:hover { background: none; }
|
|
231
|
+
.xa-dock .xa-mrow .xa-chev { margin-left: auto; color: var(--xa-t6); }
|
|
232
|
+
/* effort — locked. H's structure (the chosen cell opens up to hold the word) with I's motion (it
|
|
233
|
+
glides). At Ultra the five filled cells FUSE into one bar at their own 10px height and 1px
|
|
234
|
+
corners — the gaps close, inner corners go square — and one fixed lattice of 2px squares on a
|
|
235
|
+
3px pitch, three rows, runs the bar. Nothing moves: a crest of brightness travels right-to-left
|
|
236
|
+
along it, stepping up through five bands toward Ultra; every square twinkles on its own clock. */
|
|
237
|
+
.xa-dock .xa-line.xa-cells { display: flex; align-items: center; padding: 7px 8px; width: 100%; }
|
|
238
|
+
.xa-dock .xa-ends { display: flex; justify-content: space-between; padding: 7px 9px 0; font-size: 10px; line-height: 1; color: var(--xa-t5); }
|
|
239
|
+
.xa-dock .xa-ends + .xa-line.xa-cells { padding-top: 6px; }
|
|
240
|
+
.xa-dock .xa-sl.xa-cells { position: relative; flex: 1; display: flex; align-items: center; gap: 2px; height: 16px; cursor: pointer; touch-action: none; user-select: none; }
|
|
241
|
+
.xa-dock .xa-sl.xa-cells .xa-cell { position: relative; z-index: 1; flex: 1 1 0; height: 10px; background: rgba(var(--xa-ink),0.07); border-radius: 1px; display: flex; align-items: center; justify-content: center; overflow: hidden; font-size: 10px; font-weight: 600; color: transparent; white-space: nowrap; transition: background 120ms, height 120ms, border-radius 120ms; will-change: transform; transform-origin: left center; }
|
|
242
|
+
.xa-dock .xa-sl.xa-cells .xa-cell.xa-on { background: rgba(var(--xa-ink),0.26); }
|
|
243
|
+
.xa-dock .xa-sl.xa-cells .xa-cell.xa-cur { flex: 0 0 54px; height: 16px; background: var(--xa-send); color: var(--xa-ground); border-radius: 3px; animation: xa-word 220ms ease-out both; }
|
|
244
|
+
@keyframes xa-word { from { color: transparent; } 60% { color: transparent; } to { color: var(--xa-ground); } }
|
|
245
|
+
.xa-dock .xa-sl.xa-cells:hover .xa-cell.xa-pre { background: rgba(var(--xa-ink),0.16); }
|
|
246
|
+
.xa-dock .xa-sl.xa-cells.xa-ultra { gap: 0; }
|
|
247
|
+
.xa-dock .xa-sl.xa-cells.xa-ultra .xa-cell.xa-cur { margin-left: 2px; }
|
|
248
|
+
.xa-dock .xa-sl.xa-cells.xa-ultra .xa-cell.xa-on { border-radius: 0; }
|
|
249
|
+
.xa-dock .xa-sl.xa-cells.xa-ultra .xa-cell.xa-on:first-child { border-radius: 3px 0 0 3px; } /* the bar's outer corners take the knob's radius */
|
|
250
|
+
.xa-dock .xa-sl.xa-cells.xa-ultra .xa-cell.xa-on:nth-child(5) { border-radius: 0 3px 3px 0; }
|
|
251
|
+
.xa-dock .xa-sl.xa-cells .xa-flow { position: absolute; top: 3px; height: 10px; border-radius: 3px; overflow: hidden; z-index: 2; pointer-events: none; animation: xa-flowin 320ms ease-out both; }
|
|
252
|
+
@keyframes xa-flowin { from { opacity: 0; } to { opacity: 1; } }
|
|
253
|
+
.xa-dock .xa-sl.xa-cells .xa-flow i { position: absolute; left: var(--xa-x); top: var(--xa-y); width: 2px; height: 2px; background: var(--xa-send-hover); opacity: var(--xa-lo);
|
|
254
|
+
animation: xa-wave 1600ms ease-in-out infinite, xa-twinkle var(--xa-tt) ease-in-out infinite; animation-delay: var(--xa-wd), var(--xa-td); }
|
|
255
|
+
@keyframes xa-wave { 0%, 100% { opacity: var(--xa-lo); } 38% { opacity: var(--xa-hi); } }
|
|
256
|
+
@keyframes xa-twinkle { 0%, 100% { background: rgba(var(--xa-ink),0.55); } 50% { background: var(--xa-send-hover); } }
|
|
257
|
+
|
|
258
|
+
/* ── tooltip ──────────────────────────────────────────────────────────── */
|
|
259
|
+
.xa-dock .xa-tip { position: absolute; z-index: 35; display: none; align-items: flex-start; gap: 18px; max-width: 268px; padding: 8px 10px; background: var(--xa-menu); border: 1px solid var(--xa-line-tip); border-radius: 6px; pointer-events: none; }
|
|
260
|
+
.xa-dock .xa-tip.xa-show { display: flex; }
|
|
261
|
+
.xa-dock .xa-tip .xa-t { font-size: 11px; line-height: 1.4; color: var(--xa-t2); }
|
|
262
|
+
.xa-dock .xa-tip .xa-k { font-size: 10px; line-height: 1.4; color: var(--xa-t6); white-space: nowrap; }
|
|
263
|
+
|
|
264
|
+
/* ── the two rules the BENCH settled after the prototype was locked ──────────
|
|
265
|
+
The prototype compacts on the VIEWPORT (`@media (max-width: 560px)`), which is the wrong measure
|
|
266
|
+
for a panel: a 520px panel in a 1600px window would never compact. D11 accepted the container
|
|
267
|
+
rule, and the bench carries it. Everything else above is the prototype's. */
|
|
268
|
+
/* the container is the DOCK, as in the bench (`.dock { container-type: inline-size }`) — it was the
|
|
269
|
+
workspace row here, which measured a narrower box than the one the thresholds were chosen for */
|
|
270
|
+
@container (max-width: 600px) { .xa-dock .xa-ctx .xa-seg.xa-branch, .xa-dock .xa-ctx .xa-vr.xa-branch { display: none; } }
|
|
271
|
+
/* Narrow: every dim segment goes, and the dividers with them — the bench's rule, unqualified.
|
|
272
|
+
There was a `:not(.xa-keep)` here so the run-location chip ("This machine" / "Hosted sandbox")
|
|
273
|
+
survived, on the argument that a billed sandbox must stay visible. Removed 2026-09-15: a chip
|
|
274
|
+
marked `dim` and then exempted from the dim rule is having it both ways, and it was the last
|
|
275
|
+
divergence from the bench at 480/420. If that cost ever needs to be visible when narrow, the fix
|
|
276
|
+
is to stop calling the segment dim — not to carve a hole in the rule that hides dim things. */
|
|
277
|
+
@container (max-width: 520px) { .xa-dock .xa-ctx .xa-seg.xa-dim, .xa-dock .xa-ctx > .xa-vr:not(.xa-branch) { display: none; } }
|
|
278
|
+
/* the bench lists `.ctx .diff` here too, but its own `.ctx .diff { display: flex }` is declared AFTER the
|
|
279
|
+
query and wins — so in the bench the diff never hides, at any width (measured at 420: `+1 −1` stays).
|
|
280
|
+
Ported as it BEHAVES, not as it was written. */
|
|
281
|
+
@container (max-width: 440px) { .xa-dock .xa-ctx .xa-meter > span:not(.xa-cells), .xa-dock .xa-split .xa-vr, .xa-dock .xa-split .xa-caret { display: none; } }
|
|
282
|
+
/* the strip's labels never wrap; the workspace's NAME is the one segment that ellipsizes, because it
|
|
283
|
+
says which project this turn touches and the dim segments give way around it (the bench's rules) */
|
|
284
|
+
.xa-dock .xa-ctx .xa-meter, .xa-dock .xa-ctx .xa-act1, .xa-dock .xa-split button { white-space: nowrap; }
|
|
285
|
+
.xa-dock .xa-ctx .xa-seg.xa-name { min-width: 0; }
|
|
286
|
+
.xa-dock .xa-ctx .xa-seg.xa-name span { min-width: 0; overflow: hidden; text-overflow: ellipsis; }
|
|
287
|
+
/* a disabled control says so — the prototype only ever renders live ones */
|
|
288
|
+
.xa-dock button:disabled { cursor: not-allowed; color: var(--xa-t6); }
|
|
289
|
+
.xa-dock .xa-segc button:disabled:hover, .xa-dock .xa-txt:disabled:hover, .xa-dock .xa-ic:disabled:hover { background: none; color: var(--xa-t6); }
|
|
290
|
+
/* the send square, when there is nothing to send, is not a button to press */
|
|
291
|
+
/* the ghost text the product's suggestions write, in the box's own metrics — the field is positioned
|
|
292
|
+
only while a suggestion is showing, so an idle field is the bench's: a textarea and nothing more */
|
|
293
|
+
.xa-dock .xa-box .xa-field.xa-ghosting { position: relative; }
|
|
294
|
+
.xa-dock .xa-box .xa-ghost { position: absolute; inset: 0; pointer-events: none; white-space: pre-wrap; overflow-wrap: break-word; overflow: hidden; font: inherit; font-size: 13px; line-height: 1.5; letter-spacing: -0.006em; color: transparent; }
|
|
295
|
+
.xa-dock .xa-box .xa-ghost .xa-ghost-text { color: rgba(var(--xa-ink), 0.22); }
|
|
296
|
+
/* the trays the panel carries that the prototype does not (Tasks, background runs, delegated
|
|
297
|
+
agents) are the transcript's `.xa-tasks`; nothing here restyles them. */
|
|
298
|
+
/* reduced motion: `transcript.css` carries the ONE rule for the whole panel — the bench's `none`. This
|
|
299
|
+
file used to shorten every duration to 0.001ms instead, which still runs each animation to its end
|
|
300
|
+
state and fires its events; two rules for one preference disagreed with each other and with the bench. */
|
|
301
|
+
|
|
302
|
+
/* ── what a real host needs that the prototype's fixtures did not ────────────
|
|
303
|
+
The prototype lists three models and four harnesses, so its menus never scroll and never need a
|
|
304
|
+
search. A live catalog does both. These four rules are the ONLY additions to the menu. */
|
|
305
|
+
.xa-dock .xa-menu .xa-mrows { display: flex; flex-direction: column; max-height: 312px; overflow-y: auto; scrollbar-width: thin; scrollbar-color: rgba(var(--xa-ink), 0.12) transparent; }
|
|
306
|
+
.xa-dock .xa-menu .xa-search { display: block; width: 100%; height: 26px; margin: 2px 0 4px; padding: 0 9px; background: var(--xa-well); border: 1px solid var(--xa-line-soft); border-radius: 4px; font: inherit; font-size: 11px; color: var(--xa-t1); outline: none; box-shadow: none; }
|
|
307
|
+
.xa-dock .xa-menu .xa-search::placeholder { color: var(--xa-t6); }
|
|
308
|
+
.xa-dock .xa-menu .xa-none { padding: 7px 9px; font-size: 11px; color: var(--xa-t5); }
|
|
309
|
+
|
|
310
|
+
/* 🔴 ONE correction to the prototype, because the prototype contradicts ITSELF here. Its comment on
|
|
311
|
+
the typed popover says "the row it lands on moves its content right to make room, the others sit
|
|
312
|
+
FLUSH at the padding" — and its rows inherit `justify-content: center` from the button reset, so
|
|
313
|
+
a row whose content is narrower than the popover is centred instead. Measured in the prototype
|
|
314
|
+
itself: four rows, glyph offsets 92.6 / 91.0 / 56.5 / 74.6px from their own left edge. The one
|
|
315
|
+
declaration below is what the comment describes; it belongs in the prototype too. */
|
|
316
|
+
.xa-dock .xa-menu .xa-mrow { justify-content: flex-start; }
|
|
317
|
+
|
|
318
|
+
/* ⚠️ The prototype has TWO rows and they are not the same object: `.xrow` in the transcript and
|
|
319
|
+
`.row` in a menu. This port's transcript already owns `xa-row` (it is the step row), so the
|
|
320
|
+
menu's row is `xa-mrow` — the prototype's `.row` rules verbatim, under a name that cannot
|
|
321
|
+
inherit the step row's geometry. It did: `flex-wrap: wrap` from the step row put a menu row's
|
|
322
|
+
description on a second line. */
|
|
323
|
+
|
|
324
|
+
/* 🔴 A SECOND correction to the prototype, the same shape as the one above: a rule written for
|
|
325
|
+
one variant that the other variant inherits wrongly.
|
|
326
|
+
`.xa-mgrp .xa-txt[data-lanepick] { gap: 0 }` is correct for the NORMAL lane control, because
|
|
327
|
+
its icon carries its own `margin-right: 6px` so the blur animation can collapse it to
|
|
328
|
+
`width: 0; margin-right: 0`. The UNAVAILABLE variant swaps that icon for a `.xa-dot`, which
|
|
329
|
+
has no margin of its own — so it inherits gap 0 and sits flush against the word. Measured in
|
|
330
|
+
the running app: dot 865→871, name 871→958 — a 0 px gap, with the chevron only LOOKING spaced
|
|
331
|
+
because its glyph has internal whitespace inside a 10 px box.
|
|
332
|
+
The dot is not animated, so it can simply own its spacing the way the icon does. This belongs
|
|
333
|
+
in the prototype too. */
|
|
334
|
+
.xa-dock .xa-mgrp .xa-txt.xa-down .xa-dot { margin-right: 6px; }
|
package/src/styles.css
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* `@xenosystem/agent-conversation/styles.css` — everything the conversation needs that is not a
|
|
3
|
+
* Tailwind utility. A bundled host imports this beside `agent-interface-ui/agent.css`; the panel's
|
|
4
|
+
* compiled stylesheet inlines it. Plain CSS, `xa-` prefixed, scoped under `.xa-transcript`.
|
|
5
|
+
*/
|
|
6
|
+
@import './transcript.css';
|
|
7
|
+
@import './composer.css';
|