From cad96e585f93cb0ecf7f20cf43e676dde875e515 Mon Sep 17 00:00:00 2001 From: govin Date: Fri, 18 Sep 2026 14:34:34 +0800 Subject: [PATCH] frontend: own the viewport contract in a global stylesheet Element Plus ships no html/body reset, so the browser default `body { margin: 8px }` applied, while the app shell was declared `min-height: 100vh`. The document therefore measured one viewport plus 8px: a vertical scrollbar was permanently visible on the right edge even for short pages, every page was pushed 8px off the intended 20px gutter, and the window and .el-main both scrolled. Add src/styles/base.css, imported once from main.ts after Element Plus, which now owns the reset and the shell contract: - html/body/#app/.app-shell are exactly one viewport tall with no margin; body never scrolls, so the window has no scrollbar - .app-main is the single scroll container (min-height: 0, overflow-y auto, overflow-x hidden) with a slim low-contrast scrollbar that only shows when content truly exceeds the viewport - global guards against content escaping the gutter: media max-width, wrapping for long code strings - shared .page helper for a consistent per-view vertical rhythm Also let the header menu track its content box, so its active underline stays flush with the header separator instead of spilling past it, and drop the now-unused RouterLink import. --- frontend/src/App.vue | 21 +++-- frontend/src/main.ts | 4 + frontend/src/styles/base.css | 145 ++++++++++++++++++++++++++++++++ frontend/src/views/HomeView.vue | 12 ++- 4 files changed, 169 insertions(+), 13 deletions(-) create mode 100644 frontend/src/styles/base.css diff --git a/frontend/src/App.vue b/frontend/src/App.vue index 4ef299e..380e8e6 100644 --- a/frontend/src/App.vue +++ b/frontend/src/App.vue @@ -1,5 +1,5 @@