From 198efddb54e130af898eb53fd6843a0a65023534 Mon Sep 17 00:00:00 2001 From: Dmitry Verkhoturov Date: Thu, 28 May 2026 19:02:25 +0100 Subject: [PATCH] fix(frontend): no_footer scrollbar regression introduced in v1.16.0 (#2076) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix(frontend): no_footer scrollbar regression introduced in v1.16.0 Two unrelated changes in v1.16.0 combined to surface a scrollbar in no_footer=true mode: 1. c26f45e5 removed the deprecated `scrolling="no"` iframe attribute on the grounds that "overflow is already hidden via CSS". That CSS (`overflow: hidden` in createIframe styles) is on the iframe ELEMENT in the parent page; it has no effect on the iframe DOCUMENT's own scrollbars. The spec-correct replacement is `overflow: hidden` on the iframe document's body — added here to global.css. 2. The negative `margin-bottom: -24px` on `.thread:last-child` was a trick to tighten the gap to the footer (combined with the footer's `margin-top: 48px` it collapsed to a 24px net gap). With no_footer the negative margin had no positive-margin sibling to collapse against and instead propagated up through .root, leaving body ~24px shorter than the visual content. The iframe height calc (`body.offsetHeight + 12`) then sized the iframe below the visible bottom of the last thread → scrollbar. Replace the negative-margin trick with a straight `margin-top: 24px` on `.copyright`. Same 24px visual gap when the footer is shown, no propagation when it isn't. The mix={styles.thread} on Thread becomes a dead reference and is dropped. Closes #2073 * fix(frontend): drop dead Thread.mix prop after root.tsx removed its only caller Both Copilot and umputun flagged this in PR review: after the parent commit on this branch dropped `mix={styles.thread}` from root.tsx, the `mix?: string` prop and the corresponding entry in the clsx() call in thread.tsx are dead code — no caller passes it (the recursive Thread render in thread.tsx:82 never did either). Remove the prop, the destructure, and the clsx entry. --- .../apps/remark42/app/components/root/root.module.css | 8 +------- frontend/apps/remark42/app/components/root/root.tsx | 4 +--- frontend/apps/remark42/app/components/thread/thread.tsx | 6 ++---- frontend/apps/remark42/app/styles/global.css | 7 +++++++ 4 files changed, 11 insertions(+), 14 deletions(-) diff --git a/frontend/apps/remark42/app/components/root/root.module.css b/frontend/apps/remark42/app/components/root/root.module.css index b360b596..052670a3 100644 --- a/frontend/apps/remark42/app/components/root/root.module.css +++ b/frontend/apps/remark42/app/components/root/root.module.css @@ -31,18 +31,12 @@ margin: 0 auto; } -.thread { - &:last-child { - margin-bottom: -24px; - } -} - .threads { margin-top: 4px; } .copyright { - margin: 48px 0 0; + margin: 24px 0 0; font-size: 12px; text-align: right; } diff --git a/frontend/apps/remark42/app/components/root/root.tsx b/frontend/apps/remark42/app/components/root/root.tsx index e1fbf37b..bf07f854 100644 --- a/frontend/apps/remark42/app/components/root/root.tsx +++ b/frontend/apps/remark42/app/components/root/root.tsx @@ -301,9 +301,7 @@ function Comments({ isLoading, topComments, commentsShown, showMore }: CommentsP ) : ( <> {topComments.length > 0 && - renderComments.map((id) => ( - - ))} + renderComments.map((id) => )} {isShowMoreButtonVisible && (