← 提示词库 Anthropic/claude-code/skills/morning/SKILL.md 原文 md
🌐 中英双语对照

name: morning
description: "Render the user's morning brief as a styled HTML artifact, or set it up as a recurring weekday task. Use only when the user explicitly asks to run, see, or set up their morning brief, or if they invoke /morning by name. A question about their day, schedule, or calendar is not by itself a request for the brief; answer it directly instead."

Context / 背景

This page is my 30-second morning glance: one calm view of the shape of my day and the few things worth knowing, so I start oriented instead of overwhelmed.

这个页面是我早晨 30 秒的一瞥:以一个平静的视角呈现我一天的整体形态和少数值得知道的事,让我以清醒有序而非不堪重负的状态开始一天。

Draw one warm, hand-sketched single-file HTML page. The top half is a visual anchor: the day drawn as terrain with a few words underneath. The bottom half is important things: what needs me, what's already sorted, and any extra sections I've asked for.

绘制一个温暖的手绘风单文件 HTML 页面。上半部分是视觉锚点:把这一天画成地形,下方配几句话。下半部分是重要事项:需要我的事、已了结的事,以及我要求过的任何额外版块。

Setup / 设置

When I ask to set this up as a recurring task, infer which language the brief should be in: during the interactive session, the language I wrote to you in; otherwise the language I wrote my setup request in. Write the inferred language into the scheduled task's prompt, so unattended runs don't have to guess. When summarizing content from connected sources, make sure the language is consistent.

当我要求把这项功能设置为循环任务时,推断简报应使用的语言:交互会话期间,用我写给你的语言;否则用我书写设置请求的语言。把推断出的语言写入定时任务的提示词,使无人值守的运行无需猜测。汇总来自已连接来源的内容时,确保语言一致。

Gather / 采集

Let the user know this skill will take a few minutes.

告知用户该技能需要几分钟时间。

Check connections and sort available tools into roles: calendar · email · chat · other (task trackers, docs). A missing role is skipped; the page adapts.

检查连接,并把可用工具按角色归类:日历 · 邮件 · 聊天 · 其他(任务跟踪器、文档)。缺失的角色直接跳过;页面自行适应。

When a core role (calendar, email, chat) has no connected tool and the session is interactive, surface the fix as connector suggestion cards, not prose.

当核心角色(日历、邮件、聊天)没有已连接的工具且会话是交互式时,以连接器建议卡片(而不是成段文字)的形式呈现补救方法。

For each missing role, search the connector catalog by its everyday names — calendar: "google calendar", "outlook calendar" · email: "gmail", "email" · chat: "slack", "teams", "chat". The mainstream matches are typically Google Calendar, Gmail, Slack, and Microsoft 365 (Outlook mail/calendar and Teams in one). Offer them as one card of suggestions covering every missing role together, alongside the delivered page.

对每个缺失的角色,用其日常名称搜索连接器目录 — 日历:"google calendar"、"outlook calendar" · 邮件:"gmail"、"email" · 聊天:"slack"、"teams"、"chat"。主流匹配通常是 Google Calendar、Gmail、Slack 和 Microsoft 365(Outlook 邮件/日历与 Teams 合为一体)。将它们作为一张涵盖所有缺失角色的建议卡片提供,与交付的页面一同呈现。

Checking my existing connections only shows what's already installed — an empty or off-role result there still means the catalog needs searching, and the card shown by that check is not the suggestion. Not every session can search the catalog or offer suggestion cards; when this one can't, skip the cards and let the Write fallbacks carry the ask.

检查我的现有连接只能显示已安装的内容 — 那里的空结果或角色不符的结果仍意味着需要搜索目录,且该检查展示的卡片并不是这里所说的建议。并非每个会话都能搜索目录或提供建议卡片;当本会话不能时,跳过卡片,让 Write 一节的回退方案承载这一请求。

Skip all of this on an unattended scheduled run: no one is there to click, so just render the brief.

无人值守的定时运行跳过以上所有环节:没有人在场点击,直接渲染简报即可。

Calendar: one fetch, today 00:00 → tomorrow 24:00 in home timezone. Only today's events are drawn and classified. Tomorrow's events are for context: they can colour the evening act, earn a motif, or result in a prep item on Needs attention. From tomorrow's events, extract the project name from any I organize or that name a project and search for the latest context.

日历:一次抓取,覆盖主时区的今天 00:00 → 明天 24:00。只有今天的活动会被绘制和分类。明天的活动仅作背景参考:它们可以为晚间时段着色、赢得一个图案母题,或在 Needs attention 中产生一个准备事项。从明天的活动中,对我组织的或点名了项目的活动提取项目名,并搜索其最新背景。

Remaining calls on connected roles, in priority:

对已连接角色的其余调用,按优先级:

  1. Email: threads where I was asked and haven't replied. A group @-mention, team alias, or review-requested-from-team where anyone on the list could answer isn't a bottleneck. (fallback: unread last 2d)
    邮件:我被问到且尚未回复的会话线程。群组 @-提及、团队别名、或列表上任何人都可答复的团队评审请求不算瓶颈。(回退:最近 2 天未读)
  2. Chat: mentions/DMs from ~2d ending in a question I haven't answered or reacted to with an emoji.
    聊天:约 2 天内的提及/私信,且以一个我尚未回答、也未用表情符号回应的问题结尾。
  3. Tomorrow prep: for each project from the step above, one chat search — {keyword} after:{7d ago} — and skim the linked doc if the event has one. This finds what's open on the project so a prep item has something concrete to say.
    明日准备:对上一步得到的每个项目,做一次聊天搜索 — {keyword} after:{7d ago} — 如果活动附带链接文档则粗读之。这能找出项目上未决的事项,使准备项有具体内容可说。
  4. Spare: my sent emails or chats for asks that never came back, or another source (tasks assigned to me and due, docs awaiting my review).
    补充:从我发出的邮件或聊天中找出从未得到回应的请求,或另一来源(分配给我且已到期的任务、等待我评审的文档)。

Pull ~8 candidates per search from snippets.

每次搜索从摘要片段中拉取约 8 个候选。

If a Sections: list came with the invocation, make one targeted fetch per entry on whatever connected tool serves it (a chat channel, a doc, a search). A section that finds nothing is dropped later.

如果调用附带 Sections: 列表,则对每个条目在能服务它的已连接工具(聊天频道、文档、搜索)上做一次有针对性的抓取。一无所获的版块稍后被丢弃。

Sort / 归类

Every candidate goes into one of two lists or is dropped silently, stacked top to bottom: Needs attention first, then Resolved below it (single column, full width), not side by side.

每个候选进入两个列表之一,或被静默丢弃,自上而下堆叠:先 Needs attention(需要我关注),然后 Resolved(已了结)在其下方(单列、全宽),而不是并排。

Needs attention. It would cost me something to ignore until tomorrow: someone's blocked on me, a window closes today, or it gets harder to undo. Must be anchored to a real tool result, verify if it's still open, and any quote verbatim. Before a Slack or email item lands here, open its thread once: if I've already replied in it, or reacted to the ask with any emoji, it moves to Resolved or is dropped. A prep item counts here: something tomorrow that goes better if I've read, decided, or drafted today. If I'm the organizer, it earns a line — the prep is the agenda I'll open with, and the button seeds it. If it's a retro or review, the prep is two or three thoughts to arrive holding, and the button seeds that. Otherwise it needs a concrete anchor: a doc to skim, a decision I'll be asked for, a draft to bring — found in the event or via the one project-name search above.

Needs attention(需要我关注)。 忽略到明天会有代价的事:有人被我卡住、某个窗口今天关闭,或者拖下去更难挽回。必须锚定在真实的工具结果上,核实它是否仍未解决,且任何引用都逐字照录。一条 Slack 或邮件条目落入此处之前,先打开其线程一次:如果我已经在其中回复过,或已用任何表情符号回应了该请求,它就移入 Resolved 或被丢弃。准备事项也计入此处:某件明天的事,如果我今天读过、决定过或起草过会进行得更顺利。如果我是组织者,它值得占一行 — 准备内容就是我将用来开场的议程,按钮为其播种。如果是复盘或评审,准备内容是两三条到时带在身上的想法,按钮为其播种。否则它需要一个具体锚点:一篇要浏览的文档、一个我将被征询的决定、一份要带去的草稿 — 从活动中或通过上述唯一一次项目名搜索找到。

Resolved. Things that closed recently and are worth a glance: a thread I was on that someone else answered, a reply to a comment or question I left, a meeting the organizer cancelled, an overlap that went away, a launch that shipped.

Resolved(已了结)。 近期收尾、值得一看的事:我曾参与的线程被他人答复、我留下的评论或问题收到回复、组织者取消的会议、消失的时间冲突、已上线的发布。

Write / 撰写

Write the brief in my language.

用我的语言撰写简报。

RTL — for right-to-left languages, set the document direction to RTL and mirror the layout.

RTL — 对从右到左的语言,把文档方向设为 RTL 并镜像布局。

Visual anchor / 视觉锚点

Classify the day from the calendar alone — HEAVY (≥5h in meetings or a 3+ cluster) · NORMAL · OPEN (≤1 short meeting). This sets the headline's tone and the terrain's vertical scale.

仅凭日历对这一天分类 — HEAVY(会议时长 ≥5 小时或有 3 个以上的密集扎堆)· NORMAL · OPEN(≤1 个短会议)。这决定标题的语气和地形的纵向比例。

Day-date line — small ink-soft, above the headline: Monday · July 13 2026

日期行 — 小号 ink-soft 色,位于标题上方:Monday · July 13 2026

Headline — one serif line, spoken like a friend handing me the day. If one thing genuinely makes today distinct (I'm running something, a decision gets made, a rare open stretch), name that. Otherwise, name the shape. Never both — pick one and let it land. Register examples — write from the actual day, don't template:

标题 — 一行衬线字体,像朋友把这一天递到我手里那样说话。如果确有一件事让今天与众不同(我在主持某事、有个决定要做、一段难得的空档),就点名它。否则,描述这一天的形态。绝不同时做两件事 — 挑一个,让它落地。语气示例 — 从当天的实际情况出发来写,不要套模板:

Drawing — one SVG ~840×170. One unbroken terrain stroke edge to edge, elevation = load; a calm day flattens to still water — never invent mountains. No card, no fill, no border.

绘图 — 一幅约 840×170 的 SVG。一条不断线的地形笔画从左边缘画到右边缘,海拔 = 负载;平静的一天会摊平成静水 — 绝不虚构山脉。无卡片、无填充、无边框。

Acts — three left-aligned text columns under the drawing with faint hairline dividers. Each column stacks: bold time range (uppercase AM/PM on the trailing time, and on the leading time when the range crosses noon — "9:30 AM – 1 PM", "1 – 3:30 PM", "3:30 PM onward") → one sentence earned from the data (list an observation and be specific to the calendar). On a quiet day the sentence can be brief — never padded. Focal points sit above their column centres (x≈140/420/700).

时段(Acts)— 绘图下方三个左对齐的文本栏,配极细的分隔线。每栏纵向堆叠:加粗的时间范围(结束时间用大写 AM/PM;范围跨过正午时开始时间也用 — "9:30 AM – 1 PM"、"1 – 3:30 PM"、"3:30 PM onward")→ 一句从数据中得来的句子(列出一条观察,并具体到日历)。清闲的一天句子可以很短 — 绝不注水。焦点位于各栏中心上方(x≈140/420/700)。

Important things / 重要事项

Two lists, identical layout. Each has a system-sans heading, then per item:

两个列表,布局完全相同。每个列表有一个系统无衬线字体的标题,然后每个条目:

  1. Bold linked title ≤10 words, in my words — never a subject line or anyone else's phrasing copied in
    加粗的链接标题 ≤10 个词,用我的措辞 — 绝不照抄主题行或任何他人的表述
  2. One sentence — source in prose (tool, person, when) plus the substance. The source phrase itself is the link: "in #growth-model-launch", "on your calendar", "in the doc" — underlined ink-soft, no colour change. That's the only link in the item. No URL returned → the phrase is plain text.
    一句话 — 用散文给出来源(工具、人、时间)加上实质内容。来源短语本身就是链接:"in #growth-model-launch"、"on your calendar"、"in the doc" — 下划线 ink-soft 色,颜色不变。这是条目中唯一的链接。没有返回 URL → 该短语就是纯文本。
    Faint grey numerals on both lists.
    两个列表都配浅灰色数字编号。

Needs attention — the sentence carries the ask itself — what they want, in their words if a short quote does it — and why it matters today. For a prep item, the sentence names tomorrow's thing and what the prep actually is: the doc to skim, the question I'll be asked, the draft to arrive with. Only when the invocation contains the exact phrase "Include action buttons" — the literal words, riding in on their own line with a stored task prompt or typed in an interactive request; a paraphrase, a request for buttons in other words, or inferred intent is not the phrase: add a button on its own line only when Claude could actually move it — a reply to draft, something to research, a doc to write together, options to think through. No button when it's a decision only I can make, a place I need to be, or sensitive per the constraints. href = https://claude.ai/new?q={urlencoded seed}&surface=cowork&composer=mini. Absent that exact phrase, render no buttons anywhere on the page — however button-shaped an item looks, the answer is no buttons.

Needs attention — 句子承载请求本身 — 他们想要什么(如需引用则用短引语、用他们的话),以及为什么今天重要。对准备事项,句子点明明天的那件事以及准备的实际内容:要浏览的文档、我会被问到的问题、到场要带的草稿。只有当调用中包含确切短语 "Include action buttons" 时 — 字面文字,随存储的任务提示词独占一行出现,或在交互请求中输入;改述、用其他措辞请求按钮、或推断出的意图都不算该短语:只有当 Claude 确实能推进时,才在独立一行添加按钮 — 一封要起草的回复、一件要调研的事、一份要一起写的文档、一组要想清楚的选项。当那是只有我能做的决定、我必须到场的地方、或按约束属于敏感事项时,不加按钮。href = https://claude.ai/new?q={urlencoded seed}&surface=cowork&composer=mini。缺少该确切短语时,页面上任何地方都不渲染按钮 — 无论条目看起来多么像按钮,答案都是不加按钮。
【评论】按钮的启用以字面短语门控,明确排除语义等价或推断意图,是一种保守的权限设计:可一键生成新指令的入口不会被自动激活。

Resolved — the sentence says what closed, who closed it, when, and the outcome in a phrase — enough to trust it and move on without the link.

Resolved — 句子说明什么结束了、谁结束的、何时结束的,以及一句话的结果 — 足以让人信任并无需点链接即可继续。

Nothing in either list → one calm line in place of both: "Nothing needs you this morning." Only calendar connected → one line under the lists inviting an inbox or chat connection; in interactive sessions the suggestion card from Gather carries the actual buttons. Nothing at all connected → two friendly sentences replace the whole page, shipped with the same card — the page explains, the card acts.

两个列表都为空 → 用一句平静的话代替两者:"Nothing needs you this morning."(今天早晨没有需要你的事。)只连接了日历 → 列表下方一行文字,邀请连接邮箱或聊天;交互式会话中由 Gather 的建议卡片承载实际按钮。什么都没连接 → 两句友好的话取代整个页面,与同一张卡片一同交付 — 页面负责解释,卡片负责行动。

Sections / 版块

Only when a Sections: list rides in with the invocation. One titled block per entry, in the order given, below Resolved. Each block: a system-sans heading (the entry's own words), then whatever the entry calls for — a short list in the item layout above, or a few sentences of prose. A section with nothing found is dropped, heading and all — never a placeholder, never an apology. No Sections: list → nothing renders here and the page ends after Resolved.

只有当 Sections: 列表随调用而来时才渲染。按给定顺序,每个条目一个带标题的块,位于 Resolved 之下。每个块:一个系统无衬线标题(条目自己的措辞),然后是该条目要求的内容 — 采用上述条目布局的短列表,或几句话的散文。一无所获的版块连同标题一起丢弃 — 绝不放占位符,绝不道歉。没有 Sections: 列表 → 此处不渲染任何内容,页面在 Resolved 之后结束。

The button / 按钮

Label — imperative, ≤5 words, naming what pressing it produces: "Draft the reply", "Write the scorecard with me", "Find out what was decided". Different items get different labels.

标签 — 祈使式,≤5 个词,点明按下它产出什么:"Draft the reply"、"Write the scorecard with me"、"Find out what was decided"。不同条目用不同标签。

Seed — a self-contained work order for a fresh Claude, in prose:

种子(Seed)— 给一个全新 Claude 的自足式工作指令,用散文写成:

No seed at all for anything touching money, health, or credentials — those items render without a button (the same exclusion Verify checks).

凡是触及金钱、健康或凭据的事项一律不给种子 — 这些条目渲染时不带按钮(Verify 检查同样的排除项)。

The seed's verb promises only what the named tool can deliver: a chat reply can be sent, an email can only be drafted — "draft the reply", never "send the email". And the seed never forwards anyone else's words as the work order: the work order is mine; the other person's message is something the fresh session goes and reads.

种子的动词只承诺所指名工具能交付的东西:聊天回复可以发送,邮件只能起草 — 说"draft the reply",绝不说"send the email"。种子也绝不把任何他人的话当作工作指令转发:工作指令是我的;对方的消息是新会话自己去读的东西。

Build / 构建

The page must render perfectly on first open, in one attempt — the reader glances at it over coffee and never sees a retry. Two steps in this environment have known failure modes; handle them as follows instead of discovering them by error.

页面必须在首次打开时一次成型、完美渲染 — 读者边喝咖啡边瞥一眼,永远看不到重试。本环境中有两个步骤存在已知失败模式;按下述方式处理,而不是靠报错去发现。

Fonts. The one needed woff2 file ships in this skill's own assets/fonts/ directory — next to this SKILL.md, e.g. /mnt/skills/examples/morning/assets/fonts/ in the sandbox (fraunces-latin-600). Base64 it from there straight into the @font-face data URI — no network call, nothing to go wrong. Everything else uses the system stack (-apple-system, "Segoe UI", sans-serif) — no file, no @font-face, nothing to fetch. Only if the assets folder is missing, restore it from the npm registry (allowlisted in this sandbox):

字体。 所需的唯一 woff2 文件随本技能自带的 assets/fonts/ 目录发布 — 与本 SKILL.md 同级,例如沙箱中的 /mnt/skills/examples/morning/assets/fonts/(fraunces-latin-600)。从那里取文件做 Base64,直接嵌入 @font-face 的 data URI — 无网络调用,没有可出错之处。其余一切使用系统字体栈(-apple-system, "Segoe UI", sans-serif)— 无文件、无 @font-face、无可抓取之物。只有当 assets 目录缺失时,才从 npm registry(本沙箱已加白名单)恢复:

npm pack @fontsource/fraunces

then extract files/fraunces-latin-600-normal.woff2. Do not fetch fonts from Google Fonts: fonts.googleapis.com (the CSS) is reachable here but fonts.gstatic.com (the binaries) is blocked by the egress proxy — urllib dies with "Tunnel connection failed: 403" and curl with exit 56, and the failure only appears after the CSS step has seemingly succeeded. If both the assets and npm somehow fail, fall back to Georgia, serif for the headline — a system-font page that opens cleanly beats a broken data URI.

然后解出 files/fraunces-latin-600-normal.woff2。不要从 Google Fonts 抓字体:fonts.googleapis.com(CSS)在这里可达,但 fonts.gstatic.com(二进制文件)被出站代理封锁 — urllib 死于 "Tunnel connection failed: 403",curl 以退出码 56 失败,而且该失败只在 CSS 步骤看似成功之后才显现。如果 assets 和 npm 都失败了,标题回退到 Georgia, serif — 一个干净打开的系统字体页面胜过一个损坏的 data URI。

Render check. Screenshot the finished file with the preinstalled browser and actually look at the image before delivering:

渲染检查。 用预装的浏览器对完成的文件截图,并在交付前实际查看该图像:

node -e "const{chromium}=require('playwright');(async()=>{const b=await chromium.launch({executablePath:'/opt/pw-browsers/chromium'});const p=await b.newPage({viewport:{width:960,height:1400}});await p.goto('file://<abs path>');await p.waitForTimeout(600);await p.screenshot({path:'brief.png',fullPage:true});await b.close();})();"

The executablePath matters: a bare chromium.launch() looks for a browser revision that isn't installed and suggests playwright install, which must not be run (the download is blocked and wastes minutes). If playwright isn't in node_modules, npm install playwright first — the package installs fine; only browser downloads are blocked.

executablePath 很重要:裸的 chromium.launch() 会寻找一个未安装的浏览器修订版并建议运行 playwright install,而这绝不能运行(下载被封且浪费数分钟)。如果 playwright 不在 node_modules 中,先 npm install playwright — 该包本身安装没有问题;只有浏览器下载被封。

Verify / 核验

One render, checked on the screenshot from Build. Day-date above headline · one unbroken stroke, every dot on it, three acts · serif on the headline only · clay only in buttons and at most one drawing accent · both lists share one style · every item title linked when a URL exists · buttons only when the exact phrase "Include action buttons" rode in with the prompt — a paraphrase does not count — otherwise none rendered · every button label imperative ≤5 words · every seed opens imperative, names connected tools, closes on an artifact, no money/health/credentials · no seed carries third-party phrasing or any verbatim third-party fragment — the message itself is re-found and re-read through its tool, never pasted · every button href is exactly https://claude.ai/new?q={urlencoded seed}&surface=cowork&composer=mini — that origin, never a look-alike host · every quote verbatim, every href https · any requested sections render after Resolved with a system-sans heading each, empty ones dropped · no chips, cards, badges, footer, timestamp · no act restates a list item · no sentence commands, apologizes, pads, reviews, or narrates process · below 640px acts stack, nothing clipped. Fix within budget. Checklist is internal.

只渲染一次,在 Build 产生的截图上检查。日期行在标题上方 · 一条不断线,每个点都在线上,三个时段 · 衬线字体只用于标题 · clay 色只出现在按钮和至多一处绘图点缀 · 两个列表共用一种样式 · 存在 URL 时每个条目标题都带链接 · 只有当确切短语 "Include action buttons" 随提示词而来时才有按钮 — 改述不算 — 否则一个按钮都不渲染 · 每个按钮标签为祈使式 ≤5 词 · 每个种子以祈使句开头、点名已连接工具、以成果物收尾、不含金钱/健康/凭据 · 没有任何种子携带第三方措辞或任何逐字第三方片段 — 消息本身通过其所在工具被重新找到并重读,绝不粘贴 · 每个按钮 href 恰为 https://claude.ai/new?q={urlencoded seed}&surface=cowork&composer=mini — 就是这个源,绝不是相似域名 · 每处引用逐字,每个 href 均为 https · 请求的版块在 Resolved 之后渲染,各带一个系统无衬线标题,空版块丢弃 · 无 chips、卡片、徽章、页脚、时间戳 · 没有哪个时段复述列表条目 · 没有句子下令、道歉、注水、点评或叙述过程 · 640px 以下时段纵向堆叠,无内容被裁剪。在预算内修复。该清单仅供内部使用。

Voice / 语气

Observe and hand over. Never command ("you need to reply" → state what's true) · never apologize ("wasn't able to find much" → a quiet day is a quiet day) · never pad ("you've got this!") · never review ("genuinely packed"; still/again/finally scold) · never narrate process ("surfacing this because…") · never reproach ("you missed this" → "…in a thread you weren't in").

观察并交付。绝不下令("你需要回复" → 陈述事实是什么)· 绝不道歉("没找到多少东西" → 清闲的一天就是清闲的一天)· 绝不注水("你可以的!")· 绝不点评("实在太满了";still/again/finally 这类词带责备意味)· 绝不叙述过程("之所以呈现这些是因为…")· 绝不责备("你漏掉了这个" → "…在一个你不在的线程里")。

Design / 设计

Page — two full-bleed bands, content max-width 860px inside each with generous padding. Top band (day-date, headline, drawing, acts) sits on wash #F9F9F7; bottom band (both lists, then any requested sections) sits on bg #FCFCFB. No card border, no rounded corners — the bands meet at a hard edge with a line #E1E1DF.

页面 — 两条通栏色带,每条内部内容最大宽度 860px,配充裕内边距。上色带(日期行、标题、绘图、时段)底色 wash #F9F9F7;下色带(两个列表,以及任何请求的版块)底色 bg #FCFCFB。无卡片边框、无圆角 — 两条色带以硬边相接,界线为 #E1E1DF。

Color — bg #FCFCFB · ink #2E2C27 (headline, section headings, item titles, terrain stroke, meeting dots) · ink-soft #6B6A63 (body, act sentences, item sentences, day-date) · ink-grey #B4B3A8 (numerals, grey dots) · hairline #E4E3DC · clay #C6613F (buttons; one optional drawing accent), hover #AE5133.

颜色 — bg #FCFCFB · ink #2E2C27(标题、版块标题、条目标题、地形笔画、会议圆点)· ink-soft #6B6A63(正文、时段句子、条目句子、日期行)· ink-grey #B4B3A8(数字编号、灰色圆点)· hairline #E4E3DC · clay #C6613F(按钮;至多一处绘图点缀),悬停色 #AE5133。

Type — Fraunces for the headline only, ~40px (30px below 640px). Fraunces covers Latin script only: for a headline in another script, use a high-quality system serif instead and skip the @font-face. The system stack (-apple-system, "Segoe UI", sans-serif) for everything else (including both section headings); never italic. Embed Fraunces directly in the file as base64 @font-face (a woff2 data URI) sourced per the Build section — never a Google Fonts or any CDN reference, so the real headline font renders on open with no fallback and no network.

字体 — Fraunces 只用于标题,约 40px(640px 以下 30px)。Fraunces 只覆盖拉丁文字:其他文字的标题改用高质量系统衬线字体并省略 @font-face。系统字体栈(-apple-system, "Segoe UI", sans-serif)用于其他一切(包括两个版块标题);绝不用斜体。按 Build 一节所述来源,把 Fraunces 以 base64 @font-face(woff2 data URI)形式直接嵌入文件 — 绝不用 Google Fonts 或任何 CDN 引用,从而真正的标题字体在打开时即渲染,无回退、无网络。

Terrain — one #2E2C27 stroke. Meeting dots filled #2E2C27, on the line, r 6–13 by weight. Optional/unanswered = grey #B4B3A8, weightless. Genuine overlap = two hollow circles intersecting, filled #FCFCFB (the only hollow dots). At most one supporting motif per act: sun = open creative time, half-risen sun on a horizon = pre-7:30 start, crescent moon = late finish, birds = room to breathe, fireworks = holiday eve, flag = deadline, a distant second ridge through a saddle = depth on heavy days. Clay is rationed to one accent across the whole drawing (a tension squiggle under the worst collision, a dawn sun, fireworks). Always include at least one clay item when the page has no buttons.

地形 — 一条 #2E2C27 笔画。会议圆点填充 #2E2C27,位于线上,半径按重要度取 6–13。可选/未获回应 = 灰色 #B4B3A8,无重量感。真正的日程重叠 = 两个相交的空心圆,填充 #FCFCFB(唯一的空心圆点)。每个时段至多一个辅助母题:太阳 = 开阔的创作时间,地平线上半升的太阳 = 7:30 前开始,新月 = 收工很晚,飞鸟 = 喘息空间,烟花 = 假日前夜,旗帜 = 截止日期,穿过鞍部的一道远山第二棱线 = 重载日的纵深。clay 色在整个绘图中限量一处点缀(最严重冲突下方的一笔张力波纹、一轮黎明太阳、烟花)。当页面没有按钮时,务必包含至少一个 clay 项。

Buttons — solid clay fill + border, border-radius 8px (never a pill), padding 9px 16px, system sans 500 13px, #FCFCFB text, no arrow/icon; hover #AE5133. Nothing else on the page is a button, badge, or filled label.
Responsive — one media query at 640px: acts stack vertically in order, hairlines horizontal, drawing stays full-width above.

按钮 — clay 实心填充 + 边框,圆角 8px(绝不用胶囊形),内边距 9px 16px,系统无衬线 500 字重 13px,文字 #FCFCFB,无箭头/图标;悬停 #AE5133。页面上其他任何东西都不是按钮、徽章或实心标签。
响应式 — 在 640px 处设一个媒体查询:时段按顺序纵向堆叠,分隔线转为水平,绘图保持全宽居上。

Ground rules / 基本准则