designlang 12.1.0 → 12.3.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.
@@ -0,0 +1,92 @@
1
+ // Cyberpunk — neon on midnight, scanlines, glitch type, electric accents.
2
+ // References: Blade Runner 2049 UI, Cyberpunk 2077, vaporwave.
3
+
4
+ export const cyberpunk = {
5
+ name: 'Cyberpunk',
6
+ blurb: 'Neon on midnight, scanlines, mono type with glitch energy.',
7
+ fonts: {
8
+ display: { family: 'Space Grotesk', weights: [500, 700], import: 'https://fonts.googleapis.com/css2?family=Space+Grotesk:wght@500;700&display=swap' },
9
+ body: { family: 'JetBrains Mono', weights: [400, 500, 700], import: 'https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500;700&display=swap' },
10
+ },
11
+ tokens: {
12
+ paper: '#0a0815',
13
+ ink: '#e0e0ff',
14
+ inkSoft: '#7d80b0',
15
+ accent: '#ff2bd6',
16
+ accentAlt: '#00f0ff',
17
+ rule: '#2a2050',
18
+ radius: '2px',
19
+ radiusLg: '4px',
20
+ shadow: '0 0 28px rgba(255,43,214,0.4), 0 0 0 1px rgba(255,43,214,0.6)',
21
+ shadowSm: '0 0 14px rgba(0,240,255,0.3)',
22
+ spacingUnit: 8,
23
+ container: '1140px',
24
+ rhythm: 1.5,
25
+ },
26
+ css: `
27
+ :root {
28
+ --vocab-display: 'Space Grotesk', 'Eurostile', sans-serif;
29
+ --vocab-body: 'JetBrains Mono', ui-monospace, monospace;
30
+ --accent-alt: #00f0ff;
31
+ }
32
+ body {
33
+ background: var(--paper);
34
+ color: var(--ink);
35
+ font-family: var(--vocab-body);
36
+ font-size: 14px;
37
+ line-height: 1.55;
38
+ letter-spacing: 0.01em;
39
+ background-image:
40
+ radial-gradient(ellipse at top right, rgba(255,43,214,0.08) 0%, transparent 50%),
41
+ radial-gradient(ellipse at bottom left, rgba(0,240,255,0.08) 0%, transparent 50%),
42
+ repeating-linear-gradient(0deg, transparent 0 2px, rgba(255,255,255,0.012) 2px 3px);
43
+ }
44
+ .v-display, h1, h2, h3 {
45
+ font-family: var(--vocab-display);
46
+ font-weight: 700;
47
+ letter-spacing: -0.02em;
48
+ line-height: 1.0;
49
+ text-shadow: 2px 0 0 rgba(255,43,214,0.4), -2px 0 0 rgba(0,240,255,0.4);
50
+ }
51
+ h1::before { content: '> '; color: var(--accent-alt); }
52
+ .v-card {
53
+ background: linear-gradient(160deg, rgba(40,30,80,0.5), rgba(20,15,40,0.5));
54
+ border: 1px solid var(--rule);
55
+ box-shadow: var(--shadow-sm);
56
+ padding: 24px;
57
+ position: relative;
58
+ }
59
+ .v-card::before {
60
+ content: ''; position: absolute; inset: 0;
61
+ background: linear-gradient(45deg, transparent 49%, var(--accent) 49.5%, var(--accent) 50%, transparent 50.5%) top right / 12px 12px no-repeat;
62
+ }
63
+ .v-rule { border: 0; height: 1px; background: linear-gradient(90deg, transparent, var(--accent), transparent); }
64
+ .v-cta {
65
+ background: transparent;
66
+ color: var(--accent);
67
+ border: 1px solid var(--accent);
68
+ padding: 14px 26px;
69
+ font-family: var(--vocab-body);
70
+ font-weight: 700;
71
+ letter-spacing: 0.18em;
72
+ text-transform: uppercase;
73
+ font-size: 12px;
74
+ box-shadow: 0 0 0 0 var(--accent), inset 0 0 0 0 var(--accent);
75
+ transition: box-shadow .15s, color .15s;
76
+ }
77
+ .v-cta:hover { color: var(--paper); box-shadow: 0 0 24px var(--accent), inset 0 0 0 2em var(--accent); }
78
+ .v-pill {
79
+ font-family: var(--vocab-body);
80
+ font-size: 10px;
81
+ letter-spacing: 0.2em;
82
+ text-transform: uppercase;
83
+ color: var(--accent-alt);
84
+ border: 1px solid var(--accent-alt);
85
+ padding: 3px 8px;
86
+ box-shadow: 0 0 10px rgba(0,240,255,0.3);
87
+ }
88
+ .v-mark { color: var(--accent); }
89
+ a { color: var(--accent-alt); text-decoration: none; border-bottom: 1px dashed currentColor; }
90
+ a:hover { color: var(--accent); }
91
+ `,
92
+ };
@@ -0,0 +1,75 @@
1
+ // Editorial — broadsheet typography, generous whitespace, ink-on-paper.
2
+ // References: NYT Magazine, The Atlantic redesigns, Bloomberg Businessweek.
3
+
4
+ export const editorial = {
5
+ name: 'Editorial',
6
+ blurb: 'Broadsheet serifs, generous whitespace, ink on paper.',
7
+ fonts: {
8
+ display: { family: 'Instrument Serif', weights: [400], import: 'https://fonts.googleapis.com/css2?family=Instrument+Serif&display=swap' },
9
+ body: { family: 'EB Garamond', weights: [400, 500, 700], import: 'https://fonts.googleapis.com/css2?family=EB+Garamond:wght@400;500;700&display=swap' },
10
+ },
11
+ tokens: {
12
+ paper: '#f7f5ef',
13
+ ink: '#141414',
14
+ inkSoft: '#555049',
15
+ accent: '#a52a2a',
16
+ rule: '#d8d3c4',
17
+ radius: '0px',
18
+ radiusLg: '0px',
19
+ shadow: 'none',
20
+ shadowSm: 'none',
21
+ spacingUnit: 8,
22
+ container: '760px',
23
+ rhythm: 1.7,
24
+ },
25
+ css: `
26
+ :root {
27
+ --vocab-display: 'Instrument Serif', 'Times New Roman', serif;
28
+ --vocab-body: 'EB Garamond', 'Garamond', serif;
29
+ }
30
+ body {
31
+ background: var(--paper);
32
+ color: var(--ink);
33
+ font-family: var(--vocab-body);
34
+ font-size: 19px;
35
+ line-height: 1.65;
36
+ letter-spacing: 0.005em;
37
+ }
38
+ .v-display, h1, h2, h3 {
39
+ font-family: var(--vocab-display);
40
+ font-weight: 400;
41
+ letter-spacing: -0.005em;
42
+ line-height: 1.05;
43
+ }
44
+ .v-display em, h1 em, h2 em, h3 em {
45
+ font-style: italic;
46
+ color: var(--accent);
47
+ }
48
+ .v-card { border-top: 1px solid var(--rule); padding-top: 28px; }
49
+ .v-rule { border: 0; height: 1px; background: var(--rule); margin: 32px 0; }
50
+ .v-cta {
51
+ background: transparent;
52
+ color: var(--ink);
53
+ border-bottom: 2px solid var(--accent);
54
+ padding: 4px 0;
55
+ font-family: var(--vocab-display);
56
+ font-style: italic;
57
+ font-size: 22px;
58
+ transition: color .15s;
59
+ }
60
+ .v-cta:hover { color: var(--accent); }
61
+ .v-pill {
62
+ font-family: var(--vocab-body);
63
+ font-size: 11px;
64
+ letter-spacing: 0.18em;
65
+ text-transform: uppercase;
66
+ color: var(--ink-soft);
67
+ }
68
+ .v-mark {
69
+ font-style: italic;
70
+ color: var(--accent);
71
+ }
72
+ a { color: var(--ink); text-decoration: none; border-bottom: 1px solid var(--rule); padding-bottom: 1px; }
73
+ a:hover { border-bottom-color: var(--accent); color: var(--accent); }
74
+ `,
75
+ };
@@ -0,0 +1,35 @@
1
+ // Design vocabularies — opinionated token overlays applied during `designlang remix`.
2
+ //
3
+ // A vocabulary is a self-contained set of tokens + signature CSS that imposes
4
+ // a visual language on top of the page-shape (sections, voice, anatomy)
5
+ // extracted from a real URL. The output is a single HTML file: "what would
6
+ // stripe.com look like if it had been designed brutalist?"
7
+
8
+ import { brutalist } from './brutalist.js';
9
+ import { swiss } from './swiss.js';
10
+ import { artDeco } from './art-deco.js';
11
+ import { cyberpunk } from './cyberpunk.js';
12
+ import { softUi } from './soft-ui.js';
13
+ import { editorial } from './editorial.js';
14
+
15
+ export const VOCABULARIES = {
16
+ brutalist,
17
+ swiss,
18
+ 'art-deco': artDeco,
19
+ cyberpunk,
20
+ 'soft-ui': softUi,
21
+ editorial,
22
+ };
23
+
24
+ export function listVocabularies() {
25
+ return Object.entries(VOCABULARIES).map(([id, v]) => ({ id, name: v.name, blurb: v.blurb }));
26
+ }
27
+
28
+ export function getVocabulary(id) {
29
+ const v = VOCABULARIES[id];
30
+ if (!v) {
31
+ const available = Object.keys(VOCABULARIES).join(', ');
32
+ throw new Error(`unknown vocabulary "${id}" — available: ${available}`);
33
+ }
34
+ return v;
35
+ }
@@ -0,0 +1,83 @@
1
+ // Soft UI — neumorphism reborn. Cushioned shapes, low contrast, single hue.
2
+ // References: Apple Vision OS chrome, modern dashboard work, Spline UI demos.
3
+
4
+ export const softUi = {
5
+ name: 'Soft UI',
6
+ blurb: 'Cushioned shapes, low contrast, single hue. Vision-OS-adjacent.',
7
+ fonts: {
8
+ display: { family: 'Manrope', weights: [400, 600, 800], import: 'https://fonts.googleapis.com/css2?family=Manrope:wght@400;600;800&display=swap' },
9
+ body: { family: 'Manrope', weights: [400, 500, 600], import: '' },
10
+ },
11
+ tokens: {
12
+ paper: '#eef0f7',
13
+ ink: '#1a1f2e',
14
+ inkSoft: '#6b7280',
15
+ accent: '#6366f1',
16
+ rule: 'rgba(26,31,46,0.08)',
17
+ radius: '14px',
18
+ radiusLg: '24px',
19
+ shadow: '12px 12px 32px rgba(160,170,200,0.45), -12px -12px 32px rgba(255,255,255,0.9)',
20
+ shadowSm: '6px 6px 14px rgba(160,170,200,0.35), -6px -6px 14px rgba(255,255,255,0.85)',
21
+ spacingUnit: 8,
22
+ container: '1100px',
23
+ rhythm: 1.55,
24
+ },
25
+ css: `
26
+ :root {
27
+ --vocab-display: 'Manrope', -apple-system, sans-serif;
28
+ --vocab-body: 'Manrope', -apple-system, sans-serif;
29
+ }
30
+ body {
31
+ background: var(--paper);
32
+ color: var(--ink);
33
+ font-family: var(--vocab-body);
34
+ font-size: 15px;
35
+ line-height: 1.6;
36
+ letter-spacing: -0.005em;
37
+ }
38
+ .v-display, h1, h2, h3 {
39
+ font-family: var(--vocab-display);
40
+ font-weight: 800;
41
+ letter-spacing: -0.025em;
42
+ line-height: 1.05;
43
+ }
44
+ .v-card {
45
+ background: var(--paper);
46
+ border-radius: var(--radius-lg);
47
+ box-shadow: var(--shadow);
48
+ padding: 28px;
49
+ }
50
+ .v-rule {
51
+ border: 0;
52
+ height: 4px;
53
+ border-radius: 2px;
54
+ background: var(--paper);
55
+ box-shadow: inset 2px 2px 4px rgba(160,170,200,0.4), inset -2px -2px 4px rgba(255,255,255,0.9);
56
+ }
57
+ .v-cta {
58
+ background: var(--accent);
59
+ color: white;
60
+ border-radius: var(--radius);
61
+ padding: 14px 26px;
62
+ font-family: var(--vocab-display);
63
+ font-weight: 600;
64
+ letter-spacing: -0.005em;
65
+ box-shadow: 6px 6px 14px rgba(99,102,241,0.35), -2px -2px 8px rgba(255,255,255,0.4);
66
+ transition: transform .12s, box-shadow .12s;
67
+ }
68
+ .v-cta:hover { transform: translateY(-1px); box-shadow: 8px 10px 20px rgba(99,102,241,0.45), -3px -3px 8px rgba(255,255,255,0.5); }
69
+ .v-cta:active { transform: translateY(1px); box-shadow: inset 4px 4px 8px rgba(0,0,0,0.15); }
70
+ .v-pill {
71
+ background: var(--paper);
72
+ border-radius: 999px;
73
+ padding: 4px 12px;
74
+ font-size: 11px;
75
+ font-weight: 600;
76
+ color: var(--ink-soft);
77
+ box-shadow: inset 2px 2px 4px rgba(160,170,200,0.3), inset -2px -2px 4px rgba(255,255,255,0.9);
78
+ }
79
+ .v-mark { color: var(--accent); font-weight: 700; }
80
+ a { color: var(--accent); text-decoration: none; }
81
+ a:hover { text-decoration: underline; text-underline-offset: 4px; }
82
+ `,
83
+ };
@@ -0,0 +1,60 @@
1
+ // Swiss — international typographic style, restraint, grids, helvetica.
2
+ // References: Müller-Brockmann, Vignelli, post-Bauhaus corporate identity.
3
+
4
+ export const swiss = {
5
+ name: 'Swiss',
6
+ blurb: 'Helvetica, grids, restraint. The post-Bauhaus default.',
7
+ fonts: {
8
+ display: { family: 'Inter', weights: [400, 700, 900], import: 'https://fonts.googleapis.com/css2?family=Inter:wght@400;700;900&display=swap' },
9
+ body: { family: 'Inter', weights: [400, 500], import: '' },
10
+ },
11
+ tokens: {
12
+ paper: '#ffffff',
13
+ ink: '#111111',
14
+ inkSoft: '#5b5b5b',
15
+ accent: '#d62828',
16
+ rule: '#111111',
17
+ radius: '0px',
18
+ radiusLg: '0px',
19
+ shadow: 'none',
20
+ shadowSm: 'none',
21
+ spacingUnit: 8,
22
+ container: '1180px',
23
+ rhythm: 1.5,
24
+ },
25
+ css: `
26
+ :root {
27
+ --vocab-display: 'Inter', 'Helvetica Neue', Helvetica, Arial, sans-serif;
28
+ --vocab-body: 'Inter', 'Helvetica Neue', Helvetica, Arial, sans-serif;
29
+ }
30
+ body {
31
+ background: var(--paper);
32
+ color: var(--ink);
33
+ font-family: var(--vocab-body);
34
+ font-size: 15px;
35
+ line-height: 1.5;
36
+ letter-spacing: -0.005em;
37
+ }
38
+ .v-display, h1, h2, h3 {
39
+ font-family: var(--vocab-display);
40
+ font-weight: 900;
41
+ letter-spacing: -0.025em;
42
+ line-height: 1.0;
43
+ }
44
+ .v-card { border-top: 1px solid var(--ink); padding-top: 24px; }
45
+ .v-rule { border-top: 1px solid var(--ink); }
46
+ .v-cta {
47
+ background: var(--ink);
48
+ color: var(--paper);
49
+ padding: 14px 22px;
50
+ font-family: var(--vocab-display);
51
+ font-weight: 700;
52
+ letter-spacing: -0.005em;
53
+ }
54
+ .v-cta:hover { background: var(--accent); }
55
+ .v-pill { font-family: var(--vocab-body); font-size: 11px; letter-spacing: 0.18em; text-transform: uppercase; color: var(--ink-soft); }
56
+ .v-mark { color: var(--accent); }
57
+ a { color: var(--ink); text-decoration: underline; text-underline-offset: 3px; text-decoration-thickness: 1px; }
58
+ a:hover { color: var(--accent); }
59
+ `,
60
+ };