brand-intake:真实令牌输入,brand.json 输出
影片必须看起来像产品本身,因此令牌来自产品本身,而非个人品味。源优先级顺序:遇到第一个能提供字段值的源即停止,并记录每个值的来源:
- 用户的仓库(最佳:精确的令牌、真实字体名称、真实 Logo 文件)。
- 实时 URL(计算后的样式、meta 标签、首部 SVG)。
- 用户提供的截图(像素采样)。
- 向用户询问任何仍然缺失的信息。绝不猜测。
输出(路径相对于 launch-video/):films/<slug>/brand.json、films/<slug>/BRAND-SOURCES.md,以及按原样复制到 public/films/<slug>/brand/ 的 Logo 文件(以便场景通过 staticFile() 加载它们)。
提取配方:references/sources.md。字段映射、字体回退、对比度计算:references/brand-json.md。
步骤
- 找到产品根目录。 如果
launch-video/位于产品仓库内部,则仓库根目录为上一级。否则询问 URL 和截图。注意技术栈:package.json依赖(tailwindcss 版本、next、@fontsource/*、shadcn)。 - 从仓库获取颜色。 按顺序:Tailwind v4
@theme变量(CSS 中)、Tailwind v3tailwind.config.{js,ts,cjs,mjs}中的theme.extend.colors、shadcn 令牌(globals.css中的--background、--foreground、--primary、--muted、--card、--accent)、其他:root自定义属性。将 HSL/OKLCH/RGB 转换为 6 位十六进制。使用营销网站使用的主题(深色或浅色),不要混合两者。 - 从仓库获取字体。
next/font/google或next/font/local导入、@fontsource*依赖、@font-face、body/html/h1上的font-family、TailwindfontFamily。记录实际使用的字体名称和字重。 - 从仓库获取 Logo。 首先查找 SVG:
public/logo*.svg、public/*mark*.svg、app/icon.svg、public/favicon.svg、src/assets/*logo*、src/components/*Logo*(内联 JSX SVG:提取<svg>),然后是 PNG ≥ 512 px(apple-touch-icon.png为 180 px:仅作为马克的最后手段,绝不能用于文字标记)。按原样复制到public/films/<slug>/brand/,不做任何修改。 - 获取圆角和主题。
--radius或 TailwindborderRadius;主题 = 深色(如果背景相对亮度 < 0.2)。 - 从实时 URL 填补空白(
references/sources.md§ 实时 URL):theme-color meta、og:image、link rel=icon、首部内联 SVG、body、主按钮、h1的计算样式。 - 从截图填补空白: 在指定点(页面背景、正文文本、主按钮、卡片)采样像素。在 BRAND-SOURCES.md 中记录像素坐标。
- 名称、标语、URL: 来自
package.json的name/description、网站<title>、英雄区h1、og:description、README 第一行。使用用户自己的措辞;这里绝不编写新标语(故事负责文案)。 - 映射 你不能分发或加载的字体,按其角色映射到一个已分发 OFL 字体(brand-json.md § 字体)并说明。
- 对比度检查(brand-json.md § 对比度):前景色在背景色上对比度 ≥ 4.5:1(目标 7:1),强调色在背景色上对比度 ≥ 3:1。写出具体数值。强调色不通过 → 保留它用于形状,选择前景色作为其上的文本色。
- 写入
brand.json,然后如果schemas/brand.schema.json存在则进行验证:npx -y -p ajv-cli@5 -p ajv-formats ajv validate --spec=draft2020 -c ajv-formats -s schemas/brand.schema.json -d films/<slug>/brand.json - 写入
BRAND-SOURCES.md:每行一个值 → 来源(文件:行号、URL + 选择器、或截图 + x,y)。 - 向用户展示一个 6 行摘要(名称、主题、6 个十六进制色样、字体、Logo 文件、任何映射或询问的信息)。
硬性停止(不要继续执行流程)
| 情况 | 执行 | 绝不 |
|---|---|---|
| 仓库、网站或截图中没有 Logo 文件 | 询问:“请发送 Logo 文件,最好为 SVG 或 ≥ 512 px 的透明 PNG。” | 绘制、描摹、生成或近似一个 Logo |
| Logo 仅为一个极小的 favicon | 询问更大的文件 | 将 32 px 的 favicon 放大为英雄标记 |
| 未捕获到颜色(无仓库访问权限、网站被屏蔽、无截图) | 询问 URL 或 2–3 张截图,或十六进制色码 | 挑选“好看”的颜色或默认调色板 |
| 调色板冲突(应用 vs 营销) | 询问影片应使用哪一个;默认为营销网站 | 混合它们 |
| 用户因为不存在 Logo 而想要一个文本文字标记 | 仅在明确回答“是”时允许:显示字体中的产品名称,前景色 | 将其呈现为他们的 Logo |
规则
- 逐字节复制 Logo 文件。除非用户要求,否则不要重新着色、裁剪或“清理”Logo。
- 未经用户确认其拥有权利,绝不使用其他公司的 Logo 或用户的客户的 Logo。
- 绝不从许可证禁止将字体重新分发到仓库的来源(如 Fontshare FFL 字体 Satoshi 或 General Sans、Apple SF Pro)获取字体:将其映射(brand-json.md § 字体)。
brand.json不包含任何秘密,也不包含超出公开产品名称和 URL 的个人数据。- 重新运行采集仅覆盖来源更改的字段;保留用户手动编辑的字段(先进行差异比较)。
- 下游技能仅读取
brand.json;绝不将品牌十六进制值硬编码到场景中[craft/06#grade-discipline]。