@intelligo-dev/cli 1.0.0-beta.1 → 1.0.0-beta.14

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 (223) hide show
  1. package/NOTICE +6 -0
  2. package/README.md +102 -0
  3. package/dist/bin.js +122 -37
  4. package/dist/bin.js.map +1 -1
  5. package/dist/commands/add.d.ts +26 -1
  6. package/dist/commands/add.d.ts.map +1 -1
  7. package/dist/commands/add.js +70 -4
  8. package/dist/commands/add.js.map +1 -1
  9. package/dist/commands/create-flow.d.ts +37 -0
  10. package/dist/commands/create-flow.d.ts.map +1 -0
  11. package/dist/commands/create-flow.js +212 -0
  12. package/dist/commands/create-flow.js.map +1 -0
  13. package/dist/commands/create.d.ts +27 -6
  14. package/dist/commands/create.d.ts.map +1 -1
  15. package/dist/commands/create.js +53 -13
  16. package/dist/commands/create.js.map +1 -1
  17. package/dist/commands/doctor.d.ts +14 -3
  18. package/dist/commands/doctor.d.ts.map +1 -1
  19. package/dist/commands/doctor.js +295 -37
  20. package/dist/commands/doctor.js.map +1 -1
  21. package/dist/commands/migrate-check.d.ts +73 -1
  22. package/dist/commands/migrate-check.d.ts.map +1 -1
  23. package/dist/commands/migrate-check.js +130 -5
  24. package/dist/commands/migrate-check.js.map +1 -1
  25. package/dist/commands/migrate.d.ts +97 -0
  26. package/dist/commands/migrate.d.ts.map +1 -0
  27. package/dist/commands/migrate.js +141 -0
  28. package/dist/commands/migrate.js.map +1 -0
  29. package/dist/commands/sync-messages.d.ts +37 -0
  30. package/dist/commands/sync-messages.d.ts.map +1 -0
  31. package/dist/commands/sync-messages.js +88 -0
  32. package/dist/commands/sync-messages.js.map +1 -0
  33. package/dist/commands/sync-scaffold.d.ts +36 -0
  34. package/dist/commands/sync-scaffold.d.ts.map +1 -0
  35. package/dist/commands/sync-scaffold.js +53 -0
  36. package/dist/commands/sync-scaffold.js.map +1 -0
  37. package/dist/commands/sync.d.ts +103 -0
  38. package/dist/commands/sync.d.ts.map +1 -0
  39. package/dist/commands/sync.js +361 -0
  40. package/dist/commands/sync.js.map +1 -0
  41. package/dist/commands/upgrade-check.d.ts +5 -5
  42. package/dist/commands/upgrade-check.d.ts.map +1 -1
  43. package/dist/commands/upgrade-check.js +22 -6
  44. package/dist/commands/upgrade-check.js.map +1 -1
  45. package/dist/env-files.d.ts +12 -0
  46. package/dist/env-files.d.ts.map +1 -0
  47. package/dist/env-files.js +29 -0
  48. package/dist/env-files.js.map +1 -0
  49. package/dist/index.d.ts +9 -0
  50. package/dist/index.d.ts.map +1 -1
  51. package/dist/index.js +9 -0
  52. package/dist/index.js.map +1 -1
  53. package/dist/manifest.d.ts +36 -15
  54. package/dist/manifest.d.ts.map +1 -1
  55. package/dist/manifest.js +32 -16
  56. package/dist/manifest.js.map +1 -1
  57. package/dist/migrations.d.ts +3 -6
  58. package/dist/migrations.d.ts.map +1 -1
  59. package/dist/migrations.js +3 -6
  60. package/dist/migrations.js.map +1 -1
  61. package/dist/model-catalogue.d.ts +14 -0
  62. package/dist/model-catalogue.d.ts.map +1 -0
  63. package/dist/model-catalogue.js +34 -0
  64. package/dist/model-catalogue.js.map +1 -0
  65. package/dist/module-exports.d.ts +63 -0
  66. package/dist/module-exports.d.ts.map +1 -0
  67. package/dist/module-exports.js +231 -0
  68. package/dist/module-exports.js.map +1 -0
  69. package/dist/registry-bundle.d.ts +43 -0
  70. package/dist/registry-bundle.d.ts.map +1 -0
  71. package/dist/registry-bundle.js +74 -0
  72. package/dist/registry-bundle.js.map +1 -0
  73. package/dist/registry-items.d.ts +84 -0
  74. package/dist/registry-items.d.ts.map +1 -0
  75. package/dist/registry-items.js +187 -0
  76. package/dist/registry-items.js.map +1 -0
  77. package/package.json +36 -10
  78. package/src/bin.ts +316 -0
  79. package/src/commands/add.ts +255 -0
  80. package/src/commands/create-flow.ts +284 -0
  81. package/src/commands/create.ts +149 -0
  82. package/src/commands/doctor.ts +487 -0
  83. package/src/commands/migrate-check.ts +298 -0
  84. package/src/commands/migrate.ts +228 -0
  85. package/src/commands/sync-messages.ts +114 -0
  86. package/src/commands/sync-scaffold.ts +83 -0
  87. package/src/commands/sync.ts +534 -0
  88. package/src/commands/upgrade-check.ts +160 -0
  89. package/src/env-files.ts +31 -0
  90. package/src/index.ts +39 -0
  91. package/src/manifest.ts +147 -0
  92. package/src/migrations-dir.ts +25 -0
  93. package/src/migrations.ts +133 -0
  94. package/src/model-catalogue.ts +35 -0
  95. package/src/module-exports.ts +266 -0
  96. package/src/registry-bundle.ts +103 -0
  97. package/src/registry-items.ts +237 -0
  98. package/templates/admin-page/admin-page.tsx.tpl +2 -3
  99. package/templates/app-scaffold/assistant-route.ts.tpl +2 -2
  100. package/templates/app-scaffold/auth-route.ts.tpl +10 -0
  101. package/templates/app-scaffold/components.json.tpl +6 -2
  102. package/templates/app-scaffold/db-schema.ts.tpl +29 -0
  103. package/templates/app-scaffold/drizzle-journal.json.tpl +5 -0
  104. package/templates/app-scaffold/drizzle.config.ts.tpl +45 -0
  105. package/templates/app-scaffold/env.example.tpl +65 -1
  106. package/templates/app-scaffold/globals.css.tpl +172 -281
  107. package/templates/app-scaffold/i18n-request.ts.tpl +25 -0
  108. package/templates/app-scaffold/instrumentation.ts.tpl +21 -0
  109. package/templates/app-scaffold/intelligo.ts.tpl +95 -41
  110. package/templates/app-scaffold/layout.tsx.tpl +18 -1
  111. package/templates/app-scaffold/lib-utils.ts.tpl +1 -6
  112. package/templates/app-scaffold/next.config.mjs.tpl +2 -0
  113. package/templates/app-scaffold/package.json.tpl +31 -17
  114. package/templates/app-scaffold/page.tsx.tpl +16 -0
  115. package/templates/app-scaffold/plans.ts.tpl +32 -13
  116. package/templates/app-scaffold/{middleware.ts.tpl → proxy.ts.tpl} +6 -0
  117. package/templates/app-scaffold/sonner.tsx.tpl +42 -20
  118. package/templates/app-scaffold/stripe-webhook-route.ts.tpl +24 -0
  119. package/templates/app-scaffold/theme-provider.tsx.tpl +6 -4
  120. package/templates/app-scaffold/tsconfig.json.tpl +20 -4
  121. package/templates/app-scaffold/use-mobile.ts.tpl +19 -0
  122. package/templates/app-scaffold/workspace-bootstrap.ts.tpl +30 -0
  123. package/templates/maintenance/maintenance-route.ts.tpl +119 -0
  124. package/templates/manifest.json +75 -17
  125. package/templates/registry/ai-agent-activity.json +23 -0
  126. package/templates/registry/ai-agent-progress.json +21 -0
  127. package/templates/registry/ai-approval-card.json +27 -0
  128. package/templates/registry/ai-artifact.json +22 -0
  129. package/templates/registry/ai-branch.json +21 -0
  130. package/templates/registry/ai-citations.json +24 -0
  131. package/templates/registry/ai-code-block.json +23 -0
  132. package/templates/registry/ai-composer-menu.json +19 -0
  133. package/templates/registry/ai-file-diff.json +25 -0
  134. package/templates/registry/ai-image-generation.json +23 -0
  135. package/templates/registry/ai-markdown.json +23 -0
  136. package/templates/registry/ai-message-bubble.json +23 -0
  137. package/templates/registry/ai-message-scroller.json +22 -0
  138. package/templates/registry/ai-message.json +21 -0
  139. package/templates/registry/ai-motion.json +19 -0
  140. package/templates/registry/ai-prompt-input.json +28 -0
  141. package/templates/registry/ai-reasoning-text.json +22 -0
  142. package/templates/registry/ai-reasoning.json +22 -0
  143. package/templates/registry/ai-shimmer-text.json +19 -0
  144. package/templates/registry/ai-sidebar.json +25 -0
  145. package/templates/registry/ai-speech-input.json +21 -0
  146. package/templates/registry/ai-streaming-response.json +24 -0
  147. package/templates/registry/ai-suggestion.json +19 -0
  148. package/templates/registry/ai-todo-list.json +22 -0
  149. package/templates/registry/ai-tool-approval.json +26 -0
  150. package/templates/registry/ai-tool-result.json +25 -0
  151. package/templates/registry/alert-dialog.json +23 -0
  152. package/templates/registry/animated-list.json +21 -0
  153. package/templates/registry/app-shell.json +93 -0
  154. package/templates/registry/artifacts.json +82 -0
  155. package/templates/registry/attachment.json +22 -0
  156. package/templates/registry/auth-email-verification.json +39 -0
  157. package/templates/registry/auth-login.json +72 -0
  158. package/templates/registry/auth-password-reset.json +53 -0
  159. package/templates/registry/auth-signup.json +41 -0
  160. package/templates/registry/billing-settings.json +60 -0
  161. package/templates/registry/button.json +22 -0
  162. package/templates/registry/chat-eve.json +19 -0
  163. package/templates/registry/chat-panel.json +30 -0
  164. package/templates/registry/chat-share.json +42 -0
  165. package/templates/registry/chat-widget.json +34 -0
  166. package/templates/registry/chat.json +326 -0
  167. package/templates/registry/checkbox.json +22 -0
  168. package/templates/registry/checkout.json +40 -0
  169. package/templates/registry/collapsible.json +19 -0
  170. package/templates/registry/command.json +23 -0
  171. package/templates/registry/copy-button.json +21 -0
  172. package/templates/registry/dashboard.json +69 -0
  173. package/templates/registry/dialog.json +24 -0
  174. package/templates/registry/document-viewer.json +22 -0
  175. package/templates/registry/dropdown-menu.json +23 -0
  176. package/templates/registry/expandable-tabs.json +22 -0
  177. package/templates/registry/feature-gating.json +73 -0
  178. package/templates/registry/file-upload.json +24 -0
  179. package/templates/registry/hold-action-button.json +22 -0
  180. package/templates/registry/input-group.json +23 -0
  181. package/templates/registry/input.json +19 -0
  182. package/templates/registry/intelligo.json +187 -0
  183. package/templates/registry/invitation-accept.json +64 -0
  184. package/templates/registry/language-switcher.json +29 -0
  185. package/templates/registry/morphing-modal.json +24 -0
  186. package/templates/registry/notification-stack.json +24 -0
  187. package/templates/registry/notifications.json +87 -0
  188. package/templates/registry/onboarding.json +83 -0
  189. package/templates/registry/otp-input.json +22 -0
  190. package/templates/registry/page-header.json +15 -0
  191. package/templates/registry/payment-poll.json +52 -0
  192. package/templates/registry/popover-morph.json +22 -0
  193. package/templates/registry/popover.json +22 -0
  194. package/templates/registry/pricing.json +111 -0
  195. package/templates/registry/privacy-settings.json +65 -0
  196. package/templates/registry/profile-settings.json +68 -0
  197. package/templates/registry/progress.json +19 -0
  198. package/templates/registry/radio-group.json +22 -0
  199. package/templates/registry/registry.json +2945 -0
  200. package/templates/registry/route-error.json +65 -0
  201. package/templates/registry/select-morph.json +23 -0
  202. package/templates/registry/select.json +23 -0
  203. package/templates/registry/settings-shell.json +47 -0
  204. package/templates/registry/sheet.json +24 -0
  205. package/templates/registry/sidebar.json +28 -0
  206. package/templates/registry/smoke.json +34 -0
  207. package/templates/registry/spinner.json +16 -0
  208. package/templates/registry/stat-card.json +18 -0
  209. package/templates/registry/status-badge.json +18 -0
  210. package/templates/registry/switch.json +20 -0
  211. package/templates/registry/tabs.json +23 -0
  212. package/templates/registry/team-settings.json +97 -0
  213. package/templates/registry/textarea.json +16 -0
  214. package/templates/registry/tooltip.json +22 -0
  215. package/templates/registry/trial-banner.json +43 -0
  216. package/templates/registry/usage.json +84 -0
  217. package/templates/registry/workspace-settings.json +71 -0
  218. package/templates/registry-items.json +116 -0
  219. package/templates/registry-requires.json +180 -0
  220. package/templates/usage-page/usage-page.tsx.tpl +23 -8
  221. package/templates/vitest/server-only.ts.tpl +7 -0
  222. package/templates/vitest/vitest.config.ts.tpl +37 -0
  223. package/templates/billing-page/billing-page.tsx.tpl +0 -72
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Tables this application owns.
3
+ *
4
+ * Everything the framework needs — users, workspaces, members, plans,
5
+ * subscriptions, credits, executions, audit events, notifications,
6
+ * conversations, documents — is `@intelligo-dev/core`'s and arrives
7
+ * with its own migrations. Define your product's tables here, scope
8
+ * them to a workspace, and reference framework tables by import:
9
+ *
10
+ * import { pgTable, text, timestamp } from "drizzle-orm/pg-core";
11
+ * import { organization, users } from "@intelligo-dev/core/db/schema";
12
+ *
13
+ * export const reports = pgTable("reports", {
14
+ * id: text("id").primaryKey(),
15
+ * workspaceId: text("workspace_id")
16
+ * .notNull()
17
+ * .references(() => organization.id, { onDelete: "cascade" }),
18
+ * createdBy: text("created_by").references(() => users.id),
19
+ * createdAt: timestamp("created_at").defaultNow().notNull(),
20
+ * });
21
+ *
22
+ * Then `pnpm db:generate` writes the migration into ./drizzle and
23
+ * `pnpm db:migrate` applies it after the framework's chain.
24
+ *
25
+ * Intelligo never reads these tables (every table has one
26
+ * owner), so their shape is entirely yours.
27
+ */
28
+
29
+ export {};
@@ -0,0 +1,5 @@
1
+ {
2
+ "version": "7",
3
+ "dialect": "postgresql",
4
+ "entries": []
5
+ }
@@ -0,0 +1,45 @@
1
+ import { defineConfig } from "drizzle-kit";
2
+ import { config } from "dotenv";
3
+
4
+ // drizzle-kit does not load env files; Next.js does. Same precedence.
5
+ config({ path: ".env.local" });
6
+ config({ path: ".env" });
7
+
8
+ /**
9
+ * Your application's migration chain — and only yours.
10
+ *
11
+ * The framework's tables (users, workspaces, plans, credits, executions,
12
+ * …) arrive inside `@intelligo-dev/core` together with their migration
13
+ * history, and `intelligo migrate` applies that chain. This config
14
+ * covers the tables you own: list their schema files here, generate
15
+ * with `pnpm db:generate`, apply with `pnpm db:migrate`.
16
+ * `drizzle/meta/_journal.json` starts empty so `db:migrate` succeeds
17
+ * before you own a table — drizzle-kit exits 1, with no message, when
18
+ * the journal is missing.
19
+ *
20
+ * Two chains, one database, so they record themselves in different
21
+ * tables: the framework in drizzle's default `__drizzle_migrations`,
22
+ * yours in `__app_migrations`. Do not merge them — drizzle-kit applies
23
+ * by timestamp, and a framework migration published after you
24
+ * generated one of yours would be skipped silently.
25
+ *
26
+ * Your schema may reference framework tables (`references(() =>
27
+ * users.id)`); drizzle-kit emits the foreign key by name and does not
28
+ * try to create the framework's table.
29
+ *
30
+ * Do not point `drizzle-kit push` at this config: push diffs the whole
31
+ * database against the schema it sees, and this config deliberately
32
+ * sees only yours.
33
+ */
34
+ export default defineConfig({
35
+ dialect: "postgresql",
36
+ schema: ["./lib/db/schema.ts"],
37
+ out: "./drizzle",
38
+ migrations: { table: "__app_migrations", schema: "drizzle" },
39
+ // The framework's columns are snake_case in Postgres and camelCase in
40
+ // TypeScript. Keep the same convention so joins read naturally.
41
+ casing: "snake_case",
42
+ dbCredentials: {
43
+ url: process.env.DATABASE_URL!,
44
+ },
45
+ });
@@ -1,6 +1,18 @@
1
+ # ============================================
1
2
  # Required — the app will not boot without these.
3
+ # ============================================
4
+
5
+ # Postgres with the pgvector extension (Neon, Supabase, RDS, or local).
2
6
  DATABASE_URL=
7
+ # Driver is chosen from the URL (Neon hosts get the WebSocket driver,
8
+ # everything else node-postgres). Force it with pg | neon-serverless.
9
+ # INTELLIGO_DB_DRIVER=
10
+
11
+ # At least 32 characters. Generate with: openssl rand -base64 32
3
12
  BETTER_AUTH_SECRET=
13
+
14
+ # Where users reach the app. Auth callbacks, email links and redirects
15
+ # are built from it, so production needs the public https URL.
4
16
  NEXT_PUBLIC_APP_URL=http://localhost:3000
5
17
 
6
18
  # Which product's plans the billing engine bills against. Your
@@ -8,6 +20,58 @@ NEXT_PUBLIC_APP_URL=http://localhost:3000
8
20
  # variable is here so CLI tooling can check it without booting the app.
9
21
  INTELLIGO_BILLING_PRODUCT=__APP_SLUG__
10
22
 
23
+ # ============================================
24
+ # Optional — everything works locally without these.
25
+ # ============================================
26
+
27
+ # Sign in with Google or GitHub. A provider's button appears once both
28
+ # of its values are set; the callback URL to register with the provider
29
+ # is NEXT_PUBLIC_APP_URL + /api/auth/callback/google (or /github).
30
+ # GOOGLE_CLIENT_ID=
31
+ # GOOGLE_CLIENT_SECRET=
32
+ # GITHUB_CLIENT_ID=
33
+ # GITHUB_CLIENT_SECRET=
34
+
35
+ # Email. Without a provider, emails (verification, invitations, reset
36
+ # links) are printed to the server console, and sign-ups are not held
37
+ # for email verification.
38
+ # RESEND_API_KEY=
39
+ # The sender of every email, on a domain verified with Resend. Required
40
+ # with RESEND_API_KEY: there is no built-in sender, so sends fail without
41
+ # it. Loops ignores it and takes the sender from each template.
42
+ # EMAIL_FROM=Acme <noreply@example.com>
43
+ # The product's name in every email's heading and footer; defaults to
44
+ # the display name in EMAIL_FROM. SUPPORT_EMAIL is the address the
45
+ # footer offers for replies; without it the footer offers none.
46
+ # APP_NAME=Acme
47
+ # SUPPORT_EMAIL=support@example.com
48
+ # Loops sends by template id instead of HTML: map each template with
49
+ # LOOPS_TRANSACTIONAL_ID_<KEY>, e.g. LOOPS_TRANSACTIONAL_ID_VERIFY_EMAIL.
50
+ # LOOPS_API_KEY=
51
+ # With both keys set Resend wins; force one with resend | loops | console.
52
+ # EMAIL_PROVIDER=
53
+
54
+ # Stripe. Billing pages say "not configured" until these are set; the
55
+ # webhook at /api/webhooks/stripe verifies with the secret.
56
+ # STRIPE_SECRET_KEY=
57
+ # STRIPE_WEBHOOK_SECRET=
58
+
59
+ # Which registered payment provider serves payments outside Stripe
60
+ # (registerPaymentProvider in the composition root). Defaults to the
61
+ # in-memory mock, which production refuses.
62
+ # PAYMENT_MODE=
63
+
64
+ # AI providers. Chat runs on a built-in stub model until lib/chat-model.ts
65
+ # names a real one. Set only the key of the provider that model belongs
66
+ # to — the provider's SDK reads it, and the framework checks none of them.
67
+ # OPENAI_API_KEY=
68
+ # ANTHROPIC_API_KEY=
69
+ # GOOGLE_GENERATIVE_AI_API_KEY=
70
+
71
+ # Bearer token your scheduler sends to /api/cron/maintenance
72
+ # (`intelligo add maintenance`). At least 32 characters.
73
+ # CRON_SECRET=
74
+
11
75
  # Comma-separated emails allowed to reach the Intelligo admin console.
12
76
  # Closed by default: with no value, nobody is a platform admin.
13
- PLATFORM_ADMIN_EMAILS=
77
+ # PLATFORM_ADMIN_EMAILS=
@@ -1,263 +1,42 @@
1
+ /*
2
+ * Design tokens: shadcn base-nova plus status, layers and motion — what
3
+ * `shadcn add https://intelligo.dev/r/intelligo.json` writes. Re-value
4
+ * the tokens to re-theme every installed page; keep the names, registry
5
+ * items depend on them.
6
+ */
1
7
  @import "tailwindcss";
2
8
  @import "tw-animate-css";
9
+ @import "shadcn/tailwind.css";
3
10
 
4
- /* custom variant for setting dark mode programmatically */
5
- @custom-variant dark (&:is(.dark, .dark *));
6
-
7
- /* ============================================================
8
- Design tokens.
9
- This file is yours — Intelligo generated it once and will not
10
- overwrite it. These tokens are a starting point, not a dependency:
11
- nothing in your app imports them from an Intelligo package, so
12
- edit them freely. Registry items you install with `shadcn add`
13
- assume the shadcn new-york theme below; the ones under "Design
14
- tokens" are optional extras used by some Intelligo-authored
15
- registry items (status colors, agent identity colors) — delete
16
- what you don't use.
17
- ============================================================ */
18
-
19
- /* ---- Light mode tokens ---- */
20
- :root {
21
- /* Status: success */
22
- --status-success: hsl(142 76% 36%);
23
- --status-success-light: hsl(143 85% 96%);
24
- --status-success-dark: hsl(144 61% 20%);
25
-
26
- /* Status: error */
27
- --status-error: hsl(0 84% 60%);
28
- --status-error-light: hsl(0 86% 97%);
29
- --status-error-dark: hsl(0 63% 31%);
30
-
31
- /* Status: warning */
32
- --status-warning: hsl(38 92% 50%);
33
- --status-warning-light: hsl(48 96% 89%);
34
- --status-warning-dark: hsl(32 95% 44%);
35
-
36
- /* Status: info */
37
- --status-info: hsl(217 91% 60%);
38
- --status-info-light: hsl(214 95% 93%);
39
- --status-info-dark: hsl(224 76% 48%);
40
-
41
- /* Brand — Monochrome */
42
- --brand-primary: #18181B;
43
- --brand-primary-foreground: #ffffff;
44
- --brand-accent: #27272A;
45
- --brand-accent-end: #3F3F46;
46
-
47
- /* Spacing (semantic aliases) */
48
- --space-xs: 0.25rem;
49
- --space-sm: 0.5rem;
50
- --space-md: 1rem;
51
- --space-lg: 1.5rem;
52
- --space-xl: 2rem;
53
- --space-2xl: 3rem;
54
-
55
- /* Shadows */
56
- --shadow-sm: 0 1px 2px 0 rgb(0 0 0 / 0.05);
57
- --shadow-md: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);
58
- --shadow-lg: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);
59
- --shadow-glow-primary: 0 0 40px rgba(255, 255, 255, 0.1);
60
-
61
- /* Z-index scale */
62
- --z-dropdown: 50;
63
- --z-sticky: 100;
64
- --z-modal: 200;
65
- --z-popover: 250;
66
- --z-toast: 300;
67
-
68
- /* Typography */
69
- --font-size-xs: 0.75rem; /* 12px */
70
- --font-size-sm: 0.875rem; /* 14px */
71
- --font-size-base: 1rem; /* 16px */
72
- --font-size-lg: 1.125rem; /* 18px */
73
- --font-size-xl: 1.25rem; /* 20px */
74
- --font-size-2xl: 1.5rem; /* 24px */
75
- --font-size-3xl: 1.875rem; /* 30px */
76
-
77
- --line-height-tight: 1.25;
78
- --line-height-snug: 1.375;
79
- --line-height-normal: 1.5;
80
- --line-height-relaxed: 1.625;
81
-
82
- --letter-spacing-tight: -0.025em;
83
- --letter-spacing-normal: 0em;
84
- --letter-spacing-wide: 0.025em;
85
-
86
- /* Agent identity colors */
87
- --agent-career: #7c3aed;
88
- --agent-university: #2563eb;
89
- --agent-scholarship: #d97706;
90
- --agent-student-life: #059669;
91
- --agent-ai-futures: #e11d48;
92
- --agent-parent: #92400e;
93
-
94
- /* Weather (decorative/thematic) */
95
- --weather-day-start: hsl(200 95% 65%); /* sky-400 equivalent */
96
- --weather-day-mid: hsl(217 91% 60%); /* blue-500 equivalent */
97
- --weather-day-end: hsl(221 83% 53%); /* blue-600 equivalent */
98
- --weather-night-start: hsl(244 47% 20%); /* indigo-900 equivalent */
99
- --weather-night-mid: hsl(269 67% 18%); /* purple-900 equivalent */
100
- --weather-night-end: hsl(222 47% 11%); /* slate-900 equivalent */
101
- }
102
-
103
- /* ---- Dark mode overrides ---- */
104
- .dark {
105
- /* Status: success — lighter text on dark backgrounds */
106
- --status-success: hsl(142 69% 58%);
107
- --status-success-light: hsl(143 50% 15%);
108
- --status-success-dark: hsl(144 76% 80%);
109
-
110
- /* Status: error */
111
- --status-error: hsl(0 91% 71%);
112
- --status-error-light: hsl(0 50% 15%);
113
- --status-error-dark: hsl(0 84% 85%);
114
-
115
- /* Status: warning */
116
- --status-warning: hsl(38 95% 64%);
117
- --status-warning-light: hsl(38 60% 15%);
118
- --status-warning-dark: hsl(38 92% 80%);
11
+ @custom-variant dark (&:is(.dark *));
119
12
 
120
- /* Status: info */
121
- --status-info: hsl(217 91% 70%);
122
- --status-info-light: hsl(217 60% 15%);
123
- --status-info-dark: hsl(217 91% 85%);
124
-
125
- /* Brand (dark) — Monochrome */
126
- --brand-primary: #E8E8E8;
127
- --brand-primary-foreground: #121212;
128
- --brand-accent: #888888;
129
- --brand-accent-end: #555555;
130
-
131
- /* Weather — same in dark mode (self-contained card) */
132
- --weather-day-start: hsl(200 95% 65%);
133
- --weather-day-mid: hsl(217 91% 60%);
134
- --weather-day-end: hsl(221 83% 53%);
135
- --weather-night-start: hsl(244 47% 20%);
136
- --weather-night-mid: hsl(269 67% 18%);
137
- --weather-night-end: hsl(222 47% 11%);
138
- }
139
-
140
- /* ============================================================
141
- shadcn new-york theme — style: new-york, baseColor: neutral,
142
- cssVariables: true (components.json). Standard shadcn palette;
143
- registry items you install assume this default theme, so change
144
- it after things are working, not before.
145
- ============================================================ */
146
-
147
- :root {
148
- --radius: 0.625rem;
149
- --background: oklch(1 0 0);
150
- --foreground: oklch(0.145 0 0);
151
- --card: oklch(1 0 0);
152
- --card-foreground: oklch(0.145 0 0);
153
- --popover: oklch(1 0 0);
154
- --popover-foreground: oklch(0.145 0 0);
155
- --primary: oklch(0.205 0 0);
156
- --primary-foreground: oklch(0.985 0 0);
157
- --secondary: oklch(0.97 0 0);
158
- --secondary-foreground: oklch(0.205 0 0);
159
- --muted: oklch(0.97 0 0);
160
- --muted-foreground: oklch(0.556 0 0);
161
- --accent: oklch(0.97 0 0);
162
- --accent-foreground: oklch(0.205 0 0);
163
- --destructive: oklch(0.577 0.245 27.325);
164
- --destructive-foreground: oklch(0.985 0 0);
165
- --border: oklch(0.922 0 0);
166
- --input: oklch(0.922 0 0);
167
- --ring: oklch(0.708 0 0);
168
- --chart-1: oklch(0.646 0.222 41.116);
169
- --chart-2: oklch(0.6 0.118 184.704);
170
- --chart-3: oklch(0.398 0.07 227.392);
171
- --chart-4: oklch(0.828 0.189 84.429);
172
- --chart-5: oklch(0.769 0.188 70.08);
173
- --sidebar: oklch(0.985 0 0);
174
- --sidebar-foreground: oklch(0.145 0 0);
175
- --sidebar-primary: oklch(0.205 0 0);
176
- --sidebar-primary-foreground: oklch(0.985 0 0);
177
- --sidebar-accent: oklch(0.97 0 0);
178
- --sidebar-accent-foreground: oklch(0.205 0 0);
179
- --sidebar-border: oklch(0.922 0 0);
180
- --sidebar-ring: oklch(0.708 0 0);
181
- }
182
-
183
- .dark {
184
- --background: oklch(0.145 0 0);
185
- --foreground: oklch(0.985 0 0);
186
- --card: oklch(0.205 0 0);
187
- --card-foreground: oklch(0.985 0 0);
188
- --popover: oklch(0.205 0 0);
189
- --popover-foreground: oklch(0.985 0 0);
190
- --primary: oklch(0.922 0 0);
191
- --primary-foreground: oklch(0.205 0 0);
192
- --secondary: oklch(0.269 0 0);
193
- --secondary-foreground: oklch(0.985 0 0);
194
- --muted: oklch(0.269 0 0);
195
- --muted-foreground: oklch(0.708 0 0);
196
- --accent: oklch(0.269 0 0);
197
- --accent-foreground: oklch(0.985 0 0);
198
- --destructive: oklch(0.704 0.191 22.216);
199
- --destructive-foreground: oklch(0.985 0 0);
200
- --border: oklch(1 0 0 / 10%);
201
- --input: oklch(1 0 0 / 15%);
202
- --ring: oklch(0.556 0 0);
203
- --chart-1: oklch(0.488 0.243 264.376);
204
- --chart-2: oklch(0.696 0.17 162.48);
205
- --chart-3: oklch(0.769 0.188 70.08);
206
- --chart-4: oklch(0.627 0.265 303.9);
207
- --chart-5: oklch(0.645 0.246 16.439);
208
- --sidebar: oklch(0.205 0 0);
209
- --sidebar-foreground: oklch(0.985 0 0);
210
- --sidebar-primary: oklch(0.488 0.243 264.376);
211
- --sidebar-primary-foreground: oklch(0.985 0 0);
212
- --sidebar-accent: oklch(0.269 0 0);
213
- --sidebar-accent-foreground: oklch(0.985 0 0);
214
- --sidebar-border: oklch(1 0 0 / 10%);
215
- --sidebar-ring: oklch(0.556 0 0);
216
- }
217
-
218
- /* define theme — maps CSS variables to Tailwind utilities */
219
13
  @theme inline {
220
- --font-sans: var(--font-sans, ui-sans-serif, system-ui, sans-serif);
221
-
222
- --radius-sm: calc(var(--radius) - 4px);
223
- --radius-md: calc(var(--radius) - 2px);
224
- --radius-lg: var(--radius);
225
- --radius-xl: calc(var(--radius) + 4px);
226
-
14
+ --font-sans: var(--font-sans);
15
+ --font-mono: ui-monospace, "SFMono-Regular", Menlo, monospace;
16
+ --font-heading: var(--font-sans);
227
17
  --color-background: var(--background);
228
18
  --color-foreground: var(--foreground);
229
-
230
19
  --color-card: var(--card);
231
20
  --color-card-foreground: var(--card-foreground);
232
-
233
21
  --color-popover: var(--popover);
234
22
  --color-popover-foreground: var(--popover-foreground);
235
-
236
23
  --color-primary: var(--primary);
237
24
  --color-primary-foreground: var(--primary-foreground);
238
-
239
25
  --color-secondary: var(--secondary);
240
26
  --color-secondary-foreground: var(--secondary-foreground);
241
-
242
27
  --color-muted: var(--muted);
243
28
  --color-muted-foreground: var(--muted-foreground);
244
-
245
29
  --color-accent: var(--accent);
246
30
  --color-accent-foreground: var(--accent-foreground);
247
-
248
31
  --color-destructive: var(--destructive);
249
- --color-destructive-foreground: var(--destructive-foreground);
250
-
251
32
  --color-border: var(--border);
252
33
  --color-input: var(--input);
253
34
  --color-ring: var(--ring);
254
-
255
35
  --color-chart-1: var(--chart-1);
256
36
  --color-chart-2: var(--chart-2);
257
37
  --color-chart-3: var(--chart-3);
258
38
  --color-chart-4: var(--chart-4);
259
39
  --color-chart-5: var(--chart-5);
260
-
261
40
  --color-sidebar: var(--sidebar);
262
41
  --color-sidebar-foreground: var(--sidebar-foreground);
263
42
  --color-sidebar-primary: var(--sidebar-primary);
@@ -266,64 +45,176 @@
266
45
  --color-sidebar-accent-foreground: var(--sidebar-accent-foreground);
267
46
  --color-sidebar-border: var(--sidebar-border);
268
47
  --color-sidebar-ring: var(--sidebar-ring);
48
+ --color-destructive-foreground: var(--destructive-foreground);
49
+ --color-success: var(--success);
50
+ --color-success-foreground: var(--success-foreground);
51
+ --color-warning: var(--warning);
52
+ --color-warning-foreground: var(--warning-foreground);
53
+ --color-info: var(--info);
54
+ --color-info-foreground: var(--info-foreground);
55
+ --ease-standard: cubic-bezier(0.16, 1, 0.3, 1);
56
+ --ease-emphasized: cubic-bezier(0.32, 0.72, 0, 1);
57
+ --ease-exit: cubic-bezier(0.77, 0, 0.175, 1);
58
+ --radius-sm: calc(var(--radius) * 0.6);
59
+ --radius-md: calc(var(--radius) * 0.8);
60
+ --radius-lg: var(--radius);
61
+ --radius-xl: calc(var(--radius) * 1.4);
62
+ --radius-2xl: calc(var(--radius) * 1.8);
63
+ --radius-3xl: calc(var(--radius) * 2.2);
64
+ --radius-4xl: calc(var(--radius) * 2.6);
65
+ }
269
66
 
270
- /* Design token mappings — from packages/ui/src/tokens.css */
271
- --color-status-success: var(--status-success);
272
- --color-status-success-light: var(--status-success-light);
273
- --color-status-error: var(--status-error);
274
- --color-status-error-light: var(--status-error-light);
275
- --color-status-warning: var(--status-warning);
276
- --color-status-warning-light: var(--status-warning-light);
277
- --color-status-info: var(--status-info);
278
- --color-status-info-light: var(--status-info-light);
279
- --color-brand-primary: var(--brand-primary);
280
- --color-brand-accent: var(--brand-accent);
281
-
282
- /* Agent color mappings */
283
- --color-agent-career: var(--agent-career);
284
- --color-agent-university: var(--agent-university);
285
- --color-agent-scholarship: var(--agent-scholarship);
286
- --color-agent-student-life: var(--agent-student-life);
287
- --color-agent-ai-futures: var(--agent-ai-futures);
288
- --color-agent-parent: var(--agent-parent);
289
-
290
- /* Typography token mappings */
291
- --font-size-xs: var(--font-size-xs);
292
- --font-size-sm: var(--font-size-sm);
293
- --font-size-base: var(--font-size-base);
294
- --font-size-lg: var(--font-size-lg);
295
- --font-size-xl: var(--font-size-xl);
296
- --font-size-2xl: var(--font-size-2xl);
297
- --font-size-3xl: var(--font-size-3xl);
298
- --line-height-tight: var(--line-height-tight);
299
- --line-height-snug: var(--line-height-snug);
300
- --line-height-normal: var(--line-height-normal);
301
- --line-height-relaxed: var(--line-height-relaxed);
302
- --letter-spacing-tight: var(--letter-spacing-tight);
303
- --letter-spacing-normal: var(--letter-spacing-normal);
304
- --letter-spacing-wide: var(--letter-spacing-wide);
67
+ :root {
68
+ --font-sans: "Geist", "Geist Fallback", -apple-system, "Segoe UI", sans-serif;
69
+ --background: oklch(0.99 0 0);
70
+ --foreground: oklch(0.15 0 0);
71
+ --card: oklch(0.97 0 0);
72
+ --card-foreground: oklch(0.15 0 0);
73
+ --popover: oklch(0.99 0 0);
74
+ --popover-foreground: oklch(0.15 0 0);
75
+ --primary: oklch(0.15 0 0);
76
+ --primary-foreground: oklch(0.99 0 0);
77
+ --secondary: oklch(0.955 0 0);
78
+ --secondary-foreground: oklch(0.15 0 0);
79
+ --muted: oklch(0.97 0 0);
80
+ --muted-foreground: oklch(0.5 0 0);
81
+ --accent: oklch(0.95 0 0);
82
+ --accent-foreground: oklch(0.15 0 0);
83
+ --destructive: oklch(0.52 0.2 25);
84
+ --border: oklch(0.15 0 0 / 8%);
85
+ --input: oklch(0.15 0 0 / 14%);
86
+ --ring: oklch(0.55 0 0);
87
+ --chart-1: oklch(0.87 0 0);
88
+ --chart-2: oklch(0.556 0 0);
89
+ --chart-3: oklch(0.439 0 0);
90
+ --chart-4: oklch(0.371 0 0);
91
+ --chart-5: oklch(0.269 0 0);
92
+ --radius: 0.5rem;
93
+ --sidebar: oklch(0.975 0 0);
94
+ --sidebar-foreground: oklch(0.15 0 0);
95
+ --sidebar-primary: oklch(0.15 0 0);
96
+ --sidebar-primary-foreground: oklch(0.99 0 0);
97
+ --sidebar-accent: oklch(0.94 0 0);
98
+ --sidebar-accent-foreground: oklch(0.15 0 0);
99
+ --sidebar-border: oklch(0.15 0 0 / 8%);
100
+ --sidebar-ring: oklch(0.55 0 0);
101
+ --destructive-foreground: oklch(0.99 0 0);
102
+ --success: oklch(0.49 0.12 155);
103
+ --success-foreground: oklch(0.99 0 0);
104
+ --warning: oklch(0.5 0.105 75);
105
+ --warning-foreground: oklch(0.99 0 0);
106
+ --info: oklch(0.5 0.135 245);
107
+ --info-foreground: oklch(0.99 0 0);
305
108
  }
306
109
 
307
- /*
308
- The default border color has changed to `currentcolor` in Tailwind CSS v4,
309
- so we've added these compatibility styles to make sure everything still
310
- looks the same as it did with Tailwind CSS v3.
110
+ .dark {
111
+ --background: oklch(0.196 0 0);
112
+ --foreground: oklch(0.96 0 0);
113
+ --card: oklch(0.227 0 0);
114
+ --card-foreground: oklch(0.96 0 0);
115
+ --popover: oklch(0.227 0 0);
116
+ --popover-foreground: oklch(0.96 0 0);
117
+ --primary: oklch(0.96 0 0);
118
+ --primary-foreground: oklch(0.196 0 0);
119
+ --secondary: oklch(0.27 0 0);
120
+ --secondary-foreground: oklch(0.96 0 0);
121
+ --muted: oklch(0.227 0 0);
122
+ --muted-foreground: oklch(0.68 0 0);
123
+ --accent: oklch(0.28 0 0);
124
+ --accent-foreground: oklch(0.96 0 0);
125
+ --destructive: oklch(0.7 0.18 25);
126
+ --border: oklch(1 0 0 / 7%);
127
+ --input: oklch(1 0 0 / 12%);
128
+ --ring: oklch(0.58 0 0);
129
+ --chart-1: oklch(0.87 0 0);
130
+ --chart-2: oklch(0.556 0 0);
131
+ --chart-3: oklch(0.439 0 0);
132
+ --chart-4: oklch(0.371 0 0);
133
+ --chart-5: oklch(0.269 0 0);
134
+ --sidebar: oklch(0.175 0 0);
135
+ --sidebar-foreground: oklch(0.96 0 0);
136
+ --sidebar-primary: oklch(0.96 0 0);
137
+ --sidebar-primary-foreground: oklch(0.196 0 0);
138
+ --sidebar-accent: oklch(0.26 0 0);
139
+ --sidebar-accent-foreground: oklch(0.96 0 0);
140
+ --sidebar-border: oklch(1 0 0 / 7%);
141
+ --sidebar-ring: oklch(0.58 0 0);
142
+ --destructive-foreground: oklch(0.196 0 0);
143
+ --success: oklch(0.72 0.16 155);
144
+ --success-foreground: oklch(0.196 0 0);
145
+ --warning: oklch(0.78 0.15 75);
146
+ --warning-foreground: oklch(0.196 0 0);
147
+ --info: oklch(0.72 0.13 245);
148
+ --info-foreground: oklch(0.196 0 0);
149
+ }
311
150
 
312
- If we ever want to remove these styles, we need to add an explicit border
313
- color utility to any element that depends on these defaults.
314
- */
315
151
  @layer base {
316
- *,
317
- ::after,
318
- ::before,
319
- ::backdrop,
320
- ::file-selector-button {
321
- border-color: var(--color-gray-200, currentcolor);
322
- }
323
152
  * {
324
153
  @apply border-border outline-ring/50;
325
154
  }
326
155
  body {
327
156
  @apply bg-background text-foreground;
328
157
  }
158
+ html {
159
+ @apply font-sans;
160
+ }
161
+ :root {
162
+ --z-sticky: 10;
163
+ --z-dropdown: 20;
164
+ --z-overlay: 40;
165
+ --z-modal: 50;
166
+ --z-popover: 60;
167
+ --z-toast: 70;
168
+ --duration-fast: 120ms;
169
+ --duration-normal: 200ms;
170
+ --duration-slow: 320ms;
171
+ }
172
+ }
173
+
174
+ @utility z-sticky {
175
+ z-index: var(--z-sticky);
176
+ }
177
+
178
+ @utility z-dropdown {
179
+ z-index: var(--z-dropdown);
180
+ }
181
+
182
+ @utility z-overlay {
183
+ z-index: var(--z-overlay);
184
+ }
185
+
186
+ @utility z-modal {
187
+ z-index: var(--z-modal);
188
+ }
189
+
190
+ @utility z-popover {
191
+ z-index: var(--z-popover);
192
+ }
193
+
194
+ @utility z-toast {
195
+ z-index: var(--z-toast);
196
+ }
197
+
198
+ @utility duration-fast {
199
+ transition-duration: var(--duration-fast);
200
+ animation-duration: var(--duration-fast);
201
+ }
202
+
203
+ @utility duration-normal {
204
+ transition-duration: var(--duration-normal);
205
+ animation-duration: var(--duration-normal);
206
+ }
207
+
208
+ @utility duration-slow {
209
+ transition-duration: var(--duration-slow);
210
+ animation-duration: var(--duration-slow);
211
+ }
212
+
213
+ @media (prefers-reduced-motion: reduce) {
214
+ *, ::before, ::after {
215
+ animation-duration: 0.01ms !important;
216
+ animation-iteration-count: 1 !important;
217
+ transition-duration: 0.01ms !important;
218
+ scroll-behavior: auto !important;
219
+ }
329
220
  }