Fix ultrawide layout: Tailwind was not generating max-width classes.

Move width utilities into scanned components as literal class names, add lib to Tailwind content and safelist. Verified max-w-4xl in build CSS and /learn HTML.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
dekun
2026-06-11 00:38:00 +08:00
parent 9fc7336095
commit 26ccecb361
5 changed files with 29 additions and 37 deletions
+3 -4
View File
@@ -1,15 +1,14 @@
import React from "react"; import React from "react";
import { VERSION } from "@/lib/constant"; import { VERSION } from "@/lib/constant";
import { APP_CONTAINER } from "@/lib/layout";
function Footer() { function Footer() {
return ( return (
<footer <footer className="relative z-10 flex items-center justify-center gap-1 border-t border-border/40 bg-card/70 py-4 text-xs text-muted-foreground/80">
className={`${APP_CONTAINER} relative z-10 flex items-center justify-center gap-1 py-4 text-xs text-muted-foreground/80`} <div className="mx-auto flex w-full max-w-4xl items-center justify-center gap-1 px-4 sm:px-6 lg:px-8">
>
<span className="italic"></span> <span className="italic"></span>
<span className="text-muted-foreground/60">·</span> <span className="text-muted-foreground/60">·</span>
<span> v{VERSION}</span> <span> v{VERSION}</span>
</div>
</footer> </footer>
); );
} }
+5 -2
View File
@@ -3,7 +3,10 @@ import Link from "next/link";
import { usePathname } from "next/navigation"; import { usePathname } from "next/navigation";
import { TaijiIcon } from "@/components/svg/taiji"; import { TaijiIcon } from "@/components/svg/taiji";
import { ModeToggle } from "@/components/mode-toggle"; import { ModeToggle } from "@/components/mode-toggle";
import { APP_CONTAINER } from "@/lib/layout";
/** 与 PageShell 同宽 — 类名须完整书写供 Tailwind 扫描 */
const HEADER_INNER =
"mx-auto w-full max-w-4xl px-4 sm:px-6 lg:px-8";
const NAV_ITEMS = [ const NAV_ITEMS = [
{ href: "/learn", label: "易经学习" }, { href: "/learn", label: "易经学习" },
@@ -37,7 +40,7 @@ export default function Header() {
return ( return (
<header className="relative z-10 border-b border-border/40 bg-card/70 py-3 shadow-sm backdrop-blur-md"> <header className="relative z-10 border-b border-border/40 bg-card/70 py-3 shadow-sm backdrop-blur-md">
<div <div
className={`${APP_CONTAINER} grid grid-cols-[1fr_auto] items-center gap-y-2 sm:flex sm:justify-between`} className={`${HEADER_INNER} grid grid-cols-[1fr_auto] items-center gap-y-2 sm:flex sm:justify-between`}
> >
<Link href="/" className="flex items-center gap-2"> <Link href="/" className="flex items-center gap-2">
<TaijiIcon /> <TaijiIcon />
+10 -5
View File
@@ -1,12 +1,17 @@
import Header from "@/components/header"; import Header from "@/components/header";
import Footer from "@/components/footer"; import Footer from "@/components/footer";
import TaijiBackdrop from "@/components/layout/taiji-backdrop"; import TaijiBackdrop from "@/components/layout/taiji-backdrop";
import {
CONTENT_SHELL,
type ContentShellWidth,
} from "@/lib/layout";
import { cn } from "@/lib/utils"; import { cn } from "@/lib/utils";
/** 必须在组件内写完整类名,Tailwind 才能生成对应 CSS */
const SHELL_WIDTH = {
default: "w-full max-w-4xl px-4 sm:px-6 lg:px-8",
narrow: "w-full max-w-3xl px-4 sm:px-6 lg:px-8",
wide: "w-full max-w-4xl px-4 sm:px-6 lg:px-8",
} as const;
export type ContentShellWidth = keyof typeof SHELL_WIDTH;
export default function PageShell({ export default function PageShell({
children, children,
className = "", className = "",
@@ -23,7 +28,7 @@ export default function PageShell({
<main <main
className={cn( className={cn(
"mx-auto flex w-full flex-1 flex-col border-border/40 bg-background sm:border-x", "mx-auto flex w-full flex-1 flex-col border-border/40 bg-background sm:border-x",
CONTENT_SHELL[width], SHELL_WIDTH[width],
className, className,
)} )}
> >
+2 -22
View File
@@ -1,22 +1,2 @@
const pad = "px-4 sm:px-6 lg:px-8"; /** @deprecated 宽度类已移至各组件内完整书写,避免 Tailwind 漏扫 */
export type ContentShellWidth = "default" | "narrow" | "wide";
/** 内容区宽度档位(带鱼屏居中,两侧留空) */
export const CONTENT_SHELL = {
/** 常规页:约 896px */
default: `w-full max-w-4xl ${pad}`,
/** 首页、文章:约 768px */
narrow: `w-full max-w-3xl ${pad}`,
/** 双栏测算:约 960px */
wide: `w-full max-w-[960px] ${pad}`,
} as const;
export type ContentShellWidth = keyof typeof CONTENT_SHELL;
/** 页眉 / 页脚 — 与最宽内容区对齐 */
export const APP_CONTAINER = `mx-auto ${CONTENT_SHELL.wide}`;
/** @deprecated 使用 PageShell width="narrow" */
export const HOME_CONTAINER = `mx-auto ${CONTENT_SHELL.narrow}`;
/** 双栏测算工作区 */
export const MODE_CONTAINER = `mx-auto ${CONTENT_SHELL.wide}`;
+6 -1
View File
@@ -1,7 +1,12 @@
/** @type {import('tailwindcss').Config} */ /** @type {import('tailwindcss').Config} */
module.exports = { module.exports = {
darkMode: ["class"], darkMode: ["class"],
content: ["./components/**/*.{ts,tsx}", "./app/**/*.{ts,tsx}"], content: [
"./app/**/*.{ts,tsx}",
"./components/**/*.{ts,tsx}",
"./lib/**/*.{ts,tsx}",
],
safelist: ["max-w-3xl", "max-w-4xl"],
theme: { theme: {
container: { container: {
center: true, center: true,