insforge 1.3.0 → 1.4.8

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 (269) hide show
  1. package/CHANGELOG.md +2 -0
  2. package/auth/package.json +5 -3
  3. package/auth/src/lib/broadcastService.ts +115 -117
  4. package/auth/src/lib/insforge.ts +8 -0
  5. package/auth/src/main.tsx +2 -4
  6. package/auth/src/pages/SignInPage.tsx +60 -60
  7. package/auth/src/pages/SignUpPage.tsx +60 -60
  8. package/auth/src/pages/VerifyEmailPage.tsx +18 -0
  9. package/auth/tsconfig.json +2 -1
  10. package/backend/package.json +10 -6
  11. package/backend/src/api/middlewares/rate-limiters.ts +127 -127
  12. package/backend/src/api/routes/ai/index.routes.ts +475 -468
  13. package/backend/src/api/routes/auth/index.routes.ts +85 -32
  14. package/backend/src/api/routes/auth/oauth.routes.ts +11 -6
  15. package/backend/src/api/routes/database/index.routes.ts +2 -0
  16. package/backend/src/api/routes/database/records.routes.ts +39 -175
  17. package/backend/src/api/routes/database/rpc.routes.ts +69 -0
  18. package/backend/src/api/routes/deployments/index.routes.ts +192 -0
  19. package/backend/src/api/routes/docs/index.routes.ts +3 -2
  20. package/backend/src/api/routes/email/index.routes.ts +35 -35
  21. package/backend/src/api/routes/functions/index.routes.ts +3 -3
  22. package/backend/src/api/routes/metadata/index.routes.ts +26 -0
  23. package/backend/src/api/routes/webhooks/index.routes.ts +109 -0
  24. package/backend/src/infra/database/database.manager.ts +0 -10
  25. package/backend/src/infra/database/migrations/018_schema-rework.sql +441 -0
  26. package/backend/src/infra/database/migrations/019_create-deployments-table.sql +36 -0
  27. package/backend/src/infra/database/migrations/020_add-audio-modality.sql +11 -0
  28. package/backend/src/infra/database/migrations/bootstrap/bootstrap-migrations.js +103 -0
  29. package/backend/src/infra/security/token.manager.ts +1 -4
  30. package/backend/src/providers/ai/openrouter.provider.ts +12 -3
  31. package/backend/src/providers/database/base.provider.ts +39 -0
  32. package/backend/src/providers/database/cloud.provider.ts +159 -0
  33. package/backend/src/providers/deployments/vercel.provider.ts +516 -0
  34. package/backend/src/server.ts +19 -7
  35. package/backend/src/services/ai/ai-config.service.ts +6 -6
  36. package/backend/src/services/ai/ai-model.service.ts +60 -60
  37. package/backend/src/services/ai/ai-usage.service.ts +7 -7
  38. package/backend/src/services/ai/chat-completion.service.ts +415 -220
  39. package/backend/src/services/ai/helpers.ts +64 -64
  40. package/backend/src/services/ai/index.ts +13 -13
  41. package/backend/src/services/auth/auth-config.service.ts +4 -4
  42. package/backend/src/services/auth/auth-otp.service.ts +6 -6
  43. package/backend/src/services/auth/auth.service.ts +134 -74
  44. package/backend/src/services/auth/index.ts +4 -4
  45. package/backend/src/services/auth/oauth-config.service.ts +12 -12
  46. package/backend/src/services/database/database-advance.service.ts +19 -55
  47. package/backend/src/services/database/database-table.service.ts +38 -85
  48. package/backend/src/services/database/postgrest-proxy.service.ts +165 -0
  49. package/backend/src/services/deployments/deployment.service.ts +693 -0
  50. package/backend/src/services/functions/function.service.ts +61 -41
  51. package/backend/src/services/logs/audit.service.ts +10 -10
  52. package/backend/src/services/secrets/secret.service.ts +101 -27
  53. package/backend/src/services/storage/storage.service.ts +30 -30
  54. package/backend/src/services/usage/usage.service.ts +6 -6
  55. package/backend/src/types/ai.ts +8 -0
  56. package/backend/src/types/auth.ts +5 -1
  57. package/backend/src/types/database.ts +2 -0
  58. package/backend/src/types/deployments.ts +33 -0
  59. package/backend/src/types/storage.ts +1 -1
  60. package/backend/src/types/webhooks.ts +45 -0
  61. package/backend/src/utils/cookies.ts +34 -35
  62. package/backend/src/utils/environment.ts +0 -14
  63. package/backend/src/utils/s3-config-loader.ts +64 -64
  64. package/backend/src/utils/seed.ts +334 -301
  65. package/backend/src/utils/sql-parser.ts +126 -0
  66. package/backend/src/utils/utils.ts +114 -114
  67. package/backend/src/utils/validations.ts +10 -10
  68. package/backend/tests/local/test-rpc.sh +141 -0
  69. package/backend/tests/local/test-secrets.sh +1 -1
  70. package/backend/tests/manual/test-ai-model-plugins.sh +258 -0
  71. package/backend/tests/manual/test-rawsql-modes.sh +24 -24
  72. package/backend/tests/unit/database-advance.test.ts +326 -0
  73. package/backend/tests/unit/helpers.test.ts +2 -2
  74. package/claude-plugin/skills/insforge-schema-patterns/SKILL.md +13 -10
  75. package/docker-compose.prod.yml +1 -1
  76. package/docker-compose.yml +1 -1
  77. package/docs/agent-docs/deployment.md +79 -0
  78. package/docs/changelog.mdx +165 -72
  79. package/docs/core-concepts/ai/architecture.mdx +1 -23
  80. package/docs/core-concepts/ai/sdk.mdx +26 -1
  81. package/docs/core-concepts/authentication/architecture.mdx +6 -8
  82. package/docs/core-concepts/authentication/sdk.mdx +387 -91
  83. package/docs/core-concepts/authentication/ui-components/customization.mdx +460 -256
  84. package/docs/core-concepts/authentication/ui-components/nextjs.mdx +50 -24
  85. package/docs/core-concepts/authentication/ui-components/react-router.mdx +18 -19
  86. package/docs/core-concepts/authentication/ui-components/react.mdx +26 -19
  87. package/docs/core-concepts/database/architecture.mdx +58 -21
  88. package/docs/core-concepts/database/pgvector.mdx +138 -0
  89. package/docs/core-concepts/database/sdk.mdx +17 -17
  90. package/docs/core-concepts/deployments/architecture.mdx +152 -0
  91. package/docs/core-concepts/email/architecture.mdx +4 -2
  92. package/docs/core-concepts/functions/architecture.mdx +1 -1
  93. package/docs/core-concepts/functions/sdk.mdx +0 -1
  94. package/docs/core-concepts/realtime/architecture.mdx +1 -1
  95. package/docs/core-concepts/storage/architecture.mdx +1 -1
  96. package/docs/core-concepts/storage/sdk.mdx +25 -25
  97. package/docs/docs.json +14 -6
  98. package/docs/favicon.png +0 -0
  99. package/docs/favicon.svg +3 -18
  100. package/docs/images/changelog/dec-2025/apple-oauth.mp4 +0 -0
  101. package/docs/images/changelog/dec-2025/moreModels.png +0 -0
  102. package/docs/images/changelog/dec-2025/multi-region.webp +0 -0
  103. package/docs/images/changelog/dec-2025/postgres-connection.webp +0 -0
  104. package/docs/images/changelog/dec-2025/realtime2.png +0 -0
  105. package/docs/images/mcp-setup/CC-MCP-1.mp4 +0 -0
  106. package/docs/images/mcp-setup/CC-MCP-2.mp4 +0 -0
  107. package/docs/images/mcp-setup/Cursor-MCP-1.mp4 +0 -0
  108. package/docs/images/mcp-setup/Cursor-MCP-2.mp4 +0 -0
  109. package/docs/images/mcp-setup/Cursor-MCP-3.mp4 +0 -0
  110. package/docs/images/mcp-setup/claude-code-connect.png +0 -0
  111. package/docs/images/mcp-setup/cline-1.png +0 -0
  112. package/docs/images/mcp-setup/cline-2.png +0 -0
  113. package/docs/images/mcp-setup/cline-3.png +0 -0
  114. package/docs/images/mcp-setup/connect-project.png +0 -0
  115. package/docs/images/mcp-setup/copilot-1.png +0 -0
  116. package/docs/images/mcp-setup/copilot-2.png +0 -0
  117. package/docs/images/mcp-setup/copilot-3.png +0 -0
  118. package/docs/images/mcp-setup/mcp-json-1.png +0 -0
  119. package/docs/images/mcp-setup/mcp-json-2.png +0 -0
  120. package/docs/images/mcp-setup/qoder-1.png +0 -0
  121. package/docs/images/mcp-setup/qoder-2.png +0 -0
  122. package/docs/images/mcp-setup/roocode-1.png +0 -0
  123. package/docs/images/mcp-setup/roocode-2.png +0 -0
  124. package/docs/images/mcp-setup/trae-1.png +0 -0
  125. package/docs/images/mcp-setup/trae-2.png +0 -0
  126. package/docs/images/mcp-setup/trae-3.png +0 -0
  127. package/docs/images/mcp-setup/trae-4.png +0 -0
  128. package/docs/images/mcp-setup/trae-5.png +0 -0
  129. package/docs/images/mcp-setup/windsurf-1.png +0 -0
  130. package/docs/images/mcp-setup/windsurf-2.png +0 -0
  131. package/docs/insforge-instructions-sdk.md +7 -3
  132. package/docs/introduction.mdx +9 -8
  133. package/docs/mcp-setup.mdx +332 -0
  134. package/docs/oauth-server.mdx +563 -0
  135. package/docs/partnership.mdx +79 -10
  136. package/docs/quickstart.mdx +1 -1
  137. package/docs/vscode-extension.mdx +74 -0
  138. package/eslint.config.js +1 -0
  139. package/examples/response-examples.md +1 -1
  140. package/frontend/package.json +1 -1
  141. package/frontend/src/App.tsx +8 -3
  142. package/frontend/src/assets/logos/antigravity.svg +1 -0
  143. package/frontend/src/assets/logos/copilot.svg +10 -0
  144. package/frontend/src/assets/logos/deepseek.svg +139 -0
  145. package/frontend/src/assets/logos/kiro.svg +9 -0
  146. package/frontend/src/assets/logos/qoder.svg +4 -0
  147. package/frontend/src/assets/logos/qwen.svg +15 -0
  148. package/frontend/src/components/CodeBlock.tsx +2 -2
  149. package/frontend/src/components/ConnectCTA.tsx +3 -2
  150. package/frontend/src/components/datagrid/DataGrid.tsx +90 -62
  151. package/frontend/src/components/datagrid/datagridTypes.tsx +2 -1
  152. package/frontend/src/components/datagrid/index.ts +1 -1
  153. package/frontend/src/components/index.ts +0 -1
  154. package/frontend/src/components/layout/AppHeader.tsx +4 -27
  155. package/frontend/src/components/layout/AppSidebar.tsx +85 -100
  156. package/frontend/src/components/layout/Layout.tsx +34 -32
  157. package/frontend/src/components/layout/PrimaryMenu.tsx +12 -4
  158. package/frontend/src/components/radix/Select.tsx +151 -151
  159. package/frontend/src/features/ai/components/AIConfigCard.tsx +200 -200
  160. package/frontend/src/features/ai/components/AIEmptyState.tsx +23 -23
  161. package/frontend/src/features/ai/components/ModalityFilterSidebar.tsx +102 -101
  162. package/frontend/src/features/ai/components/ModelSelectionDialog.tsx +135 -135
  163. package/frontend/src/features/ai/components/ModelSelectionGrid.tsx +51 -51
  164. package/frontend/src/features/ai/components/SystemPromptDialog.tsx +118 -118
  165. package/frontend/src/features/ai/components/index.ts +6 -6
  166. package/frontend/src/features/ai/helpers.ts +147 -141
  167. package/frontend/src/features/ai/pages/AIPage.tsx +166 -166
  168. package/frontend/src/features/auth/components/AuthPreview.tsx +96 -96
  169. package/frontend/src/features/auth/components/UsersDataGrid.tsx +55 -31
  170. package/frontend/src/features/auth/components/index.ts +5 -5
  171. package/frontend/src/features/auth/pages/AuthMethodsPage.tsx +275 -275
  172. package/frontend/src/features/dashboard/pages/DashboardPage.tsx +1 -1
  173. package/frontend/src/features/database/components/DatabaseDataGrid.tsx +0 -2
  174. package/frontend/src/features/database/components/ForeignKeyCell.tsx +38 -11
  175. package/frontend/src/features/database/components/ForeignKeyPopover.tsx +18 -8
  176. package/frontend/src/features/database/components/LinkRecordModal.tsx +61 -13
  177. package/frontend/src/features/database/components/RecordFormField.tsx +1 -1
  178. package/frontend/src/features/database/components/TableSidebar.tsx +0 -3
  179. package/frontend/src/features/database/components/TablesEmptyState.tsx +1 -1
  180. package/frontend/src/features/database/components/TemplatePreview.tsx +1 -2
  181. package/frontend/src/features/database/constants.ts +16 -28
  182. package/frontend/src/features/database/hooks/useCSVImport.ts +3 -2
  183. package/frontend/src/features/database/hooks/useRawSQL.ts +3 -2
  184. package/frontend/src/features/database/hooks/useTables.ts +5 -7
  185. package/frontend/src/features/database/pages/FunctionsPage.tsx +0 -5
  186. package/frontend/src/features/database/pages/IndexesPage.tsx +0 -5
  187. package/frontend/src/features/database/pages/PoliciesPage.tsx +0 -5
  188. package/frontend/src/features/database/pages/SQLEditorPage.tsx +2 -2
  189. package/frontend/src/features/database/pages/TriggersPage.tsx +0 -5
  190. package/frontend/src/features/database/services/advance.service.ts +1 -15
  191. package/frontend/src/features/database/services/record.service.ts +4 -20
  192. package/frontend/src/features/database/services/table.service.ts +1 -4
  193. package/frontend/src/features/database/templates/ai-chatbot.ts +6 -6
  194. package/frontend/src/features/database/templates/ecommerce-platform.ts +2 -2
  195. package/frontend/src/features/database/templates/instagram-clone.ts +10 -10
  196. package/frontend/src/features/database/templates/notion-clone.ts +8 -8
  197. package/frontend/src/features/database/templates/reddit-clone.ts +10 -10
  198. package/frontend/src/features/deployments/components/DeploymentRow.tsx +93 -0
  199. package/frontend/src/features/deployments/components/DeploymentsEmptyState.tsx +15 -0
  200. package/frontend/src/features/deployments/hooks/useDeployments.ts +157 -0
  201. package/frontend/src/features/deployments/pages/DeploymentsPage.tsx +318 -0
  202. package/frontend/src/features/deployments/services/deployments.service.ts +63 -0
  203. package/frontend/src/features/functions/components/FunctionRow.tsx +72 -72
  204. package/frontend/src/features/functions/components/FunctionsSidebar.tsx +56 -56
  205. package/frontend/src/features/functions/components/SecretRow.tsx +3 -3
  206. package/frontend/src/features/functions/components/index.ts +5 -5
  207. package/frontend/src/features/functions/hooks/useFunctions.ts +5 -4
  208. package/frontend/src/features/functions/hooks/useSecrets.ts +6 -9
  209. package/frontend/src/features/functions/pages/SecretsPage.tsx +118 -118
  210. package/frontend/src/features/functions/services/function.service.ts +8 -25
  211. package/frontend/src/features/functions/services/secret.service.ts +23 -41
  212. package/frontend/src/features/login/pages/CloudLoginPage.tsx +125 -118
  213. package/frontend/src/features/logs/components/LogDetailPanel.tsx +41 -0
  214. package/frontend/src/features/logs/components/LogsDataGrid.tsx +32 -1
  215. package/frontend/src/features/logs/components/index.ts +1 -0
  216. package/frontend/src/features/logs/pages/LogsPage.tsx +36 -6
  217. package/frontend/src/features/onboard/components/ApiCredentialsSection.tsx +59 -0
  218. package/frontend/src/features/onboard/components/ConnectionStringSection.tsx +180 -0
  219. package/frontend/src/features/onboard/components/McpConnectionSection.tsx +159 -0
  220. package/frontend/src/features/onboard/components/OnboardingController.tsx +68 -0
  221. package/frontend/src/features/onboard/components/OnboardingModal.tsx +121 -267
  222. package/frontend/src/features/onboard/components/ShowPasswordButton.tsx +21 -0
  223. package/frontend/src/features/onboard/components/index.ts +9 -4
  224. package/frontend/src/features/onboard/components/mcp/CursorDeeplinkGenerator.tsx +1 -1
  225. package/frontend/src/features/onboard/components/mcp/QoderDeeplinkGenerator.tsx +36 -0
  226. package/frontend/src/features/onboard/components/mcp/helpers.tsx +123 -98
  227. package/frontend/src/features/onboard/components/mcp/index.ts +4 -3
  228. package/frontend/src/features/onboard/index.ts +17 -13
  229. package/frontend/src/features/settings/pages/SettingsPage.tsx +349 -0
  230. package/frontend/src/features/visualizer/components/AuthNode.tsx +4 -4
  231. package/frontend/src/features/visualizer/components/SchemaVisualizer.tsx +21 -8
  232. package/frontend/src/features/visualizer/pages/VisualizerPage.tsx +10 -1
  233. package/frontend/src/index.css +249 -249
  234. package/frontend/src/lib/contexts/ModalContext.tsx +35 -0
  235. package/frontend/src/lib/hooks/useMetadata.ts +45 -1
  236. package/frontend/src/lib/hooks/useModal.tsx +2 -0
  237. package/frontend/src/lib/routing/AppRoutes.tsx +103 -99
  238. package/frontend/src/lib/services/metadata.service.ts +20 -3
  239. package/frontend/src/lib/utils/menuItems.ts +223 -207
  240. package/frontend/src/lib/utils/utils.ts +196 -196
  241. package/functions/server.ts +315 -315
  242. package/functions/worker-template.js +1 -1
  243. package/openapi/ai.yaml +115 -5
  244. package/openapi/auth.yaml +97 -17
  245. package/openapi/logs.yaml +0 -2
  246. package/openapi/metadata.yaml +0 -2
  247. package/openapi/records.yaml +21 -21
  248. package/openapi/tables.yaml +1 -2
  249. package/package.json +1 -1
  250. package/shared-schemas/package.json +1 -1
  251. package/shared-schemas/src/ai-api.schema.ts +251 -143
  252. package/shared-schemas/src/ai.schema.ts +63 -63
  253. package/shared-schemas/src/auth-api.schema.ts +34 -6
  254. package/shared-schemas/src/auth.schema.ts +17 -10
  255. package/shared-schemas/src/cloud-events.schema.ts +26 -0
  256. package/shared-schemas/src/deployments-api.schema.ts +55 -0
  257. package/shared-schemas/src/deployments.schema.ts +30 -0
  258. package/shared-schemas/src/docs.schema.ts +8 -2
  259. package/shared-schemas/src/email-api.schema.ts +30 -30
  260. package/shared-schemas/src/functions-api.schema.ts +13 -4
  261. package/shared-schemas/src/functions.schema.ts +1 -1
  262. package/shared-schemas/src/index.ts +22 -18
  263. package/shared-schemas/src/metadata.schema.ts +30 -4
  264. package/shared-schemas/src/secrets-api.schema.ts +44 -0
  265. package/shared-schemas/src/secrets.schema.ts +15 -0
  266. package/zeabur/README.md +13 -0
  267. package/zeabur/template.yml +20 -51
  268. package/backend/src/types/profile.ts +0 -55
  269. package/frontend/src/components/ProjectInfoModal.tsx +0 -128
@@ -18,14 +18,21 @@ import { BucketNode } from './BucketNode';
18
18
  import { useAllTableSchemas } from '@/features/database/hooks/useTables';
19
19
  import { useTheme } from '@/lib/contexts/ThemeContext';
20
20
  import {
21
- AppMetadataSchema,
22
21
  StorageBucketSchema,
23
- AuthMetadataSchema,
24
22
  GetTableSchemaResponse,
23
+ DatabaseMetadataSchema,
24
+ StorageMetadataSchema,
25
+ OAuthProvidersSchema,
25
26
  } from '@insforge/shared-schemas';
26
27
 
27
28
  interface SchemaVisualizerProps {
28
- metadata: AppMetadataSchema;
29
+ metadata: {
30
+ auth: {
31
+ providers: OAuthProvidersSchema[];
32
+ };
33
+ database: DatabaseMetadataSchema;
34
+ storage: StorageMetadataSchema;
35
+ };
29
36
  userCount?: number;
30
37
  // Optional external schemas for templates
31
38
  externalSchemas?: GetTableSchemaResponse[];
@@ -45,7 +52,7 @@ type BucketNodeData = {
45
52
  };
46
53
 
47
54
  type AuthNodeData = {
48
- authMetadata: AuthMetadataSchema;
55
+ providers: OAuthProvidersSchema[];
49
56
  userCount?: number;
50
57
  isReferenced?: boolean;
51
58
  };
@@ -251,7 +258,7 @@ export function SchemaVisualizer({
251
258
  table.columns.some(
252
259
  (column) =>
253
260
  column.foreignKey &&
254
- column.foreignKey.referenceTable === 'users' &&
261
+ column.foreignKey.referenceTable === 'auth.users' &&
255
262
  column.foreignKey.referenceColumn === 'id'
256
263
  )
257
264
  );
@@ -262,7 +269,7 @@ export function SchemaVisualizer({
262
269
  type: 'authNode',
263
270
  position: { x: 0, y: 0 },
264
271
  data: {
265
- authMetadata: metadata.auth,
272
+ providers: metadata.auth.providers,
266
273
  userCount,
267
274
  isReferenced: isUsersReferenced,
268
275
  },
@@ -280,7 +287,7 @@ export function SchemaVisualizer({
280
287
  if (column.foreignKey) {
281
288
  // Check if this is a reference to users.id
282
289
  const isAuthReference =
283
- column.foreignKey.referenceTable === 'users' &&
290
+ column.foreignKey.referenceTable === 'auth.users' &&
284
291
  column.foreignKey.referenceColumn === 'id';
285
292
 
286
293
  const edgeId = `${table.tableName}-${column.columnName}-${column.foreignKey.referenceTable}`;
@@ -380,7 +387,13 @@ export function SchemaVisualizer({
380
387
  fitViewOptions={{ padding: 1, duration: 300, maxZoom: 2, minZoom: 1 }}
381
388
  />
382
389
  )}
383
- {showMiniMap && <MiniMap nodeColor={(node: Node<CustomNodeData>) => getNodeColor(node)} />}
390
+ {showMiniMap && (
391
+ <MiniMap
392
+ nodeColor={(node: Node<CustomNodeData>) => getNodeColor(node)}
393
+ pannable
394
+ zoomable
395
+ />
396
+ )}
384
397
  </ReactFlow>
385
398
  </div>
386
399
  );
@@ -88,7 +88,16 @@ const VisualizerPage = () => {
88
88
 
89
89
  {/* Schema Visualizer */}
90
90
  <div className="relative z-10 w-full h-full">
91
- <SchemaVisualizer metadata={metadata} userCount={totalUsers} />
91
+ <SchemaVisualizer
92
+ metadata={{
93
+ auth: {
94
+ providers: metadata.auth.oAuthProviders,
95
+ },
96
+ database: metadata.database,
97
+ storage: metadata.storage,
98
+ }}
99
+ userCount={totalUsers}
100
+ />
92
101
  </div>
93
102
  </div>
94
103
  );
@@ -1,249 +1,249 @@
1
- @import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap');
2
- @import 'tailwindcss';
3
- @config "../tailwind.config.js";
4
-
5
- @layer utilities {
6
- /* PocketBase-inspired Design Tokens */
7
- :root {
8
- /* Colors */
9
- --pb-primary: #1a1a24;
10
- --pb-text-primary: #1a1a24;
11
- --pb-text-hint: #617079;
12
- --pb-text-disabled: #a0a6ac;
13
-
14
- --pb-body: #f8f9fa;
15
- --pb-base: #ffffff;
16
- --pb-base-alt1: #e3e8ed;
17
- --pb-base-alt2: #d7dde3;
18
- --pb-base-alt3: #c9d0da;
19
- --pb-base-alt4: #a5b0c0;
20
-
21
- --pb-info: #5499e8;
22
- --pb-success: #32ad84;
23
- --pb-danger: #e34562;
24
- --pb-warning: #ff944d;
25
-
26
- /* Spacing */
27
- --pb-spacing-xs: 15px;
28
- --pb-spacing-sm: 20px;
29
- --pb-spacing-base: 30px;
30
- --pb-spacing-lg: 50px;
31
- --pb-spacing-xl: 60px;
32
-
33
- /* Animation */
34
- --pb-animation-base: 150ms;
35
- --pb-animation-active: 70ms;
36
- --pb-animation-entrance: 250ms;
37
- }
38
- }
39
-
40
- @layer base {
41
- :root {
42
- /* Spacing system */
43
- --baseSpacing: 2rem; /* 32px = 8 * 0.25rem */
44
- --smSpacing: 1.25rem; /* 20px */
45
- --xsSpacing: 1rem; /* 16px */
46
-
47
- /* Font system */
48
- --baseFontSize: 0.875rem; /* 14px */
49
- --smFontSize: 0.8125rem; /* 13px */
50
- --xsFontSize: 0.75rem; /* 12px */
51
- --lgFontSize: 1.25rem; /* 20px */
52
- --xlFontSize: 1.375rem; /* 22px */
53
-
54
- /* Font weights */
55
- --fontWeightNormal: 400;
56
- --fontWeightMedium: 500;
57
- --fontWeightSemibold: 600;
58
-
59
- /* Font families */
60
- --fontFamilyBase:
61
- 'Inter', system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
62
- --fontFamilyMono: 'Ubuntu Mono', ui-monospace, monospace;
63
- --fontFamilyManrope: 'Manrope', sans-serif;
64
- }
65
-
66
- /* Prevent document-level scrolling */
67
- html,
68
- body {
69
- overflow: hidden;
70
- height: 100%;
71
- }
72
-
73
- /* Apply base font settings */
74
- body {
75
- font-family: var(--fontFamilyBase);
76
- font-size: var(--baseFontSize);
77
- font-weight: var(--fontWeightNormal);
78
- }
79
-
80
- /* Typography scale */
81
- h1 {
82
- font-size: var(--xlFontSize);
83
- font-weight: var(--fontWeightSemibold);
84
- line-height: 1.3;
85
- }
86
-
87
- h2 {
88
- font-size: var(--lgFontSize);
89
- font-weight: var(--fontWeightSemibold);
90
- line-height: 1.3;
91
- }
92
-
93
- .text-xs {
94
- font-size: var(--xsFontSize);
95
- }
96
-
97
- .text-sm {
98
- font-size: var(--smFontSize);
99
- }
100
-
101
- .font-mono {
102
- font-family: var(--fontFamilyMono);
103
- }
104
- }
105
-
106
- @layer components {
107
- /* Checkbox styling */
108
- input[type='checkbox'] {
109
- @apply cursor-pointer;
110
- accent-color: #000000;
111
- }
112
-
113
- input[type='checkbox']:checked {
114
- background-color: #000000 !important;
115
- border-color: #000000 !important;
116
- accent-color: #000000;
117
- }
118
-
119
- input[type='checkbox']:checked:hover {
120
- background-color: #1a1a1a !important;
121
- border-color: #1a1a1a !important;
122
- }
123
-
124
- input[type='checkbox']:focus {
125
- outline: none !important;
126
- box-shadow: none !important;
127
- }
128
-
129
- input[type='checkbox']:focus-visible {
130
- outline: none !important;
131
- box-shadow: none !important;
132
- }
133
-
134
- button {
135
- cursor: pointer;
136
- }
137
-
138
- input:focus {
139
- outline: none !important;
140
- }
141
-
142
- button:focus {
143
- outline: none !important;
144
- }
145
- }
146
-
147
- @layer base {
148
- /* CSS Variables for Radix UI components - using RGB values for clarity */
149
- :root {
150
- /* Light mode colors */
151
- --background: 255 255 255; /* white */
152
- --foreground: 10 10 10; /* near-black */
153
- --card: 255 255 255; /* white */
154
- --card-foreground: 10 10 10; /* near-black */
155
- --popover: 255 255 255; /* white */
156
- --popover-foreground: 10 10 10; /* near-black */
157
- --primary: 23 23 23; /* zinc-900 */
158
- --primary-foreground: 250 250 250; /* zinc-50 */
159
- --secondary: 245 245 245; /* neutral-100 */
160
- --secondary-foreground: 23 23 23; /* zinc-900 */
161
- --muted: 245 245 245; /* neutral-100 */
162
- --muted-foreground: 115 115 115; /* neutral-500 */
163
- --accent: 245 245 245; /* neutral-100 */
164
- --accent-foreground: 23 23 23; /* zinc-900 */
165
- --destructive: 239 68 68; /* red-500 */
166
- --destructive-foreground: 250 250 250; /* zinc-50 */
167
- --border: 228 228 231; /* zinc-200 */
168
- --input: 228 228 231; /* zinc-200 */
169
- --ring: 10 10 10; /* near-black */
170
- --radius: 0.5rem;
171
- --background-color: #ffffff;
172
- --border-color: #737373;
173
- --border-hover-color: #d4d4d4;
174
- }
175
-
176
- .dark {
177
- /* Dark mode colors - matching your neutral theme */
178
- --background: 38 38 38; /* neutral-800 */
179
- --foreground: 250 250 250; /* zinc-50 */
180
- --card: 64 64 64; /* neutral-700 */
181
- --card-foreground: 250 250 250; /* zinc-50 */
182
- --popover: 64 64 64; /* neutral-700 */
183
- --popover-foreground: 250 250 250; /* zinc-50 */
184
- --primary: 250 250 250; /* zinc-50 */
185
- --primary-foreground: 23 23 23; /* zinc-900 */
186
- --secondary: 82 82 82; /* neutral-600 */
187
- --secondary-foreground: 250 250 250; /* zinc-50 */
188
- --muted: 82 82 82; /* neutral-600 */
189
- --muted-foreground: 163 163 163; /* neutral-400 */
190
- --accent: 82 82 82; /* neutral-600 */
191
- --accent-foreground: 250 250 250; /* zinc-50 */
192
- --destructive: 127 29 29; /* red-900 */
193
- --destructive-foreground: 250 250 250; /* zinc-50 */
194
- --border: 64 64 64; /* neutral-700 */
195
- --input: 64 64 64; /* neutral-700 */
196
- --ring: 212 212 212; /* zinc-300 */
197
- --background-color: #262626;
198
- --border-color: #737373;
199
- --border-hover-color: #d4d4d4;
200
- }
201
- }
202
-
203
- @layer base {
204
- body {
205
- font-family:
206
- 'Inter',
207
- -apple-system,
208
- BlinkMacSystemFont,
209
- 'Segoe UI',
210
- Roboto,
211
- 'Helvetica Neue',
212
- Arial,
213
- sans-serif;
214
- }
215
- }
216
-
217
- @theme {
218
- --color-border-gray: #e4e4e7;
219
- --color-chart-blue-dark: #2c7fff;
220
- --color-text-gray: #a1a1a1;
221
- --color-bg-gray: #f8f9fa;
222
- --color-link-blue: #2c7fff;
223
- --color-bg-gray-hover: #ebebeb;
224
- }
225
-
226
- /* Fix for Radix UI dropdowns to prevent scroll lock */
227
- [data-radix-popper-content-wrapper] {
228
- position: fixed !important;
229
- }
230
-
231
- /* Custom scrollbar styles */
232
- ::-webkit-scrollbar {
233
- width: 10px;
234
- height: 10px;
235
- }
236
-
237
- ::-webkit-scrollbar-track {
238
- background: var(--background-color);
239
- border-radius: 5px;
240
- }
241
-
242
- ::-webkit-scrollbar-thumb {
243
- background: var(--border-color);
244
- border-radius: 5px;
245
- }
246
-
247
- ::-webkit-scrollbar-thumb:hover {
248
- background: var(--border-hover-color);
249
- }
1
+ @import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap');
2
+ @import 'tailwindcss';
3
+ @config "../tailwind.config.js";
4
+
5
+ @layer utilities {
6
+ /* PocketBase-inspired Design Tokens */
7
+ :root {
8
+ /* Colors */
9
+ --pb-primary: #1a1a24;
10
+ --pb-text-primary: #1a1a24;
11
+ --pb-text-hint: #617079;
12
+ --pb-text-disabled: #a0a6ac;
13
+
14
+ --pb-body: #f8f9fa;
15
+ --pb-base: #ffffff;
16
+ --pb-base-alt1: #e3e8ed;
17
+ --pb-base-alt2: #d7dde3;
18
+ --pb-base-alt3: #c9d0da;
19
+ --pb-base-alt4: #a5b0c0;
20
+
21
+ --pb-info: #5499e8;
22
+ --pb-success: #32ad84;
23
+ --pb-danger: #e34562;
24
+ --pb-warning: #ff944d;
25
+
26
+ /* Spacing */
27
+ --pb-spacing-xs: 15px;
28
+ --pb-spacing-sm: 20px;
29
+ --pb-spacing-base: 30px;
30
+ --pb-spacing-lg: 50px;
31
+ --pb-spacing-xl: 60px;
32
+
33
+ /* Animation */
34
+ --pb-animation-base: 150ms;
35
+ --pb-animation-active: 70ms;
36
+ --pb-animation-entrance: 250ms;
37
+ }
38
+ }
39
+
40
+ @layer base {
41
+ :root {
42
+ /* Spacing system */
43
+ --baseSpacing: 2rem; /* 32px = 8 * 0.25rem */
44
+ --smSpacing: 1.25rem; /* 20px */
45
+ --xsSpacing: 1rem; /* 16px */
46
+
47
+ /* Font system */
48
+ --baseFontSize: 0.875rem; /* 14px */
49
+ --smFontSize: 0.8125rem; /* 13px */
50
+ --xsFontSize: 0.75rem; /* 12px */
51
+ --lgFontSize: 1.25rem; /* 20px */
52
+ --xlFontSize: 1.375rem; /* 22px */
53
+
54
+ /* Font weights */
55
+ --fontWeightNormal: 400;
56
+ --fontWeightMedium: 500;
57
+ --fontWeightSemibold: 600;
58
+
59
+ /* Font families */
60
+ --fontFamilyBase:
61
+ 'Inter', system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
62
+ --fontFamilyMono: 'Ubuntu Mono', ui-monospace, monospace;
63
+ --fontFamilyManrope: 'Manrope', sans-serif;
64
+ }
65
+
66
+ /* Prevent document-level scrolling */
67
+ html,
68
+ body {
69
+ overflow: hidden;
70
+ height: 100%;
71
+ }
72
+
73
+ /* Apply base font settings */
74
+ body {
75
+ font-family: var(--fontFamilyBase);
76
+ font-size: var(--baseFontSize);
77
+ font-weight: var(--fontWeightNormal);
78
+ }
79
+
80
+ /* Typography scale */
81
+ h1 {
82
+ font-size: var(--xlFontSize);
83
+ font-weight: var(--fontWeightSemibold);
84
+ line-height: 1.3;
85
+ }
86
+
87
+ h2 {
88
+ font-size: var(--lgFontSize);
89
+ font-weight: var(--fontWeightSemibold);
90
+ line-height: 1.3;
91
+ }
92
+
93
+ .text-xs {
94
+ font-size: var(--xsFontSize);
95
+ }
96
+
97
+ .text-sm {
98
+ font-size: var(--smFontSize);
99
+ }
100
+
101
+ .font-mono {
102
+ font-family: var(--fontFamilyMono);
103
+ }
104
+ }
105
+
106
+ @layer components {
107
+ /* Checkbox styling */
108
+ input[type='checkbox'] {
109
+ @apply cursor-pointer;
110
+ accent-color: #000000;
111
+ }
112
+
113
+ input[type='checkbox']:checked {
114
+ background-color: #000000 !important;
115
+ border-color: #000000 !important;
116
+ accent-color: #000000;
117
+ }
118
+
119
+ input[type='checkbox']:checked:hover {
120
+ background-color: #1a1a1a !important;
121
+ border-color: #1a1a1a !important;
122
+ }
123
+
124
+ input[type='checkbox']:focus {
125
+ outline: none !important;
126
+ box-shadow: none !important;
127
+ }
128
+
129
+ input[type='checkbox']:focus-visible {
130
+ outline: none !important;
131
+ box-shadow: none !important;
132
+ }
133
+
134
+ button {
135
+ cursor: pointer;
136
+ }
137
+
138
+ input:focus {
139
+ outline: none !important;
140
+ }
141
+
142
+ button:focus {
143
+ outline: none !important;
144
+ }
145
+ }
146
+
147
+ @layer base {
148
+ /* CSS Variables for Radix UI components - using RGB values for clarity */
149
+ :root {
150
+ /* Light mode colors */
151
+ --background: 255 255 255; /* white */
152
+ --foreground: 10 10 10; /* near-black */
153
+ --card: 255 255 255; /* white */
154
+ --card-foreground: 10 10 10; /* near-black */
155
+ --popover: 255 255 255; /* white */
156
+ --popover-foreground: 10 10 10; /* near-black */
157
+ --primary: 23 23 23; /* zinc-900 */
158
+ --primary-foreground: 250 250 250; /* zinc-50 */
159
+ --secondary: 245 245 245; /* neutral-100 */
160
+ --secondary-foreground: 23 23 23; /* zinc-900 */
161
+ --muted: 245 245 245; /* neutral-100 */
162
+ --muted-foreground: 115 115 115; /* neutral-500 */
163
+ --accent: 245 245 245; /* neutral-100 */
164
+ --accent-foreground: 23 23 23; /* zinc-900 */
165
+ --destructive: 239 68 68; /* red-500 */
166
+ --destructive-foreground: 250 250 250; /* zinc-50 */
167
+ --border: 228 228 231; /* zinc-200 */
168
+ --input: 228 228 231; /* zinc-200 */
169
+ --ring: 10 10 10; /* near-black */
170
+ --radius: 0.5rem;
171
+ --background-color: #ffffff;
172
+ --border-color: #737373;
173
+ --border-hover-color: #d4d4d4;
174
+ }
175
+
176
+ .dark {
177
+ /* Dark mode colors - matching your neutral theme */
178
+ --background: 38 38 38; /* neutral-800 */
179
+ --foreground: 250 250 250; /* zinc-50 */
180
+ --card: 64 64 64; /* neutral-700 */
181
+ --card-foreground: 250 250 250; /* zinc-50 */
182
+ --popover: 64 64 64; /* neutral-700 */
183
+ --popover-foreground: 250 250 250; /* zinc-50 */
184
+ --primary: 250 250 250; /* zinc-50 */
185
+ --primary-foreground: 23 23 23; /* zinc-900 */
186
+ --secondary: 82 82 82; /* neutral-600 */
187
+ --secondary-foreground: 250 250 250; /* zinc-50 */
188
+ --muted: 82 82 82; /* neutral-600 */
189
+ --muted-foreground: 163 163 163; /* neutral-400 */
190
+ --accent: 82 82 82; /* neutral-600 */
191
+ --accent-foreground: 250 250 250; /* zinc-50 */
192
+ --destructive: 127 29 29; /* red-900 */
193
+ --destructive-foreground: 250 250 250; /* zinc-50 */
194
+ --border: 64 64 64; /* neutral-700 */
195
+ --input: 64 64 64; /* neutral-700 */
196
+ --ring: 212 212 212; /* zinc-300 */
197
+ --background-color: #262626;
198
+ --border-color: #737373;
199
+ --border-hover-color: #d4d4d4;
200
+ }
201
+ }
202
+
203
+ @layer base {
204
+ body {
205
+ font-family:
206
+ 'Inter',
207
+ -apple-system,
208
+ BlinkMacSystemFont,
209
+ 'Segoe UI',
210
+ Roboto,
211
+ 'Helvetica Neue',
212
+ Arial,
213
+ sans-serif;
214
+ }
215
+ }
216
+
217
+ @theme {
218
+ --color-border-gray: #e4e4e7;
219
+ --color-chart-blue-dark: #2c7fff;
220
+ --color-text-gray: #a1a1a1;
221
+ --color-bg-gray: #f8f9fa;
222
+ --color-link-blue: #2c7fff;
223
+ --color-bg-gray-hover: #ebebeb;
224
+ }
225
+
226
+ /* Fix for Radix UI dropdowns to prevent scroll lock */
227
+ [data-radix-popper-content-wrapper] {
228
+ position: fixed !important;
229
+ }
230
+
231
+ /* Custom scrollbar styles */
232
+ ::-webkit-scrollbar {
233
+ width: 10px;
234
+ height: 10px;
235
+ }
236
+
237
+ ::-webkit-scrollbar-track {
238
+ background: var(--background-color);
239
+ border-radius: 5px;
240
+ }
241
+
242
+ ::-webkit-scrollbar-thumb {
243
+ background: var(--border-color);
244
+ border-radius: 5px;
245
+ }
246
+
247
+ ::-webkit-scrollbar-thumb:hover {
248
+ background: var(--border-hover-color);
249
+ }
@@ -0,0 +1,35 @@
1
+ import React, { createContext, useContext, useState, useCallback, ReactNode } from 'react';
2
+
3
+ interface ModalContextType {
4
+ isOnboardingModalOpen: boolean;
5
+ setOnboardingModalOpen: (open: boolean) => void;
6
+ }
7
+
8
+ const ModalContext = createContext<ModalContextType | undefined>(undefined);
9
+
10
+ export const useModal = () => {
11
+ const context = useContext(ModalContext);
12
+ if (!context) {
13
+ throw new Error('useModal must be used within a ModalProvider');
14
+ }
15
+ return context;
16
+ };
17
+
18
+ interface ModalProviderProps {
19
+ children: ReactNode;
20
+ }
21
+
22
+ export const ModalProvider: React.FC<ModalProviderProps> = ({ children }) => {
23
+ const [isOnboardingModalOpen, setIsOnboardingModalOpen] = useState(false);
24
+
25
+ const setOnboardingModalOpen = useCallback((open: boolean) => {
26
+ setIsOnboardingModalOpen(open);
27
+ }, []);
28
+
29
+ const value: ModalContextType = {
30
+ isOnboardingModalOpen,
31
+ setOnboardingModalOpen,
32
+ };
33
+
34
+ return <ModalContext.Provider value={value}>{children}</ModalContext.Provider>;
35
+ };
@@ -22,7 +22,7 @@ export function useMetadata(options?: UseMetadataOptions) {
22
22
  return {
23
23
  metadata,
24
24
  auth: metadata?.auth,
25
- tables: metadata?.database.tables?.filter((table) => table.tableName !== 'users') ?? [],
25
+ tables: metadata?.database.tables,
26
26
  storage: metadata?.storage,
27
27
  version: metadata?.version || 'Unknown',
28
28
  isLoading,
@@ -51,3 +51,47 @@ export function useApiKey(options?: UseMetadataOptions) {
51
51
  refetch,
52
52
  };
53
53
  }
54
+
55
+ export function useDatabaseConnectionString(options?: UseMetadataOptions) {
56
+ const {
57
+ data: connectionData,
58
+ isLoading,
59
+ error,
60
+ refetch,
61
+ } = useQuery({
62
+ queryKey: ['metadata', 'databaseConnectionString'],
63
+ queryFn: () => metadataService.getDatabaseConnectionString(),
64
+ staleTime: 0,
65
+ gcTime: 0,
66
+ enabled: options?.enabled ?? true,
67
+ });
68
+
69
+ return {
70
+ connectionData,
71
+ isLoading,
72
+ error,
73
+ refetch,
74
+ };
75
+ }
76
+
77
+ export function useDatabasePassword(options?: UseMetadataOptions) {
78
+ const {
79
+ data: passwordData,
80
+ isLoading,
81
+ error,
82
+ refetch,
83
+ } = useQuery({
84
+ queryKey: ['metadata', 'databasePassword'],
85
+ queryFn: () => metadataService.getDatabasePassword(),
86
+ staleTime: 0,
87
+ gcTime: 0,
88
+ enabled: options?.enabled ?? true,
89
+ });
90
+
91
+ return {
92
+ passwordData,
93
+ isLoading,
94
+ error,
95
+ refetch,
96
+ };
97
+ }
@@ -0,0 +1,2 @@
1
+ // Re-export the useModal hook from ModalContext for backwards compatibility
2
+ export { useModal } from '@/lib/contexts/ModalContext';