@vibes.diy/prompts 2.2.10 → 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 (112) 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/image-gen.d.ts +2 -0
  6. package/llms/image-gen.js +9 -0
  7. package/llms/image-gen.js.map +1 -0
  8. package/llms/image-gen.md +102 -0
  9. package/llms/index.d.ts +1 -1
  10. package/llms/index.js +3 -3
  11. package/package.json +3 -3
  12. package/prompts.d.ts +6 -0
  13. package/prompts.js +36 -3
  14. package/prompts.js.map +1 -1
  15. package/settings.d.ts +1 -0
  16. package/system-prompt-initial.md +2 -2
  17. package/system-prompt.md +2 -2
  18. package/themes/aether.md +41 -0
  19. package/themes/archive.md +43 -0
  20. package/themes/atelier.md +42 -0
  21. package/themes/atlas.md +42 -0
  22. package/themes/broadsheet.md +20 -0
  23. package/themes/brutalist.md +208 -0
  24. package/themes/capsule.md +47 -0
  25. package/themes/carbon.md +42 -0
  26. package/themes/chrome.md +132 -0
  27. package/themes/chrono.md +33 -0
  28. package/themes/codex.md +45 -0
  29. package/themes/computer-angel-heaven.md +57 -0
  30. package/themes/console.md +46 -0
  31. package/themes/default.md +96 -0
  32. package/themes/desktop.md +49 -0
  33. package/themes/dial.md +46 -0
  34. package/themes/dossier.md +35 -0
  35. package/themes/edge.md +39 -0
  36. package/themes/exemplars/aether/App.jsx +224 -0
  37. package/themes/exemplars/archive/App.jsx +222 -0
  38. package/themes/exemplars/atelier/App.jsx +224 -0
  39. package/themes/exemplars/atlas/App.jsx +216 -0
  40. package/themes/exemplars/broadsheet/App.jsx +216 -0
  41. package/themes/exemplars/brutalist/App.jsx +290 -0
  42. package/themes/exemplars/capsule/App.jsx +216 -0
  43. package/themes/exemplars/carbon/App.jsx +216 -0
  44. package/themes/exemplars/chrome/App.jsx +253 -0
  45. package/themes/exemplars/chrono/App.jsx +222 -0
  46. package/themes/exemplars/codex/App.jsx +224 -0
  47. package/themes/exemplars/computer-angel-heaven/App.jsx +224 -0
  48. package/themes/exemplars/console/App.jsx +216 -0
  49. package/themes/exemplars/default/App.jsx +219 -0
  50. package/themes/exemplars/desktop/App.jsx +224 -0
  51. package/themes/exemplars/dial/App.jsx +216 -0
  52. package/themes/exemplars/dossier/App.jsx +224 -0
  53. package/themes/exemplars/edge/App.jsx +216 -0
  54. package/themes/exemplars/guild/App.jsx +224 -0
  55. package/themes/exemplars/hearth/App.jsx +224 -0
  56. package/themes/exemplars/industrial/App.jsx +224 -0
  57. package/themes/exemplars/matrix/App.jsx +224 -0
  58. package/themes/exemplars/mesh/App.jsx +222 -0
  59. package/themes/exemplars/neomario/App.jsx +222 -0
  60. package/themes/exemplars/neon/App.jsx +224 -0
  61. package/themes/exemplars/nexus/App.jsx +216 -0
  62. package/themes/exemplars/opus/App.jsx +224 -0
  63. package/themes/exemplars/orbit/App.jsx +224 -0
  64. package/themes/exemplars/palate/App.jsx +224 -0
  65. package/themes/exemplars/pitch/App.jsx +222 -0
  66. package/themes/exemplars/poster/App.jsx +222 -0
  67. package/themes/exemplars/proof/App.jsx +224 -0
  68. package/themes/exemplars/recon/App.jsx +216 -0
  69. package/themes/exemplars/rift/App.jsx +224 -0
  70. package/themes/exemplars/rune/App.jsx +224 -0
  71. package/themes/exemplars/scrapbook/App.jsx +222 -0
  72. package/themes/exemplars/sensor/App.jsx +224 -0
  73. package/themes/exemplars/signal/App.jsx +222 -0
  74. package/themes/exemplars/slab/App.jsx +224 -0
  75. package/themes/exemplars/specimen/App.jsx +222 -0
  76. package/themes/exemplars/terminal/App.jsx +224 -0
  77. package/themes/exemplars/vault/App.jsx +222 -0
  78. package/themes/exemplars/winter-sports/App.jsx +224 -0
  79. package/themes/exemplars/zine/App.jsx +214 -0
  80. package/themes/guild.md +44 -0
  81. package/themes/hearth.md +45 -0
  82. package/themes/index.d.ts +11 -0
  83. package/themes/index.js +272 -0
  84. package/themes/index.js.map +1 -0
  85. package/themes/industrial.md +37 -0
  86. package/themes/matrix.md +41 -0
  87. package/themes/mesh.md +42 -0
  88. package/themes/neomario.md +47 -0
  89. package/themes/neon.md +48 -0
  90. package/themes/nexus.md +40 -0
  91. package/themes/opus.md +61 -0
  92. package/themes/orbit.md +46 -0
  93. package/themes/palate.md +35 -0
  94. package/themes/pitch.md +39 -0
  95. package/themes/poster.md +39 -0
  96. package/themes/proof.md +41 -0
  97. package/themes/recon.md +39 -0
  98. package/themes/rift.md +45 -0
  99. package/themes/rune.md +44 -0
  100. package/themes/scrapbook.md +43 -0
  101. package/themes/sensor.md +42 -0
  102. package/themes/signal.md +37 -0
  103. package/themes/slab.md +35 -0
  104. package/themes/specimen.md +21 -0
  105. package/themes/terminal.md +39 -0
  106. package/themes/vault.md +41 -0
  107. package/themes/winter-sports.md +39 -0
  108. package/themes/zine.md +40 -0
  109. package/llms/img-vibes.d.ts +0 -2
  110. package/llms/img-vibes.js +0 -9
  111. package/llms/img-vibes.js.map +0 -1
  112. package/llms/img-vibes.md +0 -167
@@ -0,0 +1,216 @@
1
+ import React, { useEffect, useState } from "react";
2
+
3
+ // Theme: Dial Apparatus — auto-generated exemplar with prefers-color-scheme.
4
+ // Canonical palette: bg oklch(0.24 0.01 260), accent oklch(0.62 0.24 28).
5
+ // Inverse computed by flipping oklch/hex lightness; tune by hand if needed.
6
+
7
+ const THEME_CSS = `
8
+ :root {
9
+ --bg: oklch(0.24 0.01 260);
10
+ --accent: oklch(0.62 0.24 28);
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.76 0.01 260);
21
+ --accent: oklch(0.38 0.24 28);
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
+ 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}>Dial Apparatus</h1>
169
+ <p style={c.subtitle}>
170
+ An exemplar app on the Dial Apparatus theme — list, form, buttons rendered with the catalog tokens.
171
+ </p>
172
+ <div style={c.modeNote}>auto · dark + light 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,224 @@
1
+ import React, { useEffect, useState } from "react";
2
+
3
+ // Theme: Dossier Card — auto-generated exemplar with prefers-color-scheme.
4
+ // Canonical palette: bg oklch(0.16 0.000 0), accent #666.
5
+ // Inverse computed by flipping oklch/hex lightness; tune by hand if needed.
6
+
7
+ const THEME_CSS = `
8
+ :root {
9
+ --bg: oklch(0.16 0.000 0);
10
+ --accent: #666;
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.84 0.000 0);
21
+ --accent: #999999;
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=Roboto+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: "'Roboto 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: "'Roboto 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: "'Roboto 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: "'Roboto 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: "'Roboto 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}>Dossier Card</h1>
177
+ <p style={c.subtitle}>
178
+ An exemplar app on the Dossier Card 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,216 @@
1
+ import React, { useEffect, useState } from "react";
2
+
3
+ // Theme: EDGE INTERFACE — auto-generated exemplar with prefers-color-scheme.
4
+ // Canonical palette: bg #fff, accent #ff0077.
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: #ff0077;
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: #ff0077;
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-body)",
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}>EDGE INTERFACE</h1>
169
+ <p style={c.subtitle}>
170
+ An exemplar app on the EDGE INTERFACE 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
+ }