@electric-agent/agent 1.1.9 → 1.4.1
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.
- package/dist/cli/serve.d.ts.map +1 -1
- package/dist/cli/serve.js +2 -32
- package/dist/cli/serve.js.map +1 -1
- package/dist/scaffold/index.d.ts.map +1 -1
- package/dist/scaffold/index.js +62 -7
- package/dist/scaffold/index.js.map +1 -1
- package/package.json +3 -5
- package/playbooks/electric-app-guardrails/SKILL.md +19 -13
- package/template/.claude/skills/create-app/SKILL.md +139 -199
- package/template/.claude/skills/ui-design/SKILL.md +325 -0
package/dist/cli/serve.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"serve.d.ts","sourceRoot":"","sources":["../../src/cli/serve.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"serve.d.ts","sourceRoot":"","sources":["../../src/cli/serve.ts"],"names":[],"mappings":"AAUA,wBAAsB,YAAY,CAAC,IAAI,EAAE;IACxC,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,IAAI,CAAC,EAAE,OAAO,CAAA;CACd,GAAG,OAAO,CAAC,IAAI,CAAC,CAkHhB"}
|
package/dist/cli/serve.js
CHANGED
|
@@ -2,8 +2,6 @@ import { execFileSync, spawn } from "node:child_process";
|
|
|
2
2
|
import path from "node:path";
|
|
3
3
|
import { fileURLToPath } from "node:url";
|
|
4
4
|
import { RoomRegistry } from "@electric-agent/studio/room-registry";
|
|
5
|
-
import { DaytonaSandboxProvider } from "@electric-agent/studio/sandbox/daytona";
|
|
6
|
-
import { getSnapshotStatus } from "@electric-agent/studio/sandbox/daytona-registry";
|
|
7
5
|
import { DockerSandboxProvider } from "@electric-agent/studio/sandbox/docker";
|
|
8
6
|
import { SpritesSandboxProvider } from "@electric-agent/studio/sandbox/sprites";
|
|
9
7
|
import { startWebServer } from "@electric-agent/studio/server";
|
|
@@ -20,42 +18,14 @@ export async function serveCommand(opts) {
|
|
|
20
18
|
}
|
|
21
19
|
// Select sandbox provider:
|
|
22
20
|
// SANDBOX_RUNTIME=docker → always Docker
|
|
23
|
-
// SANDBOX_RUNTIME=
|
|
24
|
-
// (unset) →
|
|
21
|
+
// SANDBOX_RUNTIME=sprites → always Sprites
|
|
22
|
+
// (unset) → Sprites if FLY_API_TOKEN is set, otherwise Docker
|
|
25
23
|
const runtime = process.env.SANDBOX_RUNTIME?.toLowerCase();
|
|
26
24
|
let sandbox;
|
|
27
25
|
if (runtime === "docker") {
|
|
28
26
|
sandbox = new DockerSandboxProvider();
|
|
29
27
|
console.log("[serve] Sandbox runtime: Docker (SANDBOX_RUNTIME=docker)");
|
|
30
28
|
}
|
|
31
|
-
else if (runtime === "daytona" || (!runtime && process.env.DAYTONA_API_KEY)) {
|
|
32
|
-
if (!process.env.DAYTONA_API_KEY) {
|
|
33
|
-
console.error("Error: SANDBOX_RUNTIME=daytona requires DAYTONA_API_KEY to be set.");
|
|
34
|
-
process.exit(1);
|
|
35
|
-
}
|
|
36
|
-
sandbox = new DaytonaSandboxProvider({
|
|
37
|
-
apiKey: process.env.DAYTONA_API_KEY,
|
|
38
|
-
apiUrl: process.env.DAYTONA_API_URL,
|
|
39
|
-
target: process.env.DAYTONA_TARGET,
|
|
40
|
-
});
|
|
41
|
-
console.log(`[serve] Sandbox runtime: Daytona (target: ${process.env.DAYTONA_TARGET ?? "eu"})`);
|
|
42
|
-
// Check snapshot status (non-blocking)
|
|
43
|
-
const { Daytona } = await import("@daytonaio/sdk");
|
|
44
|
-
const daytona = new Daytona({
|
|
45
|
-
apiKey: process.env.DAYTONA_API_KEY,
|
|
46
|
-
apiUrl: process.env.DAYTONA_API_URL,
|
|
47
|
-
target: process.env.DAYTONA_TARGET ?? "eu",
|
|
48
|
-
});
|
|
49
|
-
const snapshotImage = process.env.SANDBOX_IMAGE || "electric-agent-sandbox";
|
|
50
|
-
const status = await getSnapshotStatus(daytona, snapshotImage);
|
|
51
|
-
if (status.exists) {
|
|
52
|
-
console.log(`[serve] Snapshot "${snapshotImage}": ${status.state}`);
|
|
53
|
-
}
|
|
54
|
-
else {
|
|
55
|
-
console.log(`[serve] Snapshot "${snapshotImage}" not found — will be created on first sandbox creation`);
|
|
56
|
-
console.log(`[serve] To pre-push: npm run push:sandbox:daytona`);
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
29
|
else if (runtime === "sprites" || (!runtime && process.env.FLY_API_TOKEN)) {
|
|
60
30
|
if (!process.env.FLY_API_TOKEN) {
|
|
61
31
|
console.error("Error: SANDBOX_RUNTIME=sprites requires FLY_API_TOKEN to be set.");
|
package/dist/cli/serve.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"serve.js","sourceRoot":"","sources":["../../src/cli/serve.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAA;AACxD,OAAO,IAAI,MAAM,WAAW,CAAA;AAC5B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,sCAAsC,CAAA;AAEnE,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"serve.js","sourceRoot":"","sources":["../../src/cli/serve.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/scaffold/index.ts"],"names":[],"mappings":"AAMA,6EAA6E;AAC7E,UAAU,gBAAgB;IACzB,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IACzC,WAAW,CAAC,EAAE,OAAO,CAAA;CACrB;AAKD,MAAM,WAAW,cAAc;IAC9B,UAAU,EAAE,MAAM,CAAA;IAClB,cAAc,EAAE,OAAO,CAAA;IACvB,MAAM,EAAE,MAAM,EAAE,CAAA;CAChB;AAED;;;;;;;;;GASG;AACH,wBAAsB,QAAQ,CAC7B,UAAU,EAAE,MAAM,EAClB,IAAI,CAAC,EAAE;IACN,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,EAAE,gBAAgB,CAAA;CAC3B,GACC,OAAO,CAAC,cAAc,CAAC,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/scaffold/index.ts"],"names":[],"mappings":"AAMA,6EAA6E;AAC7E,UAAU,gBAAgB;IACzB,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IACzC,WAAW,CAAC,EAAE,OAAO,CAAA;CACrB;AAKD,MAAM,WAAW,cAAc;IAC9B,UAAU,EAAE,MAAM,CAAA;IAClB,cAAc,EAAE,OAAO,CAAA;IACvB,MAAM,EAAE,MAAM,EAAE,CAAA;CAChB;AAED;;;;;;;;;GASG;AACH,wBAAsB,QAAQ,CAC7B,UAAU,EAAE,MAAM,EAClB,IAAI,CAAC,EAAE;IACN,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,EAAE,gBAAgB,CAAA;CAC3B,GACC,OAAO,CAAC,cAAc,CAAC,CAsJzB"}
|
package/dist/scaffold/index.js
CHANGED
|
@@ -65,6 +65,9 @@ export async function scaffold(projectDir, opts) {
|
|
|
65
65
|
// Step 6b: Fix public-dir CSS imports that break Rollup production builds
|
|
66
66
|
reporter?.log("verbose", "Patching public CSS imports...");
|
|
67
67
|
patchPublicCssImports(projectDir);
|
|
68
|
+
// Step 6c: Set Electric brand theme colors in __root.tsx
|
|
69
|
+
reporter?.log("verbose", "Patching theme colors...");
|
|
70
|
+
patchThemeColors(projectDir);
|
|
68
71
|
// Step 7: Copy .env.example -> .env and ensure VITE_PORT is set
|
|
69
72
|
const envExample = path.join(projectDir, ".env.example");
|
|
70
73
|
const envFile = path.join(projectDir, ".env");
|
|
@@ -178,20 +181,20 @@ function copyTemplateFiles(srcDir, destDir) {
|
|
|
178
181
|
}
|
|
179
182
|
}
|
|
180
183
|
const ADDED_DEPENDENCIES = {
|
|
181
|
-
"@tanstack/db": "0.5.
|
|
182
|
-
"@tanstack/react-db": "0.1.
|
|
183
|
-
"@tanstack/electric-db-collection": "0.2.
|
|
184
|
-
"@electric-sql/client": "1.5.
|
|
184
|
+
"@tanstack/db": "0.5.32",
|
|
185
|
+
"@tanstack/react-db": "0.1.76",
|
|
186
|
+
"@tanstack/electric-db-collection": "0.2.40",
|
|
187
|
+
"@electric-sql/client": "1.5.12",
|
|
185
188
|
"drizzle-orm": "0.45.1",
|
|
186
189
|
"drizzle-zod": "^0.8.3",
|
|
187
190
|
postgres: "^3.4",
|
|
188
|
-
zod: "^3.
|
|
191
|
+
zod: "^3.25",
|
|
189
192
|
};
|
|
190
193
|
const ADDED_DEV_DEPENDENCIES = {
|
|
191
194
|
"drizzle-kit": "0.31.9",
|
|
192
195
|
vitest: "^3.0.0",
|
|
193
|
-
// Playbook packages (@electric-sql/playbook, @tanstack/db-playbook
|
|
194
|
-
//
|
|
196
|
+
// Playbook packages (@electric-sql/playbook, @tanstack/db-playbook)
|
|
197
|
+
// come from the KPB template — don't duplicate here.
|
|
195
198
|
};
|
|
196
199
|
const ADDED_SCRIPTS = {
|
|
197
200
|
generate: "drizzle-kit generate",
|
|
@@ -294,6 +297,58 @@ function patchPublicCssImports(projectDir) {
|
|
|
294
297
|
fs.writeFileSync(rootPath, content, "utf-8");
|
|
295
298
|
}
|
|
296
299
|
}
|
|
300
|
+
function patchThemeColors(projectDir) {
|
|
301
|
+
const rootPath = path.join(projectDir, "src/routes/__root.tsx");
|
|
302
|
+
if (!fs.existsSync(rootPath))
|
|
303
|
+
return;
|
|
304
|
+
let content = fs.readFileSync(rootPath, "utf-8");
|
|
305
|
+
// Replace KPB default accentColor="blue" (or any other) with Electric brand violet
|
|
306
|
+
// Also add grayColor, radius, and panelBackground if not present
|
|
307
|
+
const themeRegex = /<Theme\b([^>]*)>/;
|
|
308
|
+
const match = content.match(themeRegex);
|
|
309
|
+
if (match) {
|
|
310
|
+
let attrs = match[1];
|
|
311
|
+
// Replace or add accentColor
|
|
312
|
+
if (attrs.includes("accentColor")) {
|
|
313
|
+
attrs = attrs.replace(/accentColor="[^"]*"/, 'accentColor="violet"');
|
|
314
|
+
}
|
|
315
|
+
else {
|
|
316
|
+
attrs += ' accentColor="violet"';
|
|
317
|
+
}
|
|
318
|
+
// Replace or add grayColor
|
|
319
|
+
if (attrs.includes("grayColor")) {
|
|
320
|
+
attrs = attrs.replace(/grayColor="[^"]*"/, 'grayColor="mauve"');
|
|
321
|
+
}
|
|
322
|
+
else {
|
|
323
|
+
attrs += ' grayColor="mauve"';
|
|
324
|
+
}
|
|
325
|
+
// Replace or add radius
|
|
326
|
+
if (attrs.includes("radius=")) {
|
|
327
|
+
attrs = attrs.replace(/radius="[^"]*"/, 'radius="medium"');
|
|
328
|
+
}
|
|
329
|
+
else {
|
|
330
|
+
attrs += ' radius="medium"';
|
|
331
|
+
}
|
|
332
|
+
// Replace or add panelBackground
|
|
333
|
+
if (attrs.includes("panelBackground")) {
|
|
334
|
+
attrs = attrs.replace(/panelBackground="[^"]*"/, 'panelBackground="translucent"');
|
|
335
|
+
}
|
|
336
|
+
else {
|
|
337
|
+
attrs += ' panelBackground="translucent"';
|
|
338
|
+
}
|
|
339
|
+
content = content.replace(themeRegex, `<Theme${attrs}>`);
|
|
340
|
+
fs.writeFileSync(rootPath, content, "utf-8");
|
|
341
|
+
}
|
|
342
|
+
// Add Electric brand CSS custom properties to styles.css if present
|
|
343
|
+
const stylesPath = path.join(projectDir, "src/styles.css");
|
|
344
|
+
if (fs.existsSync(stylesPath)) {
|
|
345
|
+
let styles = fs.readFileSync(stylesPath, "utf-8");
|
|
346
|
+
if (!styles.includes("--electric-brand")) {
|
|
347
|
+
styles += `\n:root {\n --electric-brand: #d0bcff;\n --electric-teal: #00d2a0;\n}\n`;
|
|
348
|
+
fs.writeFileSync(stylesPath, styles, "utf-8");
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
}
|
|
297
352
|
function patchGitignore(projectDir) {
|
|
298
353
|
const gitignorePath = path.join(projectDir, ".gitignore");
|
|
299
354
|
let content = "";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/scaffold/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/scaffold/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@electric-agent/agent",
|
|
3
|
-
"version": "1.1
|
|
3
|
+
"version": "1.4.1",
|
|
4
4
|
"description": "CLI tool that turns natural-language app descriptions into running reactive Electric SQL + TanStack DB applications",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -22,13 +22,12 @@
|
|
|
22
22
|
},
|
|
23
23
|
"dependencies": {
|
|
24
24
|
"@anthropic-ai/claude-agent-sdk": "^0.1.0",
|
|
25
|
-
"@daytonaio/sdk": "^0.144.0",
|
|
26
25
|
"@durable-streams/client": "^0.2.1",
|
|
27
26
|
"commander": "^13.1.0",
|
|
28
27
|
"dotenv": "^17.3.1",
|
|
29
28
|
"zod": "^3.24.1",
|
|
30
|
-
"@electric-agent/
|
|
31
|
-
"@electric-agent/
|
|
29
|
+
"@electric-agent/studio": "1.12.1",
|
|
30
|
+
"@electric-agent/protocol": "1.8.0"
|
|
32
31
|
},
|
|
33
32
|
"devDependencies": {
|
|
34
33
|
"@types/node": "^22.15.0",
|
|
@@ -43,7 +42,6 @@
|
|
|
43
42
|
"serve": "node dist/index.js serve",
|
|
44
43
|
"test": "node --import tsx --test tests/*.test.ts",
|
|
45
44
|
"test:e2e:docker": "node --import tsx --test tests/e2e-docker.test.ts",
|
|
46
|
-
"test:daytona": "node --import tsx --test tests/e2e-daytona.test.ts",
|
|
47
45
|
"test:sprites": "node --import tsx --test tests/sprites.test.ts",
|
|
48
46
|
"clean": "rm -rf dist"
|
|
49
47
|
}
|
|
@@ -19,11 +19,9 @@ Patterns NOT covered by external playbooks. Read playbooks for collections, live
|
|
|
19
19
|
|
|
20
20
|
## Drizzle-Zod Integration (CRITICAL)
|
|
21
21
|
|
|
22
|
-
**Import `z` from `"zod/v4"`** (NOT `"zod"`) — drizzle-zod 0.8.x
|
|
22
|
+
**Import `z` from `"zod/v4"`** (NOT `"zod"`) — drizzle-zod 0.8.x peer-depends on zod >=3.25 which exports v4 as a subpath. The `createSelectSchema` function rejects v3-style overrides with "Invalid element: expected a Zod schema".
|
|
23
23
|
|
|
24
|
-
**Always override timestamp columns**
|
|
25
|
-
|
|
26
|
-
**Do NOT use `z.coerce.date()`** — creates ZodEffects that TanStack DB's schema introspection rejects.
|
|
24
|
+
**Always override timestamp columns** using the TanStack DB pattern from `tanstack-db/collections/SKILL.md`:
|
|
27
25
|
|
|
28
26
|
```typescript
|
|
29
27
|
// src/db/zod-schemas.ts
|
|
@@ -31,18 +29,27 @@ import { createSelectSchema, createInsertSchema } from "drizzle-zod"
|
|
|
31
29
|
import { z } from "zod/v4"
|
|
32
30
|
import { todos } from "./schema"
|
|
33
31
|
|
|
34
|
-
const
|
|
32
|
+
const dateField = z
|
|
33
|
+
.union([z.string(), z.date()])
|
|
34
|
+
.transform((val) => (typeof val === 'string' ? new Date(val) : val))
|
|
35
|
+
.default(() => new Date())
|
|
35
36
|
|
|
36
37
|
export const todoSelectSchema = createSelectSchema(todos, {
|
|
37
|
-
created_at:
|
|
38
|
-
updated_at:
|
|
38
|
+
created_at: dateField,
|
|
39
|
+
updated_at: dateField,
|
|
39
40
|
})
|
|
40
41
|
export const todoInsertSchema = createInsertSchema(todos, {
|
|
41
|
-
created_at:
|
|
42
|
-
updated_at:
|
|
42
|
+
created_at: dateField.optional(),
|
|
43
|
+
updated_at: dateField.optional(),
|
|
43
44
|
})
|
|
44
45
|
```
|
|
45
46
|
|
|
47
|
+
This pattern:
|
|
48
|
+
- Accepts both strings (from Electric sync) and Dates (from local code)
|
|
49
|
+
- Transforms strings to Date objects (proper typing, TInput ⊇ TOutput)
|
|
50
|
+
- Defaults timestamps for `collection.insert()` without explicit values
|
|
51
|
+
- Works with `collection.update()` round-trips (Date passes back through union)
|
|
52
|
+
|
|
46
53
|
**Use `selectSchema` as the collection schema** — it has defaults for timestamps so `collection.insert()` works without them, and validates fully populated rows from Electric sync.
|
|
47
54
|
|
|
48
55
|
## parseDates Utility (CRITICAL)
|
|
@@ -235,10 +242,9 @@ it("survives JSON round-trip", () => {
|
|
|
235
242
|
|
|
236
243
|
| WRONG | RIGHT |
|
|
237
244
|
|-------|-------|
|
|
238
|
-
| `import { z } from "zod"` in zod-schemas | `import { z } from "zod/v4"` |
|
|
239
|
-
| `createSelectSchema(todos)` without date overrides | Override ALL timestamps
|
|
240
|
-
| `z.union([z.
|
|
241
|
-
| `z.coerce.date()` for timestamps | `z.union([z.date(), z.string()])` |
|
|
245
|
+
| `import { z } from "zod"` in zod-schemas | `import { z } from "zod/v4"` — drizzle-zod 0.8.x rejects v3 overrides |
|
|
246
|
+
| `createSelectSchema(todos)` without date overrides | Override ALL timestamps with `z.union([z.string(), z.date()]).transform(...).default(...)` |
|
|
247
|
+
| `z.date().default(() => new Date())` for timestamps | `z.union([z.string(), z.date()]).transform(val => typeof val === 'string' ? new Date(val) : val).default(() => new Date())` — Electric streams dates as strings |
|
|
242
248
|
| `import { createInsertSchema } from 'drizzle-orm/zod'` | `from 'drizzle-zod'` |
|
|
243
249
|
| `import { drizzle } from 'drizzle-orm'` | `from 'drizzle-orm/postgres-js'` |
|
|
244
250
|
| `import { X } from '@radix-ui/react-icons'` | `from 'lucide-react'` |
|
|
@@ -7,10 +7,18 @@ allowed-tools: Read, Write, Edit, Bash, Glob, Grep, AskUserQuestion, Agent, WebS
|
|
|
7
7
|
|
|
8
8
|
# Create Electric SQL App
|
|
9
9
|
|
|
10
|
-
You are building a
|
|
10
|
+
You are building a **local-first, real-time Electric SQL application** using:
|
|
11
|
+
- **Electric SQL** — Postgres-to-client sync via shapes
|
|
12
|
+
- **TanStack DB** — reactive collections, live queries, optimistic mutations
|
|
13
|
+
- **Drizzle ORM** — schema definitions and migrations
|
|
14
|
+
- **TanStack Start** — React meta-framework with SSR + server functions
|
|
15
|
+
|
|
16
|
+
The project is pre-scaffolded. Database and Electric sync service are provisioned. Your job is to design the data model, implement the app, and get it running.
|
|
11
17
|
|
|
12
18
|
Follow the phases below **in strict order**. Do NOT skip phases or jump ahead.
|
|
13
19
|
|
|
20
|
+
---
|
|
21
|
+
|
|
14
22
|
## Phase 0: Clarification
|
|
15
23
|
|
|
16
24
|
Evaluate the description provided in `$ARGUMENTS`.
|
|
@@ -20,70 +28,41 @@ Evaluate the description provided in `$ARGUMENTS`.
|
|
|
20
28
|
- 50-79: Recognizable app type but light on specifics
|
|
21
29
|
- 0-49: Too vague to proceed
|
|
22
30
|
|
|
23
|
-
**If the description scores below 70**, use AskUserQuestion to gather missing details.
|
|
31
|
+
**If the description scores below 70**, use AskUserQuestion to gather missing details. Choose whatever format best fits the gaps — single or multiple questions, multiSelect for picking features, headers to group topics, or free-text for open-ended input.
|
|
24
32
|
|
|
25
|
-
|
|
33
|
+
**If the description scores 70+**, proceed immediately.
|
|
26
34
|
|
|
27
|
-
|
|
35
|
+
---
|
|
28
36
|
|
|
29
|
-
## Phase 1:
|
|
37
|
+
## Phase 1: Plan
|
|
30
38
|
|
|
31
|
-
|
|
39
|
+
Write a `PLAN.md` file with this structure:
|
|
32
40
|
|
|
33
41
|
```markdown
|
|
34
42
|
# [App Name] — Implementation Plan
|
|
35
43
|
|
|
36
44
|
## App Description
|
|
37
|
-
[1-2 sentences]
|
|
45
|
+
[1-2 sentences describing a local-first, real-time Electric SQL application]
|
|
38
46
|
|
|
39
47
|
## Data Model
|
|
40
48
|
|
|
41
49
|
### [Entity Name]
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
})
|
|
49
|
-
\```
|
|
50
|
+
- id: UUID, primary key, defaultRandom()
|
|
51
|
+
- [field]: [type], [constraints]
|
|
52
|
+
- created_at: timestamptz, notNull, defaultNow()
|
|
53
|
+
- updated_at: timestamptz, notNull, defaultNow()
|
|
54
|
+
- Relations: [FK references with onDelete cascade]
|
|
55
|
+
|
|
50
56
|
(Repeat for EVERY entity)
|
|
51
57
|
|
|
52
58
|
## Implementation Tasks
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
- [ ]
|
|
56
|
-
- [ ]
|
|
57
|
-
- [ ]
|
|
58
|
-
- [ ]
|
|
59
|
-
- [ ]
|
|
60
|
-
- [ ] Run pnpm test — STOP if tests fail
|
|
61
|
-
|
|
62
|
-
### Phase 2: Collections & API Routes
|
|
63
|
-
- [ ] Create collection for each entity in src/db/collections/<entity>.ts
|
|
64
|
-
- [ ] Create Electric shape proxy route: src/routes/api/<entity>.ts
|
|
65
|
-
- [ ] Create mutation routes: src/routes/api/mutations/<entity>.ts
|
|
66
|
-
|
|
67
|
-
### Phase 3: UI Components
|
|
68
|
-
- [ ] Create page routes with useLiveQuery (ssr: false on leaf routes)
|
|
69
|
-
- [ ] Implement CRUD operations using mutation fetch calls
|
|
70
|
-
- [ ] Style with Radix UI Themes + lucide-react icons
|
|
71
|
-
|
|
72
|
-
### Phase 4: Build & Lint
|
|
73
|
-
- [ ] pnpm run build passes
|
|
74
|
-
- [ ] pnpm run check passes
|
|
75
|
-
|
|
76
|
-
### Phase 5: Testing
|
|
77
|
-
- [ ] Collection insert validation tests in tests/collections.test.ts
|
|
78
|
-
- [ ] JSON round-trip tests (parseDates + schema validation)
|
|
79
|
-
- [ ] pnpm test passes
|
|
80
|
-
|
|
81
|
-
### Phase 6: Architecture Reference
|
|
82
|
-
- [ ] Write ARCHITECTURE.md
|
|
83
|
-
|
|
84
|
-
### Phase 7: Deploy & Preview
|
|
85
|
-
- [ ] Run migrations (drizzle-kit generate && drizzle-kit migrate)
|
|
86
|
-
- [ ] pnpm dev:start
|
|
59
|
+
- [ ] Phase 2: Discover playbook skills and read relevant ones
|
|
60
|
+
- [ ] Phase 3: Data model — schema, zod-schemas, migrations, tests
|
|
61
|
+
- [ ] Phase 4: Collections & API routes
|
|
62
|
+
- [ ] Phase 5: UI components
|
|
63
|
+
- [ ] Phase 6: Build, lint & test
|
|
64
|
+
- [ ] Phase 7: README.md & ARCHITECTURE.md
|
|
65
|
+
- [ ] Phase 8: Deploy & preview
|
|
87
66
|
|
|
88
67
|
## Design Conventions
|
|
89
68
|
- UUID primary keys with defaultRandom()
|
|
@@ -92,211 +71,172 @@ export const entityName = pgTable("entity_name", {
|
|
|
92
71
|
- Foreign keys with onDelete: "cascade" where appropriate
|
|
93
72
|
```
|
|
94
73
|
|
|
95
|
-
**
|
|
96
|
-
- "
|
|
74
|
+
**Write PLAN.md to disk first**, then present it for approval using AskUserQuestion:
|
|
75
|
+
- "I've written the implementation plan to PLAN.md. Please review it. Should I proceed?"
|
|
97
76
|
- Options: "Approve — start building", "Revise — I have feedback", "Cancel"
|
|
98
|
-
- If "Revise": ask for feedback,
|
|
77
|
+
- If "Revise": ask for feedback, update PLAN.md, present again
|
|
99
78
|
- If "Cancel": stop
|
|
100
79
|
|
|
101
|
-
|
|
80
|
+
---
|
|
81
|
+
|
|
82
|
+
## Phase 2: Discover & Learn
|
|
102
83
|
|
|
103
|
-
|
|
84
|
+
After plan approval, discover the playbook skills installed in this project:
|
|
104
85
|
|
|
105
|
-
|
|
86
|
+
```bash
|
|
87
|
+
npx @tanstack/intent list
|
|
88
|
+
```
|
|
106
89
|
|
|
107
|
-
|
|
108
|
-
Write `src/db/schema.ts` with all Drizzle pgTable definitions from PLAN.md.
|
|
90
|
+
This outputs all available skills with their file paths. **Read the following skills** (use the paths from `intent list` output):
|
|
109
91
|
|
|
110
|
-
|
|
111
|
-
-
|
|
112
|
-
-
|
|
113
|
-
-
|
|
114
|
-
-
|
|
92
|
+
1. **`electric-new-feature`** — end-to-end Electric feature guide (schema → shapes → collections → mutations → queries). This is your primary implementation reference.
|
|
93
|
+
2. **`db-core/collection-setup`** — collection creation, Electric adapter, schema validation, timestamp handling
|
|
94
|
+
3. **`db-core/mutations-optimistic`** — insert, update, delete, optimistic actions
|
|
95
|
+
4. **`db-core/live-queries`** — query builder API (from, where, join, orderBy, etc.)
|
|
96
|
+
5. **`react-db`** — useLiveQuery, useLiveSuspenseQuery hooks
|
|
97
|
+
6. **`meta-framework`** — TanStack Start integration, SSR constraints, route preloading
|
|
115
98
|
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
-
|
|
119
|
-
-
|
|
120
|
-
- Override ALL timestamp columns: `z.union([z.date(), z.string()]).default(() => new Date())`
|
|
121
|
-
- The `.default()` is required for `collection.insert()` to work without timestamps
|
|
122
|
-
- Export both select and insert schemas for each entity
|
|
99
|
+
Also read the scaffold helper files you'll use:
|
|
100
|
+
- `src/db/utils.ts` — `parseDates()` (JSON date round-trip) and `generateTxId()` (Electric txid handshake)
|
|
101
|
+
- `src/lib/electric-proxy.ts` — `proxyElectricRequest()` (Electric shape proxy for API routes)
|
|
102
|
+
- `tests/helpers/schema-test-utils.ts` — `generateValidRow()` / `generateRowWithout()` (test data generation)
|
|
123
103
|
|
|
124
|
-
|
|
104
|
+
---
|
|
105
|
+
|
|
106
|
+
## Phase 3: Data Model (CRITICAL GATE)
|
|
107
|
+
|
|
108
|
+
Validate the data model BEFORE writing application code. **Do NOT proceed until tests pass.**
|
|
109
|
+
|
|
110
|
+
### 3a: Write Drizzle Schema
|
|
111
|
+
Write `src/db/schema.ts` with all pgTable definitions from PLAN.md.
|
|
112
|
+
|
|
113
|
+
### 3b: Write Zod Schemas
|
|
114
|
+
Write `src/db/zod-schemas.ts` using `createSelectSchema` / `createInsertSchema` from `drizzle-zod`.
|
|
115
|
+
|
|
116
|
+
**Scaffold-specific gotcha — zod/v4 import:**
|
|
117
|
+
```typescript
|
|
118
|
+
import { z } from "zod/v4" // NOT "zod" — drizzle-zod 0.8.x rejects v3 overrides
|
|
119
|
+
```
|
|
120
|
+
Playbook examples show `import { z } from "zod"` — in THIS project, always use `"zod/v4"`.
|
|
121
|
+
|
|
122
|
+
Override ALL timestamp columns — the pattern is in the `db-core/collection-setup` skill.
|
|
123
|
+
|
|
124
|
+
### 3c: Run Migrations
|
|
125
125
|
```bash
|
|
126
126
|
pnpm drizzle-kit generate && pnpm drizzle-kit migrate
|
|
127
127
|
```
|
|
128
128
|
|
|
129
|
-
###
|
|
130
|
-
Write `tests/schema.test.ts
|
|
131
|
-
```typescript
|
|
132
|
-
import { generateValidRow, generateRowWithout } from "./helpers/schema-test-utils"
|
|
133
|
-
import { entitySelectSchema } from "@/db/zod-schemas"
|
|
134
|
-
|
|
135
|
-
describe("entity schema", () => {
|
|
136
|
-
it("accepts a complete row", () => {
|
|
137
|
-
expect(entitySelectSchema.safeParse(generateValidRow(entitySelectSchema)).success).toBe(true)
|
|
138
|
-
})
|
|
139
|
-
it("rejects without id", () => {
|
|
140
|
-
expect(entitySelectSchema.safeParse(generateRowWithout(entitySelectSchema, "id")).success).toBe(false)
|
|
141
|
-
})
|
|
142
|
-
})
|
|
143
|
-
```
|
|
129
|
+
### 3d: Write & Run Tests
|
|
130
|
+
Write `tests/schema.test.ts` using `generateValidRow(schema)` and `generateRowWithout(schema, field)` from `tests/helpers/schema-test-utils.ts`.
|
|
144
131
|
|
|
145
|
-
**
|
|
146
|
-
- DO NOT import collection files — they connect to Electric on import
|
|
147
|
-
- DO NOT import `@/db` — requires Postgres
|
|
132
|
+
**Test rules:**
|
|
148
133
|
- ONLY import from `@/db/zod-schemas` and `@/db/schema`
|
|
134
|
+
- DO NOT import collection files (they connect to Electric on import)
|
|
135
|
+
- DO NOT import `@/db` (requires Postgres)
|
|
149
136
|
- Use `generateValidRow(schema)` — never hand-write test data
|
|
150
137
|
|
|
151
|
-
### Step 2e: Run Tests
|
|
152
138
|
```bash
|
|
153
139
|
pnpm test
|
|
154
140
|
```
|
|
155
141
|
|
|
156
|
-
**If tests fail**: fix
|
|
157
|
-
|
|
142
|
+
**If tests fail**: fix and re-run. Do NOT proceed until green.
|
|
143
|
+
|
|
144
|
+
---
|
|
145
|
+
|
|
146
|
+
## Phase 4: Collections & API Routes
|
|
158
147
|
|
|
159
|
-
|
|
148
|
+
Follow the patterns from the `electric-new-feature` and `db-core/collection-setup` skills.
|
|
160
149
|
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
```typescript
|
|
166
|
-
url: new URL("/api/<entity>", typeof window !== "undefined" ? window.location.origin : "http://localhost:5174").toString()
|
|
167
|
-
```
|
|
150
|
+
**For each entity, create:**
|
|
151
|
+
1. **Collection** — `src/db/collections/<entity>.ts`
|
|
152
|
+
2. **Electric shape proxy route** — `src/routes/api/<entity>.ts` using `proxyElectricRequest()` from `src/lib/electric-proxy.ts`
|
|
153
|
+
3. **Mutation route** — `src/routes/api/mutations/<entity>.ts` using `parseDates()` from `src/db/utils.ts`
|
|
168
154
|
|
|
169
|
-
|
|
155
|
+
**Scaffold-specific patterns:**
|
|
170
156
|
|
|
171
|
-
|
|
157
|
+
Shape proxy routes use the scaffold helper:
|
|
172
158
|
```typescript
|
|
173
|
-
import { createFileRoute } from "@tanstack/react-router"
|
|
174
159
|
import { proxyElectricRequest } from "@/lib/electric-proxy"
|
|
175
|
-
|
|
176
|
-
export const Route = createFileRoute("/api/<entity>")({
|
|
177
|
-
// @ts-expect-error – server.handlers types lag behind runtime support
|
|
178
|
-
server: {
|
|
179
|
-
handlers: {
|
|
180
|
-
GET: async ({ request }: { request: Request }) => {
|
|
181
|
-
return proxyElectricRequest(request, "<table_name>")
|
|
182
|
-
},
|
|
183
|
-
},
|
|
184
|
-
},
|
|
185
|
-
})
|
|
160
|
+
// In GET handler: return proxyElectricRequest(request, "table_name")
|
|
186
161
|
```
|
|
187
162
|
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
## Phase 4: UI Components
|
|
194
|
-
|
|
195
|
-
- Create page routes with `useLiveQuery` — add `ssr: false` to leaf routes (NOT `__root.tsx`)
|
|
196
|
-
- Wrap `useLiveQuery` components in `ClientOnly` when used from `__root.tsx`
|
|
197
|
-
- Use `lucide-react` for icons (NOT `@radix-ui/react-icons`)
|
|
198
|
-
- Style with Radix UI Themes components
|
|
199
|
-
|
|
200
|
-
## Phase 5: Build & Verify
|
|
201
|
-
|
|
202
|
-
Run the build tool:
|
|
203
|
-
```bash
|
|
204
|
-
pnpm run build && pnpm run check
|
|
163
|
+
Mutation routes must use `parseDates()` for JSON date round-trip:
|
|
164
|
+
```typescript
|
|
165
|
+
import { parseDates } from "@/db/utils"
|
|
166
|
+
// const body = parseDates(await request.json())
|
|
205
167
|
```
|
|
206
168
|
|
|
207
|
-
|
|
169
|
+
API routes use `createFileRoute` + `server.handlers` (NOT `createAPIFileRoute`).
|
|
208
170
|
|
|
209
|
-
|
|
171
|
+
---
|
|
210
172
|
|
|
211
|
-
|
|
212
|
-
- `tests/collections.test.ts` — collection insert validation (import from zod-schemas only)
|
|
213
|
-
- JSON round-trip test: `parseDates(JSON.parse(JSON.stringify(row)))` validates correctly
|
|
173
|
+
## Phase 5: UI Components
|
|
214
174
|
|
|
215
|
-
|
|
175
|
+
**Before writing UI code**, read the ui-design skill:
|
|
176
|
+
- `.claude/skills/ui-design/SKILL.md` — design system, Radix UI Themes component patterns
|
|
216
177
|
|
|
217
|
-
|
|
178
|
+
Also read the `react-db` and `meta-framework` skills for hook usage and SSR patterns.
|
|
218
179
|
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
180
|
+
Key constraints:
|
|
181
|
+
- `ssr: false` on leaf routes that use `useLiveQuery` (NEVER on `__root.tsx`)
|
|
182
|
+
- All UI from `@radix-ui/themes` — never raw HTML for interactive elements
|
|
183
|
+
- Icons from `lucide-react` only
|
|
223
184
|
|
|
224
|
-
|
|
225
|
-
## Data Model
|
|
226
|
-
### [Entity] (`table_name`)
|
|
227
|
-
- **Columns**: ...
|
|
228
|
-
- **Relations**: ...
|
|
229
|
-
- **Collection**: src/db/collections/...
|
|
185
|
+
---
|
|
230
186
|
|
|
231
|
-
##
|
|
232
|
-
| Method | Path | File | Purpose |
|
|
187
|
+
## Phase 6: Build, Lint & Test
|
|
233
188
|
|
|
234
|
-
|
|
235
|
-
|
|
189
|
+
```bash
|
|
190
|
+
pnpm run build && pnpm run check
|
|
191
|
+
```
|
|
236
192
|
|
|
237
|
-
|
|
193
|
+
Fix any errors. Then write additional tests:
|
|
194
|
+
- `tests/collections.test.ts` — collection insert validation (import from zod-schemas only)
|
|
195
|
+
- JSON round-trip: `parseDates(JSON.parse(JSON.stringify(row)))` validates correctly
|
|
238
196
|
|
|
239
|
-
|
|
240
|
-
|
|
197
|
+
```bash
|
|
198
|
+
pnpm test
|
|
241
199
|
```
|
|
242
200
|
|
|
243
|
-
|
|
201
|
+
Fix until green.
|
|
202
|
+
|
|
203
|
+
---
|
|
244
204
|
|
|
245
|
-
|
|
205
|
+
## Phase 7: Deploy & Preview
|
|
246
206
|
|
|
207
|
+
Run migrations and start the dev server:
|
|
247
208
|
```bash
|
|
209
|
+
pnpm drizzle-kit generate && pnpm drizzle-kit migrate
|
|
248
210
|
pnpm dev:start
|
|
249
211
|
```
|
|
250
212
|
|
|
251
|
-
**IMPORTANT**: Always use `pnpm dev:start` from the project directory.
|
|
213
|
+
**IMPORTANT**: Always use `pnpm dev:start` from the project directory.
|
|
252
214
|
|
|
253
|
-
After
|
|
215
|
+
After the app is running, write:
|
|
216
|
+
1. `README.md` — overwrite the scaffold README with a project-specific one: app name, one-line description, screenshot placeholder, how to run (`pnpm install && pnpm dev:start`), tech stack (Electric SQL, TanStack DB, Drizzle, TanStack Start), and a brief feature list.
|
|
217
|
+
2. `ARCHITECTURE.md` — brief reference: entities, routes, components.
|
|
254
218
|
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
-
|
|
258
|
-
|
|
259
|
-
- NEVER use `z.coerce.date()` — creates ZodEffects rejected by TanStack DB
|
|
260
|
-
- Mutation routes MUST use `parseDates(await request.json())`
|
|
261
|
-
- PUT/PATCH: destructure out `created_at`, `updated_at` before spreading
|
|
262
|
-
- `shapeOptions.url` MUST be absolute URL
|
|
263
|
-
- API routes use `createFileRoute` + `server.handlers` — NOT `createAPIFileRoute` or `createServerFileRoute`
|
|
264
|
-
- Icons from `lucide-react` only
|
|
265
|
-
- `ssr: false` on leaf routes with `useLiveQuery`, NEVER on `__root.tsx`
|
|
266
|
-
- `ClientOnly` wrapper for `useLiveQuery` in `__root.tsx`
|
|
267
|
-
- Schema tests: import from `@/db/zod-schemas` only, NEVER from collections or `@/db`
|
|
268
|
-
|
|
269
|
-
## Drizzle Workflow Order (ALWAYS follow)
|
|
270
|
-
|
|
271
|
-
1. Edit `src/db/schema.ts`
|
|
272
|
-
2. Edit `src/db/zod-schemas.ts` (derive via drizzle-zod)
|
|
273
|
-
3. `pnpm drizzle-kit generate && pnpm drizzle-kit migrate`
|
|
274
|
-
4. Create collections
|
|
275
|
-
5. Create API routes (proxy + mutation)
|
|
276
|
-
6. Create UI components
|
|
219
|
+
Then invoke the UI design skill for interactive refinement:
|
|
220
|
+
```
|
|
221
|
+
/ui-design
|
|
222
|
+
```
|
|
277
223
|
|
|
278
|
-
|
|
224
|
+
---
|
|
279
225
|
|
|
280
|
-
|
|
226
|
+
## Scaffold Gotchas (not in playbooks)
|
|
281
227
|
|
|
282
|
-
|
|
283
|
-
- **The app MUST bind to `0.0.0.0`**, not `localhost`. This is pre-configured in `vite.config.ts` via `host: true`.
|
|
284
|
-
- **`allowedHosts: true`** is set in `vite.config.ts` so that Sprite hostnames (`*.sprites.app`) can access the dev server. Without this, Vite rejects requests from non-localhost origins.
|
|
285
|
-
- **The preview URL** follows the pattern: `https://<sprite-name>.sprites.app`
|
|
286
|
-
- **`vite.config.ts` is pre-configured** with `port`, `host: true`, `allowedHosts: true`, and the Electric proxy — **DO NOT MODIFY it**. Changing it WILL break the preview.
|
|
228
|
+
These are specific to this scaffold and NOT covered by playbook skills:
|
|
287
229
|
|
|
288
|
-
|
|
230
|
+
1. **`zod/v4` import** — Always `import { z } from "zod/v4"`, never `"zod"`. Playbooks show `"zod"` but drizzle-zod 0.8.x in this project requires the v4 subpath export.
|
|
289
231
|
|
|
290
|
-
|
|
232
|
+
2. **Protected files — DO NOT MODIFY:**
|
|
233
|
+
docker-compose.yml, vite.config.ts, tsconfig.json, biome.json, pnpm-lock.yaml, postgres.conf, vitest.config.ts, Caddyfile, drizzle.config.ts, src/db/index.ts, src/db/utils.ts, src/lib/electric-proxy.ts, src/components/ClientOnly.tsx, tests/helpers/schema-test-utils.ts
|
|
291
234
|
|
|
292
|
-
|
|
235
|
+
3. **Import rules:**
|
|
236
|
+
- `"lucide-react"` for icons (NOT @radix-ui/react-icons)
|
|
237
|
+
- `"@radix-ui/themes"` for components (NOT @radix-ui/react-*)
|
|
238
|
+
- `"react-router"` for routing (NOT react-router-dom)
|
|
293
239
|
|
|
294
|
-
|
|
295
|
-
-
|
|
296
|
-
-
|
|
297
|
-
- `src/components/ClientOnly.tsx` — SSR wrapper
|
|
298
|
-
- `tests/helpers/schema-test-utils.ts` — generateValidRow/generateRowWithout
|
|
299
|
-
- `vitest.config.ts` — test config
|
|
300
|
-
- `vite.config.ts` — Vite dev server (port, host, allowedHosts, proxy — see Deployment section)
|
|
301
|
-
- `docker-compose.yml` — Postgres + Electric
|
|
302
|
-
- `drizzle.config.ts` — Drizzle config
|
|
240
|
+
4. **Dependency rules:**
|
|
241
|
+
- NEVER remove existing dependencies from package.json
|
|
242
|
+
- Only add new dependencies
|
|
@@ -0,0 +1,325 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: ui-design
|
|
3
|
+
description: Iterate on the UI design of an Electric SQL app. Reviews current components against Radix UI Themes best practices, suggests improvements, and applies changes interactively. Use after the app is generated to polish the UI.
|
|
4
|
+
allowed-tools: Read, Write, Edit, Bash, Glob, Grep, AskUserQuestion
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# UI Design — Interactive Iteration
|
|
8
|
+
|
|
9
|
+
You are helping the user improve the UI of their Electric SQL app. This skill loads the design system and component patterns, then enters an interactive loop to refine the interface.
|
|
10
|
+
|
|
11
|
+
## Step 1: Audit Current UI
|
|
12
|
+
|
|
13
|
+
Read all route and component files to understand the current UI:
|
|
14
|
+
|
|
15
|
+
```
|
|
16
|
+
Glob pattern: src/routes/**/*.tsx
|
|
17
|
+
Glob pattern: src/components/**/*.tsx
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
For each file, check against the rules below and note violations.
|
|
21
|
+
|
|
22
|
+
## Step 2: Present Findings
|
|
23
|
+
|
|
24
|
+
Show the user a brief summary:
|
|
25
|
+
- What looks good (patterns already followed)
|
|
26
|
+
- What needs improvement (specific violations with file:line references)
|
|
27
|
+
- Quick wins (changes that would have the biggest visual impact)
|
|
28
|
+
|
|
29
|
+
## Step 3: Interactive Loop
|
|
30
|
+
|
|
31
|
+
Ask the user what they want to focus on. Suggestions:
|
|
32
|
+
- Fix all anti-pattern violations
|
|
33
|
+
- Improve a specific page/component
|
|
34
|
+
- Change the overall aesthetic direction
|
|
35
|
+
- Add missing UI patterns (empty states, loading, delete confirmations)
|
|
36
|
+
|
|
37
|
+
Apply changes, then ask for the next iteration. Repeat until the user is satisfied.
|
|
38
|
+
|
|
39
|
+
---
|
|
40
|
+
|
|
41
|
+
# Design System Reference
|
|
42
|
+
|
|
43
|
+
## Default Electric Theme
|
|
44
|
+
|
|
45
|
+
The `__root.tsx` `<Theme>` wrapper MUST use the Electric brand defaults:
|
|
46
|
+
|
|
47
|
+
```tsx
|
|
48
|
+
<Theme accentColor="violet" grayColor="mauve" radius="medium" panelBackground="translucent">
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
- `accentColor="violet"` — Electric brand purple
|
|
52
|
+
- `grayColor="mauve"` — gray with violet undertone, cohesive with accent
|
|
53
|
+
- `radius="medium"` — balanced, professional corners
|
|
54
|
+
- `panelBackground="translucent"` — subtle depth on surfaces
|
|
55
|
+
|
|
56
|
+
If `__root.tsx` has a different `accentColor` (e.g. `"blue"`), change it to the values above.
|
|
57
|
+
|
|
58
|
+
CSS custom properties in `styles.css` for Electric brand colors not covered by Radix tokens:
|
|
59
|
+
|
|
60
|
+
```css
|
|
61
|
+
:root {
|
|
62
|
+
--electric-brand: #d0bcff;
|
|
63
|
+
--electric-teal: #00d2a0;
|
|
64
|
+
}
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
---
|
|
68
|
+
|
|
69
|
+
## Design Thinking
|
|
70
|
+
|
|
71
|
+
### Design Direction
|
|
72
|
+
|
|
73
|
+
Before making changes, commit to a coherent aesthetic:
|
|
74
|
+
- Understand the app's purpose and audience
|
|
75
|
+
- The Electric theme provides a polished violet-on-dark foundation — lean into it
|
|
76
|
+
- Pick a direction that complements the Electric brand: clean professional, modern minimal, or dark moody work best
|
|
77
|
+
- Every detail must serve that direction — fonts, colors, spacing, component variants
|
|
78
|
+
|
|
79
|
+
### Typography Rules
|
|
80
|
+
|
|
81
|
+
- NEVER add spacing props on text elements — use `gap` on parent Flex (capsize rule)
|
|
82
|
+
- Work the full typographic range: size, weight, color to establish hierarchy
|
|
83
|
+
- Heading `size="7"` or `size="8"` for page titles, `size="5"` or `size="6"` for section titles, `size="3"` or `size="4"` for labels
|
|
84
|
+
- Use `color="gray"` for secondary text, `weight="medium"` for emphasis
|
|
85
|
+
|
|
86
|
+
### Color with Conviction
|
|
87
|
+
|
|
88
|
+
- NEVER: timid evenly-distributed palettes, gray-on-gray everything, random accent colors
|
|
89
|
+
- INSTEAD: use the Theme's `accentColor` intentionally — primary actions get accent, secondary get `color="gray"`, destructive get `color="red"`
|
|
90
|
+
- Use Badge `variant="soft"` with semantic colors: green=success, orange=warning, red=error, blue=info
|
|
91
|
+
- Dark backgrounds via `Card variant="surface"` — do not manually set background colors
|
|
92
|
+
|
|
93
|
+
### Spatial Composition
|
|
94
|
+
|
|
95
|
+
- NEVER: everything centered, uniform padding, flat visual hierarchy
|
|
96
|
+
- INSTEAD: use `justify="between"` for page headers (title left, actions right), consistent gap scale (2=tight, 3=default, 4=comfortable, 6=section), visual weight through Card/Table surfaces
|
|
97
|
+
|
|
98
|
+
### Anti-patterns (NEVER do)
|
|
99
|
+
|
|
100
|
+
- Raw HTML elements (`<button>`, `<input>`, `<table>`) — always use Radix components
|
|
101
|
+
- Inline `style={{}}` for spacing/colors — use Radix props (p, m, gap, color, variant)
|
|
102
|
+
- Empty pages with just text — always provide empty states with icon + message + action
|
|
103
|
+
- Giant forms without structure — group related fields, use Dialog for create/edit
|
|
104
|
+
- Tables without visual anchoring — use `variant="surface"` or Card wrappers
|
|
105
|
+
|
|
106
|
+
### Import Rules
|
|
107
|
+
|
|
108
|
+
- Use `@radix-ui/themes` for all components (NOT `@radix-ui/react-*`)
|
|
109
|
+
- Use `lucide-react` for icons (NOT `@radix-ui/react-icons`)
|
|
110
|
+
- NEVER add spacing props directly on Text/Heading — use `gap` on parent Flex
|
|
111
|
+
|
|
112
|
+
---
|
|
113
|
+
|
|
114
|
+
## Component Patterns
|
|
115
|
+
|
|
116
|
+
Copy-paste-ready patterns using `@radix-ui/themes` and `lucide-react`.
|
|
117
|
+
|
|
118
|
+
### Pattern 1: Page Layout
|
|
119
|
+
|
|
120
|
+
Standard page shell with header row.
|
|
121
|
+
|
|
122
|
+
```tsx
|
|
123
|
+
import { Container, Flex, Heading, Button } from "@radix-ui/themes"
|
|
124
|
+
import { Plus } from "lucide-react"
|
|
125
|
+
|
|
126
|
+
<Container size="3" py="6">
|
|
127
|
+
<Flex direction="column" gap="5">
|
|
128
|
+
<Flex justify="between" align="center">
|
|
129
|
+
<Heading size="6">Items</Heading>
|
|
130
|
+
<Button><Plus size={16} /> Add Item</Button>
|
|
131
|
+
</Flex>
|
|
132
|
+
{/* data table or card list */}
|
|
133
|
+
</Flex>
|
|
134
|
+
</Container>
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
### Pattern 2: Data Table
|
|
138
|
+
|
|
139
|
+
Table with status badges and row-level actions.
|
|
140
|
+
|
|
141
|
+
```tsx
|
|
142
|
+
import { Table, Text, Badge, Flex, IconButton } from "@radix-ui/themes"
|
|
143
|
+
import { Pencil, Trash2 } from "lucide-react"
|
|
144
|
+
|
|
145
|
+
<Table.Root variant="surface">
|
|
146
|
+
<Table.Header>
|
|
147
|
+
<Table.Row>
|
|
148
|
+
<Table.ColumnHeaderCell>Name</Table.ColumnHeaderCell>
|
|
149
|
+
<Table.ColumnHeaderCell>Status</Table.ColumnHeaderCell>
|
|
150
|
+
<Table.ColumnHeaderCell width="80px" />
|
|
151
|
+
</Table.Row>
|
|
152
|
+
</Table.Header>
|
|
153
|
+
<Table.Body>
|
|
154
|
+
{items.map(item => (
|
|
155
|
+
<Table.Row key={item.id}>
|
|
156
|
+
<Table.Cell><Text weight="medium">{item.name}</Text></Table.Cell>
|
|
157
|
+
<Table.Cell>
|
|
158
|
+
<Badge color={item.done ? "green" : "orange"} variant="soft">
|
|
159
|
+
{item.done ? "Done" : "Pending"}
|
|
160
|
+
</Badge>
|
|
161
|
+
</Table.Cell>
|
|
162
|
+
<Table.Cell>
|
|
163
|
+
<Flex gap="2">
|
|
164
|
+
<IconButton size="1" variant="ghost" onClick={...}>
|
|
165
|
+
<Pencil size={14} />
|
|
166
|
+
</IconButton>
|
|
167
|
+
<IconButton size="1" variant="ghost" color="red" onClick={...}>
|
|
168
|
+
<Trash2 size={14} />
|
|
169
|
+
</IconButton>
|
|
170
|
+
</Flex>
|
|
171
|
+
</Table.Cell>
|
|
172
|
+
</Table.Row>
|
|
173
|
+
))}
|
|
174
|
+
</Table.Body>
|
|
175
|
+
</Table.Root>
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
### Pattern 3: Card List
|
|
179
|
+
|
|
180
|
+
For rich content or mobile-friendly layouts.
|
|
181
|
+
|
|
182
|
+
```tsx
|
|
183
|
+
import { Card, Flex, Text, Badge } from "@radix-ui/themes"
|
|
184
|
+
|
|
185
|
+
<Flex direction="column" gap="3">
|
|
186
|
+
{items.map(item => (
|
|
187
|
+
<Card key={item.id}>
|
|
188
|
+
<Flex justify="between" align="center">
|
|
189
|
+
<Flex direction="column" gap="1">
|
|
190
|
+
<Text weight="medium">{item.title}</Text>
|
|
191
|
+
<Text size="2" color="gray">{item.description}</Text>
|
|
192
|
+
</Flex>
|
|
193
|
+
<Badge variant="soft" color="blue">{item.category}</Badge>
|
|
194
|
+
</Flex>
|
|
195
|
+
</Card>
|
|
196
|
+
))}
|
|
197
|
+
</Flex>
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
### Pattern 4: Create/Edit Dialog
|
|
201
|
+
|
|
202
|
+
```tsx
|
|
203
|
+
import { Dialog, Flex, Text, TextField, Select, Button } from "@radix-ui/themes"
|
|
204
|
+
|
|
205
|
+
<Dialog.Root open={open} onOpenChange={setOpen}>
|
|
206
|
+
<Dialog.Trigger><Button>Add Item</Button></Dialog.Trigger>
|
|
207
|
+
<Dialog.Content maxWidth="450px">
|
|
208
|
+
<Dialog.Title>New Item</Dialog.Title>
|
|
209
|
+
<Flex direction="column" gap="4" mt="4">
|
|
210
|
+
<label>
|
|
211
|
+
<Text size="2" weight="medium" as="div" mb="1">Name</Text>
|
|
212
|
+
<TextField.Root placeholder="Enter name" value={name}
|
|
213
|
+
onChange={e => setName(e.target.value)} />
|
|
214
|
+
</label>
|
|
215
|
+
<label>
|
|
216
|
+
<Text size="2" weight="medium" as="div" mb="1">Category</Text>
|
|
217
|
+
<Select.Root value={category} onValueChange={setCategory}>
|
|
218
|
+
<Select.Trigger placeholder="Select category" />
|
|
219
|
+
<Select.Content>
|
|
220
|
+
<Select.Item value="a">Category A</Select.Item>
|
|
221
|
+
<Select.Item value="b">Category B</Select.Item>
|
|
222
|
+
</Select.Content>
|
|
223
|
+
</Select.Root>
|
|
224
|
+
</label>
|
|
225
|
+
<Flex gap="3" justify="end" mt="2">
|
|
226
|
+
<Dialog.Close>
|
|
227
|
+
<Button variant="soft" color="gray">Cancel</Button>
|
|
228
|
+
</Dialog.Close>
|
|
229
|
+
<Button onClick={handleSubmit}>Save</Button>
|
|
230
|
+
</Flex>
|
|
231
|
+
</Flex>
|
|
232
|
+
</Dialog.Content>
|
|
233
|
+
</Dialog.Root>
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
### Pattern 5: Empty State
|
|
237
|
+
|
|
238
|
+
```tsx
|
|
239
|
+
import { Flex, Text, Button } from "@radix-ui/themes"
|
|
240
|
+
import { Inbox } from "lucide-react"
|
|
241
|
+
|
|
242
|
+
<Flex direction="column" align="center" gap="3" py="9">
|
|
243
|
+
<Inbox size={48} strokeWidth={1} color="var(--gray-8)" />
|
|
244
|
+
<Text size="4" color="gray">No items yet</Text>
|
|
245
|
+
<Button variant="soft" onClick={...}>Create your first item</Button>
|
|
246
|
+
</Flex>
|
|
247
|
+
```
|
|
248
|
+
|
|
249
|
+
### Pattern 6: Delete Confirmation
|
|
250
|
+
|
|
251
|
+
```tsx
|
|
252
|
+
import { AlertDialog, Flex, Button } from "@radix-ui/themes"
|
|
253
|
+
|
|
254
|
+
<AlertDialog.Root open={!!deleteTarget} onOpenChange={...}>
|
|
255
|
+
<AlertDialog.Content maxWidth="400px">
|
|
256
|
+
<AlertDialog.Title>Delete Item</AlertDialog.Title>
|
|
257
|
+
<AlertDialog.Description size="2">
|
|
258
|
+
This action cannot be undone.
|
|
259
|
+
</AlertDialog.Description>
|
|
260
|
+
<Flex gap="3" justify="end" mt="4">
|
|
261
|
+
<AlertDialog.Cancel>
|
|
262
|
+
<Button variant="soft" color="gray">Cancel</Button>
|
|
263
|
+
</AlertDialog.Cancel>
|
|
264
|
+
<AlertDialog.Action>
|
|
265
|
+
<Button color="red" onClick={handleDelete}>Delete</Button>
|
|
266
|
+
</AlertDialog.Action>
|
|
267
|
+
</Flex>
|
|
268
|
+
</AlertDialog.Content>
|
|
269
|
+
</AlertDialog.Root>
|
|
270
|
+
```
|
|
271
|
+
|
|
272
|
+
### Pattern 7: Loading State
|
|
273
|
+
|
|
274
|
+
```tsx
|
|
275
|
+
import { Flex, Spinner } from "@radix-ui/themes"
|
|
276
|
+
|
|
277
|
+
<Flex align="center" justify="center" py="9">
|
|
278
|
+
<Spinner size="3" />
|
|
279
|
+
</Flex>
|
|
280
|
+
```
|
|
281
|
+
|
|
282
|
+
### Pattern 8: Multi-section Navigation
|
|
283
|
+
|
|
284
|
+
```tsx
|
|
285
|
+
import { TabNav } from "@radix-ui/themes"
|
|
286
|
+
|
|
287
|
+
<TabNav.Root>
|
|
288
|
+
<TabNav.Link href="/tasks" active={pathname === "/tasks"}>Tasks</TabNav.Link>
|
|
289
|
+
<TabNav.Link href="/settings" active={pathname === "/settings"}>Settings</TabNav.Link>
|
|
290
|
+
</TabNav.Root>
|
|
291
|
+
```
|
|
292
|
+
|
|
293
|
+
### Pattern 9: Responsive Grid Layout
|
|
294
|
+
|
|
295
|
+
```tsx
|
|
296
|
+
import { Grid, Card } from "@radix-ui/themes"
|
|
297
|
+
|
|
298
|
+
<Grid columns={{ initial: "1", sm: "2", md: "3" }} gap="4">
|
|
299
|
+
{items.map(item => (
|
|
300
|
+
<Card key={item.id}>...</Card>
|
|
301
|
+
))}
|
|
302
|
+
</Grid>
|
|
303
|
+
```
|
|
304
|
+
|
|
305
|
+
---
|
|
306
|
+
|
|
307
|
+
## Component Quick Reference
|
|
308
|
+
|
|
309
|
+
| Need | Use | Key props |
|
|
310
|
+
|------|-----|-----------|
|
|
311
|
+
| Data list (many cols) | `Table.Root` | `variant="surface"` |
|
|
312
|
+
| Data list (rich content) | Card list in Flex | `direction="column" gap="3"` |
|
|
313
|
+
| Grid of cards | `Grid` | `columns={{ initial: "1", sm: "2", md: "3" }}` |
|
|
314
|
+
| Create/Edit forms | `Dialog` | `maxWidth="450px"` |
|
|
315
|
+
| Destructive confirm | `AlertDialog` | `maxWidth="400px"` |
|
|
316
|
+
| Status indicator | `Badge` | `variant="soft" color="green/orange/red"` |
|
|
317
|
+
| Primary action | `Button` | default (solid variant) |
|
|
318
|
+
| Secondary action | `Button` | `variant="soft" color="gray"` |
|
|
319
|
+
| Row-level action | `IconButton` | `size="1" variant="ghost"` |
|
|
320
|
+
| Page wrapper | `Container` | `size="2"` or `size="3"` with `py="6"` |
|
|
321
|
+
| Vertical stack | `Flex` | `direction="column" gap="3-5"` |
|
|
322
|
+
| Page header row | `Flex` | `justify="between" align="center"` |
|
|
323
|
+
| Multi-section nav | `TabNav` | with `active` prop on links |
|
|
324
|
+
| Loading | `Spinner` | `size="3"` centered |
|
|
325
|
+
| Empty state | Flex + icon + Text + Button | centered with `py="9"` |
|