designlang 7.0.0 → 7.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (77) hide show
  1. package/.github/og-preview.png +0 -0
  2. package/.github/workflows/manavarya-bot.yml +17 -0
  3. package/.vercel/README.txt +11 -0
  4. package/.vercel/project.json +1 -0
  5. package/CHANGELOG.md +29 -0
  6. package/CONTRIBUTING.md +25 -0
  7. package/README.md +38 -11
  8. package/bin/design-extract.js +41 -2
  9. package/chrome-extension/README.md +41 -0
  10. package/chrome-extension/icons/favicon.svg +7 -0
  11. package/chrome-extension/icons/icon-128.png +0 -0
  12. package/chrome-extension/icons/icon-16.png +0 -0
  13. package/chrome-extension/icons/icon-32.png +0 -0
  14. package/chrome-extension/icons/icon-48.png +0 -0
  15. package/chrome-extension/manifest.json +26 -0
  16. package/chrome-extension/popup.html +167 -0
  17. package/chrome-extension/popup.js +59 -0
  18. package/docs/superpowers/specs/2026-04-18-website-redesign-design.md +120 -0
  19. package/docs/superpowers/specs/2026-04-19-designlang-v7-1-design.md +111 -0
  20. package/package.json +1 -1
  21. package/src/config.js +5 -1
  22. package/src/crawler.js +361 -2
  23. package/src/extractors/interaction-states.js +57 -0
  24. package/src/extractors/modern-css.js +100 -0
  25. package/src/extractors/token-sources.js +65 -0
  26. package/src/extractors/wide-gamut.js +47 -0
  27. package/src/formatters/routes-reconciliation.js +160 -0
  28. package/src/index.js +29 -0
  29. package/src/utils/color-gamut.js +82 -0
  30. package/src/utils-cookies.js +73 -0
  31. package/tests/cookies.test.js +98 -0
  32. package/tests/interaction-states.test.js +62 -0
  33. package/tests/modern-css.test.js +104 -0
  34. package/tests/routes-reconciliation.test.js +120 -0
  35. package/tests/wide-gamut.test.js +90 -0
  36. package/website/app/api/extract/route.js +216 -56
  37. package/website/app/components/A11ySlider.js +369 -0
  38. package/website/app/components/Comparison.js +286 -0
  39. package/website/app/components/CssHealth.js +243 -0
  40. package/website/app/components/HeroExtractor.js +455 -0
  41. package/website/app/components/Marginalia.js +3 -0
  42. package/website/app/components/McpSection.js +223 -0
  43. package/website/app/components/PlatformTabs.js +250 -0
  44. package/website/app/components/RegionsComponents.js +429 -0
  45. package/website/app/components/Rule.js +13 -0
  46. package/website/app/components/Specimens.js +237 -0
  47. package/website/app/components/StructuredData.js +144 -0
  48. package/website/app/components/TokenBrowser.js +344 -0
  49. package/website/app/components/token-browser-sample.js +65 -0
  50. package/website/app/globals.css +415 -633
  51. package/website/app/icon.svg +7 -0
  52. package/website/app/layout.js +113 -6
  53. package/website/app/opengraph-image.js +170 -0
  54. package/website/app/page.js +372 -148
  55. package/website/app/robots.js +15 -0
  56. package/website/app/seo-config.js +82 -0
  57. package/website/app/sitemap.js +18 -0
  58. package/website/lib/cache.js +73 -0
  59. package/website/lib/rate-limit.js +30 -0
  60. package/website/lib/rate-limit.test.js +55 -0
  61. package/website/lib/specimens.json +86 -0
  62. package/website/lib/token-helpers.js +70 -0
  63. package/website/lib/url-safety.js +103 -0
  64. package/website/lib/url-safety.test.js +116 -0
  65. package/website/lib/zip-files.js +15 -0
  66. package/website/package-lock.json +85 -0
  67. package/website/package.json +1 -0
  68. package/website/public/favicon.svg +7 -0
  69. package/website/public/logo-specimen.svg +76 -0
  70. package/website/public/mark.svg +12 -0
  71. package/website/public/site.webmanifest +13 -0
  72. package/website/app/favicon.ico +0 -0
  73. package/website/public/file.svg +0 -1
  74. package/website/public/globe.svg +0 -1
  75. package/website/public/next.svg +0 -1
  76. package/website/public/vercel.svg +0 -1
  77. package/website/public/window.svg +0 -1
@@ -1,175 +1,399 @@
1
- import Extractor from './components/Extractor';
1
+ import Rule from './components/Rule';
2
+ import Marginalia from './components/Marginalia';
3
+ import HeroExtractor from './components/HeroExtractor';
4
+ import TokenBrowser from './components/TokenBrowser';
5
+ import McpSection from './components/McpSection';
6
+ import PlatformTabs from './components/PlatformTabs';
7
+ import CssHealth from './components/CssHealth';
8
+ import A11ySlider from './components/A11ySlider';
9
+ import RegionsComponents from './components/RegionsComponents';
10
+ import Specimens from './components/Specimens';
11
+ import Comparison from './components/Comparison';
2
12
 
3
13
  export default function Home() {
4
- const marqueeText = "COLORS // TYPOGRAPHY // SPACING // LAYOUT // SHADOWS // ACCESSIBILITY // COMPONENTS // ANIMATIONS // BREAKPOINTS // CSS VARIABLES // INTERACTIONS // RESPONSIVE // FIGMA // TAILWIND // REACT // SHADCN // ";
5
-
6
14
  return (
7
- <>
8
- {/* ── HERO ── */}
9
- <section className="hero">
10
- <h1 className="hero-title">
11
- DESIGN
12
- <br />
13
- LANG
14
- <span>reverse-engineer any website</span>
15
- </h1>
16
- <p className="hero-sub">
17
- One command extracts the complete design language from any live website.
18
- 8 output files. 15 sections. 12 extractors. No other tool does this.
19
- </p>
20
- <a href="https://github.com/Manavarya09/design-extract" className="hero-cmd">
21
- npx designlang https://vercel.com
22
- </a>
23
- <div className="scroll-hint">scroll down</div>
24
- </section>
25
-
26
- {/* ── STATS ── */}
27
- <div className="stats-strip">
28
- <div className="stat"><div className="stat-value">8</div><div className="stat-label">Output Files</div></div>
29
- <div className="stat"><div className="stat-value">12</div><div className="stat-label">Extractors</div></div>
30
- <div className="stat"><div className="stat-value">11</div><div className="stat-label">Component Types</div></div>
31
- <div className="stat"><div className="stat-value">15</div><div className="stat-label">Markdown Sections</div></div>
32
- <div className="stat"><div className="stat-value">7</div><div className="stat-label">Score Categories</div></div>
33
- <div className="stat"><div className="stat-value">4</div><div className="stat-label">Viewports Crawled</div></div>
34
- </div>
35
-
36
- {/* ── MARQUEE ── */}
37
- <div className="marquee">
38
- <div className="marquee-inner">
39
- {marqueeText}{marqueeText}{marqueeText}{marqueeText}
15
+ <main className="page">
16
+ {/* ── HEAD SLUG ─────────────────────────────────────── */}
17
+ <header style={{ paddingTop: 'var(--r4)', paddingBottom: 'var(--r5)' }}>
18
+ <div
19
+ style={{
20
+ display: 'flex',
21
+ justifyContent: 'space-between',
22
+ alignItems: 'baseline',
23
+ gap: 'var(--r5)',
24
+ borderBottom: 'var(--hair)',
25
+ paddingBottom: 'var(--r3)',
26
+ }}
27
+ >
28
+ <span style={{ display: 'inline-flex', alignItems: 'center', gap: 10 }}>
29
+ {/* eslint-disable-next-line @next/next/no-img-element */}
30
+ <img src="/mark.svg" alt="" width={22} height={22} style={{ display: 'block' }} />
31
+ <span className="mono" style={{ fontSize: 13, letterSpacing: '0.02em' }}>
32
+ designlang
33
+ <span style={{ color: 'var(--ink-3)', marginLeft: 12 }}>v7.0</span>
34
+ </span>
35
+ </span>
36
+ <nav
37
+ className="mono"
38
+ style={{ display: 'flex', gap: 'var(--r5)', fontSize: 12, textTransform: 'uppercase', letterSpacing: '0.1em' }}
39
+ >
40
+ <a href="#extract" style={{ borderBottom: 0 }}>Extract</a>
41
+ <a href="#features" style={{ borderBottom: 0 }}>Features</a>
42
+ <a href="#specimens" style={{ borderBottom: 0 }}>Specimens</a>
43
+ <a href="#install" style={{ borderBottom: 0 }}>Install</a>
44
+ <a href="https://github.com/Manavarya09/design-extract" style={{ borderBottom: 0 }}>GitHub</a>
45
+ <a href="https://www.npmjs.com/package/designlang" style={{ borderBottom: 0 }}>npm</a>
46
+ </nav>
40
47
  </div>
41
- </div>
48
+ </header>
42
49
 
43
- {/* ── OUTPUT FILES ── */}
44
- <section>
45
- <h2 className="section-title">8 Output Files</h2>
46
- <div className="files-grid">
47
- {[
48
- { num: '01', name: '*-design-language.md', desc: 'AI-optimized markdown feed it to any LLM and it recreates the design from scratch. 15 sections covering every aspect.' },
49
- { num: '02', name: '*-preview.html', desc: 'Gorgeous dark-themed visual report with color swatches, type scale rendering, shadow cards, and accessibility score.' },
50
- { num: '03', name: '*-tailwind.config.js', desc: 'Drop-in Tailwind CSS theme extension with colors, fonts, spacing, radii, shadows, and screens.' },
51
- { num: '04', name: '*-variables.css', desc: 'CSS custom properties organized by category. Import directly into any project.' },
52
- { num: '05', name: '*-figma-variables.json', desc: 'Figma Variables import format with light/dark mode support. Hand off to designers instantly.' },
53
- { num: '06', name: '*-theme.js', desc: 'React/CSS-in-JS theme object compatible with Chakra UI, Stitches, and Vanilla Extract.' },
54
- { num: '07', name: '*-shadcn-theme.css', desc: 'shadcn/ui theme variables in the exact format it expects. Paste into globals.css.' },
55
- { num: '08', name: '*-design-tokens.json', desc: 'W3C Design Tokens community group format for tooling integration.' },
56
- ].map(f => (
57
- <div key={f.num} className="file-card" data-num={f.num}>
58
- <div className="file-name">{f.name}</div>
59
- <div className="file-desc">{f.desc}</div>
50
+ {/* ── §00 HERO ──────────────────────────────────────── */}
51
+ <section id="extract" style={{ paddingBlock: 'var(--r7) var(--r8)', borderTop: 0 }}>
52
+ <div className="with-margin">
53
+ <div>
54
+ <div className="section-label" style={{ marginBottom: 'var(--r6)' }}>
55
+ <span>§00Entry</span>
56
+ </div>
57
+ <h1
58
+ className="display hero-title"
59
+ style={{ marginBottom: 'var(--r7)' }}
60
+ >
61
+ A website<br />
62
+ reads as a<br />
63
+ <em style={{ fontStyle: 'italic', color: 'var(--accent)' }}>design system</em>.
64
+ </h1>
65
+ <p className="prose" style={{ fontSize: 20, lineHeight: 1.4, maxWidth: '46ch' }}>
66
+ designlang crawls any URL and returns its complete design language —
67
+ tokens, typography, spacing, shadows, components, regions, health,
68
+ remediations — in W3C DTCG format, with native emitters for iOS,
69
+ Android, Flutter and WordPress, and a live MCP server your editor can read.
70
+ </p>
71
+ </div>
72
+ <Marginalia>
73
+ <div>extraction runtime</div>
74
+ <div>
75
+ <code>Playwright 1.59</code>
76
+ <br />
77
+ <code>@sparticuz/chromium</code>
60
78
  </div>
61
- ))}
79
+ <hr style={{ margin: '12px 0', border: 0, borderTop: '1px solid var(--ink-3)' }} />
80
+ <div>default invocation</div>
81
+ <div><code>$ npx designlang &lt;url&gt;</code></div>
82
+ <p className="foot" style={{ marginTop: 12 }}>
83
+ Works without install. Playwright fetches Chromium on first run;
84
+ ≈ 3–6 seconds per page on a modern laptop.
85
+ </p>
86
+ </Marginalia>
62
87
  </div>
88
+
89
+ <HeroExtractor />
63
90
  </section>
64
91
 
65
- {/* ── WHAT IT EXTRACTS ── */}
66
- <section className="section-red">
67
- <div className="section-inner">
68
- <h2 className="section-title">What It Extracts</h2>
69
- <div className="features-list">
70
- {[
71
- { name: 'Colors', cmd: 'automatic', desc: 'Full palette with primary/secondary/accent/neutral classification. Gradients. Background and text colors with usage context.' },
72
- { name: 'Typography', cmd: 'automatic', desc: 'Font families, type scale, heading/body styles, weight distribution, line heights, letter spacing.' },
73
- { name: 'Spacing', cmd: 'automatic', desc: 'All unique values with automatic base-unit detection. Identifies 4px/8px grids.' },
74
- { name: 'Layout System', cmd: 'automatic', desc: 'Grid column patterns, flex direction usage, container widths, gap values, justify/align patterns. The skeleton, not just the paint.' },
75
- { name: 'Shadows', cmd: 'automatic', desc: 'All box-shadows parsed and classified by visual weight (xs through xl).' },
76
- { name: 'Components', cmd: 'automatic', desc: '11 types: buttons, cards, inputs, links, navbars, footers, modals, dropdowns, tables, badges, avatars.' },
77
- { name: 'Accessibility', cmd: 'automatic', desc: 'WCAG 2.1 contrast ratios for every fg/bg color pair. Overall score and failing pairs.' },
78
- { name: 'Responsive', cmd: '--responsive', desc: 'Crawls at 4 viewports. Maps what changes between breakpoints — fonts, nav, columns, hamburger.' },
79
- { name: 'Interactions', cmd: '--interactions', desc: 'Hovers and focuses interactive elements. Records actual style transitions — hover colors, focus rings, active states.' },
80
- { name: 'CSS Variables', cmd: 'automatic', desc: 'All :root custom properties categorized by type — colors, spacing, typography, shadows, radii.' },
81
- { name: 'Animations', cmd: 'automatic', desc: 'Transitions, easing functions, durations, and @keyframes rules.' },
82
- { name: 'Design Score', cmd: 'automatic', desc: '7-category quality rating (A-F) — color discipline, typography, spacing, shadows, radii, accessibility, tokenization.' },
83
- ].map(f => (
84
- <div key={f.name} className="feature">
85
- <div className="feature-name">{f.name}</div>
86
- <div className="feature-cmd">{f.cmd}</div>
87
- <div className="feature-desc">{f.desc}</div>
88
- </div>
89
- ))}
90
- </div>
92
+ {/* ── §01 DTCG BROWSER ──────────────────────────────── */}
93
+ <section id="features">
94
+ <Rule number="01" label="DTCG token browser" />
95
+ <div style={{ padding: 'var(--r6) 0' }}>
96
+ <TokenBrowser />
91
97
  </div>
92
98
  </section>
93
99
 
94
- {/* ── COMMANDS ── */}
100
+ {/* ── §02 MCP ───────────────────────────────────────── */}
95
101
  <section>
96
- <h2 className="section-title">Commands</h2>
97
- <div className="commands-grid">
98
- {[
99
- { name: 'designlang <url>', desc: 'Extract the full design language. Generates 8 output files.' },
100
- { name: 'designlang <url> --full', desc: 'Everything at once — screenshots, responsive, interactions.' },
101
- { name: 'designlang diff <A> <B>', desc: 'Compare two sites side-by-side. Outputs markdown and HTML.' },
102
- { name: 'designlang brands <urls...>', desc: 'Multi-brand comparison matrix. Color overlap, typography, a11y scores.' },
103
- { name: 'designlang clone <url>', desc: 'Generate a working Next.js starter with the extracted design applied.' },
104
- { name: 'designlang score <url>', desc: 'Rate design system quality. 7 categories, A-F grade, actionable issues.' },
105
- { name: 'designlang watch <url>', desc: 'Monitor a site for design changes on a configurable interval.' },
106
- { name: 'designlang sync <url>', desc: 'Update local token files from the live site. Code-first source of truth.' },
107
- { name: 'designlang history <url>', desc: 'View how a site\'s design has evolved over time.' },
108
- ].map(c => (
109
- <div key={c.name} className="command-card">
110
- <div className="command-name">{c.name}</div>
111
- <div className="command-desc">{c.desc}</div>
112
- </div>
113
- ))}
114
- </div>
102
+ <Rule number="02" label="MCP server" />
103
+ <McpSection />
115
104
  </section>
116
105
 
117
- {/* ── SCORE DEMO ── */}
118
- <section className="section-cream">
119
- <div className="section-inner">
120
- <h2 className="section-title">Design System Scoring</h2>
121
- <div className="score-demo">
122
- <div>$ designlang score https://vercel.com</div>
123
- <br />
124
- <div>&nbsp;&nbsp;<span className="score-grade">68</span>/100&nbsp;&nbsp;Grade: D</div>
125
- <br />
126
- <div>&nbsp;&nbsp;Color Discipline&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;██████████░░░░░░░░░░ 50</div>
127
- <div>&nbsp;&nbsp;Typography&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;██████████████░░░░░░ 70</div>
128
- <div>&nbsp;&nbsp;Spacing System&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;████████████████░░░░ 80</div>
129
- <div>&nbsp;&nbsp;Shadows&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;██████████░░░░░░░░░░ 50</div>
130
- <div>&nbsp;&nbsp;Border Radii&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;████████░░░░░░░░░░░░ 40</div>
131
- <div>&nbsp;&nbsp;Accessibility&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;███████████████████░ 94</div>
132
- <div>&nbsp;&nbsp;Tokenization&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;████████████████████ 100</div>
133
- </div>
134
- </div>
106
+ {/* ── §03 MULTI-PLATFORM ────────────────────────────── */}
107
+ <section>
108
+ <Rule number="03" label="Multi-platform emitters" />
109
+ <PlatformTabs />
135
110
  </section>
136
111
 
137
- {/* ── AGENT SKILL ── */}
112
+ {/* ── §04 HEALTH ────────────────────────────────────── */}
138
113
  <section>
139
- <h2 className="section-title">Agent Skill</h2>
140
- <p style={{ fontSize: '18px', lineHeight: '1.7', color: '#aaa', maxWidth: '700px', marginBottom: '32px' }}>
141
- Works with <strong style={{ color: '#fff' }}>Claude Code, Cursor, Codex, and 40+ AI coding agents</strong> via the skills ecosystem.
142
- </p>
143
- <div className="hero-cmd" style={{ display: 'inline-block' }}>
144
- npx skills add Manavarya09/design-extract
145
- </div>
114
+ <CssHealth />
146
115
  </section>
147
116
 
148
- {/* ── TRY IT ── */}
149
- <section className="section-red" id="try">
150
- <div className="section-inner">
151
- <h2 className="section-title">Try It</h2>
152
- <p style={{ fontSize: '18px', lineHeight: '1.6', marginBottom: '32px', maxWidth: '600px' }}>
153
- Paste any URL. We&apos;ll extract the full design language and let you download all 8 files as a ZIP.
117
+ {/* ── §05 REMEDIATION ───────────────────────────────── */}
118
+ <section>
119
+ <A11ySlider />
120
+ </section>
121
+
122
+ {/* ── §06 REGIONS + COMPONENTS ──────────────────────── */}
123
+ <section>
124
+ <RegionsComponents />
125
+ </section>
126
+
127
+ {/* ── §07 SPECIMENS ─────────────────────────────────── */}
128
+ <section id="specimens">
129
+ <Rule number="07" label="Specimens" />
130
+ <Specimens />
131
+ </section>
132
+
133
+ {/* ── §08 COMPARISON ────────────────────────────────── */}
134
+ <section>
135
+ <Rule number="08" label="Compared" />
136
+ <Comparison />
137
+ </section>
138
+
139
+ {/* ── §09 INSTALL ───────────────────────────────────── */}
140
+ <section id="install" style={{ paddingBottom: 'var(--r9)' }}>
141
+ <Rule number="09" label="Install" />
142
+ <InstallTracks />
143
+ </section>
144
+
145
+ {/* ── FOOTER ───────────────────────────────────────── */}
146
+ <SiteFooter />
147
+ </main>
148
+ );
149
+ }
150
+
151
+ function InstallTracks() {
152
+ const preStyle = {
153
+ padding: 'var(--r4) var(--r5)',
154
+ background: 'var(--ink)',
155
+ color: 'var(--paper)',
156
+ fontSize: 13,
157
+ lineHeight: 1.7,
158
+ overflowX: 'auto',
159
+ whiteSpace: 'pre',
160
+ };
161
+ const colHead = {
162
+ fontFamily: 'var(--font-mono)',
163
+ fontSize: 11,
164
+ letterSpacing: '0.14em',
165
+ textTransform: 'uppercase',
166
+ color: 'var(--ink-2)',
167
+ marginBottom: 'var(--r3)',
168
+ };
169
+ const colTitle = {
170
+ fontSize: 36,
171
+ lineHeight: 1,
172
+ letterSpacing: '-0.02em',
173
+ marginBottom: 'var(--r4)',
174
+ };
175
+
176
+ return (
177
+ <div style={{ marginTop: 'var(--r5)' }}>
178
+ <div className="install-grid">
179
+ {/* CLI */}
180
+ <div className="install-col">
181
+ <div style={colHead}>track 01</div>
182
+ <h3 className="display" style={colTitle}>CLI</h3>
183
+ <p style={{ fontSize: 14, color: 'var(--ink-2)', marginBottom: 'var(--r3)', maxWidth: '34ch' }}>
184
+ Zero install via npx. Node ≥ 20.
185
+ </p>
186
+ <pre className="mono" style={preStyle}>
187
+ {`1 $ npx designlang <url>
188
+ 2 $ npx designlang <url> --platforms all
189
+ 3 $ npx designlang <url> --emit-agent-rules
190
+ 4 $ npx designlang <url> --cookie-file ./cookies.txt
191
+ 5 $ npx designlang <url> --insecure
192
+ 6 $ npx designlang <url> --user-agent "custom-ua"
193
+ 7 $ npx designlang <url> --tokens-legacy`}
194
+ </pre>
195
+ </div>
196
+
197
+ {/* MCP */}
198
+ <div className="install-col">
199
+ <div style={colHead}>track 02</div>
200
+ <h3 className="display" style={colTitle}>MCP server</h3>
201
+ <p className="mono" style={{ fontSize: 11, color: 'var(--ink-3)', marginBottom: 'var(--r3)' }}>
202
+ claude_desktop_config.json / ~/.cursor/mcp.json
203
+ </p>
204
+ <pre className="mono" style={preStyle}>
205
+ {`{
206
+ "mcpServers": {
207
+ "designlang": {
208
+ "command": "npx",
209
+ "args": [
210
+ "designlang",
211
+ "mcp",
212
+ "--output-dir",
213
+ "./design-extract-output"
214
+ ]
215
+ }
216
+ }
217
+ }`}
218
+ </pre>
219
+ <p style={{ fontSize: 13, color: 'var(--ink-2)', marginTop: 'var(--r3)', fontStyle: 'italic', fontFamily: 'var(--font-display)' }}>
220
+ Once connected, every MCP-aware agent can query your last extraction.
221
+ </p>
222
+ </div>
223
+
224
+ {/* Agent rules */}
225
+ <div className="install-col">
226
+ <div style={colHead}>track 03</div>
227
+ <h3 className="display" style={colTitle}>Agent rules</h3>
228
+ <p style={{ fontSize: 14, color: 'var(--ink-2)', marginBottom: 'var(--r3)', maxWidth: '34ch' }}>
229
+ One flag emits ready-to-commit rules for every popular agent.
230
+ </p>
231
+ <pre className="mono" style={preStyle}>
232
+ {`$ npx designlang <url> --emit-agent-rules`}
233
+ </pre>
234
+ <ul
235
+ className="mono"
236
+ style={{
237
+ listStyle: 'none',
238
+ padding: 0,
239
+ marginTop: 'var(--r3)',
240
+ fontSize: 12,
241
+ lineHeight: 1.9,
242
+ color: 'var(--ink-2)',
243
+ }}
244
+ >
245
+ <li>.cursor/rules/designlang.mdc</li>
246
+ <li>.claude/skills/designlang/SKILL.md</li>
247
+ <li>CLAUDE.md.fragment</li>
248
+ <li>agents.md</li>
249
+ </ul>
250
+ </div>
251
+
252
+ {/* Chrome extension */}
253
+ <div className="install-col">
254
+ <div style={colHead}>track 04 · new in v7.1</div>
255
+ <h3 className="display" style={colTitle}>Chrome extension</h3>
256
+ <p style={{ fontSize: 14, color: 'var(--ink-2)', marginBottom: 'var(--r3)', maxWidth: '34ch' }}>
257
+ One click from any tab. Opens this page with the URL prefilled.
258
+ </p>
259
+ <ol
260
+ className="mono"
261
+ style={{
262
+ padding: 0,
263
+ margin: 0,
264
+ listStylePosition: 'inside',
265
+ fontSize: 12,
266
+ lineHeight: 1.9,
267
+ color: 'var(--ink-2)',
268
+ }}
269
+ >
270
+ <li>clone the repo</li>
271
+ <li>open <code style={{ color: 'var(--ink)' }}>chrome://extensions</code></li>
272
+ <li>toggle developer mode</li>
273
+ <li>load unpacked → <code style={{ color: 'var(--ink)' }}>chrome-extension/</code></li>
274
+ </ol>
275
+ <p style={{ fontSize: 13, color: 'var(--ink-2)', marginTop: 'var(--r4)', fontStyle: 'italic', fontFamily: 'var(--font-display)' }}>
276
+ Manifest v3. Only permission: <code className="mono" style={{ fontStyle: 'normal' }}>activeTab</code>.
277
+ </p>
278
+ <a
279
+ href="https://github.com/Manavarya09/design-extract/tree/main/chrome-extension"
280
+ target="_blank"
281
+ rel="noopener"
282
+ className="mono"
283
+ style={{ display: 'inline-block', marginTop: 'var(--r3)', fontSize: 12, letterSpacing: '0.06em', textTransform: 'uppercase' }}
284
+ >
285
+ source →
286
+ </a>
287
+ </div>
288
+ </div>
289
+
290
+ <style>{`
291
+ .install-grid {
292
+ display: grid;
293
+ grid-template-columns: repeat(4, minmax(0, 1fr));
294
+ gap: 0;
295
+ }
296
+ .install-col {
297
+ padding: 0 var(--r4);
298
+ }
299
+ .install-col:first-child { padding-left: 0; }
300
+ .install-col:last-child { padding-right: 0; }
301
+ .install-col + .install-col {
302
+ border-left: 1px solid var(--ink);
303
+ }
304
+ @media (max-width: 1100px) {
305
+ .install-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 0; }
306
+ .install-col { padding: var(--r4) var(--r4); }
307
+ .install-col:nth-child(2n+1) { padding-left: 0; }
308
+ .install-col:nth-child(2n) { padding-right: 0; }
309
+ .install-col:nth-child(n+3) { border-top: 1px solid var(--ink); }
310
+ .install-col:nth-child(2n+1) { border-left: 0; }
311
+ }
312
+ @media (max-width: 640px) {
313
+ .install-grid { grid-template-columns: 1fr; gap: 0; }
314
+ .install-col { padding: var(--r5) 0; border-left: 0 !important; }
315
+ .install-col + .install-col { border-top: 1px solid var(--ink); }
316
+ }
317
+ `}</style>
318
+ </div>
319
+ );
320
+ }
321
+
322
+ function SiteFooter() {
323
+ const colHead = {
324
+ fontFamily: 'var(--font-mono)',
325
+ fontSize: 11,
326
+ letterSpacing: '0.14em',
327
+ textTransform: 'uppercase',
328
+ color: 'var(--ink-2)',
329
+ marginBottom: 'var(--r3)',
330
+ };
331
+ const linkStyle = {
332
+ display: 'block',
333
+ fontFamily: 'var(--font-mono)',
334
+ fontSize: 12,
335
+ padding: '6px 0',
336
+ borderBottom: '1px solid var(--paper-3)',
337
+ color: 'var(--ink)',
338
+ };
339
+ return (
340
+ <footer style={{ paddingBottom: 'var(--r7)' }}>
341
+ <div className="rule" role="separator" aria-label="end">
342
+ <div className="rule-line" />
343
+ <div className="chip mono" style={{ textTransform: 'uppercase', letterSpacing: '0.14em' }}>END</div>
344
+ </div>
345
+
346
+ <div
347
+ className="grid-12"
348
+ style={{ paddingTop: 'var(--r6)', paddingBottom: 'var(--r5)' }}
349
+ >
350
+ <div style={{ gridColumn: 'span 3' }}>
351
+ <div className="mono" style={{ fontSize: 14, letterSpacing: '0.02em' }}>designlang</div>
352
+ <p style={{ fontSize: 12, color: 'var(--ink-2)', marginTop: 8, fontFamily: 'var(--font-mono)' }}>
353
+ Built in Node, Playwright, and opinion.
154
354
  </p>
155
- <Extractor />
156
355
  </div>
157
- </section>
158
356
 
159
- {/* ── FOOTER ── */}
160
- <footer>
161
- <div className="footer-title">DESIGNLANG</div>
162
- <p style={{ color: '#888', fontSize: '14px' }}>
163
- Built by Manavarya Singh. MIT Licensed. Open Source.
164
- </p>
165
- <div className="footer-links">
166
- <a href="https://github.com/Manavarya09/design-extract">GitHub</a>
167
- <a href="https://www.npmjs.com/package/designlang">npm</a>
357
+ <div style={{ gridColumn: 'span 3' }}>
358
+ <div style={colHead}>community</div>
359
+ <a href="https://github.com/Manavarya09/design-extract" style={linkStyle}>GitHub</a>
360
+ <a href="https://www.npmjs.com/package/designlang" style={linkStyle}>npm</a>
361
+ <a href="https://github.com/Manavarya09/design-extract/discussions" style={linkStyle}>Discussions</a>
362
+ <a href="https://github.com/Manavarya09/design-extract/issues" style={linkStyle}>Issues</a>
363
+ <a href="https://github.com/sponsors/Manavarya09" style={linkStyle}>Sponsor</a>
168
364
  </div>
169
- <div className="footer-copy">
170
- No other tool extracts layout patterns, responsive behavior, interaction states, and scores design quality from a single command.
365
+
366
+ <div style={{ gridColumn: 'span 3' }}>
367
+ <div style={colHead}>reference</div>
368
+ <a href="https://github.com/Manavarya09/design-extract#cli" style={linkStyle}>CLI docs</a>
369
+ <a href="https://github.com/Manavarya09/design-extract#mcp" style={linkStyle}>MCP server</a>
370
+ <a href="https://github.com/Manavarya09/design-extract#agent-rules" style={linkStyle}>Cursor rules</a>
371
+ <a href="https://github.com/Manavarya09/design-extract/blob/main/CHANGELOG.md" style={linkStyle}>CHANGELOG</a>
372
+ </div>
373
+
374
+ <div style={{ gridColumn: 'span 3' }}>
375
+ <div style={colHead}>colophon</div>
376
+ <p style={{ fontSize: 12, color: 'var(--ink-3)', fontFamily: 'var(--font-mono)', lineHeight: 1.6 }}>
377
+ v7.0 · MIT · Manav Arya Singh · 2026.
378
+ </p>
379
+ <p style={{ fontSize: 11, color: 'var(--ink-3)', marginTop: 10, fontFamily: 'var(--font-mono)', lineHeight: 1.6 }}>
380
+ Set in Fraunces (Undercase), Instrument Sans (Instrument), and JetBrains Mono (JetBrains).
381
+ </p>
171
382
  </div>
172
- </footer>
173
- </>
383
+ </div>
384
+
385
+ <div
386
+ className="mono"
387
+ style={{
388
+ fontSize: 11,
389
+ color: 'var(--ink-3)',
390
+ borderTop: '1px solid var(--paper-3)',
391
+ paddingTop: 'var(--r3)',
392
+ letterSpacing: '0.04em',
393
+ }}
394
+ >
395
+ Extracted, not generated.
396
+ </div>
397
+ </footer>
174
398
  );
175
399
  }
@@ -0,0 +1,15 @@
1
+ import { SITE_URL } from './seo-config';
2
+
3
+ export default function robots() {
4
+ return {
5
+ rules: [
6
+ {
7
+ userAgent: '*',
8
+ allow: '/',
9
+ disallow: ['/api/'],
10
+ },
11
+ ],
12
+ sitemap: `${SITE_URL}/sitemap.xml`,
13
+ host: SITE_URL,
14
+ };
15
+ }
@@ -0,0 +1,82 @@
1
+ export const SITE_URL = 'https://designlang.manavaryasingh.com';
2
+ export const SITE_NAME = 'designlang';
3
+
4
+ export const SITE_TITLE =
5
+ "designlang \u2014 Extract any website's design system as DTCG tokens, MCP, iOS, Android, Flutter, WordPress";
6
+
7
+ export const SITE_DESCRIPTION =
8
+ 'designlang is an open-source CLI that reverse-engineers any website into a complete design system \u2014 W3C DTCG tokens (primitive, semantic, composite), Tailwind, CSS variables, Figma variables, shadcn/ui theme, React / Vue / Svelte themes, iOS SwiftUI, Android Compose, Flutter, WordPress block theme, plus a stdio MCP server for Claude Code, Cursor, and Windsurf. CSS health audit, WCAG remediation, semantic region classifier, reusable component clustering, dark-mode diff, auth-gated crawling. One command, zero install.';
9
+
10
+ export const SITE_KEYWORDS = [
11
+ 'design system extractor',
12
+ 'extract design system from website',
13
+ 'extract design tokens from url',
14
+ 'website to design tokens',
15
+ 'website to tailwind config',
16
+ 'website to figma variables',
17
+ 'W3C DTCG',
18
+ 'W3C design tokens',
19
+ 'DTCG tokens',
20
+ 'design tokens format',
21
+ 'design tokens generator',
22
+ 'design token extractor',
23
+ 'design tokens from website',
24
+ 'semantic tokens',
25
+ 'primitive tokens',
26
+ 'alias tokens',
27
+ 'composite tokens',
28
+ 'style dictionary alternative',
29
+ 'tokens studio alternative',
30
+ 'subframe alternative',
31
+ 'v0 alternative',
32
+ 'builder.io alternative',
33
+ 'project wallace alternative',
34
+ 'supernova alternative',
35
+ 'specify alternative',
36
+ 'css extractor',
37
+ 'extract css from website',
38
+ 'website to css variables',
39
+ 'website to shadcn theme',
40
+ 'shadcn theme generator',
41
+ 'shadcn/ui theme extractor',
42
+ 'tailwind config generator',
43
+ 'tailwind preset from website',
44
+ 'react theme from website',
45
+ 'figma variables generator',
46
+ 'figma variables from website',
47
+ 'figma tokens import',
48
+ 'iOS SwiftUI tokens',
49
+ 'Android Jetpack Compose tokens',
50
+ 'Flutter theme from website',
51
+ 'WordPress block theme generator',
52
+ 'multi-platform design tokens',
53
+ 'MCP server design tokens',
54
+ 'MCP server Claude Code',
55
+ 'MCP server Cursor',
56
+ 'MCP server Windsurf',
57
+ 'Claude Code design rules',
58
+ 'Cursor project rules',
59
+ 'Claude Code skills',
60
+ 'AGENTS.md design system',
61
+ 'design tokens MCP',
62
+ 'agent rules emitter',
63
+ 'CSS health audit',
64
+ 'CSS specificity audit',
65
+ 'unused CSS analyzer',
66
+ 'WCAG contrast remediation',
67
+ 'accessibility remediation',
68
+ 'color contrast fixer',
69
+ 'semantic regions classifier',
70
+ 'component cluster detection',
71
+ 'reusable component detection',
72
+ 'dark mode diff',
73
+ 'responsive breakpoint capture',
74
+ 'interaction state capture',
75
+ 'Playwright design extractor',
76
+ 'headless browser design extraction',
77
+ 'open source design system tool',
78
+ 'CLI design system tool',
79
+ 'npx designlang',
80
+ 'designlang',
81
+ 'Manav Arya Singh',
82
+ ];