insforge 0.3.3 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (635) hide show
  1. package/.claude-plugin/marketplace.json +20 -0
  2. package/.dockerignore +60 -57
  3. package/.env.example +84 -49
  4. package/.github/ISSUE_TEMPLATE/bug_report.yml +36 -83
  5. package/.github/ISSUE_TEMPLATE/config.yml +11 -11
  6. package/.github/ISSUE_TEMPLATE/feature_request.yml +26 -79
  7. package/.github/PULL_REQUEST_TEMPLATE.md +7 -0
  8. package/.github/copilot-instructions.md +146 -146
  9. package/.github/workflows/build-image.yml +66 -65
  10. package/.github/workflows/ci-premerge-check.yml +23 -23
  11. package/.github/workflows/e2e.yml +63 -0
  12. package/.github/workflows/lint-and-format.yml +32 -32
  13. package/.prettierignore +64 -64
  14. package/CHANGELOG.md +44 -3
  15. package/CLAUDE_PLUGIN.md +104 -0
  16. package/CODE_OF_CONDUCT.md +128 -0
  17. package/CONTRIBUTING.md +125 -125
  18. package/Dockerfile +30 -27
  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 -134
  23. package/assets/Dark.svg +23 -23
  24. package/assets/mcpInstallv2.png +0 -0
  25. package/assets/sampleResponse.png +0 -0
  26. package/auth/index.html +13 -0
  27. package/auth/package.json +28 -0
  28. package/auth/public/favicon.ico +0 -0
  29. package/auth/src/App.tsx +33 -0
  30. package/auth/src/components/ErrorCard.tsx +37 -0
  31. package/auth/src/components/Layout.tsx +13 -0
  32. package/auth/src/index.css +19 -0
  33. package/auth/src/lib/broadcastService.ts +117 -0
  34. package/auth/src/lib/utils.ts +11 -0
  35. package/auth/src/main.tsx +22 -0
  36. package/auth/src/pages/ForgotPasswordPage.tsx +11 -0
  37. package/auth/src/pages/ResetPasswordPage.tsx +11 -0
  38. package/auth/src/pages/SignInPage.tsx +60 -0
  39. package/auth/src/pages/SignUpPage.tsx +60 -0
  40. package/auth/src/pages/VerifyEmailPage.tsx +20 -0
  41. package/auth/src/vite-env.d.ts +10 -0
  42. package/auth/tsconfig.json +32 -0
  43. package/auth/tsconfig.node.json +11 -0
  44. package/auth/vite.config.ts +25 -0
  45. package/backend/package.json +78 -75
  46. package/backend/src/api/{middleware → middlewares}/auth.ts +8 -9
  47. package/backend/src/api/middlewares/rate-limiters.ts +127 -0
  48. package/backend/src/api/routes/{ai.ts → ai/index.routes.ts} +22 -26
  49. package/backend/src/api/routes/auth/index.routes.ts +667 -0
  50. package/backend/src/api/routes/auth/oauth.routes.ts +473 -0
  51. package/backend/src/api/routes/{database.advance.ts → database/advance.routes.ts} +128 -65
  52. package/backend/src/api/routes/database/index.routes.ts +90 -0
  53. package/backend/src/api/routes/{database.records.ts → database/records.routes.ts} +26 -12
  54. package/backend/src/api/routes/{database.tables.ts → database/tables.routes.ts} +6 -23
  55. package/backend/src/api/routes/docs/index.routes.ts +75 -0
  56. package/backend/src/api/routes/email/index.routes.ts +35 -0
  57. package/backend/src/api/routes/functions/index.routes.ts +194 -0
  58. package/backend/src/api/routes/{logs.ts → logs/index.routes.ts} +25 -30
  59. package/backend/src/api/routes/{metadata.ts → metadata/index.routes.ts} +33 -31
  60. package/backend/src/api/routes/realtime/channels.routes.ts +81 -0
  61. package/backend/src/api/routes/realtime/index.routes.ts +12 -0
  62. package/backend/src/api/routes/realtime/messages.routes.ts +48 -0
  63. package/backend/src/api/routes/realtime/permissions.routes.ts +19 -0
  64. package/backend/src/api/routes/{secrets.ts → secrets/index.routes.ts} +27 -22
  65. package/backend/src/api/routes/{storage.ts → storage/index.routes.ts} +48 -61
  66. package/backend/src/api/routes/usage/index.routes.ts +91 -0
  67. package/backend/src/infra/config/app.config.ts +51 -0
  68. package/backend/src/infra/database/database.manager.ts +182 -0
  69. package/backend/{migrations → src/infra/database/migrations}/000_create-base-tables.sql +141 -141
  70. package/backend/{migrations → src/infra/database/migrations}/001_create-helper-functions.sql +40 -40
  71. package/backend/{migrations → src/infra/database/migrations}/002_rename-auth-tables.sql +29 -29
  72. package/backend/{migrations → src/infra/database/migrations}/003_create-users-table.sql +55 -55
  73. package/backend/{migrations → src/infra/database/migrations}/004_add-reload-postgrest-func.sql +23 -23
  74. package/backend/{migrations → src/infra/database/migrations}/005_enable-project-admin-modify-users.sql +29 -29
  75. package/backend/{migrations → src/infra/database/migrations}/006_modify-ai-usage-table.sql +24 -24
  76. package/backend/{migrations → src/infra/database/migrations}/007_drop-metadata-table.sql +1 -1
  77. package/backend/{migrations → src/infra/database/migrations}/008_add-system-tables.sql +76 -76
  78. package/backend/{migrations → src/infra/database/migrations}/009_add-function-secrets.sql +23 -23
  79. package/backend/{migrations → src/infra/database/migrations}/010_modify-ai-config-modalities.sql +93 -93
  80. package/backend/{migrations → src/infra/database/migrations}/011_refactor-secrets-table.sql +15 -15
  81. package/backend/{migrations → src/infra/database/migrations}/012_add-storage-uploaded-by.sql +7 -7
  82. package/backend/src/infra/database/migrations/013_create-auth-schema-functions.sql +44 -0
  83. package/backend/src/infra/database/migrations/014_add-updated-at-trigger-user-table.sql +8 -0
  84. package/backend/src/infra/database/migrations/015_create-auth-config-and-email-otp-tables.sql +60 -0
  85. package/backend/src/infra/database/migrations/016_update-auth-config-and-email-otp.sql +24 -0
  86. package/backend/src/infra/database/migrations/017_create-realtime-schema.sql +233 -0
  87. package/backend/src/infra/realtime/realtime.manager.ts +246 -0
  88. package/backend/src/infra/realtime/webhook-sender.ts +82 -0
  89. package/backend/src/{core/secrets/encryption.ts → infra/security/encryption.manager.ts} +3 -2
  90. package/backend/src/infra/security/token.manager.ts +219 -0
  91. package/backend/src/infra/socket/socket.manager.ts +522 -0
  92. package/backend/src/providers/ai/openrouter.provider.ts +380 -0
  93. package/backend/src/providers/email/base.provider.ts +38 -0
  94. package/backend/src/providers/email/cloud.provider.ts +271 -0
  95. package/backend/src/{core/logs/providers → providers/logs}/base.provider.ts +11 -11
  96. package/backend/src/{core/logs/providers → providers/logs}/cloudwatch.provider.ts +61 -38
  97. package/backend/src/providers/logs/local.provider.ts +185 -0
  98. package/backend/src/providers/oauth/apple.provider.ts +266 -0
  99. package/backend/src/providers/oauth/base.provider.ts +29 -0
  100. package/backend/src/providers/oauth/discord.provider.ts +195 -0
  101. package/backend/src/providers/oauth/facebook.provider.ts +194 -0
  102. package/backend/src/providers/oauth/github.provider.ts +208 -0
  103. package/backend/src/providers/oauth/google.provider.ts +249 -0
  104. package/backend/src/providers/oauth/index.ts +8 -0
  105. package/backend/src/providers/oauth/linkedin.provider.ts +240 -0
  106. package/backend/src/providers/oauth/microsoft.provider.ts +169 -0
  107. package/backend/src/providers/oauth/x.provider.ts +202 -0
  108. package/backend/src/providers/storage/base.provider.ts +29 -0
  109. package/backend/src/providers/storage/local.provider.ts +103 -0
  110. package/backend/src/providers/storage/s3.provider.ts +313 -0
  111. package/backend/src/server.ts +317 -288
  112. package/backend/src/{core/ai/config.ts → services/ai/ai-config.service.ts} +19 -24
  113. package/backend/src/services/ai/ai-model.service.ts +60 -0
  114. package/backend/src/{core/ai/usage.ts → services/ai/ai-usage.service.ts} +28 -35
  115. package/backend/src/{core/ai/chat.ts → services/ai/chat-completion.service.ts} +37 -24
  116. package/backend/src/services/ai/helpers.ts +64 -0
  117. package/backend/src/{core/ai/image.ts → services/ai/image-generation.service.ts} +17 -19
  118. package/backend/src/services/ai/index.ts +13 -0
  119. package/backend/src/services/auth/auth-config.service.ts +250 -0
  120. package/backend/src/services/auth/auth-otp.service.ts +424 -0
  121. package/backend/src/services/auth/auth.service.ts +1150 -0
  122. package/backend/src/services/auth/index.ts +4 -0
  123. package/backend/src/{core/auth/oauth.ts → services/auth/oauth-config.service.ts} +106 -52
  124. package/backend/src/{core/database/advance.ts → services/database/database-advance.service.ts} +97 -131
  125. package/backend/src/services/database/database-table.service.ts +802 -0
  126. package/backend/src/services/database/database.service.ts +127 -0
  127. package/backend/src/services/email/email.service.ts +73 -0
  128. package/backend/src/{core/functions/functions.ts → services/functions/function.service.ts} +95 -88
  129. package/backend/src/{core/logs/audit.ts → services/logs/audit.service.ts} +92 -75
  130. package/backend/src/services/logs/log.service.ts +73 -0
  131. package/backend/src/services/realtime/index.ts +3 -0
  132. package/backend/src/services/realtime/realtime-auth.service.ts +104 -0
  133. package/backend/src/services/realtime/realtime-channel.service.ts +237 -0
  134. package/backend/src/services/realtime/realtime-message.service.ts +260 -0
  135. package/backend/src/{core/secrets/secrets.ts → services/secrets/secret.service.ts} +48 -66
  136. package/backend/src/services/storage/storage.service.ts +617 -0
  137. package/backend/src/services/usage/usage.service.ts +149 -0
  138. package/backend/src/types/auth.ts +77 -2
  139. package/backend/src/types/email.ts +8 -0
  140. package/backend/src/types/error-constants.ts +4 -0
  141. package/backend/src/types/logs.ts +0 -29
  142. package/backend/src/types/realtime.ts +18 -0
  143. package/backend/src/{core/socket/types.ts → types/socket.ts} +11 -36
  144. package/backend/src/utils/cookies.ts +35 -0
  145. package/backend/src/utils/environment.ts +9 -3
  146. package/backend/src/utils/logger.ts +20 -2
  147. package/backend/src/utils/s3-config-loader.ts +64 -0
  148. package/backend/src/utils/seed.ts +301 -205
  149. package/backend/src/utils/sql-parser.ts +91 -1
  150. package/backend/src/utils/utils.ts +114 -0
  151. package/backend/src/utils/validations.ts +40 -4
  152. package/backend/tests/README.md +133 -133
  153. package/backend/tests/cleanup-all-test-data.sh +230 -230
  154. package/backend/tests/cloud/test-s3-multitenant.sh +131 -131
  155. package/backend/tests/local/comprehensive-curl-tests.sh +155 -155
  156. package/backend/tests/local/test-ai-config.sh +129 -0
  157. package/backend/tests/local/test-ai-usage.sh +80 -0
  158. package/backend/tests/local/test-auth-router.sh +143 -143
  159. package/backend/tests/local/test-database-router.sh +222 -222
  160. package/backend/tests/local/test-e2e.sh +240 -240
  161. package/backend/tests/local/test-fk-errors.sh +96 -96
  162. package/backend/tests/local/test-functions.sh +123 -0
  163. package/backend/tests/local/test-id-field.sh +200 -200
  164. package/backend/tests/local/test-logs.sh +132 -0
  165. package/backend/tests/local/test-public-bucket.sh +264 -264
  166. package/backend/tests/local/test-secrets.sh +249 -247
  167. package/backend/tests/local/test-serverless-functions.sh.disabled +325 -325
  168. package/backend/tests/local/test-traditional-rest.sh +208 -208
  169. package/backend/tests/manual/README.md +50 -50
  170. package/backend/tests/manual/create-large-table-simple.sql +10 -10
  171. package/backend/tests/manual/seed-large-table.sql +100 -100
  172. package/backend/tests/manual/setup-large-table-extras.sql +33 -33
  173. package/backend/tests/manual/test-bulk-upsert.sh +409 -409
  174. package/backend/tests/manual/test-database-advance.sh +296 -296
  175. package/backend/tests/manual/test-postgrest-stability.sh +191 -191
  176. package/backend/tests/manual/test-rawsql-export-import.sh +411 -411
  177. package/backend/tests/manual/test-rawsql-modes.sh +244 -0
  178. package/backend/tests/manual/test-universal-storage.sh +263 -263
  179. package/backend/tests/manual/test-users.sql +17 -17
  180. package/backend/tests/run-all-tests.sh +139 -139
  181. package/backend/tests/setup.ts +0 -0
  182. package/backend/tests/test-config.sh +338 -302
  183. package/backend/tests/unit/analyze-query.test.ts +697 -0
  184. package/backend/tests/unit/cloud-token.test.ts +48 -0
  185. package/backend/tests/unit/constant.test.ts +8 -0
  186. package/backend/tests/unit/email.test.ts +372 -0
  187. package/backend/tests/unit/environment.test.ts +59 -0
  188. package/backend/tests/unit/helpers.test.ts +63 -0
  189. package/backend/tests/unit/logger.test.ts +22 -0
  190. package/backend/tests/unit/rate-limit.test.ts +154 -0
  191. package/backend/tests/unit/response.test.ts +58 -0
  192. package/backend/tests/unit/sql-parser.test.ts +74 -0
  193. package/backend/tests/unit/uuid.test.ts +21 -0
  194. package/backend/tests/unit/validations.test.ts +80 -0
  195. package/backend/tsconfig.json +22 -22
  196. package/backend/vitest.config.ts +11 -0
  197. package/claude-plugin/.claude-plugin/plugin.json +24 -0
  198. package/claude-plugin/README.md +133 -0
  199. package/claude-plugin/skills/insforge-schema-patterns/SKILL.md +270 -0
  200. package/docker-compose.prod.yml +204 -144
  201. package/docker-compose.yml +232 -167
  202. package/docker-init/db/db-init.sql +97 -125
  203. package/docker-init/db/jwt.sql +5 -5
  204. package/docker-init/db/postgresql.conf +16 -16
  205. package/docker-init/logs/vector.yml +236 -0
  206. package/docs/README.md +44 -0
  207. package/docs/agent-docs/real-time.md +269 -0
  208. package/docs/changelog.mdx +119 -0
  209. package/docs/core-concepts/ai/architecture.mdx +373 -0
  210. package/docs/core-concepts/ai/sdk.mdx +213 -0
  211. package/docs/core-concepts/authentication/architecture.mdx +278 -0
  212. package/docs/core-concepts/authentication/sdk.mdx +414 -0
  213. package/docs/core-concepts/authentication/ui-components/customization.mdx +529 -0
  214. package/docs/core-concepts/authentication/ui-components/nextjs.mdx +221 -0
  215. package/docs/core-concepts/authentication/ui-components/react-router.mdx +184 -0
  216. package/docs/core-concepts/authentication/ui-components/react.mdx +129 -0
  217. package/docs/core-concepts/database/architecture.mdx +256 -0
  218. package/docs/core-concepts/database/sdk.mdx +382 -0
  219. package/docs/core-concepts/email/architecture.mdx +101 -0
  220. package/docs/core-concepts/email/sdk.mdx +53 -0
  221. package/docs/core-concepts/functions/architecture.mdx +105 -0
  222. package/docs/core-concepts/functions/sdk.mdx +184 -0
  223. package/docs/core-concepts/realtime/architecture.mdx +446 -0
  224. package/docs/core-concepts/realtime/sdk.mdx +409 -0
  225. package/docs/core-concepts/storage/architecture.mdx +243 -0
  226. package/docs/core-concepts/storage/sdk.mdx +253 -0
  227. package/docs/deployment/README.md +94 -0
  228. package/docs/deployment/deploy-to-aws-ec2.md +565 -0
  229. package/docs/deployment/deploy-to-azure-virtual-machines.md +313 -0
  230. package/docs/deployment/deploy-to-google-cloud-compute-engine.md +613 -0
  231. package/docs/deployment/deploy-to-render.md +441 -0
  232. package/docs/deprecated/insforge-auth-api.md +214 -214
  233. package/docs/deprecated/insforge-auth-sdk.md +99 -99
  234. package/docs/deprecated/insforge-db-api.md +358 -358
  235. package/docs/deprecated/insforge-db-sdk.md +139 -139
  236. package/docs/deprecated/insforge-debug-sdk.md +156 -156
  237. package/docs/deprecated/insforge-debug.md +64 -64
  238. package/docs/deprecated/insforge-instructions.md +123 -123
  239. package/docs/deprecated/insforge-project.md +117 -117
  240. package/docs/deprecated/insforge-storage-api.md +278 -278
  241. package/docs/deprecated/insforge-storage-sdk.md +158 -158
  242. package/docs/docs.json +232 -0
  243. package/docs/examples/framework-guides/nextjs.mdx +131 -0
  244. package/docs/examples/framework-guides/nuxt.mdx +165 -0
  245. package/docs/examples/framework-guides/react.mdx +165 -0
  246. package/docs/examples/framework-guides/svelte.mdx +153 -0
  247. package/docs/examples/framework-guides/vue.mdx +159 -0
  248. package/docs/examples/overview.mdx +67 -0
  249. package/docs/favicon.svg +19 -0
  250. package/docs/images/changelog/dec-2025/ai-integration.png +0 -0
  251. package/docs/images/changelog/dec-2025/ai-models.webp +0 -0
  252. package/docs/images/changelog/dec-2025/alipay-payment.webp +0 -0
  253. package/docs/images/changelog/dec-2025/apple-login.jpg +0 -0
  254. package/docs/images/changelog/dec-2025/mcp-installer.png +0 -0
  255. package/docs/images/changelog/dec-2025/realtime-module.jpg +0 -0
  256. package/docs/images/changelog/nov-2025/auth-components.webp +0 -0
  257. package/docs/images/changelog/nov-2025/database-metadata.webp +0 -0
  258. package/docs/images/changelog/nov-2025/quickstart-prompts.webp +0 -0
  259. package/docs/images/changelog/nov-2025/sql-editor.webp +0 -0
  260. package/docs/images/changelog/nov-2025/usage-page.webp +0 -0
  261. package/docs/images/changelog/october-2025/csv-upload.webp +0 -0
  262. package/docs/images/changelog/october-2025/logs-feature.webp +0 -0
  263. package/docs/images/changelog/october-2025/oauth-providers.webp +0 -0
  264. package/docs/images/checks-passed.png +0 -0
  265. package/docs/images/dashboard-connect-expanded.png +0 -0
  266. package/docs/images/dashboard-connect.png +0 -0
  267. package/docs/images/hero-dark.png +0 -0
  268. package/docs/images/hero-light.png +0 -0
  269. package/docs/images/icons/ai.svg +4 -0
  270. package/docs/images/icons/auth.svg +1 -0
  271. package/docs/images/icons/database.svg +1 -0
  272. package/docs/images/icons/function.svg +1 -0
  273. package/docs/images/icons/storage.svg +1 -0
  274. package/docs/images/logos/nextjs.svg +4 -0
  275. package/docs/images/logos/nuxt.svg +4 -0
  276. package/docs/images/logos/react.svg +5 -0
  277. package/docs/images/logos/svelte.svg +4 -0
  278. package/docs/images/logos/vue.svg +5 -0
  279. package/docs/images/mcp-install.png +0 -0
  280. package/docs/images/onboarding-mcp.png +0 -0
  281. package/docs/insforge-instructions-sdk.md +89 -407
  282. package/docs/introduction.mdx +45 -0
  283. package/docs/logo/dark.svg +22 -0
  284. package/docs/logo/light.svg +20 -0
  285. package/docs/partnership.mdx +652 -0
  286. package/docs/quickstart.mdx +83 -0
  287. package/docs/showcase/2048-arena.png +0 -0
  288. package/docs/showcase/framegen-cloud.png +0 -0
  289. package/docs/showcase/line-connect-race.png +0 -0
  290. package/docs/showcase/moment-vibe.png +0 -0
  291. package/docs/showcase/national-flags.png +0 -0
  292. package/docs/showcase/pokemon-vibe.png +0 -0
  293. package/docs/showcase/pure-browse-buy.png +0 -0
  294. package/docs/showcase.mdx +52 -0
  295. package/docs/snippets/sdk-installation.mdx +22 -0
  296. package/docs/snippets/service-icons.mdx +27 -0
  297. package/eslint.config.js +10 -3
  298. package/examples/oauth/frontend-oauth-example.html +250 -250
  299. package/examples/response-examples.md +443 -443
  300. package/frontend/components.json +17 -17
  301. package/frontend/package.json +69 -63
  302. package/frontend/src/App.tsx +13 -82
  303. package/frontend/src/assets/icons/checkbox_checked.svg +6 -6
  304. package/frontend/src/assets/icons/checkbox_undetermined.svg +6 -6
  305. package/frontend/src/assets/icons/checked.svg +3 -3
  306. package/frontend/src/assets/icons/connected.svg +3 -0
  307. package/frontend/src/assets/icons/error.svg +3 -3
  308. package/frontend/src/assets/icons/loader.svg +9 -0
  309. package/frontend/src/assets/icons/pencil.svg +4 -4
  310. package/frontend/src/assets/icons/refresh.svg +4 -4
  311. package/frontend/src/assets/icons/step_active.svg +3 -3
  312. package/frontend/src/assets/icons/step_inactive.svg +11 -11
  313. package/frontend/src/assets/icons/warning.svg +3 -3
  314. package/frontend/src/assets/logos/apple.svg +4 -0
  315. package/frontend/src/assets/logos/claude_code.svg +3 -3
  316. package/frontend/src/assets/logos/cline.svg +6 -6
  317. package/frontend/src/assets/logos/cursor.svg +20 -20
  318. package/frontend/src/assets/logos/discord.svg +8 -8
  319. package/frontend/src/assets/logos/facebook.svg +3 -0
  320. package/frontend/src/assets/logos/gemini.svg +19 -19
  321. package/frontend/src/assets/logos/github.svg +5 -5
  322. package/frontend/src/assets/logos/google.svg +13 -13
  323. package/frontend/src/assets/logos/grok.svg +10 -10
  324. package/frontend/src/assets/logos/insforge_dark.svg +15 -15
  325. package/frontend/src/assets/logos/insforge_light.svg +15 -15
  326. package/frontend/src/assets/logos/instagram.svg +2 -0
  327. package/frontend/src/assets/logos/linkedin.svg +3 -0
  328. package/frontend/src/assets/logos/microsoft.svg +1 -0
  329. package/frontend/src/assets/logos/openai.svg +10 -10
  330. package/frontend/src/assets/logos/roo_code.svg +9 -9
  331. package/frontend/src/assets/logos/spotify.svg +17 -0
  332. package/frontend/src/assets/logos/tiktok.svg +6 -0
  333. package/frontend/src/assets/logos/trae.svg +3 -3
  334. package/frontend/src/assets/logos/windsurf.svg +10 -10
  335. package/frontend/src/assets/logos/x.svg +3 -0
  336. package/frontend/src/components/Checkbox.tsx +27 -29
  337. package/frontend/src/components/CodeBlock.tsx +55 -2
  338. package/frontend/src/components/CodeEditor.tsx +92 -0
  339. package/frontend/src/components/ConfirmDialog.tsx +1 -1
  340. package/frontend/src/components/ConnectCTA.tsx +38 -0
  341. package/frontend/src/components/CopyButton.tsx +52 -15
  342. package/frontend/src/components/ErrorState.tsx +1 -2
  343. package/frontend/src/components/FeatureSidebar.tsx +6 -6
  344. package/frontend/src/components/FeatureSidebarItem.tsx +2 -2
  345. package/frontend/src/components/JsonHighlight.tsx +21 -9
  346. package/frontend/src/components/ProjectInfoModal.tsx +128 -0
  347. package/frontend/src/components/PromptDialog.tsx +1 -4
  348. package/frontend/src/components/SearchInput.tsx +1 -2
  349. package/frontend/src/components/Stepper.tsx +53 -0
  350. package/frontend/src/components/ThemeToggle.tsx +3 -3
  351. package/frontend/src/components/datagrid/DataGrid.tsx +25 -32
  352. package/frontend/src/components/datagrid/cell-editors/DateCellEditor.tsx +1 -2
  353. package/frontend/src/components/datagrid/cell-editors/JsonCellEditor.tsx +2 -4
  354. package/frontend/src/components/datagrid/index.ts +23 -0
  355. package/frontend/src/components/index.ts +23 -30
  356. package/frontend/src/components/layout/AppHeader.tsx +131 -91
  357. package/frontend/src/components/layout/AppSidebar.tsx +80 -170
  358. package/frontend/src/components/layout/Layout.tsx +12 -23
  359. package/frontend/src/components/layout/PrimaryMenu.tsx +187 -0
  360. package/frontend/src/components/layout/SecondaryMenu.tsx +70 -0
  361. package/frontend/src/components/layout/index.ts +5 -0
  362. package/frontend/src/components/radix/Tooltip.tsx +24 -13
  363. package/frontend/src/components/radix/index.ts +22 -0
  364. package/frontend/src/features/ai/components/AIConfigCard.tsx +129 -83
  365. package/frontend/src/features/ai/components/AIEmptyState.tsx +12 -7
  366. package/frontend/src/features/ai/components/ModalityFilterSidebar.tsx +101 -0
  367. package/frontend/src/features/ai/components/ModelSelectionDialog.tsx +135 -0
  368. package/frontend/src/features/ai/components/ModelSelectionGrid.tsx +51 -0
  369. package/frontend/src/features/ai/components/SystemPromptDialog.tsx +118 -0
  370. package/frontend/src/features/ai/components/index.ts +6 -0
  371. package/frontend/src/features/ai/helpers.ts +57 -71
  372. package/frontend/src/features/ai/hooks/useAIConfigs.ts +39 -113
  373. package/frontend/src/features/ai/hooks/useAIUsage.ts +0 -2
  374. package/frontend/src/features/ai/pages/AIPage.tsx +166 -0
  375. package/frontend/src/features/ai/services/ai.service.ts +5 -5
  376. package/frontend/src/features/auth/components/AuthPreview.tsx +96 -0
  377. package/frontend/src/features/auth/components/OAuthConfigDialog.tsx +54 -30
  378. package/frontend/src/features/auth/components/UserFormDialog.tsx +13 -6
  379. package/frontend/src/features/auth/components/UsersDataGrid.tsx +50 -14
  380. package/frontend/src/features/auth/components/index.ts +5 -0
  381. package/frontend/src/features/auth/helpers.tsx +208 -0
  382. package/frontend/src/features/auth/hooks/useAnonToken.ts +30 -0
  383. package/frontend/src/features/auth/hooks/useAuthConfig.ts +48 -0
  384. package/frontend/src/features/auth/hooks/useOAuthConfig.ts +14 -10
  385. package/frontend/src/features/auth/hooks/useUsers.ts +43 -5
  386. package/frontend/src/features/auth/index.ts +3 -2
  387. package/frontend/src/features/auth/pages/AuthMethodsPage.tsx +275 -0
  388. package/frontend/src/features/auth/pages/ConfigurationPage.tsx +395 -0
  389. package/frontend/src/features/auth/pages/UsersPage.tsx +257 -0
  390. package/frontend/src/features/auth/services/anonToken.service.ts +11 -0
  391. package/frontend/src/features/auth/services/config.service.ts +19 -0
  392. package/frontend/src/features/auth/services/{oauth.service.ts → oauth-config.service.ts} +4 -4
  393. package/frontend/src/features/auth/services/{auth.service.ts → user.service.ts} +7 -53
  394. package/frontend/src/features/dashboard/components/ConnectionSuccessBanner.tsx +35 -0
  395. package/frontend/src/features/dashboard/components/PromptCard.tsx +21 -0
  396. package/frontend/src/features/dashboard/components/PromptDialog.tsx +103 -0
  397. package/frontend/src/features/dashboard/components/StatsCard.tsx +50 -0
  398. package/frontend/src/features/dashboard/components/index.ts +4 -0
  399. package/frontend/src/features/dashboard/pages/DashboardPage.tsx +212 -0
  400. package/frontend/src/features/dashboard/prompts/ai-chatbot.ts +13 -0
  401. package/frontend/src/features/dashboard/prompts/crm-system.ts +13 -0
  402. package/frontend/src/features/dashboard/prompts/ecommerce-platform.ts +12 -0
  403. package/frontend/src/features/dashboard/prompts/index.ts +31 -0
  404. package/frontend/src/features/dashboard/prompts/instagram-clone.ts +11 -0
  405. package/frontend/src/features/dashboard/prompts/notion-clone.ts +14 -0
  406. package/frontend/src/features/dashboard/prompts/reddit-clone.ts +12 -0
  407. package/frontend/src/features/database/components/DatabaseDataGrid.tsx +48 -17
  408. package/frontend/src/features/database/components/ForeignKeyCell.tsx +15 -34
  409. package/frontend/src/features/database/components/ForeignKeyPopover.tsx +19 -20
  410. package/frontend/src/features/database/components/LinkRecordModal.tsx +120 -125
  411. package/frontend/src/features/database/components/RecordFormDialog.tsx +22 -33
  412. package/frontend/src/features/database/components/RecordFormField.tsx +45 -47
  413. package/frontend/src/features/database/components/SQLModal.tsx +75 -0
  414. package/frontend/src/features/database/components/TableEmptyState.tsx +6 -5
  415. package/frontend/src/features/database/components/TableForm.tsx +28 -19
  416. package/frontend/src/features/database/components/TableFormColumn.tsx +2 -3
  417. package/frontend/src/features/database/components/TableSidebar.tsx +1 -1
  418. package/frontend/src/features/database/components/TablesEmptyState.tsx +48 -0
  419. package/frontend/src/features/database/components/TemplateCard.tsx +37 -0
  420. package/frontend/src/features/database/components/TemplatePreview.tsx +92 -0
  421. package/frontend/src/features/database/components/index.ts +19 -0
  422. package/frontend/src/features/database/constants.ts +28 -2
  423. package/frontend/src/features/database/contexts/SQLEditorContext.tsx +188 -0
  424. package/frontend/src/features/database/helpers.ts +2 -2
  425. package/frontend/src/features/database/hooks/useCSVImport.ts +29 -0
  426. package/frontend/src/features/database/hooks/useDatabase.ts +66 -0
  427. package/frontend/src/features/database/hooks/useRawSQL.ts +55 -0
  428. package/frontend/src/features/database/hooks/useRecords.ts +139 -0
  429. package/frontend/src/features/database/hooks/useTables.ts +135 -0
  430. package/frontend/src/features/database/index.ts +7 -1
  431. package/frontend/src/features/database/pages/FunctionsPage.tsx +203 -0
  432. package/frontend/src/features/database/pages/IndexesPage.tsx +228 -0
  433. package/frontend/src/features/database/pages/PoliciesPage.tsx +237 -0
  434. package/frontend/src/features/database/pages/SQLEditorPage.tsx +382 -0
  435. package/frontend/src/features/database/{page/DatabasePage.tsx → pages/TablesPage.tsx} +168 -209
  436. package/frontend/src/features/database/pages/TemplatesPage.tsx +39 -0
  437. package/frontend/src/features/database/pages/TriggersPage.tsx +230 -0
  438. package/frontend/src/features/database/services/advance.service.ts +40 -0
  439. package/frontend/src/features/database/services/database.service.ts +33 -194
  440. package/frontend/src/features/database/services/record.service.ts +219 -0
  441. package/frontend/src/features/database/services/table.service.ts +58 -0
  442. package/frontend/src/features/database/templates/ai-chatbot.ts +402 -0
  443. package/frontend/src/features/database/templates/crm-system.ts +528 -0
  444. package/frontend/src/features/database/templates/ecommerce-platform.ts +553 -0
  445. package/frontend/src/features/database/templates/index.ts +34 -0
  446. package/frontend/src/features/database/templates/instagram-clone.ts +222 -0
  447. package/frontend/src/features/database/templates/notion-clone.ts +483 -0
  448. package/frontend/src/features/database/templates/reddit-clone.ts +526 -0
  449. package/frontend/src/features/functions/components/FunctionRow.tsx +2 -1
  450. package/frontend/src/features/functions/components/FunctionsSidebar.tsx +1 -1
  451. package/frontend/src/features/functions/components/SecretRow.tsx +1 -1
  452. package/frontend/src/features/functions/components/index.ts +5 -0
  453. package/frontend/src/features/functions/hooks/useFunctions.ts +4 -4
  454. package/frontend/src/features/{secrets → functions}/hooks/useSecrets.ts +5 -5
  455. package/frontend/src/features/functions/pages/FunctionsPage.tsx +148 -0
  456. package/frontend/src/features/functions/{components/SecretsContent.tsx → pages/SecretsPage.tsx} +19 -21
  457. package/frontend/src/features/functions/services/{functions.service.ts → function.service.ts} +2 -2
  458. package/frontend/src/features/{secrets/services/secrets.service.ts → functions/services/secret.service.ts} +2 -2
  459. package/frontend/src/features/login/hooks/usePartnerOrigin.ts +27 -0
  460. package/frontend/src/features/login/pages/CloudLoginPage.tsx +118 -0
  461. package/frontend/src/features/login/{page → pages}/LoginPage.tsx +16 -23
  462. package/frontend/src/features/login/services/partnership.service.ts +65 -0
  463. package/frontend/src/features/logs/components/LogsDataGrid.tsx +89 -0
  464. package/frontend/src/features/logs/components/SeverityBadge.tsx +18 -0
  465. package/frontend/src/features/logs/components/index.ts +2 -0
  466. package/frontend/src/features/logs/helpers.ts +24 -0
  467. package/frontend/src/features/logs/hooks/useAuditLogs.ts +4 -4
  468. package/frontend/src/features/logs/hooks/useLogSources.ts +137 -0
  469. package/frontend/src/features/logs/hooks/useLogs.ts +163 -0
  470. package/frontend/src/features/logs/hooks/useMcpUsage.ts +128 -0
  471. package/frontend/src/features/logs/index.ts +8 -2
  472. package/frontend/src/features/logs/{page → pages}/AuditsPage.tsx +91 -38
  473. package/frontend/src/features/logs/pages/LogsPage.tsx +152 -0
  474. package/frontend/src/features/logs/pages/MCPLogsPage.tsx +84 -0
  475. package/frontend/src/features/logs/services/audit.service.ts +63 -0
  476. package/frontend/src/features/logs/services/log.service.ts +15 -110
  477. package/frontend/src/features/logs/services/usage.service.ts +31 -0
  478. package/frontend/src/features/onboard/components/McpConnectionStatus.tsx +68 -0
  479. package/frontend/src/features/onboard/components/OnboardingModal.tsx +267 -0
  480. package/frontend/src/features/onboard/components/VideoDemoModal.tsx +38 -0
  481. package/frontend/src/features/onboard/components/index.ts +4 -0
  482. package/frontend/src/features/onboard/components/mcp/CursorDeeplinkGenerator.tsx +2 -2
  483. package/frontend/src/features/onboard/components/mcp/{mcp-helper.tsx → helpers.tsx} +8 -8
  484. package/frontend/src/features/onboard/components/mcp/index.ts +2 -3
  485. package/frontend/src/features/onboard/index.ts +13 -3
  486. package/frontend/src/features/realtime/components/ChannelRow.tsx +83 -0
  487. package/frontend/src/features/realtime/components/EditChannelModal.tsx +246 -0
  488. package/frontend/src/features/realtime/components/MessageRow.tsx +85 -0
  489. package/frontend/src/features/realtime/components/RealtimeEmptyState.tsx +30 -0
  490. package/frontend/src/features/realtime/hooks/useRealtime.ts +218 -0
  491. package/frontend/src/features/realtime/index.ts +11 -0
  492. package/frontend/src/features/realtime/pages/RealtimeChannelsPage.tsx +172 -0
  493. package/frontend/src/features/realtime/pages/RealtimeMessagesPage.tsx +211 -0
  494. package/frontend/src/features/realtime/pages/RealtimePermissionsPage.tsx +191 -0
  495. package/frontend/src/features/realtime/services/realtime.service.ts +107 -0
  496. package/frontend/src/features/storage/components/BucketEmptyState.tsx +9 -6
  497. package/frontend/src/features/storage/components/BucketFormDialog.tsx +25 -41
  498. package/frontend/src/features/storage/components/FilePreviewDialog.tsx +20 -8
  499. package/frontend/src/features/storage/components/StorageDataGrid.tsx +4 -3
  500. package/frontend/src/features/storage/components/StorageManager.tsx +23 -34
  501. package/frontend/src/features/storage/components/index.ts +12 -0
  502. package/frontend/src/features/storage/hooks/useStorage.ts +208 -0
  503. package/frontend/src/features/storage/{page → pages}/StoragePage.tsx +41 -143
  504. package/frontend/src/features/storage/services/storage.service.ts +22 -1
  505. package/frontend/src/features/visualizer/components/AuthNode.tsx +72 -56
  506. package/frontend/src/features/visualizer/components/BucketNode.tsx +4 -4
  507. package/frontend/src/features/visualizer/components/SchemaVisualizer.tsx +108 -80
  508. package/frontend/src/features/visualizer/components/TableNode.tsx +34 -41
  509. package/frontend/src/features/visualizer/components/VisualizerSkeleton.tsx +12 -4
  510. package/frontend/src/features/visualizer/pages/VisualizerPage.tsx +97 -0
  511. package/frontend/src/index.css +1 -0
  512. package/frontend/src/lib/analytics/posthog.tsx +27 -0
  513. package/frontend/src/lib/contexts/AuthContext.tsx +38 -31
  514. package/frontend/src/lib/contexts/SocketContext.tsx +123 -80
  515. package/frontend/src/{features/metadata → lib}/hooks/useMetadata.ts +1 -1
  516. package/frontend/src/lib/hooks/useToast.tsx +6 -2
  517. package/frontend/src/lib/routing/AppRoutes.tsx +99 -0
  518. package/frontend/src/lib/routing/RequireAuth.tsx +27 -0
  519. package/frontend/src/lib/utils/cloudMessaging.ts +20 -0
  520. package/frontend/src/lib/utils/menuItems.ts +207 -0
  521. package/frontend/src/lib/utils/{validation-schemas.ts → schemaValidations.ts} +10 -5
  522. package/frontend/src/lib/utils/utils.ts +32 -1
  523. package/frontend/src/vite-env.d.ts +1 -0
  524. package/frontend/tsconfig.json +25 -25
  525. package/frontend/tsconfig.node.json +9 -9
  526. package/frontend/vite.config.ts +5 -3
  527. package/functions/deno.json +24 -24
  528. package/functions/server.ts +315 -290
  529. package/functions/worker-template.js +15 -4
  530. package/i18n/README.ar.md +130 -0
  531. package/i18n/README.de.md +130 -0
  532. package/i18n/README.es.md +154 -0
  533. package/i18n/README.fr.md +134 -0
  534. package/i18n/README.hi.md +129 -0
  535. package/i18n/README.ja.md +174 -0
  536. package/i18n/README.ko.md +137 -0
  537. package/i18n/README.pt-BR.md +131 -0
  538. package/i18n/README.ru.md +129 -0
  539. package/i18n/README.zh-CN.md +133 -0
  540. package/openapi/ai.yaml +715 -688
  541. package/openapi/auth.yaml +1244 -563
  542. package/openapi/email.yaml +158 -0
  543. package/openapi/functions.yaml +475 -475
  544. package/openapi/health.yaml +29 -29
  545. package/openapi/logs.yaml +223 -223
  546. package/openapi/metadata.yaml +177 -177
  547. package/openapi/realtime.yaml +699 -0
  548. package/openapi/records.yaml +381 -381
  549. package/openapi/secrets.yaml +370 -370
  550. package/openapi/storage.yaml +875 -875
  551. package/openapi/tables.yaml +463 -463
  552. package/package.json +97 -88
  553. package/shared-schemas/package.json +31 -31
  554. package/shared-schemas/src/ai-api.schema.ts +34 -58
  555. package/shared-schemas/src/ai.schema.ts +63 -54
  556. package/shared-schemas/src/auth-api.schema.ts +352 -193
  557. package/shared-schemas/src/auth.schema.ts +43 -7
  558. package/shared-schemas/src/cloud-events.schema.ts +57 -0
  559. package/shared-schemas/src/database-api.schema.ts +35 -4
  560. package/shared-schemas/src/database.schema.ts +40 -1
  561. package/shared-schemas/src/docs.schema.ts +26 -0
  562. package/shared-schemas/src/email-api.schema.ts +30 -0
  563. package/shared-schemas/src/index.ts +5 -0
  564. package/shared-schemas/src/logs-api.schema.ts +7 -1
  565. package/shared-schemas/src/logs.schema.ts +26 -0
  566. package/shared-schemas/src/metadata.schema.ts +18 -4
  567. package/shared-schemas/src/realtime-api.schema.ts +111 -0
  568. package/shared-schemas/src/realtime.schema.ts +143 -0
  569. package/shared-schemas/tsconfig.json +21 -21
  570. package/tsconfig.json +7 -7
  571. package/zeabur/README.md +13 -0
  572. package/zeabur/template.yml +1032 -0
  573. package/.github/workflows/deploy-aws.yml +0 -130
  574. package/backend/src/api/routes/agent.ts +0 -29
  575. package/backend/src/api/routes/auth.oauth.ts +0 -482
  576. package/backend/src/api/routes/auth.ts +0 -386
  577. package/backend/src/api/routes/docs.ts +0 -66
  578. package/backend/src/api/routes/functions.ts +0 -183
  579. package/backend/src/api/routes/openapi.ts +0 -82
  580. package/backend/src/api/routes/usage.ts +0 -96
  581. package/backend/src/core/ai/client.ts +0 -242
  582. package/backend/src/core/ai/model.ts +0 -117
  583. package/backend/src/core/auth/auth.ts +0 -780
  584. package/backend/src/core/database/manager.ts +0 -178
  585. package/backend/src/core/database/table.ts +0 -772
  586. package/backend/src/core/documentation/agent.ts +0 -689
  587. package/backend/src/core/documentation/openapi.ts +0 -856
  588. package/backend/src/core/logs/analytics.ts +0 -76
  589. package/backend/src/core/logs/providers/localdb.provider.ts +0 -246
  590. package/backend/src/core/socket/socket.ts +0 -388
  591. package/backend/src/core/storage/storage.ts +0 -923
  592. package/backend/src/utils/cloud-token.ts +0 -39
  593. package/backend/src/utils/helpers.ts +0 -49
  594. package/backend/src/utils/uuid.ts +0 -9
  595. package/backend/tests/manual/test-better-auth.sh +0 -303
  596. package/docker-init/db/logs.sql +0 -9
  597. package/frontend/README.md +0 -112
  598. package/frontend/src/components/datagrid/index.tsx +0 -20
  599. package/frontend/src/components/layout/CloudLayout.tsx +0 -95
  600. package/frontend/src/features/ai/components/AIConfigDialog.tsx +0 -76
  601. package/frontend/src/features/ai/components/AIConfigForm.tsx +0 -222
  602. package/frontend/src/features/ai/components/fields/ModalityField.tsx +0 -87
  603. package/frontend/src/features/ai/components/fields/ModelSelectionField.tsx +0 -134
  604. package/frontend/src/features/ai/components/fields/SystemPromptField.tsx +0 -33
  605. package/frontend/src/features/ai/page/AIPage.tsx +0 -178
  606. package/frontend/src/features/auth/components/AddOAuthDialog.tsx +0 -106
  607. package/frontend/src/features/auth/components/AuthMethodTab.tsx +0 -238
  608. package/frontend/src/features/auth/components/UsersTab.tsx +0 -114
  609. package/frontend/src/features/auth/page/AuthenticationPage.tsx +0 -169
  610. package/frontend/src/features/dashboard/page/DashboardPage.tsx +0 -194
  611. package/frontend/src/features/database/hooks/UseLinkModal.tsx +0 -78
  612. package/frontend/src/features/functions/components/FunctionViewer.tsx +0 -46
  613. package/frontend/src/features/functions/components/FunctionsContent.tsx +0 -88
  614. package/frontend/src/features/functions/page/FunctionsPage.tsx +0 -28
  615. package/frontend/src/features/login/components/AuthErrorBoundary.tsx +0 -87
  616. package/frontend/src/features/login/components/PrivateRoute.tsx +0 -24
  617. package/frontend/src/features/login/page/CloudLoginPage.tsx +0 -93
  618. package/frontend/src/features/logs/components/AnalyticsLogsTable.tsx +0 -313
  619. package/frontend/src/features/logs/components/LogsTable.tsx +0 -199
  620. package/frontend/src/features/logs/page/AnalyticsLogsPage.tsx +0 -530
  621. package/frontend/src/features/metadata/index.ts +0 -0
  622. package/frontend/src/features/metadata/page/MetadataPage.tsx +0 -136
  623. package/frontend/src/features/onboard/components/CompletionCard.tsx +0 -41
  624. package/frontend/src/features/onboard/components/OnboardButton.tsx +0 -84
  625. package/frontend/src/features/onboard/components/StepContent.tsx +0 -91
  626. package/frontend/src/features/onboard/components/TestConnectionStep.tsx +0 -53
  627. package/frontend/src/features/onboard/components/mcp/McpInstallation.tsx +0 -144
  628. package/frontend/src/features/onboard/page/OnBoardPage.tsx +0 -104
  629. package/frontend/src/features/onboard/types.ts +0 -8
  630. package/frontend/src/features/visualizer/page/VisualizerPage.tsx +0 -127
  631. package/frontend/src/lib/contexts/OnboardStepContext.tsx +0 -68
  632. package/frontend/src/lib/hooks/useOnboardingCompletion.ts +0 -29
  633. /package/backend/src/api/{middleware → middlewares}/error.ts +0 -0
  634. /package/backend/src/api/{middleware → middlewares}/upload.ts +0 -0
  635. /package/frontend/src/{features/metadata → lib}/services/metadata.service.ts +0 -0
@@ -1,190 +1,100 @@
1
- import { Link, useLocation } from 'react-router-dom';
1
+ import { useMemo, useState } from 'react';
2
+ import { useLogSources } from '@/features/logs/hooks/useLogSources';
3
+ import { PrimaryMenu } from './PrimaryMenu';
4
+ import { SecondaryMenu } from './SecondaryMenu';
2
5
  import {
3
- Home,
4
- Database,
5
- UserRoundCog,
6
- HardDrive,
7
- PanelLeftOpen,
8
- PanelRightOpen,
9
- BookOpen,
10
- ExternalLink,
11
- RotateCw,
12
- Sparkles,
13
- Code2,
14
- } from 'lucide-react';
15
- import { cn } from '@/lib/utils/utils';
16
- import { Button } from '@/components/radix/Button';
17
- import { ScrollArea } from '@/components/radix/ScrollArea';
18
- import {
19
- Tooltip,
20
- TooltipContent,
21
- TooltipProvider,
22
- TooltipTrigger,
23
- } from '@/components/radix/Tooltip';
24
- import { OnboardButton } from '@/features/onboard/components/OnboardButton';
25
- import { useOnboardingCompletion } from '@/lib/hooks/useOnboardingCompletion';
6
+ staticMenuItems,
7
+ documentationMenuItem,
8
+ usageMenuItem,
9
+ type PrimaryMenuItem,
10
+ } from '@/lib/utils/menuItems';
11
+ import { useLocation, matchPath } from 'react-router-dom';
12
+ import { isInsForgeCloudProject, isIframe } from '@/lib/utils/utils';
13
+ import { postMessageToParent } from '@/lib/utils/cloudMessaging';
14
+ import { ProjectInfoModal } from '@/components/ProjectInfoModal';
15
+ import { Settings } from 'lucide-react';
26
16
 
27
17
  interface AppSidebarProps extends React.HTMLAttributes<HTMLElement> {
28
- onLogout: () => void;
29
18
  isCollapsed: boolean;
30
19
  onToggleCollapse: () => void;
31
20
  }
32
21
 
33
- interface NavigationProps {
34
- name: string;
35
- href: string;
36
- icon: React.ComponentType<{ className?: string }>;
37
- }
22
+ export default function AppSidebar({ isCollapsed, onToggleCollapse }: AppSidebarProps) {
23
+ const { pathname } = useLocation();
24
+ const { menuItems: logsMenuItems, isLoading: logsLoading } = useLogSources();
25
+ const [isProjectInfoModalOpen, setIsProjectInfoModalOpen] = useState(false);
38
26
 
39
- const navigation: NavigationProps[] = [
40
- { name: 'Dashboard', href: '/dashboard', icon: Home },
41
- { name: 'Authentications', href: '/dashboard/authentication', icon: UserRoundCog },
42
- { name: 'Database', href: '/dashboard/database', icon: Database },
43
- { name: 'Storage', href: '/dashboard/storage', icon: HardDrive },
44
- { name: 'Functions', href: '/dashboard/functions', icon: Code2 },
45
- //{ name: 'Audit', href: '/dashboard/logs', icon: Logs },
46
- // { name: 'Analytics', href: '/dashboard/analytics', icon: Activity },
47
- { name: 'AI', href: '/dashboard/ai', icon: Sparkles },
48
- ];
27
+ const isCloud = isInsForgeCloudProject();
28
+ const isInIframe = isIframe();
49
29
 
50
- const bottomNavigation = [
51
- {
52
- name: 'Documentation',
53
- href: 'https://docs.insforge.dev',
54
- icon: BookOpen,
55
- external: true,
56
- },
57
- ];
30
+ // Create a settings menu item that behaves differently based on iframe context
31
+ const settingsMenuItem: PrimaryMenuItem = useMemo(
32
+ () => ({
33
+ id: 'settings',
34
+ label: 'Settings',
35
+ href: '',
36
+ icon: Settings,
37
+ onClick: () => {
38
+ if (isInIframe) {
39
+ // In iframe: use postMessage to show cloud's settings overlay
40
+ postMessageToParent({ type: 'SHOW_SETTINGS_OVERLAY' }, '*');
41
+ } else {
42
+ // Not in iframe: show local project info modal
43
+ setIsProjectInfoModalOpen(true);
44
+ }
45
+ },
46
+ }),
47
+ [isInIframe]
48
+ );
58
49
 
59
- export default function AppSidebar({
60
- onLogout: _onLogout,
61
- isCollapsed,
62
- onToggleCollapse,
63
- ...props
64
- }: AppSidebarProps) {
65
- const location = useLocation();
66
- const { isCompleted } = useOnboardingCompletion();
50
+ // Build bottom menu items based on deployment environment
51
+ const bottomMenuItems = useMemo(() => {
52
+ const items = [];
67
53
 
68
- // Add reinstall navigation item when onboarding is completed
69
- const dynamicNavigation = isCompleted
70
- ? [
71
- ...navigation,
72
- {
73
- name: 'Reinstall',
74
- href: '/dashboard/onboard?step=1',
75
- icon: RotateCw,
76
- },
77
- ]
78
- : navigation;
54
+ // Only show Usage when in iframe (postMessage to parent works)
55
+ if (isCloud && isInIframe) {
56
+ items.push(usageMenuItem);
57
+ }
79
58
 
80
- const NavItem = ({ item, onClick }: { item: NavigationProps; onClick?: () => void }) => {
81
- const isActive = location.pathname === item.href.split('?')[0];
59
+ items.push(documentationMenuItem);
60
+ items.push(settingsMenuItem);
61
+ return items;
62
+ }, [isCloud, isInIframe, settingsMenuItem]);
82
63
 
83
- const buttonContent = (
84
- <Button
85
- variant={isActive ? 'default' : 'ghost'}
86
- className={cn(
87
- 'w-full h-12 relative transition-all duration-200 ease-in-out',
88
- isActive
89
- ? 'bg-zinc-950 dark:bg-emerald-300 text-white dark:text-black'
90
- : 'hover:bg-zinc-100 dark:hover:bg-neutral-600 text-black dark:text-white'
91
- )}
92
- onClick={onClick}
93
- >
94
- <div className="absolute left-3.5 h-5 w-5">
95
- <item.icon className="h-5 w-5" />
96
- </div>
97
- {!isCollapsed && (
98
- <span className="absolute left-11.5 font-medium truncate">{item.name}</span>
99
- )}
100
- </Button>
101
- );
64
+ // Find which primary menu item matches the current route
65
+ // Items with secondary menus use prefix matching (end: false)
66
+ // Items without secondary menus use exact matching (end: true)
67
+ const activeMenu = staticMenuItems.find((item) => {
68
+ const hasSecondaryMenu = !!item.secondaryMenu || item.id === 'logs';
69
+ return matchPath({ path: item.href, end: !hasSecondaryMenu }, pathname);
70
+ });
102
71
 
103
- return (
104
- <TooltipProvider delayDuration={300}>
105
- <Tooltip>
106
- <TooltipTrigger asChild>
107
- <Link to={item.href} className="block">
108
- {buttonContent}
109
- </Link>
110
- </TooltipTrigger>
111
- {isCollapsed && (
112
- <TooltipContent side="right">
113
- <p>{item.name}</p>
114
- </TooltipContent>
115
- )}
116
- </Tooltip>
117
- </TooltipProvider>
118
- );
119
- };
72
+ // Get secondary menu items (special case for logs)
73
+ const secondaryMenuItems = activeMenu?.id === 'logs' ? logsMenuItems : activeMenu?.secondaryMenu;
74
+ const isLoading = activeMenu?.id === 'logs' ? logsLoading : false;
120
75
 
121
76
  return (
122
- <aside
123
- {...props}
124
- className={cn(
125
- 'fixed left-0 z-40 bg-white dark:bg-neutral-800 border-r border-gray-200 dark:border-neutral-700 flex flex-col transition-all duration-300 ease-in-out',
126
- 'top-16 bottom-0',
127
- isCollapsed ? 'w-18' : 'w-60',
128
- props.className
129
- )}
130
- >
131
- {!isCompleted && (
132
- <div className={`py-3 ${isCollapsed ? 'pl-1 pr-[3px]' : 'pl-3 pr-[11px]'} overflow-hidden`}>
133
- <OnboardButton isCollapsed={isCollapsed} />
134
- </div>
135
- )}
136
- {/* Navigation */}
137
- <ScrollArea className="flex-1 pl-3 pr-[11px] py-4">
138
- <nav className="space-y-2">
139
- {dynamicNavigation.map((item) => (
140
- <NavItem key={item.name} item={item} />
141
- ))}
142
- </nav>
143
- </ScrollArea>
144
-
145
- {/* Bottom section */}
146
- <div className="p-3 pr-[11px] space-y-6 overflow-hidden">
147
- {/* Bottom navigation items */}
148
- {bottomNavigation.map((item) => (
149
- <div key={item.name}>
150
- <Button
151
- variant="ghost"
152
- className="w-full h-12 relative transition-all duration-200 ease-in-out border border-gray-200 dark:border-neutral-700 rounded-md hover:bg-zinc-100 dark:hover:bg-neutral-600 text-black dark:text-white"
153
- onClick={() => window.open(item.href, '_blank')}
154
- >
155
- <div className="absolute left-3.5 h-5 w-5">
156
- <item.icon className="h-5 w-5" />
157
- </div>
158
- {!isCollapsed && (
159
- <>
160
- <span className="absolute left-11.5 font-medium truncate">{item.name}</span>
161
- {item.external && (
162
- <ExternalLink className="absolute left-46.5 h-4 w-4 text-zinc-400" />
163
- )}
164
- </>
165
- )}
166
- </Button>
167
- </div>
168
- ))}
77
+ <>
78
+ <div className="flex h-full">
79
+ <PrimaryMenu
80
+ items={staticMenuItems}
81
+ bottomItems={bottomMenuItems}
82
+ activeItemId={activeMenu?.id}
83
+ isCollapsed={isCollapsed}
84
+ onToggleCollapse={onToggleCollapse}
85
+ />
169
86
 
170
- {/* Collapse button - only visible on 2xl screens */}
171
- <div className="hidden 2xl:block">
172
- <Button
173
- variant="ghost"
174
- className="w-full h-12 relative transition-all duration-200 ease-in-out hover:bg-zinc-100 dark:hover:bg-neutral-600 text-black dark:text-white"
175
- onClick={onToggleCollapse}
176
- >
177
- <div className="absolute left-3.5 h-5 w-5">
178
- {isCollapsed ? (
179
- <PanelLeftOpen className="h-5 w-5" />
180
- ) : (
181
- <PanelRightOpen className="h-5 w-5" />
182
- )}
183
- </div>
184
- {!isCollapsed && <span className="absolute left-11.5 font-medium">Collapse</span>}
185
- </Button>
186
- </div>
87
+ {/* Render the secondary menu - always visible when there are items */}
88
+ {secondaryMenuItems && activeMenu && (
89
+ <SecondaryMenu title={activeMenu.label} items={secondaryMenuItems} loading={isLoading} />
90
+ )}
187
91
  </div>
188
- </aside>
92
+
93
+ {/* Project Info Modal for cloud deployments accessed directly (not in iframe) */}
94
+ <ProjectInfoModal
95
+ open={isProjectInfoModalOpen}
96
+ onClose={() => setIsProjectInfoModalOpen(false)}
97
+ />
98
+ </>
189
99
  );
190
100
  }
@@ -1,41 +1,30 @@
1
1
  import React, { useState } from 'react';
2
2
  import AppSidebar from './AppSidebar';
3
3
  import AppHeader from './AppHeader';
4
- import { cn } from '@/lib/utils/utils';
5
- import { useAuth } from '@/lib/contexts/AuthContext';
6
- import { useMediaQuery } from '@/lib/hooks/useMediaQuery';
7
4
  import { ThemeProvider } from '@/lib/contexts/ThemeContext';
5
+ import { isIframe } from '@/lib/utils/utils';
8
6
 
9
7
  interface LayoutProps {
10
8
  children: React.ReactNode;
11
9
  }
12
10
 
13
11
  export default function Layout({ children }: LayoutProps) {
12
+ // Sidebar is expanded by default; user can toggle via UI
14
13
  const [sidebarCollapsed, setSidebarCollapsed] = useState(false);
15
- const [isHovering, setIsHovering] = useState(false);
16
- const { user, logout } = useAuth();
17
- const is2xl = useMediaQuery('(min-width: 1536px)');
14
+
15
+ const handleToggleCollapse = () => {
16
+ setSidebarCollapsed(!sidebarCollapsed);
17
+ };
18
18
 
19
19
  return (
20
- <ThemeProvider>
20
+ <ThemeProvider forcedTheme={isIframe() ? 'dark' : undefined}>
21
21
  <div className="h-screen bg-gray-50 dark:bg-neutral-800 flex flex-col">
22
- <AppHeader currentUser={user} onLogout={logout} />
22
+ {!isIframe() && <AppHeader />}
23
23
 
24
- {/* Main content */}
25
- <div
26
- className={cn(
27
- 'flex-1 transition-all duration-300 ease-in-out overflow-y-auto ml-18',
28
- !sidebarCollapsed && '2xl:ml-60'
29
- )}
30
- >
31
- <AppSidebar
32
- onLogout={logout}
33
- isCollapsed={is2xl ? sidebarCollapsed : !isHovering}
34
- onToggleCollapse={() => setSidebarCollapsed(!sidebarCollapsed)}
35
- onMouseEnter={() => setIsHovering(true)}
36
- onMouseLeave={() => setIsHovering(false)}
37
- />
38
- {children}
24
+ {/* Main layout - sidebars + content in flexbox */}
25
+ <div className="flex-1 flex overflow-hidden">
26
+ <AppSidebar isCollapsed={sidebarCollapsed} onToggleCollapse={handleToggleCollapse} />
27
+ <main className="flex-1 overflow-y-auto">{children}</main>
39
28
  </div>
40
29
  </div>
41
30
  </ThemeProvider>
@@ -0,0 +1,187 @@
1
+ import { Link } from 'react-router-dom';
2
+ import { ExternalLink, PanelLeftOpen, PanelRightOpen } from 'lucide-react';
3
+ import { cn } from '@/lib/utils/utils';
4
+ import {
5
+ Tooltip,
6
+ TooltipContent,
7
+ TooltipProvider,
8
+ TooltipTrigger,
9
+ } from '@/components/radix/Tooltip';
10
+ import { PrimaryMenuItem } from '@/lib/utils/menuItems';
11
+
12
+ interface PrimaryMenuProps {
13
+ items: PrimaryMenuItem[];
14
+ bottomItems?: PrimaryMenuItem[];
15
+ activeItemId?: string | null;
16
+ isCollapsed: boolean;
17
+ onToggleCollapse: () => void;
18
+ }
19
+
20
+ export function PrimaryMenu({
21
+ items,
22
+ bottomItems,
23
+ activeItemId,
24
+ isCollapsed,
25
+ onToggleCollapse,
26
+ }: PrimaryMenuProps) {
27
+ const handleToggleClick = (e: React.MouseEvent<HTMLButtonElement>) => {
28
+ e.preventDefault();
29
+ e.stopPropagation();
30
+ onToggleCollapse();
31
+ };
32
+
33
+ const baseButtonClasses = cn(
34
+ 'relative h-9 rounded duration-200 ease-in-out overflow-hidden flex items-center',
35
+ isCollapsed ? 'w-9' : 'w-full',
36
+ 'hover:bg-zinc-100 dark:hover:bg-neutral-600 text-black dark:text-neutral-400'
37
+ );
38
+
39
+ const MenuItem = ({ item }: { item: PrimaryMenuItem }) => {
40
+ const isActive = item.id === activeItemId;
41
+
42
+ return (
43
+ <Tooltip>
44
+ <TooltipTrigger asChild>
45
+ <Link
46
+ to={item.href}
47
+ className={cn(
48
+ 'flex items-center gap-3 h-9 rounded duration-200 ease-in-out',
49
+ isCollapsed ? 'w-9 justify-center px-0' : 'w-full px-2',
50
+ isActive
51
+ ? 'bg-zinc-950 dark:bg-emerald-300 text-white dark:text-black'
52
+ : 'hover:bg-zinc-100 dark:hover:bg-neutral-600 text-black dark:text-neutral-400'
53
+ )}
54
+ >
55
+ <item.icon className="w-5 h-5 flex-shrink-0" />
56
+ {!isCollapsed && <span className="font-medium text-sm truncate">{item.label}</span>}
57
+ </Link>
58
+ </TooltipTrigger>
59
+ {isCollapsed && (
60
+ <TooltipContent side="right">
61
+ <p>{item.label}</p>
62
+ </TooltipContent>
63
+ )}
64
+ </Tooltip>
65
+ );
66
+ };
67
+
68
+ const BottomMenuItem = ({ item }: { item: PrimaryMenuItem }) => {
69
+ // For items with onClick handler or external links, use a button
70
+ if (item.onClick || item.external) {
71
+ return (
72
+ <Tooltip>
73
+ <TooltipTrigger asChild>
74
+ <button
75
+ className={baseButtonClasses}
76
+ onClick={
77
+ item.onClick || (item.external ? () => window.open(item.href, '_blank') : undefined)
78
+ }
79
+ >
80
+ <div className="absolute left-2 h-5 w-5">
81
+ <item.icon className="w-5 h-5" />
82
+ </div>
83
+ {!isCollapsed && (
84
+ <>
85
+ <span className="font-medium text-sm truncate ml-9 mr-2 block text-left">
86
+ {item.label}
87
+ </span>
88
+ {item.external && (
89
+ <ExternalLink className="absolute left-40 h-4 w-4 text-neutral-500" />
90
+ )}
91
+ </>
92
+ )}
93
+ </button>
94
+ </TooltipTrigger>
95
+ {isCollapsed && (
96
+ <TooltipContent side="right">
97
+ <div className="flex items-center gap-2">
98
+ <p>{item.label}</p>
99
+ {item.external && <ExternalLink className="h-3 w-3" />}
100
+ </div>
101
+ </TooltipContent>
102
+ )}
103
+ </Tooltip>
104
+ );
105
+ }
106
+
107
+ // For internal navigation, use a Link
108
+ return (
109
+ <Tooltip>
110
+ <TooltipTrigger asChild>
111
+ <Link to={item.href} className={baseButtonClasses}>
112
+ <div className="absolute left-2 h-5 w-5">
113
+ <item.icon className="w-5 h-5" />
114
+ </div>
115
+ {!isCollapsed && (
116
+ <span className="font-medium text-sm truncate ml-9 mr-2 block text-left">
117
+ {item.label}
118
+ </span>
119
+ )}
120
+ </Link>
121
+ </TooltipTrigger>
122
+ {isCollapsed && (
123
+ <TooltipContent side="right">
124
+ <p>{item.label}</p>
125
+ </TooltipContent>
126
+ )}
127
+ </Tooltip>
128
+ );
129
+ };
130
+
131
+ return (
132
+ <TooltipProvider disableHoverableContent delayDuration={300}>
133
+ <aside
134
+ className={cn(
135
+ 'bg-white dark:bg-neutral-800 border-r border-gray-200 dark:border-neutral-700 flex flex-col flex-shrink-0 pt-2 pb-6 px-2',
136
+ 'transition-[width] duration-300 ease-in-out overflow-hidden',
137
+ isCollapsed ? 'w-[52px]' : 'w-[200px]'
138
+ )}
139
+ >
140
+ {/* Top navigation items with separators */}
141
+ <nav className="flex flex-col gap-2">
142
+ {items.map((item) => (
143
+ <div key={item.id}>
144
+ <MenuItem item={item} />
145
+ {item.sectionEnd && <div className="h-px bg-neutral-700 my-2" />}
146
+ </div>
147
+ ))}
148
+ </nav>
149
+
150
+ {/* Spacer to push bottom items down */}
151
+ <div className="flex-1" />
152
+
153
+ {/* Bottom items */}
154
+ <div className="flex flex-col gap-2">
155
+ {bottomItems?.map((item) => (
156
+ <BottomMenuItem key={item.id} item={item} />
157
+ ))}
158
+
159
+ {/* Collapse/Expand toggle button */}
160
+ <Tooltip>
161
+ <TooltipTrigger asChild>
162
+ <button className={baseButtonClasses} onClick={handleToggleClick}>
163
+ <div className="absolute left-2 h-5 w-5">
164
+ {isCollapsed ? (
165
+ <PanelLeftOpen className="w-5 h-5" />
166
+ ) : (
167
+ <PanelRightOpen className="w-5 h-5" />
168
+ )}
169
+ </div>
170
+ {!isCollapsed && (
171
+ <span className="font-medium text-sm truncate ml-9 mr-2 block text-left">
172
+ Collapse
173
+ </span>
174
+ )}
175
+ </button>
176
+ </TooltipTrigger>
177
+ {isCollapsed && (
178
+ <TooltipContent side="right">
179
+ <p>Expand</p>
180
+ </TooltipContent>
181
+ )}
182
+ </Tooltip>
183
+ </div>
184
+ </aside>
185
+ </TooltipProvider>
186
+ );
187
+ }
@@ -0,0 +1,70 @@
1
+ import { Link, useMatch } from 'react-router-dom';
2
+ import { cn } from '@/lib/utils/utils';
3
+ import { ScrollArea } from '@/components/radix/ScrollArea';
4
+ import { SecondaryMenuItem as SecondaryMenuItemType } from '@/lib/utils/menuItems';
5
+
6
+ interface SecondaryMenuProps {
7
+ title: string;
8
+ items: SecondaryMenuItemType[];
9
+ loading?: boolean;
10
+ }
11
+
12
+ function SecondaryMenuItem({ item }: { item: SecondaryMenuItemType }) {
13
+ // Each item determines its own active state using React Router's useMatch
14
+ const match = useMatch({ path: item.href, end: false });
15
+ const isSelected = !!match;
16
+
17
+ return (
18
+ <>
19
+ {item.sectionEnd && <div className="h-px bg-gray-200 dark:bg-neutral-700 my-2" />}
20
+ <Link to={item.href}>
21
+ <button
22
+ className={cn(
23
+ 'h-8 w-full flex items-center px-3 py-1.5 rounded text-left transition-colors',
24
+ isSelected
25
+ ? 'bg-zinc-200 text-zinc-950 dark:bg-neutral-700 dark:text-white'
26
+ : 'text-zinc-950 dark:text-white hover:bg-zinc-100 dark:hover:bg-neutral-700/50'
27
+ )}
28
+ >
29
+ <p className="text-sm truncate">{item.label}</p>
30
+ </button>
31
+ </Link>
32
+ </>
33
+ );
34
+ }
35
+
36
+ export function SecondaryMenu({ title, items, loading }: SecondaryMenuProps) {
37
+ return (
38
+ <aside
39
+ className={cn(
40
+ 'w-50 flex flex-col bg-white dark:bg-neutral-800 border-r border-gray-200 dark:border-neutral-700 flex-shrink-0',
41
+ 'transition-all duration-300 ease-in-out'
42
+ )}
43
+ >
44
+ {/* Header */}
45
+ <div className="px-3 py-3.5 bg-white dark:bg-neutral-800">
46
+ <p className="text-base font-normal text-zinc-950 dark:text-neutral-400">{title}</p>
47
+ </div>
48
+
49
+ {/* Item List */}
50
+ <ScrollArea className="flex-1 px-3 pb-3.5 dark:bg-neutral-800">
51
+ {loading ? (
52
+ <div className="flex flex-col space-y-2">
53
+ {[...Array(5)].map((_, i) => (
54
+ <div
55
+ key={i}
56
+ className="h-8 w-full rounded bg-zinc-100 dark:bg-neutral-700 animate-pulse"
57
+ />
58
+ ))}
59
+ </div>
60
+ ) : (
61
+ <div className="flex flex-col space-y-2">
62
+ {items.map((item) => (
63
+ <SecondaryMenuItem key={item.id} item={item} />
64
+ ))}
65
+ </div>
66
+ )}
67
+ </ScrollArea>
68
+ </aside>
69
+ );
70
+ }
@@ -0,0 +1,5 @@
1
+ export { default as AppHeader } from './AppHeader';
2
+ export { default as AppSidebar } from './AppSidebar';
3
+ export { default as Layout } from './Layout';
4
+ export { PrimaryMenu } from './PrimaryMenu';
5
+ export { SecondaryMenu } from './SecondaryMenu';
@@ -9,20 +9,31 @@ const Tooltip = TooltipPrimitive.Root;
9
9
 
10
10
  const TooltipTrigger = TooltipPrimitive.Trigger;
11
11
 
12
+ const TooltipPortal = TooltipPrimitive.Portal;
13
+
12
14
  const TooltipContent = React.forwardRef<
13
15
  React.ComponentRef<typeof TooltipPrimitive.Content>,
14
- React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Content>
15
- >(({ className, sideOffset = 4, ...props }, ref) => (
16
- <TooltipPrimitive.Content
17
- ref={ref}
18
- sideOffset={sideOffset}
19
- className={cn(
20
- 'z-50 overflow-hidden rounded-md bg-primary px-3 py-1.5 text-xs text-primary-foreground animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2',
21
- className
22
- )}
23
- {...props}
24
- />
25
- ));
16
+ React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Content> & { portal?: boolean }
17
+ >(({ className, sideOffset = 4, portal = false, ...props }, ref) => {
18
+ const content = (
19
+ <TooltipPrimitive.Content
20
+ ref={ref}
21
+ sideOffset={sideOffset}
22
+ className={cn(
23
+ 'z-50 overflow-hidden rounded-md bg-primary px-3 py-1.5 text-xs text-primary-foreground animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2',
24
+ className
25
+ )}
26
+ {...props}
27
+ />
28
+ );
29
+
30
+ // Use Portal to render outside of parent overflow constraints
31
+ if (portal) {
32
+ return <TooltipPortal>{content}</TooltipPortal>;
33
+ }
34
+
35
+ return content;
36
+ });
26
37
  TooltipContent.displayName = TooltipPrimitive.Content.displayName;
27
38
 
28
- export { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider };
39
+ export { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider, TooltipPortal };
@@ -0,0 +1,22 @@
1
+ // Core radix/ui components
2
+ export * from './Button';
3
+ export * from './Card';
4
+ export * from './Input';
5
+ export * from './Form';
6
+ export * from './Tabs';
7
+ export * from './Badge';
8
+ export * from './Skeleton';
9
+ export * from './ScrollArea';
10
+ export * from './Separator';
11
+ export * from './Alert';
12
+ export * from './DropdownMenu';
13
+ export * from './Dialog';
14
+ export * from './Label';
15
+ export * from './Popover';
16
+ export * from './Select';
17
+ export * from './Sheet';
18
+ export * from './Switch';
19
+ export * from './Tooltip';
20
+ export * from './AlertDialog';
21
+ export * from './Avatar';
22
+ export * from './Textarea';