import type { CliOptions, Concept, Palette } from "./types.js"; export function usageNotes(brand: string, palette: Palette, concepts: Concept[]): string { return `# ${brand} logo usage notes Generated by the \`logo-design\` skill. Every mark in this package is a plain SVG you can open in Figma, Illustrator, Inkscape, or any browser. ## Clear space Reserve clear space equal to **25% of the mark height** (64 units on the 256 unit artboard) on all four sides. Nothing — type, rules, photography, other logos — enters that zone. ## Minimum sizes | Context | Minimum width | Which file | |---------|---------------|------------| | Favicon / app icon | 16 px | \`vector/logo-01.svg\` (mark only) | | UI chrome, avatars | 24 px | mark only | | Print, business card | 12 mm | mark only | | Horizontal lockup | 120 px | \`vector/logo-01-lockup.svg\` | Below 120 px the wordmark in the lockup stops being legible. Drop to the mark. ## Color | Role | Hex | |------|-----| | Primary | \`${palette.primary}\` | | Secondary | \`${palette.secondary}\` | | Accent | \`${palette.accent}\` | | Background | \`${palette.background}\` | The SVGs ship with a transparent background by default. Re-run with \`--background\` if you need a baked-in backdrop rect. ## Do - Use the supplied SVG. It scales losslessly and stays crisp on any display. - Keep the mark on backgrounds that hold a contrast ratio of at least 3:1 against \`${palette.primary}\`. - Scale the whole group proportionally. ## Don't - Don't recolor individual shapes ad hoc — swap the palette and regenerate. - Don't rotate, skew, or add drop shadows, bevels, or outlines. - Don't reflow the lockup: the mark stays left of the wordmark at the supplied spacing. - Don't place the mark over busy photography without a solid or scrimmed plate. ## Concepts in this package ${concepts .map((concept) => `- **${concept.id}** (\`${concept.geometry}\`, seed \`${concept.seed}\`) — ${concept.description}`) .join("\n")} `; } export function briefDoc(options: CliOptions, palette: Palette, seed: number, concepts: Concept[]): string { return `# Logo brief — ${options.brand} - **Brief**: ${options.brief} - **Brand**: ${options.brand} - **Style direction**: ${options.style} - **Palette request**: ${palette.requested.join(", ")} - **Master seed**: \`${seed}\` (derived from brief + brand + style + palette) - **Variations**: ${options.variations} ## Resolved palette | Token | Hex | Origin | |-------|-----|--------| ${palette.resolved.map((entry) => `| ${entry.token} | \`${entry.hex}\` | ${entry.origin} |`).join("\n")} Roles: primary \`${palette.primary}\`, secondary \`${palette.secondary}\`, accent \`${palette.accent}\`, background \`${palette.background}\`. ## Concepts ${concepts .map( (concept) => `### ${concept.id} — ${concept.geometry} ${concept.description} - Seed: \`${concept.seed}\` - Mark: \`${concept.markFile}\` - Lockup: \`${concept.lockupFile}\` - Rationale: ${concept.rationale}`, ) .join("\n\n")} ## Reproducibility This package is deterministic. Running the same command with the same \`--brief\`, \`--brand\`, \`--style\`, and \`--palette\` regenerates byte-identical SVGs. Change any one of them to explore a different direction. `; }