grelin_templates/travel-plan/plan.typ
MORRO d83e6a99a9 Add tech-report and travel-plan templates, replacing feasibility.
Introduce tech-report/ with cover page, custom TOC, and summary flow; add travel-plan/ for trip planning; update README, gitignore, and brand colors.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-08 13:56:22 +08:00

102 lines
2.5 KiB
Plaintext

#import "data/config.typ": *
#import "data/theme.typ": *
#set page(paper: "a4", margin: page-margin, fill: white)
#set text(font: body-font, size: size-body, fill: color-text, lang: "zh")
#set par(leading: leading-body, spacing: 0pt, justify: false)
#let schedule-label() = {
text(font: mono-font, size: size-label, fill: color-meta, tracking: 0.08em)[DETAILED SCHEDULE]
}
#let day-badge(id) = {
box(
width: 1.35em,
height: 1.35em,
radius: 50%,
fill: color-heading,
inset: 0pt,
)[
#align(center + horizon)[
#text(font: heading-font, size: 11pt, weight: "bold", fill: white)[#id]
]
]
}
#let timeline-dot(active: false) = {
box(
width: if active { 8pt } else { 6pt },
height: if active { 8pt } else { 6pt },
radius: 50%,
fill: if active { color-heading } else { color-timeline },
)
}
#let stop-card(stop) = {
box(
width: 100%,
stroke: 0.6pt + color-card-border,
radius: card-radius,
inset: card-inset,
)[
#text(font: mono-font, size: size-time, fill: color-meta)[#stop.time]
#v(0.35em)
#text(font: heading-font, size: size-title, weight: "bold", fill: color-heading)[#stop.title]
#if stop.note != "" [
#v(0.45em)
#text(fill: color-text-light)[#stop.note]
]
]
}
#let day-section(day) = block(breakable: true, below: space-section)[
#schedule-label()
#v(0.6em)
#grid(
columns: (auto, 1fr),
column-gutter: 0.55em,
align: horizon,
day-badge(day.id),
text(font: heading-font, size: size-day, weight: "bold", fill: color-heading)[#day.title],
)
#v(0.45em)
#text(fill: color-text-light)[#day.summary]
#v(0.9em)
#for (i, stop) in day.stops.enumerate() [
#grid(
columns: (16pt, 1fr),
column-gutter: 10pt,
align: (center, top),
box(width: 16pt)[
#align(center)[
#timeline-dot(active: stop.active)
#if i < day.stops.len() - 1 [
#v(-0.2em)
#box(width: 1pt, height: 4.2em, fill: color-timeline)
]
]
],
stop-card(stop),
)
#if i < day.stops.len() - 1 [#v(space-card)]
]
]
#align(left)[
#text(font: heading-font, size: 20pt, weight: "bold", fill: color-primary)[#trip.title]
#v(0.3em)
#text(fill: color-text-light)[#trip.subtitle]
#v(1.2em)
]
#for day in days [
#day-section(day)
]
#v(1em)
#align(left)[
#text(size: size-caption, fill: color-meta)[
参考图与链接见 #raw("trips/" + trip-id + "/") — 排版占位,地点图区待接 refs/
]
]