commit 8c10cd05de71775cd58a2986975c6d790546190d
parent 7a2e1f59e258c721f97942e5bd17745e6a0b7943
Author: I Mean I'm Just Saying <imeanimjustsaying@kiwifarms.st>
Date: Wed, 20 May 2026 11:59:29 -0400
Style changes
Diffstat:
3 files changed, 18 insertions(+), 3 deletions(-)
diff --git a/editor/CHANGELOG.md b/editor/CHANGELOG.md
@@ -18,5 +18,7 @@
### Fixed
- Channel page: clicking a pipeline stage in the side rail (or a mobile stage badge) no longer jumps up into the selected video's viewer panel. The per-video stage cards were emitting the same DOM ids as the channel-level pipeline sections, so the browser scrolled to the first match. The per-video cards now use a `video-stage-` prefix.
+- Channel page sticky/anchor offsets bumped to clear the sticky `StatusHeader`. The left video list and the pipeline stage rail previously pinned too high (`top: 1rem` and `top: 8rem` respectively) and sat partially behind the header. Stage anchors used a fixed `scroll-margin-top: 8rem` that wasn't enough on narrow widths where the header's mobile badge row wraps. The video-list and stage-rail sticky tops are now `top: 7rem` (lg+), and stage sections use a responsive `scroll-margin-top` (11rem on mobile, 7rem on lg+).
+- Clicking a mobile stage badge (or a stage rail item) now auto-expands the collapsible "Channel pipeline & settings" wrapper if the user had collapsed it. Previously the hash navigation succeeded but the target section was inside a closed `<details>` and not visible. The target is also re-scrolled into view after the expansion so it lands at the correct position.
- Audio-check probe now flags `.part` files with heavy mid-stream codec corruption as malformed even when ffmpeg exits 0. Previously a stream could rack up hundreds of per-packet AAC decode failures (`Error submitting packet to decoder`) while ffmpeg still exited 0, and the file was promoted to a finished download. The classifier now also treats >5 decoder-error lines in stderr as malformed.
- Editor's `/changelog` page no longer renders unstyled. The `@source` directive in `editor/app/globals.css` pointed at a non-existent path, so Tailwind never scanned the shared `<Changelog>` component for class usage.
diff --git a/editor/app/channels/[slug]/components/StagesView.tsx b/editor/app/channels/[slug]/components/StagesView.tsx
@@ -77,6 +77,19 @@ export function StagesView({ stages, stageOrder, panels }: Props) {
next.add(fromHash);
return next;
});
+ if (typeof document === "undefined") return;
+ const section = document.getElementById(`stage-${fromHash}`);
+ if (!section) return;
+ // Open the ancestor "Channel pipeline & settings" details so a badge
+ // click doesn't silently land on a collapsed section.
+ const parent = section.closest("details");
+ if (parent && !parent.open) parent.open = true;
+ // The parent details (and on mobile, the section's own collapsible body)
+ // may have just expanded — re-scroll after the next paint so the anchor
+ // lands at the corrected position.
+ requestAnimationFrame(() => {
+ section.scrollIntoView({ block: "start", behavior: "auto" });
+ });
}, [fromHash]);
const toggle = useCallback((id: StageId) => {
@@ -101,7 +114,7 @@ export function StagesView({ stages, stageOrder, panels }: Props) {
<div className="lg:grid lg:grid-cols-[14rem_minmax(0,1fr)] lg:gap-6">
<nav
aria-label="Pipeline stages"
- className="hidden lg:flex lg:flex-col lg:gap-0.5 lg:sticky lg:top-32 lg:self-start"
+ className="hidden lg:flex lg:flex-col lg:gap-0.5 lg:sticky lg:self-start lg:top-28"
>
{stageOrder.map((id) => (
<StageRailItem
@@ -123,7 +136,7 @@ export function StagesView({ stages, stageOrder, panels }: Props) {
key={id}
id={`stage-${id}`}
aria-label={`${status.title} stage`}
- className={`rounded-md border ${TONE_BORDER[status.tone]} bg-white dark:bg-zinc-900 scroll-mt-32`}
+ className={`rounded-md border ${TONE_BORDER[status.tone]} bg-white dark:bg-zinc-900 scroll-mt-44 lg:scroll-mt-28`}
>
<button
type="button"
diff --git a/editor/app/channels/[slug]/components/VideoListPaneSection.tsx b/editor/app/channels/[slug]/components/VideoListPaneSection.tsx
@@ -41,7 +41,7 @@ export function VideoListPaneSection({
aria-label="videos"
className={`grid ${gridCols} gap-4 lg:gap-6 min-h-[calc(100vh-22rem)]`}
>
- <div className="flex flex-col min-h-0 lg:sticky lg:top-4 lg:self-start lg:max-h-[calc(100vh-2rem)]">
+ <div className="flex flex-col min-h-0 lg:sticky lg:self-start lg:top-28 lg:max-h-[80vh]">
{collapsed ? (
<button
type="button"