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>
102 lines
2.5 KiB
Plaintext
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/
|
|
]
|
|
]
|