# Poster Scene Rules — Creative Pipeline (Poster-Specific Constraints) > When poster / 海报 / 传单 / flyer / 宣传页 keywords are detected, load these rules on top of `creative.md`. > These rules take priority over `creative.md` generic rules; in case of conflict, this file prevails. > > **Positioning**: This is a scene-layer patch on `creative.md` (the generic Creative pipeline) — only covers poster-specific constraints, does not repeat generic rules. --- ## 1. Page Count & Dimensions ### 1.1 Default Single Page - When the user does not explicitly request multiple pages, **default to a single-page poster** - Single-page poster `total_pages: 1`, never split into multiple pages on your own ### 1.2 Sizing Strategy | Text Volume | Recommended Size | Aspect Ratio | Notes | |--------|---------|--------|------| | ≤ 50 chars | 720 × 960 | 3:4 | Title poster / social media cover / card | | 50–200 chars | 720 × 960 | 3:4 | Standard promotional poster | | > 200 chars | 720 × min-height 960 | Adaptive | Long poster (H5 style), content stretches height | | User-specified landscape | Adjust as needed | As needed | Width and height can be swapped | ### 1.3 Canvas Variables ```json { "canvas": { "width": 720, "height": 960 } } ``` Default dimensions can be overridden via the `canvas` field in the Blueprint. `design_engine.py` will automatically inject `--canvas-w` and `--canvas-h` CSS variables. --- ## 2. Information Density & Page Fill ### 2.1 Core Iron Rule: Content Must Fill the Page > **The biggest visual disaster for a poster is not content overflow, but content only occupying half the page with a blank bottom half.** | Text Volume | Content Area / Page Ratio | Notes | |--------|----------------|------| | ≤ 50 chars | 70–80% | Enlarged cards, large font sizes, generous decorative whitespace is intentional | | 50–200 chars | 75–85% | Content modules distributed evenly, must not be crammed in the top half | | > 200 chars | 80–90% | Content-dominant, whitespace only at margins | ### 2.2 Anti-Top-Heavy - All components' `grid_area` **must cover the full 1→13 rows**, never stop at row 10 or 11 - The last component's `grid_area` row endpoint must be `13` - **No large blank space at top/header** — the first content component's `grid_area` should start at row 1, not row 3 or 4 - **No large blank space on left/right sides** — components should utilize full column width (most should span 1→13 columns) - If content is insufficient to fill 12 rows, use these strategies (by priority): 1. **Increase font size**: Hero from scale 5 → 6, body font +2pt 2. **Increase component spacing**: grid gap from 16px → 24px 3. **Insert decorative components**: `Hairline_Divider`, `Page_Ghost_Number` 4. **Expand stat block / hero grid row count** ### 2.3 Grid Area Allocation Iron Rule ``` ✅ Correct: Components cover all rows 1→13 Page: [Hero 1→4] [Stats 4→7] [Glass 7→10] [Meta 10→13] ❌ Wrong: Components only reach row 10, rows 11-13 empty Page: [Hero 1→3] [Stats 3→5] [Glass 5→8] [Meta 8→10] [??? 10→13 void] ``` ### 2.4 ★★★ Content-Proportional Row Allocation (Anti-Overlap Iron Rule) > **When two or more text components share a page, rows must be allocated proportionally to content volume — never split evenly!** **Problem reproduction:** ``` Attractions: 450 chars (3 attractions × 150 chars description) Food: 250 chars (2 foods × 125 chars description) Available rows: 8 rows (5→13) ❌ Even split: Attractions 5→9, Food 9→13 → 4 rows each → Attractions content far exceeds 4-row capacity, overflows into Food area, text overlaps! ✅ Proportional split: Attractions: 8 × 450/700 ≈ 5 rows → 5→10 Food: 8 × 250/700 ≈ 3 rows → 10→13 ``` **Steps:** 1. Write all `markdown_content` first 2. Count the **character count** of each text component (including titles/paragraphs/lists) 3. Allocate rows proportionally: `rows_i = total_rows × (chars_i / total_chars)` 4. Round off, each component **minimum 3 rows** 5. Verify: all component grid_area endpoints connect end-to-end, covering full 1→13 **Applicable scenarios:** - Multiple `Glass_Canvas` on the same page (most common) - `Glass_Canvas` + `Process_List` on the same page - Any two or more components containing text paragraphs **Not applicable:** - `Hero_Typography` (very large font, 1-3 lines occupying 2-3 grid rows is reasonable) - `Stat_Block` (number + label, fixed height, typically 2 rows) - `Floating_Meta` (short labels, typically 2-3 rows) --- ## 3. Font Size System (Poster-Specific) ### 3.1 Minimum Font Size (Hard Floor) | Element | Min Font Size | Recommended | Notes | |------|---------|---------|------| | **Page main title** | **50px** | 56–72px | Poster title must have visual impact | | **Body text** | **24px** | 24–28px | Posters are not reports — body font must be large | | **Subtitle / card title** | **28px** | 32–40px | Secondary headings | | **Floating Meta** | **16px** | 16–20px | Metadata text | | **Stat Number** | **48px** | 56–72px | Data sculptures must be eye-catching | | **Stat Label** | **14px** | 14–16px | Data labels | > Compared to `fill-engine.md`'s generic red line (body ≥ 14pt), the poster body floor is **24px** — posters are a distance-reading medium, font sizes must be larger. ### 3.2 Emphasis Hierarchy - Use **font size + font weight** to create hierarchy, **not color differentiation** - Emphasis text (keyword/number highlights) font size must be smaller than titles - Hero title recommended `weight: "black"` (900), subtitle `weight: "thin"` (100), creating extreme contrast --- ## 4. Color Rules (Poster-Specific) ### 4.1 Color Palette System **Primary palette: Material Design 3 with low-medium saturation.** Default to medium-saturation colors; for light themes, use gradient backgrounds with white/light text on top. | Area | Proportion | Role | |------|------|------| | 60% Ground | Background/margins/whitespace | Main color (low saturation) | | 30% Structure | Cards/dividers/secondary areas | Derived from main by adjusting lightness | | 10% Emphasis | Titles/key numbers/single accent | Adjusted purity/brightness of main color | **Color derivation rules:** - Title/subtitle text color: Adjust main color's purity and brightness (not a separate random color) - Auxiliary colors: **Maximum 2**, derived from primary by adjusting lightness/saturation - Keep consistent color palette throughout — do NOT change main color between sections - Default recommendation: **Light theme with medium saturation**, or gradient background + white fonts ### 4.2 Poster Additional Constraints - **No pure white (#FFFFFF) background** — use at least `#f5f4f2` or warmer off-white - **No transparent background** - **Page base color (`
` / `` background) must match poster content background** — `printBackground: true` renders body background. If body is white but poster content is gray, white borders/gaps appear in the PDF. Ensure `html, body { background: var(--c-bg); }` matches the poster canvas exactly - **Do not use a single image to fill the background** — use grid textures, gradients, geometric shapes, and other generative backgrounds - Long posters (>200 chars) must not use full-image backgrounds - **Gradients** or **large blurred circles/symbols** can be used sparingly as background accents - Maximum 2 auxiliary colors, derived from primary by adjusting lightness/saturation - Background accents: grid textures, organic shapes, large blurred circles/symbols — NOT a single image - **Overall bright and vibrant color combinations** — the poster should feel visually striking, not muted/dull ### 4.3 palette_mode Mapping | Poster Style | Recommended palette_mode | color_harmony | |---------|-------------------|---------------| | Business/Formal | `minimal` | `auto` | | Tech/AI | `dark` | `complementary` | | Lifestyle/Food/Artistic | `pastel` | `analogous` | | Luxury/Ceremony | `jewel` | `split_complementary` | | Other | `minimal` (default) | `auto` | --- ## 4.5 ★★★ Anti-Modularization Iron Rule (Anti-Card / Anti-Dashboard) > **A poster is a complete composition, not a dashboard, not an APP interface, not a report.** ### Root Cause LLMs naturally tend to "classify information → put each category in a box → stack them vertically", because that is report/document organization logic. But poster visual logic is the exact opposite — **information is unified, hierarchy is established through typographic rhythm (font size, weight, spacing, whitespace), not through borders and background colors**. ### Comparison | Report/UI Thinking ❌ | Poster Thinking ✅ | |---|---| | Each info block wrapped in `border + border-radius + background` as a card | Information placed directly on the canvas, no borders no background | | Clear visual boundaries between modules | Modules naturally separated by **whitespace and thin lines** | | Looks like a mobile APP interface | Looks like a design piece | | Hierarchy via "different colored boxes" | Hierarchy via **font size gradient + weight contrast + color lightness** | | Stacked Glass_Canvas components = card wall | Pure typography + occasional Hairline_Divider | ### Mandatory Rules 1. **Single-page posters must not have more than 3 containers with `background` + `border`.** If information needs grouping, use whitespace (margin/padding) and thin lines (1px, opacity < 10%) instead of bordered cards. 2. **No 2×2 / 2×3 grid card layouts** (unless it's a pure data scenario with `data_dashboard` archetype). Information flows in a single column; multiple items in the same row use `flex + gap` horizontal layout without borders. 3. **Information hierarchy must be established through typography properties**, not through "different colored/backgrounded boxes": - Primary information: large font (≥48px) + heavy weight (900) - Secondary information: medium font (18-24px) + medium weight (700) - Tertiary information: small font (12-14px) + light weight (300-400) + reduced opacity 4. **Glass_Canvas may be used at most once in a single-page poster.** If multiple text sections are needed, use direct HTML typography instead of wrapping each paragraph in a Glass_Canvas. 5. **Bottom action information (price/address/QR code) should not be wrapped in a separate color block.** Use larger font + heavier weight to emphasize, keeping it unified with the overall composition. ### Correct Example (Direct HTML Flow) ```html7.15 — 8.30
城市艺术中心