@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,216 @@
1
+ import React, { useEffect, useState } from "react";
2
+
3
+ // Theme: Console Rack — auto-generated exemplar with prefers-color-scheme.
4
+ // Canonical palette: bg oklch(0.93 0.003 265), accent oklch(0.58 0.20 35).
5
+ // Inverse computed by flipping oklch/hex lightness; tune by hand if needed.
6
+
7
+ const THEME_CSS = `
8
+ :root {
9
+ --bg: oklch(0.93 0.003 265);
10
+ --accent: oklch(0.58 0.20 35);
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.07 0.003 265);
21
+ --accent: oklch(0.42 0.20 35);
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
+ const [draft, setDraft] = useState("");
35
+
36
+ const c = {
37
+ page: {
38
+ minHeight: "100vh",
39
+ background: "var(--bg)",
40
+ color: "var(--text)",
41
+ fontFamily: "var(--font-ui)",
42
+ padding: "3rem 2rem 4rem",
43
+ },
44
+ container: { maxWidth: "56rem", margin: "0 auto" },
45
+ header: { display: "flex", flexDirection: "column", gap: "0.85rem", marginBottom: "2rem" },
46
+ eyebrow: {
47
+ fontFamily: "ui-monospace, SFMono-Regular, Menlo, monospace",
48
+ fontSize: "0.72rem",
49
+ letterSpacing: "0.25em",
50
+ textTransform: "uppercase",
51
+ color: "var(--muted)",
52
+ },
53
+ title: {
54
+ fontSize: "clamp(3rem, 13vw, 10rem)",
55
+ fontWeight: 800,
56
+ letterSpacing: "-0.04em",
57
+ lineHeight: 0.9,
58
+ color: "var(--accent)",
59
+ margin: 0,
60
+ },
61
+ subtitle: {
62
+ fontSize: "1.05rem",
63
+ color: "var(--muted)",
64
+ maxWidth: "32rem",
65
+ lineHeight: 1.5,
66
+ margin: 0,
67
+ },
68
+ modeNote: {
69
+ marginTop: "0.5rem",
70
+ fontFamily: "ui-monospace, SFMono-Regular, Menlo, monospace",
71
+ fontSize: "0.7rem",
72
+ letterSpacing: "0.2em",
73
+ textTransform: "uppercase",
74
+ color: "var(--muted)",
75
+ },
76
+ grid: {
77
+ display: "grid",
78
+ gridTemplateColumns: "repeat(auto-fit, minmax(18rem, 1fr))",
79
+ gap: "1.25rem",
80
+ marginTop: "2.5rem",
81
+ },
82
+ card: {
83
+ background: "var(--card-bg)",
84
+ border: "1px solid var(--border)",
85
+ borderRadius: 14,
86
+ padding: "1.5rem",
87
+ },
88
+ cardTitle: {
89
+ fontFamily: "ui-monospace, SFMono-Regular, Menlo, monospace",
90
+ fontSize: "0.7rem",
91
+ letterSpacing: "0.18em",
92
+ textTransform: "uppercase",
93
+ color: "var(--muted)",
94
+ margin: "0 0 1rem",
95
+ },
96
+ list: { listStyle: "none", margin: 0, padding: 0, display: "flex", flexDirection: "column", gap: "0.55rem" },
97
+ listItem: {
98
+ display: "flex",
99
+ alignItems: "center",
100
+ justifyContent: "space-between",
101
+ gap: "0.75rem",
102
+ padding: "0.7rem 0.85rem",
103
+ borderRadius: 10,
104
+ background: "var(--raised)",
105
+ border: "1px solid var(--border)",
106
+ fontSize: "0.95rem",
107
+ },
108
+ badge: {
109
+ fontFamily: "ui-monospace, SFMono-Regular, Menlo, monospace",
110
+ fontSize: "0.7rem",
111
+ padding: "0.18rem 0.6rem",
112
+ borderRadius: 999,
113
+ background: "var(--accent)",
114
+ color: "var(--accent-text)",
115
+ fontWeight: 600,
116
+ letterSpacing: "0.08em",
117
+ textTransform: "uppercase",
118
+ },
119
+ formRow: { display: "flex", gap: "0.5rem", marginTop: "0.5rem" },
120
+ input: {
121
+ flex: 1,
122
+ background: "var(--raised)",
123
+ color: "var(--text)",
124
+ border: "1px solid var(--border)",
125
+ borderRadius: 10,
126
+ padding: "0.7rem 0.9rem",
127
+ fontFamily: "inherit",
128
+ fontSize: "0.95rem",
129
+ outline: "none",
130
+ },
131
+ button: {
132
+ background: "var(--accent)",
133
+ color: "var(--accent-text)",
134
+ border: "none",
135
+ borderRadius: 10,
136
+ padding: "0.7rem 1.1rem",
137
+ fontFamily: "inherit",
138
+ fontSize: "0.95rem",
139
+ fontWeight: 600,
140
+ cursor: "pointer",
141
+ },
142
+ ghost: {
143
+ background: "transparent",
144
+ color: "var(--text)",
145
+ border: "1px solid var(--border)",
146
+ borderRadius: 10,
147
+ padding: "0.7rem 1.1rem",
148
+ fontFamily: "inherit",
149
+ fontSize: "0.95rem",
150
+ cursor: "pointer",
151
+ },
152
+ buttonRow: { display: "flex", gap: "0.6rem", marginTop: "1.25rem", flexWrap: "wrap" },
153
+ };
154
+
155
+ const items = [
156
+ { id: 1, title: "Daily standup notes", tag: "active" },
157
+ { id: 2, title: "Q3 launch checklist", tag: "draft" },
158
+ { id: 3, title: "Reading list", tag: "synced" },
159
+ ];
160
+
161
+ return (
162
+ <>
163
+ <style>{THEME_CSS}</style>
164
+ <main id="app" style={c.page}>
165
+ <div style={c.container}>
166
+ <header style={c.header}>
167
+ <span style={c.eyebrow}>vibes.diy theme</span>
168
+ <h1 style={c.title}>Console Rack</h1>
169
+ <p style={c.subtitle}>
170
+ An exemplar app on the Console Rack theme — list, form, buttons rendered with the catalog tokens.
171
+ </p>
172
+ <div style={c.modeNote}>auto · light + dark via prefers-color-scheme</div>
173
+ </header>
174
+
175
+ <div style={c.grid}>
176
+ <section style={c.card}>
177
+ <h2 style={c.cardTitle}>Recent</h2>
178
+ <ul style={c.list}>
179
+ {items.map((it) => (
180
+ <li key={it.id} style={c.listItem}>
181
+ <span>{it.title}</span>
182
+ <span style={c.badge}>{it.tag}</span>
183
+ </li>
184
+ ))}
185
+ </ul>
186
+ </section>
187
+
188
+ <section style={c.card}>
189
+ <h2 style={c.cardTitle}>New entry</h2>
190
+ <p style={{ ...c.subtitle, fontSize: "0.9rem", marginTop: "0.25rem" }}>Capture a quick thought.</p>
191
+ <div style={c.formRow}>
192
+ <input
193
+ style={c.input}
194
+ placeholder="What's on your mind?"
195
+ value={draft}
196
+ onChange={(e) => setDraft(e.target.value)}
197
+ />
198
+ <button style={c.button} type="button">
199
+ Save
200
+ </button>
201
+ </div>
202
+ <div style={c.buttonRow}>
203
+ <button style={c.button} type="button">
204
+ Primary
205
+ </button>
206
+ <button style={c.ghost} type="button">
207
+ Secondary
208
+ </button>
209
+ </div>
210
+ </section>
211
+ </div>
212
+ </div>
213
+ </main>
214
+ </>
215
+ );
216
+ }
@@ -0,0 +1,219 @@
1
+ import React, { useEffect, useState } from "react";
2
+
3
+ // Theme: Default — Inter, golden accent, respects prefers-color-scheme.
4
+ // Light is the canonical default; dark auto-applies via @media query.
5
+ // All colors flow through CSS variables so the same component code reads
6
+ // correctly in both modes.
7
+
8
+ const THEME_CSS = `
9
+ :root {
10
+ --bg: oklch(0.97 0.01 80);
11
+ --card-bg: oklch(1.00 0 0);
12
+ --text: oklch(0.20 0.02 60);
13
+ --accent: oklch(0.62 0.18 65);
14
+ --accent-text: oklch(1.00 0 0);
15
+ --muted: oklch(0.50 0.02 60);
16
+ --border: oklch(0.88 0.01 70);
17
+ --raised: oklch(0.99 0.01 80);
18
+ }
19
+ @media (prefers-color-scheme: dark) {
20
+ :root {
21
+ --bg: oklch(0.18 0.04 60);
22
+ --card-bg: oklch(0.22 0.04 60);
23
+ --text: oklch(0.95 0.01 80);
24
+ --accent: oklch(0.72 0.18 70);
25
+ --accent-text: oklch(0.12 0.04 60);
26
+ --muted: oklch(0.55 0.03 60);
27
+ --border: oklch(0.35 0.04 60);
28
+ --raised: oklch(0.20 0.04 60);
29
+ }
30
+ }
31
+ body { margin: 0; }
32
+ `;
33
+
34
+ export default function App() {
35
+ useEffect(() => {
36
+ const fontLink = document.createElement("link");
37
+ fontLink.rel = "stylesheet";
38
+ fontLink.href = "https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;800&display=optional";
39
+ document.head.appendChild(fontLink);
40
+ return () => fontLink.remove();
41
+ }, []);
42
+
43
+ const [draft, setDraft] = useState("");
44
+
45
+ const c = {
46
+ page: {
47
+ minHeight: "100vh",
48
+ background: "var(--bg)",
49
+ color: "var(--text)",
50
+ fontFamily: "'Inter', sans-serif",
51
+ padding: "3rem 2rem 4rem",
52
+ },
53
+ container: { maxWidth: "56rem", margin: "0 auto" },
54
+ header: { display: "flex", flexDirection: "column", gap: "0.75rem", marginBottom: "2rem" },
55
+ eyebrow: {
56
+ fontSize: "0.75rem",
57
+ letterSpacing: "0.25em",
58
+ textTransform: "uppercase",
59
+ color: "var(--muted)",
60
+ },
61
+ title: {
62
+ fontSize: "clamp(3rem, 12vw, 9rem)",
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
+ },
75
+ grid: {
76
+ display: "grid",
77
+ gridTemplateColumns: "repeat(auto-fit, minmax(18rem, 1fr))",
78
+ gap: "1.25rem",
79
+ marginTop: "2.5rem",
80
+ },
81
+ card: {
82
+ background: "var(--card-bg)",
83
+ border: "1px solid var(--border)",
84
+ borderRadius: 14,
85
+ padding: "1.5rem",
86
+ },
87
+ cardTitle: {
88
+ fontSize: "0.7rem",
89
+ letterSpacing: "0.18em",
90
+ textTransform: "uppercase",
91
+ color: "var(--muted)",
92
+ margin: "0 0 1rem",
93
+ },
94
+ list: { listStyle: "none", margin: 0, padding: 0, display: "flex", flexDirection: "column", gap: "0.5rem" },
95
+ listItem: {
96
+ display: "flex",
97
+ alignItems: "center",
98
+ justifyContent: "space-between",
99
+ gap: "0.75rem",
100
+ padding: "0.7rem 0.85rem",
101
+ borderRadius: 10,
102
+ background: "var(--raised)",
103
+ border: "1px solid var(--border)",
104
+ fontSize: "0.95rem",
105
+ },
106
+ badge: {
107
+ fontSize: "0.7rem",
108
+ padding: "0.18rem 0.55rem",
109
+ borderRadius: 999,
110
+ background: "var(--accent)",
111
+ color: "var(--accent-text)",
112
+ fontWeight: 600,
113
+ letterSpacing: "0.05em",
114
+ },
115
+ formRow: { display: "flex", gap: "0.5rem", marginTop: "0.5rem" },
116
+ input: {
117
+ flex: 1,
118
+ background: "var(--raised)",
119
+ color: "var(--text)",
120
+ border: "1px solid var(--border)",
121
+ borderRadius: 10,
122
+ padding: "0.7rem 0.9rem",
123
+ fontFamily: "inherit",
124
+ fontSize: "0.95rem",
125
+ outline: "none",
126
+ },
127
+ button: {
128
+ background: "var(--accent)",
129
+ color: "var(--accent-text)",
130
+ border: "none",
131
+ borderRadius: 10,
132
+ padding: "0.7rem 1.1rem",
133
+ fontFamily: "inherit",
134
+ fontSize: "0.95rem",
135
+ fontWeight: 600,
136
+ cursor: "pointer",
137
+ },
138
+ ghost: {
139
+ background: "transparent",
140
+ color: "var(--text)",
141
+ border: "1px solid var(--border)",
142
+ borderRadius: 10,
143
+ padding: "0.7rem 1.1rem",
144
+ fontFamily: "inherit",
145
+ fontSize: "0.95rem",
146
+ cursor: "pointer",
147
+ },
148
+ buttonRow: { display: "flex", gap: "0.6rem", marginTop: "1.25rem", flexWrap: "wrap" },
149
+ modeNote: {
150
+ marginTop: "0.75rem",
151
+ fontSize: "0.7rem",
152
+ letterSpacing: "0.18em",
153
+ textTransform: "uppercase",
154
+ color: "var(--muted)",
155
+ },
156
+ };
157
+
158
+ const items = [
159
+ { id: 1, title: "Daily standup notes", tag: "active" },
160
+ { id: 2, title: "Q3 launch checklist", tag: "draft" },
161
+ { id: 3, title: "Reading list", tag: "synced" },
162
+ ];
163
+
164
+ return (
165
+ <>
166
+ <style>{THEME_CSS}</style>
167
+ <main id="app" style={c.page}>
168
+ <div style={c.container}>
169
+ <header style={c.header}>
170
+ <span style={c.eyebrow}>vibes.diy theme</span>
171
+ <h1 style={c.title}>Default</h1>
172
+ <p style={c.subtitle}>
173
+ Calm warm canvas, golden accent, Inter throughout. Respects your system color scheme — light by day, dark by night.
174
+ </p>
175
+ <div style={c.modeNote}>Auto · light + dark via prefers-color-scheme</div>
176
+ </header>
177
+
178
+ <div style={c.grid}>
179
+ <section style={c.card}>
180
+ <h2 style={c.cardTitle}>Recent</h2>
181
+ <ul style={c.list}>
182
+ {items.map((it) => (
183
+ <li key={it.id} style={c.listItem}>
184
+ <span>{it.title}</span>
185
+ <span style={c.badge}>{it.tag}</span>
186
+ </li>
187
+ ))}
188
+ </ul>
189
+ </section>
190
+
191
+ <section style={c.card}>
192
+ <h2 style={c.cardTitle}>New entry</h2>
193
+ <p style={{ ...c.subtitle, marginTop: 0, fontSize: "0.9rem" }}>Capture a quick thought.</p>
194
+ <div style={c.formRow}>
195
+ <input
196
+ style={c.input}
197
+ placeholder="What's on your mind?"
198
+ value={draft}
199
+ onChange={(e) => setDraft(e.target.value)}
200
+ />
201
+ <button style={c.button} type="button">
202
+ Save
203
+ </button>
204
+ </div>
205
+ <div style={c.buttonRow}>
206
+ <button style={c.button} type="button">
207
+ Primary
208
+ </button>
209
+ <button style={c.ghost} type="button">
210
+ Secondary
211
+ </button>
212
+ </div>
213
+ </section>
214
+ </div>
215
+ </div>
216
+ </main>
217
+ </>
218
+ );
219
+ }
@@ -0,0 +1,224 @@
1
+ import React, { useEffect, useState } from "react";
2
+
3
+ // Theme: Desktop Retro — auto-generated exemplar with prefers-color-scheme.
4
+ // Canonical palette: bg #fff, accent oklch(0.11 0.01 250).
5
+ // Inverse computed by flipping oklch/hex lightness; tune by hand if needed.
6
+
7
+ const THEME_CSS = `
8
+ :root {
9
+ --bg: #fff;
10
+ --accent: oklch(0.11 0.01 250);
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: #0f0f0f;
21
+ --accent: oklch(0.89 0.01 250);
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=JetBrains+Mono: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: "'JetBrains Mono', monospace",
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: "'JetBrains Mono', 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: "'JetBrains Mono', 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: "'JetBrains Mono', 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: "'JetBrains Mono', 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}>Desktop Retro</h1>
177
+ <p style={c.subtitle}>
178
+ An exemplar app on the Desktop Retro 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
+ }