open-design/apps/landing-page/app/pages/og.astro
Eli-tangerine c37c691d82
[codex] Add landing page Google Analytics (#2582)
* Add Claude-style design system workflow

* Merge design system workflow into main

* Restore design system workflow UI styles

* Fix design system setup scrolling

* Fix design system setup connector button

* Preserve connector auth link after popup block

* Simplify connected GitHub setup state

* Open generated design system workspace project

* Summarize design system auto prompt in chat

* Add bounded GitHub connector design intake

* Prefer path-scoped GitHub intake tools

* Restore branch GitHub design context intake

* Restore design system review workspace

* Restore design system manager tab

* Let design system workflow routes own details

* Open editable design systems as projects

* Restore design system workspace coverage

* Fix bounded GitHub connector intake

* Hide design system review while generating

* Suppress design system generation questions

* Constrain GitHub design intake to bounded command

* Tolerate oversized GitHub metadata during intake

* Rebuild daemon CLI when sources change

* Fallback when GitHub connector snapshots are rate limited

* Allow GitHub intake without Composio

* Use native GitHub auth for design intake

* Remove design system review group heading

* Improve design system extraction evidence

* Align design system scaffold with Claude output

* Add evidence inventory for design system intake

* Add local design system evidence intake

* Add design system package audit gate

* Allow auditing Claude Design reference packages

* Audit design system package content quality

* Migrate legacy design system artifacts

* Clean migrated design system artifacts

* Require modular design system UI kits

* Reject thin design system UI kits

* Prioritize core design evidence intake

* Require role-based design system UI kits

* Clean stale design system manifest references

* Require representative preserved design assets

* Warn on generic design system visuals

* Enforce design system quality warnings

* Audit connected design system UI kits

* Require mounted design system UI kits

* Require composed design system app shells

* Require runnable JSX design system kits

* Require browser globals for design system components

* Infer design system names from source URLs

* Require source examples in design system packages

* Bind preserved fonts in design system tokens

* Require skill frontmatter in design system packages

* Preserve build icons in design system packages

* Require real assets in brand previews

* Require substantive source examples

* Require product overview in design system README

* Require reusable UI kit README

* Require reusable design system skill docs

* Seed Claude-style UI kit entry contract

* Preserve runtime build assets in design packages

* Audit design system packages after generation

* Audit design system first-run output

* Audit source-backed preview cards

* Align design system UI kit scaffolds

* Materialize design evidence package artifacts

* Show project chat during design system setup

* Hand off design system setup to project chat

* Auto-repair design system audit failures

* Harden design system evidence preservation

* Tighten design system package guidance

* Add targeted design system repair guidance

* Bound design system audit auto repair

* Use connector statuses in design system setup

* Audit design system preview manifests

* Require README preview manifests for design systems

* Add landing page Google Analytics

* Keep GA PR scoped to landing page

* Cover new landing routes with Google Analytics

* Load Google Analytics without static script src

---------

Co-authored-by: qiongyu1999 <2694684348@qq.com>
2026-05-21 20:38:09 +08:00

426 lines
12 KiB
Text
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
/*
* Open Design — OG image (1200×630).
*
* Stand-alone Astro route at `/og/` used purely as a screenshotable
* surface to produce the canonical og:image. Render with a real
* browser at viewport 1200×630, capture a full-page screenshot, then
* upload the resulting PNG to R2 and reference it from `index.astro`'s
* og:image meta.
*
* Visual reference: the dark "Manifesto / 2026 Edition" cover plate
* (chocolate background, big serif headline, four-up stats footer,
* device collage on the right). Self-contained — does not import
* globals.css so the marketing page styles never leak in.
*/
import GoogleAnalytics from '../_components/google-analytics.astro';
import { heroImage } from '../image-assets';
const title = 'Open Design — Design with the agent already on your laptop.';
---
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8" />
<title>{title}</title>
<meta name="viewport" content="width=1200, initial-scale=1" />
<meta name="robots" content="noindex" />
<GoogleAnalytics />
<link rel="preconnect" href="https://fonts.googleapis.com" />
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
<link
rel="stylesheet"
href="https://fonts.googleapis.com/css2?family=Inter+Tight:wght@500;600;700;800;900&family=Inter:wght@400;500;600&family=Playfair+Display:ital,wght@0,600;0,700;1,500;1,600;1,700&family=JetBrains+Mono:wght@400;500&display=swap"
/>
<style>
:root {
--ink: #14110b;
--ink-2: #1c1810;
--ink-3: #2a241a;
--paper: #efe7d2;
--paper-warm: #d8cfb6;
--paper-mute: #8d8472;
--paper-faint: #5b5648;
--coral: #ed6f5c;
--coral-soft: #f08e7c;
--mustard: #e9b94a;
--line: rgba(239, 231, 210, 0.14);
--line-soft: rgba(239, 231, 210, 0.07);
--serif: 'Playfair Display', 'Times New Roman', serif;
--sans: 'Inter Tight', 'Inter', -apple-system, BlinkMacSystemFont, system-ui, sans-serif;
--body: 'Inter', -apple-system, system-ui, sans-serif;
--mono: 'JetBrains Mono', 'SF Mono', Menlo, monospace;
}
* {
box-sizing: border-box;
margin: 0;
padding: 0;
}
html,
body {
background: var(--ink);
color: var(--paper);
font-family: var(--body);
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
.og {
position: relative;
width: 1200px;
height: 630px;
overflow: hidden;
background:
radial-gradient(circle at 88% 22%, rgba(237, 111, 92, 0.10) 0, transparent 38%),
radial-gradient(circle at 12% 90%, rgba(233, 185, 74, 0.06) 0, transparent 42%),
linear-gradient(180deg, #14110b 0%, #1a1610 60%, #14110b 100%);
}
/* paper-grain overlay, identical mood to the live site */
.og::before {
content: '';
position: absolute;
inset: 0;
pointer-events: none;
background-image:
url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='240' height='240'><filter id='n'><feTurbulence type='fractalNoise' baseFrequency='0.85' numOctaves='2' stitchTiles='stitch'/><feColorMatrix values='0 0 0 0 0.95 0 0 0 0 0.90 0 0 0 0 0.78 0 0 0 0.05 0'/></filter><rect width='100%' height='100%' filter='url(%23n)'/></svg>");
background-size: 240px 240px;
mix-blend-mode: screen;
opacity: 0.55;
}
/* ===== top metadata strip ===== */
.topbar {
position: absolute;
top: 0;
left: 0;
right: 0;
height: 38px;
display: grid;
grid-template-columns: 1fr auto 1fr;
align-items: center;
padding: 0 36px;
font-family: var(--mono);
font-size: 10.5px;
letter-spacing: 0.16em;
text-transform: uppercase;
color: var(--paper-mute);
border-bottom: 1px solid var(--line-soft);
}
.topbar .center {
font-family: var(--serif);
font-style: italic;
font-size: 14px;
letter-spacing: 0;
text-transform: none;
color: var(--paper);
}
.topbar .center::before {
content: '·';
color: var(--coral);
margin-right: 6px;
}
.topbar .right {
text-align: right;
}
/* ===== body grid ===== */
.grid {
position: absolute;
inset: 38px 0 0 0;
display: grid;
grid-template-columns: 1fr 1fr;
padding: 36px 56px 28px;
gap: 48px;
}
.copy {
display: flex;
flex-direction: column;
align-items: flex-start;
}
/* tag chips */
.tags {
display: inline-flex;
gap: 10px;
margin-bottom: 28px;
}
.tag {
font-family: var(--mono);
font-size: 9.5px;
letter-spacing: 0.18em;
text-transform: uppercase;
color: var(--paper-warm);
padding: 5px 10px;
border: 1px solid var(--line);
border-radius: 999px;
background: rgba(239, 231, 210, 0.04);
}
.tag.coral {
color: var(--coral);
border-color: rgba(237, 111, 92, 0.35);
background: rgba(237, 111, 92, 0.08);
}
/* big serif headline */
.headline {
font-family: var(--serif);
font-weight: 600;
font-size: 64px;
line-height: 1.04;
letter-spacing: -0.02em;
color: var(--paper);
}
.headline em {
font-style: italic;
font-weight: 600;
color: var(--coral);
}
.headline u {
text-decoration: none;
position: relative;
display: inline-block;
}
.headline u::after {
content: '';
position: absolute;
left: 0;
right: 0;
bottom: 6px;
height: 2px;
background: var(--coral);
opacity: 0.85;
}
.headline .dot {
color: var(--coral);
}
/* lead copy */
.lead {
margin-top: 22px;
max-width: 480px;
font-family: var(--body);
font-size: 14.5px;
line-height: 1.55;
color: var(--paper-warm);
}
.lead b {
color: var(--paper);
font-weight: 600;
}
/* ===== device art ===== */
.art {
position: relative;
align-self: stretch;
}
.art-frame {
position: absolute;
inset: -8px -56px 56px 0;
border-radius: 14px;
overflow: hidden;
background:
radial-gradient(circle at 30% 30%, rgba(255, 255, 255, 0.05) 0, transparent 55%),
linear-gradient(180deg, #1f1b13, #15110a);
box-shadow:
0 30px 80px -20px rgba(0, 0, 0, 0.6),
inset 0 0 1px rgba(239, 231, 210, 0.06);
}
.art-frame img {
position: absolute;
inset: 0;
width: 100%;
height: 100%;
object-fit: cover;
object-position: center;
opacity: 0.92;
mix-blend-mode: lighten;
filter: contrast(1.05) saturate(0.92) brightness(0.96);
}
.art-frame::after {
content: '';
position: absolute;
inset: 0;
background:
radial-gradient(circle at 25% 12%, rgba(237, 111, 92, 0.10) 0, transparent 45%),
linear-gradient(180deg, transparent 30%, rgba(20, 17, 11, 0.55) 100%);
pointer-events: none;
}
/* annotations on art */
.annot {
position: absolute;
font-family: var(--mono);
font-size: 9.5px;
letter-spacing: 0.18em;
text-transform: uppercase;
color: var(--paper-mute);
z-index: 2;
}
.annot.tl {
top: 14px;
left: 18px;
}
.annot.tr {
top: 14px;
right: 14px;
color: var(--paper-warm);
}
.annot.br {
bottom: 64px;
right: 14px;
color: var(--coral);
}
/* OS coral coin */
.coin {
position: absolute;
top: 78px;
right: 36px;
width: 78px;
height: 78px;
border-radius: 999px;
background: radial-gradient(circle at 30% 28%, #f5876f 0%, #ed6f5c 55%, #c54a3a 100%);
box-shadow:
0 0 0 1px rgba(237, 111, 92, 0.35),
0 0 32px rgba(237, 111, 92, 0.55),
0 18px 40px -10px rgba(237, 111, 92, 0.45);
display: grid;
place-items: center;
font-family: var(--mono);
font-size: 10.5px;
letter-spacing: 0.18em;
text-transform: uppercase;
color: #14110b;
text-align: center;
line-height: 1.1;
font-weight: 600;
z-index: 4;
}
/* ===== bottom stats strip ===== */
.stats {
position: absolute;
left: 56px;
right: 56px;
bottom: 38px;
padding-top: 18px;
border-top: 1px solid var(--line);
display: grid;
grid-template-columns: repeat(4, 1fr);
gap: 24px;
max-width: 540px;
}
.stat {
display: flex;
flex-direction: column;
gap: 6px;
}
.stat .num {
font-family: var(--serif);
font-size: 38px;
line-height: 1;
font-weight: 600;
color: var(--paper);
}
.stat.zero .num {
font-style: italic;
color: var(--coral);
}
.stat .lbl {
font-family: var(--mono);
font-size: 9px;
letter-spacing: 0.2em;
text-transform: uppercase;
color: var(--paper-mute);
line-height: 1.4;
}
</style>
</head>
<body>
<div class="og">
<div class="topbar">
<span>Open Design · Manifesto · 2026 Edition</span>
<span class="center">open.design</span>
<span class="right">Cover · 01 / 08 · OSS Alternative</span>
</div>
<div class="grid">
<div class="copy">
<div class="tags">
<span class="tag coral">Apache 2.0</span>
<span class="tag">Local-first</span>
<span class="tag">BYOK</span>
</div>
<h1 class="headline">
Design with the<br />
<em>agent</em> already<br />
on your <u>laptop</u><span class="dot">.</span>
</h1>
<p class="lead">
Open Design is the open-source alternative to Claude Design.
Your existing coding agent — <b>Claude · Codex · Cursor · Gemini · OpenCode · Qwen</b>
— becomes the design engine, driven by 31 composable skills and
72 brand-grade design systems.
</p>
</div>
<div class="art">
<span class="annot tl">Fig. 01 / OD-26</span>
<span class="annot tr">Plate Nº 08</span>
<div class="art-frame">
<img src={heroImage} alt="" />
</div>
<span class="annot br">Composed in Open Design</span>
</div>
</div>
<span class="coin">Open<br />Source</span>
<div class="stats">
<div class="stat">
<span class="num">72</span>
<span class="lbl">Design<br />Systems</span>
</div>
<div class="stat">
<span class="num">31</span>
<span class="lbl">Composable<br />Skills</span>
</div>
<div class="stat">
<span class="num">12</span>
<span class="lbl">Coding<br />Agents</span>
</div>
<div class="stat zero">
<span class="num">0</span>
<span class="lbl">Lock-in /<br />Vendor Cloud</span>
</div>
</div>
</div>
</body>
</html>