stagent 0.1.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 (333) hide show
  1. package/LICENSE +191 -0
  2. package/README.md +399 -0
  3. package/components.json +21 -0
  4. package/dist/cli.js +171 -0
  5. package/drizzle.config.ts +12 -0
  6. package/next.config.mjs +15 -0
  7. package/package.json +114 -0
  8. package/postcss.config.mjs +8 -0
  9. package/public/icon-512.png +0 -0
  10. package/public/icon.svg +13 -0
  11. package/public/readme/home-workspace.png +0 -0
  12. package/public/readme/inbox-approvals.png +0 -0
  13. package/public/readme/workflow-blueprints.png +0 -0
  14. package/public/stagent-s-128.png +0 -0
  15. package/public/stagent-s-64.png +0 -0
  16. package/src/app/api/blueprints/[id]/instantiate/route.ts +27 -0
  17. package/src/app/api/blueprints/[id]/route.ts +39 -0
  18. package/src/app/api/blueprints/import/route.ts +68 -0
  19. package/src/app/api/blueprints/route.ts +29 -0
  20. package/src/app/api/command-palette/recent/route.ts +31 -0
  21. package/src/app/api/data/clear/route.ts +22 -0
  22. package/src/app/api/data/seed/route.ts +22 -0
  23. package/src/app/api/documents/[id]/file/route.ts +44 -0
  24. package/src/app/api/documents/[id]/route.ts +123 -0
  25. package/src/app/api/documents/route.ts +59 -0
  26. package/src/app/api/logs/stream/route.ts +101 -0
  27. package/src/app/api/notifications/[id]/route.ts +36 -0
  28. package/src/app/api/notifications/mark-all-read/route.ts +13 -0
  29. package/src/app/api/notifications/pending-approvals/route.ts +10 -0
  30. package/src/app/api/notifications/pending-approvals/stream/route.ts +101 -0
  31. package/src/app/api/notifications/route.ts +34 -0
  32. package/src/app/api/permissions/route.ts +46 -0
  33. package/src/app/api/profiles/[id]/route.ts +79 -0
  34. package/src/app/api/profiles/[id]/test/route.ts +42 -0
  35. package/src/app/api/profiles/import/route.ts +108 -0
  36. package/src/app/api/profiles/route.ts +50 -0
  37. package/src/app/api/projects/[id]/route.ts +72 -0
  38. package/src/app/api/projects/route.ts +53 -0
  39. package/src/app/api/schedules/[id]/route.ts +185 -0
  40. package/src/app/api/schedules/route.ts +117 -0
  41. package/src/app/api/settings/budgets/route.ts +24 -0
  42. package/src/app/api/settings/openai/route.ts +24 -0
  43. package/src/app/api/settings/route.ts +21 -0
  44. package/src/app/api/settings/test/route.ts +26 -0
  45. package/src/app/api/tasks/[id]/cancel/route.ts +21 -0
  46. package/src/app/api/tasks/[id]/execute/route.ts +90 -0
  47. package/src/app/api/tasks/[id]/logs/route.ts +95 -0
  48. package/src/app/api/tasks/[id]/output/route.ts +47 -0
  49. package/src/app/api/tasks/[id]/respond/route.ts +64 -0
  50. package/src/app/api/tasks/[id]/resume/route.ts +76 -0
  51. package/src/app/api/tasks/[id]/route.ts +77 -0
  52. package/src/app/api/tasks/assist/route.ts +35 -0
  53. package/src/app/api/tasks/route.ts +82 -0
  54. package/src/app/api/uploads/[id]/route.ts +81 -0
  55. package/src/app/api/uploads/cleanup/route.ts +7 -0
  56. package/src/app/api/uploads/route.ts +66 -0
  57. package/src/app/api/workflows/[id]/execute/route.ts +82 -0
  58. package/src/app/api/workflows/[id]/route.ts +133 -0
  59. package/src/app/api/workflows/[id]/status/route.ts +54 -0
  60. package/src/app/api/workflows/[id]/steps/[stepId]/retry/route.ts +22 -0
  61. package/src/app/api/workflows/route.ts +61 -0
  62. package/src/app/apple-icon.tsx +31 -0
  63. package/src/app/costs/page.tsx +256 -0
  64. package/src/app/dashboard/page.tsx +44 -0
  65. package/src/app/documents/[id]/page.tsx +46 -0
  66. package/src/app/documents/page.tsx +45 -0
  67. package/src/app/error.tsx +26 -0
  68. package/src/app/global-error.tsx +23 -0
  69. package/src/app/globals.css +733 -0
  70. package/src/app/icon.tsx +30 -0
  71. package/src/app/inbox/loading.tsx +15 -0
  72. package/src/app/inbox/page.tsx +35 -0
  73. package/src/app/layout.tsx +78 -0
  74. package/src/app/manifest.ts +32 -0
  75. package/src/app/monitor/page.tsx +37 -0
  76. package/src/app/page.tsx +162 -0
  77. package/src/app/profiles/[id]/edit/page.tsx +39 -0
  78. package/src/app/profiles/[id]/page.tsx +33 -0
  79. package/src/app/profiles/new/page.tsx +22 -0
  80. package/src/app/profiles/page.tsx +19 -0
  81. package/src/app/projects/[id]/page.tsx +134 -0
  82. package/src/app/projects/loading.tsx +17 -0
  83. package/src/app/projects/page.tsx +32 -0
  84. package/src/app/schedules/[id]/page.tsx +47 -0
  85. package/src/app/schedules/page.tsx +18 -0
  86. package/src/app/settings/loading.tsx +24 -0
  87. package/src/app/settings/page.tsx +27 -0
  88. package/src/app/tasks/[id]/page.tsx +45 -0
  89. package/src/app/tasks/new/page.tsx +27 -0
  90. package/src/app/workflows/[id]/edit/page.tsx +66 -0
  91. package/src/app/workflows/[id]/page.tsx +37 -0
  92. package/src/app/workflows/blueprints/[id]/page.tsx +40 -0
  93. package/src/app/workflows/blueprints/new/page.tsx +20 -0
  94. package/src/app/workflows/blueprints/page.tsx +11 -0
  95. package/src/app/workflows/new/page.tsx +36 -0
  96. package/src/app/workflows/page.tsx +18 -0
  97. package/src/components/charts/donut-ring.tsx +64 -0
  98. package/src/components/charts/mini-bar.tsx +75 -0
  99. package/src/components/charts/sparkline.tsx +107 -0
  100. package/src/components/costs/cost-dashboard.tsx +877 -0
  101. package/src/components/costs/cost-filters.tsx +179 -0
  102. package/src/components/dashboard/activity-feed.tsx +95 -0
  103. package/src/components/dashboard/greeting.tsx +30 -0
  104. package/src/components/dashboard/priority-queue.tsx +79 -0
  105. package/src/components/dashboard/quick-actions.tsx +62 -0
  106. package/src/components/dashboard/recent-projects.tsx +79 -0
  107. package/src/components/dashboard/stats-cards.tsx +114 -0
  108. package/src/components/documents/document-browser.tsx +235 -0
  109. package/src/components/documents/document-detail-view.tsx +367 -0
  110. package/src/components/documents/document-grid.tsx +78 -0
  111. package/src/components/documents/document-preview.tsx +68 -0
  112. package/src/components/documents/document-table.tsx +119 -0
  113. package/src/components/documents/document-upload-dialog.tsx +153 -0
  114. package/src/components/documents/types.ts +6 -0
  115. package/src/components/documents/utils.ts +57 -0
  116. package/src/components/monitoring/connection-indicator.tsx +14 -0
  117. package/src/components/monitoring/log-entry.tsx +79 -0
  118. package/src/components/monitoring/log-filters.tsx +57 -0
  119. package/src/components/monitoring/log-stream.tsx +144 -0
  120. package/src/components/monitoring/monitor-overview-wrapper.tsx +64 -0
  121. package/src/components/monitoring/monitor-overview.tsx +119 -0
  122. package/src/components/notifications/failure-action.tsx +38 -0
  123. package/src/components/notifications/inbox-list.tsx +165 -0
  124. package/src/components/notifications/message-response.tsx +196 -0
  125. package/src/components/notifications/notification-item.tsx +250 -0
  126. package/src/components/notifications/pending-approval-host.tsx +478 -0
  127. package/src/components/notifications/permission-action.tsx +37 -0
  128. package/src/components/notifications/permission-response-actions.tsx +126 -0
  129. package/src/components/notifications/unread-badge.tsx +35 -0
  130. package/src/components/profiles/profile-browser.tsx +117 -0
  131. package/src/components/profiles/profile-card.tsx +78 -0
  132. package/src/components/profiles/profile-detail-view.tsx +564 -0
  133. package/src/components/profiles/profile-form-view.tsx +480 -0
  134. package/src/components/profiles/profile-import-dialog.tsx +113 -0
  135. package/src/components/projects/project-card.tsx +58 -0
  136. package/src/components/projects/project-create-dialog.tsx +140 -0
  137. package/src/components/projects/project-detail.tsx +68 -0
  138. package/src/components/projects/project-edit-dialog.tsx +219 -0
  139. package/src/components/projects/project-list.tsx +108 -0
  140. package/src/components/schedules/schedule-create-dialog.tsx +403 -0
  141. package/src/components/schedules/schedule-detail-view.tsx +274 -0
  142. package/src/components/schedules/schedule-list.tsx +242 -0
  143. package/src/components/schedules/schedule-status-badge.tsx +16 -0
  144. package/src/components/settings/api-key-form.tsx +141 -0
  145. package/src/components/settings/auth-config-section.tsx +141 -0
  146. package/src/components/settings/auth-method-selector.tsx +67 -0
  147. package/src/components/settings/auth-status-badge.tsx +40 -0
  148. package/src/components/settings/auth-status-dot.tsx +59 -0
  149. package/src/components/settings/budget-guardrails-section.tsx +842 -0
  150. package/src/components/settings/data-management-section.tsx +141 -0
  151. package/src/components/settings/openai-runtime-section.tsx +104 -0
  152. package/src/components/settings/permissions-section.tsx +91 -0
  153. package/src/components/shared/app-sidebar.tsx +123 -0
  154. package/src/components/shared/card-skeleton.tsx +42 -0
  155. package/src/components/shared/command-palette.tsx +250 -0
  156. package/src/components/shared/confirm-dialog.tsx +52 -0
  157. package/src/components/shared/empty-state.tsx +24 -0
  158. package/src/components/shared/error-state.tsx +32 -0
  159. package/src/components/shared/form-section-card.tsx +33 -0
  160. package/src/components/shared/section-heading.tsx +14 -0
  161. package/src/components/shared/stagent-logo.tsx +21 -0
  162. package/src/components/shared/theme-toggle.tsx +46 -0
  163. package/src/components/tasks/ai-assist-panel.tsx +210 -0
  164. package/src/components/tasks/content-preview.tsx +89 -0
  165. package/src/components/tasks/empty-board.tsx +12 -0
  166. package/src/components/tasks/file-upload.tsx +120 -0
  167. package/src/components/tasks/kanban-board.tsx +275 -0
  168. package/src/components/tasks/kanban-column.tsx +75 -0
  169. package/src/components/tasks/skeleton-board.tsx +21 -0
  170. package/src/components/tasks/task-attachments.tsx +114 -0
  171. package/src/components/tasks/task-card.tsx +101 -0
  172. package/src/components/tasks/task-create-panel.tsx +360 -0
  173. package/src/components/tasks/task-detail-view.tsx +356 -0
  174. package/src/components/ui/alert-dialog.tsx +196 -0
  175. package/src/components/ui/badge.tsx +50 -0
  176. package/src/components/ui/button.tsx +71 -0
  177. package/src/components/ui/card.tsx +92 -0
  178. package/src/components/ui/checkbox.tsx +32 -0
  179. package/src/components/ui/command.tsx +184 -0
  180. package/src/components/ui/dialog.tsx +158 -0
  181. package/src/components/ui/dropdown-menu.tsx +257 -0
  182. package/src/components/ui/form.tsx +167 -0
  183. package/src/components/ui/input.tsx +21 -0
  184. package/src/components/ui/label.tsx +24 -0
  185. package/src/components/ui/popover.tsx +89 -0
  186. package/src/components/ui/progress.tsx +31 -0
  187. package/src/components/ui/radio-group.tsx +45 -0
  188. package/src/components/ui/scroll-area.tsx +58 -0
  189. package/src/components/ui/select.tsx +190 -0
  190. package/src/components/ui/separator.tsx +28 -0
  191. package/src/components/ui/sheet.tsx +143 -0
  192. package/src/components/ui/sidebar.tsx +726 -0
  193. package/src/components/ui/skeleton.tsx +13 -0
  194. package/src/components/ui/slider.tsx +63 -0
  195. package/src/components/ui/sonner.tsx +36 -0
  196. package/src/components/ui/switch.tsx +35 -0
  197. package/src/components/ui/table.tsx +116 -0
  198. package/src/components/ui/tabs.tsx +91 -0
  199. package/src/components/ui/textarea.tsx +18 -0
  200. package/src/components/ui/tooltip.tsx +57 -0
  201. package/src/components/workflows/blueprint-editor.tsx +109 -0
  202. package/src/components/workflows/blueprint-gallery.tsx +155 -0
  203. package/src/components/workflows/blueprint-preview.tsx +240 -0
  204. package/src/components/workflows/loop-status-view.tsx +272 -0
  205. package/src/components/workflows/swarm-dashboard.tsx +185 -0
  206. package/src/components/workflows/workflow-form-view.tsx +1376 -0
  207. package/src/components/workflows/workflow-list.tsx +230 -0
  208. package/src/components/workflows/workflow-status-view.tsx +477 -0
  209. package/src/hooks/use-mobile.ts +19 -0
  210. package/src/instrumentation.ts +7 -0
  211. package/src/lib/agents/claude-agent.ts +737 -0
  212. package/src/lib/agents/execution-manager.ts +27 -0
  213. package/src/lib/agents/profiles/assignment-validation.ts +75 -0
  214. package/src/lib/agents/profiles/builtins/code-reviewer/SKILL.md +21 -0
  215. package/src/lib/agents/profiles/builtins/code-reviewer/profile.yaml +28 -0
  216. package/src/lib/agents/profiles/builtins/data-analyst/SKILL.md +25 -0
  217. package/src/lib/agents/profiles/builtins/data-analyst/profile.yaml +27 -0
  218. package/src/lib/agents/profiles/builtins/devops-engineer/SKILL.md +34 -0
  219. package/src/lib/agents/profiles/builtins/devops-engineer/profile.yaml +27 -0
  220. package/src/lib/agents/profiles/builtins/document-writer/SKILL.md +16 -0
  221. package/src/lib/agents/profiles/builtins/document-writer/profile.yaml +27 -0
  222. package/src/lib/agents/profiles/builtins/general/SKILL.md +13 -0
  223. package/src/lib/agents/profiles/builtins/general/profile.yaml +18 -0
  224. package/src/lib/agents/profiles/builtins/health-fitness-coach/SKILL.md +34 -0
  225. package/src/lib/agents/profiles/builtins/health-fitness-coach/profile.yaml +26 -0
  226. package/src/lib/agents/profiles/builtins/learning-coach/SKILL.md +35 -0
  227. package/src/lib/agents/profiles/builtins/learning-coach/profile.yaml +26 -0
  228. package/src/lib/agents/profiles/builtins/project-manager/SKILL.md +26 -0
  229. package/src/lib/agents/profiles/builtins/project-manager/profile.yaml +26 -0
  230. package/src/lib/agents/profiles/builtins/researcher/SKILL.md +15 -0
  231. package/src/lib/agents/profiles/builtins/researcher/profile.yaml +27 -0
  232. package/src/lib/agents/profiles/builtins/shopping-assistant/SKILL.md +34 -0
  233. package/src/lib/agents/profiles/builtins/shopping-assistant/profile.yaml +26 -0
  234. package/src/lib/agents/profiles/builtins/technical-writer/SKILL.md +31 -0
  235. package/src/lib/agents/profiles/builtins/technical-writer/profile.yaml +29 -0
  236. package/src/lib/agents/profiles/builtins/travel-planner/SKILL.md +23 -0
  237. package/src/lib/agents/profiles/builtins/travel-planner/profile.yaml +26 -0
  238. package/src/lib/agents/profiles/builtins/wealth-manager/SKILL.md +24 -0
  239. package/src/lib/agents/profiles/builtins/wealth-manager/profile.yaml +26 -0
  240. package/src/lib/agents/profiles/compatibility.ts +109 -0
  241. package/src/lib/agents/profiles/registry.ts +293 -0
  242. package/src/lib/agents/profiles/test-runner.ts +18 -0
  243. package/src/lib/agents/profiles/test-types.ts +20 -0
  244. package/src/lib/agents/profiles/types.ts +43 -0
  245. package/src/lib/agents/router.ts +56 -0
  246. package/src/lib/agents/runtime/catalog.ts +85 -0
  247. package/src/lib/agents/runtime/claude-sdk.ts +12 -0
  248. package/src/lib/agents/runtime/claude.ts +370 -0
  249. package/src/lib/agents/runtime/codex-app-server-client.ts +289 -0
  250. package/src/lib/agents/runtime/index.ts +167 -0
  251. package/src/lib/agents/runtime/openai-codex.ts +1089 -0
  252. package/src/lib/agents/runtime/task-assist-types.ts +8 -0
  253. package/src/lib/agents/runtime/types.ts +30 -0
  254. package/src/lib/constants/settings.ts +13 -0
  255. package/src/lib/constants/status-colors.ts +44 -0
  256. package/src/lib/constants/task-status.ts +49 -0
  257. package/src/lib/data/clear.ts +63 -0
  258. package/src/lib/data/seed-data/documents.ts +715 -0
  259. package/src/lib/data/seed-data/logs.ts +195 -0
  260. package/src/lib/data/seed-data/notifications.ts +141 -0
  261. package/src/lib/data/seed-data/profiles.ts +175 -0
  262. package/src/lib/data/seed-data/projects.ts +61 -0
  263. package/src/lib/data/seed-data/schedules.ts +108 -0
  264. package/src/lib/data/seed-data/tasks.ts +341 -0
  265. package/src/lib/data/seed-data/usage-ledger.ts +130 -0
  266. package/src/lib/data/seed-data/workflows.ts +213 -0
  267. package/src/lib/data/seed.ts +129 -0
  268. package/src/lib/db/index.ts +221 -0
  269. package/src/lib/db/migrations/0000_aromatic_gargoyle.sql +59 -0
  270. package/src/lib/db/migrations/0001_first_iron_patriot.sql +6 -0
  271. package/src/lib/db/migrations/0002_add_resume_count.sql +1 -0
  272. package/src/lib/db/migrations/0003_add_settings.sql +5 -0
  273. package/src/lib/db/migrations/0004_add_documents.sql +20 -0
  274. package/src/lib/db/migrations/0005_add_document_preprocessing.sql +4 -0
  275. package/src/lib/db/migrations/0006_add_agent_profile.sql +2 -0
  276. package/src/lib/db/migrations/0007_add_usage_metering_ledger.sql +30 -0
  277. package/src/lib/db/migrations/0008_add_document_version.sql +1 -0
  278. package/src/lib/db/migrations/meta/0000_snapshot.json +416 -0
  279. package/src/lib/db/migrations/meta/0001_snapshot.json +461 -0
  280. package/src/lib/db/migrations/meta/0002_snapshot.json +469 -0
  281. package/src/lib/db/migrations/meta/_journal.json +27 -0
  282. package/src/lib/db/schema.ts +227 -0
  283. package/src/lib/documents/cleanup.ts +50 -0
  284. package/src/lib/documents/context-builder.ts +75 -0
  285. package/src/lib/documents/output-scanner.ts +166 -0
  286. package/src/lib/documents/processor.ts +120 -0
  287. package/src/lib/documents/processors/image.ts +21 -0
  288. package/src/lib/documents/processors/office.ts +36 -0
  289. package/src/lib/documents/processors/pdf.ts +12 -0
  290. package/src/lib/documents/processors/spreadsheet.ts +18 -0
  291. package/src/lib/documents/processors/text.ts +8 -0
  292. package/src/lib/documents/registry.ts +25 -0
  293. package/src/lib/notifications/actionable.ts +108 -0
  294. package/src/lib/notifications/permissions.ts +169 -0
  295. package/src/lib/queries/chart-data.ts +184 -0
  296. package/src/lib/schedules/interval-parser.ts +110 -0
  297. package/src/lib/schedules/scheduler.ts +220 -0
  298. package/src/lib/settings/auth.ts +98 -0
  299. package/src/lib/settings/budget-guardrails.ts +590 -0
  300. package/src/lib/settings/helpers.ts +23 -0
  301. package/src/lib/settings/openai-auth.ts +80 -0
  302. package/src/lib/settings/permissions.ts +102 -0
  303. package/src/lib/usage/ledger.ts +489 -0
  304. package/src/lib/usage/pricing.ts +68 -0
  305. package/src/lib/utils/crypto.ts +90 -0
  306. package/src/lib/utils/format-timestamp.ts +46 -0
  307. package/src/lib/utils/session-cleanup.ts +26 -0
  308. package/src/lib/utils/stagent-paths.ts +18 -0
  309. package/src/lib/utils.ts +6 -0
  310. package/src/lib/validators/blueprint.ts +43 -0
  311. package/src/lib/validators/profile.ts +64 -0
  312. package/src/lib/validators/project.ts +17 -0
  313. package/src/lib/validators/settings.ts +57 -0
  314. package/src/lib/validators/task.ts +30 -0
  315. package/src/lib/workflows/blueprints/builtins/code-review-pipeline.yaml +72 -0
  316. package/src/lib/workflows/blueprints/builtins/documentation-generation.yaml +62 -0
  317. package/src/lib/workflows/blueprints/builtins/investment-research.yaml +81 -0
  318. package/src/lib/workflows/blueprints/builtins/meal-planning.yaml +73 -0
  319. package/src/lib/workflows/blueprints/builtins/product-research.yaml +72 -0
  320. package/src/lib/workflows/blueprints/builtins/research-report.yaml +77 -0
  321. package/src/lib/workflows/blueprints/builtins/sprint-planning.yaml +77 -0
  322. package/src/lib/workflows/blueprints/builtins/travel-planning.yaml +80 -0
  323. package/src/lib/workflows/blueprints/instantiator.ts +131 -0
  324. package/src/lib/workflows/blueprints/registry.ts +128 -0
  325. package/src/lib/workflows/blueprints/template.ts +58 -0
  326. package/src/lib/workflows/blueprints/types.ts +38 -0
  327. package/src/lib/workflows/definition-validation.ts +121 -0
  328. package/src/lib/workflows/engine.ts +1113 -0
  329. package/src/lib/workflows/loop-executor.ts +270 -0
  330. package/src/lib/workflows/parallel.ts +55 -0
  331. package/src/lib/workflows/swarm.ts +97 -0
  332. package/src/lib/workflows/types.ts +112 -0
  333. package/tsconfig.json +41 -0
@@ -0,0 +1,733 @@
1
+ @import "tailwindcss";
2
+ @import "tw-animate-css";
3
+ @plugin "@tailwindcss/typography";
4
+
5
+ @custom-variant dark (&:is(.dark *));
6
+
7
+ @theme inline {
8
+ --color-background: var(--background);
9
+ --color-foreground: var(--foreground);
10
+ --color-card: var(--card);
11
+ --color-card-foreground: var(--card-foreground);
12
+ --color-popover: var(--popover);
13
+ --color-popover-foreground: var(--popover-foreground);
14
+ --color-primary: var(--primary);
15
+ --color-primary-foreground: var(--primary-foreground);
16
+ --color-secondary: var(--secondary);
17
+ --color-secondary-foreground: var(--secondary-foreground);
18
+ --color-muted: var(--muted);
19
+ --color-muted-foreground: var(--muted-foreground);
20
+ --color-accent: var(--accent);
21
+ --color-accent-foreground: var(--accent-foreground);
22
+ --color-destructive: var(--destructive);
23
+ --color-destructive-foreground: var(--destructive-foreground);
24
+ --color-border: var(--border);
25
+ --color-input: var(--input);
26
+ --color-ring: var(--ring);
27
+ --color-chart-1: var(--chart-1);
28
+ --color-chart-2: var(--chart-2);
29
+ --color-chart-3: var(--chart-3);
30
+ --color-chart-4: var(--chart-4);
31
+ --color-chart-5: var(--chart-5);
32
+ --color-sidebar: var(--sidebar);
33
+ --color-sidebar-foreground: var(--sidebar-foreground);
34
+ --color-sidebar-primary: var(--sidebar-primary);
35
+ --color-sidebar-primary-foreground: var(--sidebar-primary-foreground);
36
+ --color-sidebar-accent: var(--sidebar-accent);
37
+ --color-sidebar-accent-foreground: var(--sidebar-accent-foreground);
38
+ --color-sidebar-border: var(--sidebar-border);
39
+ --color-sidebar-ring: var(--sidebar-ring);
40
+ /* Semantic status colors */
41
+ --color-status-running: var(--status-running);
42
+ --color-status-completed: var(--status-completed);
43
+ --color-status-failed: var(--status-failed);
44
+ --color-status-warning: var(--status-warning);
45
+ /* Semantic priority colors */
46
+ --color-priority-critical: var(--priority-critical);
47
+ --color-priority-high: var(--priority-high);
48
+ --color-priority-medium: var(--priority-medium);
49
+ --color-priority-low: var(--priority-low);
50
+ /* Semantic connection/auth colors */
51
+ --color-success: var(--status-completed);
52
+ --color-warning: var(--status-warning);
53
+ --color-info: var(--status-running);
54
+ /* Complexity colors */
55
+ --color-complexity-simple: var(--complexity-simple);
56
+ --color-complexity-moderate: var(--complexity-moderate);
57
+ --color-complexity-complex: var(--complexity-complex);
58
+ --font-sans: var(--font-geist-sans);
59
+ --font-mono: var(--font-geist-mono);
60
+ --radius-sm: calc(var(--radius) - 4px);
61
+ --radius-md: calc(var(--radius) - 2px);
62
+ --radius-lg: var(--radius);
63
+ --radius-xl: calc(var(--radius) + 4px);
64
+ }
65
+
66
+ :root {
67
+ --radius: 0.625rem;
68
+ --background: oklch(0.98 0.005 260);
69
+ --foreground: oklch(0.15 0.02 260);
70
+ --card: rgba(255, 255, 255, 0.6);
71
+ --card-foreground: oklch(0.15 0.02 260);
72
+ --popover: rgba(255, 255, 255, 0.6);
73
+ --popover-foreground: oklch(0.15 0.02 260);
74
+ --primary: oklch(0.55 0.18 260);
75
+ --primary-foreground: oklch(0.98 0.005 260);
76
+ --secondary: oklch(0.93 0.01 260);
77
+ --secondary-foreground: oklch(0.25 0.03 260);
78
+ --muted: oklch(0.94 0.008 260);
79
+ --muted-foreground: oklch(0.45 0.03 260);
80
+ --surface-1: rgba(255, 255, 255, 0.92);
81
+ --surface-2: rgba(255, 255, 255, 0.82);
82
+ --surface-3: rgba(255, 255, 255, 0.72);
83
+ --surface-foreground: oklch(0.18 0.02 260);
84
+ --accent: oklch(0.93 0.01 260);
85
+ --accent-foreground: oklch(0.25 0.03 260);
86
+ --destructive: oklch(0.55 0.2 25);
87
+ --destructive-foreground: oklch(0.98 0.005 260);
88
+ --border: var(--glass-border);
89
+ --input: rgba(255, 255, 255, 0.4);
90
+ --ring: oklch(0.55 0.18 260);
91
+ --chart-1: oklch(0.55 0.22 260);
92
+ --chart-2: oklch(0.6 0.19 170);
93
+ --chart-3: oklch(0.55 0.19 45);
94
+ --chart-4: oklch(0.6 0.22 300);
95
+ --chart-5: oklch(0.65 0.19 30);
96
+ --sidebar: rgba(255, 255, 255, 0.65);
97
+ --sidebar-foreground: oklch(0.15 0.02 260);
98
+ --sidebar-primary: oklch(0.55 0.18 260);
99
+ --sidebar-primary-foreground: oklch(0.98 0.005 260);
100
+ --sidebar-accent: oklch(0.93 0.01 260);
101
+ --sidebar-accent-foreground: oklch(0.25 0.03 260);
102
+ --sidebar-border: var(--glass-border-subtle);
103
+ --sidebar-ring: oklch(0.55 0.18 260);
104
+ /* Semantic status tokens */
105
+ --status-running: oklch(0.55 0.18 260);
106
+ --status-completed: oklch(0.6 0.15 170);
107
+ --status-failed: oklch(0.55 0.2 25);
108
+ --status-warning: oklch(0.7 0.15 75);
109
+ /* Priority tokens */
110
+ --priority-critical: oklch(0.55 0.2 25);
111
+ --priority-high: oklch(0.7 0.15 55);
112
+ --priority-medium: oklch(0.55 0.18 260);
113
+ --priority-low: oklch(0.6 0.02 260);
114
+ /* Complexity tokens */
115
+ --complexity-simple: oklch(0.6 0.15 170);
116
+ --complexity-moderate: oklch(0.7 0.15 75);
117
+ --complexity-complex: oklch(0.55 0.2 25);
118
+
119
+ /* Glass backgrounds */
120
+ --glass-bg: rgba(255, 255, 255, 0.6);
121
+ --glass-bg-heavy: rgba(255, 255, 255, 0.75);
122
+ --glass-bg-light: rgba(255, 255, 255, 0.4);
123
+ --glass-bg-subtle: rgba(255, 255, 255, 0.25);
124
+
125
+ /* Glass borders — hue-tinted for soft edges */
126
+ --glass-border: oklch(0.8 0.02 260 / 0.25);
127
+ --glass-border-strong: oklch(0.75 0.03 260 / 0.35);
128
+ --glass-border-subtle: oklch(0.85 0.015 260 / 0.15);
129
+
130
+ /* Glass shadows — colored, not gray */
131
+ --glass-shadow: 0 8px 32px oklch(0.55 0.05 260 / 0.1);
132
+ --glass-shadow-lg: 0 12px 48px oklch(0.55 0.05 260 / 0.15);
133
+ --glass-shadow-sm: 0 4px 16px oklch(0.55 0.05 260 / 0.08);
134
+
135
+ /* Inner glow (top-edge highlight) — reduced to not compete with borders */
136
+ --glass-inner-glow: inset 0 1px 0 0 rgba(255, 255, 255, 0.4);
137
+ --glass-inner-glow-subtle: inset 0 1px 0 0 rgba(255, 255, 255, 0.2);
138
+
139
+ /* Glass modal background */
140
+ --glass-bg-modal: oklch(0.97 0.008 260 / 0.65);
141
+
142
+ /* Blur levels */
143
+ --blur-glass-sm: 8px;
144
+ --blur-glass-md: 16px;
145
+ --blur-glass-lg: 24px;
146
+ --blur-glass-xl: 40px;
147
+
148
+ /* Pastel gradient presets */
149
+ --gradient-morning-sky: linear-gradient(
150
+ 135deg,
151
+ oklch(0.94 0.04 85) 0%,
152
+ oklch(0.93 0.035 60) 50%,
153
+ oklch(0.94 0.03 40) 100%
154
+ );
155
+ --gradient-ocean-mist: linear-gradient(
156
+ 135deg,
157
+ oklch(0.92 0.04 200) 0%,
158
+ oklch(0.93 0.035 170) 50%,
159
+ oklch(0.94 0.03 155) 100%
160
+ );
161
+ --gradient-forest-dawn: linear-gradient(
162
+ 135deg,
163
+ oklch(0.93 0.03 155) 0%,
164
+ oklch(0.93 0.025 140) 50%,
165
+ oklch(0.94 0.03 135) 100%
166
+ );
167
+ --gradient-sunset-glow: linear-gradient(
168
+ 135deg,
169
+ oklch(0.93 0.04 60) 0%,
170
+ oklch(0.92 0.045 30) 50%,
171
+ oklch(0.93 0.04 10) 100%
172
+ );
173
+ --gradient-twilight: linear-gradient(
174
+ 135deg,
175
+ oklch(0.91 0.04 290) 0%,
176
+ oklch(0.92 0.035 260) 50%,
177
+ oklch(0.93 0.03 260) 100%
178
+ );
179
+ --gradient-neutral: linear-gradient(
180
+ 135deg,
181
+ oklch(0.96 0.015 80) 0%,
182
+ oklch(0.95 0.012 60) 50%,
183
+ oklch(0.96 0.01 90) 100%
184
+ );
185
+ }
186
+
187
+ .dark {
188
+ /* Background — deep black with navy undertone */
189
+ --background: oklch(0.09 0.02 265);
190
+ --foreground: oklch(0.93 0.015 270);
191
+
192
+ /* Cards — navy-tinted translucency */
193
+ --card: oklch(0.16 0.025 265 / 0.6);
194
+ --card-foreground: oklch(0.93 0.015 270);
195
+ --popover: oklch(0.14 0.025 265 / 0.5);
196
+ --popover-foreground: oklch(0.93 0.015 270);
197
+
198
+ /* Primary — blue, stays mostly the same */
199
+ --primary: oklch(0.65 0.18 260);
200
+ --primary-foreground: oklch(0.09 0.02 265);
201
+
202
+ /* Secondary — velvet-shifted */
203
+ --secondary: oklch(0.18 0.035 310);
204
+ --secondary-foreground: oklch(0.93 0.015 270);
205
+
206
+ /* Muted — navy mid-tone */
207
+ --muted: oklch(0.18 0.03 290);
208
+ --muted-foreground: oklch(0.6 0.03 270);
209
+ --surface-1: oklch(0.16 0.02 268 / 0.96);
210
+ --surface-2: oklch(0.14 0.018 272 / 0.9);
211
+ --surface-3: oklch(0.12 0.02 278 / 0.84);
212
+ --surface-foreground: oklch(0.93 0.015 270);
213
+
214
+ /* Accent — navy, distinct from secondary velvet */
215
+ --accent: oklch(0.20 0.04 285);
216
+ --accent-foreground: oklch(0.93 0.015 270);
217
+
218
+ --destructive: oklch(0.55 0.2 25);
219
+ --destructive-foreground: oklch(0.98 0.005 260);
220
+ --border: var(--glass-border);
221
+ --input: oklch(0.14 0.03 265 / 0.4);
222
+ --ring: oklch(0.65 0.18 260);
223
+
224
+ --chart-1: oklch(0.65 0.22 260);
225
+ --chart-2: oklch(0.65 0.19 170);
226
+ --chart-3: oklch(0.65 0.19 45);
227
+ --chart-4: oklch(0.65 0.22 300);
228
+ --chart-5: oklch(0.7 0.19 30);
229
+
230
+ /* Sidebar — slightly lighter velvet-black */
231
+ --sidebar: oklch(0.11 0.025 290 / 0.6);
232
+ --sidebar-foreground: oklch(0.93 0.015 270);
233
+ --sidebar-primary: oklch(0.65 0.18 260);
234
+ --sidebar-primary-foreground: oklch(0.09 0.02 265);
235
+ --sidebar-accent: oklch(0.20 0.04 300);
236
+ --sidebar-accent-foreground: oklch(0.93 0.015 270);
237
+ --sidebar-border: var(--glass-border-subtle);
238
+ --sidebar-ring: oklch(0.65 0.18 260);
239
+ /* Semantic status tokens */
240
+ --status-running: oklch(0.65 0.18 260);
241
+ --status-completed: oklch(0.65 0.15 170);
242
+ --status-failed: oklch(0.65 0.2 25);
243
+ --status-warning: oklch(0.75 0.15 75);
244
+ /* Priority tokens */
245
+ --priority-critical: oklch(0.65 0.2 25);
246
+ --priority-high: oklch(0.75 0.15 55);
247
+ --priority-medium: oklch(0.65 0.18 260);
248
+ --priority-low: oklch(0.6 0.02 260);
249
+ /* Complexity tokens */
250
+ --complexity-simple: oklch(0.65 0.15 170);
251
+ --complexity-moderate: oklch(0.75 0.15 75);
252
+ --complexity-complex: oklch(0.65 0.2 25);
253
+
254
+ /* Dark mode glass overrides — navy-tinted instead of colorless white */
255
+ --glass-bg: oklch(0.18 0.025 265 / 0.45);
256
+ --glass-bg-heavy: oklch(0.22 0.03 265 / 0.55);
257
+ --glass-bg-light: oklch(0.16 0.02 265 / 0.25);
258
+ --glass-bg-subtle: oklch(0.14 0.015 265 / 0.15);
259
+
260
+ /* Glass borders — navy-tinted for cohesion */
261
+ --glass-border: oklch(0.4 0.04 265 / 0.3);
262
+ --glass-border-strong: oklch(0.45 0.05 270 / 0.4);
263
+ --glass-border-subtle: oklch(0.35 0.03 285 / 0.18);
264
+
265
+ /* Glass shadows — deeper with navy tint */
266
+ --glass-shadow: 0 8px 32px oklch(0.05 0.03 265 / 0.5);
267
+ --glass-shadow-lg: 0 12px 48px oklch(0.05 0.03 265 / 0.6);
268
+ --glass-shadow-sm: 0 4px 16px oklch(0.05 0.03 265 / 0.35);
269
+
270
+ /* Inner glow — faint navy highlight */
271
+ --glass-inner-glow: inset 0 1px 0 0 oklch(0.5 0.04 270 / 0.15);
272
+ --glass-inner-glow-subtle: inset 0 1px 0 0 oklch(0.5 0.04 270 / 0.1);
273
+
274
+ /* Modal — deep navy glass */
275
+ --glass-bg-modal: oklch(0.12 0.03 285 / 0.75);
276
+
277
+ /* Dark mode gradient presets — distinct identities using black/velvet/blue/navy palette */
278
+ /* Dashboard/Home — deep black → midnight blue */
279
+ --gradient-morning-sky: linear-gradient(
280
+ 135deg,
281
+ oklch(0.10 0.02 260) 0%,
282
+ oklch(0.12 0.035 260) 50%,
283
+ oklch(0.10 0.025 270) 100%
284
+ );
285
+ /* Projects/Workflows — deep blue → blue-navy */
286
+ --gradient-ocean-mist: linear-gradient(
287
+ 135deg,
288
+ oklch(0.11 0.04 260) 0%,
289
+ oklch(0.12 0.045 265) 50%,
290
+ oklch(0.11 0.035 265) 100%
291
+ );
292
+ /* Monitor — black → deep navy */
293
+ --gradient-forest-dawn: linear-gradient(
294
+ 135deg,
295
+ oklch(0.09 0.02 270) 0%,
296
+ oklch(0.11 0.035 285) 50%,
297
+ oklch(0.10 0.03 290) 100%
298
+ );
299
+ /* Inbox — velvet → warm navy */
300
+ --gradient-sunset-glow: linear-gradient(
301
+ 135deg,
302
+ oklch(0.12 0.04 320) 0%,
303
+ oklch(0.11 0.045 305) 50%,
304
+ oklch(0.12 0.035 290) 100%
305
+ );
306
+ /* Documents — deep navy → indigo */
307
+ --gradient-twilight: linear-gradient(
308
+ 135deg,
309
+ oklch(0.11 0.05 290) 0%,
310
+ oklch(0.10 0.045 275) 50%,
311
+ oklch(0.11 0.04 260) 100%
312
+ );
313
+ /* Settings — neutral black with subtle velvet warmth */
314
+ --gradient-neutral: linear-gradient(
315
+ 135deg,
316
+ oklch(0.10 0.015 290) 0%,
317
+ oklch(0.095 0.02 300) 50%,
318
+ oklch(0.10 0.015 265) 100%
319
+ );
320
+ }
321
+
322
+ /* =============================================================
323
+ PHASE 2: Glass Utility Classes, Data-Slot Selectors, Animations
324
+ ============================================================= */
325
+
326
+ /* --- Composite glass classes --- */
327
+ .glass-card {
328
+ background: var(--glass-bg);
329
+ -webkit-backdrop-filter: blur(var(--blur-glass-md));
330
+ backdrop-filter: blur(var(--blur-glass-md));
331
+ border: 1px solid var(--glass-border);
332
+ box-shadow: var(--glass-shadow), var(--glass-inner-glow);
333
+ }
334
+
335
+ .glass-card-heavy {
336
+ background: var(--glass-bg-heavy);
337
+ -webkit-backdrop-filter: blur(var(--blur-glass-lg));
338
+ backdrop-filter: blur(var(--blur-glass-lg));
339
+ border: 1px solid var(--glass-border-strong);
340
+ box-shadow: var(--glass-shadow-lg), var(--glass-inner-glow);
341
+ }
342
+
343
+ .glass-card-light {
344
+ background: var(--glass-bg-light);
345
+ -webkit-backdrop-filter: blur(var(--blur-glass-sm));
346
+ backdrop-filter: blur(var(--blur-glass-sm));
347
+ border: 1px solid var(--glass-border-subtle);
348
+ box-shadow: var(--glass-shadow-sm), var(--glass-inner-glow-subtle);
349
+ }
350
+
351
+ .logo-glass-bg {
352
+ background: oklch(0.15 0.04 260);
353
+ box-shadow: inset 0 1px 0 0 oklch(0.3 0.04 260 / 0.3), var(--glass-shadow-sm);
354
+ }
355
+ .dark .logo-glass-bg {
356
+ background: oklch(0.12 0.03 260);
357
+ box-shadow: inset 0 1px 0 0 oklch(0.3 0.04 260 / 0.15), var(--glass-shadow-sm);
358
+ }
359
+
360
+ .glass-sidebar {
361
+ background: var(--glass-bg-heavy);
362
+ -webkit-backdrop-filter: blur(var(--blur-glass-lg));
363
+ backdrop-filter: blur(var(--blur-glass-lg));
364
+ border-color: var(--glass-border-subtle) !important;
365
+ box-shadow: inset -1px 0 0 0 oklch(1 0 0 / 0.15), var(--glass-shadow-sm) !important;
366
+ }
367
+
368
+ .glass-sidebar [data-sidebar="sidebar"] {
369
+ background:
370
+ linear-gradient(
371
+ 180deg,
372
+ color-mix(in srgb, var(--surface-1) 90%, transparent) 0%,
373
+ color-mix(in srgb, var(--surface-2) 94%, transparent) 58%,
374
+ color-mix(in srgb, var(--surface-3) 88%, transparent) 100%
375
+ );
376
+ border-right: 1px solid color-mix(in oklab, var(--border) 75%, transparent);
377
+ box-shadow:
378
+ inset -1px 0 0 0 oklch(1 0 0 / 0.16),
379
+ 12px 0 32px oklch(0.12 0.02 260 / 0.05);
380
+ }
381
+
382
+ .glass-sidebar [data-sidebar="header"] {
383
+ border-bottom: 1px solid color-mix(in oklab, var(--border) 68%, transparent);
384
+ }
385
+
386
+ .glass-sidebar [data-sidebar="footer"] {
387
+ border-top: 1px solid color-mix(in oklab, var(--border) 68%, transparent);
388
+ }
389
+
390
+ .glass-input {
391
+ background: var(--glass-bg-light);
392
+ -webkit-backdrop-filter: blur(var(--blur-glass-sm));
393
+ backdrop-filter: blur(var(--blur-glass-sm));
394
+ border: 1px solid var(--glass-border-subtle);
395
+ }
396
+
397
+ /* --- Data-slot selectors (auto-glass shadcn components) --- */
398
+ [data-slot="card"][data-slot="card"] {
399
+ background: var(--glass-bg);
400
+ -webkit-backdrop-filter: blur(var(--blur-glass-md));
401
+ backdrop-filter: blur(var(--blur-glass-md));
402
+ border-color: var(--glass-border);
403
+ box-shadow: var(--glass-shadow), var(--glass-inner-glow);
404
+ will-change: backdrop-filter;
405
+ }
406
+
407
+ [data-slot="card"][data-slot="card"]:hover {
408
+ background: var(--glass-bg-heavy);
409
+ box-shadow: var(--glass-shadow-lg), var(--glass-inner-glow);
410
+ transition: background 0.3s ease, box-shadow 0.3s ease;
411
+ }
412
+
413
+ [data-sidebar="sidebar"] {
414
+ -webkit-backdrop-filter: blur(var(--blur-glass-lg));
415
+ backdrop-filter: blur(var(--blur-glass-lg));
416
+ }
417
+
418
+ [data-slot="badge"] {
419
+ -webkit-backdrop-filter: blur(var(--blur-glass-sm));
420
+ backdrop-filter: blur(var(--blur-glass-sm));
421
+ }
422
+
423
+ [data-slot="input"],
424
+ [data-slot="textarea"] {
425
+ background: var(--glass-bg-light);
426
+ -webkit-backdrop-filter: blur(var(--blur-glass-sm));
427
+ backdrop-filter: blur(var(--blur-glass-sm));
428
+ border-color: var(--glass-border-subtle);
429
+ }
430
+
431
+ [data-slot="select-trigger"] {
432
+ background: var(--glass-bg-light);
433
+ -webkit-backdrop-filter: blur(var(--blur-glass-sm));
434
+ backdrop-filter: blur(var(--blur-glass-sm));
435
+ border-color: var(--glass-border-subtle);
436
+ }
437
+
438
+ [data-slot="slider"] {
439
+ --slider-track-bg: var(--glass-bg-light);
440
+ }
441
+
442
+ [data-slot="slider-track"] {
443
+ background: var(--glass-bg-light);
444
+ -webkit-backdrop-filter: blur(var(--blur-glass-sm));
445
+ backdrop-filter: blur(var(--blur-glass-sm));
446
+ }
447
+
448
+ [data-slot="slider-range"] {
449
+ background: var(--primary);
450
+ }
451
+
452
+ [data-slot="slider-thumb"] {
453
+ background: var(--glass-bg-heavy);
454
+ -webkit-backdrop-filter: blur(var(--blur-glass-sm));
455
+ backdrop-filter: blur(var(--blur-glass-sm));
456
+ border-color: var(--primary);
457
+ box-shadow: var(--glass-shadow-sm);
458
+ }
459
+
460
+ /* Temperature slider gradient track */
461
+ .slider-temperature [data-slot="slider-range"] {
462
+ background: linear-gradient(90deg, oklch(0.6 0.18 260), oklch(0.7 0.15 55));
463
+ }
464
+
465
+ [data-slot="popover-content"],
466
+ [data-slot="dropdown-menu-content"],
467
+ [data-slot="select-content"] {
468
+ background: var(--glass-bg-heavy);
469
+ -webkit-backdrop-filter: blur(var(--blur-glass-lg));
470
+ backdrop-filter: blur(var(--blur-glass-lg));
471
+ border-color: var(--glass-border);
472
+ box-shadow: var(--glass-shadow-lg);
473
+ }
474
+
475
+ [data-slot="sheet-content"],
476
+ [data-slot="dialog-content"] {
477
+ background: var(--glass-bg-modal);
478
+ -webkit-backdrop-filter: blur(var(--blur-glass-xl));
479
+ backdrop-filter: blur(var(--blur-glass-xl));
480
+ border-color: var(--glass-border);
481
+ box-shadow: var(--glass-shadow-lg), var(--glass-inner-glow);
482
+ }
483
+
484
+ /* Tinted overlays with subtle blur */
485
+ [data-slot="sheet-overlay"],
486
+ [data-slot="dialog-overlay"] {
487
+ background: oklch(0.3 0.03 260 / 0.4);
488
+ -webkit-backdrop-filter: blur(4px);
489
+ backdrop-filter: blur(4px);
490
+ }
491
+ .dark [data-slot="sheet-overlay"],
492
+ .dark [data-slot="dialog-overlay"] {
493
+ background: oklch(0.05 0.03 285 / 0.65);
494
+ }
495
+
496
+ /* Glass borders for table rows — doubled selector for cascade priority over TW4 utilities */
497
+ [data-slot="table-row"][data-slot="table-row"] {
498
+ border-color: var(--glass-border-subtle);
499
+ }
500
+
501
+ [data-slot="table-header"] [data-slot="table-row"] {
502
+ border-color: var(--glass-border);
503
+ }
504
+
505
+ [data-slot="table-footer"] {
506
+ border-color: var(--glass-border);
507
+ }
508
+
509
+ /* 3D groove separators */
510
+ [data-slot="separator"][data-orientation="horizontal"] {
511
+ background: linear-gradient(to bottom, oklch(0.7 0.02 260 / 0.12), oklch(1 0.01 260 / 0.25));
512
+ height: 2px;
513
+ }
514
+ [data-slot="separator"][data-orientation="vertical"] {
515
+ background: linear-gradient(to right, oklch(0.7 0.02 260 / 0.12), oklch(1 0.01 260 / 0.25));
516
+ width: 2px;
517
+ }
518
+ .dark [data-slot="separator"][data-orientation="horizontal"] {
519
+ background: linear-gradient(to bottom, oklch(0.06 0.02 265 / 0.35), oklch(0.25 0.03 270 / 0.15));
520
+ }
521
+ .dark [data-slot="separator"][data-orientation="vertical"] {
522
+ background: linear-gradient(to right, oklch(0.06 0.02 265 / 0.35), oklch(0.25 0.03 270 / 0.15));
523
+ }
524
+
525
+ /* Glass buttons — translucent CTAs */
526
+ [data-slot="button"][data-variant="default"] {
527
+ background: oklch(0.55 0.18 260 / 0.85);
528
+ -webkit-backdrop-filter: blur(var(--blur-glass-sm));
529
+ backdrop-filter: blur(var(--blur-glass-sm));
530
+ box-shadow: var(--glass-shadow-sm), inset 0 1px 0 0 oklch(0.7 0.1 260 / 0.3);
531
+ border: 1px solid oklch(0.5 0.15 260 / 0.3);
532
+ }
533
+ [data-slot="button"][data-variant="default"]:hover {
534
+ background: oklch(0.55 0.18 260 / 0.95);
535
+ box-shadow: var(--glass-shadow), inset 0 1px 0 0 oklch(0.7 0.1 260 / 0.4);
536
+ }
537
+
538
+ [data-slot="button"][data-variant="outline"] {
539
+ background: var(--glass-bg-light);
540
+ -webkit-backdrop-filter: blur(var(--blur-glass-sm));
541
+ backdrop-filter: blur(var(--blur-glass-sm));
542
+ border-color: var(--glass-border);
543
+ box-shadow: var(--glass-inner-glow-subtle);
544
+ }
545
+ [data-slot="button"][data-variant="outline"]:hover {
546
+ background: var(--glass-bg);
547
+ box-shadow: var(--glass-shadow-sm), var(--glass-inner-glow-subtle);
548
+ }
549
+
550
+ [data-slot="button"][data-variant="secondary"] {
551
+ background: var(--glass-bg-subtle);
552
+ -webkit-backdrop-filter: blur(var(--blur-glass-sm));
553
+ backdrop-filter: blur(var(--blur-glass-sm));
554
+ border: 1px solid var(--glass-border-subtle);
555
+ box-shadow: var(--glass-inner-glow-subtle);
556
+ }
557
+ [data-slot="button"][data-variant="secondary"]:hover {
558
+ background: var(--glass-bg-light);
559
+ }
560
+
561
+ [data-slot="button"][data-variant="destructive"] {
562
+ background: oklch(0.55 0.2 25 / 0.85);
563
+ -webkit-backdrop-filter: blur(var(--blur-glass-sm));
564
+ backdrop-filter: blur(var(--blur-glass-sm));
565
+ box-shadow: 0 4px 16px oklch(0.55 0.15 25 / 0.15), inset 0 1px 0 0 oklch(0.7 0.1 25 / 0.3);
566
+ border: 1px solid oklch(0.5 0.15 25 / 0.3);
567
+ }
568
+ [data-slot="button"][data-variant="destructive"]:hover {
569
+ background: oklch(0.55 0.2 25 / 0.95);
570
+ }
571
+
572
+ /* Dark mode button overrides */
573
+ .dark [data-slot="button"][data-variant="default"] {
574
+ background: oklch(0.55 0.18 255 / 0.8);
575
+ box-shadow: var(--glass-shadow-sm), inset 0 1px 0 0 oklch(0.7 0.1 260 / 0.15);
576
+ border: 1px solid oklch(0.6 0.12 260 / 0.25);
577
+ }
578
+ .dark [data-slot="button"][data-variant="default"]:hover {
579
+ background: oklch(0.58 0.18 255 / 0.9);
580
+ }
581
+ .dark [data-slot="button"][data-variant="destructive"] {
582
+ background: oklch(0.55 0.2 25 / 0.8);
583
+ border: 1px solid oklch(0.6 0.12 25 / 0.25);
584
+ }
585
+
586
+ /* --- Gradient utility classes --- */
587
+ .gradient-morning-sky {
588
+ background: var(--gradient-morning-sky);
589
+ }
590
+ .gradient-ocean-mist {
591
+ background: var(--gradient-ocean-mist);
592
+ }
593
+ .gradient-forest-dawn {
594
+ background: var(--gradient-forest-dawn);
595
+ }
596
+ .gradient-sunset-glow {
597
+ background: var(--gradient-sunset-glow);
598
+ }
599
+ .gradient-twilight {
600
+ background: var(--gradient-twilight);
601
+ }
602
+ .gradient-neutral {
603
+ background: var(--gradient-neutral);
604
+ }
605
+
606
+ /* --- Solid surface utilities for dense operational screens --- */
607
+ .surface-page {
608
+ background: linear-gradient(
609
+ 180deg,
610
+ color-mix(in srgb, var(--surface-1) 88%, transparent),
611
+ color-mix(in srgb, var(--surface-2) 96%, transparent)
612
+ );
613
+ }
614
+
615
+ .surface-page-shell {
616
+ border: 1px solid color-mix(in oklab, var(--border) 90%, transparent);
617
+ box-shadow:
618
+ 0 24px 56px oklch(0.12 0.02 260 / 0.09),
619
+ inset 0 1px 0 0 oklch(1 0 0 / 0.22);
620
+ }
621
+
622
+ .surface-toolbar {
623
+ background: color-mix(in srgb, var(--surface-1) 94%, transparent);
624
+ color: var(--surface-foreground);
625
+ border: 1px solid color-mix(in oklab, var(--border) 90%, transparent);
626
+ box-shadow: 0 10px 24px oklch(0.12 0.02 260 / 0.07);
627
+ }
628
+
629
+ [data-slot="card"].surface-card,
630
+ .surface-card {
631
+ background: var(--surface-1);
632
+ color: var(--surface-foreground);
633
+ -webkit-backdrop-filter: none;
634
+ backdrop-filter: none;
635
+ border-color: color-mix(in oklab, var(--border) 92%, transparent);
636
+ box-shadow: 0 12px 28px oklch(0.12 0.02 260 / 0.08);
637
+ }
638
+
639
+ [data-slot="card"].surface-card-muted,
640
+ .surface-card-muted {
641
+ background: var(--surface-2);
642
+ color: var(--surface-foreground);
643
+ -webkit-backdrop-filter: none;
644
+ backdrop-filter: none;
645
+ border-color: color-mix(in oklab, var(--border) 80%, transparent);
646
+ box-shadow: 0 6px 18px oklch(0.12 0.02 260 / 0.05);
647
+ }
648
+
649
+ .surface-panel {
650
+ background: var(--surface-1);
651
+ color: var(--surface-foreground);
652
+ border: 1px solid color-mix(in oklab, var(--border) 92%, transparent);
653
+ box-shadow: 0 12px 28px oklch(0.12 0.02 260 / 0.08);
654
+ }
655
+
656
+ .surface-control {
657
+ background: color-mix(in srgb, var(--surface-1) 92%, transparent);
658
+ color: var(--surface-foreground);
659
+ border: 1px solid color-mix(in oklab, var(--border) 92%, transparent);
660
+ box-shadow: 0 6px 18px oklch(0.12 0.02 260 / 0.08);
661
+ }
662
+
663
+ .surface-scroll {
664
+ background:
665
+ linear-gradient(
666
+ to right,
667
+ color-mix(in srgb, var(--surface-1) 88%, transparent),
668
+ color-mix(in srgb, var(--surface-1) 72%, transparent)
669
+ );
670
+ border: 1px solid color-mix(in oklab, var(--border) 75%, transparent);
671
+ }
672
+
673
+ /* --- Glass shimmer animation --- */
674
+ @keyframes glass-shimmer {
675
+ 0% { background-position: -200% 0; }
676
+ 100% { background-position: 200% 0; }
677
+ }
678
+
679
+ .glass-shimmer {
680
+ position: relative;
681
+ overflow: hidden;
682
+ }
683
+
684
+ .glass-shimmer:hover::after {
685
+ content: "";
686
+ position: absolute;
687
+ inset: 0;
688
+ background: linear-gradient(
689
+ 90deg,
690
+ transparent 0%,
691
+ rgba(255, 255, 255, 0.15) 50%,
692
+ transparent 100%
693
+ );
694
+ background-size: 200% 100%;
695
+ animation: glass-shimmer 1.5s ease forwards;
696
+ pointer-events: none;
697
+ border-radius: inherit;
698
+ }
699
+
700
+ .dark .glass-shimmer:hover::after {
701
+ background: linear-gradient(
702
+ 90deg,
703
+ transparent 0%,
704
+ oklch(0.5 0.04 270 / 0.08) 50%,
705
+ transparent 100%
706
+ );
707
+ background-size: 200% 100%;
708
+ }
709
+
710
+ html,
711
+ body {
712
+ background: var(--background);
713
+ }
714
+
715
+ body {
716
+ color: var(--foreground);
717
+ }
718
+
719
+ .dark .glass-sidebar [data-sidebar="sidebar"] {
720
+ box-shadow:
721
+ inset -1px 0 0 0 oklch(0.58 0.03 270 / 0.08),
722
+ 12px 0 32px oklch(0.03 0.02 265 / 0.32);
723
+ }
724
+
725
+ .dark .surface-page-shell {
726
+ box-shadow:
727
+ 0 24px 56px oklch(0.03 0.02 265 / 0.44),
728
+ inset 0 1px 0 0 oklch(0.58 0.03 270 / 0.08);
729
+ }
730
+
731
+ .dark .surface-toolbar {
732
+ box-shadow: 0 10px 24px oklch(0.03 0.02 265 / 0.32);
733
+ }