@notambourine/brand-kit 1.0.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 (53) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +146 -0
  3. package/SKILL.md +303 -0
  4. package/components.css +186 -0
  5. package/deck.css +124 -0
  6. package/elements.css +100 -0
  7. package/fonts/OFL.txt +95 -0
  8. package/fonts/hanken-grotesk-latin-var-italic.woff2 +0 -0
  9. package/fonts/hanken-grotesk-latin-var.woff2 +0 -0
  10. package/fonts/jetbrains-mono-latin-var-italic.woff2 +0 -0
  11. package/fonts/jetbrains-mono-latin-var.woff2 +0 -0
  12. package/fonts/nunito-latin-var-italic.woff2 +0 -0
  13. package/fonts/nunito-latin-var.woff2 +0 -0
  14. package/fonts/nunito-wordmark-800.woff2 +0 -0
  15. package/fonts.css +66 -0
  16. package/logo/export/apple-touch-icon.png +0 -0
  17. package/logo/export/favicon-16x16.png +0 -0
  18. package/logo/export/favicon-32x32.png +0 -0
  19. package/logo/export/favicon-48x48.png +0 -0
  20. package/logo/export/favicon.ico +0 -0
  21. package/logo/export/icon-192.png +0 -0
  22. package/logo/export/icon-512.png +0 -0
  23. package/logo/export/icon-maskable-512.png +0 -0
  24. package/logo/export/lockup-1024.png +0 -0
  25. package/logo/export/lockup-2048.png +0 -0
  26. package/logo/export/lockup-ink-1024.png +0 -0
  27. package/logo/export/lockup-white-1024.png +0 -0
  28. package/logo/export/mark-1024.png +0 -0
  29. package/logo/export/mark-256.png +0 -0
  30. package/logo/export/mark-512.png +0 -0
  31. package/logo/export/mark-white-512.png +0 -0
  32. package/logo/export/monogram-1024.png +0 -0
  33. package/logo/export/monogram-256.png +0 -0
  34. package/logo/export/monogram-512.png +0 -0
  35. package/logo/export/monogram-white-512.png +0 -0
  36. package/logo/favicon.svg +11 -0
  37. package/logo/icon-maskable.svg +11 -0
  38. package/logo/icon-square.svg +11 -0
  39. package/logo/icon.svg +11 -0
  40. package/logo/lockup-ink.svg +10 -0
  41. package/logo/lockup-text.svg +15 -0
  42. package/logo/lockup-white.svg +10 -0
  43. package/logo/lockup.svg +10 -0
  44. package/logo/mark-ink.svg +9 -0
  45. package/logo/mark-white.svg +9 -0
  46. package/logo/mark.svg +9 -0
  47. package/logo/monogram-ink.svg +10 -0
  48. package/logo/monogram-white.svg +10 -0
  49. package/logo/monogram.svg +10 -0
  50. package/logo/site.webmanifest +13 -0
  51. package/package.json +34 -0
  52. package/tokens.css +19 -0
  53. package/vars.css +228 -0
@@ -0,0 +1,9 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="135" height="135" viewBox="-27.89 -8.39 134.78 134.78" fill="#FFFFFF">
2
+ <!-- Tambourine mark. Generated by scripts/build-logo.py - do not hand-edit. -->
3
+ <path d="M 80,24 A 42,42 0 1,0 84,96 L 72,86 A 28,28 0 1,1 69,34 Z"/>
4
+ <circle cx="50" cy="4" r="7"/>
5
+ <circle cx="14" cy="22" r="7"/>
6
+ <circle cx="2" cy="58" r="7"/>
7
+ <circle cx="14" cy="94" r="7"/>
8
+ <circle cx="46" cy="114" r="7"/>
9
+ </svg>
package/logo/mark.svg ADDED
@@ -0,0 +1,9 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="135" height="135" viewBox="-27.89 -8.39 134.78 134.78" fill="#E75A7C">
2
+ <!-- Tambourine mark. Generated by scripts/build-logo.py - do not hand-edit. -->
3
+ <path d="M 80,24 A 42,42 0 1,0 84,96 L 72,86 A 28,28 0 1,1 69,34 Z"/>
4
+ <circle cx="50" cy="4" r="7"/>
5
+ <circle cx="14" cy="22" r="7"/>
6
+ <circle cx="2" cy="58" r="7"/>
7
+ <circle cx="14" cy="94" r="7"/>
8
+ <circle cx="46" cy="114" r="7"/>
9
+ </svg>
@@ -0,0 +1,10 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="147" height="147" viewBox="-10.87 -14.37 146.73 146.73" fill="#000000">
2
+ <!-- Mark with `no` nested in the crescent, transparent and square. The short form of the lockup: avatar, favicon, app tile. Generated by scripts/build-logo.py - do not hand-edit. -->
3
+ <path d="M 80,24 A 42,42 0 1,0 84,96 L 72,86 A 28,28 0 1,1 69,34 Z"/>
4
+ <circle cx="50" cy="4" r="7"/>
5
+ <circle cx="14" cy="22" r="7"/>
6
+ <circle cx="2" cy="58" r="7"/>
7
+ <circle cx="14" cy="94" r="7"/>
8
+ <circle cx="46" cy="114" r="7"/>
9
+ <path d="M70.01 78.52Q67.84 78.52 66.67 77.33Q65.51 76.14 65.51 73.91V52.62Q65.51 50.38 66.66 49.22Q67.82 48.05 69.94 48.05Q72.05 48.05 73.20 49.22Q74.35 50.38 74.35 52.62V56.06L73.69 54.09Q75.06 51.10 77.80 49.51Q80.53 47.93 84.00 47.93Q87.54 47.93 89.82 49.28Q92.10 50.62 93.24 53.37Q94.38 56.12 94.38 60.33V73.91Q94.38 76.14 93.21 77.33Q92.04 78.52 89.87 78.52Q87.69 78.52 86.50 77.33Q85.32 76.14 85.32 73.91V60.72Q85.32 57.66 84.20 56.30Q83.09 54.94 80.83 54.94Q77.98 54.94 76.27 56.74Q74.57 58.55 74.57 61.56V73.91Q74.57 78.52 70.01 78.52Z M114.36 78.64Q109.63 78.64 106.12 76.78Q102.61 74.92 100.66 71.45Q98.72 67.98 98.72 63.26Q98.72 59.70 99.81 56.89Q100.91 54.07 102.98 52.05Q105.04 50.03 107.92 48.98Q110.80 47.93 114.36 47.93Q119.10 47.93 122.60 49.79Q126.11 51.65 128.05 55.09Q129.99 58.53 129.99 63.26Q129.99 66.82 128.90 69.66Q127.80 72.50 125.74 74.52Q123.67 76.54 120.79 77.59Q117.91 78.64 114.36 78.64ZM114.36 71.87Q116.29 71.87 117.76 70.93Q119.22 69.99 120.05 68.08Q120.87 66.18 120.87 63.26Q120.87 58.86 119.07 56.78Q117.26 54.70 114.36 54.70Q112.44 54.70 110.96 55.62Q109.49 56.54 108.66 58.43Q107.84 60.33 107.84 63.26Q107.84 67.63 109.64 69.75Q111.45 71.87 114.36 71.87Z"/>
10
+ </svg>
@@ -0,0 +1,10 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="147" height="147" viewBox="-10.87 -14.37 146.73 146.73" fill="#FFFFFF">
2
+ <!-- Mark with `no` nested in the crescent, transparent and square. The short form of the lockup: avatar, favicon, app tile. Generated by scripts/build-logo.py - do not hand-edit. -->
3
+ <path d="M 80,24 A 42,42 0 1,0 84,96 L 72,86 A 28,28 0 1,1 69,34 Z"/>
4
+ <circle cx="50" cy="4" r="7"/>
5
+ <circle cx="14" cy="22" r="7"/>
6
+ <circle cx="2" cy="58" r="7"/>
7
+ <circle cx="14" cy="94" r="7"/>
8
+ <circle cx="46" cy="114" r="7"/>
9
+ <path d="M70.01 78.52Q67.84 78.52 66.67 77.33Q65.51 76.14 65.51 73.91V52.62Q65.51 50.38 66.66 49.22Q67.82 48.05 69.94 48.05Q72.05 48.05 73.20 49.22Q74.35 50.38 74.35 52.62V56.06L73.69 54.09Q75.06 51.10 77.80 49.51Q80.53 47.93 84.00 47.93Q87.54 47.93 89.82 49.28Q92.10 50.62 93.24 53.37Q94.38 56.12 94.38 60.33V73.91Q94.38 76.14 93.21 77.33Q92.04 78.52 89.87 78.52Q87.69 78.52 86.50 77.33Q85.32 76.14 85.32 73.91V60.72Q85.32 57.66 84.20 56.30Q83.09 54.94 80.83 54.94Q77.98 54.94 76.27 56.74Q74.57 58.55 74.57 61.56V73.91Q74.57 78.52 70.01 78.52Z M114.36 78.64Q109.63 78.64 106.12 76.78Q102.61 74.92 100.66 71.45Q98.72 67.98 98.72 63.26Q98.72 59.70 99.81 56.89Q100.91 54.07 102.98 52.05Q105.04 50.03 107.92 48.98Q110.80 47.93 114.36 47.93Q119.10 47.93 122.60 49.79Q126.11 51.65 128.05 55.09Q129.99 58.53 129.99 63.26Q129.99 66.82 128.90 69.66Q127.80 72.50 125.74 74.52Q123.67 76.54 120.79 77.59Q117.91 78.64 114.36 78.64ZM114.36 71.87Q116.29 71.87 117.76 70.93Q119.22 69.99 120.05 68.08Q120.87 66.18 120.87 63.26Q120.87 58.86 119.07 56.78Q117.26 54.70 114.36 54.70Q112.44 54.70 110.96 55.62Q109.49 56.54 108.66 58.43Q107.84 60.33 107.84 63.26Q107.84 67.63 109.64 69.75Q111.45 71.87 114.36 71.87Z"/>
10
+ </svg>
@@ -0,0 +1,10 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="147" height="147" viewBox="-10.87 -14.37 146.73 146.73" fill="#E75A7C">
2
+ <!-- Mark with `no` nested in the crescent, transparent and square. The short form of the lockup: avatar, favicon, app tile. Generated by scripts/build-logo.py - do not hand-edit. -->
3
+ <path d="M 80,24 A 42,42 0 1,0 84,96 L 72,86 A 28,28 0 1,1 69,34 Z"/>
4
+ <circle cx="50" cy="4" r="7"/>
5
+ <circle cx="14" cy="22" r="7"/>
6
+ <circle cx="2" cy="58" r="7"/>
7
+ <circle cx="14" cy="94" r="7"/>
8
+ <circle cx="46" cy="114" r="7"/>
9
+ <path d="M70.01 78.52Q67.84 78.52 66.67 77.33Q65.51 76.14 65.51 73.91V52.62Q65.51 50.38 66.66 49.22Q67.82 48.05 69.94 48.05Q72.05 48.05 73.20 49.22Q74.35 50.38 74.35 52.62V56.06L73.69 54.09Q75.06 51.10 77.80 49.51Q80.53 47.93 84.00 47.93Q87.54 47.93 89.82 49.28Q92.10 50.62 93.24 53.37Q94.38 56.12 94.38 60.33V73.91Q94.38 76.14 93.21 77.33Q92.04 78.52 89.87 78.52Q87.69 78.52 86.50 77.33Q85.32 76.14 85.32 73.91V60.72Q85.32 57.66 84.20 56.30Q83.09 54.94 80.83 54.94Q77.98 54.94 76.27 56.74Q74.57 58.55 74.57 61.56V73.91Q74.57 78.52 70.01 78.52Z M114.36 78.64Q109.63 78.64 106.12 76.78Q102.61 74.92 100.66 71.45Q98.72 67.98 98.72 63.26Q98.72 59.70 99.81 56.89Q100.91 54.07 102.98 52.05Q105.04 50.03 107.92 48.98Q110.80 47.93 114.36 47.93Q119.10 47.93 122.60 49.79Q126.11 51.65 128.05 55.09Q129.99 58.53 129.99 63.26Q129.99 66.82 128.90 69.66Q127.80 72.50 125.74 74.52Q123.67 76.54 120.79 77.59Q117.91 78.64 114.36 78.64ZM114.36 71.87Q116.29 71.87 117.76 70.93Q119.22 69.99 120.05 68.08Q120.87 66.18 120.87 63.26Q120.87 58.86 119.07 56.78Q117.26 54.70 114.36 54.70Q112.44 54.70 110.96 55.62Q109.49 56.54 108.66 58.43Q107.84 60.33 107.84 63.26Q107.84 67.63 109.64 69.75Q111.45 71.87 114.36 71.87Z"/>
10
+ </svg>
@@ -0,0 +1,13 @@
1
+ {
2
+ "name": "NoTambourine",
3
+ "short_name": "NoTambourine",
4
+ "theme_color": "#0B0B0C",
5
+ "background_color": "#0B0B0C",
6
+ "display": "standalone",
7
+ "icons": [
8
+ {"src": "export/icon-192.png", "sizes": "192x192", "type": "image/png", "purpose": "any"},
9
+ {"src": "export/icon-512.png", "sizes": "512x512", "type": "image/png", "purpose": "any"},
10
+ {"src": "export/icon-maskable-512.png", "sizes": "512x512", "type": "image/png", "purpose": "maskable"},
11
+ {"src": "favicon.svg", "sizes": "any", "type": "image/svg+xml", "purpose": "any"}
12
+ ]
13
+ }
package/package.json ADDED
@@ -0,0 +1,34 @@
1
+ {
2
+ "name": "@notambourine/brand-kit",
3
+ "version": "1.0.0",
4
+ "description": "The NoTambourine brand's golden set: tokens, element styles, deck theme, faces, and logo",
5
+ "license": "MIT",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "git+https://github.com/notambourine/brand-kit.git"
9
+ },
10
+ "homepage": "https://github.com/notambourine/brand-kit#readme",
11
+ "bugs": "https://github.com/notambourine/brand-kit/issues",
12
+ "keywords": [
13
+ "brand",
14
+ "design-tokens",
15
+ "css",
16
+ "marpit",
17
+ "notambourine"
18
+ ],
19
+ "author": "NoTambourine LLC",
20
+ "type": "module",
21
+ "//": "No exports map: consumers import stylesheets and logo files by path, and their vendor scripts walk fonts/ and logo/ whole. A map would restate the tree and go stale the first time a file is added.",
22
+ "files": [
23
+ "*.css",
24
+ "fonts",
25
+ "logo",
26
+ "SKILL.md"
27
+ ],
28
+ "publishConfig": {
29
+ "access": "public"
30
+ },
31
+ "sideEffects": [
32
+ "*.css"
33
+ ]
34
+ }
package/tokens.css ADDED
@@ -0,0 +1,19 @@
1
+ /* =========================================================
2
+ NoTambourine: the whole system in one link
3
+ ---------------------------------------------------------
4
+ The golden set, composed. Link this file and a bare HTML
5
+ page comes out on brand: the faces load, every value is a
6
+ custom property, and h1/p/a/code are styled with no classes.
7
+
8
+ The name says it all: no extra noise. Sober sans headlines over
9
+ a monospace body, a rounded wordmark, generous whitespace, one
10
+ decisive pink, and a mint that hums quietly in the back.
11
+
12
+ A surface that ships its own faces and its own base layer -
13
+ a Tailwind site, say - imports vars.css alone and takes the
14
+ values without the opinions.
15
+ ========================================================= */
16
+
17
+ @import './fonts.css';
18
+ @import './vars.css';
19
+ @import './elements.css';
package/vars.css ADDED
@@ -0,0 +1,228 @@
1
+ /* =========================================================
2
+ NoTambourine: every brand value as a custom property
3
+ ---------------------------------------------------------
4
+ Part of the golden set. Correct a value here and never sync
5
+ one in. Anything that disagrees with this file is downstream
6
+ and stale.
7
+
8
+ Import this file alone to take the values without the faces
9
+ or the element styles - what a surface with its own base
10
+ layer wants. tokens.css is the whole system.
11
+ ========================================================= */
12
+
13
+ :root {
14
+ /* ---------- Brand palette ---------- */
15
+ --nt-pink: #E75A7C; /* Accent Primary: CTAs, highlights, logo */
16
+ --nt-pink-press: #C9446A;
17
+ --nt-pink-soft: #FBE3EA;
18
+ --nt-pink-tint: #FEF3F6;
19
+ --nt-pink-deep: #A83758; /* text-grade pink: 5:1 on paper and the pink tints */
20
+
21
+ --nt-mint: #58C9B9; /* Complementary: borders, subtle icons */
22
+ --nt-mint-press: #3FA897;
23
+ --nt-mint-soft: #DCF3EF;
24
+ --nt-mint-tint: #ECF9F6;
25
+ --nt-mint-deep: #1B6F62; /* text-grade mint: 5:1 on paper and the mint tints */
26
+
27
+ --nt-ink: #000000; /* Neutral Primary: headlines, rules */
28
+ --nt-ink-85: #1A1A1A;
29
+ --nt-ink-70: #404040;
30
+
31
+ /* The light neutrals lean one step toward the pink, so light surfaces come
32
+ from the same hand as the dark ramp, which leans cool. */
33
+ --nt-mid: #776C72; /* Neutral Mid-tone: secondary text */
34
+ --nt-mid-soft: #B3AAAF;
35
+ --nt-line: #E9E3E6; /* derived: subtle hairlines */
36
+ --nt-line-soft: #F3EEF1;
37
+
38
+ --nt-paper: #FAF8F9; /* Background Light: main bg */
39
+ --nt-paper-warm: #FDFCFA;
40
+ --nt-white: #FFFFFF;
41
+
42
+ /* ---------- Dark surface scale ---------- */
43
+ /* The system is dark-first. These are the surfaces UI sits on. */
44
+ --nt-bg: #0B0B0C; /* page canvas: just-off-black */
45
+ --nt-surface-1: #141416; /* default card */
46
+ --nt-surface-2: #1C1C1F; /* raised card, popovers */
47
+ --nt-surface-3: #26262A; /* hover, input fill */
48
+ --nt-border: #2A2A2E; /* hairline on dark */
49
+ --nt-border-soft:#1F1F22;
50
+
51
+ /* ---------- Foreground on dark ---------- */
52
+ --nt-fg1-dark: #F5F5F7; /* headlines */
53
+ --nt-fg2-dark: #C9C9CE; /* body */
54
+ --nt-fg3-dark: #8A8A92; /* secondary, captions */
55
+ --nt-fg-mute: #5A5A62; /* disabled */
56
+
57
+ /* ---------- Semantic roles (DARK by default) ---------- */
58
+ /* The stable API. Write against these, not the --nt-* palette above: an alias
59
+ survives a theme swap and a raw primitive does not. */
60
+ --bg: var(--nt-bg);
61
+ --bg-card: var(--nt-surface-1);
62
+ --bg-raised: var(--nt-surface-2);
63
+ --bg-input: var(--nt-surface-3);
64
+ --bg-inverse: var(--nt-paper);
65
+
66
+ --fg1: var(--nt-fg1-dark); /* headlines */
67
+ --fg2: var(--nt-fg2-dark); /* body */
68
+ --fg3: var(--nt-fg3-dark); /* secondary */
69
+ --fg-mute: var(--nt-fg-mute); /* placeholder, disabled */
70
+ /* KEY-DECISION 2026-08-18: ink on pink, mirroring --fg-on-mint. White sat at
71
+ 3.4:1 under 14px button text; ink clears 6:1 on both themes. */
72
+ --fg-on-pink: var(--nt-ink);
73
+ --fg-on-mint: var(--nt-ink);
74
+ --fg-on-dark: var(--nt-fg1-dark);
75
+ --fg-on-light: var(--nt-ink);
76
+
77
+ --accent: var(--nt-pink);
78
+ --accent-press: var(--nt-pink-press);
79
+ --accent-soft: rgba(231,90,124,0.16); /* on dark: tinted pink, not pastel */
80
+ --accent-text: var(--nt-pink); /* accent as prose: links, eyebrow, headline em */
81
+
82
+ --support: var(--nt-mint);
83
+ --support-soft: rgba(88,201,185,0.16);
84
+
85
+ --line: var(--nt-border);
86
+ --line-soft: var(--nt-border-soft);
87
+ --line-strong: var(--nt-fg1-dark);
88
+
89
+ /* ---------- Typography ---------- */
90
+ /* Hanken Grotesk headings over a JetBrains Mono body, with Nunito
91
+ reserved for the wordmark. Accent text shares the mono, so
92
+ there is no separate accent family. */
93
+ /* The --nt-* primitive carries the stack and the alias names the job, the
94
+ same split the palette uses. Tailwind claims `--font-*` for its own utility
95
+ namespace, so a Tailwind surface reads the primitive and leaves the alias. */
96
+ --nt-font-nunito: 'Nunito', system-ui, sans-serif;
97
+ --nt-font-hanken: 'Hanken Grotesk', system-ui, sans-serif;
98
+ --nt-font-jetbrains: 'JetBrains Mono', ui-monospace, 'SF Mono', Monaco, monospace;
99
+
100
+ --font-wordmark: var(--nt-font-nunito); /* the lockup, nothing else */
101
+ --font-display: var(--nt-font-hanken); /* headings */
102
+ --font-accent: var(--nt-font-jetbrains); /* eyebrows, labels, buttons */
103
+ --font-body: var(--nt-font-jetbrains); /* body */
104
+ --font-mono: var(--nt-font-jetbrains); /* code: same face */
105
+
106
+ /* Sizes: a 1.25 modular scale rounded to friendly numbers.
107
+ rem, not px, so a reader who raises the browser's default font size
108
+ scales the whole page. The comment gives the px at a 16px root. */
109
+ /* Fluid: 40px floor so "tambourine." holds a 375px viewport, 64px from 960px up. */
110
+ --fs-display: clamp(2.5rem, 1.75rem + 3.75vw, 4rem);
111
+ --fs-h1: 2.75rem; /* 44px */
112
+ --fs-h2: 2rem; /* 32px */
113
+ --fs-h3: 1.5rem; /* 24px */
114
+ --fs-h4: 1.125rem; /* 18px */
115
+ --fs-lede: 1.25rem; /* 20px, the intro paragraph */
116
+ --fs-body: 1rem; /* 16px */
117
+ --fs-small: 0.875rem; /* 14px */
118
+ --fs-caption: 0.75rem; /* 12px */
119
+ --fs-mono: 0.8125rem; /* 13px */
120
+ /* Optical sizes below the ramp, for accent-face UI text. */
121
+ --fs-label: 0.8125rem; /* 13px: chip, field label, nav link */
122
+ --fs-badge: 0.6875rem; /* 11px: badge only */
123
+
124
+ /* Line heights: generous for warmth. Body is 1.7, not the 1.55 a
125
+ sans would want: monospace needs the extra leading to stay readable. */
126
+ --lh-display: 1.05;
127
+ --lh-h: 1.15;
128
+ --lh-lede: 1.5;
129
+ --lh-body: 1.7;
130
+ --lh-tight: 1.3;
131
+
132
+ /* Letter spacing: a hair of positive tracking on monospace body.
133
+ Tracking tightens as size grows; these two are what notambourine.com
134
+ ships, and the site is the rendering the rest of the brand matches. */
135
+ --ls-display: -0.03em;
136
+ --ls-tight: -0.02em;
137
+ --ls-body: 0.01em;
138
+ --ls-allcaps: 0.08em;
139
+
140
+ /* Weight: every face is variable across its full axis, so nothing
141
+ here is ever a synthesized bold. 800 is the wordmark and the hero. */
142
+ --fw-regular: 400;
143
+ --fw-medium: 500;
144
+ --fw-semibold: 600;
145
+ --fw-bold: 700;
146
+ --fw-black: 800;
147
+
148
+ /* ---------- Spacing (4pt grid) ----------
149
+ rem for the same reason as the type scale, and the numbers match
150
+ Tailwind's, so `p-6` and `var(--sp-6)` are the same 24px. */
151
+ --sp-1: 0.25rem; /* 4px */
152
+ --sp-2: 0.5rem; /* 8px */
153
+ --sp-3: 0.75rem; /* 12px */
154
+ --sp-4: 1rem; /* 16px */
155
+ --sp-5: 1.25rem; /* 20px */
156
+ --sp-6: 1.5rem; /* 24px */
157
+ --sp-8: 2rem; /* 32px */
158
+ --sp-10: 2.5rem; /* 40px */
159
+ --sp-12: 3rem; /* 48px */
160
+ --sp-16: 4rem; /* 64px */
161
+ --sp-20: 5rem; /* 80px */
162
+ --sp-24: 6rem; /* 96px */
163
+
164
+ /* ---------- Radii: generous, soft, never a sharp corner ---------- */
165
+ --r-xs: 6px;
166
+ --r-sm: 10px;
167
+ --r-md: 14px;
168
+ --r-lg: 20px;
169
+ --r-xl: 28px;
170
+ --r-pill: 999px;
171
+
172
+ /* ---------- Shadows: quiet on dark, depth from contrast ---------- */
173
+ --shadow-1: 0 1px 2px rgba(0,0,0,0.30), 0 1px 1px rgba(0,0,0,0.20);
174
+ --shadow-2: 0 6px 18px rgba(0,0,0,0.35), 0 2px 6px rgba(0,0,0,0.25);
175
+ --shadow-3: 0 20px 50px rgba(0,0,0,0.50), 0 6px 14px rgba(0,0,0,0.30);
176
+ --shadow-pink: 0 8px 26px rgba(231,90,124,0.35); /* lifted state: hero button at rest, any primary on hover */
177
+ --shadow-mint: 0 8px 26px rgba(88,201,185,0.30);
178
+ --shadow-accent: 0 8px 22px rgba(231,90,124,0.28); /* ordinary primary button */
179
+
180
+ /* ---------- Accent text and rings ---------- */
181
+ /* Raw --nt-pink on a dark tint fails contrast, so accent TEXT is its own
182
+ value. Both flip in .theme-light, where the deep tones read instead. */
183
+ --accent-fg: #F5A6BB; /* pink text: badge, inline code, error */
184
+ --support-fg: #8FDCD0; /* mint text: badge */
185
+ --ring-accent: 0 0 0 4px rgba(231,90,124,0.22);
186
+ --bg-veil: rgba(11,11,12,0.70); /* frosted nav over dark */
187
+
188
+ /* ---------- Motion ---------- */
189
+ /* Primitive plus alias again, because Tailwind owns `--ease-*` too. */
190
+ --nt-ease-out: cubic-bezier(.2,.7,.2,1);
191
+ --nt-ease-bounce: cubic-bezier(.34,1.5,.64,1);
192
+ --ease-out: var(--nt-ease-out); /* default */
193
+ --ease-bounce: var(--nt-ease-bounce); /* playful, but subtle */
194
+ --dur-1: 120ms;
195
+ --dur-2: 200ms;
196
+ --dur-3: 320ms;
197
+ }
198
+
199
+ /* ---------- Light theme, opt-in ----------
200
+ Values only, so the vars.css-alone import path carries both themes.
201
+ elements.css applies the ground; a surface with its own base layer
202
+ sets `background: var(--bg)` itself. Add class="theme-light" to a
203
+ root element or any subtree (rare: print, a press page, an email). */
204
+ .theme-light {
205
+ --bg: var(--nt-paper);
206
+ --bg-card: var(--nt-white);
207
+ --bg-raised: var(--nt-white);
208
+ --bg-input: var(--nt-white);
209
+ --bg-inverse: var(--nt-bg);
210
+ --fg1: var(--nt-ink);
211
+ --fg2: var(--nt-ink-70);
212
+ --fg3: var(--nt-mid);
213
+ --fg-mute: var(--nt-mid);
214
+ --line: var(--nt-line);
215
+ --line-soft: var(--nt-line-soft);
216
+ --line-strong: var(--nt-ink);
217
+ --accent-text: var(--nt-pink-deep);
218
+ --accent-fg: var(--nt-pink-deep);
219
+ --support-fg: var(--nt-mint-deep);
220
+ --accent-soft: var(--nt-pink-soft);
221
+ --support-soft: var(--nt-mint-soft);
222
+ --bg-veil: rgba(250,248,249,0.70);
223
+ /* Shadow alphas tuned for paper; the dark set reads as smudges here.
224
+ The rose-black tint keeps the hue bias of the neutrals. */
225
+ --shadow-1: 0 1px 2px rgba(26,21,23,0.08), 0 1px 1px rgba(26,21,23,0.05);
226
+ --shadow-2: 0 6px 18px rgba(26,21,23,0.10), 0 2px 6px rgba(26,21,23,0.07);
227
+ --shadow-3: 0 20px 50px rgba(26,21,23,0.16), 0 6px 14px rgba(26,21,23,0.08);
228
+ }