diff --git a/docs/devteam/dashboard/index.html b/docs/devteam/dashboard/index.html index cb33c10..9dffb7d 100644 --- a/docs/devteam/dashboard/index.html +++ b/docs/devteam/dashboard/index.html @@ -316,8 +316,25 @@ /* review questions: three bands, the middle one the agent's (sandboxed) page */ .qcard.review { border-left-color: var(--blue); } - main.reviewing { max-width: 1280px; } - main.reviewing > section:not(#review-view) { display: none !important; } + /* the review opens as a wide side panel over the page: a slim header, the agent's page filling + the height, and a compact answer bar whose row list scrolls inside it */ + #review-view:not([hidden]) { position: fixed; top: 0; right: 0; bottom: 0; width: min(1600px, 96vw); z-index: 21; background: var(--surface); border-left: 1px solid var(--line); box-shadow: -16px 0 48px rgba(0,0,0,.28); display: flex; flex-direction: column; gap: 6px; padding: 10px 16px 0; overflow: hidden; } + @media (max-width: 900px) { #review-view:not([hidden]) { width: 100vw; padding: 8px 10px 0; } } + .rv-top { display: flex; align-items: center; gap: 8px; min-width: 0; } + .rv-top h4 { flex: 1; min-width: 0; margin: 0; font-size: 14px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } + .rv-top .icon-btn { flex: none; margin: 0; } + .rv-sub { display: flex; flex-wrap: wrap; gap: 4px 10px; align-items: center; font-size: 11.5px; color: var(--muted); } + .rv-sub details { font-size: 12px; color: var(--fg-2); } + .rv-sub details[open] { flex-basis: 100%; } + .rv-sub details > div { padding: 6px 0 2px; max-height: 22vh; overflow: auto; } + #rv-frame-wrap { flex: 1 1 auto; min-height: 0; display: flex; flex-direction: column; } + #rv-frame-wrap .rv-frame { flex: 1 1 auto; height: auto; min-height: 200px; } + #rv-frame-wrap .rv-frame-label { margin: 0 0 4px; } + #review-view .rv-panel { position: static; flex: none; margin: 0 -16px; border-radius: 0; border-width: 1px 0 0; box-shadow: none; max-height: 48vh; grid-template-columns: minmax(0, 1fr) minmax(220px, 280px); padding: 10px 16px 12px; } + #review-view #rv-preview { max-height: calc(48vh - 24px); overflow: auto; } + @media (max-width: 900px) { #review-view .rv-panel { grid-template-columns: minmax(0, 1fr); overflow: auto; max-height: 45vh; } #review-view #rv-preview { max-height: none; overflow: visible; } } + .rv-rows > summary { cursor: pointer; list-style: none; } + .rv-rows > summary::-webkit-details-marker { display: none; } #review-view { margin-top: 0; } .rv-back { display: inline-flex; align-items: center; gap: 6px; font-size: 12px; color: var(--fg-2); margin: 0 0 10px; } .rv-back:hover { color: var(--fg); } @@ -326,7 +343,7 @@ .rv-pins code { font-size: 11px; } .rv-preview-banner { display: inline-block; font-size: 11px; font-weight: 600; letter-spacing: .04em; color: var(--amber-fg); border: 1px solid color-mix(in srgb, var(--amber) 45%, var(--line)); background: color-mix(in srgb, var(--amber) 9%, var(--surface)); border-radius: 6px; padding: 2px 8px; margin-bottom: 6px; } .rv-frame-label { display: flex; gap: 8px; align-items: center; font-size: 11.5px; color: var(--muted); margin: 14px 0 4px; } - .rv-frame { display: block; width: 100%; height: 480px; min-height: 320px; border: 2px dashed var(--line-2); border-radius: 8px; background: var(--bg); } + .rv-frame { display: block; width: 100%; height: 480px; min-height: 200px; border: 2px dashed var(--line-2); border-radius: 8px; background: var(--bg); } .rv-panel { position: sticky; bottom: 0; z-index: 4; margin-top: 12px; background: var(--surface); border: 1px solid var(--line-2); border-radius: 10px 10px 0 0; box-shadow: 0 -8px 28px rgba(0,0,0,.10); padding: 12px 16px; display: grid; grid-template-columns: minmax(0, 1fr) minmax(220px, 300px); gap: 10px 18px; max-height: 46vh; } .rv-panel h3 { display: flex; flex-wrap: wrap; gap: 8px; align-items: baseline; margin: 0 0 6px; color: var(--fg); } .rv-panel h3 .dim { font-weight: 400; } @@ -474,7 +491,6 @@
${esc(x.d.id)}${strange.length} row${strange.length === 1 ? '' : 's'} in the result ${strange.length === 1 ? 'is' : 'are'} not in the data: ${strange.slice(0, 5).map((r) => `${esc(isPlainObj(r) ? r.id : JSON.stringify(r))}`).join(', ')}
Loading the review…
'; $('rv-frame-wrap').innerHTML = ''; $('rv-panel').hidden = true; $('rv-link').hidden = true; - window.scrollTo(0, 0); if (preview) { const path = params.get('path') || '', ref = params.get('ref') || '', dataPath = params.get('data') || ''; let data = null, note = ''; @@ -1191,6 +1210,8 @@This is how the owner will see the page. Nothing here is a question yet, so nothing can be answered or saved.
- ${note ? `${esc(note)}
` : ''}${info.path ? '' : 'Open it as #review-preview?path=<repo path>&ref=<branch>&data=<repo path>.
'}${esc(info.path)}${info.ref ? ` at ${esc(info.ref)}` : ' on main'}${info.dataPath ? ` · data ${esc(info.dataPath)}${info.data ? '' : ' (not loaded)'}` : ' · no data (add &data=<path>)'}
+ This is how the owner will see the page. Nothing here is a question yet, so nothing can be answered or saved.${esc(note)}
` : ''}${info.path ? '' : 'Open it as #review-preview?path=<repo path>&ref=<branch>&data=<repo path>.
'}`; return; } const rv = info.review; const ok = pinsVerified(info); const pins = info.files.map((f) => `${PIN_WORDS[f.role] || f.role}${esc(f.sha256.slice(0, 12))}`).join(' · ');
const state = info.declined ? 'sent back' : info.status === 'answered' ? 'answered' : info.status !== 'open' ? `${esc(info.status)}` : '';
- $('rv-head').innerHTML = `${esc(String(rv.commit).slice(0, 12))} (${esc(rv.ref)})`]] })}
- ${rv.title && rv.title !== info.question ? `${linkify(info.context)}
` : ''} - ${(info.links || []).length ? `${linkify(info.context)}
` : '', + (info.links || []).length ? `${esc(text)}`;
if (!RV.preview && RV.readonly) {
const doc = info.result_doc;
- el.innerHTML = doc ? `Nothing proposed yet. Work through the page above; its answer shows here.
'} + el.innerHTML = `Nothing proposed yet. Work through the page above; its answer shows here.
'} ${RV.dropped ? `` : ''}`; } async function setProposal(result) { @@ -1380,10 +1403,7 @@