From 1e441411a55d37ae24386dfdf7280387c9033d81 Mon Sep 17 00:00:00 2001 From: yuetsh <517252939@qq.com> Date: Sat, 10 Oct 2026 12:43:12 +0800 Subject: [PATCH] =?UTF-8?q?style(=E5=89=8D=E5=8F=B0):=20=E9=A1=B5=E9=9D=A2?= =?UTF-8?q?=E6=95=B4=E4=BD=93=E6=94=BE=E5=A4=A7=E4=B8=80=E6=A1=A3=EF=BC=8C?= =?UTF-8?q?=E5=88=97=E8=A1=A8=E4=B8=8D=E5=86=8D=E6=8C=A4=E6=88=90=E4=B8=80?= =?UTF-8?q?=E5=9B=A2=EF=BC=9B=E5=AE=BD=E5=B1=8F=E4=B8=8A=E5=86=85=E5=AE=B9?= =?UTF-8?q?=E5=B1=85=E4=B8=AD=EF=BC=8C=E4=B8=8D=E5=86=8D=E9=93=BA=E6=BB=A1?= =?UTF-8?q?=E5=88=B0=E4=B8=A4=E8=BE=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - index.css 加一张 --oj-* 尺寸表和 .oj-page 外壳,二十几个前台页面改成引用它: 正文 14→15、页标题 20→24、题目/提交列表行高 40→48、比赛/公告 56、筛选控件 28→34 - 阅读型页面限宽 1200 居中;题目/提交列表 1600、比赛详情 1400、排名 1280、班级 PK 1440 - 1280 宽的筛选条放大后放不下,题目/提交列表在 1366 以下退回 13px 的字 - 班级 PK 五个班起格子里不写「一次 x%」(只剩「一次 8…」);赛跑图线尾的数字不再被截掉 - 手机上比赛列表的「没参加」挪到比赛名下面;题单里「以前做对过 · 旧代码先藏着」缩成「做对过」 - 题目详情页(编辑器)和后台不在这一轮 Co-Authored-By: Claude Opus 5.5 --- apps/web/src/index.css | 31 ++++ .../components/AchievementCard.vue | 9 +- apps/web/src/oj/achievement/index.vue | 29 ++-- apps/web/src/oj/ai/analysis.vue | 11 +- .../announcement/components/TitleWithTag.vue | 4 +- apps/web/src/oj/announcement/list.vue | 142 +++++++++++++----- apps/web/src/oj/class/components/PkDuel.vue | 44 +++--- apps/web/src/oj/class/components/PkGrid.vue | 64 ++++---- apps/web/src/oj/class/components/PkRace.vue | 3 +- apps/web/src/oj/class/pk.vue | 54 +++---- apps/web/src/oj/classroom/board.vue | 33 ++-- .../src/oj/contest/components/RankMini.vue | 11 +- apps/web/src/oj/contest/detail.vue | 26 ++-- apps/web/src/oj/contest/list.vue | 62 +++++--- apps/web/src/oj/contest/pages/class.vue | 97 ++++++------ apps/web/src/oj/contest/pages/problems.vue | 60 ++++---- apps/web/src/oj/contest/pages/rank.vue | 75 ++++----- apps/web/src/oj/home/dashboard.vue | 66 ++++---- apps/web/src/oj/problem/components/TagNav.vue | 16 +- apps/web/src/oj/problem/list.vue | 77 ++++++---- .../oj/problemset/components/ClassView.vue | 34 ++--- apps/web/src/oj/problemset/detail.vue | 111 ++++++++------ apps/web/src/oj/problemset/list.vue | 60 ++++---- .../src/oj/rank/components/ChampionList.vue | 14 +- .../src/oj/rank/components/ClassBattle.vue | 38 ++--- apps/web/src/oj/rank/components/RankMe.vue | 52 +++---- .../web/src/oj/rank/components/RankPodium.vue | 30 ++-- apps/web/src/oj/rank/components/RankTrack.vue | 42 +++--- apps/web/src/oj/rank/components/WeekTop.vue | 14 +- apps/web/src/oj/rank/list.vue | 84 ++++++----- .../oj/statistics/components/CodeStats.vue | 50 +++--- .../oj/statistics/components/FlowStats.vue | 24 +-- .../src/oj/statistics/components/Lessons.vue | 36 ++--- .../src/oj/statistics/components/StatItem.vue | 4 +- .../statistics/components/StatisticsView.vue | 24 +-- .../submission/components/FlowchartPane.vue | 8 +- .../submission/components/SubmissionPane.vue | 8 +- apps/web/src/oj/submission/detail.vue | 2 +- apps/web/src/oj/submission/list.vue | 88 ++++++----- .../src/oj/user/components/KnowledgeMap.vue | 8 +- apps/web/src/oj/user/index.vue | 31 ++-- apps/web/src/oj/user/message.vue | 81 ++++++---- apps/web/src/oj/user/setting.vue | 11 +- 43 files changed, 1016 insertions(+), 752 deletions(-) diff --git a/apps/web/src/index.css b/apps/web/src/index.css index fcb8334..6ff9eff 100644 --- a/apps/web/src/index.css +++ b/apps/web/src/index.css @@ -2,6 +2,37 @@ body { height: 100vh; } +/* 前台页面的尺寸表。2026-10 整体放大了一档(原来行高 38~40、正文 14、页标题 20、 + 列表铺满 2000px 宽,用户嫌「太紧凑、不够大气」)。各页的 scoped 样式引用这里, + 别再各写各的 px —— 上一轮就是二十几个页面各自定数,才会整体偏小还不一致。 + + 机房屏 1366×768 的可用高度只有 640 左右,行高 48 是和用户商量过的:题目列表在 + 这个高度还能看到 8 行。题目详情页(编辑器)不吃这张表,它按 640 高逐像素排过。 */ +:root { + --oj-page-width: 1200px; /* 阅读型页面(比赛、题单、公告……)的限宽,居中 */ + --oj-fs-title: 24px; /* 页标题 */ + --oj-fs-h2: 17px; /* 区块标题 */ + --oj-fs-body: 15px; /* 列表主文字:题目名、比赛名 */ + --oj-fs-sec: 14px; /* 次要列:日期、知识点、人数 */ + --oj-fs-meta: 13px; /* 表头、角注 */ + --oj-row-h: 48px; /* 天天用的长列表:题目、提交 */ + --oj-row-h-roomy: 56px; /* 条数少的列表:比赛、公告 */ + --oj-head-h: 40px; /* 表头 */ + --oj-ctrl-h: 34px; /* 筛选条里的自制按钮,和 Naive 的 medium 输入框等高 */ + --oj-pad-x: 24px; /* 列表单元格左右留白 */ + --oj-gap: 20px; /* 区块之间 */ + --oj-radius: 10px; +} + +/* 阅读型页面的外壳:限宽居中,上面多留一点 */ +.oj-page { + box-sizing: border-box; + width: 100%; + max-width: var(--oj-page-width); + margin: 0 auto; + padding-top: 8px; +} + .md-editor-dark { --md-bk-color: var(--n-body-color) !important; } diff --git a/apps/web/src/oj/achievement/components/AchievementCard.vue b/apps/web/src/oj/achievement/components/AchievementCard.vue index 2082130..c023b89 100644 --- a/apps/web/src/oj/achievement/components/AchievementCard.vue +++ b/apps/web/src/oj/achievement/components/AchievementCard.vue @@ -53,13 +53,13 @@ const unlockDate = computed(() => { @@ -226,7 +228,7 @@ const medal = (index: number) => palette.value.medal[index] diff --git a/apps/web/src/oj/classroom/board.vue b/apps/web/src/oj/classroom/board.vue index 9267b47..8a94636 100644 --- a/apps/web/src/oj/classroom/board.vue +++ b/apps/web/src/oj/classroom/board.vue @@ -368,7 +368,7 @@ function submissionsHref( @@ -176,10 +176,18 @@ const to = (name: string) => ({ name, params: { contestID: props.contestID } }) margin: -16px -16px 0; } +.body { + width: 100%; + max-width: 1400px; + margin: 0 auto; +} + +/* 1920 的屏上铺满的话,领奖台在最左、「你的成绩」在最右,榜单只占左半边。 + 内容限宽 1400 居中;顶栏的分隔线照旧通栏,所以限宽用内边距做而不是 max-width */ .bar { - min-height: 60px; + min-height: 68px; box-sizing: border-box; - padding: 10px 20px; + padding: 12px max(var(--oj-pad-x), calc((100% - 1400px) / 2 + var(--oj-pad-x))); display: flex; align-items: center; flex-wrap: wrap; @@ -189,7 +197,7 @@ const to = (name: string) => ({ name, params: { contestID: props.contestID } }) .title { margin: 0; - font-size: 18px; + font-size: 22px; font-weight: 700; min-width: 0; } @@ -206,7 +214,7 @@ const to = (name: string) => ({ name, params: { contestID: props.contestID } }) } .countdown-label { - font-size: 13px; + font-size: var(--oj-fs-sec); } .countdown-num { @@ -220,7 +228,7 @@ const to = (name: string) => ({ name, params: { contestID: props.contestID } }) } .range { - font-size: 13px; + font-size: var(--oj-fs-sec); color: v-bind("theme.textColor3"); } @@ -239,11 +247,11 @@ const to = (name: string) => ({ name, params: { contestID: props.contestID } }) } .tab { - height: 32px; - padding: 0 14px; + height: var(--oj-ctrl-h); + padding: 0 16px; display: flex; align-items: center; - font-size: 13px; + font-size: var(--oj-fs-sec); color: v-bind("theme.textColor2"); text-decoration: none; } diff --git a/apps/web/src/oj/contest/list.vue b/apps/web/src/oj/contest/list.vue index 7e3a69b..8ecfe14 100644 --- a/apps/web/src/oj/contest/list.vue +++ b/apps/web/src/oj/contest/list.vue @@ -130,7 +130,7 @@ const warning = computed(() => tone("warning")) diff --git a/apps/web/src/oj/problemset/list.vue b/apps/web/src/oj/problemset/list.vue index 6e8e602..4293a62 100644 --- a/apps/web/src/oj/problemset/list.vue +++ b/apps/web/src/oj/problemset/list.vue @@ -84,7 +84,7 @@ const doneBackground = computed(() => rgba(theme.value.successColor, 0.05))