phase: 150_drop_sync_result
**Phase 150 final verification pass — complete, 100% green.** All 6 task files were already in `complete/`, so this was verification + doc pass. - Verified: `#sync-progress` is the sole sync text surface + sole `aria-live` region (`role="status"`, polite, no `aria-hidden`); `span#sync-result` gone from HTML/JS/CSS/tests (incl. runtime-built `RETIRED_ID` absence pins in the unit suites); `setSyncProgress` single writer with text-driven visibility; running-only box write in `setSyncLabel`; all 9 settle/cancel sites routed; `requestCancel` pre-fetch clear is a NO-OP. - Tests: `uv run pytest` → **3463 passed**; `uv run pytest --cov=app` → **99% on app/** (>90%); `uv run ruff check .` + `uv run pyright` → clean (0 errors); `tests/e2e/test_sync_progress_box.py --no-cov` → **8 passed in isolation**; all 18 migrated sync/image-PDF E2E files green in isolation (77 tests). - Completion criteria: 1) grep clean ✅ 2) sole live region, attrs correct ✅ 3) in-flight/settle/cancel/idle box states proven by E2E + unit pins ✅ 4) icon-only running button + restore ✅ 5) full gates green ✅ 6) no completed-phase behavior change (18 family suites + full suite green) ✅ 7) commit — left to harness per pass instructions (working tree untouched, no `git add`/`commit`). - Documentation: README.md fixed 2 pre-existing inconsistencies (stale `~/Homelab`+`~/Deployments` source model in the intro — retired in phase 61 — now describes the git/local/archive Sources model; "Requires AIPI_KEY" in retrieval-quality now states `BOR_LLM_API_KEY` in `.env` or `$AIPI_KEY`, matching the scripts' real convention). Everything else (URL table, env defaults vs `app/config.py`, sync/phase-150 copy, prod claims) verified accurate. AGENTS.md: verified consistent — no changes needed. - Notable: no code changes were required — the phase implementation was correct as left; no live infrastructure touched. - Next pending phase: `151_pdf_image_extraction` in `.agents/phases/todo/`.
This commit is contained in:
+24
-38
@@ -2203,12 +2203,13 @@ a.answer-image:hover { text-decoration: underline; } /* flat — the caption und
|
||||
}
|
||||
/* Phase 64: the live-file label ("Syncing… <file> (n/m)" / "Importing
|
||||
<file> (n/m)") — a long source/relative/path ellipsizes inside the
|
||||
pill; the full path lives in the button title + #sync-result (the
|
||||
aria-live announcer). Phase 128 (task 02): the label is a FLEX ROW
|
||||
pill; the full path lives in the button title + the #sync-progress
|
||||
box (the aria-live announcer — phase 150: the SOLE sync text
|
||||
surface). Phase 128 (task 02): the label is a FLEX ROW
|
||||
of parts — .sync-label-main (the prefix + file/folder: min-width
|
||||
0, the shrinkable item whose ellipsis engages) + .sync-label-count
|
||||
(the pinned "(n/m)": flex 0 0 auto, NEVER clipped — the
|
||||
.sync-result mono language, a position reads as data). Phase 129
|
||||
.sync-progress-text mono language, a position reads as data). Phase 129
|
||||
(task 04): a THIRD pinned part — .sync-label-chunk (the "· chunk
|
||||
n/m" embed-batch position of the in-flight file, the same pinned
|
||||
mono language; hidden in every state but the import phase after
|
||||
@@ -2229,7 +2230,7 @@ a.answer-image:hover { text-decoration: underline; } /* flat — the caption und
|
||||
.sync-label-count {
|
||||
flex: 0 0 auto; /* NEVER clipped — the (n/m) position is the point */
|
||||
white-space: nowrap;
|
||||
font-family: var(--mono); /* the .sync-result mono language (position reads as data) */
|
||||
font-family: var(--mono); /* the .sync-progress-text mono language (position reads as data) */
|
||||
}
|
||||
.sync-label-chunk {
|
||||
flex: 0 0 auto; /* NEVER clipped — the · chunk n/m position is the point (phase 129) */
|
||||
@@ -2245,10 +2246,11 @@ a.answer-image:hover { text-decoration: underline; } /* flat — the caption und
|
||||
body 1.55 line-height, + the 0.75rem block padding + the 2px border,
|
||||
border-box) so even a one-line label reads as a calm panel with
|
||||
breathing room. The box is hidden-attr-driven (the global [hidden]
|
||||
!important rule keeps it display:none at idle — it exists only while
|
||||
a run is in flight). Mobile: a block in the same .container rides the
|
||||
100%-width phone shell — full width with no override (task 03's E2E
|
||||
asserts it at 360px). */
|
||||
!important rule keeps it display:none while its text is empty —
|
||||
phase 150: it shows while a run is in flight AND stays up after
|
||||
settle to carry the result line). Mobile: a block in the same
|
||||
.container rides the 100%-width phone shell — full width with no
|
||||
override (task 03's E2E asserts it at 360px). */
|
||||
.sync-progress {
|
||||
background: var(--surface);
|
||||
border: 1px solid var(--line);
|
||||
@@ -2258,12 +2260,12 @@ a.answer-image:hover { text-decoration: underline; } /* flat — the caption und
|
||||
}
|
||||
.sync-progress-text {
|
||||
display: block;
|
||||
font-family: var(--mono); /* the .sync-result mono language (position reads as data) */
|
||||
font-size: 0.8rem; /* the .sync-result size */
|
||||
font-family: var(--mono); /* the house mono language — position reads as data */
|
||||
font-size: 0.8rem; /* the house small-data size */
|
||||
line-height: 1.55; /* the house body line-height */
|
||||
color: var(--ink-soft); /* the .sync-result ink — a PINNED identity pair on --surface
|
||||
(8.2:1 on the built-in dark, AA in both built-ins; the
|
||||
theme gate keeps any custom theme at >= 4.5:1) */
|
||||
color: var(--ink-soft); /* PINNED identity pair on --surface (8.2:1 on the
|
||||
built-in dark, AA in both built-ins; the theme gate
|
||||
keeps any custom theme at >= 4.5:1) */
|
||||
overflow-wrap: anywhere; /* THE POINT of the box — a long source/relative/path WRAPS
|
||||
inside the panel; the pre-phase pill ellipsis is retired
|
||||
for the live detail (never clipped) */
|
||||
@@ -2280,15 +2282,6 @@ a.answer-image:hover { text-decoration: underline; } /* flat — the caption und
|
||||
neither. The idle "Sync sources" label (and the mobile ellipsis rules
|
||||
for it) render exactly as pre-phase when the class is absent. */
|
||||
.sync-btn.is-running .sync-label { display: none; }
|
||||
/* Last-result announcer — soft ink, small mono */
|
||||
.sync-result {
|
||||
display: block;
|
||||
color: var(--ink-soft);
|
||||
font-family: var(--mono);
|
||||
font-size: 0.8rem;
|
||||
white-space: nowrap;
|
||||
padding-block: 0.5rem;
|
||||
}
|
||||
/* Sync failure modal — lazily created by sources.js, appended to <body>.
|
||||
Error surface: --err-bg with --err-line border, title in --ink,
|
||||
error text in --err-ink (9.1:1 on --err-bg). Backdrop dims with
|
||||
@@ -2935,10 +2928,11 @@ a.answer-image:hover { text-decoration: underline; } /* flat — the caption und
|
||||
}
|
||||
#archive-upload-file::file-selector-button:hover { border-color: var(--brand); color: var(--brand-ink); }
|
||||
|
||||
/* The upload's success line (role=status): the sync-result shape
|
||||
("2 added · 1 pruned") — ink-soft on surface (>=4.5:1), the dashed
|
||||
hint-box border marks it as a result, not an error; it drops onto
|
||||
its own row under the input like the error line. */
|
||||
/* The upload's success line (role=status): the .sync-progress-text
|
||||
soft-ink result-line language ("2 added · 1 pruned") — ink-soft on
|
||||
surface (>=4.5:1), the dashed hint-box border marks it as a result,
|
||||
not an error; it drops onto its own row under the input like the
|
||||
error line. */
|
||||
#archive-upload-result {
|
||||
flex-basis: 100%;
|
||||
margin: 0;
|
||||
@@ -3656,9 +3650,10 @@ a.answer-image:hover { text-decoration: underline; } /* flat — the caption und
|
||||
gap: 1.25rem;
|
||||
flex: 1;
|
||||
}
|
||||
/* Action feedback line (role=status): the sync-result shape —
|
||||
ink-soft on surface (>=4.5:1), small mono; the min-height holds
|
||||
the layout so a delete's line never reflows the table. */
|
||||
/* Action feedback line (role=status): the .sync-progress-text mono /
|
||||
soft-ink language — ink-soft on surface (>=4.5:1), small mono; the
|
||||
min-height holds the layout so a delete's line never reflows the
|
||||
table. */
|
||||
.history-status {
|
||||
display: block;
|
||||
min-height: 1.2em;
|
||||
@@ -5636,15 +5631,6 @@ a.answer-image:hover { text-decoration: underline; } /* flat — the caption und
|
||||
.sync-label { max-width: none; flex: 1 1 auto; min-width: 0; }
|
||||
.history-refresh { width: 100%; }
|
||||
.history-refresh svg { display: block; }
|
||||
.sync-result {
|
||||
position: absolute !important;
|
||||
width: 1px; height: 1px;
|
||||
margin: -1px; padding: 0;
|
||||
overflow: hidden;
|
||||
clip: rect(0 0 0 0);
|
||||
white-space: nowrap;
|
||||
border: 0;
|
||||
}
|
||||
}
|
||||
|
||||
/* Phase 46: prefers-reduced-motion stills the mobile menu — no
|
||||
|
||||
Reference in New Issue
Block a user