Add brand kit, #/brand page, and responsive logo marks

Export script generates PNG/WebP/favicons/ZIP and OG image; nav uses symbol on mobile and horizontal lockup on desktop; press kit at #/brand with download links and print-friendly guidelines.

Co-authored-by: Cursor <[email protected]>
This commit is contained in:
defiQUG
2026-05-26 20:53:37 -07:00
co-authored by Cursor
parent 2019f56f27
commit 33aab0d3de
48 changed files with 569 additions and 77 deletions
+184
View File
@@ -0,0 +1,184 @@
import { Download, Palette, Printer, Type } from 'lucide-react'
import manifest from '../../../config/brand-assets.manifest.json'
type BrandManifest = typeof manifest
export function BrandAssetsPage() {
const data = manifest as BrandManifest
return (
<div className="mx-auto max-w-4xl px-4 py-12 sm:px-6 lg:px-8">
<div className="section-header mb-10">
<div className="section-eyebrow">Press & partners</div>
<h1 className="section-title">Brand assets</h1>
<p className="section-subtitle">
Official logos, colors, and favicons for Miracles in Motion Foundation. Use only these
files; do not recreate or recolor the mark.
</p>
</div>
<div className="mb-8 flex flex-wrap gap-3 print:hidden">
<a href="/brand/MIM4U-Brand-Kit.zip" className="btn-primary" download>
<Download className="h-4 w-4" aria-hidden />
Download complete kit (ZIP)
</a>
<button
type="button"
className="btn-secondary"
onClick={() => window.print()}
>
<Printer className="h-4 w-4" aria-hidden />
Print guidelines
</button>
</div>
<section className="card mb-8" id="usage">
<h2 className="font-semibold tracking-tight">Usage (summary)</h2>
<ul className="mt-3 list-disc space-y-2 pl-5 text-sm text-neutral-700 dark:text-neutral-300">
<li>Do not stretch, rotate, or change logo colors.</li>
<li>
Keep clear space around the lockup (at least the height of the capital M in MIRACLES).
</li>
<li>
<strong>Website header:</strong> horizontal lockup on tablet/desktop; symbol mark on
mobile.
</li>
<li>
<strong>Favicon / app icon:</strong> symbol on forest green (<code>#1a3c34</code>).
</li>
<li>
Sponsor and co-branding use requires approval — see{' '}
<a className="underline text-primary-600 dark:text-secondary-400" href="#/legal#sponsorship-terms">
Sponsorship Terms
</a>
.
</li>
<li>
Questions:{' '}
<a className="underline" href="mailto:[email protected]">
contact@mim4u.org
</a>
</li>
</ul>
</section>
<section className="card mb-8">
<div className="flex items-center gap-2">
<Palette className="h-5 w-5 text-primary-600 dark:text-secondary-400" aria-hidden />
<h2 className="font-semibold tracking-tight">Colors</h2>
</div>
<div className="mt-4 grid gap-3 sm:grid-cols-2">
{data.colors.map((c) => (
<div
key={c.hex}
className="flex items-center gap-3 rounded-xl border border-neutral-200/80 p-3 dark:border-white/10"
>
<span
className="h-12 w-12 shrink-0 rounded-lg border border-black/10 shadow-inner"
style={{ backgroundColor: c.hex }}
aria-hidden
/>
<div className="text-sm">
<div className="font-medium">{c.name}</div>
<div className="font-mono text-xs text-neutral-600 dark:text-neutral-400">{c.hex}</div>
<div className="text-xs text-neutral-500">{c.role}</div>
</div>
</div>
))}
</div>
</section>
<section className="card mb-8">
<div className="flex items-center gap-2">
<Type className="h-5 w-5 text-primary-600 dark:text-secondary-400" aria-hidden />
<h2 className="font-semibold tracking-tight">Typography (website)</h2>
</div>
<ul className="mt-3 space-y-2 text-sm text-neutral-700 dark:text-neutral-300">
{data.typography.map((t) => (
<li key={t.name}>
<strong>{t.name}</strong> — {t.use}
</li>
))}
</ul>
<p className="mt-3 text-xs text-neutral-500 dark:text-neutral-400">
Type in the logo artwork is part of the supplied files; do not set live text in a substitute
font to imitate the lockup.
</p>
</section>
{data.groups.map((group) => (
<section key={group.id} className="card mb-6" id={`assets-${group.id}`}>
<h2 className="font-semibold tracking-tight">{group.title}</h2>
<p className="mt-1 text-sm text-neutral-600 dark:text-neutral-400">{group.description}</p>
<div className="mt-4 overflow-x-auto">
<table className="w-full text-left text-sm">
<thead>
<tr className="border-b border-neutral-200 dark:border-white/10">
<th className="py-2 pr-4 font-medium">File</th>
<th className="py-2 pr-4 font-medium">Format</th>
<th className="py-2 font-medium">Download</th>
</tr>
</thead>
<tbody>
{group.assets.map((asset) => (
<tr
key={asset.path}
className="border-b border-neutral-100 dark:border-white/5"
>
<td className="py-3 pr-4">{asset.title}</td>
<td className="py-3 pr-4 font-mono text-xs">{asset.format}</td>
<td className="py-3">
<a
href={asset.path}
className="inline-flex items-center gap-1 text-primary-600 hover:underline dark:text-secondary-400"
download
>
<Download className="h-3.5 w-3.5" aria-hidden />
{asset.path.split('/').pop()}
</a>
</td>
</tr>
))}
</tbody>
</table>
</div>
{group.id === 'horizontal' && (
<div className="mt-4 rounded-xl bg-primary-600/10 p-4 dark:bg-primary-900/20">
<img
src="/brand/logo-horizontal.png"
alt=""
className="mx-auto h-16 w-auto max-w-full object-contain md:h-20"
width={1024}
height={354}
/>
</div>
)}
{group.id === 'symbol' && (
<div className="mt-4 flex flex-wrap items-center justify-center gap-6 rounded-xl bg-neutral-100 p-6 dark:bg-neutral-900">
<img
src="/brand/logo-symbol.svg"
alt=""
className="h-20 w-20 object-contain"
width={100}
height={99}
/>
<img
src="/brand/logo-symbol-512.png"
alt=""
className="h-20 w-20 object-contain"
width={512}
height={512}
/>
</div>
)}
</section>
))}
<p className="text-center text-xs text-neutral-500 print:mt-8">
© Miracles in Motion Foundation. Kit version {data.version} · Updated {data.updated}
</p>
</div>
)
}
export default BrandAssetsPage
+1
View File
@@ -0,0 +1 @@
export { BrandAssetsPage, default } from './BrandAssetsPage'