/* Structured transcript styling, ported from src/styles.css's "structured view (#140)" block for the React pane (#246). The class names are the contract shared with docs/STRUCTURED-VIEW.md's row kinds; the components in this directory emit exactly these. Pane chrome (header, title, disconnect) is not here — like TerminalPane, StructuredPane renders the body only and whatever composes it owns the header. Hierarchy is deliberate: the approval is the loudest thing on screen, tool rows are quiet cards, and the agent's prose carries the reading weight. */ .structured-config { position: relative; flex: 0 0 40px; } .structured-config-trigger { width: 40px; height: 40px; display: inline-flex; justify-content: center; align-items: center; padding: 0; border: 0; border-radius: var(--r-2); background: transparent; color: var(--muted); cursor: pointer; } .structured-config-trigger svg { width: 18px; height: 18px; fill: none; stroke: currentColor; stroke-width: 1.75; stroke-linecap: round; } .structured-config-trigger:hover, .structured-config-trigger[aria-expanded="true"] { color: var(--ink); background: var(--surface-3); } .structured-config-trigger:focus-visible, .structured-config-select:focus-visible, .structured-config-toggle:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; } .structured-config-menu { position: absolute; z-index: 20; bottom: calc(100% + var(--sp-2)); right: 0; width: min(320px, 86vw); padding: var(--sp-2); border: 1px solid var(--border-strong); border-radius: var(--r-2); background: var(--surface); box-shadow: var(--shadow-2); } .structured-config-row { display: grid; grid-template-columns: minmax(80px, 1fr) minmax(0, 1.6fr); align-items: center; gap: var(--sp-3); min-height: 34px; padding: var(--sp-1) var(--sp-2); color: var(--ink); font-size: var(--fs-12); } .structured-config-row + .structured-config-row { border-top: 1px solid var(--border); } .structured-config-name { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .structured-config-select { min-width: 0; height: 28px; padding: 0 var(--sp-2); border: 1px solid var(--border); border-radius: var(--r-1); background: var(--surface-2); color: var(--ink); font: inherit; } .structured-config-toggle { justify-self: end; width: 17px; height: 17px; accent-color: var(--accent); } .structured-body { flex: 1 1 auto; min-height: 0; display: flex; } .structured-pane, .structured-input { font-family: var(--font-sans); } .st-row-agent code, .st-tool-text, .st-tool-detail pre, .st-diff, .st-approval-path { font-family: var(--font-mono); } .structured-main { min-width: 0; min-height: 0; max-width: 820px; margin-inline: auto; width: 100%; display: flex; flex-direction: column; flex: 1 1 auto; } .structured-scroll { flex: 1 1 auto; min-height: 0; min-width: 0; overflow-y: auto; } .structured-rows { display: flex; flex-direction: column; min-width: 0; } .structured-activity { flex: 0 0 auto; display: flex; align-items: center; gap: var(--sp-2); min-height: 30px; padding: var(--sp-1) var(--sp-3); color: var(--muted); font-size: var(--fs-11); font-variant-numeric: tabular-nums; } .structured-activity[hidden] { display: none; } .structured-activity-pulse { position: relative; width: 7px; height: 7px; flex: 0 0 auto; border-radius: 50%; background: var(--live); box-shadow: 0 0 0 0 var(--live-glow); animation: structured-thinking 1.6s ease-out infinite; } @keyframes structured-thinking { 50% { box-shadow: 0 0 0 5px transparent; } } /* every transcript row carries its own layout; none of them are cards */ .st-row { display: flex; gap: var(--sp-3); padding: var(--sp-3); min-width: 0; } .st-body { flex: 1 1 auto; min-width: 0; } /* User turns read as compact chat bubbles while the padded row remains the full hover/copy target. */ .st-row-user { justify-content: flex-end; } .st-row-user .st-body { flex: 0 1 auto; max-width: min(86%, 72ch); padding: var(--sp-2) var(--sp-3); border-radius: var(--r-2); background: var(--surface-3); } .st-row-user:hover { background: var(--surface-2); } /* Queued messages: optimistic user bubbles, not yet sent. */ .st-row-queued { justify-content: flex-end; pointer-events: none; } .st-row-queued .st-body { flex: 0 1 auto; max-width: min(86%, 72ch); padding: var(--sp-2) var(--sp-3); border-radius: var(--r-2); background: var(--surface-3); opacity: 0.45; filter: blur(0.5px); } .st-user-text { white-space: pre-wrap; overflow-wrap: anywhere; } .st-user-image { display: block; max-width: min(100%, 480px); max-height: 360px; margin-top: var(--sp-2); border-radius: var(--r-1); object-fit: contain; } /* agent prose: no card, no background — plain text is the point */ .st-row-agent .st-body p { margin: 0 0 var(--sp-2); overflow-wrap: anywhere; } .st-row-agent .st-body p:last-child { margin-bottom: 0; } .st-row-agent .st-body > :first-child { margin-top: 0; } .st-row-agent .st-body > :last-child { margin-bottom: 0; } .st-row-agent .st-body h1, .st-row-agent .st-body h2, .st-row-agent .st-body h3, .st-row-agent .st-body h4 { margin: var(--sp-4) 0 var(--sp-2); color: var(--ink); font-size: var(--fs-14); line-height: 1.35; } .st-row-agent .st-body ul, .st-row-agent .st-body ol { margin: var(--sp-2) 0; padding-left: var(--sp-5); } .st-row-agent .st-body li + li { margin-top: var(--sp-1); } .st-row-agent .st-body pre { margin: var(--sp-2) 0; padding: var(--sp-3); overflow-x: auto; border: 1px solid var(--border); border-radius: var(--r-2); background: var(--surface-2); } .st-row-agent .st-body pre code { padding: 0; border: 0; background: transparent; } .st-row-agent .st-body a { color: var(--ink); text-decoration-color: var(--border-strong); text-underline-offset: 2px; } .st-markdown-table-wrap { max-width: 100%; margin: var(--sp-2) 0; overflow-x: auto; border: 1px solid var(--border); border-radius: var(--r-2); } .st-row-agent table { width: 100%; border-collapse: collapse; font-size: var(--fs-12); } .st-row-agent th, .st-row-agent td { padding: var(--sp-2) var(--sp-3); border-bottom: 1px solid var(--border); text-align: left; vertical-align: top; white-space: nowrap; } .st-row-agent th { color: var(--ink); background: var(--surface-2); font-weight: 600; } .st-row-agent tr:last-child td { border-bottom: 0; } .st-row-agent code { background: var(--surface-2); border: 1px solid var(--border); border-radius: var(--r-1); padding: 0 3px; font-size: 0.92em; } .st-row-thought { color: var(--faint); font-size: var(--fs-12); line-height: 1.4; white-space: pre-wrap; overflow-wrap: anywhere; } .st-row-notice { color: var(--faint); font-size: var(--fs-12); } .st-turn-meta { align-self: flex-start; display: flex; align-items: center; gap: var(--sp-2); margin: 0 var(--sp-3) var(--sp-2); padding: var(--sp-1) var(--sp-2); border-radius: var(--r-1); color: var(--faint); font-size: var(--fs-11); font-variant-numeric: tabular-nums; } .st-turn-meta:hover { background: var(--surface-2); color: var(--muted); } .st-turn-meta-dot { width: 5px; height: 5px; flex: 0 0 auto; border-radius: 50%; background: var(--live); } .st-turn-meta-cancelled .st-turn-meta-dot { background: var(--warn); } .st-turn-meta-failed .st-turn-meta-dot { background: var(--danger); } .st-copyable { position: relative; border-radius: var(--r-1); cursor: copy; transition: background var(--dur-fast) var(--ease-out); } .st-copyable::after { content: none; position: absolute; top: var(--sp-1); right: var(--sp-1); padding: 1px var(--sp-1); border-radius: var(--r-1); background: var(--surface-3); color: var(--faint); font-size: var(--fs-11); font-style: normal; line-height: 1.4; opacity: 0; pointer-events: none; transition: opacity var(--dur-fast) var(--ease-out); } .st-copyable:focus-visible { background: var(--surface-2); outline: none; } @media (hover: hover) { .st-copyable:hover { background: var(--surface-2); } .st-copyable:hover::after { content: "copy"; opacity: 1; } .st-copyable[data-copy-state="copied"]:hover::after { content: "copied"; color: var(--live); } .st-copyable[data-copy-state="error"]:hover::after { content: "copy failed"; color: var(--danger); } } /* tool rows: bordered, compact, deliberately not lifted */ .st-tool { flex: 1 1 auto; border: 1px solid var(--border); border-radius: var(--r-2); min-width: 0; } .st-tool-head { appearance: none; width: 100%; border: 0; background: transparent; color: inherit; font: inherit; cursor: pointer; display: flex; align-items: center; gap: var(--sp-2); padding: var(--sp-2) var(--sp-3); min-width: 0; transition: background var(--dur-fast) var(--ease-out); } .st-tool-head:hover { background: var(--surface-2); } .st-row-tool:hover, .st-row-approval:hover { background: var(--surface-2); } .st-tool-glyph { width: 16px; flex: 0 0 auto; text-align: center; color: var(--faint); } .st-tool-name { font-weight: 500; flex: 0 0 auto; } .st-tool-arg { color: var(--muted); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; min-width: 0; text-align: left; } .st-tool-meta { margin-left: auto; flex: 0 0 auto; font-size: var(--fs-11); color: var(--faint); font-variant-numeric: tabular-nums; } .st-tool-meta-running { color: var(--live); } .st-tool-meta-failed { color: var(--danger); } .st-tool-out { border-top: 1px solid transparent; } .st-disclosure { display: grid; grid-template-rows: 0fr; opacity: 0; transition: grid-template-rows var(--dur) var(--ease-out), opacity var(--dur-fast) var(--ease-out), border-color var(--dur-fast) var(--ease-out); } .st-disclosure.is-expanded { grid-template-rows: 1fr; opacity: 1; } .st-disclosure-clip { min-height: 0; overflow: hidden; } .st-tool-out.is-expanded { border-top-color: var(--border); } .st-tool-out .st-disclosure-inner { display: flex; flex-direction: column; gap: var(--sp-2); padding: var(--sp-2) var(--sp-3); } /* `display: flex` above outranks the UA sheet's `[hidden]` (same pitfall as `.wt-step`/`.raw-wrap`) — restate it explicitly. */ .st-tool-out[hidden] { display: none; } .st-tool-text { font-size: var(--fs-12); color: var(--muted); white-space: pre-wrap; overflow-wrap: anywhere; overflow-x: auto; } .st-tool-detail { min-width: 0; } .st-tool-detail-label { margin-bottom: var(--sp-1); color: var(--faint); font-size: var(--fs-11); letter-spacing: 0.1em; text-transform: uppercase; } .st-tool-detail pre { margin: 0; padding: var(--sp-2); border: 1px solid var(--border); border-radius: var(--r-1); background: var(--bg); color: var(--muted); font: inherit; font-size: var(--fs-12); white-space: pre-wrap; overflow-wrap: anywhere; overflow-x: auto; } .st-tool-fact { display: flex; align-items: baseline; gap: var(--sp-2); color: var(--faint); font-size: var(--fs-11); } .st-tool-fact code { font-family: var(--font-mono); font-variant-numeric: tabular-nums; } .st-tool-exit-ok { color: var(--live); } .st-tool-exit-failed { color: var(--danger); } .st-tool-image { display: block; width: auto; max-width: min(100%, 720px); max-height: 480px; border: 1px solid var(--border); border-radius: var(--r-1); object-fit: contain; } .st-tool-audio { display: block; width: min(100%, 480px); min-height: var(--control-h); } .st-tool-resource { display: grid; grid-template-columns: auto minmax(0, 1fr); align-items: baseline; gap: var(--sp-1) var(--sp-2); min-width: 0; padding: var(--sp-2); border: 1px solid var(--border); border-radius: var(--r-1); background: var(--bg); font-size: var(--fs-12); } .st-tool-resource-name { color: var(--ink); font-weight: 500; } .st-tool-resource-uri { min-width: 0; overflow-wrap: anywhere; color: var(--muted); } .st-tool-resource-description { grid-column: 1 / -1; color: var(--muted); } .st-tool-terminal { color: var(--muted); font-family: var(--font-mono); font-size: var(--fs-12); } .st-tool-raw { color: var(--faint); font-size: var(--fs-11); } .st-tool-raw summary { width: fit-content; padding-block: var(--sp-1); cursor: pointer; user-select: none; transition: color var(--dur-fast) var(--ease-out); } .st-tool-raw summary:hover, .st-tool-raw summary:focus-visible { color: var(--ink); } .st-tool-raw summary:focus-visible { border-radius: var(--r-1); outline: 2px solid var(--accent-ring); outline-offset: 2px; } .st-tool-raw-body { display: flex; flex-direction: column; gap: var(--sp-2); padding-top: var(--sp-1); } .st-tool-group { min-width: 0; border: 1px solid var(--border); border-radius: var(--r-2); background: color-mix(in oklab, var(--surface-2) 55%, transparent); padding: var(--sp-1) var(--sp-2); transition: background var(--dur-fast) var(--ease-out); } .st-tool-group:hover { background: color-mix(in oklab, var(--surface-2) 70%, transparent); } .st-tool-group-head { appearance: none; width: 100%; border: 0; background: transparent; color: inherit; font: inherit; cursor: pointer; display: flex; align-items: center; gap: var(--sp-2); padding: 0; min-width: 0; transition: color var(--dur-fast) var(--ease-out); } .st-tool-group-head:hover { background: var(--surface-2); } .st-tool-group-glyph { color: var(--faint); transition: transform var(--dur-fast) var(--ease-out); } .st-tool-group-head[aria-expanded="true"] .st-tool-group-glyph { transform: rotate(90deg); } .st-tool-group-title { flex: 1 1 0; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-weight: 500; } .st-tool-group-body { padding-top: 0; } .st-tool-group-body .st-disclosure-inner { display: flex; flex-direction: column; padding-top: var(--sp-1); } .st-tool-group-body .st-disclosure-inner > .st-row-tool { padding: 0; } /* inside a group, tool cards lose their border and background — the group container already provides the visual boundary. */ .st-tool-group-body .st-tool { border: 0; } .st-tool-group-body .st-tool-head { padding: var(--sp-1) var(--sp-2); border-radius: var(--r-1); } /* intermediate agent text inside a tool group — subdued so the final answer outside the group stays the prominent one. */ .st-tool-group-body .st-row-agent { color: var(--muted); font-size: var(--fs-12); padding: var(--sp-1) var(--sp-2); } .st-tool-group-body .st-row-agent .st-body > :first-child { margin-top: 0; } .st-tool-group-body .st-row-agent .st-body > :last-child { margin-bottom: 0; } .st-tool-group-body .st-row-thought { padding: var(--sp-1) var(--sp-2); } .st-tool-group-body[hidden] { display: none; } /* Live transcript rows resolve into the stream through a short occlusion, matching data becoming concrete without replaying on token patches. */ .st-row-enter { animation: structured-row-enter var(--dur) var(--ease-out) both; } @keyframes structured-row-enter { from { opacity: 0.2; transform: translateY(3px); clip-path: inset(0 0 18% 0); filter: blur(1px); } } .st-diff-block { display: flex; flex-direction: column; gap: var(--sp-1); } .st-diff-path { font-size: var(--fs-11); color: var(--muted); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } /* the diff gets its own horizontal scroller, independent of the page */ .st-diff { font-size: var(--fs-12); overflow-x: auto; border: 1px solid var(--border); border-radius: var(--r-1); } .st-diff pre { margin: 0; } .st-ln { display: block; white-space: pre; padding: 0 var(--sp-3); line-height: 1.4; } .st-ln-add { background: color-mix(in oklab, var(--live) 14%, transparent); } .st-ln-del { background: var(--danger-tint); } .st-ln-ctx { color: var(--muted); } .st-ln-hunk { color: var(--faint); background: var(--surface-2); } .st-ln-eof { color: var(--faint); font-style: italic; } /* the one lifted, card-like element on the surface: the only thing the operator owes a decision on */ .st-approval { border: 1px solid var(--warn); border-radius: var(--r-2); background: color-mix(in oklab, var(--warn) 12%, var(--surface)); box-shadow: var(--shadow-1); padding: var(--sp-3); display: flex; flex-direction: column; gap: var(--sp-2); min-width: 0; } .st-approval-title { color: var(--warn); font-size: var(--fs-11); letter-spacing: 0.1em; text-transform: uppercase; display: flex; align-items: center; gap: var(--sp-2); } .st-approval-what { color: var(--ink); } .st-approval-path { background: var(--surface); border: 1px solid var(--border); border-radius: var(--r-1); padding: var(--sp-2); font-size: var(--fs-12); overflow-x: auto; white-space: pre; } .st-approval-acts { display: flex; gap: var(--sp-2); flex-wrap: wrap; } .st-approval-resolved { font-size: var(--fs-11); color: var(--faint); } /* compact resolved approval inside a tool group — same muted treatment as intermediate agent text so the audit trail is preserved without drawing attention to itself. */ .st-approval-compact { color: var(--muted); font-size: var(--fs-12); padding: var(--sp-1) var(--sp-2); font-style: italic; } .act { appearance: none; font: inherit; font-size: var(--fs-12); height: 26px; padding: 0 var(--sp-3); border-radius: var(--r-2); border: 1px solid var(--border-strong); background: var(--surface); color: var(--ink); cursor: pointer; transition: transform var(--dur-fast) var(--ease-out), background var(--dur-fast) var(--ease-out); } .act:hover { background: var(--surface-3); } .act:active { transform: translateY(1px); } .act:disabled { opacity: 0.5; cursor: not-allowed; } .act.primary { background: var(--accent); color: var(--accent-ink); border-color: var(--accent); font-weight: 500; } .act.deny { color: var(--danger); border-color: color-mix(in oklab, var(--danger) 40%, transparent); } .act.deny:hover { background: var(--danger-tint); border-color: var(--danger); } /* The composer is a sibling of the scrolling transcript, not part of it: it stays reachable at the pane edge without changing transcript scroll math. It is a flush band at the foot of the pane rather than a floating card: its own `--surface` fill is what separates it from the transcript, over a hairline that doubles as the focus indicator. Inner metrics line the draft up with the transcript's own 12px gutter. */ .structured-composer { position: relative; flex: 0 0 auto; padding: var(--sp-1) var(--sp-1) max(var(--sp-1), env(safe-area-inset-bottom)); border-top: 1px solid var(--border); background: var(--surface); display: flex; align-items: flex-end; gap: var(--sp-1); transition: border-color var(--dur-fast) var(--ease-out); } .structured-composer:focus-within { border-top-color: var(--border); } .structured-input-wrap { position: relative; flex: 1 1 auto; min-width: 0; } .structured-attachments { display: flex; flex-wrap: wrap; gap: var(--sp-1); padding: var(--sp-1); } .structured-attachments[hidden] { display: none; } .structured-attachment { display: inline-flex; align-items: center; min-width: 0; max-width: 100%; padding-left: var(--sp-2); background: var(--surface-2); border: 1px solid var(--border); border-radius: var(--r-1); font-size: var(--fs-11); } .structured-attachment > span { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .structured-attachment button { flex-shrink: 0; min-width: var(--tap); min-height: var(--tap); border: 0; background: transparent; color: var(--muted); } .structured-attachment button:hover { color: var(--ink); } .structured-attachment button:disabled { opacity: 0.5; } .structured-input { display: block; width: 100%; min-width: 0; max-height: 160px; min-height: 40px; resize: none; overflow-y: hidden; padding: 10px var(--sp-2); border: 0; border-radius: var(--r-2); background: transparent; color: var(--ink); font-size: var(--fs-13); line-height: 20px; } .structured-input:focus-visible { outline: none; } .structured-composer .structured-send, .structured-composer .structured-cancel { height: 40px; min-height: 40px; border-radius: var(--r-2); font-family: var(--font-sans); } .structured-composer .structured-send { gap: 6px; padding: 0 var(--sp-3); border-color: var(--accent); background: var(--accent); color: var(--accent-ink); font-weight: 650; box-shadow: inset 0 1px 0 color-mix(in oklab, white 24%, transparent); } .structured-composer .structured-send::before, .structured-composer .structured-send::after, .structured-composer .structured-cancel::before, .structured-composer .structured-cancel::after { content: none; } .structured-composer .structured-send svg { width: 16px; height: 16px; fill: none; stroke: currentColor; stroke-width: 1.7; stroke-linecap: round; stroke-linejoin: round; transition: transform var(--dur-fast) var(--ease-out); } .structured-composer .structured-send:hover { background: var(--accent-strong); border-color: var(--accent-strong); color: var(--accent-ink); } .structured-composer .structured-send:hover svg { transform: translateX(2px); } .structured-composer .structured-cancel { position: relative; width: 40px; padding: 0; border-color: transparent; background: transparent; box-shadow: none; color: var(--danger); } .structured-composer .structured-cancel:hover { background: var(--danger-tint); } .structured-cancel-stop { width: 16px; height: 16px; } .structured-cancel-spinner { position: absolute; inset: 4px; width: auto; height: auto; animation: cancel-spin 0.8s linear infinite; } @keyframes cancel-spin { to { transform: rotate(360deg); } } @media (max-width: 520px) { /* One row cannot hold a draft plus three controls at phone width — the draft gets a line of its own and the controls drop below it. */ .structured-composer { flex-wrap: wrap; justify-content: flex-end; padding-left: var(--sp-2); padding-right: var(--sp-2); } /* `order` keeps the draft on the first line: without it the attach button, which precedes it in the DOM, wraps onto a line of its own. */ .structured-input-wrap { flex: 1 1 100%; order: -1; } .structured-composer .structured-config { margin-right: auto; } .structured-config-menu { left: 0; right: auto; } } .structured-command-menu { position: absolute; z-index: var(--z-sticky); right: 0; bottom: calc(100% + var(--sp-2)); left: 0; max-height: min(42vh, 320px); overflow-y: auto; border: 1px solid var(--border-strong); border-radius: var(--r-2); background: var(--surface); box-shadow: var(--shadow-2); } .structured-command-menu[hidden] { display: none; } .structured-command-option { min-height: var(--tap); padding: var(--sp-2) var(--sp-3); border-bottom: 1px solid var(--border); cursor: pointer; } .structured-command-option:last-child { border-bottom: 0; } .structured-command-option:hover, .structured-command-option[aria-selected="true"] { background: var(--accent-tint); } .structured-command-title { display: flex; align-items: baseline; gap: var(--sp-2); min-width: 0; } .structured-command-name { flex: 0 0 auto; color: var(--ink); font-weight: 600; } .structured-command-hint, .structured-command-description { overflow: hidden; color: var(--muted); font-size: var(--fs-11); text-overflow: ellipsis; white-space: nowrap; } .structured-command-hint { min-width: 0; } .structured-command-description { margin-top: var(--sp-1); } .structured-input:focus { outline: none; box-shadow: none; } .structured-input:disabled { color: var(--faint); background: transparent; } /* `.btn` sets `display: inline-flex`, which outranks the UA sheet's `[hidden]` — restate it explicitly (same pitfall as `.st-tool-out`). */ .structured-cancel[hidden] { display: none; } .structured-send[hidden] { display: none; } .structured-error { margin: 0 var(--sp-3); padding: var(--sp-2) var(--sp-3); background: var(--danger-tint); color: var(--danger); font-size: var(--fs-12); border-radius: var(--r-2); } @media (prefers-reduced-motion: reduce) { .act, .st-copyable, .st-copyable::after, .st-disclosure, .st-tool-head, .st-tool-group-glyph { transition-duration: 0.01ms; } .st-row-enter { animation: none; } .structured-activity-pulse { animation: none; } } /* Composer control base. The pane no longer inherits the shared `.btn` kit (it renders standalone, without the terminal pane's header chrome), so the three composer buttons carry their own base here; the `.structured-composer .structured-send` rules above still win on every property they set. */ .structured-attach, .structured-send, .structured-cancel { display: inline-flex; align-items: center; justify-content: center; border: 1px solid var(--border); border-radius: var(--r-2); background: var(--surface-2); color: var(--ink); font-size: var(--fs-13); cursor: pointer; transition: background var(--dur-fast) var(--ease-out), border-color var(--dur-fast) var(--ease-out), color var(--dur-fast) var(--ease-out); } .structured-attach { width: 36px; height: 36px; padding: 0; border-color: transparent; background: transparent; color: var(--muted); align-self: center; } .structured-attach:hover { background: var(--surface-3); color: var(--ink); } .structured-attach:disabled, .structured-send:disabled, .structured-cancel:disabled { opacity: 0.5; cursor: default; } /* The pane's own root: `.attach`'s flex column, without the header it no longer draws. */ .structured-pane { display: flex; flex-direction: column; min-height: 0; height: 100%; background: var(--bg); color: var(--ink); }