@withmata/blueprints 0.3.5 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. package/.claude/skills/audit/SKILL.md +4 -4
  2. package/.claude/skills/blueprint-catalog/SKILL.md +17 -7
  3. package/.claude/skills/copywrite/SKILL.md +187 -0
  4. package/.claude/skills/copywrite-landing/SKILL.md +489 -0
  5. package/.claude/skills/design-system/SKILL.md +970 -0
  6. package/.claude/skills/new-project/SKILL.md +168 -112
  7. package/.claude/skills/scaffold-auth/SKILL.md +9 -9
  8. package/.claude/skills/scaffold-db/SKILL.md +14 -14
  9. package/.claude/skills/scaffold-env/SKILL.md +4 -4
  10. package/.claude/skills/scaffold-foundation/SKILL.md +15 -15
  11. package/.claude/skills/scaffold-tailwind/SKILL.md +17 -3
  12. package/.claude/skills/scaffold-ui/SKILL.md +155 -36
  13. package/ENGINEERING.md +2 -2
  14. package/blueprints/discovery/design-system/BLUEPRINT.md +1479 -0
  15. package/blueprints/discovery/marketing-copywriting/BLUEPRINT.md +664 -0
  16. package/blueprints/features/auth-better-auth/BLUEPRINT.md +20 -22
  17. package/blueprints/features/db-drizzle-postgres/BLUEPRINT.md +12 -12
  18. package/blueprints/features/db-drizzle-postgres/files/db/src/example-entity.ts +1 -1
  19. package/blueprints/features/db-drizzle-postgres/files/db/src/scripts/seed.ts +1 -1
  20. package/blueprints/features/env-t3/BLUEPRINT.md +1 -1
  21. package/blueprints/features/tailwind-v4/BLUEPRINT.md +9 -2
  22. package/blueprints/features/tailwind-v4/files/tailwind-config/shared-styles.css +80 -1
  23. package/blueprints/features/ui-shared-components/BLUEPRINT.md +411 -78
  24. package/blueprints/features/ui-shared-components/files/ui/components/ui/alert-dialog.tsx +192 -0
  25. package/blueprints/features/ui-shared-components/files/ui/components/ui/avatar.tsx +71 -0
  26. package/blueprints/features/ui-shared-components/files/ui/components/ui/badge.tsx +52 -0
  27. package/blueprints/features/ui-shared-components/files/ui/components/ui/breadcrumb.tsx +122 -0
  28. package/blueprints/features/ui-shared-components/files/ui/components/ui/button.tsx +56 -0
  29. package/blueprints/features/ui-shared-components/files/ui/components/ui/card-select.tsx +72 -0
  30. package/blueprints/features/ui-shared-components/files/ui/components/ui/card.tsx +100 -0
  31. package/blueprints/features/ui-shared-components/files/ui/components/ui/collapsible.tsx +34 -0
  32. package/blueprints/features/ui-shared-components/files/ui/components/ui/combobox.tsx +301 -0
  33. package/blueprints/features/ui-shared-components/files/ui/components/ui/dropdown-menu.tsx +264 -0
  34. package/blueprints/features/ui-shared-components/files/ui/components/ui/empty-state.tsx +43 -0
  35. package/blueprints/features/ui-shared-components/files/ui/components/ui/entity-select.tsx +110 -0
  36. package/blueprints/features/ui-shared-components/files/ui/components/ui/field.tsx +237 -0
  37. package/blueprints/features/ui-shared-components/files/ui/components/ui/form-field.tsx +217 -0
  38. package/blueprints/features/ui-shared-components/files/ui/components/ui/input-group.tsx +161 -0
  39. package/blueprints/features/ui-shared-components/files/ui/components/ui/input.tsx +20 -0
  40. package/blueprints/features/ui-shared-components/files/ui/components/ui/label.tsx +20 -0
  41. package/blueprints/features/ui-shared-components/files/ui/components/ui/org-switcher.tsx +114 -0
  42. package/blueprints/features/ui-shared-components/files/ui/components/ui/page-header.tsx +45 -0
  43. package/blueprints/features/ui-shared-components/files/ui/components/ui/pagination.tsx +52 -0
  44. package/blueprints/features/ui-shared-components/files/ui/components/ui/pill-select.tsx +151 -0
  45. package/blueprints/features/ui-shared-components/files/ui/components/ui/popover.tsx +41 -0
  46. package/blueprints/features/ui-shared-components/files/ui/components/ui/search-input.tsx +49 -0
  47. package/blueprints/features/ui-shared-components/files/ui/components/ui/select.tsx +205 -0
  48. package/blueprints/features/ui-shared-components/files/ui/components/ui/selected-entity-card.tsx +47 -0
  49. package/blueprints/features/ui-shared-components/files/ui/components/ui/separator.tsx +25 -0
  50. package/blueprints/features/ui-shared-components/files/ui/components/ui/sidebar.tsx +389 -0
  51. package/blueprints/features/ui-shared-components/files/ui/components/ui/status-filter.tsx +43 -0
  52. package/blueprints/features/ui-shared-components/files/ui/components/ui/tag-input.tsx +131 -0
  53. package/blueprints/features/ui-shared-components/files/ui/components/ui/textarea.tsx +18 -0
  54. package/blueprints/features/ui-shared-components/files/ui/components/ui/user-menu.tsx +149 -0
  55. package/blueprints/features/ui-shared-components/files/ui/components.json +11 -8
  56. package/blueprints/features/ui-shared-components/files/ui/package.json +20 -11
  57. package/blueprints/foundation/monorepo-turbo/BLUEPRINT.md +19 -20
  58. package/blueprints/foundation/monorepo-turbo/files/root/package.json +1 -1
  59. package/dist/index.js +27 -10
  60. package/package.json +1 -1
  61. package/blueprints/features/tailwind-v4/files/tailwind-config/package.json +0 -20
  62. package/blueprints/foundation/monorepo-turbo/files/root/pnpm-workspace.yaml +0 -5
@@ -17,7 +17,7 @@ Complete.
17
17
  | Blueprint | Type | Why |
18
18
  |-----------|------|-----|
19
19
  | `features/db-drizzle-postgres` | required | Auth creates schema files inside the database layer following the schema-group pattern (per-group drizzle.config.ts, barrel exports, explicit schema lists). Without it, auth must create a minimal db structure that lacks the full patterns. |
20
- | `foundation/monorepo-turbo` | recommended | Provides monorepo workspace structure (packages/, apis/, turbo tasks, pnpm workspaces). Works without it — adapts to single-repo projects automatically. |
20
+ | `foundation/monorepo-turbo` | recommended | Provides monorepo workspace structure (packages/, apis/, turbo tasks, bun workspaces). Works without it — adapts to single-repo projects automatically. |
21
21
 
22
22
  ### If `db-drizzle-postgres` is not installed
23
23
 
@@ -210,7 +210,7 @@ In production, this proxies `/api/*` through the frontend domain so cookies work
210
210
  "scripts": {
211
211
  "auth:generate": "turbo run auth:generate --filter={{SCOPE}}/server --no-cache",
212
212
  "auth:migrate": "turbo run auth:migrate --filter={{SCOPE}}/db --no-cache",
213
- "auth:setup": "pnpm run auth:generate && pnpm run auth:migrate"
213
+ "auth:setup": "bun run auth:generate && bun run auth:migrate"
214
214
  }
215
215
  }
216
216
  ```
@@ -226,15 +226,13 @@ In production, this proxies `/api/*` through the frontend domain so cookies work
226
226
  }
227
227
  ```
228
228
 
229
- ### `pnpm-workspace.yaml`
229
+ ### Workspace Configuration
230
230
 
231
- Ensure `apis/*` is included (for standalone server mode):
232
- ```yaml
233
- packages:
234
- - "apps/*"
235
- - "apis/*"
236
- - "packages/*"
237
- - "config/*"
231
+ Ensure `apis/*` is included in the workspace configuration (for standalone server mode). In the root `package.json`:
232
+ ```json
233
+ {
234
+ "workspaces": ["apps/*", "apis/*", "packages/*", "config/*"]
235
+ }
238
236
  ```
239
237
 
240
238
  ---
@@ -276,7 +274,7 @@ Single-repo projects typically use **Next.js API routes** directly instead of a
276
274
  "scripts": {
277
275
  "auth:generate": "npx @better-auth/cli@latest generate --config ./src/lib/auth/index.ts --output ./src/db/auth/schema.ts --yes",
278
276
  "auth:migrate": "drizzle-kit generate --config ./drizzle/auth/drizzle.config.ts && drizzle-kit migrate --config ./drizzle/auth/drizzle.config.ts",
279
- "auth:setup": "pnpm auth:generate && pnpm auth:migrate"
277
+ "auth:setup": "bun auth:generate && bun auth:migrate"
280
278
  }
281
279
  }
282
280
  ```
@@ -719,26 +717,26 @@ Rules that should be added to the target project's CLAUDE.md during scaffolding.
719
717
 
720
718
  | When you... | Then run... | Why |
721
719
  |---|---|---|
722
- | Modify the Better Auth server config (`auth.ts`) — plugins, providers, fields, session settings | `pnpm auth:generate` then `pnpm auth:migrate` | Config changes can alter the database schema |
723
- | Add or remove a social provider | `pnpm auth:generate` | Provider changes affect the account schema |
724
- | Change organization plugin settings (roles, limits, membership config) | `pnpm auth:generate` then `pnpm auth:migrate` | Org config changes affect member/invitation tables |
725
- | Edit `auth-schema.ts` manually | `pnpm auth:migrate` | Manual schema edits need migrations applied |
726
- | Update the `better-auth` package version | `pnpm auth:generate` then check for schema diff, migrate if needed | New versions may include schema changes |
720
+ | Modify the Better Auth server config (`auth.ts`) — plugins, providers, fields, session settings | `bun auth:generate` then `bun auth:migrate` | Config changes can alter the database schema |
721
+ | Add or remove a social provider | `bun auth:generate` | Provider changes affect the account schema |
722
+ | Change organization plugin settings (roles, limits, membership config) | `bun auth:generate` then `bun auth:migrate` | Org config changes affect member/invitation tables |
723
+ | Edit `auth-schema.ts` manually | `bun auth:migrate` | Manual schema edits need migrations applied |
724
+ | Update the `better-auth` package version | `bun auth:generate` then check for schema diff, migrate if needed | New versions may include schema changes |
727
725
 
728
726
  ### Environment Hooks
729
727
 
730
728
  | When you... | Then run... | Why |
731
729
  |---|---|---|
732
- | Add a new env var to server `env.ts` | Add it to all relevant `.env` files and verify with `pnpm dev` | Missing env vars crash at startup due to t3-env validation |
730
+ | Add a new env var to server `env.ts` | Add it to all relevant `.env` files and verify with `bun dev` | Missing env vars crash at startup due to t3-env validation |
733
731
  | Add a new `NEXT_PUBLIC_` env var | Add to `apps/web/.env.local` and restart dev server | Next.js requires restart to pick up new env vars |
734
732
  | Change `BETTER_AUTH_URL` or `FRONTEND_DOMAIN` | Update CORS config and verify OAuth callback URLs still work | Mismatched URLs break OAuth flows and cookie sharing |
735
733
 
736
734
  ### Validation Checks
737
735
 
738
736
  After any auth-related changes, verify:
739
- - Dev server starts without errors: `pnpm dev`
737
+ - Dev server starts without errors: `bun dev`
740
738
  - Auth API responds: visit `{BETTER_AUTH_URL}/api/auth/ok`
741
- - If schema changed: `pnpm drizzle:studio:auth` shows expected tables
739
+ - If schema changed: `bun drizzle:studio:auth` shows expected tables
742
740
  - If middleware changed: unauthenticated requests to protected routes redirect to `/auth`
743
741
  - If org plugin changed: verify org creation and member invitation flows
744
742
 
@@ -747,9 +745,9 @@ After any auth-related changes, verify:
747
745
  This is the version that gets injected into the target project's CLAUDE.md during scaffolding:
748
746
  ```markdown
749
747
  ### auth-better-auth maintenance
750
- - After modifying Better Auth server config, plugins, or providers: run `pnpm auth:generate && pnpm auth:migrate`
751
- - After updating `better-auth` package: run `pnpm auth:generate`, check for schema changes, migrate if needed
752
- - After adding/changing env vars: update all `.env` files and verify `pnpm dev` starts clean
748
+ - After modifying Better Auth server config, plugins, or providers: run `bun auth:generate && bun auth:migrate`
749
+ - After updating `better-auth` package: run `bun auth:generate`, check for schema changes, migrate if needed
750
+ - After adding/changing env vars: update all `.env` files and verify `bun dev` starts clean
753
751
  - After changing `BETTER_AUTH_URL` or `FRONTEND_DOMAIN`: verify CORS config and OAuth callback URLs
754
752
  - After any auth changes: verify `{BETTER_AUTH_URL}/api/auth/ok` responds
755
753
  - Never edit the auto-generated auth schema directly — modify the Better Auth config and regenerate
@@ -443,8 +443,8 @@ uniqueIndex("entity_slug_unique").on(table.slug),
443
443
 
444
444
  14. Add `{{GROUP}}:generate`, `{{GROUP}}:migrate` tasks to `turbo.json` (both `cache: false`)
445
445
  15. Add `db:generate`, `db:migrate`, `db:studio`, `db:seed` scripts to root `package.json` (Turbo wrappers)
446
- 16. Verify `packages/db` is covered by `pnpm-workspace.yaml` (should be via `packages/*`)
447
- 17. Run `pnpm install` to wire workspace dependencies
446
+ 16. Verify `packages/db` is covered by the workspace configuration in root `package.json` (should be via `packages/*`)
447
+ 17. Run `bun install` to wire workspace dependencies
448
448
 
449
449
  ### Phase 5-alt: Project Integration (single-repo)
450
450
 
@@ -457,10 +457,10 @@ uniqueIndex("entity_slug_unique").on(table.slug),
457
457
  ### Phase 6: Verification
458
458
 
459
459
  18. Set `{{GROUP_UPPER}}_DATABASE_URL` in `packages/db/.env`
460
- 19. Run `pnpm db:generate` — should produce initial migration SQL
461
- 20. Run `pnpm db:migrate` — should apply migration to database
462
- 21. Run `pnpm db:studio` — should open Drizzle Studio
463
- 22. Run `pnpm db:seed` — should insert sample data (if seed included)
460
+ 19. Run `bun db:generate` — should produce initial migration SQL
461
+ 20. Run `bun db:migrate` — should apply migration to database
462
+ 21. Run `bun db:studio` — should open Drizzle Studio
463
+ 22. Run `bun db:seed` — should insert sample data (if seed included)
464
464
 
465
465
  ---
466
466
 
@@ -471,8 +471,8 @@ After initial scaffolding, add new domain entities with this checklist:
471
471
  1. Create `src/{{GROUP}}/new-entity.ts` (copy the example entity pattern)
472
472
  2. Add `export * from "./new-entity.js";` to `src/{{GROUP}}/index.ts`
473
473
  3. Add `"./src/{{GROUP}}/new-entity.ts"` to `drizzle/{{GROUP}}/drizzle.config.ts` schema array
474
- 4. Run `pnpm {{GROUP}}:generate` to create the migration
475
- 5. Run `pnpm {{GROUP}}:migrate` to apply it
474
+ 4. Run `bun {{GROUP}}:generate` to create the migration
475
+ 5. Run `bun {{GROUP}}:migrate` to apply it
476
476
 
477
477
  ## Adding a New Schema Group
478
478
 
@@ -501,23 +501,23 @@ To add a second group (e.g., `"pipeline"`) for a separate database or logical do
501
501
  | When you... | Then run... | Why |
502
502
  |---|---|---|
503
503
  | Add a new entity file | Add to `drizzle.config.ts` schema array AND `index.ts` barrel | Missing entries = invisible to migrations and consumers |
504
- | Modify any schema file | `pnpm {{GROUP}}:generate` then `pnpm {{GROUP}}:migrate` | Schema changes need migrations generated and applied |
504
+ | Modify any schema file | `bun {{GROUP}}:generate` then `bun {{GROUP}}:migrate` | Schema changes need migrations generated and applied |
505
505
  | Add a new schema group | Follow "Adding a New Schema Group" checklist | Multiple configs + exports + scripts needed |
506
- | Update drizzle-orm or drizzle-kit | `pnpm {{GROUP}}:generate` and check for unexpected diffs | New versions may change migration format |
506
+ | Update drizzle-orm or drizzle-kit | `bun {{GROUP}}:generate` and check for unexpected diffs | New versions may change migration format |
507
507
 
508
508
  ### Environment Hooks
509
509
 
510
510
  | When you... | Then do... | Why |
511
511
  |---|---|---|
512
512
  | Add a new `DATABASE_URL` | Add to `.env`, `.env.example`, and consuming app env validation | Missing URL = crash at startup |
513
- | Change `DATABASE_URL` | Verify connection with `pnpm drizzle:studio:{{GROUP}}` | Wrong URL = silent connection failures |
513
+ | Change `DATABASE_URL` | Verify connection with `bun drizzle:studio:{{GROUP}}` | Wrong URL = silent connection failures |
514
514
 
515
515
  ### Condensed Rules for CLAUDE.md
516
516
 
517
517
  ```markdown
518
518
  ### db-drizzle-postgres maintenance
519
519
  - After creating a new schema file: add it to `drizzle/<group>/drizzle.config.ts` schema array AND the group's `index.ts` barrel export
520
- - After any schema change: run `pnpm <group>:generate && pnpm <group>:migrate`
520
+ - After any schema change: run `bun <group>:generate && bun <group>:migrate`
521
521
  - After adding a new schema group: create drizzle config, add package.json export, add scripts (see BLUEPRINT.md "Adding a New Schema Group")
522
522
  - After updating drizzle-orm/drizzle-kit: run generate and check migration diff for unexpected changes
523
523
  - Never use glob patterns in drizzle.config.ts schema — always list files explicitly, excluding index.ts
@@ -8,7 +8,7 @@
8
8
  // 3. Export $inferSelect / $inferInsert types
9
9
  // 4. Add the file path to drizzle/{{GROUP}}/drizzle.config.ts schema array
10
10
  // 5. Add the re-export to this group's index.ts
11
- // 6. Run `pnpm {{GROUP}}:generate` then `pnpm {{GROUP}}:migrate`
11
+ // 6. Run `bun {{GROUP}}:generate` then `bun {{GROUP}}:migrate`
12
12
  // =============================================================================
13
13
 
14
14
  import {
@@ -3,7 +3,7 @@
3
3
  // =============================================================================
4
4
  // Populates the {{GROUP}} database with sample data for development.
5
5
  //
6
- // Usage: pnpm seed
6
+ // Usage: bun seed
7
7
  // (runs via tsx, configured in packages/db/package.json)
8
8
  //
9
9
  // CONFIGURE: Replace the example inserts with your actual domain entities.
@@ -243,7 +243,7 @@ All core patterns are project-type-agnostic:
243
243
 
244
244
  ### Phase 4: Verification
245
245
 
246
- 15. Run `pnpm dev` (or equivalent) — env validation should run without errors
246
+ 15. Run `bun dev` (or equivalent) — env validation should run without errors
247
247
  16. Try removing a required variable from `.env.local` — build should fail with a clear error message
248
248
 
249
249
  ---
@@ -175,6 +175,10 @@ For standalone applications without a monorepo, the tailwind config lives direct
175
175
 
176
176
  ## Integration Steps
177
177
 
178
+ ### Design System Integration
179
+
180
+ If a custom design system exists at `docs/design/shared-styles.css` (created by `/design-system`), the scaffold process uses it instead of the generic template below. This means the colors, typography, shadows, and animations in the installed `shared-styles.css` will reflect your product's visual identity rather than the default shadcn palette.
181
+
178
182
  ### Phase 1: Upgrade Tailwind Config
179
183
 
180
184
  **If foundation's `config/tailwind-config/` exists:**
@@ -194,12 +198,12 @@ For standalone applications without a monorepo, the tailwind config lives direct
194
198
 
195
199
  ### Phase 2: Dependency Installation
196
200
 
197
- 5. Run `pnpm install` to fetch new dependencies
201
+ 5. Run `bun install` to fetch new dependencies
198
202
  6. Verify no peer dependency warnings
199
203
 
200
204
  ### Phase 3: Verification
201
205
 
202
- 7. Run `pnpm dev` — the app should start without CSS errors
206
+ 7. Run `bun dev` — the app should start without CSS errors
203
207
  8. Verify dark mode works: add `class="dark"` to `<html>` and confirm colors change
204
208
  9. Verify animation classes work: try `animate-fade-in` on an element
205
209
 
@@ -236,6 +240,9 @@ For standalone applications without a monorepo, the tailwind config lives direct
236
240
  - Whether to include chart tokens
237
241
  - Whether to include scrollbar-hide
238
242
  - Additional custom tokens can be added to `@theme inline`
243
+ - Shadow scale values (ambient/diffused, sharp/dramatic, or brand-tinted styles in the `@theme {}` block)
244
+ - Custom easing curves (`--ease-smooth`, `--ease-spring`, etc.) for animation personality
245
+ - Animation definitions and `@keyframes` — all defined in `@theme {}` alongside shadows and easing
239
246
 
240
247
  ## What's Opinionated
241
248
 
@@ -13,7 +13,7 @@
13
13
  --color-background: var(--background);
14
14
  --color-foreground: var(--foreground);
15
15
  --font-sans: var(--font-sans);
16
- --font-mono: var(--font-geist-mono);
16
+ --font-mono: var(--font-mono);
17
17
  --color-sidebar-ring: var(--sidebar-ring);
18
18
  --color-sidebar-border: var(--sidebar-border);
19
19
  --color-sidebar-accent-foreground: var(--sidebar-accent-foreground);
@@ -52,6 +52,75 @@
52
52
  --radius-4xl: calc(var(--radius) + 16px);
53
53
  }
54
54
 
55
+ /* ==========================================================================
56
+ Extended theme — shadows, easing, animations
57
+ ========================================================================== */
58
+
59
+ @theme {
60
+ /* Shadow scale — ambient style, neutral black */
61
+ --shadow-2xs: 0 1px rgb(0 0 0 / 0.03);
62
+ --shadow-xs: 0 1px 2px 0 rgb(0 0 0 / 0.04);
63
+ --shadow-sm: 0 1px 3px 0 rgb(0 0 0 / 0.06), 0 1px 2px -1px rgb(0 0 0 / 0.06);
64
+ --shadow-md: 0 4px 6px -1px rgb(0 0 0 / 0.07), 0 2px 4px -2px rgb(0 0 0 / 0.05);
65
+ --shadow-lg: 0 10px 15px -3px rgb(0 0 0 / 0.07), 0 4px 6px -4px rgb(0 0 0 / 0.05);
66
+ --shadow-xl: 0 20px 25px -5px rgb(0 0 0 / 0.07), 0 8px 10px -6px rgb(0 0 0 / 0.05);
67
+ --shadow-2xl: 0 25px 50px -12px rgb(0 0 0 / 0.15);
68
+
69
+ /* Easing curves */
70
+ --ease-in: cubic-bezier(0.4, 0, 1, 1);
71
+ --ease-out: cubic-bezier(0, 0, 0.2, 1);
72
+ --ease-in-out: cubic-bezier(0.4, 0, 0.2, 1);
73
+ --ease-spring: cubic-bezier(0.34, 1.56, 0.64, 1);
74
+ --ease-smooth: cubic-bezier(0.25, 0.1, 0.25, 1);
75
+
76
+ /* Custom animations */
77
+ --animate-fade-in: fade-in 0.15s var(--ease-out);
78
+ --animate-fade-out: fade-out 0.1s var(--ease-in);
79
+ --animate-slide-up: slide-up 0.2s var(--ease-out);
80
+ --animate-slide-down: slide-down 0.2s var(--ease-out);
81
+ --animate-slide-in-from-left: slide-in-from-left 0.2s var(--ease-out);
82
+ --animate-slide-in-from-right: slide-in-from-right 0.2s var(--ease-out);
83
+ --animate-scale-in: scale-in 0.15s var(--ease-out);
84
+ --animate-scale-out: scale-out 0.1s var(--ease-in);
85
+
86
+ @keyframes fade-in {
87
+ from { opacity: 0; }
88
+ to { opacity: 1; }
89
+ }
90
+ @keyframes fade-out {
91
+ from { opacity: 1; }
92
+ to { opacity: 0; }
93
+ }
94
+ @keyframes slide-up {
95
+ from { transform: translateY(8px); opacity: 0; }
96
+ to { transform: translateY(0); opacity: 1; }
97
+ }
98
+ @keyframes slide-down {
99
+ from { transform: translateY(-8px); opacity: 0; }
100
+ to { transform: translateY(0); opacity: 1; }
101
+ }
102
+ @keyframes slide-in-from-left {
103
+ from { transform: translateX(-100%); }
104
+ to { transform: translateX(0); }
105
+ }
106
+ @keyframes slide-in-from-right {
107
+ from { transform: translateX(100%); }
108
+ to { transform: translateX(0); }
109
+ }
110
+ @keyframes scale-in {
111
+ from { transform: scale(0.95); opacity: 0; }
112
+ to { transform: scale(1); opacity: 1; }
113
+ }
114
+ @keyframes scale-out {
115
+ from { transform: scale(1); opacity: 1; }
116
+ to { transform: scale(0.95); opacity: 0; }
117
+ }
118
+ }
119
+
120
+ /* ==========================================================================
121
+ Color tokens — light mode
122
+ ========================================================================== */
123
+
55
124
  :root {
56
125
  --background: oklch(1 0 0);
57
126
  --foreground: oklch(0.145 0 0);
@@ -85,8 +154,14 @@
85
154
  --sidebar-accent-foreground: oklch(0.205 0 0);
86
155
  --sidebar-border: oklch(0.922 0 0);
87
156
  --sidebar-ring: oklch(0.708 0 0);
157
+ --font-sans: ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
158
+ --font-mono: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, "Liberation Mono", monospace;
88
159
  }
89
160
 
161
+ /* ==========================================================================
162
+ Color tokens — dark mode
163
+ ========================================================================== */
164
+
90
165
  .dark {
91
166
  --background: oklch(0.145 0 0);
92
167
  --foreground: oklch(0.985 0 0);
@@ -121,6 +196,10 @@
121
196
  --sidebar-ring: oklch(0.556 0 0);
122
197
  }
123
198
 
199
+ /* ==========================================================================
200
+ Base layer defaults
201
+ ========================================================================== */
202
+
124
203
  @layer base {
125
204
  * {
126
205
  @apply border-border outline-ring/50;