@vibes.diy/prompts 2.2.9 → 2.2.11

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 (117) hide show
  1. package/index.d.ts +1 -0
  2. package/index.js +1 -0
  3. package/index.js.map +1 -1
  4. package/json-docs.d.ts +1 -1
  5. package/llms/fireproof.md +148 -0
  6. package/llms/image-gen.d.ts +2 -0
  7. package/llms/image-gen.js +9 -0
  8. package/llms/image-gen.js.map +1 -0
  9. package/llms/image-gen.md +102 -0
  10. package/llms/index.d.ts +1 -1
  11. package/llms/index.js +3 -3
  12. package/llms/types.d.ts +2 -2
  13. package/llms/web-audio.js +0 -2
  14. package/llms/web-audio.js.map +1 -1
  15. package/llms/web-audio.md +3 -0
  16. package/package.json +3 -3
  17. package/prompts.d.ts +6 -0
  18. package/prompts.js +37 -4
  19. package/prompts.js.map +1 -1
  20. package/settings.d.ts +1 -0
  21. package/system-prompt-initial.md +2 -2
  22. package/system-prompt.md +3 -3
  23. package/themes/aether.md +41 -0
  24. package/themes/archive.md +43 -0
  25. package/themes/atelier.md +42 -0
  26. package/themes/atlas.md +42 -0
  27. package/themes/broadsheet.md +20 -0
  28. package/themes/brutalist.md +208 -0
  29. package/themes/capsule.md +47 -0
  30. package/themes/carbon.md +42 -0
  31. package/themes/chrome.md +132 -0
  32. package/themes/chrono.md +33 -0
  33. package/themes/codex.md +45 -0
  34. package/themes/computer-angel-heaven.md +57 -0
  35. package/themes/console.md +46 -0
  36. package/themes/default.md +96 -0
  37. package/themes/desktop.md +49 -0
  38. package/themes/dial.md +46 -0
  39. package/themes/dossier.md +35 -0
  40. package/themes/edge.md +39 -0
  41. package/themes/exemplars/aether/App.jsx +224 -0
  42. package/themes/exemplars/archive/App.jsx +222 -0
  43. package/themes/exemplars/atelier/App.jsx +224 -0
  44. package/themes/exemplars/atlas/App.jsx +216 -0
  45. package/themes/exemplars/broadsheet/App.jsx +216 -0
  46. package/themes/exemplars/brutalist/App.jsx +290 -0
  47. package/themes/exemplars/capsule/App.jsx +216 -0
  48. package/themes/exemplars/carbon/App.jsx +216 -0
  49. package/themes/exemplars/chrome/App.jsx +253 -0
  50. package/themes/exemplars/chrono/App.jsx +222 -0
  51. package/themes/exemplars/codex/App.jsx +224 -0
  52. package/themes/exemplars/computer-angel-heaven/App.jsx +224 -0
  53. package/themes/exemplars/console/App.jsx +216 -0
  54. package/themes/exemplars/default/App.jsx +219 -0
  55. package/themes/exemplars/desktop/App.jsx +224 -0
  56. package/themes/exemplars/dial/App.jsx +216 -0
  57. package/themes/exemplars/dossier/App.jsx +224 -0
  58. package/themes/exemplars/edge/App.jsx +216 -0
  59. package/themes/exemplars/guild/App.jsx +224 -0
  60. package/themes/exemplars/hearth/App.jsx +224 -0
  61. package/themes/exemplars/industrial/App.jsx +224 -0
  62. package/themes/exemplars/matrix/App.jsx +224 -0
  63. package/themes/exemplars/mesh/App.jsx +222 -0
  64. package/themes/exemplars/neomario/App.jsx +222 -0
  65. package/themes/exemplars/neon/App.jsx +224 -0
  66. package/themes/exemplars/nexus/App.jsx +216 -0
  67. package/themes/exemplars/opus/App.jsx +224 -0
  68. package/themes/exemplars/orbit/App.jsx +224 -0
  69. package/themes/exemplars/palate/App.jsx +224 -0
  70. package/themes/exemplars/pitch/App.jsx +222 -0
  71. package/themes/exemplars/poster/App.jsx +222 -0
  72. package/themes/exemplars/proof/App.jsx +224 -0
  73. package/themes/exemplars/recon/App.jsx +216 -0
  74. package/themes/exemplars/rift/App.jsx +224 -0
  75. package/themes/exemplars/rune/App.jsx +224 -0
  76. package/themes/exemplars/scrapbook/App.jsx +222 -0
  77. package/themes/exemplars/sensor/App.jsx +224 -0
  78. package/themes/exemplars/signal/App.jsx +222 -0
  79. package/themes/exemplars/slab/App.jsx +224 -0
  80. package/themes/exemplars/specimen/App.jsx +222 -0
  81. package/themes/exemplars/terminal/App.jsx +224 -0
  82. package/themes/exemplars/vault/App.jsx +222 -0
  83. package/themes/exemplars/winter-sports/App.jsx +224 -0
  84. package/themes/exemplars/zine/App.jsx +214 -0
  85. package/themes/guild.md +44 -0
  86. package/themes/hearth.md +45 -0
  87. package/themes/index.d.ts +11 -0
  88. package/themes/index.js +272 -0
  89. package/themes/index.js.map +1 -0
  90. package/themes/industrial.md +37 -0
  91. package/themes/matrix.md +41 -0
  92. package/themes/mesh.md +42 -0
  93. package/themes/neomario.md +47 -0
  94. package/themes/neon.md +48 -0
  95. package/themes/nexus.md +40 -0
  96. package/themes/opus.md +61 -0
  97. package/themes/orbit.md +46 -0
  98. package/themes/palate.md +35 -0
  99. package/themes/pitch.md +39 -0
  100. package/themes/poster.md +39 -0
  101. package/themes/proof.md +41 -0
  102. package/themes/recon.md +39 -0
  103. package/themes/rift.md +45 -0
  104. package/themes/rune.md +44 -0
  105. package/themes/scrapbook.md +43 -0
  106. package/themes/sensor.md +42 -0
  107. package/themes/signal.md +37 -0
  108. package/themes/slab.md +35 -0
  109. package/themes/specimen.md +21 -0
  110. package/themes/terminal.md +39 -0
  111. package/themes/vault.md +41 -0
  112. package/themes/winter-sports.md +39 -0
  113. package/themes/zine.md +40 -0
  114. package/llms/img-vibes.d.ts +0 -2
  115. package/llms/img-vibes.js +0 -9
  116. package/llms/img-vibes.js.map +0 -1
  117. package/llms/img-vibes.md +0 -167
@@ -0,0 +1,222 @@
1
+ import React, { useEffect, useState } from "react";
2
+
3
+ // Theme: Chrono — auto-generated exemplar with prefers-color-scheme.
4
+ // Canonical palette: bg #dde1e7, accent #6c8ee6.
5
+ // Inverse computed by flipping oklch/hex lightness; tune by hand if needed.
6
+
7
+ const THEME_CSS = `
8
+ :root {
9
+ --bg: #dde1e7;
10
+ --accent: #6c8ee6;
11
+ --text: rgba(20, 20, 20, 0.92);
12
+ --muted: rgba(20, 20, 20, 0.5);
13
+ --border: rgba(20, 20, 20, 0.14);
14
+ --raised: rgba(255, 255, 255, 0.55);
15
+ --card-bg: rgba(255, 255, 255, 0.85);
16
+ --accent-text: #fafafa;
17
+ }
18
+ @media (prefers-color-scheme: dark) {
19
+ :root {
20
+ --bg: #181c22;
21
+ --accent: #193b93;
22
+ --text: rgba(255, 255, 255, 0.92);
23
+ --muted: rgba(255, 255, 255, 0.55);
24
+ --border: rgba(255, 255, 255, 0.18);
25
+ --raised: rgba(255, 255, 255, 0.06);
26
+ --card-bg: rgba(255, 255, 255, 0.04);
27
+ --accent-text: #0a0a0a;
28
+ }
29
+ }
30
+ body { margin: 0; }
31
+ `;
32
+
33
+ export default function App() {
34
+ useEffect(() => {
35
+ const link = document.createElement("link");
36
+ link.rel = "stylesheet";
37
+ link.href = "https://fonts.googleapis.com/css2?family=Inter:wght@400;500;700&display=optional";
38
+ document.head.appendChild(link);
39
+ return () => link.remove();
40
+ }, []);
41
+
42
+ const [draft, setDraft] = useState("");
43
+
44
+ const c = {
45
+ page: {
46
+ minHeight: "100vh",
47
+ background: "var(--bg)",
48
+ color: "var(--text)",
49
+ fontFamily: "'Inter', sans-serif",
50
+ padding: "3rem 2rem 4rem",
51
+ },
52
+ container: { maxWidth: "56rem", margin: "0 auto" },
53
+ header: { display: "flex", flexDirection: "column", gap: "0.85rem", marginBottom: "2rem" },
54
+ eyebrow: {
55
+ fontFamily: "ui-monospace, SFMono-Regular, Menlo, monospace",
56
+ fontSize: "0.72rem",
57
+ letterSpacing: "0.25em",
58
+ textTransform: "uppercase",
59
+ color: "var(--muted)",
60
+ },
61
+ title: {
62
+ fontSize: "clamp(3rem, 13vw, 10rem)",
63
+ fontWeight: 800,
64
+ letterSpacing: "-0.04em",
65
+ lineHeight: 0.9,
66
+ color: "var(--accent)",
67
+ margin: 0,
68
+ },
69
+ subtitle: {
70
+ fontSize: "1.05rem",
71
+ color: "var(--muted)",
72
+ maxWidth: "32rem",
73
+ lineHeight: 1.5,
74
+ margin: 0,
75
+ },
76
+ modeNote: {
77
+ marginTop: "0.5rem",
78
+ fontFamily: "ui-monospace, SFMono-Regular, Menlo, monospace",
79
+ fontSize: "0.7rem",
80
+ letterSpacing: "0.2em",
81
+ textTransform: "uppercase",
82
+ color: "var(--muted)",
83
+ },
84
+ grid: {
85
+ display: "grid",
86
+ gridTemplateColumns: "repeat(auto-fit, minmax(18rem, 1fr))",
87
+ gap: "1.25rem",
88
+ marginTop: "2.5rem",
89
+ },
90
+ card: {
91
+ background: "var(--card-bg)",
92
+ border: "1px solid var(--border)",
93
+ borderRadius: 14,
94
+ padding: "1.5rem",
95
+ },
96
+ cardTitle: {
97
+ fontFamily: "ui-monospace, SFMono-Regular, Menlo, monospace",
98
+ fontSize: "0.7rem",
99
+ letterSpacing: "0.18em",
100
+ textTransform: "uppercase",
101
+ color: "var(--muted)",
102
+ margin: "0 0 1rem",
103
+ },
104
+ list: { listStyle: "none", margin: 0, padding: 0, display: "flex", flexDirection: "column", gap: "0.55rem" },
105
+ listItem: {
106
+ display: "flex",
107
+ alignItems: "center",
108
+ justifyContent: "space-between",
109
+ gap: "0.75rem",
110
+ padding: "0.7rem 0.85rem",
111
+ borderRadius: 10,
112
+ background: "var(--raised)",
113
+ border: "1px solid var(--border)",
114
+ fontSize: "0.95rem",
115
+ },
116
+ badge: {
117
+ fontFamily: "ui-monospace, SFMono-Regular, Menlo, monospace",
118
+ fontSize: "0.7rem",
119
+ padding: "0.18rem 0.6rem",
120
+ borderRadius: 999,
121
+ background: "var(--accent)",
122
+ color: "var(--accent-text)",
123
+ fontWeight: 600,
124
+ letterSpacing: "0.08em",
125
+ textTransform: "uppercase",
126
+ },
127
+ formRow: { display: "flex", gap: "0.5rem", marginTop: "0.5rem" },
128
+ input: {
129
+ flex: 1,
130
+ background: "var(--raised)",
131
+ color: "var(--text)",
132
+ border: "1px solid var(--border)",
133
+ borderRadius: 10,
134
+ padding: "0.7rem 0.9rem",
135
+ fontFamily: "inherit",
136
+ fontSize: "0.95rem",
137
+ outline: "none",
138
+ },
139
+ button: {
140
+ background: "var(--accent)",
141
+ color: "var(--accent-text)",
142
+ border: "none",
143
+ borderRadius: 10,
144
+ padding: "0.7rem 1.1rem",
145
+ fontFamily: "inherit",
146
+ fontSize: "0.95rem",
147
+ fontWeight: 600,
148
+ cursor: "pointer",
149
+ },
150
+ ghost: {
151
+ background: "transparent",
152
+ color: "var(--text)",
153
+ border: "1px solid var(--border)",
154
+ borderRadius: 10,
155
+ padding: "0.7rem 1.1rem",
156
+ fontFamily: "inherit",
157
+ fontSize: "0.95rem",
158
+ cursor: "pointer",
159
+ },
160
+ buttonRow: { display: "flex", gap: "0.6rem", marginTop: "1.25rem", flexWrap: "wrap" },
161
+ };
162
+
163
+ const items = [
164
+ { id: 1, title: "Daily standup notes", tag: "active" },
165
+ { id: 2, title: "Q3 launch checklist", tag: "draft" },
166
+ { id: 3, title: "Reading list", tag: "synced" },
167
+ ];
168
+
169
+ return (
170
+ <>
171
+ <style>{THEME_CSS}</style>
172
+ <main id="app" style={c.page}>
173
+ <div style={c.container}>
174
+ <header style={c.header}>
175
+ <span style={c.eyebrow}>vibes.diy theme</span>
176
+ <h1 style={c.title}>Chrono</h1>
177
+ <p style={c.subtitle}>An exemplar app on the Chrono theme — list, form, buttons rendered with the catalog tokens.</p>
178
+ <div style={c.modeNote}>auto · light + dark via prefers-color-scheme</div>
179
+ </header>
180
+
181
+ <div style={c.grid}>
182
+ <section style={c.card}>
183
+ <h2 style={c.cardTitle}>Recent</h2>
184
+ <ul style={c.list}>
185
+ {items.map((it) => (
186
+ <li key={it.id} style={c.listItem}>
187
+ <span>{it.title}</span>
188
+ <span style={c.badge}>{it.tag}</span>
189
+ </li>
190
+ ))}
191
+ </ul>
192
+ </section>
193
+
194
+ <section style={c.card}>
195
+ <h2 style={c.cardTitle}>New entry</h2>
196
+ <p style={{ ...c.subtitle, fontSize: "0.9rem", marginTop: "0.25rem" }}>Capture a quick thought.</p>
197
+ <div style={c.formRow}>
198
+ <input
199
+ style={c.input}
200
+ placeholder="What's on your mind?"
201
+ value={draft}
202
+ onChange={(e) => setDraft(e.target.value)}
203
+ />
204
+ <button style={c.button} type="button">
205
+ Save
206
+ </button>
207
+ </div>
208
+ <div style={c.buttonRow}>
209
+ <button style={c.button} type="button">
210
+ Primary
211
+ </button>
212
+ <button style={c.ghost} type="button">
213
+ Secondary
214
+ </button>
215
+ </div>
216
+ </section>
217
+ </div>
218
+ </div>
219
+ </main>
220
+ </>
221
+ );
222
+ }
@@ -0,0 +1,224 @@
1
+ import React, { useEffect, useState } from "react";
2
+
3
+ // Theme: Elder Codex — auto-generated exemplar with prefers-color-scheme.
4
+ // Canonical palette: bg oklch(0.06 0.000 0), accent oklch(0.17 0.000 0).
5
+ // Inverse computed by flipping oklch/hex lightness; tune by hand if needed.
6
+
7
+ const THEME_CSS = `
8
+ :root {
9
+ --bg: oklch(0.06 0.000 0);
10
+ --accent: oklch(0.17 0.000 0);
11
+ --text: rgba(255, 255, 255, 0.92);
12
+ --muted: rgba(255, 255, 255, 0.55);
13
+ --border: rgba(255, 255, 255, 0.18);
14
+ --raised: rgba(255, 255, 255, 0.06);
15
+ --card-bg: rgba(255, 255, 255, 0.04);
16
+ --accent-text: #0a0a0a;
17
+ }
18
+ @media (prefers-color-scheme: light) {
19
+ :root {
20
+ --bg: oklch(0.94 0.000 0);
21
+ --accent: oklch(0.83 0.000 0);
22
+ --text: rgba(20, 20, 20, 0.92);
23
+ --muted: rgba(20, 20, 20, 0.5);
24
+ --border: rgba(20, 20, 20, 0.14);
25
+ --raised: rgba(255, 255, 255, 0.55);
26
+ --card-bg: rgba(255, 255, 255, 0.85);
27
+ --accent-text: #fafafa;
28
+ }
29
+ }
30
+ body { margin: 0; }
31
+ `;
32
+
33
+ export default function App() {
34
+ useEffect(() => {
35
+ const link = document.createElement("link");
36
+ link.rel = "stylesheet";
37
+ link.href = "https://fonts.googleapis.com/css2?family=Cinzel:wght@400;500;700&display=optional";
38
+ document.head.appendChild(link);
39
+ return () => link.remove();
40
+ }, []);
41
+
42
+ const [draft, setDraft] = useState("");
43
+
44
+ const c = {
45
+ page: {
46
+ minHeight: "100vh",
47
+ background: "var(--bg)",
48
+ color: "var(--text)",
49
+ fontFamily: "'Cinzel', serif",
50
+ padding: "3rem 2rem 4rem",
51
+ },
52
+ container: { maxWidth: "56rem", margin: "0 auto" },
53
+ header: { display: "flex", flexDirection: "column", gap: "0.85rem", marginBottom: "2rem" },
54
+ eyebrow: {
55
+ fontFamily: "ui-monospace, SFMono-Regular, Menlo, monospace",
56
+ fontSize: "0.72rem",
57
+ letterSpacing: "0.25em",
58
+ textTransform: "uppercase",
59
+ color: "var(--muted)",
60
+ },
61
+ title: {
62
+ fontSize: "clamp(3rem, 13vw, 10rem)",
63
+ fontWeight: 800,
64
+ letterSpacing: "-0.04em",
65
+ lineHeight: 0.9,
66
+ color: "var(--accent)",
67
+ margin: 0,
68
+ },
69
+ subtitle: {
70
+ fontSize: "1.05rem",
71
+ color: "var(--muted)",
72
+ maxWidth: "32rem",
73
+ lineHeight: 1.5,
74
+ margin: 0,
75
+ },
76
+ modeNote: {
77
+ marginTop: "0.5rem",
78
+ fontFamily: "ui-monospace, SFMono-Regular, Menlo, monospace",
79
+ fontSize: "0.7rem",
80
+ letterSpacing: "0.2em",
81
+ textTransform: "uppercase",
82
+ color: "var(--muted)",
83
+ },
84
+ grid: {
85
+ display: "grid",
86
+ gridTemplateColumns: "repeat(auto-fit, minmax(18rem, 1fr))",
87
+ gap: "1.25rem",
88
+ marginTop: "2.5rem",
89
+ },
90
+ card: {
91
+ background: "var(--card-bg)",
92
+ border: "1px solid var(--border)",
93
+ borderRadius: 14,
94
+ padding: "1.5rem",
95
+ },
96
+ cardTitle: {
97
+ fontFamily: "ui-monospace, SFMono-Regular, Menlo, monospace",
98
+ fontSize: "0.7rem",
99
+ letterSpacing: "0.18em",
100
+ textTransform: "uppercase",
101
+ color: "var(--muted)",
102
+ margin: "0 0 1rem",
103
+ },
104
+ list: { listStyle: "none", margin: 0, padding: 0, display: "flex", flexDirection: "column", gap: "0.55rem" },
105
+ listItem: {
106
+ display: "flex",
107
+ alignItems: "center",
108
+ justifyContent: "space-between",
109
+ gap: "0.75rem",
110
+ padding: "0.7rem 0.85rem",
111
+ borderRadius: 10,
112
+ background: "var(--raised)",
113
+ border: "1px solid var(--border)",
114
+ fontSize: "0.95rem",
115
+ },
116
+ badge: {
117
+ fontFamily: "ui-monospace, SFMono-Regular, Menlo, monospace",
118
+ fontSize: "0.7rem",
119
+ padding: "0.18rem 0.6rem",
120
+ borderRadius: 999,
121
+ background: "var(--accent)",
122
+ color: "var(--accent-text)",
123
+ fontWeight: 600,
124
+ letterSpacing: "0.08em",
125
+ textTransform: "uppercase",
126
+ },
127
+ formRow: { display: "flex", gap: "0.5rem", marginTop: "0.5rem" },
128
+ input: {
129
+ flex: 1,
130
+ background: "var(--raised)",
131
+ color: "var(--text)",
132
+ border: "1px solid var(--border)",
133
+ borderRadius: 10,
134
+ padding: "0.7rem 0.9rem",
135
+ fontFamily: "inherit",
136
+ fontSize: "0.95rem",
137
+ outline: "none",
138
+ },
139
+ button: {
140
+ background: "var(--accent)",
141
+ color: "var(--accent-text)",
142
+ border: "none",
143
+ borderRadius: 10,
144
+ padding: "0.7rem 1.1rem",
145
+ fontFamily: "inherit",
146
+ fontSize: "0.95rem",
147
+ fontWeight: 600,
148
+ cursor: "pointer",
149
+ },
150
+ ghost: {
151
+ background: "transparent",
152
+ color: "var(--text)",
153
+ border: "1px solid var(--border)",
154
+ borderRadius: 10,
155
+ padding: "0.7rem 1.1rem",
156
+ fontFamily: "inherit",
157
+ fontSize: "0.95rem",
158
+ cursor: "pointer",
159
+ },
160
+ buttonRow: { display: "flex", gap: "0.6rem", marginTop: "1.25rem", flexWrap: "wrap" },
161
+ };
162
+
163
+ const items = [
164
+ { id: 1, title: "Daily standup notes", tag: "active" },
165
+ { id: 2, title: "Q3 launch checklist", tag: "draft" },
166
+ { id: 3, title: "Reading list", tag: "synced" },
167
+ ];
168
+
169
+ return (
170
+ <>
171
+ <style>{THEME_CSS}</style>
172
+ <main id="app" style={c.page}>
173
+ <div style={c.container}>
174
+ <header style={c.header}>
175
+ <span style={c.eyebrow}>vibes.diy theme</span>
176
+ <h1 style={c.title}>Elder Codex</h1>
177
+ <p style={c.subtitle}>
178
+ An exemplar app on the Elder Codex theme — list, form, buttons rendered with the catalog tokens.
179
+ </p>
180
+ <div style={c.modeNote}>auto · dark + light via prefers-color-scheme</div>
181
+ </header>
182
+
183
+ <div style={c.grid}>
184
+ <section style={c.card}>
185
+ <h2 style={c.cardTitle}>Recent</h2>
186
+ <ul style={c.list}>
187
+ {items.map((it) => (
188
+ <li key={it.id} style={c.listItem}>
189
+ <span>{it.title}</span>
190
+ <span style={c.badge}>{it.tag}</span>
191
+ </li>
192
+ ))}
193
+ </ul>
194
+ </section>
195
+
196
+ <section style={c.card}>
197
+ <h2 style={c.cardTitle}>New entry</h2>
198
+ <p style={{ ...c.subtitle, fontSize: "0.9rem", marginTop: "0.25rem" }}>Capture a quick thought.</p>
199
+ <div style={c.formRow}>
200
+ <input
201
+ style={c.input}
202
+ placeholder="What's on your mind?"
203
+ value={draft}
204
+ onChange={(e) => setDraft(e.target.value)}
205
+ />
206
+ <button style={c.button} type="button">
207
+ Save
208
+ </button>
209
+ </div>
210
+ <div style={c.buttonRow}>
211
+ <button style={c.button} type="button">
212
+ Primary
213
+ </button>
214
+ <button style={c.ghost} type="button">
215
+ Secondary
216
+ </button>
217
+ </div>
218
+ </section>
219
+ </div>
220
+ </div>
221
+ </main>
222
+ </>
223
+ );
224
+ }
@@ -0,0 +1,224 @@
1
+ import React, { useEffect, useState } from "react";
2
+
3
+ // Theme: Computer Angel Heaven — auto-generated exemplar with prefers-color-scheme.
4
+ // Canonical palette: bg oklch(0.96 0.008 80), accent oklch(0.78 0.12 85).
5
+ // Inverse computed by flipping oklch/hex lightness; tune by hand if needed.
6
+
7
+ const THEME_CSS = `
8
+ :root {
9
+ --bg: oklch(0.96 0.008 80);
10
+ --accent: oklch(0.78 0.12 85);
11
+ --text: rgba(20, 20, 20, 0.92);
12
+ --muted: rgba(20, 20, 20, 0.5);
13
+ --border: rgba(20, 20, 20, 0.14);
14
+ --raised: rgba(255, 255, 255, 0.55);
15
+ --card-bg: rgba(255, 255, 255, 0.85);
16
+ --accent-text: #fafafa;
17
+ }
18
+ @media (prefers-color-scheme: dark) {
19
+ :root {
20
+ --bg: oklch(0.06 0.008 80);
21
+ --accent: oklch(0.22 0.12 85);
22
+ --text: rgba(255, 255, 255, 0.92);
23
+ --muted: rgba(255, 255, 255, 0.55);
24
+ --border: rgba(255, 255, 255, 0.18);
25
+ --raised: rgba(255, 255, 255, 0.06);
26
+ --card-bg: rgba(255, 255, 255, 0.04);
27
+ --accent-text: #0a0a0a;
28
+ }
29
+ }
30
+ body { margin: 0; }
31
+ `;
32
+
33
+ export default function App() {
34
+ useEffect(() => {
35
+ const link = document.createElement("link");
36
+ link.rel = "stylesheet";
37
+ link.href = "https://fonts.googleapis.com/css2?family=Inter:wght@400;500;700&display=optional";
38
+ document.head.appendChild(link);
39
+ return () => link.remove();
40
+ }, []);
41
+
42
+ const [draft, setDraft] = useState("");
43
+
44
+ const c = {
45
+ page: {
46
+ minHeight: "100vh",
47
+ background: "var(--bg)",
48
+ color: "var(--text)",
49
+ fontFamily: "'Inter', 'SF Pro Display', system-ui, sans-serif",
50
+ padding: "3rem 2rem 4rem",
51
+ },
52
+ container: { maxWidth: "56rem", margin: "0 auto" },
53
+ header: { display: "flex", flexDirection: "column", gap: "0.85rem", marginBottom: "2rem" },
54
+ eyebrow: {
55
+ fontFamily: "ui-monospace, SFMono-Regular, Menlo, monospace",
56
+ fontSize: "0.72rem",
57
+ letterSpacing: "0.25em",
58
+ textTransform: "uppercase",
59
+ color: "var(--muted)",
60
+ },
61
+ title: {
62
+ fontSize: "clamp(3rem, 13vw, 10rem)",
63
+ fontWeight: 800,
64
+ letterSpacing: "-0.04em",
65
+ lineHeight: 0.9,
66
+ color: "var(--accent)",
67
+ margin: 0,
68
+ },
69
+ subtitle: {
70
+ fontSize: "1.05rem",
71
+ color: "var(--muted)",
72
+ maxWidth: "32rem",
73
+ lineHeight: 1.5,
74
+ margin: 0,
75
+ },
76
+ modeNote: {
77
+ marginTop: "0.5rem",
78
+ fontFamily: "ui-monospace, SFMono-Regular, Menlo, monospace",
79
+ fontSize: "0.7rem",
80
+ letterSpacing: "0.2em",
81
+ textTransform: "uppercase",
82
+ color: "var(--muted)",
83
+ },
84
+ grid: {
85
+ display: "grid",
86
+ gridTemplateColumns: "repeat(auto-fit, minmax(18rem, 1fr))",
87
+ gap: "1.25rem",
88
+ marginTop: "2.5rem",
89
+ },
90
+ card: {
91
+ background: "var(--card-bg)",
92
+ border: "1px solid var(--border)",
93
+ borderRadius: 14,
94
+ padding: "1.5rem",
95
+ },
96
+ cardTitle: {
97
+ fontFamily: "ui-monospace, SFMono-Regular, Menlo, monospace",
98
+ fontSize: "0.7rem",
99
+ letterSpacing: "0.18em",
100
+ textTransform: "uppercase",
101
+ color: "var(--muted)",
102
+ margin: "0 0 1rem",
103
+ },
104
+ list: { listStyle: "none", margin: 0, padding: 0, display: "flex", flexDirection: "column", gap: "0.55rem" },
105
+ listItem: {
106
+ display: "flex",
107
+ alignItems: "center",
108
+ justifyContent: "space-between",
109
+ gap: "0.75rem",
110
+ padding: "0.7rem 0.85rem",
111
+ borderRadius: 10,
112
+ background: "var(--raised)",
113
+ border: "1px solid var(--border)",
114
+ fontSize: "0.95rem",
115
+ },
116
+ badge: {
117
+ fontFamily: "ui-monospace, SFMono-Regular, Menlo, monospace",
118
+ fontSize: "0.7rem",
119
+ padding: "0.18rem 0.6rem",
120
+ borderRadius: 999,
121
+ background: "var(--accent)",
122
+ color: "var(--accent-text)",
123
+ fontWeight: 600,
124
+ letterSpacing: "0.08em",
125
+ textTransform: "uppercase",
126
+ },
127
+ formRow: { display: "flex", gap: "0.5rem", marginTop: "0.5rem" },
128
+ input: {
129
+ flex: 1,
130
+ background: "var(--raised)",
131
+ color: "var(--text)",
132
+ border: "1px solid var(--border)",
133
+ borderRadius: 10,
134
+ padding: "0.7rem 0.9rem",
135
+ fontFamily: "inherit",
136
+ fontSize: "0.95rem",
137
+ outline: "none",
138
+ },
139
+ button: {
140
+ background: "var(--accent)",
141
+ color: "var(--accent-text)",
142
+ border: "none",
143
+ borderRadius: 10,
144
+ padding: "0.7rem 1.1rem",
145
+ fontFamily: "inherit",
146
+ fontSize: "0.95rem",
147
+ fontWeight: 600,
148
+ cursor: "pointer",
149
+ },
150
+ ghost: {
151
+ background: "transparent",
152
+ color: "var(--text)",
153
+ border: "1px solid var(--border)",
154
+ borderRadius: 10,
155
+ padding: "0.7rem 1.1rem",
156
+ fontFamily: "inherit",
157
+ fontSize: "0.95rem",
158
+ cursor: "pointer",
159
+ },
160
+ buttonRow: { display: "flex", gap: "0.6rem", marginTop: "1.25rem", flexWrap: "wrap" },
161
+ };
162
+
163
+ const items = [
164
+ { id: 1, title: "Daily standup notes", tag: "active" },
165
+ { id: 2, title: "Q3 launch checklist", tag: "draft" },
166
+ { id: 3, title: "Reading list", tag: "synced" },
167
+ ];
168
+
169
+ return (
170
+ <>
171
+ <style>{THEME_CSS}</style>
172
+ <main id="app" style={c.page}>
173
+ <div style={c.container}>
174
+ <header style={c.header}>
175
+ <span style={c.eyebrow}>vibes.diy theme</span>
176
+ <h1 style={c.title}>Computer Angel Heaven</h1>
177
+ <p style={c.subtitle}>
178
+ An exemplar app on the Computer Angel Heaven theme — list, form, buttons rendered with the catalog tokens.
179
+ </p>
180
+ <div style={c.modeNote}>auto · light + dark via prefers-color-scheme</div>
181
+ </header>
182
+
183
+ <div style={c.grid}>
184
+ <section style={c.card}>
185
+ <h2 style={c.cardTitle}>Recent</h2>
186
+ <ul style={c.list}>
187
+ {items.map((it) => (
188
+ <li key={it.id} style={c.listItem}>
189
+ <span>{it.title}</span>
190
+ <span style={c.badge}>{it.tag}</span>
191
+ </li>
192
+ ))}
193
+ </ul>
194
+ </section>
195
+
196
+ <section style={c.card}>
197
+ <h2 style={c.cardTitle}>New entry</h2>
198
+ <p style={{ ...c.subtitle, fontSize: "0.9rem", marginTop: "0.25rem" }}>Capture a quick thought.</p>
199
+ <div style={c.formRow}>
200
+ <input
201
+ style={c.input}
202
+ placeholder="What's on your mind?"
203
+ value={draft}
204
+ onChange={(e) => setDraft(e.target.value)}
205
+ />
206
+ <button style={c.button} type="button">
207
+ Save
208
+ </button>
209
+ </div>
210
+ <div style={c.buttonRow}>
211
+ <button style={c.button} type="button">
212
+ Primary
213
+ </button>
214
+ <button style={c.ghost} type="button">
215
+ Secondary
216
+ </button>
217
+ </div>
218
+ </section>
219
+ </div>
220
+ </div>
221
+ </main>
222
+ </>
223
+ );
224
+ }