feat(docs): save chat answers as docs — edit screen, commit + push to the .env docs branch
This commit is contained in:
@@ -734,6 +734,40 @@ details.thinking .thinking-text ul { margin: 0 0 0.5rem; }
|
||||
.retry-btn svg { width: 14px; height: 14px; display: block; }
|
||||
.retry-btn:hover { background: var(--brand-soft); color: var(--ink); }
|
||||
|
||||
/* Phase 59 (owner-locked 2026-08-31, TODO.md L3): the "Save as doc"
|
||||
button — the bottom-right action of every completed brain bubble's
|
||||
meta row (the JS gates: admin + a configured docs repo; this rule
|
||||
only styles). The exact visual family of .tune-btn / .retry-btn
|
||||
(same pill size/spacing, the global :focus-visible ring, >=44px via
|
||||
min-height) so the meta actions read as one set — the brand hover
|
||||
pair like Tune (a docs action), the file glyph rides currentColor.
|
||||
margin-inline-start: auto pushes it to the row's RIGHT edge (the
|
||||
TODO's "bottom right"; markLastRetryable keeps it rightmost when
|
||||
the last bubble also carries the Retry button). Contrast:
|
||||
ink-soft on --bg ~8.6:1, hover brand-ink on --brand-soft — AA,
|
||||
same as the family. */
|
||||
.save-as-doc-btn {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
gap: 0.35rem;
|
||||
min-height: 44px;
|
||||
margin-inline-start: auto;
|
||||
padding: 0.35rem 0.8rem;
|
||||
border-radius: 999px;
|
||||
border: 1px solid var(--line);
|
||||
background: transparent;
|
||||
color: var(--ink-soft);
|
||||
font: inherit;
|
||||
font-weight: 600;
|
||||
font-size: 0.82rem;
|
||||
white-space: nowrap;
|
||||
cursor: pointer;
|
||||
}
|
||||
.save-as-doc-btn svg { width: 14px; height: 14px; display: block; }
|
||||
.save-as-doc-btn:hover { background: var(--brand-soft); color: var(--brand-ink); }
|
||||
.save-as-doc-btn:disabled { opacity: 0.6; cursor: wait; } /* draft POST in flight */
|
||||
|
||||
/* Phase 48: the "Stopped" note in a stopped brain bubble's meta row:
|
||||
ink-soft on the surface bubble ≈6.9:1, the 10px filled-square glyph
|
||||
centered with the row (the Tune button shares the row), and
|
||||
@@ -2699,6 +2733,163 @@ details.thinking .thinking-text ul { margin: 0 0 0.5rem; }
|
||||
.doc-modal-backdrop { transition: none; }
|
||||
}
|
||||
|
||||
/* ---------- Doc edit screen (phase 59, task 06) ----------
|
||||
/doc-edit.html: the admin-gated edit screen for a doc draft (title,
|
||||
in-repo path, markdown body) — a FLOW page, not one of the app's
|
||||
pages, so the header is SLIM (brand + "← Back to chat" only). The
|
||||
46rem base column is HARD-CODED: a form column, not a reading
|
||||
column — it does not ride --chat-column, so phase 58's wide-desktop
|
||||
doubling never stretches the form. The .sources-gate gate is reused
|
||||
verbatim (phases 16/35/50). Every pair reuses the Phase-08 AA
|
||||
palette; touch targets >=44px; :focus-visible via the global 3px
|
||||
outline rule. No CDN, system fonts. */
|
||||
.doc-edit-shell {
|
||||
width: 100%;
|
||||
max-width: 46rem; /* the 46rem base column (hard-coded — see above) */
|
||||
margin-inline: auto;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 1.25rem;
|
||||
flex: 1;
|
||||
}
|
||||
|
||||
/* The slim header's back link — the .doc-back ghost language
|
||||
(document.html): >=44px target, --line border, ink-soft (5.1:1 on
|
||||
the --surface bar) rising to ink on hover; pushed to the bar's right
|
||||
edge by the header-inner flex (margin-left: auto — the nav's
|
||||
own pattern). */
|
||||
.doc-edit-back {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
gap: 0.4rem;
|
||||
min-height: 44px;
|
||||
margin-left: auto;
|
||||
padding: 0.4rem 0.9rem;
|
||||
border: 1px solid var(--line);
|
||||
border-radius: var(--radius-sm);
|
||||
background: transparent;
|
||||
color: var(--ink-soft);
|
||||
font-weight: 600;
|
||||
text-decoration: none;
|
||||
}
|
||||
.doc-edit-back:hover { color: var(--ink); border-color: var(--ink-soft); }
|
||||
.doc-edit-back svg { width: 16px; height: 16px; display: block; }
|
||||
|
||||
/* The edit form — the tuning form's card as a vertical stack: labeled
|
||||
title input, mono path input, the mono markdown textarea (min-height
|
||||
20rem — the body is the star), and the actions row (the brand Push
|
||||
button + the back link). Inset fields (bg fill on the surface card). */
|
||||
#doc-edit-form {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 0.9rem;
|
||||
background: var(--surface);
|
||||
border: 1px solid var(--line);
|
||||
border-radius: var(--radius);
|
||||
box-shadow: var(--shadow);
|
||||
padding: 1.5rem 1.5rem 1.75rem;
|
||||
}
|
||||
#doc-edit-form label {
|
||||
font-weight: 600;
|
||||
font-size: 0.95rem;
|
||||
}
|
||||
#draft-title,
|
||||
#draft-path {
|
||||
width: 100%;
|
||||
font: inherit;
|
||||
font-size: 1rem;
|
||||
color: var(--ink);
|
||||
background: var(--bg);
|
||||
border: 1px solid var(--line);
|
||||
border-radius: var(--radius-sm);
|
||||
padding: 0.55rem 0.75rem;
|
||||
min-height: 44px;
|
||||
}
|
||||
/* The in-repo path is machine data — mono (the git-sources URL-input
|
||||
convention). */
|
||||
#draft-path {
|
||||
font-family: var(--mono);
|
||||
font-size: 0.92rem;
|
||||
}
|
||||
/* The markdown body: mono, tall (min-height 20rem), vertical resize.
|
||||
ink on bg = 16.7:1. */
|
||||
#draft-body {
|
||||
width: 100%;
|
||||
font-family: var(--mono);
|
||||
font-size: 0.92rem;
|
||||
line-height: 1.5;
|
||||
color: var(--ink);
|
||||
background: var(--bg);
|
||||
border: 1px solid var(--line);
|
||||
border-radius: var(--radius-sm);
|
||||
padding: 0.75rem 0.9rem;
|
||||
min-height: 20rem;
|
||||
resize: vertical;
|
||||
}
|
||||
|
||||
/* Actions row: the primary Push button (brand, dark ink on brand
|
||||
5.2:1 — never white on brand) + the back link; wraps at narrow
|
||||
widths. */
|
||||
.doc-edit-actions {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 0.75rem;
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
#push-doc-btn {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
min-height: 44px;
|
||||
border: 0;
|
||||
border-radius: var(--radius-sm);
|
||||
background: var(--brand);
|
||||
color: var(--bg); /* dark ink on brand: 5.2:1 */
|
||||
font: inherit;
|
||||
font-weight: 700;
|
||||
cursor: pointer;
|
||||
padding-inline: 1.25rem;
|
||||
}
|
||||
#push-doc-btn:hover:not(:disabled) { background: #7d88f5; }
|
||||
#push-doc-btn:disabled { opacity: 0.6; cursor: wait; }
|
||||
|
||||
/* The success status line (role=status): the ok family (ok-ink on
|
||||
ok-bg 10.6:1) when a push outcome has landed — min-height holds the
|
||||
line's space so the layout never jumps when the text lands. Empty
|
||||
(before the first push, or after a failure cleared the stale line)
|
||||
it is the dashed placeholder (the #archive-upload-result language). */
|
||||
.doc-edit-status {
|
||||
margin: 0;
|
||||
min-height: 1.5rem;
|
||||
background: var(--ok-bg);
|
||||
color: var(--ok-ink);
|
||||
border: 1px solid var(--line);
|
||||
border-radius: var(--radius-sm);
|
||||
padding: 0.45rem 0.8rem;
|
||||
font-size: 0.9rem;
|
||||
font-weight: 600;
|
||||
}
|
||||
.doc-edit-status:empty {
|
||||
background: transparent;
|
||||
border-style: dashed;
|
||||
color: var(--ink-soft);
|
||||
}
|
||||
|
||||
/* The error banner (role=alert): the err family (err-ink on err-bg
|
||||
9.3:1, err-line border) — git's stderr may carry long paths, so
|
||||
long words break instead of overflowing the card. */
|
||||
.doc-edit-error {
|
||||
margin: 0;
|
||||
background: var(--err-bg);
|
||||
color: var(--err-ink);
|
||||
border: 1px solid var(--err-line);
|
||||
border-radius: var(--radius-sm);
|
||||
padding: 0.5rem 0.8rem;
|
||||
font-size: 0.85rem;
|
||||
font-weight: 600;
|
||||
overflow-wrap: anywhere;
|
||||
}
|
||||
|
||||
/* ---------- Footer ---------- */
|
||||
.app-footer {
|
||||
border-top: 1px solid var(--line);
|
||||
|
||||
Reference in New Issue
Block a user