HNU-TimeLetter is built on the metaphor of a personal letter received and unfolded — warm-gray paper, wax seals, vintage postcard edges, and editorial white space. Every design decision flows from this core premise: the page feels like a commemorative album being turned open rather than a campus information portal. The following tokens and guidelines are the single source of truth (SSOT) for implementing that aesthetic consistently across every route and component.Documentation Index
Fetch the complete documentation index at: https://mintlify.com/HNU-himematsu/HNU-TimeLetter/llms.txt
Use this file to discover all available pages before exploring further.
Visual Direction
The four pillars of the visual identity are:- Core character: 纸本情书 (paper love letter), fire-lacquer wax seal, sea-breeze nostalgia, editorial breathing room.
- Visual goal: Pages read as “a keepsake album being leafed through” or “a private letter just received” — never a campus information dashboard.
- Material language: Warm-gray paper is the main stage. Deep red (
#c23643) is the single emotional anchor. Copper-gold appears only as a detail accent and never competes with the primary. - Composition principle: Large white space, strong titles, few but precise accent colors, localised texture — no large areas of technology-blue or pure-white panels.
Color Palette
All colors are defined as CSS custom properties insrc/app/globals.css and mapped to Tailwind semantic tokens. Use semantic names only — never use bg-[#xxxxxx] or text-stone-* anywhere in the codebase.
| Token name | Hex | Usage |
|---|---|---|
| Background | #ece9e4 | Page base, global canvas, large empty-space regions |
| Surface | #f6f1eb | Cards, modals, drawers, inner letter pages |
| Surface Strong | #e2d7cf | Secondary blocks, scroll strip, timeline bars, hover rails |
| Primary | #c23643 | Primary button, selected state, active story, key CTA, link highlight |
| Primary Deep | #a92d38 | Button hover / pressed state, deep wax-seal edge |
| Neutral Light | #e55966 | Secondary tag backgrounds, selected-state softening, light hint blocks |
| Font Light | #e7d0d0 | Reversed text on colored backgrounds, heading highlight layer, dark card copy, tag backgrounds |
| Ink Strong | #342628 | Large headings, lead-in emphasis, critical notes |
| Font Dark | #563B3B | Body text, descriptions, component content copy |
| Ink Muted | #7a6664 | Dates, locations, meta information, descriptive labels |
| Border | #cbbdb5 | Card outlines, input boundaries, divider lines |
| Neutral Dark | #634725 | Stamp edges, wax-seal metallic reflection, decorative lines, badge outlines |
| Focus Ring | rgba(229, 89, 102, 0.28) | Keyboard focus outline, accessibility interaction ring |
SSOT constraint: All color values live exclusively in
src/app/globals.css. No component file may hardcode hex values via bg-[#xxxxxx], text-stone-*, or any other escape hatch. Always use the semantic token classes (bg-background, bg-card, text-foreground, text-muted-foreground, bg-primary, border-border).Typography
Font Families
Both typefaces are loaded as local fonts insrc/app/layout.tsx, which maps them to Tailwind’s font-serif (headings) and font-sans (body) utilities.
| Role | File | Tailwind class | Usage |
|---|---|---|---|
| Headings | public/ChillDINGothic_SemiBold.otf | font-serif | Site title, chapter headings, button main copy, English labels |
| Body | public/ZouLDFXKAJ.ttf | font-sans | Body paragraphs, story copy, description zones |
PingFang SC, Microsoft YaHei, sans-serif. Body font falls back first to the heading font, then to the system Chinese font stack.
Responsive Type Scale
All font sizes useclamp() to scale fluidly between mobile and desktop without breakpoint jumps.
Global Typography Baseline
Heading Rules (h1 / h2 / h3)
Excluded heading styles: font-weight 800, negative letter-spacing, line-height 1.1, and any per-heading overrides that deviate from the unified
0.12em tracking. A single heading level must not carry additional letter-spacing rules of its own.Body Classes
Two semantic body classes are defined inglobals.css:
.text-intro with line-height: 1.5, .text-reading with line-height: 1.8, or font-weight 800 on any body class.
Shape, Shadow, and Layering
Border Radius Tokens
Shadow Tokens
14% opacity on the warm-gray background — at lower values they disappear entirely.
Animation Timing Guidelines
| Category | Duration | Approach |
|---|---|---|
| Page entrance | 600 ms – 900 ms | Fade-in + subtle upward shift + blur dissolve |
| Hover feedback | 140 ms – 180 ms | Translate, shadow, brightness — no strong bounce |
| Modal / glass layers | — | backdrop-filter: blur(12px–18px), opacity ≤ 0.82 |
| Paper texture | — | 6 %–10 % visible noise or grain, never over body text |
| Ambient highlight | — | Soft radial gradient only — no neon or rainbow gradients |
Component-Level Design Guidelines
Page Canvas
The page background is never flat. It combines: warm-gray base (
Background) + a soft radial highlight + a very-light paper grain texture. Inner containers layer Surface and Surface Strong on top.Buttons and Controls
Primary button:
#c23643 background, #fff6f4 text. Hover: switches to #a92d38, lifts 2–4 px. Secondary button: Surface fill + Border outline, hover shifts toward Font Light. Links deepen in color on hover — no full underline, just a bottom hairline or color shift.Cards, Scroll Strips, and Paper Containers
Large cards always use the paper-surface layer, never pure white. Modals and story cards require a paper-feel inner shadow and a light border to avoid looking like a generic component library. The scroll strip and timeline bars use
Surface Strong with a thin copper-tone decorative line.Tags, Badges, and Meta
Tag backgrounds prefer
Font Light or Surface Strong. Tag text prefers Ink Strong or Primary Deep. Dates, locations, and English subtitle labels use the heading font to stay visually distinct from body copy.Stamp, Pin, and Wax-Seal Details
Map pin points and stamp borders may useNeutral Dark as a local outline to reinforce the collectible-item feeling. Wax seals, location highlights, and active-state indicators all use the primary red — this is the only prominent accent color permitted site-wide.
Scroll Strip Visual Spec
The 56 px-wide scroll strip that appears when the desktop map rolls up has these exact visual values:Implementation SSOT
| File | Responsibility |
|---|---|
src/app/globals.css | Single source of truth for all design tokens: colors, radius, shadows, typography, and texture |
src/app/layout.tsx | Local font loading; maps font-serif → ChillDINGothic_SemiBold, font-sans → ZouLDFXKAJ |
When writing new styles, always reach for semantic tokens first:
bg-background, bg-card, text-foreground, text-muted-foreground, bg-primary, border-border. Direct hex values or Tailwind color-scale escapes (text-stone-500, bg-[#abc]) are prohibited in the codebase.