insforge 1.2.10 → 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 (506) hide show
  1. package/.claude-plugin/marketplace.json +20 -20
  2. package/.dockerignore +60 -60
  3. package/.env.example +83 -77
  4. package/.github/ISSUE_TEMPLATE/bug_report.yml +36 -36
  5. package/.github/ISSUE_TEMPLATE/config.yml +11 -11
  6. package/.github/ISSUE_TEMPLATE/feature_request.yml +26 -26
  7. package/.github/PULL_REQUEST_TEMPLATE.md +7 -7
  8. package/.github/copilot-instructions.md +146 -146
  9. package/.github/workflows/build-image.yml +65 -65
  10. package/.github/workflows/ci-premerge-check.yml +23 -23
  11. package/.github/workflows/e2e.yml +63 -63
  12. package/.github/workflows/lint-and-format.yml +32 -32
  13. package/.prettierignore +64 -64
  14. package/CHANGELOG.md +46 -44
  15. package/CLAUDE_PLUGIN.md +104 -104
  16. package/CODE_OF_CONDUCT.md +128 -128
  17. package/CONTRIBUTING.md +125 -125
  18. package/Dockerfile +30 -30
  19. package/GITHUB_OAUTH_SETUP.md +49 -49
  20. package/GOOGLE_OAUTH_SETUP.md +148 -148
  21. package/LICENSE +201 -201
  22. package/README.md +182 -182
  23. package/assets/Dark.svg +23 -23
  24. package/auth/package.json +30 -28
  25. package/auth/src/lib/broadcastService.ts +4 -4
  26. package/auth/src/lib/insforge.ts +8 -0
  27. package/auth/src/main.tsx +2 -4
  28. package/auth/src/pages/SignInPage.tsx +5 -2
  29. package/auth/src/pages/SignUpPage.tsx +5 -2
  30. package/auth/src/pages/VerifyEmailPage.tsx +18 -0
  31. package/auth/tsconfig.json +33 -32
  32. package/auth/tsconfig.node.json +11 -11
  33. package/backend/package.json +82 -75
  34. package/backend/src/api/middlewares/rate-limiters.ts +127 -127
  35. package/backend/src/api/routes/ai/index.routes.ts +475 -468
  36. package/backend/src/api/routes/auth/index.routes.ts +720 -570
  37. package/backend/src/api/routes/auth/oauth.routes.ts +478 -448
  38. package/backend/src/api/routes/database/advance.routes.ts +37 -16
  39. package/backend/src/api/routes/database/index.routes.ts +80 -1
  40. package/backend/src/api/routes/database/records.routes.ts +48 -184
  41. package/backend/src/api/routes/database/rpc.routes.ts +69 -0
  42. package/backend/src/api/routes/database/tables.routes.ts +0 -14
  43. package/backend/src/api/routes/deployments/index.routes.ts +192 -0
  44. package/backend/src/api/routes/docs/index.routes.ts +76 -76
  45. package/backend/src/api/routes/email/index.routes.ts +35 -0
  46. package/backend/src/api/routes/functions/index.routes.ts +21 -15
  47. package/backend/src/api/routes/metadata/index.routes.ts +38 -0
  48. package/backend/src/api/routes/realtime/channels.routes.ts +81 -0
  49. package/backend/src/api/routes/realtime/index.routes.ts +12 -0
  50. package/backend/src/api/routes/realtime/messages.routes.ts +48 -0
  51. package/backend/src/api/routes/realtime/permissions.routes.ts +19 -0
  52. package/backend/src/api/routes/storage/index.routes.ts +18 -12
  53. package/backend/src/api/routes/usage/index.routes.ts +6 -4
  54. package/backend/src/api/routes/webhooks/index.routes.ts +109 -0
  55. package/backend/src/infra/database/database.manager.ts +14 -11
  56. package/backend/src/infra/database/migrations/000_create-base-tables.sql +141 -141
  57. package/backend/src/infra/database/migrations/001_create-helper-functions.sql +40 -40
  58. package/backend/src/infra/database/migrations/002_rename-auth-tables.sql +29 -29
  59. package/backend/src/infra/database/migrations/003_create-users-table.sql +55 -55
  60. package/backend/src/infra/database/migrations/004_add-reload-postgrest-func.sql +23 -23
  61. package/backend/src/infra/database/migrations/005_enable-project-admin-modify-users.sql +29 -29
  62. package/backend/src/infra/database/migrations/006_modify-ai-usage-table.sql +24 -24
  63. package/backend/src/infra/database/migrations/007_drop-metadata-table.sql +1 -1
  64. package/backend/src/infra/database/migrations/008_add-system-tables.sql +76 -76
  65. package/backend/src/infra/database/migrations/009_add-function-secrets.sql +23 -23
  66. package/backend/src/infra/database/migrations/010_modify-ai-config-modalities.sql +93 -93
  67. package/backend/src/infra/database/migrations/011_refactor-secrets-table.sql +15 -15
  68. package/backend/src/infra/database/migrations/012_add-storage-uploaded-by.sql +7 -7
  69. package/backend/src/infra/database/migrations/013_create-auth-schema-functions.sql +44 -44
  70. package/backend/src/infra/database/migrations/014_add-updated-at-trigger-user-table.sql +7 -7
  71. package/backend/src/infra/database/migrations/015_create-auth-config-and-email-otp-tables.sql +59 -59
  72. package/backend/src/infra/database/migrations/016_update-auth-config-and-email-otp.sql +24 -24
  73. package/backend/src/infra/database/migrations/017_create-realtime-schema.sql +233 -0
  74. package/backend/src/infra/database/migrations/018_schema-rework.sql +441 -0
  75. package/backend/src/infra/database/migrations/019_create-deployments-table.sql +36 -0
  76. package/backend/src/infra/database/migrations/020_add-audio-modality.sql +11 -0
  77. package/backend/src/infra/database/migrations/bootstrap/bootstrap-migrations.js +103 -0
  78. package/backend/src/infra/realtime/realtime.manager.ts +246 -0
  79. package/backend/src/infra/realtime/webhook-sender.ts +82 -0
  80. package/backend/src/infra/security/token.manager.ts +216 -125
  81. package/backend/src/infra/socket/socket.manager.ts +198 -64
  82. package/backend/src/providers/ai/openrouter.provider.ts +24 -12
  83. package/backend/src/providers/database/base.provider.ts +39 -0
  84. package/backend/src/providers/database/cloud.provider.ts +159 -0
  85. package/backend/src/providers/deployments/vercel.provider.ts +516 -0
  86. package/backend/src/providers/email/base.provider.ts +4 -7
  87. package/backend/src/providers/email/cloud.provider.ts +84 -0
  88. package/backend/src/providers/oauth/apple.provider.ts +266 -0
  89. package/backend/src/providers/oauth/index.ts +1 -0
  90. package/backend/src/server.ts +329 -284
  91. package/backend/src/services/ai/ai-config.service.ts +6 -6
  92. package/backend/src/services/ai/ai-model.service.ts +60 -60
  93. package/backend/src/services/ai/ai-usage.service.ts +7 -7
  94. package/backend/src/services/ai/chat-completion.service.ts +415 -220
  95. package/backend/src/services/ai/helpers.ts +64 -64
  96. package/backend/src/services/ai/image-generation.service.ts +3 -3
  97. package/backend/src/services/ai/index.ts +13 -13
  98. package/backend/src/services/auth/auth-config.service.ts +4 -4
  99. package/backend/src/services/auth/auth-otp.service.ts +6 -6
  100. package/backend/src/services/auth/auth.service.ts +148 -74
  101. package/backend/src/services/auth/index.ts +4 -4
  102. package/backend/src/services/auth/oauth-config.service.ts +12 -12
  103. package/backend/src/services/database/database-advance.service.ts +19 -55
  104. package/backend/src/services/database/database-table.service.ts +38 -94
  105. package/backend/src/services/database/database.service.ts +127 -0
  106. package/backend/src/services/database/postgrest-proxy.service.ts +165 -0
  107. package/backend/src/services/deployments/deployment.service.ts +693 -0
  108. package/backend/src/services/email/email.service.ts +5 -7
  109. package/backend/src/services/functions/function.service.ts +61 -41
  110. package/backend/src/services/logs/audit.service.ts +10 -10
  111. package/backend/src/services/realtime/index.ts +3 -0
  112. package/backend/src/services/realtime/realtime-auth.service.ts +104 -0
  113. package/backend/src/services/realtime/realtime-channel.service.ts +237 -0
  114. package/backend/src/services/realtime/realtime-message.service.ts +260 -0
  115. package/backend/src/services/secrets/secret.service.ts +101 -27
  116. package/backend/src/services/storage/storage.service.ts +30 -30
  117. package/backend/src/services/usage/usage.service.ts +6 -6
  118. package/backend/src/types/ai.ts +8 -0
  119. package/backend/src/types/auth.ts +16 -1
  120. package/backend/src/types/database.ts +2 -0
  121. package/backend/src/types/deployments.ts +33 -0
  122. package/backend/src/types/realtime.ts +18 -0
  123. package/backend/src/types/socket.ts +7 -31
  124. package/backend/src/types/storage.ts +1 -1
  125. package/backend/src/types/webhooks.ts +45 -0
  126. package/backend/src/utils/cookies.ts +34 -0
  127. package/backend/src/utils/environment.ts +0 -14
  128. package/backend/src/utils/s3-config-loader.ts +64 -0
  129. package/backend/src/utils/seed.ts +79 -43
  130. package/backend/src/utils/sql-parser.ts +216 -0
  131. package/backend/src/utils/utils.ts +114 -114
  132. package/backend/src/utils/validations.ts +10 -10
  133. package/backend/tests/README.md +133 -133
  134. package/backend/tests/cleanup-all-test-data.sh +230 -230
  135. package/backend/tests/cloud/test-s3-multitenant.sh +131 -131
  136. package/backend/tests/local/comprehensive-curl-tests.sh +155 -155
  137. package/backend/tests/local/test-ai-config.sh +129 -129
  138. package/backend/tests/local/test-ai-usage.sh +80 -80
  139. package/backend/tests/local/test-auth-router.sh +143 -143
  140. package/backend/tests/local/test-database-router.sh +222 -222
  141. package/backend/tests/local/test-e2e.sh +240 -240
  142. package/backend/tests/local/test-fk-errors.sh +96 -96
  143. package/backend/tests/local/test-functions.sh +123 -123
  144. package/backend/tests/local/test-id-field.sh +200 -200
  145. package/backend/tests/local/test-logs.sh +132 -132
  146. package/backend/tests/local/test-public-bucket.sh +264 -264
  147. package/backend/tests/local/test-rpc.sh +141 -0
  148. package/backend/tests/local/test-secrets.sh +249 -249
  149. package/backend/tests/local/test-serverless-functions.sh.disabled +325 -325
  150. package/backend/tests/local/test-traditional-rest.sh +208 -208
  151. package/backend/tests/manual/README.md +50 -50
  152. package/backend/tests/manual/create-large-table-simple.sql +10 -10
  153. package/backend/tests/manual/seed-large-table.sql +100 -100
  154. package/backend/tests/manual/setup-large-table-extras.sql +33 -33
  155. package/backend/tests/manual/test-ai-model-plugins.sh +258 -0
  156. package/backend/tests/manual/test-bulk-upsert.sh +409 -409
  157. package/backend/tests/manual/test-database-advance.sh +296 -296
  158. package/backend/tests/manual/test-postgrest-stability.sh +191 -191
  159. package/backend/tests/manual/test-rawsql-export-import.sh +411 -411
  160. package/backend/tests/manual/test-rawsql-modes.sh +244 -244
  161. package/backend/tests/manual/test-universal-storage.sh +263 -263
  162. package/backend/tests/manual/test-users.sql +17 -17
  163. package/backend/tests/run-all-tests.sh +139 -139
  164. package/backend/tests/setup.ts +0 -0
  165. package/backend/tests/test-config.sh +338 -338
  166. package/backend/tests/unit/analyze-query.test.ts +697 -0
  167. package/backend/tests/unit/database-advance.test.ts +326 -0
  168. package/backend/tests/unit/helpers.test.ts +2 -2
  169. package/backend/tsconfig.json +22 -22
  170. package/claude-plugin/.claude-plugin/plugin.json +24 -24
  171. package/claude-plugin/README.md +133 -133
  172. package/claude-plugin/skills/insforge-schema-patterns/SKILL.md +273 -270
  173. package/docker-compose.prod.yml +204 -200
  174. package/docker-compose.yml +232 -228
  175. package/docker-init/db/db-init.sql +97 -97
  176. package/docker-init/db/jwt.sql +5 -5
  177. package/docker-init/db/postgresql.conf +16 -16
  178. package/docker-init/logs/vector.yml +236 -236
  179. package/docs/README.md +44 -44
  180. package/docs/agent-docs/deployment.md +79 -0
  181. package/docs/agent-docs/real-time.md +269 -0
  182. package/docs/changelog.mdx +212 -67
  183. package/docs/core-concepts/ai/architecture.mdx +350 -372
  184. package/docs/core-concepts/ai/sdk.mdx +238 -213
  185. package/docs/core-concepts/authentication/architecture.mdx +276 -278
  186. package/docs/core-concepts/authentication/sdk.mdx +710 -414
  187. package/docs/core-concepts/authentication/ui-components/customization.mdx +733 -529
  188. package/docs/core-concepts/authentication/ui-components/nextjs.mdx +247 -221
  189. package/docs/core-concepts/authentication/ui-components/react-router.mdx +183 -184
  190. package/docs/core-concepts/authentication/ui-components/react.mdx +136 -129
  191. package/docs/core-concepts/database/architecture.mdx +292 -255
  192. package/docs/core-concepts/database/pgvector.mdx +138 -0
  193. package/docs/core-concepts/database/sdk.mdx +382 -382
  194. package/docs/core-concepts/deployments/architecture.mdx +152 -0
  195. package/docs/core-concepts/email/architecture.mdx +103 -0
  196. package/docs/core-concepts/email/sdk.mdx +53 -0
  197. package/docs/core-concepts/functions/architecture.mdx +105 -105
  198. package/docs/core-concepts/functions/sdk.mdx +183 -184
  199. package/docs/core-concepts/realtime/architecture.mdx +446 -0
  200. package/docs/core-concepts/realtime/sdk.mdx +409 -0
  201. package/docs/core-concepts/storage/architecture.mdx +243 -243
  202. package/docs/core-concepts/storage/sdk.mdx +253 -253
  203. package/docs/deployment/README.md +94 -94
  204. package/docs/deployment/deploy-to-aws-ec2.md +564 -564
  205. package/docs/deployment/deploy-to-azure-virtual-machines.md +312 -312
  206. package/docs/deployment/deploy-to-google-cloud-compute-engine.md +613 -613
  207. package/docs/deployment/deploy-to-render.md +441 -441
  208. package/docs/deprecated/insforge-auth-api.md +214 -214
  209. package/docs/deprecated/insforge-auth-sdk.md +99 -99
  210. package/docs/deprecated/insforge-db-api.md +358 -358
  211. package/docs/deprecated/insforge-db-sdk.md +139 -139
  212. package/docs/deprecated/insforge-debug-sdk.md +156 -156
  213. package/docs/deprecated/insforge-debug.md +64 -64
  214. package/docs/deprecated/insforge-instructions.md +123 -123
  215. package/docs/deprecated/insforge-project.md +117 -117
  216. package/docs/deprecated/insforge-storage-api.md +278 -278
  217. package/docs/deprecated/insforge-storage-sdk.md +158 -158
  218. package/docs/docs.json +240 -210
  219. package/docs/examples/framework-guides/nextjs.mdx +131 -131
  220. package/docs/examples/framework-guides/nuxt.mdx +165 -165
  221. package/docs/examples/framework-guides/react.mdx +165 -165
  222. package/docs/examples/framework-guides/svelte.mdx +153 -153
  223. package/docs/examples/framework-guides/vue.mdx +159 -159
  224. package/docs/examples/overview.mdx +67 -67
  225. package/docs/favicon.png +0 -0
  226. package/docs/favicon.svg +4 -19
  227. package/docs/images/changelog/dec-2025/ai-integration.png +0 -0
  228. package/docs/images/changelog/dec-2025/ai-models.webp +0 -0
  229. package/docs/images/changelog/dec-2025/alipay-payment.webp +0 -0
  230. package/docs/images/changelog/dec-2025/apple-login.jpg +0 -0
  231. package/docs/images/changelog/dec-2025/apple-oauth.mp4 +0 -0
  232. package/docs/images/changelog/dec-2025/mcp-installer.png +0 -0
  233. package/docs/images/changelog/dec-2025/moreModels.png +0 -0
  234. package/docs/images/changelog/dec-2025/multi-region.webp +0 -0
  235. package/docs/images/changelog/dec-2025/postgres-connection.webp +0 -0
  236. package/docs/images/changelog/dec-2025/realtime-module.jpg +0 -0
  237. package/docs/images/changelog/dec-2025/realtime2.png +0 -0
  238. package/docs/images/icons/ai.svg +4 -4
  239. package/docs/images/logos/nextjs.svg +4 -4
  240. package/docs/images/logos/nuxt.svg +4 -4
  241. package/docs/images/logos/react.svg +5 -5
  242. package/docs/images/logos/svelte.svg +4 -4
  243. package/docs/images/logos/vue.svg +5 -5
  244. package/docs/images/mcp-setup/CC-MCP-1.mp4 +0 -0
  245. package/docs/images/mcp-setup/CC-MCP-2.mp4 +0 -0
  246. package/docs/images/mcp-setup/Cursor-MCP-1.mp4 +0 -0
  247. package/docs/images/mcp-setup/Cursor-MCP-2.mp4 +0 -0
  248. package/docs/images/mcp-setup/Cursor-MCP-3.mp4 +0 -0
  249. package/docs/images/mcp-setup/claude-code-connect.png +0 -0
  250. package/docs/images/mcp-setup/cline-1.png +0 -0
  251. package/docs/images/mcp-setup/cline-2.png +0 -0
  252. package/docs/images/mcp-setup/cline-3.png +0 -0
  253. package/docs/images/mcp-setup/connect-project.png +0 -0
  254. package/docs/images/mcp-setup/copilot-1.png +0 -0
  255. package/docs/images/mcp-setup/copilot-2.png +0 -0
  256. package/docs/images/mcp-setup/copilot-3.png +0 -0
  257. package/docs/images/mcp-setup/mcp-json-1.png +0 -0
  258. package/docs/images/mcp-setup/mcp-json-2.png +0 -0
  259. package/docs/images/mcp-setup/qoder-1.png +0 -0
  260. package/docs/images/mcp-setup/qoder-2.png +0 -0
  261. package/docs/images/mcp-setup/roocode-1.png +0 -0
  262. package/docs/images/mcp-setup/roocode-2.png +0 -0
  263. package/docs/images/mcp-setup/trae-1.png +0 -0
  264. package/docs/images/mcp-setup/trae-2.png +0 -0
  265. package/docs/images/mcp-setup/trae-3.png +0 -0
  266. package/docs/images/mcp-setup/trae-4.png +0 -0
  267. package/docs/images/mcp-setup/trae-5.png +0 -0
  268. package/docs/images/mcp-setup/windsurf-1.png +0 -0
  269. package/docs/images/mcp-setup/windsurf-2.png +0 -0
  270. package/docs/insforge-instructions-sdk.md +93 -88
  271. package/docs/introduction.mdx +46 -45
  272. package/docs/logo/dark.svg +22 -22
  273. package/docs/logo/light.svg +20 -20
  274. package/docs/mcp-setup.mdx +332 -0
  275. package/docs/oauth-server.mdx +563 -0
  276. package/docs/partnership.mdx +720 -646
  277. package/docs/quickstart.mdx +82 -82
  278. package/docs/showcase.mdx +52 -52
  279. package/docs/snippets/sdk-installation.mdx +21 -21
  280. package/docs/snippets/service-icons.mdx +27 -27
  281. package/docs/vscode-extension.mdx +74 -0
  282. package/eslint.config.js +1 -0
  283. package/examples/oauth/frontend-oauth-example.html +250 -250
  284. package/examples/response-examples.md +443 -443
  285. package/frontend/components.json +17 -17
  286. package/frontend/package.json +69 -69
  287. package/frontend/src/App.tsx +8 -3
  288. package/frontend/src/assets/icons/checkbox_checked.svg +6 -6
  289. package/frontend/src/assets/icons/checkbox_undetermined.svg +6 -6
  290. package/frontend/src/assets/icons/checked.svg +3 -3
  291. package/frontend/src/assets/icons/connected.svg +3 -3
  292. package/frontend/src/assets/icons/error.svg +3 -3
  293. package/frontend/src/assets/icons/loader.svg +9 -9
  294. package/frontend/src/assets/icons/pencil.svg +4 -4
  295. package/frontend/src/assets/icons/refresh.svg +4 -4
  296. package/frontend/src/assets/icons/step_active.svg +3 -3
  297. package/frontend/src/assets/icons/step_inactive.svg +11 -11
  298. package/frontend/src/assets/icons/warning.svg +3 -3
  299. package/frontend/src/assets/logos/antigravity.svg +1 -0
  300. package/frontend/src/assets/logos/apple.svg +3 -3
  301. package/frontend/src/assets/logos/claude_code.svg +3 -3
  302. package/frontend/src/assets/logos/cline.svg +6 -6
  303. package/frontend/src/assets/logos/copilot.svg +10 -0
  304. package/frontend/src/assets/logos/cursor.svg +20 -20
  305. package/frontend/src/assets/logos/deepseek.svg +139 -0
  306. package/frontend/src/assets/logos/discord.svg +8 -8
  307. package/frontend/src/assets/logos/facebook.svg +3 -3
  308. package/frontend/src/assets/logos/gemini.svg +19 -19
  309. package/frontend/src/assets/logos/github.svg +5 -5
  310. package/frontend/src/assets/logos/google.svg +13 -13
  311. package/frontend/src/assets/logos/grok.svg +10 -10
  312. package/frontend/src/assets/logos/insforge_dark.svg +15 -15
  313. package/frontend/src/assets/logos/insforge_light.svg +15 -15
  314. package/frontend/src/assets/logos/instagram.svg +1 -1
  315. package/frontend/src/assets/logos/kiro.svg +9 -0
  316. package/frontend/src/assets/logos/linkedin.svg +3 -3
  317. package/frontend/src/assets/logos/openai.svg +10 -10
  318. package/frontend/src/assets/logos/qoder.svg +4 -0
  319. package/frontend/src/assets/logos/qwen.svg +15 -0
  320. package/frontend/src/assets/logos/roo_code.svg +9 -9
  321. package/frontend/src/assets/logos/spotify.svg +16 -16
  322. package/frontend/src/assets/logos/tiktok.svg +5 -5
  323. package/frontend/src/assets/logos/trae.svg +3 -3
  324. package/frontend/src/assets/logos/windsurf.svg +10 -10
  325. package/frontend/src/assets/logos/x.svg +3 -3
  326. package/frontend/src/components/CodeBlock.tsx +2 -2
  327. package/frontend/src/components/ConnectCTA.tsx +3 -2
  328. package/frontend/src/components/datagrid/DataGrid.tsx +90 -62
  329. package/frontend/src/components/datagrid/datagridTypes.tsx +2 -1
  330. package/frontend/src/components/datagrid/index.ts +1 -1
  331. package/frontend/src/components/index.ts +0 -1
  332. package/frontend/src/components/layout/AppHeader.tsx +13 -37
  333. package/frontend/src/components/layout/AppSidebar.tsx +85 -100
  334. package/frontend/src/components/layout/Layout.tsx +34 -32
  335. package/frontend/src/components/layout/PrimaryMenu.tsx +12 -4
  336. package/frontend/src/components/radix/Select.tsx +151 -151
  337. package/frontend/src/features/ai/components/AIConfigCard.tsx +200 -200
  338. package/frontend/src/features/ai/components/AIEmptyState.tsx +23 -23
  339. package/frontend/src/features/ai/components/ModalityFilterSidebar.tsx +102 -101
  340. package/frontend/src/features/ai/components/ModelSelectionDialog.tsx +135 -135
  341. package/frontend/src/features/ai/components/ModelSelectionGrid.tsx +51 -51
  342. package/frontend/src/features/ai/components/SystemPromptDialog.tsx +118 -118
  343. package/frontend/src/features/ai/components/index.ts +6 -6
  344. package/frontend/src/features/ai/helpers.ts +147 -141
  345. package/frontend/src/features/ai/{page → pages}/AIPage.tsx +166 -166
  346. package/frontend/src/features/auth/components/AuthPreview.tsx +96 -96
  347. package/frontend/src/features/auth/components/OAuthConfigDialog.tsx +1 -0
  348. package/frontend/src/features/auth/components/UsersDataGrid.tsx +61 -31
  349. package/frontend/src/features/auth/components/index.ts +5 -5
  350. package/frontend/src/features/auth/helpers.tsx +8 -0
  351. package/frontend/src/features/auth/{page → pages}/AuthMethodsPage.tsx +275 -275
  352. package/frontend/src/features/auth/{page → pages}/UsersPage.tsx +0 -28
  353. package/frontend/src/features/dashboard/{page → pages}/DashboardPage.tsx +1 -1
  354. package/frontend/src/features/database/components/DatabaseDataGrid.tsx +0 -2
  355. package/frontend/src/features/database/components/ForeignKeyCell.tsx +38 -11
  356. package/frontend/src/features/database/components/ForeignKeyPopover.tsx +18 -8
  357. package/frontend/src/features/database/components/LinkRecordModal.tsx +61 -13
  358. package/frontend/src/features/database/components/RecordFormField.tsx +1 -1
  359. package/frontend/src/features/database/components/SQLModal.tsx +75 -0
  360. package/frontend/src/features/database/components/TableForm.tsx +0 -4
  361. package/frontend/src/features/database/components/TableSidebar.tsx +0 -3
  362. package/frontend/src/features/database/components/TablesEmptyState.tsx +1 -1
  363. package/frontend/src/features/database/components/TemplatePreview.tsx +1 -2
  364. package/frontend/src/features/database/constants.ts +16 -28
  365. package/frontend/src/features/database/hooks/useCSVImport.ts +3 -2
  366. package/frontend/src/features/database/hooks/useDatabase.ts +66 -0
  367. package/frontend/src/features/database/hooks/useRawSQL.ts +3 -2
  368. package/frontend/src/features/database/hooks/useTables.ts +30 -28
  369. package/frontend/src/features/database/index.ts +1 -0
  370. package/frontend/src/features/database/{page → pages}/FunctionsPage.tsx +29 -42
  371. package/frontend/src/features/database/{page → pages}/IndexesPage.tsx +34 -51
  372. package/frontend/src/features/database/{page → pages}/PoliciesPage.tsx +42 -58
  373. package/frontend/src/features/database/{page → pages}/SQLEditorPage.tsx +2 -2
  374. package/frontend/src/features/database/{page → pages}/TablesPage.tsx +0 -42
  375. package/frontend/src/features/database/{page → pages}/TriggersPage.tsx +34 -51
  376. package/frontend/src/features/database/services/advance.service.ts +1 -41
  377. package/frontend/src/features/database/services/database.service.ts +55 -0
  378. package/frontend/src/features/database/services/record.service.ts +4 -20
  379. package/frontend/src/features/database/services/table.service.ts +1 -10
  380. package/frontend/src/features/database/templates/ai-chatbot.ts +6 -6
  381. package/frontend/src/features/database/templates/ecommerce-platform.ts +2 -2
  382. package/frontend/src/features/database/templates/instagram-clone.ts +10 -10
  383. package/frontend/src/features/database/templates/notion-clone.ts +8 -8
  384. package/frontend/src/features/database/templates/reddit-clone.ts +10 -10
  385. package/frontend/src/features/deployments/components/DeploymentRow.tsx +93 -0
  386. package/frontend/src/features/deployments/components/DeploymentsEmptyState.tsx +15 -0
  387. package/frontend/src/features/deployments/hooks/useDeployments.ts +157 -0
  388. package/frontend/src/features/deployments/pages/DeploymentsPage.tsx +318 -0
  389. package/frontend/src/features/deployments/services/deployments.service.ts +63 -0
  390. package/frontend/src/features/functions/components/FunctionRow.tsx +72 -72
  391. package/frontend/src/features/functions/components/FunctionsSidebar.tsx +56 -56
  392. package/frontend/src/features/functions/components/SecretRow.tsx +3 -3
  393. package/frontend/src/features/functions/components/index.ts +5 -5
  394. package/frontend/src/features/functions/hooks/useFunctions.ts +5 -4
  395. package/frontend/src/features/functions/hooks/useSecrets.ts +6 -9
  396. package/frontend/src/features/functions/{page → pages}/FunctionsPage.tsx +21 -44
  397. package/frontend/src/features/functions/{page → pages}/SecretsPage.tsx +118 -116
  398. package/frontend/src/features/functions/services/function.service.ts +8 -25
  399. package/frontend/src/features/functions/services/secret.service.ts +23 -41
  400. package/frontend/src/features/login/{page → pages}/CloudLoginPage.tsx +125 -118
  401. package/frontend/src/features/logs/components/LogDetailPanel.tsx +41 -0
  402. package/frontend/src/features/logs/components/LogsDataGrid.tsx +32 -1
  403. package/frontend/src/features/logs/components/index.ts +1 -0
  404. package/frontend/src/features/logs/hooks/useMcpUsage.ts +13 -66
  405. package/frontend/src/features/logs/{page → pages}/LogsPage.tsx +36 -6
  406. package/frontend/src/features/onboard/components/ApiCredentialsSection.tsx +59 -0
  407. package/frontend/src/features/onboard/components/ConnectionStringSection.tsx +180 -0
  408. package/frontend/src/features/onboard/components/McpConnectionSection.tsx +159 -0
  409. package/frontend/src/features/onboard/components/OnboardingController.tsx +68 -0
  410. package/frontend/src/features/onboard/components/OnboardingModal.tsx +121 -267
  411. package/frontend/src/features/onboard/components/ShowPasswordButton.tsx +21 -0
  412. package/frontend/src/features/onboard/components/index.ts +9 -4
  413. package/frontend/src/features/onboard/components/mcp/CursorDeeplinkGenerator.tsx +1 -1
  414. package/frontend/src/features/onboard/components/mcp/QoderDeeplinkGenerator.tsx +36 -0
  415. package/frontend/src/features/onboard/components/mcp/helpers.tsx +123 -98
  416. package/frontend/src/features/onboard/components/mcp/index.ts +4 -3
  417. package/frontend/src/features/onboard/index.ts +17 -13
  418. package/frontend/src/features/realtime/components/ChannelRow.tsx +83 -0
  419. package/frontend/src/features/realtime/components/EditChannelModal.tsx +246 -0
  420. package/frontend/src/features/realtime/components/MessageRow.tsx +85 -0
  421. package/frontend/src/features/realtime/components/RealtimeEmptyState.tsx +30 -0
  422. package/frontend/src/features/realtime/hooks/useRealtime.ts +218 -0
  423. package/frontend/src/features/realtime/index.ts +11 -0
  424. package/frontend/src/features/realtime/pages/RealtimeChannelsPage.tsx +172 -0
  425. package/frontend/src/features/realtime/pages/RealtimeMessagesPage.tsx +211 -0
  426. package/frontend/src/features/realtime/pages/RealtimePermissionsPage.tsx +191 -0
  427. package/frontend/src/features/realtime/services/realtime.service.ts +107 -0
  428. package/frontend/src/features/settings/pages/SettingsPage.tsx +349 -0
  429. package/frontend/src/features/storage/{page → pages}/StoragePage.tsx +1 -29
  430. package/frontend/src/features/visualizer/components/AuthNode.tsx +4 -4
  431. package/frontend/src/features/visualizer/components/SchemaVisualizer.tsx +24 -11
  432. package/frontend/src/features/visualizer/{page → pages}/VisualizerPage.tsx +11 -36
  433. package/frontend/src/index.css +249 -249
  434. package/frontend/src/lib/contexts/ModalContext.tsx +35 -0
  435. package/frontend/src/lib/contexts/SocketContext.tsx +119 -75
  436. package/frontend/src/lib/hooks/useMetadata.ts +45 -1
  437. package/frontend/src/lib/hooks/useModal.tsx +2 -0
  438. package/frontend/src/lib/routing/AppRoutes.tsx +103 -84
  439. package/frontend/src/lib/services/metadata.service.ts +20 -3
  440. package/frontend/src/lib/utils/cloudMessaging.ts +1 -1
  441. package/frontend/src/lib/utils/menuItems.ts +223 -183
  442. package/frontend/src/lib/utils/utils.ts +196 -183
  443. package/frontend/tsconfig.json +25 -25
  444. package/frontend/tsconfig.node.json +9 -9
  445. package/functions/deno.json +24 -24
  446. package/functions/server.ts +6 -6
  447. package/functions/worker-template.js +1 -1
  448. package/i18n/README.ar.md +130 -130
  449. package/i18n/README.de.md +130 -130
  450. package/i18n/README.es.md +154 -154
  451. package/i18n/README.fr.md +134 -134
  452. package/i18n/README.hi.md +129 -129
  453. package/i18n/README.ja.md +174 -174
  454. package/i18n/README.ko.md +136 -136
  455. package/i18n/README.pt-BR.md +131 -131
  456. package/i18n/README.ru.md +129 -129
  457. package/i18n/README.zh-CN.md +133 -133
  458. package/openapi/ai.yaml +825 -715
  459. package/openapi/auth.yaml +1324 -1244
  460. package/openapi/email.yaml +158 -0
  461. package/openapi/functions.yaml +475 -475
  462. package/openapi/health.yaml +29 -29
  463. package/openapi/logs.yaml +221 -223
  464. package/openapi/metadata.yaml +175 -177
  465. package/openapi/realtime.yaml +699 -0
  466. package/openapi/records.yaml +381 -381
  467. package/openapi/secrets.yaml +370 -370
  468. package/openapi/storage.yaml +875 -875
  469. package/openapi/tables.yaml +462 -463
  470. package/package.json +97 -97
  471. package/shared-schemas/package.json +31 -31
  472. package/shared-schemas/src/ai-api.schema.ts +251 -143
  473. package/shared-schemas/src/ai.schema.ts +8 -4
  474. package/shared-schemas/src/auth-api.schema.ts +380 -339
  475. package/shared-schemas/src/auth.schema.ts +18 -11
  476. package/shared-schemas/src/cloud-events.schema.ts +26 -0
  477. package/shared-schemas/src/database-api.schema.ts +32 -1
  478. package/shared-schemas/src/database.schema.ts +39 -0
  479. package/shared-schemas/src/deployments-api.schema.ts +55 -0
  480. package/shared-schemas/src/deployments.schema.ts +30 -0
  481. package/shared-schemas/src/docs.schema.ts +32 -0
  482. package/shared-schemas/src/email-api.schema.ts +30 -0
  483. package/shared-schemas/src/functions-api.schema.ts +13 -4
  484. package/shared-schemas/src/functions.schema.ts +1 -1
  485. package/shared-schemas/src/index.ts +22 -14
  486. package/shared-schemas/src/metadata.schema.ts +39 -4
  487. package/shared-schemas/src/realtime-api.schema.ts +111 -0
  488. package/shared-schemas/src/realtime.schema.ts +143 -0
  489. package/shared-schemas/src/secrets-api.schema.ts +44 -0
  490. package/shared-schemas/src/secrets.schema.ts +15 -0
  491. package/shared-schemas/tsconfig.json +21 -21
  492. package/tsconfig.json +7 -7
  493. package/zeabur/README.md +26 -13
  494. package/zeabur/template.yml +1001 -1032
  495. package/.cursor/rules/cursor-rules.mdc +0 -94
  496. package/backend/src/types/profile.ts +0 -55
  497. package/frontend/src/components/ProjectInfoModal.tsx +0 -128
  498. package/frontend/src/features/database/hooks/useFullMetadata.ts +0 -18
  499. package/test-gemini.sh +0 -35
  500. package/test-usage-admin.sh +0 -57
  501. package/test-usage.sh +0 -50
  502. /package/frontend/src/features/auth/{page → pages}/ConfigurationPage.tsx +0 -0
  503. /package/frontend/src/features/database/{page → pages}/TemplatesPage.tsx +0 -0
  504. /package/frontend/src/features/login/{page → pages}/LoginPage.tsx +0 -0
  505. /package/frontend/src/features/logs/{page → pages}/AuditsPage.tsx +0 -0
  506. /package/frontend/src/features/logs/{page → pages}/MCPLogsPage.tsx +0 -0
@@ -1,3 +1,3 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="#0A66C2">
2
- <path d="M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433c-1.144 0-2.063-.926-2.063-2.065 0-1.138.92-2.063 2.063-2.063 1.14 0 2.064.925 2.064 2.063 0 1.139-.925 2.065-2.064 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z"/>
3
- </svg>
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="#0A66C2">
2
+ <path d="M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433c-1.144 0-2.063-.926-2.063-2.065 0-1.138.92-2.063 2.063-2.063 1.14 0 2.064.925 2.064 2.063 0 1.139-.925 2.065-2.064 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z"/>
3
+ </svg>
@@ -1,10 +1,10 @@
1
- <svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
2
- <g clip-path="url(#clip0_1767_22960)">
3
- <path fill-rule="evenodd" clip-rule="evenodd" d="M17.9583 8.33745C18.1664 7.72052 18.2385 7.06587 18.1698 6.41843C18.101 5.77099 17.893 5.14609 17.56 4.58662C16.5458 2.84495 14.5083 1.94829 12.5183 2.36995C12.0776 1.88195 11.5385 1.4928 10.9365 1.22809C10.3346 0.963375 9.68341 0.829109 9.02584 0.83412C6.99167 0.829953 5.18667 2.12245 4.56084 4.03245C3.91755 4.16123 3.309 4.42531 2.77554 4.80719C2.24209 5.18907 1.79594 5.68001 1.46667 6.24745C0.968989 7.09267 0.756288 8.07553 0.859976 9.05089C0.963665 10.0263 1.37825 10.9424 2.04251 11.6641C1.83418 12.2811 1.76184 12.9359 1.83046 13.5835C1.89907 14.2311 2.10701 14.8561 2.44001 15.4158C3.45417 17.1575 5.49167 18.0533 7.48167 17.6325C7.92228 18.1204 8.46125 18.5094 9.06307 18.774C9.6649 19.0386 10.3159 19.1727 10.9733 19.1675C13.0092 19.1725 14.815 17.8791 15.4408 15.9675C16.0846 15.8387 16.6935 15.5745 17.2273 15.1923C17.7611 14.8101 18.2074 14.3187 18.5367 13.7508C19.0334 12.9056 19.2454 11.9232 19.1414 10.9484C19.0375 9.97359 18.623 9.05799 17.9592 8.33662L17.9583 8.33745ZM10.9742 17.9691C10.1613 17.9711 9.37317 17.69 8.74501 17.1741C8.77334 17.1591 8.82251 17.1325 8.85501 17.1125L12.555 15.0041C12.6473 14.9526 12.7242 14.8772 12.7775 14.7859C12.8309 14.6946 12.8588 14.5907 12.8583 14.485V9.33829L14.4225 10.2291C14.4392 10.2375 14.45 10.2533 14.4525 10.2708V14.5333C14.45 16.4283 12.8942 17.965 10.9742 17.9691ZM3.49334 14.8175C3.08553 14.1238 2.93839 13.3074 3.07834 12.515C3.10501 12.5316 3.15334 12.5608 3.18751 12.58L6.88751 14.6883C7.07501 14.7966 7.30751 14.7966 7.49584 14.6883L12.0125 12.115V13.8966C12.0129 13.9058 12.011 13.9149 12.0071 13.9231C12.0032 13.9314 11.9973 13.9386 11.99 13.9441L8.25001 16.0741C6.58417 17.0208 4.45667 16.4575 3.49417 14.8158L3.49334 14.8175ZM2.51917 6.84745C2.92858 6.14912 3.56999 5.61653 4.33167 5.34245L4.33001 5.46829V9.68495C4.3295 9.79082 4.35737 9.8949 4.41071 9.98635C4.46406 10.0778 4.54093 10.1533 4.63334 10.205L9.15001 12.7775L7.58667 13.6691C7.57894 13.6741 7.5701 13.6771 7.56095 13.6778C7.55179 13.6785 7.54259 13.677 7.53417 13.6733L3.79334 11.5408C2.13084 10.5908 1.56084 8.49245 2.51834 6.84912L2.51917 6.84745ZM15.3667 9.79745L10.85 7.22412L12.4133 6.33412C12.421 6.32902 12.4298 6.3259 12.439 6.32503C12.4481 6.32416 12.4574 6.32556 12.4658 6.32912L16.2067 8.45995C17.8717 9.40995 18.4425 11.5116 17.4808 13.1541C17.0711 13.852 16.4302 14.3847 15.6692 14.66V10.3175C15.6697 10.2118 15.6419 10.1079 15.5887 10.0166C15.5355 9.92531 15.4589 9.84993 15.3667 9.79829V9.79745ZM16.9225 7.48662C16.8861 7.46449 16.8494 7.44282 16.8125 7.42162L13.1125 5.31329C13.0201 5.26013 12.9154 5.23215 12.8088 5.23215C12.7022 5.23215 12.5974 5.26013 12.505 5.31329L7.98834 7.88662V6.10495C7.98798 6.09581 7.98983 6.08671 7.99375 6.07844C7.99767 6.07016 8.00353 6.06296 8.01084 6.05745L11.75 3.92829C13.4167 2.98079 15.5458 3.54495 16.5058 5.18912C16.9117 5.88329 17.06 6.69662 16.9225 7.48662ZM7.13834 10.6616L5.57417 9.77162C5.56601 9.76762 5.55898 9.76163 5.55374 9.75421C5.54849 9.74678 5.54521 9.73815 5.54417 9.72912V5.46662C5.54501 3.56912 7.10501 2.03162 9.02834 2.03329C9.84167 2.03329 10.6283 2.31495 11.2542 2.82829C11.2258 2.84329 11.1775 2.86995 11.145 2.88912L7.44501 4.99745C7.35251 5.04888 7.2755 5.12417 7.222 5.21548C7.1685 5.3068 7.14047 5.41079 7.14084 5.51662L7.13834 10.6608V10.6616ZM7.98834 8.85495L10 7.70912L12.0117 8.85495V11.1466L10 12.2925L7.98751 11.1466V8.85495H7.98834Z" fill="currentColor"/>
4
- </g>
5
- <defs>
6
- <clipPath id="clip0_1767_22960">
7
- <rect width="20" height="20" fill="currentColor"/>
8
- </clipPath>
9
- </defs>
10
- </svg>
1
+ <svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <g clip-path="url(#clip0_1767_22960)">
3
+ <path fill-rule="evenodd" clip-rule="evenodd" d="M17.9583 8.33745C18.1664 7.72052 18.2385 7.06587 18.1698 6.41843C18.101 5.77099 17.893 5.14609 17.56 4.58662C16.5458 2.84495 14.5083 1.94829 12.5183 2.36995C12.0776 1.88195 11.5385 1.4928 10.9365 1.22809C10.3346 0.963375 9.68341 0.829109 9.02584 0.83412C6.99167 0.829953 5.18667 2.12245 4.56084 4.03245C3.91755 4.16123 3.309 4.42531 2.77554 4.80719C2.24209 5.18907 1.79594 5.68001 1.46667 6.24745C0.968989 7.09267 0.756288 8.07553 0.859976 9.05089C0.963665 10.0263 1.37825 10.9424 2.04251 11.6641C1.83418 12.2811 1.76184 12.9359 1.83046 13.5835C1.89907 14.2311 2.10701 14.8561 2.44001 15.4158C3.45417 17.1575 5.49167 18.0533 7.48167 17.6325C7.92228 18.1204 8.46125 18.5094 9.06307 18.774C9.6649 19.0386 10.3159 19.1727 10.9733 19.1675C13.0092 19.1725 14.815 17.8791 15.4408 15.9675C16.0846 15.8387 16.6935 15.5745 17.2273 15.1923C17.7611 14.8101 18.2074 14.3187 18.5367 13.7508C19.0334 12.9056 19.2454 11.9232 19.1414 10.9484C19.0375 9.97359 18.623 9.05799 17.9592 8.33662L17.9583 8.33745ZM10.9742 17.9691C10.1613 17.9711 9.37317 17.69 8.74501 17.1741C8.77334 17.1591 8.82251 17.1325 8.85501 17.1125L12.555 15.0041C12.6473 14.9526 12.7242 14.8772 12.7775 14.7859C12.8309 14.6946 12.8588 14.5907 12.8583 14.485V9.33829L14.4225 10.2291C14.4392 10.2375 14.45 10.2533 14.4525 10.2708V14.5333C14.45 16.4283 12.8942 17.965 10.9742 17.9691ZM3.49334 14.8175C3.08553 14.1238 2.93839 13.3074 3.07834 12.515C3.10501 12.5316 3.15334 12.5608 3.18751 12.58L6.88751 14.6883C7.07501 14.7966 7.30751 14.7966 7.49584 14.6883L12.0125 12.115V13.8966C12.0129 13.9058 12.011 13.9149 12.0071 13.9231C12.0032 13.9314 11.9973 13.9386 11.99 13.9441L8.25001 16.0741C6.58417 17.0208 4.45667 16.4575 3.49417 14.8158L3.49334 14.8175ZM2.51917 6.84745C2.92858 6.14912 3.56999 5.61653 4.33167 5.34245L4.33001 5.46829V9.68495C4.3295 9.79082 4.35737 9.8949 4.41071 9.98635C4.46406 10.0778 4.54093 10.1533 4.63334 10.205L9.15001 12.7775L7.58667 13.6691C7.57894 13.6741 7.5701 13.6771 7.56095 13.6778C7.55179 13.6785 7.54259 13.677 7.53417 13.6733L3.79334 11.5408C2.13084 10.5908 1.56084 8.49245 2.51834 6.84912L2.51917 6.84745ZM15.3667 9.79745L10.85 7.22412L12.4133 6.33412C12.421 6.32902 12.4298 6.3259 12.439 6.32503C12.4481 6.32416 12.4574 6.32556 12.4658 6.32912L16.2067 8.45995C17.8717 9.40995 18.4425 11.5116 17.4808 13.1541C17.0711 13.852 16.4302 14.3847 15.6692 14.66V10.3175C15.6697 10.2118 15.6419 10.1079 15.5887 10.0166C15.5355 9.92531 15.4589 9.84993 15.3667 9.79829V9.79745ZM16.9225 7.48662C16.8861 7.46449 16.8494 7.44282 16.8125 7.42162L13.1125 5.31329C13.0201 5.26013 12.9154 5.23215 12.8088 5.23215C12.7022 5.23215 12.5974 5.26013 12.505 5.31329L7.98834 7.88662V6.10495C7.98798 6.09581 7.98983 6.08671 7.99375 6.07844C7.99767 6.07016 8.00353 6.06296 8.01084 6.05745L11.75 3.92829C13.4167 2.98079 15.5458 3.54495 16.5058 5.18912C16.9117 5.88329 17.06 6.69662 16.9225 7.48662ZM7.13834 10.6616L5.57417 9.77162C5.56601 9.76762 5.55898 9.76163 5.55374 9.75421C5.54849 9.74678 5.54521 9.73815 5.54417 9.72912V5.46662C5.54501 3.56912 7.10501 2.03162 9.02834 2.03329C9.84167 2.03329 10.6283 2.31495 11.2542 2.82829C11.2258 2.84329 11.1775 2.86995 11.145 2.88912L7.44501 4.99745C7.35251 5.04888 7.2755 5.12417 7.222 5.21548C7.1685 5.3068 7.14047 5.41079 7.14084 5.51662L7.13834 10.6608V10.6616ZM7.98834 8.85495L10 7.70912L12.0117 8.85495V11.1466L10 12.2925L7.98751 11.1466V8.85495H7.98834Z" fill="currentColor"/>
4
+ </g>
5
+ <defs>
6
+ <clipPath id="clip0_1767_22960">
7
+ <rect width="20" height="20" fill="currentColor"/>
8
+ </clipPath>
9
+ </defs>
10
+ </svg>
@@ -0,0 +1,4 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 360 360">
2
+ <path d="M0 0 C8.45956306 4.64859349 17.03492587 9.05737965 25.62646484 13.45507812 C35.94064308 18.73615638 46.20021508 24.08574219 56.33837891 29.70019531 C60.93127679 32.23740806 65.54938733 34.70010478 70.22802734 37.07617188 C71.25460449 37.59977295 72.28118164 38.12337402 73.33886719 38.6628418 C75.28471386 39.6507789 77.23519308 40.62967567 79.19140625 41.59692383 C94.44801591 49.35763099 107.18372609 61.63167743 113.12646484 77.95507812 C116.37052962 89.18293866 117.71418243 99.67618473 117.64404297 111.35375977 C117.64948321 112.90977629 117.65661637 114.46578765 117.6652832 116.02178955 C117.68328039 120.18867483 117.67655226 124.3551573 117.66376686 128.52204823 C117.6535313 132.90781064 117.66305996 137.29354205 117.66931152 141.67930603 C117.67655065 149.02967437 117.66709186 156.37988092 117.64794922 163.73022461 C117.62611449 172.21191498 117.63329451 180.69322163 117.65525484 189.17490298 C117.67342881 196.48914394 117.67595961 203.80326975 117.66550016 211.11752599 C117.65928555 215.4726465 117.65837483 219.82758668 117.67164612 224.18269539 C117.68323589 228.26977101 117.67512247 232.35635219 117.65206909 236.44337463 C117.64680176 237.93808612 117.64826182 239.43283958 117.65711975 240.9275341 C117.70487235 249.80634667 117.67385394 257.18676325 111.19677734 263.97851562 C105.01838896 268.27113085 99.84578784 270.81278068 92.12646484 269.95507812 C86.24835492 268.12378936 80.6307852 265.70302465 75.09130859 263.02929688 C74.08487305 262.54505249 74.08487305 262.54505249 73.05810547 262.05102539 C71.74995505 261.41408682 70.44755 260.76518081 69.15185547 260.10327148 C65.80562878 258.43539968 65.80562878 258.43539968 62.14990234 258.02539062 C58.98189922 259.48095963 55.89766732 261.08162886 52.81396484 262.70507812 C31.66683754 273.53145894 7.879152 279.1734137 -15.56103516 273.27929688 C-29.96427589 268.53072845 -43.522752 260.21129735 -56.74584961 252.91015625 C-65.20658318 248.26292717 -73.78166356 243.85297279 -82.37353516 239.45507812 C-92.73494986 234.14969763 -103.04383106 228.77807901 -113.22827148 223.13745117 C-117.61487591 220.7121832 -122.02051548 218.3523125 -126.49462891 216.09179688 C-144.92851472 206.77069867 -159.53107706 196.26073344 -166.87353516 175.95507812 C-170.40841014 164.57563629 -171.48687341 154.13568281 -171.43994141 142.28710938 C-171.44520066 140.6339229 -171.45148534 138.98073941 -171.45872498 137.32756042 C-171.46904174 133.88611597 -171.46469852 130.44508715 -171.44995117 127.00366211 C-171.43622844 123.52149836 -171.44307898 120.04043199 -171.47045898 116.55834961 C-171.66845678 91.32396442 -170.57684979 68.85551921 -158.87353516 45.95507812 C-158.5707666 45.35646973 -158.26799805 44.75786133 -157.95605469 44.14111328 C-144.25891835 17.53719946 -120.61497607 -5.27853503 -91.90478516 -14.73242188 C-55.45872058 -26.15124702 -32.49958176 -17.93650795 0 0 Z M-26.49462891 75.57226562 C-41.50953513 91.36017014 -51.56466723 110.88445494 -56.87353516 131.95507812 C-57.04812256 132.64343246 -57.22270996 133.3317868 -57.40258789 134.04100037 C-59.03902872 141.26298246 -59.13145209 148.23786406 -59.06884766 155.61914062 C-59.06601776 156.89236176 -59.06318787 158.16558289 -59.06027222 159.47738647 C-59.05103501 162.82781835 -59.03313308 166.17796649 -59.01086426 169.52832031 C-58.99023766 172.96091285 -58.98123492 176.39353495 -58.97119141 179.82617188 C-58.94923605 186.53588423 -58.91583775 193.24546484 -58.87353516 199.95507812 C-33.50750049 190.25188654 -15.7042659 163.60234245 -4.87353516 139.95507812 C3.47576167 120.30197406 3.52446533 100.92569279 3.31396484 79.95507812 C3.298888 77.33008582 3.28520492 74.70508512 3.27294922 72.08007812 C3.24018836 65.70489233 3.19022781 59.33002534 3.12646484 52.95507812 C-6.49426422 52.95507812 -20.09393042 69.18110618 -26.49462891 75.57226562 Z " fill="#FEFEFE" transform="translate(206.87353515625,51.044921875)"/>
3
+ <path d="M0 0 C13.58332159 12.63939585 21.35936472 28.62481997 22.67781067 47.21190071 C22.8179475 51.32768651 22.84699493 55.42601099 22.82226562 59.54321289 C22.82770586 61.09922942 22.83483903 62.65524078 22.84350586 64.21124268 C22.86150305 68.37812796 22.85477492 72.54461042 22.84198952 76.71150136 C22.83175396 81.09726377 22.84128262 85.48299518 22.84753418 89.86875916 C22.85477331 97.21912749 22.84531452 104.56933405 22.82617188 111.91967773 C22.80433715 120.4013681 22.81151717 128.88267475 22.8334775 137.3643561 C22.85165147 144.67859706 22.85418227 151.99272287 22.84372282 159.30697912 C22.83750821 163.66209963 22.83659748 168.0170398 22.84986877 172.37214851 C22.86145854 176.45922413 22.85334512 180.54580532 22.83029175 184.63282776 C22.82502441 186.12753925 22.82648448 187.6222927 22.83534241 189.11698723 C22.88309501 197.99579979 22.85207659 205.37621637 16.375 212.16796875 C10.19661162 216.46058397 5.0240105 219.00223381 -2.6953125 218.14453125 C-8.57342243 216.31324248 -14.19099214 213.89247777 -19.73046875 211.21875 C-20.40142578 210.89592041 -21.07238281 210.57309082 -21.76367188 210.24047852 C-23.07182229 209.60353995 -24.37422735 208.95463393 -25.66992188 208.29272461 C-29.01614857 206.62485281 -29.01614857 206.62485281 -32.671875 206.21484375 C-35.83987812 207.67041275 -38.92411003 209.27108198 -42.0078125 210.89453125 C-63.01039551 221.64691186 -87.56497118 227.88521904 -110.8046875 221.2578125 C-113.49120846 220.31901443 -116.08930499 219.2864896 -118.6953125 218.14453125 C-119.82259766 217.66306641 -119.82259766 217.66306641 -120.97265625 217.171875 C-125.42618753 215.12341648 -128.35985945 212.80539436 -131.6953125 209.14453125 C-132.36304688 208.54125 -133.03078125 207.93796875 -133.71875 207.31640625 C-146.4627668 195.57277302 -152.27949535 180.00393496 -154.6953125 163.14453125 C-154.89640625 161.86707031 -155.0975 160.58960938 -155.3046875 159.2734375 C-155.64241733 155.53830638 -155.71660927 152.75835057 -154.6953125 149.14453125 C-151.18119184 145.5774339 -147.07344088 143.50518479 -142.6953125 141.14453125 C-117.17173915 123.13239991 -99.71251874 95.06912469 -93.71525574 64.52392578 C-91.64212663 52.40094394 -92.11339648 39.90290772 -92.0078125 27.64453125 C-91.97614793 24.97131057 -91.94008514 22.29817127 -91.90429688 19.625 C-91.82007902 13.13161606 -91.75145039 6.63821553 -91.6953125 0.14453125 C-83.75330252 -4.01067896 -76.05029871 -7.80216897 -67.3828125 -10.23046875 C-66.56748047 -10.47667969 -65.75214844 -10.72289063 -64.91210938 -10.9765625 C-43.36343574 -17.25087797 -17.42754833 -15.00550887 0 0 Z " fill="#2ADB5C" transform="translate(301.6953125,102.85546875)"/>
4
+ </svg>
@@ -0,0 +1,15 @@
1
+ <svg width="200" height="200" viewBox="0 0 200 200" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <path d="M174.82 108.75L155.38 75L165.64 57.75C166.46 56.31 166.46 54.53 165.64 53.09L155.38 35.84C154.86 34.91 153.87 34.33 152.78 34.33H114.88L106.14 19.03C105.62 18.1 104.63 17.52 103.54 17.52H83.3C82.21 17.52 81.22 18.1 80.7 19.03L61.26 52.77H41.02C39.93 52.77 38.94 53.35 38.42 54.28L28.16 71.53C27.34 72.97 27.34 74.75 28.16 76.19L45.52 107.5L36.78 122.8C35.96 124.24 35.96 126.02 36.78 127.46L47.04 144.71C47.56 145.64 48.55 146.22 49.64 146.22H87.54L96.28 161.52C96.8 162.45 97.79 163.03 98.88 163.03H119.12C120.21 163.03 121.2 162.45 121.72 161.52L141.16 127.78H158.52C159.61 127.78 160.6 127.2 161.12 126.27L171.38 109.02C172.2 107.58 172.2 105.8 171.38 104.36L174.82 108.75Z" fill="url(#paint0_radial)"/>
3
+ <path d="M119.12 163.03H98.88L87.54 144.71H49.64L61.26 126.39H80.7L38.42 55.29H61.26L83.3 19.03L93.56 37.35L83.3 55.29H161.58L151.32 72.54L170.76 106.28H151.32L141.16 88.34L101.18 163.03H119.12Z" fill="white"/>
4
+ <path d="M127.86 79.83H76.14L101.18 122.11L127.86 79.83Z" fill="url(#paint1_radial)"/>
5
+ <defs>
6
+ <radialGradient id="paint0_radial" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(100 100) rotate(90) scale(100)">
7
+ <stop stop-color="#665CEE"/>
8
+ <stop offset="1" stop-color="#332E91"/>
9
+ </radialGradient>
10
+ <radialGradient id="paint1_radial" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(100 100) rotate(90) scale(100)">
11
+ <stop stop-color="#665CEE"/>
12
+ <stop offset="1" stop-color="#332E91"/>
13
+ </radialGradient>
14
+ </defs>
15
+ </svg>
@@ -1,9 +1,9 @@
1
- <svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
2
- <rect x="-4" y="-5" width="32" height="32" fill="url(#pattern0_1018_35627)"/>
3
- <defs>
4
- <pattern id="pattern0_1018_35627" patternContentUnits="objectBoundingBox" width="1" height="1">
5
- <use xlink:href="#image0_1018_35627" transform="scale(0.005)"/>
6
- </pattern>
7
- <image id="image0_1018_35627" width="200" height="200" preserveAspectRatio="none" xlink:href="data:image/png;base64,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fa9cLn8MwFXsbqhlzszM/K0kSbyQigaDoihysVh8GLvsRVRVPTU8PBy16xP1vVgsNhIKhWaxyySZnp6+n70IDZRSqfRBdP4QqDM5Nu6XJOlcIpFItaoS9T9VVaVqtfr32PzhUmdydCRJuVx+WJZlXlRFg8Pv9/sSicR3sYteBMDldDo9Zdel7nHrcswsLCws6rp+ryRJb2H7a9nt+0O6rv+dqqq8qIoGhyzLQq1W+yRufJR9oxcZHx+v2HWJBoKmaW7DMB7HLoZaExMTj/HSXBo4Y2Nj4x6P5zS2TxL7vqVcLnf7RkWiQaAoijA9PX0HgCXsMNQaGxv7Di/NpYHjcrmUfD7/FezciyyXy+WPblQkGhTxeDzh9/vtHwTdNklGRkae1TSNv51Og6dSqfwGmkOtrZLEHn7Vq9UqL6qiweN2u+Vqtdr+NabOJFkHYAWDwR/ruq5v1iQaEMFgMBCLxZ5GW0K0hZ00y6VS6a7NWkQDJJvN1gRBmENnUmwMsQBYfr//2y6XS2mrRtvg6dB9RlEU0TCM97tcrl8XRVGxLMu0LKuBZsKg0WjU6/X6c6dPn/6+aZqWozo5MEH6lKIoIrZYv5ZlWevr61udv0VEREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREQ06P4fFV6xYjbCfaIAAAAASUVORK5CYII="/>
8
- </defs>
9
- </svg>
1
+ <svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
2
+ <rect x="-4" y="-5" width="32" height="32" fill="url(#pattern0_1018_35627)"/>
3
+ <defs>
4
+ <pattern id="pattern0_1018_35627" patternContentUnits="objectBoundingBox" width="1" height="1">
5
+ <use xlink:href="#image0_1018_35627" transform="scale(0.005)"/>
6
+ </pattern>
7
+ <image id="image0_1018_35627" width="200" height="200" preserveAspectRatio="none" xlink:href="data:image/png;base64,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fa9cLn8MwFXsbqhlzszM/K0kSbyQigaDoihysVh8GLvsRVRVPTU8PBy16xP1vVgsNhIKhWaxyySZnp6+n70IDZRSqfRBdP4QqDM5Nu6XJOlcIpFItaoS9T9VVaVqtfr32PzhUmdydCRJuVx+WJZlXlRFg8Pv9/sSicR3sYteBMDldDo9Zdel7nHrcswsLCws6rp+ryRJb2H7a9nt+0O6rv+dqqq8qIoGhyzLQq1W+yRufJR9oxcZHx+v2HWJBoKmaW7DMB7HLoZaExMTj/HSXBo4Y2Nj4x6P5zS2TxL7vqVcLnf7RkWiQaAoijA9PX0HgCXsMNQaGxv7Di/NpYHjcrmUfD7/FezciyyXy+WPblQkGhTxeDzh9/vtHwTdNklGRkae1TSNv51Og6dSqfwGmkOtrZLEHn7Vq9UqL6qiweN2u+Vqtdr+NabOJFkHYAWDwR/ruq5v1iQaEMFgMBCLxZ5GW0K0hZ00y6VS6a7NWkQDJJvN1gRBmENnUmwMsQBYfr//2y6XS2mrRtvg6dB9RlEU0TCM97tcrl8XRVGxLMu0LKuBZsKg0WjU6/X6c6dPn/6+aZqWozo5MEH6lKIoIrZYv5ZlWevr61udv0VEREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREQ06P4fFV6xYjbCfaIAAAAASUVORK5CYII="/>
8
+ </defs>
9
+ </svg>
@@ -1,17 +1,17 @@
1
- <?xml version="1.0" encoding="UTF-8" standalone="no"?>
2
- <!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
3
- <svg width="800px" height="800px" viewBox="0 0 48 48" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
4
-
5
- <title>Spotify-color</title>
6
- <desc>Created with Sketch.</desc>
7
- <defs>
8
-
9
- </defs>
10
- <g id="Icons" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
11
- <g id="Color-" transform="translate(-200.000000, -460.000000)" fill="#00DA5A">
12
- <path d="M238.16,481.36 C230.48,476.8 217.64,476.32 210.32,478.6 C209.12,478.96 207.92,478.24 207.56,477.16 C207.2,475.96 207.92,474.76 209,474.4 C217.52,471.88 231.56,472.36 240.44,477.64 C241.52,478.24 241.88,479.68 241.28,480.76 C240.68,481.6 239.24,481.96 238.16,481.36 M237.92,488.08 C237.32,488.92 236.24,489.28 235.4,488.68 C228.92,484.72 219.08,483.52 211.52,485.92 C210.56,486.16 209.48,485.68 209.24,484.72 C209,483.76 209.48,482.68 210.44,482.44 C219.2,479.8 230,481.12 237.44,485.68 C238.16,486.04 238.52,487.24 237.92,488.08 M235.04,494.68 C234.56,495.4 233.72,495.64 233,495.16 C227.36,491.68 220.28,490.96 211.88,492.88 C211.04,493.12 210.32,492.52 210.08,491.8 C209.84,490.96 210.44,490.24 211.16,490 C220.28,487.96 228.2,488.8 234.44,492.64 C235.28,493 235.4,493.96 235.04,494.68 M224,460 C210.8,460 200,470.8 200,484 C200,497.2 210.8,508 224,508 C237.2,508 248,497.2 248,484 C248,470.8 237.32,460 224,460" id="Spotify">
13
-
14
- </path>
15
- </g>
16
- </g>
1
+ <?xml version="1.0" encoding="UTF-8" standalone="no"?>
2
+ <!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
3
+ <svg width="800px" height="800px" viewBox="0 0 48 48" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
4
+
5
+ <title>Spotify-color</title>
6
+ <desc>Created with Sketch.</desc>
7
+ <defs>
8
+
9
+ </defs>
10
+ <g id="Icons" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
11
+ <g id="Color-" transform="translate(-200.000000, -460.000000)" fill="#00DA5A">
12
+ <path d="M238.16,481.36 C230.48,476.8 217.64,476.32 210.32,478.6 C209.12,478.96 207.92,478.24 207.56,477.16 C207.2,475.96 207.92,474.76 209,474.4 C217.52,471.88 231.56,472.36 240.44,477.64 C241.52,478.24 241.88,479.68 241.28,480.76 C240.68,481.6 239.24,481.96 238.16,481.36 M237.92,488.08 C237.32,488.92 236.24,489.28 235.4,488.68 C228.92,484.72 219.08,483.52 211.52,485.92 C210.56,486.16 209.48,485.68 209.24,484.72 C209,483.76 209.48,482.68 210.44,482.44 C219.2,479.8 230,481.12 237.44,485.68 C238.16,486.04 238.52,487.24 237.92,488.08 M235.04,494.68 C234.56,495.4 233.72,495.64 233,495.16 C227.36,491.68 220.28,490.96 211.88,492.88 C211.04,493.12 210.32,492.52 210.08,491.8 C209.84,490.96 210.44,490.24 211.16,490 C220.28,487.96 228.2,488.8 234.44,492.64 C235.28,493 235.4,493.96 235.04,494.68 M224,460 C210.8,460 200,470.8 200,484 C200,497.2 210.8,508 224,508 C237.2,508 248,497.2 248,484 C248,470.8 237.32,460 224,460" id="Spotify">
13
+
14
+ </path>
15
+ </g>
16
+ </g>
17
17
  </svg>
@@ -1,6 +1,6 @@
1
- <?xml version="1.0" encoding="utf-8"?>
2
- <!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
3
- <svg fill="#000000" width="800px" height="800px" viewBox="0 0 32 32" version="1.1" xmlns="http://www.w3.org/2000/svg">
4
- <title>tiktok</title>
5
- <path d="M16.656 1.029c1.637-0.025 3.262-0.012 4.886-0.025 0.054 2.031 0.878 3.859 2.189 5.213l-0.002-0.002c1.411 1.271 3.247 2.095 5.271 2.235l0.028 0.002v5.036c-1.912-0.048-3.71-0.489-5.331-1.247l0.082 0.034c-0.784-0.377-1.447-0.764-2.077-1.196l0.052 0.034c-0.012 3.649 0.012 7.298-0.025 10.934-0.103 1.853-0.719 3.543-1.707 4.954l0.020-0.031c-1.652 2.366-4.328 3.919-7.371 4.011l-0.014 0c-0.123 0.006-0.268 0.009-0.414 0.009-1.73 0-3.347-0.482-4.725-1.319l0.040 0.023c-2.508-1.509-4.238-4.091-4.558-7.094l-0.004-0.041c-0.025-0.625-0.037-1.25-0.012-1.862 0.49-4.779 4.494-8.476 9.361-8.476 0.547 0 1.083 0.047 1.604 0.136l-0.056-0.008c0.025 1.849-0.050 3.699-0.050 5.548-0.423-0.153-0.911-0.242-1.42-0.242-1.868 0-3.457 1.194-4.045 2.861l-0.009 0.030c-0.133 0.427-0.21 0.918-0.21 1.426 0 0.206 0.013 0.41 0.037 0.61l-0.002-0.024c0.332 2.046 2.086 3.59 4.201 3.59 0.061 0 0.121-0.001 0.181-0.004l-0.009 0c1.463-0.044 2.733-0.831 3.451-1.994l0.010-0.018c0.267-0.372 0.45-0.822 0.511-1.311l0.001-0.014c0.125-2.237 0.075-4.461 0.087-6.698 0.012-5.036-0.012-10.060 0.025-15.083z"></path>
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
3
+ <svg fill="#000000" width="800px" height="800px" viewBox="0 0 32 32" version="1.1" xmlns="http://www.w3.org/2000/svg">
4
+ <title>tiktok</title>
5
+ <path d="M16.656 1.029c1.637-0.025 3.262-0.012 4.886-0.025 0.054 2.031 0.878 3.859 2.189 5.213l-0.002-0.002c1.411 1.271 3.247 2.095 5.271 2.235l0.028 0.002v5.036c-1.912-0.048-3.71-0.489-5.331-1.247l0.082 0.034c-0.784-0.377-1.447-0.764-2.077-1.196l0.052 0.034c-0.012 3.649 0.012 7.298-0.025 10.934-0.103 1.853-0.719 3.543-1.707 4.954l0.020-0.031c-1.652 2.366-4.328 3.919-7.371 4.011l-0.014 0c-0.123 0.006-0.268 0.009-0.414 0.009-1.73 0-3.347-0.482-4.725-1.319l0.040 0.023c-2.508-1.509-4.238-4.091-4.558-7.094l-0.004-0.041c-0.025-0.625-0.037-1.25-0.012-1.862 0.49-4.779 4.494-8.476 9.361-8.476 0.547 0 1.083 0.047 1.604 0.136l-0.056-0.008c0.025 1.849-0.050 3.699-0.050 5.548-0.423-0.153-0.911-0.242-1.42-0.242-1.868 0-3.457 1.194-4.045 2.861l-0.009 0.030c-0.133 0.427-0.21 0.918-0.21 1.426 0 0.206 0.013 0.41 0.037 0.61l-0.002-0.024c0.332 2.046 2.086 3.59 4.201 3.59 0.061 0 0.121-0.001 0.181-0.004l-0.009 0c1.463-0.044 2.733-0.831 3.451-1.994l0.010-0.018c0.267-0.372 0.45-0.822 0.511-1.311l0.001-0.014c0.125-2.237 0.075-4.461 0.087-6.698 0.012-5.036-0.012-10.060 0.025-15.083z"></path>
6
6
  </svg>
@@ -1,3 +1,3 @@
1
- <svg width="28" height="21" viewBox="0 0 28 21" fill="none" xmlns="http://www.w3.org/2000/svg">
2
- <path d="M28 20.9645H3.99933V16.9675H0V0.966675H28V20.9645ZM3.99933 16.9675H24.0007V4.96484H3.99933V16.9675ZM14.0012 10.9055L11.172 13.7335L8.344 10.9055L11.172 8.07751L14.0012 10.9055ZM22.001 10.9043L19.173 13.7312L16.3438 10.9043L19.173 8.07517L22.001 10.9043Z" fill="#32F08C"/>
3
- </svg>
1
+ <svg width="28" height="21" viewBox="0 0 28 21" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <path d="M28 20.9645H3.99933V16.9675H0V0.966675H28V20.9645ZM3.99933 16.9675H24.0007V4.96484H3.99933V16.9675ZM14.0012 10.9055L11.172 13.7335L8.344 10.9055L11.172 8.07751L14.0012 10.9055ZM22.001 10.9043L19.173 13.7312L16.3438 10.9043L19.173 8.07517L22.001 10.9043Z" fill="#32F08C"/>
3
+ </svg>
@@ -1,10 +1,10 @@
1
- <svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
2
- <g clip-path="url(#clip0_1018_35613)">
3
- <path fill-rule="evenodd" clip-rule="evenodd" d="M20.835 6.753H20.664C20.4485 6.75369 20.2352 6.79685 20.0364 6.88001C19.8375 6.96317 19.657 7.0847 19.5052 7.23766C19.3533 7.39062 19.2331 7.572 19.1514 7.77144C19.0697 7.97088 19.0281 8.18447 19.029 8.4V12.084C19.029 12.819 18.426 13.4152 17.709 13.4152C17.4921 13.4134 17.2788 13.3598 17.0868 13.259C16.8948 13.1581 16.7297 13.013 16.605 12.8355L12.876 7.4625C12.7244 7.24261 12.5216 7.06287 12.2852 6.93875C12.0487 6.81463 11.7856 6.74986 11.5185 6.75C10.668 6.75 9.903 7.479 9.903 8.37975V12.0848C9.903 12.8198 9.30525 13.416 8.583 13.416C8.1555 13.416 7.731 13.1992 7.479 12.8362L3.306 6.8235C3.2115 6.6885 3 6.75525 3 6.921V10.134C3 10.296 3.0495 10.4535 3.141 10.587L7.24725 16.5037C7.49025 16.8532 7.84725 17.1128 8.2605 17.2073C9.29325 17.4443 10.2443 16.6418 10.2443 15.6195V11.9175C10.2443 11.1825 10.8345 10.5863 11.5642 10.5863H11.5658C12.0052 10.5863 12.417 10.8022 12.6698 11.166L16.3988 16.5382C16.5481 16.7603 16.7504 16.9418 16.9874 17.0662C17.2244 17.1905 17.4886 17.254 17.7562 17.2507C18.6247 17.2507 19.3695 16.521 19.3695 15.621V11.9168C19.3695 11.1818 19.9598 10.5855 20.6895 10.5855H20.835C20.9265 10.5855 21 10.5105 21 10.419V6.91875C21.0001 6.89698 20.9959 6.87541 20.9877 6.85526C20.9794 6.83512 20.9673 6.81679 20.952 6.80133C20.9367 6.78587 20.9184 6.77357 20.8984 6.76515C20.8783 6.75673 20.8568 6.75235 20.835 6.75225V6.753Z" fill="currentColor"/>
4
- </g>
5
- <defs>
6
- <clipPath id="clip0_1018_35613">
7
- <rect width="18" height="18" fill="white" transform="translate(3 3)"/>
8
- </clipPath>
9
- </defs>
10
- </svg>
1
+ <svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <g clip-path="url(#clip0_1018_35613)">
3
+ <path fill-rule="evenodd" clip-rule="evenodd" d="M20.835 6.753H20.664C20.4485 6.75369 20.2352 6.79685 20.0364 6.88001C19.8375 6.96317 19.657 7.0847 19.5052 7.23766C19.3533 7.39062 19.2331 7.572 19.1514 7.77144C19.0697 7.97088 19.0281 8.18447 19.029 8.4V12.084C19.029 12.819 18.426 13.4152 17.709 13.4152C17.4921 13.4134 17.2788 13.3598 17.0868 13.259C16.8948 13.1581 16.7297 13.013 16.605 12.8355L12.876 7.4625C12.7244 7.24261 12.5216 7.06287 12.2852 6.93875C12.0487 6.81463 11.7856 6.74986 11.5185 6.75C10.668 6.75 9.903 7.479 9.903 8.37975V12.0848C9.903 12.8198 9.30525 13.416 8.583 13.416C8.1555 13.416 7.731 13.1992 7.479 12.8362L3.306 6.8235C3.2115 6.6885 3 6.75525 3 6.921V10.134C3 10.296 3.0495 10.4535 3.141 10.587L7.24725 16.5037C7.49025 16.8532 7.84725 17.1128 8.2605 17.2073C9.29325 17.4443 10.2443 16.6418 10.2443 15.6195V11.9175C10.2443 11.1825 10.8345 10.5863 11.5642 10.5863H11.5658C12.0052 10.5863 12.417 10.8022 12.6698 11.166L16.3988 16.5382C16.5481 16.7603 16.7504 16.9418 16.9874 17.0662C17.2244 17.1905 17.4886 17.254 17.7562 17.2507C18.6247 17.2507 19.3695 16.521 19.3695 15.621V11.9168C19.3695 11.1818 19.9598 10.5855 20.6895 10.5855H20.835C20.9265 10.5855 21 10.5105 21 10.419V6.91875C21.0001 6.89698 20.9959 6.87541 20.9877 6.85526C20.9794 6.83512 20.9673 6.81679 20.952 6.80133C20.9367 6.78587 20.9184 6.77357 20.8984 6.76515C20.8783 6.75673 20.8568 6.75235 20.835 6.75225V6.753Z" fill="currentColor"/>
4
+ </g>
5
+ <defs>
6
+ <clipPath id="clip0_1018_35613">
7
+ <rect width="18" height="18" fill="white" transform="translate(3 3)"/>
8
+ </clipPath>
9
+ </defs>
10
+ </svg>
@@ -1,3 +1,3 @@
1
- <svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
2
- <path transform="translate(2.22, 2) scale(0.0163)" d="M714.163 519.284L1160.89 0H1055.03L667.137 450.887L357.328 0H0L468.492 681.821L0 1226.37H105.866L515.491 750.218L842.672 1226.37H1200L714.137 519.284H714.163ZM569.165 687.828L521.697 619.934L144.011 79.6944H306.615L611.412 515.685L658.88 583.579L1055.08 1150.3H892.476L569.165 687.854V687.828Z" fill="currentColor"/>
3
- </svg>
1
+ <svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <path transform="translate(2.22, 2) scale(0.0163)" d="M714.163 519.284L1160.89 0H1055.03L667.137 450.887L357.328 0H0L468.492 681.821L0 1226.37H105.866L515.491 750.218L842.672 1226.37H1200L714.137 519.284H714.163ZM569.165 687.828L521.697 619.934L144.011 79.6944H306.615L611.412 515.685L658.88 583.579L1055.08 1150.3H892.476L569.165 687.854V687.828Z" fill="currentColor"/>
3
+ </svg>
@@ -36,8 +36,8 @@ export function CodeBlock({
36
36
  {/* Header row with label and copy button */}
37
37
  <div className="flex items-center justify-between mb-2">
38
38
  {label && (
39
- <div className="bg-white dark:bg-neutral-700 rounded px-2 shrink-0">
40
- <span className="text-gray-900 dark:text-neutral-50 text-xs">{label}</span>
39
+ <div className="bg-white dark:bg-neutral-700 rounded px-2 shrink-0 h-5 flex items-center">
40
+ <span className="text-gray-900 dark:text-neutral-50 text-xs leading-5">{label}</span>
41
41
  </div>
42
42
  )}
43
43
  {showCopy && (
@@ -1,7 +1,7 @@
1
1
  import { useNavigate } from 'react-router-dom';
2
2
  import { useMcpUsage } from '@/features/logs/hooks/useMcpUsage';
3
3
  import { isInsForgeCloudProject } from '@/lib/utils/utils';
4
- import { postMessageToParent } from '@/lib/utils/cloudMessaging';
4
+ import { useModal } from '@/lib/hooks/useModal';
5
5
 
6
6
  interface ConnectCTAProps {
7
7
  className?: string;
@@ -11,6 +11,7 @@ interface ConnectCTAProps {
11
11
  export function ConnectCTA({ className, fallback }: ConnectCTAProps) {
12
12
  const navigate = useNavigate();
13
13
  const { hasCompletedOnboarding } = useMcpUsage();
14
+ const { setOnboardingModalOpen } = useModal();
14
15
 
15
16
  if (hasCompletedOnboarding) {
16
17
  return fallback;
@@ -18,7 +19,7 @@ export function ConnectCTA({ className, fallback }: ConnectCTAProps) {
18
19
 
19
20
  const handleConnect = () => {
20
21
  if (isInsForgeCloudProject()) {
21
- postMessageToParent({ type: 'SHOW_ONBOARDING_OVERLAY' });
22
+ setOnboardingModalOpen(true);
22
23
  } else {
23
24
  void navigate('/dashboard/onboard');
24
25
  }
@@ -16,6 +16,14 @@ import { useTheme } from '@/lib/contexts/ThemeContext';
16
16
  import type { DataGridColumn, DataGridRow, DataGridRowType } from './datagridTypes';
17
17
  import SortableHeaderRenderer from './SortableHeader';
18
18
 
19
+ // Custom selection cell renderer props
20
+ export interface SelectionCellProps<TRow extends DataGridRowType = DataGridRow> {
21
+ row: TRow;
22
+ isSelected: boolean;
23
+ onToggle: (checked: boolean) => void;
24
+ tabIndex: number;
25
+ }
26
+
19
27
  // Generic DataGrid props
20
28
  export interface DataGridProps<TRow extends DataGridRowType = DataGridRow> {
21
29
  data: TRow[];
@@ -40,6 +48,10 @@ export interface DataGridProps<TRow extends DataGridRowType = DataGridRow> {
40
48
  showPagination?: boolean;
41
49
  showTypeBadge?: boolean;
42
50
  noPadding?: boolean;
51
+ selectionColumnWidth?: number;
52
+ renderSelectionCell?: (props: SelectionCellProps<TRow>) => React.ReactNode;
53
+ rowClass?: (row: TRow) => string | undefined;
54
+ rightPanel?: React.ReactNode;
43
55
  }
44
56
 
45
57
  // Main DataGrid component
@@ -66,6 +78,10 @@ export default function DataGrid<TRow extends DataGridRowType = DataGridRow>({
66
78
  showPagination = true,
67
79
  showTypeBadge = true,
68
80
  noPadding = false,
81
+ selectionColumnWidth,
82
+ renderSelectionCell,
83
+ rowClass,
84
+ rightPanel,
69
85
  }: DataGridProps<TRow>) {
70
86
  const { resolvedTheme } = useTheme();
71
87
 
@@ -77,31 +93,35 @@ export default function DataGrid<TRow extends DataGridRowType = DataGridRow>({
77
93
 
78
94
  // Add selection column if enabled and not hidden
79
95
  if (showSelection && selectedRows !== undefined && onSelectedRowsChange) {
96
+ const colWidth = selectionColumnWidth ?? 45;
80
97
  cols.push({
81
98
  ...SelectColumn,
82
99
  key: SELECT_COLUMN_KEY,
83
100
  frozen: true,
84
- width: 45,
85
- minWidth: 45,
86
- maxWidth: 45,
87
- resizable: false,
88
- renderCell: ({ row, tabIndex }) => (
89
- <Checkbox
90
- checked={selectedRows.has(keyGetter(row))}
91
- onChange={(checked) => {
92
- const newSelectedRows = new Set(selectedRows);
93
- if (checked) {
94
- newSelectedRows.add(String(keyGetter(row)));
95
- } else {
96
- newSelectedRows.delete(String(keyGetter(row)));
97
- }
98
- onSelectedRowsChange(newSelectedRows);
99
- }}
100
- tabIndex={tabIndex}
101
- />
102
- ),
101
+ width: colWidth,
102
+ minWidth: colWidth,
103
+ maxWidth: renderSelectionCell ? undefined : colWidth,
104
+ resizable: !!renderSelectionCell,
105
+ renderCell: ({ row, tabIndex }) => {
106
+ const isSelected = selectedRows.has(keyGetter(row));
107
+ const handleToggle = (checked: boolean) => {
108
+ const newSelectedRows = new Set(selectedRows);
109
+ if (checked) {
110
+ newSelectedRows.add(String(keyGetter(row)));
111
+ } else {
112
+ newSelectedRows.delete(String(keyGetter(row)));
113
+ }
114
+ onSelectedRowsChange(newSelectedRows);
115
+ };
116
+
117
+ if (renderSelectionCell) {
118
+ return renderSelectionCell({ row, isSelected, onToggle: handleToggle, tabIndex });
119
+ }
120
+
121
+ return <Checkbox checked={isSelected} onChange={handleToggle} tabIndex={tabIndex} />;
122
+ },
103
123
  renderHeaderCell: () => {
104
- const selectedCount = data.filter((row) => selectedRows.has(String(row.id))).length;
124
+ const selectedCount = data.filter((row) => selectedRows.has(keyGetter(row))).length;
105
125
  const totalCount = data.length;
106
126
  const isAllSelected = totalCount > 0 && selectedCount === totalCount;
107
127
  const isPartiallySelected = selectedCount > 0 && selectedCount < totalCount;
@@ -114,10 +134,10 @@ export default function DataGrid<TRow extends DataGridRowType = DataGridRow>({
114
134
  const newSelectedRows = new Set(selectedRows);
115
135
  if (checked) {
116
136
  // Select all
117
- data.forEach((row) => newSelectedRows.add(String(row.id)));
137
+ data.forEach((row) => newSelectedRows.add(keyGetter(row)));
118
138
  } else {
119
139
  // Unselect all
120
- data.forEach((row) => newSelectedRows.delete(String(row.id)));
140
+ data.forEach((row) => newSelectedRows.delete(keyGetter(row)));
121
141
  }
122
142
  onSelectedRowsChange(newSelectedRows);
123
143
  }}
@@ -182,6 +202,8 @@ export default function DataGrid<TRow extends DataGridRowType = DataGridRow>({
182
202
  showSelection,
183
203
  showTypeBadge,
184
204
  keyGetter,
205
+ selectionColumnWidth,
206
+ renderSelectionCell,
185
207
  ]);
186
208
 
187
209
  // Loading state - only show full loading screen if not sorting
@@ -200,48 +222,54 @@ export default function DataGrid<TRow extends DataGridRowType = DataGridRow>({
200
222
  className
201
223
  )}
202
224
  >
203
- <div
204
- className={cn(
205
- 'flex-1 overflow-hidden relative border border-border-gray dark:border-neutral-700 rounded-sm',
206
- !noPadding && 'mx-3'
207
- )}
208
- >
209
- <ReactDataGrid
210
- columns={gridColumns}
211
- rows={isRefreshing ? [] : data}
212
- rowKeyGetter={keyGetter}
213
- onRowsChange={() => {}}
214
- selectedRows={selectedRows}
215
- onSelectedRowsChange={onSelectedRowsChange}
216
- sortColumns={sortColumns || []}
217
- onSortColumnsChange={onSortColumnsChange}
218
- onCellClick={onCellClick}
219
- className={`h-full fill-grid ${resolvedTheme === 'dark' ? 'rdg-dark' : 'rdg-light'}`}
220
- headerRowHeight={36}
221
- rowHeight={36}
222
- enableVirtualization={true}
223
- renderers={{
224
- noRowsFallback: emptyState ? (
225
- <div className="absolute inset-x-0 top-0 mt-13 py-8 flex items-center justify-center bg-white dark:bg-neutral-800">
226
- {emptyState}
227
- </div>
228
- ) : (
229
- <div className="absolute inset-x-0 top-0 mt-13 py-8 flex items-center justify-center bg-white dark:bg-neutral-800">
230
- <div className="text-sm text-zinc-500 dark:text-zinc-400">No data to display</div>
231
- </div>
232
- ),
233
- }}
234
- />
225
+ <div className={cn('flex-1 overflow-hidden flex min-h-0', !noPadding && 'mx-3')}>
226
+ <div
227
+ className={cn(
228
+ 'overflow-hidden relative border border-border-gray dark:border-neutral-700 rounded-sm',
229
+ rightPanel ? 'rounded-r-none border-r-0' : 'flex-1'
230
+ )}
231
+ style={rightPanel ? { width: 'calc(100% - 480px)' } : undefined}
232
+ >
233
+ <ReactDataGrid
234
+ key={rightPanel ? 'with-panel' : 'no-panel'}
235
+ columns={gridColumns}
236
+ rows={isRefreshing ? [] : data}
237
+ rowKeyGetter={keyGetter}
238
+ onRowsChange={() => {}}
239
+ selectedRows={selectedRows}
240
+ onSelectedRowsChange={onSelectedRowsChange}
241
+ sortColumns={sortColumns || []}
242
+ onSortColumnsChange={onSortColumnsChange}
243
+ onCellClick={onCellClick}
244
+ rowClass={rowClass}
245
+ className={`h-full fill-grid ${resolvedTheme === 'dark' ? 'rdg-dark' : 'rdg-light'}`}
246
+ headerRowHeight={36}
247
+ rowHeight={36}
248
+ enableVirtualization={true}
249
+ renderers={{
250
+ noRowsFallback: emptyState ? (
251
+ <div className="absolute inset-x-0 top-0 mt-13 py-8 flex items-center justify-center bg-white dark:bg-neutral-800">
252
+ {emptyState}
253
+ </div>
254
+ ) : (
255
+ <div className="absolute inset-x-0 top-0 mt-13 py-8 flex items-center justify-center bg-white dark:bg-neutral-800">
256
+ <div className="text-sm text-zinc-500 dark:text-zinc-400">No data to display</div>
257
+ </div>
258
+ ),
259
+ }}
260
+ />
235
261
 
236
- {/* Loading mask overlay */}
237
- {isRefreshing && (
238
- <div className="absolute inset-0 bg-white dark:bg-neutral-800 flex items-center justify-center z-50 mt-9">
239
- <div className="flex items-center gap-1">
240
- <div className="w-5 h-5 border-2 border-zinc-500 dark:border-neutral-700 border-t-transparent rounded-full animate-spin" />
241
- <span className="text-sm text-zinc-500 dark:text-zinc-400">Loading</span>
262
+ {/* Loading mask overlay */}
263
+ {isRefreshing && (
264
+ <div className="absolute inset-0 bg-white dark:bg-neutral-800 flex items-center justify-center z-50 mt-9">
265
+ <div className="flex items-center gap-1">
266
+ <div className="w-5 h-5 border-2 border-zinc-500 dark:border-neutral-700 border-t-transparent rounded-full animate-spin" />
267
+ <span className="text-sm text-zinc-500 dark:text-zinc-400">Loading</span>
268
+ </div>
242
269
  </div>
243
- </div>
244
- )}
270
+ )}
271
+ </div>
272
+ {rightPanel}
245
273
  </div>
246
274
  {showPagination && onPageChange && (
247
275
  <PaginationControls
@@ -15,7 +15,8 @@ export type ConvertedValue =
15
15
  | number // INTEGER, FLOAT
16
16
  | boolean // BOOLEAN
17
17
  | null // NULL values for any nullable column
18
- | JSON; // JSON (as parsed object or string)
18
+ | Record<string, unknown> // JSON objects (e.g., metadata fields)
19
+ | string[]; // Array of strings (e.g., providers)
19
20
 
20
21
  /**
21
22
  * User input values - these are the types of values users enter in forms and cell editors
@@ -3,7 +3,7 @@ export * from './cell-editors';
3
3
 
4
4
  // datagrid types
5
5
  export type * from './datagridTypes';
6
- export type { DataGridProps } from './DataGrid';
6
+ export type { DataGridProps, SelectionCellProps } from './DataGrid';
7
7
  export type {
8
8
  Column,
9
9
  SortColumn,
@@ -14,7 +14,6 @@ export { CodeBlock } from './CodeBlock';
14
14
  export { CodeEditor } from './CodeEditor';
15
15
  export { ConfirmDialog } from './ConfirmDialog';
16
16
  export { ConnectCTA } from './ConnectCTA';
17
- export { ProjectInfoModal } from './ProjectInfoModal';
18
17
  export { CopyButton } from './CopyButton';
19
18
  export { DeleteActionButton } from './DeleteActionButton';
20
19
  export { EmptyState } from './EmptyState';
@@ -10,16 +10,11 @@ import {
10
10
  Separator,
11
11
  ThemeToggle,
12
12
  } from '@/components';
13
- import {
14
- McpConnectionStatus,
15
- OnboardingModal,
16
- getOnboardingSkipped,
17
- setOnboardingSkipped,
18
- } from '@/features/onboard';
19
- import { useMcpUsage } from '@/features/logs/hooks/useMcpUsage';
13
+ import { McpConnectionStatus } from '@/features/onboard';
20
14
  import { cn } from '@/lib/utils/utils';
21
15
  import { useTheme } from '@/lib/contexts/ThemeContext';
22
16
  import { useAuth } from '@/lib/contexts/AuthContext';
17
+ import { useModal } from '@/lib/hooks/useModal';
23
18
 
24
19
  // Import SVG icons
25
20
  import DiscordIcon from '@/assets/logos/discord.svg?react';
@@ -30,9 +25,8 @@ import InsForgeLogoDark from '@/assets/logos/insforge_dark.svg';
30
25
  export default function AppHeader() {
31
26
  const { resolvedTheme } = useTheme();
32
27
  const { user, logout } = useAuth();
33
- const { hasCompletedOnboarding, isLoading: isMcpLoading } = useMcpUsage();
28
+ const { setOnboardingModalOpen } = useModal();
34
29
  const [githubStars, setGithubStars] = useState<number | null>(null);
35
- const [isOnboardingModalOpen, setIsOnboardingModalOpen] = useState(false);
36
30
 
37
31
  // Fetch GitHub stars
38
32
  useEffect(() => {
@@ -48,21 +42,6 @@ export default function AppHeader() {
48
42
  });
49
43
  }, []);
50
44
 
51
- // Auto-open onboarding modal if user hasn't connected and hasn't skipped
52
- useEffect(() => {
53
- if (!isMcpLoading && !hasCompletedOnboarding && !getOnboardingSkipped()) {
54
- setIsOnboardingModalOpen(true);
55
- }
56
- }, [isMcpLoading, hasCompletedOnboarding]);
57
-
58
- // When MCP connection is established, close onboarding modal and clear skip flag
59
- useEffect(() => {
60
- if (hasCompletedOnboarding) {
61
- setIsOnboardingModalOpen(false);
62
- setOnboardingSkipped(false);
63
- }
64
- }, [hasCompletedOnboarding]);
65
-
66
45
  const formatStars = (count: number): string => {
67
46
  if (count >= 1000) {
68
47
  return `${(count / 1000).toFixed(1)}k`;
@@ -101,15 +80,14 @@ export default function AppHeader() {
101
80
  <>
102
81
  <div className="h-12 w-full bg-white dark:bg-neutral-800 border-b border-border-gray dark:border-neutral-700 z-50 flex items-center justify-between px-6">
103
82
  {/* Logo */}
104
- <div className="px-2 py-3">
105
- <a href="https://insforge.dev" target="_blank" rel="noopener noreferrer">
106
- <img
107
- src={resolvedTheme === 'light' ? InsForgeLogoLight : InsForgeLogoDark}
108
- alt="Insforge Logo"
109
- className="h-8 w-auto"
110
- />
111
- </a>
112
- </div>
83
+
84
+ <a href="https://insforge.dev" target="_blank" rel="noopener noreferrer">
85
+ <img
86
+ src={resolvedTheme === 'light' ? InsForgeLogoLight : InsForgeLogoDark}
87
+ alt="Insforge Logo"
88
+ className="h-7 w-auto"
89
+ />
90
+ </a>
113
91
 
114
92
  {/* Right side controls */}
115
93
  <div className="flex items-center gap-1">
@@ -140,14 +118,14 @@ export default function AppHeader() {
140
118
  <ThemeToggle />
141
119
  <Separator className="h-5 mx-2" orientation="vertical" />
142
120
  {/* MCP Connection Status */}
143
- <McpConnectionStatus onConnectClick={() => setIsOnboardingModalOpen(true)} />
121
+ <McpConnectionStatus onConnectClick={() => setOnboardingModalOpen(true)} />
144
122
 
145
123
  {/* User Profile*/}
146
124
  <Separator className="h-5 mx-2" orientation="vertical" />
147
125
  <DropdownMenu modal={false}>
148
126
  <DropdownMenuTrigger asChild>
149
127
  <button className="w-50 flex items-center gap-3 hover:bg-zinc-100 dark:hover:bg-zinc-800 rounded-[8px] pr-3 transition-all duration-200 group">
150
- <Avatar className="h-10 w-10 ring-2 ring-white dark:ring-gray-700 shadow-sm">
128
+ <Avatar className="h-8 w-8 ring-2 ring-white dark:ring-gray-700 shadow-sm">
151
129
  <AvatarFallback
152
130
  className={cn(
153
131
  'text-white font-medium text-sm',
@@ -180,8 +158,6 @@ export default function AppHeader() {
180
158
  </DropdownMenu>
181
159
  </div>
182
160
  </div>
183
- {/* Onboarding Modal */}
184
- <OnboardingModal open={isOnboardingModalOpen} onOpenChange={setIsOnboardingModalOpen} />
185
161
  </>
186
162
  );
187
163
  }