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))