Skip to main content

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.

The Creation Board (/creation) is the community layer of HNU-TimeLetter — a public display wall where any member can see, browse, and extend the pool of shared galgame scene proposals that feed the project’s AIGC pipeline. Unlike the main exhibition on the homepage, the Creation Board is not about finished works; it is a living draft table of creative impulses, continuously growing as the community adds new ideas on top of existing ones. The design reflects this: sticky notes on grid paper rather than a polished gallery.

Page Goal

The board serves three concrete purposes:
  1. Aggregate inspiration — surface proposals that would otherwise stay buried in chat history.
  2. Enable extension — let any visitor directly add a new idea to an existing card thread without re-explaining context.
  3. Lower coordination cost — the production team can pick up, cross-reference, and build on proposals without running a separate collection round.
The page is a read-and-extend experience, not a submission form. The Feishu multi-dimensional table remains the single source for data entry.

Page Structure

The layout is deliberately minimal: a compact title zone, then an uninterrupted sticky-note waterfall filling the rest of the viewport.

Title Zone

  • Page title: 创作公示板
  • Sub-caption: one line explaining “these are community-contributed ideas — feel free to add on top of any existing card.”
  • The title zone is deliberately shallow — it must not push the first row of cards below the fold.

Sticky-Note Waterfall

The main body is a masonry / waterfall grid with a lightweight grid-line background. The grid lines evoke a draft sketchpad or planning board. They must be subtle enough not to compete with card content. Responsive column counts:
ViewportColumns
Desktop (≥ 1280 px)4–5
Tablet (768 px – 1279 px)3
Mobile (< 768 px)1–2
Cards vary in height based on how many entries they contain, creating the natural high-low rhythm of a shared workspace wall. There is no pagination, no tab switching — one continuous vertical scroll.

Data Model

CardID Aggregation

All raw records from the Feishu table are keyed by CardID (e.g., CARD001). Multiple records sharing the same CardID belong to the same “idea thread” and are grouped into a single CreationCard for display. This is intentional design — repeated CardID values are not duplicate data. The aggregation happens at the page-rendering layer after reading src/data/creation-board.json.

TypeScript Types

/** The primary render unit in the waterfall — one card per CardID */
interface CreationCard {
  /** Unique card identifier, sourced from CardID field */
  id: string
  /** Business-facing card number (e.g. "CARD001") */
  cardId: string
  /** Pre-assembled "新增创意" Feishu form URL with CardID pre-filled */
  addIdeaUrl: string
  /** All stacked entries belonging to this CardID, in submission order */
  entries: CreationEntry[]
}

/** One raw record from the Feishu table, displayed as a single stacked item */
interface CreationEntry {
  /** Feishu record_id */
  id: string
  /** Parent card's CardID */
  cardId: string
  /** Display author: prefers 你的昵称; falls back to 提交人.name */
  author: string
  /** Single capsule tag: 灵感 | 故事 | 画面描述 | 参考图 | 其他 */
  tags: string
  /** Text content (文本 field); also holds OSS URLs when tag = 参考图 */
  content: string
  /** Image URLs (OSS-hosted); populated when tag = 参考图 */
  images: string[]
  /** ISO timestamp from 提交时间 */
  createdAt: string
}

Entry Display Rules

if (tags === "参考图" && images.length > 0)
  → render images grid
else if (tags === "参考图" && images.length === 0)
  → fall back to content text
else
  → render content text

Card Design

Overall Visual

Each card looks like a sticky note taped to a draft sketchpad, not a polished information panel. Key visual properties:
PropertyValue
Corner radius0 — square corners, no border-radius
BackgroundRandom low-saturation macaron color (one hue per card, consistent across all entries inside)
ShadowLight drop shadow at rest; slightly heavier on hover to convey lift
Slight tiltCards may have a very small random rotation (kept within ±1–2 deg) for the bulletin-board feel, but must not impair readability
The macaron palette is constrained to low-saturation, legible pastels. High-saturation neon sticky-note walls are explicitly excluded. The color is assigned once per CardID and does not change between page loads (derive it deterministically from the cardId string).

”新增创意” Button

Every card carries a persistent white 新增创意 button in the top-right corner:
  • Always visible — does not appear only on hover.
  • Occupies its own reserved space; it must never overlap the first entry’s tag pill.
  • Style: white background, neutral border, Ink Strong text — deliberately not the primary red, to avoid competing with entry content.
  • Click action: opens the Feishu form in a new tab with CardID pre-filled.
URL template:
https://himematsu.feishu.cn/share/base/form/shrcnhSnlbEAclIwPC770VdOmWf?hide_CardID=1&prefill_CardID={{CardID}}

Entry Layout (Stacked Items)

Inside each card, entries are stacked vertically in submission order with a clear but understated divider between them. Each entry has a fixed anatomy:
┌─────────────────────────────────────────┐
│ author (top-left)     [tag pill] (top-right) │
│                                         │
│  content text  —or—  images grid        │
└─────────────────────────────────────────┘
  • author: plain text, Ink Muted color, small size.
  • tags: a single pill capsule. Use Neutral Light or Surface Strong as background; Primary Deep or Ink Strong as text. The pill uses --radius-pill (999 px).
  • content / images: full width within the entry; images display in a responsive grid.
All entries within a card are visible by default — no collapse in the first release.

Interaction Principles

Default Mode: Scan-read

The waterfall is primarily a scanning surface. Visitors should be able to extract the key idea from each card at a glance, without clicking anything.

Click to Full-read

Clicking a card transitions it to an expanded full-read state. If the implementation cost of a modal is high in the initial release, an inline expand (card grows to show all content) is an acceptable MVP alternative.

Animation Constraints

InteractionAnimation
Card hoverLight lift (translate Y −2 to −4 px), shadow deepens — no spring bounce
Card click / expandSmooth height expand; opacity in for newly visible content
Entry dividerStatic; no animated separators
Page loadCards stagger-fade in from below (small y offset, opacity 0→1), entry delay ~40 ms per card
Strong elastic bounce, heavy parallax, and large-scale transforms are excluded from this page.

Data Source and API

Local Static File

src/data/creation-board.json   ← flat array of CreationEntry records
The /creation page reads creation-board.json directly and aggregates records by CardID at render time into CreationCard[]. There are no runtime Feishu API calls from the page.

Sync Flow

Feishu 揭示板 table
  → sync script (extends existing sync-feishu.ts or new dedicated script,
                 reusing existing Feishu auth and request helpers)
      → downloads image attachments
      → uploads to Alibaba Cloud OSS
      → writes OSS URLs back to 文本 field
      → writes src/data/creation-board.json
  → /creation page reads local file and renders cards

Component Architecture

Suggested component split under src/components/creation/:
ComponentResponsibility
CreationBoardPagePage root, fetches data, passes CreationCard[] to masonry
CreationBoardHeaderTitle zone with page title and sub-caption
CreationMasonryWaterfall/masonry grid container, handles responsive column count
CreationNoteCardSingle sticky-note card — renders header info, “新增创意” button, and stacked entries
CreationNoteEntrySingle stacked entry — author, tag pill, content or images
Route file: src/app/creation/page.tsx

State Design

StateHandling
LoadingPaper-texture skeleton placeholders — not generic gray bars
EmptyClear message: “当前还没有公开灵感,欢迎先在群内发起第一条共创提案”
Extra-long contentEither card auto-expands (waterfall recalculates) or content truncates with an expand control; waterfall layout must remain stable either way

Build docs developers (and LLMs) love